Integrations
AI agents
Let an AI agent shorten URLs, look up links, read click analytics and manage your links on furl.io, with a furl.io API key.
Three ways in
- MCP server (recommended) for Claude Desktop, Claude Code, Cursor, VS Code and any other MCP client. See MCP server.
- OpenAPI for function-calling frameworks: OpenAI GPT Actions and Assistants, LangChain, LlamaIndex, Semantic Kernel and others. See OpenAPI.
- REST with plain HTTP, as described in the API reference.
There is also a machine-readable index for LLMs at https://furl.io/llms.txt.
Step 1: create an API key for the agent
Open API keys
In the dashboard, go to Settings → API keys and press Create. Your email must be verified.
Name it after the agent
For example
claude-desktop.Copy the key
The key starts with
furl_, is 45 characters long and is shown only once.
What a key can do
MCP server
| Setting | Value |
|---|---|
| Endpoint | https://furl.io/mcp |
| Transport | MCP Streamable HTTP. |
| Auth | Authorization: Bearer furl_YOUR_KEY. API keys only: browser sessions and login tokens are rejected with 401 api_key_required. |
Tools
| Tool | What it does | Kind |
|---|---|---|
shorten_url | Create a short link. Inputs: url (required, http/https); custom_code (optional; uses one code from your plan’s custom code allowance; 3–64 characters from a-z A-Z 0-9 _ - .; case-sensitive; reserved brand names are blocked); expires_at (optional RFC 3339 time, Pro and higher; default: never expires); max_views (optional, 1–100000, Pro and higher); redirect_type (optional 301, 302, 307 or 308; default 302). Returns short_url, short_code, destination, status, redirect_type, expires_at, max_views, views_used, created_at. | Write |
get_link | Look up a link by code. Also accepts the full https://furl.io/… URL. | Read-only |
list_links | query (optional text), limit (1–50, default 20). Returns links and more. | Read-only |
get_link_stats | code, range (24h, 7d default, 30d, 90d). Returns total_clicks, unique_visitors, top_countries, top_referrers, top_devices. | Read-only |
update_link | code plus any of url, status (active, paused, archived), expires_at (RFC 3339, or "never" to remove it), max_views (1–100000, or 0 to remove the limit). Setting an expiry or view limit needs Pro or higher; removing one works on any plan. | Idempotent |
delete_link | code. Permanent. Annotated as destructive so clients ask for confirmation. | Destructive |
Errors come back as tool errors with a code and a message, for example plan_limit_reached, custom_code_limit, link_expiry_not_in_plan, code_blocked, code_taken, validation_error, not_found or too_many_concurrent_requests.
Claude Code
claude mcp add --transport http furl https://furl.io/mcp --header "Authorization: Bearer furl_YOUR_KEY"Claude Desktop
Open Settings → Developer → Edit config and add furl.io to claude_desktop_config.json. This uses the mcp-remote bridge.
{
"mcpServers": {
"furl": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://furl.io/mcp", "--header", "Authorization: Bearer ${FURL_API_KEY}"],
"env": { "FURL_API_KEY": "furl_YOUR_KEY" }
}
}
}Cursor
Add this to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project).
{
"mcpServers": {
"furl": {
"url": "https://furl.io/mcp",
"headers": { "Authorization": "Bearer furl_YOUR_KEY" }
}
}
}VS Code
Add this to .vscode/mcp.json. VS Code asks for the key the first time and stores it as a secret.
{
"servers": {
"furl": {
"type": "http",
"url": "https://furl.io/mcp",
"headers": { "Authorization": "Bearer ${input:furl-key}" }
}
},
"inputs": [{ "type": "promptString", "id": "furl-key", "description": "furl.io API key", "password": true }]
}Any client: test with curl
The server speaks plain JSON-RPC, so you can call a tool directly:
curl -s https://furl.io/mcp \
-H "Authorization: Bearer furl_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"shorten_url","arguments":{"url":"https://example.com/launch","max_views":100}}}'Example prompts
- “Shorten https://example.com/spring-sale and make it expire after 500 views.”
- “How many clicks did furl.io/launch get this week, and from which countries?”
- “Pause my link AgentDemo.”
OpenAPI (function calling)
The spec is at https://furl.io/api/v1/openapi.json (OpenAPI 3.0.3, CORS-enabled). Import it into OpenAI GPT Actions (Authentication: API key, Auth type: Bearer), LangChain’s OpenAPI toolkit, LlamaIndex, Semantic Kernel or Postman.
Expose only the operations the agent needs, for example createLink, getLink, listLinks and getLinkStats. Operation IDs are stable.
import os, requests
r = requests.post("https://furl.io/api/v1/links",
headers={"Authorization": f"Bearer {os.environ['FURL_API_KEY']}"},
json={"original_url": "https://example.com/launch", "max_clicks": 100},
timeout=10)
r.raise_for_status()
print(r.json()["short_url"])llms.txt
https://furl.io/llms.txt is a concise Markdown summary of furl.io for LLMs: what it does, how to authenticate, the MCP endpoint, the main REST calls and links to these docs. Point an agent at it, or paste it into a system prompt.
Limits
| Limit | Value |
|---|---|
| API rate limit (per IP) | 20 requests/second, burst 40 |
| Auth rate limit (per IP) | 10 requests/minute |
| Analytics | 4 concurrent requests per account |
| Link expiry | Links never expire by default; expiry dates and view limits need Pro or higher (see pricing) |
| Active links and custom codes | Per plan; over the limit you get plan_limit_reached or custom_code_limit |
| View limit | Links with a view limit stop after N visits and return 410 |
| Custom codes | Codes matching well-known brands or domains are blocked (code_blocked) |