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.
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.
| Setting | Value |
|---|---|
| MCP endpoint | https://tinyto.me/mcp |
| Transport | Streamable HTTP (POST, JSON-RPC 2.0) |
| Authentication | OAuth 2.1 + PKCE, discovered automatically |
| API key required | No |
| Plan required | None โ MCP is available on every plan, including Free |
| Rate limit | 120 tool calls per minute per user |
| Access token lifetime | 1 hour, refreshed automatically |
What the assistant can do
Five tools. Four read, one writes. Nothing deletes or edits a link that already exists.
| Tool | Scope | What it does |
|---|---|---|
list_links | links:read | List links with click counts, newest first |
get_link | links:read | One link: destination, slug, clicks, expiry |
get_link_stats | links:read | Clicks, top countries and the weekday/hour heatmap |
account_info | links:read | Plan, active links and remaining allowance |
create_link | links:create | Shorten 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.
| Client | Where 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
- Open Customize โ Connectors and click +, then Add custom connector.
-
Name it TinyTo and paste
https://tinyto.me/mcpas the remote MCP server URL. Click Continue. - Leave Authentication on Sign in now and OAuth client on Use Claude's published identity. Add it.
- 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 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.
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
-
Go to Plugins (
chatgpt.com/plugins) and click +, then Add custom MCP server. Developer mode is no longer required. -
Name it TinyTo, and under Connection paste
https://tinyto.me/mcp. - Set authentication to OAuth. ChatGPT finds the authorization server by itself.
- Accept the risk warning and choose Create as a plugin. When ChatGPT scans the tools it opens the TinyTo consent screen โ approve it there.
- In a chat, type @ and pick TinyTo, then ask it to shorten something.
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:
-
It calls
/mcpwithout a token and gets401with aWWW-Authenticateheader pointing at/.well-known/oauth-protected-resource. -
That document names the authorization server, whose metadata at
/.well-known/oauth-authorization-serverlists the authorize, token, registration and JWKS URLs. - 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.
- You sign in to TinyTo and approve. The client gets an access token (1 hour) and a rotating refresh token (30 days).
| Endpoint | Purpose |
|---|---|
/.well-known/oauth-protected-resource | Which authorization server protects /mcp |
/.well-known/oauth-authorization-server | Authorization server metadata |
/.well-known/jwks.json | Public keys to verify access tokens |
/oauth/authorize | Consent screen (PKCE, S256 only) |
/oauth/token | Code exchange and refresh rotation |
/oauth/register | Dynamic client registration |
/oauth/revoke | RFC 7009 revocation, for clients that support it |
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:
- 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.
- Remove the connector in the client. Claude, Cursor, OpenCode and the rest usually discard their tokens locally.
-
Clients that implement revocation call
POST /oauth/revokewith the refresh token.
Troubleshooting
| Symptom | Cause 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.