Home › Blog

Add 500 small tools to Claude Code, Cursor or VS Code with one MCP URL

· 2 min read · mcpclaudeapihow-to

AI assistants are good at reasoning and surprisingly bad at small exact jobs: hashing a string, counting business days, converting a CIDR range, checking a Korean business registration number. You can ask the model to "be careful", or you can give it a tool that just does the job.

Our MCP server exposes a catalog of about 500 of these small tools behind one URL. This post shows how to add it to the editors and apps people actually use, and what a real call looks like.

The endpoint

https://toolsthatdontupload.com/mcp

It speaks Streamable HTTP. Compute tools (hashing, math, text, dates, conversions, PDF edits) need no sign-in. Network tools, the ones that fetch a URL or look up DNS, WHOIS or SSL details, need a free key sent as an X-API-Key header. You can create one here without a password.

The MCP setup page listing the endpoint and setup steps for Claude and Claude Code
The full setup page lives at /docs/. Everything below is taken from it.

Claude Code

claude mcp add --transport http tools-that-dont-upload https://toolsthatdontupload.com/mcp

# with a key, for network tools:
claude mcp add --transport http tools-that-dont-upload https://toolsthatdontupload.com/mcp \
  --header "X-API-Key: ttdu_free_..."

Cursor

Add this to ~/.cursor/mcp.json. The headers block is optional.

{
  "mcpServers": {
    "tools-that-dont-upload": {
      "url": "https://toolsthatdontupload.com/mcp",
      "headers": { "X-API-Key": "ttdu_free_..." }
    }
  }
}

VS Code (GitHub Copilot)

{
  "servers": {
    "tools-that-dont-upload": { "type": "http", "url": "https://toolsthatdontupload.com/mcp" }
  }
}

Claude (claude.ai or Claude Desktop)

  1. Open Customize, then Connectors, then Add custom connector.
  2. Name it Tools That Don't Upload and paste the URL above.
  3. Save, then turn it on in a chat from the tools menu.

Why only three tools?

Registering 500 tools directly would flood the model's context and make it worse at picking the right one. So the server exposes three:

The model searches first, then runs. In practice that is two short calls.

A real round trip

Here is an actual exchange, sent with plain HTTP so you can see the shape. First the search:

curl -s https://toolsthatdontupload.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"search_tools","arguments":{"query":"sha256","limit":2}}}'

It returned two matches, hash and hash_compare, out of 503 catalog entries, each with its parameters and an example. Then the run:

{"jsonrpc":"2.0","id":2,"method":"tools/call",
 "params":{"name":"run_tool",
           "arguments":{"tool":"hash","arguments":{"text":"hello","algorithm":"SHA-256"}}}}

Response:

{"algorithm":"SHA-256",
 "hash":"2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
 "length":64}

_meta: { "com.toolsthatdontupload/egress": "none",
         "com.toolsthatdontupload/stored": false }

That _meta block is worth noticing. Every result says whether the tool contacted anything outside our edge (egress) and whether anything was kept (stored). For a hash it is "none" and "false", which is what you would hope.

Two things to keep in mind

Every browser tool on this site works the same way: your file stays on your device. Browse all 98 tools or connect the MCP server.

More from the blog