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

  1. Open API keys

    In the dashboard, go to Settings → API keys and press Create. Your email must be verified.

  2. Name it after the agent

    For example claude-desktop.

  3. Copy the key

    The key starts with furl_, is 45 characters long and is shown only once.

What a key can do

A key acts as your account: it can create, read, update and delete your links and read your analytics.

MCP server

SettingValue
Endpointhttps://furl.io/mcp
TransportMCP Streamable HTTP.
AuthAuthorization: Bearer furl_YOUR_KEY. API keys only: browser sessions and login tokens are rejected with 401 api_key_required.

Tools

ToolWhat it doesKind
shorten_urlCreate 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_linkLook up a link by code. Also accepts the full https://furl.io/… URL.Read-only
list_linksquery (optional text), limit (1–50, default 20). Returns links and more.Read-only
get_link_statscode, range (24h, 7d default, 30d, 90d). Returns total_clicks, unique_visitors, top_countries, top_referrers, top_devices.Read-only
update_linkcode 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_linkcode. 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

shell
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.

claude_desktop_config.json
{
  "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).

mcp.json
{
  "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.

.vscode/mcp.json
{
  "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:

shell
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.

Create a link with a view limit
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

LimitValue
API rate limit (per IP)20 requests/second, burst 40
Auth rate limit (per IP)10 requests/minute
Analytics4 concurrent requests per account
Link expiryLinks never expire by default; expiry dates and view limits need Pro or higher (see pricing)
Active links and custom codesPer plan; over the limit you get plan_limit_reached or custom_code_limit
View limitLinks with a view limit stop after N visits and return 410
Custom codesCodes matching well-known brands or domains are blocked (code_blocked)