Connect TinyTo to your assistant

TinyTo runs a Model Context Protocol server, so Claude, ChatGPT and your editor can create short links and read their stats for you. One URL, no API key, every plan.

MCP Streamable HTTP Endpoint: https://tinyto.me/mcp All plans REST API docs โ†—

Overview

The MCP server speaks Streamable HTTP at https://tinyto.me/mcp. There is nothing to install, no token to copy and no per-client configuration file to hand-write: every client below discovers the authorization server from the endpoint itself.

SettingValue
MCP endpointhttps://tinyto.me/mcp
TransportStreamable HTTP (POST, JSON-RPC 2.0)
AuthenticationOAuth 2.1 + PKCE, discovered automatically
API key requiredNo
Plan requiredNone โ€” MCP is available on every plan, including Free
Rate limit120 tool calls per minute per user
Access token lifetime1 hour, refreshed automatically
MCP is not the same as the REST API. The REST API needs an Advanced plan and a key you manage yourself. The MCP server signs each user in with their own TinyTo account, so whatever plan that account has applies to the links it creates. If you are building your own integration rather than connecting an assistant, use the REST API.

What the assistant can do

Five tools. Four read, one writes. Nothing deletes or edits a link that already exists.

ToolScopeWhat it does
list_linkslinks:readList links with click counts, newest first
get_linklinks:readOne link: destination, slug, clicks, expiry
get_link_statslinks:readClicks, top countries and the weekday/hour heatmap
account_infolinks:readPlan, active links and remaining allowance
create_linklinks:createShorten a URL, optionally with a custom slug or expiry

create_link is the only write operation and it is marked non-destructive, so clients call it without a scary confirmation. Approval of links:create on the consent screen is enforced on every call: a read-only grant gets a clear permission error instead of a link.

Connect a client

Pick your assistant. Every one of them starts with the same URL: https://tinyto.me/mcp.

ClientWhere it goes
Claude (web, Desktop, Cowork) Settings โ†’ Connectors โ†’ Add custom connector
Claude Code claude mcp add --transport http
ChatGPT Plugins โ†’ Add custom MCP server
OpenCode opencode mcp add --url
Cursor mcp.json โ†’ Connect
VS Code (GitHub Copilot) .vscode/mcp.json
Codex CLI codex mcp add --url
Gemini CLI gemini mcp add --transport http
Windsurf mcp_config.json (serverUrl)
Zed context_servers in settings.json
Cline MCP Servers โ†’ Configure
Antigravity mcp_config.json (serverUrl)

Claude โ€” web, Desktop, Cowork and mobile

Available on Free (one custom connector), Pro, Max, Team and Enterprise. No developer mode needed.

  1. Open Customize โ†’ Connectors and click +, then Add custom connector.
  2. Name it TinyTo and paste https://tinyto.me/mcp as the remote MCP server URL. Click Continue.
  3. Leave Authentication on Sign in now and OAuth client on Use Claude's published identity. Add it.
  4. Click Connect and approve the request on the TinyTo consent screen.

On Team and Enterprise, an Owner adds the connector once in Organization settings โ†’ Connectors; each member then connects their own TinyTo account from Customize โ†’ Connectors. In a chat, enable it per conversation from the + button โ†’ Connectors.

Claude's servers reach the endpoint from Anthropic's cloud, not from your device. If you run a firewall allowlist, see Anthropic's published IP ranges.

Claude Code

claude mcp add --transport http tinyto https://tinyto.me/mcp

Then run /mcp inside Claude Code, pick tinyto and choose Authenticate. The browser opens on the TinyTo consent screen and the tokens are stored outside your project files.

Useful commands:

claude mcp list              # status: connected / needs authentication
claude mcp get tinyto        # details for this server
claude mcp login tinyto      # re-authenticate from the shell
claude mcp logout tinyto     # revoke the tokens on the TinyTo side
claude mcp remove tinyto     # drop the configuration

Add --scope user to make the server available in every project, or --scope project to commit it to .mcp.json for a team.

Remove in the right order. claude mcp remove deletes the local tokens but does not tell us, so the grant would stay listed until it expires. Run claude mcp logout tinyto first if you want the connection gone from Connected apps too.

ChatGPT

Web only, not mobile. Full MCP tool support (including create_link) requires Business, Enterprise or Edu. Pro accounts can connect custom servers for read and fetch only.

  1. Go to Plugins (chatgpt.com/plugins) and click +, then Add custom MCP server. Developer mode is no longer required.
  2. Name it TinyTo, and under Connection paste https://tinyto.me/mcp.
  3. Set authentication to OAuth. ChatGPT finds the authorization server by itself.
  4. Accept the risk warning and choose Create as a plugin. When ChatGPT scans the tools it opens the TinyTo consent screen โ€” approve it there.
  5. In a chat, type @ and pick TinyTo, then ask it to shorten something.
Admins: on Business, Enterprise and Edu only admins and owners can create and publish the connection, from workspace settings. Members then enable it. ChatGPT keeps a frozen snapshot of the tool list per app: if we add a tool later, an admin has to hit Refresh in workspace app settings for it to appear.

OpenCode

opencode mcp add tinyto --url https://tinyto.me/mcp --global
opencode mcp list                       # โ†’ needs authentication
opencode mcp auth tinyto                # opens the browser

Inside OpenCode, /mcps lets you connect, disconnect or re-authenticate. To configure it by hand, the entry lives under mcp.servers in opencode.jsonc:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "servers": {
      "tinyto": {
        "type": "remote",
        "url": "https://tinyto.me/mcp"
      }
    }
  }
}

OAuth is on by default for remote servers, so do not add an oauth: false or an Authorization header โ€” that would switch OpenCode to static credentials and the connection would fail with 401.

Cursor

Add the server to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):

{
  "mcpServers": {
    "tinyto": {
      "url": "https://tinyto.me/mcp"
    }
  }
}

Open Settings โ†’ Tools & MCP. The server shows Needs authentication with a Connect button: click it, approve in the browser that opens, and the tools appear in agent mode.

VS Code with GitHub Copilot

Create .vscode/mcp.json in the workspace (or use the user profile's mcp.json for every project):

{
  "servers": {
    "tinyto": {
      "type": "http",
      "url": "https://tinyto.me/mcp"
    }
  }
}

Run MCP: List Servers from the Command Palette and start tinyto. VS Code opens a browser window for the OAuth flow on first use; approve it and the tools become available in agent mode.

Codex CLI

codex mcp add tinyto --url https://tinyto.me/mcp
codex mcp login tinyto

Or edit ~/.codex/config.toml directly:

[mcp_servers.tinyto]
url = "https://tinyto.me/mcp"

Codex uses OAuth by default. The tokens go to your OS keychain, not to config.toml, and refresh without prompting.

Gemini CLI

gemini mcp add --transport http --scope user tinyto https://tinyto.me/mcp

Then start gemini and run /mcp auth tinyto. The OAuth flow is discovered automatically from the endpoint; /mcp list shows the connection state and /mcp auth alone lists the servers that still need a sign-in.

Windsurf

Open the MCP panel, choose Configure and edit ~/.codeium/windsurf/mcp_config.json. Windsurf uses serverUrl for remote servers, not url:

{
  "mcpServers": {
    "tinyto": {
      "serverUrl": "https://tinyto.me/mcp"
    }
  }
}

Save the file, click Refresh in the MCP panel and approve the OAuth prompt in the browser window that opens.

Zed

Open your settings (zed: open settings) and add the server under context_servers:

{
  "context_servers": {
    "tinyto": {
      "url": "https://tinyto.me/mcp"
    }
  }
}

Leaving out an Authorization header is what triggers Zed's OAuth flow โ€” add one and it would send that static header instead.

Cline

Open the MCP servers panel, go to Configure and add an entry under mcpServers:

{
  "mcpServers": {
    "tinyto": {
      "type": "streamableHttp",
      "url": "https://tinyto.me/mcp",
      "disabled": false,
      "autoApprove": []
    }
  }
}

Cline starts the OAuth flow the first time it calls a tool. Keep autoApprove empty so each create_link call is confirmed.

Antigravity

From Settings โ†’ Customizations โ†’ Open MCP Config, add the server with serverUrl:

{
  "mcpServers": {
    "tinyto": {
      "serverUrl": "https://tinyto.me/mcp"
    }
  }
}

Clients that only speak stdio

Older desktop clients understand only a local command. Bridge them with mcp-remote, which proxies stdio to a remote Streamable HTTP server and handles the OAuth flow:

npx -y mcp-remote https://tinyto.me/mcp

In a JSON config for such a client that means:

{
  "mcpServers": {
    "tinyto": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://tinyto.me/mcp"]
    }
  }
}

Building a client of your own? Everything is standards-based: RFC 9728 protected resource metadata, RFC 8414 authorization server metadata, dynamic client registration, Client ID Metadata Documents, PKCE S256 and RFC 8707 resource indicators.

How sign-in works

Nothing is pre-shared between TinyTo and your assistant. The client starts from the endpoint alone and walks the discovery chain:

  1. It calls /mcp without a token and gets 401 with a WWW-Authenticate header pointing at /.well-known/oauth-protected-resource.
  2. That document names the authorization server, whose metadata at /.well-known/oauth-authorization-server lists the authorize, token, registration and JWKS URLs.
  3. The client identifies itself โ€” by a Client ID Metadata Document it hosts, or by registering with the server (RFC 7591) โ€” and opens the consent screen with PKCE.
  4. You sign in to TinyTo and approve. The client gets an access token (1 hour) and a rotating refresh token (30 days).
EndpointPurpose
/.well-known/oauth-protected-resourceWhich authorization server protects /mcp
/.well-known/oauth-authorization-serverAuthorization server metadata
/.well-known/jwks.jsonPublic keys to verify access tokens
/oauth/authorizeConsent screen (PKCE, S256 only)
/oauth/tokenCode exchange and refresh rotation
/oauth/registerDynamic client registration
/oauth/revokeRFC 7009 revocation, for clients that support it
The resource parameter must be exactly https://tinyto.me/mcp. A client configured with a different URL for the same server (a trailing slash, or http instead of https) is rejected with Unknown resource.

Disconnecting

Any of these stops the assistant immediately โ€” access tokens are cut off at once, not at their next expiry:

  1. Dashboard โ†’ API โ†’ Connected apps and press Disconnect next to the application. This is the one that works even if the client never tells us it is leaving.
  2. Remove the connector in the client. Claude, Cursor, OpenCode and the rest usually discard their tokens locally.
  3. Clients that implement revocation call POST /oauth/revoke with the refresh token.

Open Connected apps โ†’

Troubleshooting

SymptomCause and fix
401 invalid_token โ€” โ€œMissing access tokenโ€ The client is sending a static header where it should be doing OAuth. Remove any Authorization / headers entry and let discovery run.
โ€œThis application was disconnectedโ€ The grant was revoked from the dashboard. Reconnect the app in the client.
Unknown resource during sign-in The client sends a resource that is not exactly https://tinyto.me/mcp. Fix the server URL in the client.
invalid_redirect_uri at registration The client asked for a redirect we do not accept. HTTPS, loopback on any port, and private-use schemes such as cursor:// or jetbrains:// work; javascript:, file: and friends do not.
403 forbidden_origin A browser-origin call from a web client we have not listed. Use the native client, or tell us which origin to allow.
429 rate_limited More than 120 tool calls in a minute for this user. Read Retry-After and back off.
create_link says links:create is required The grant is read-only. Disconnect it in Connected apps and reconnect, approving both scopes.
ChatGPT shows no tools after we ship a change Workspace apps use a frozen tool snapshot. An admin refreshes it from workspace app settings.
405 on GET /mcp Expected. The endpoint accepts POST only; the older GET stream was removed from the protocol.

Security and privacy

The assistant acts as you, with the permissions you approved on the consent screen. That means a prompt-injection attack in the assistant's context could ask it to create links โ€” so the write surface is deliberately small.

  • It can read your links and their stats, and create new links. Nothing else.
  • It cannot delete, edit or transfer a link, change your plan, or touch billing.
  • It never sees your password. Tokens belong to the app you connected.
  • Refresh tokens are stored hashed and rotate on every use; reuse is rejected.
  • Access tokens are short-lived JWTs bound to this endpoint by audience.
  • Revoking access is immediate, from the dashboard or from the client.

Questions or a client that is not listed here? Write to support@tinyto.me.