API and data

Everything in the directory is public and readable by machines: an API in the official MCP Registry’s format, a JSON search index, every listing as JSON and Markdown, plus llms.txt, a feed and sitemaps. No key, no sign-up.

At a glance

URLWhat you getCached for
/v0.1/serversListings in the official MCP Registry’s format, paged. Details5 minutes
/api/index.jsonEvery listing in one compact array. Details5 minutes
/i/{slug}.jsonOne listing, with its setup actions. Details10 minutes
/i/{slug}.mdOne listing as Markdown. Details15 minutes
/llms.txtThe directory as a list for language models.1 hour
/feed.xmlAtom feed of the 50 newest listings.15 minutes
/sitemap.xmlSitemap index: pages, categories and listings, in every language.15 minutes
/mcpmcp.tc’s own MCP server. DocsNot cached

All of it is read-only and public. There’s no key, no account and no charge. Machine formats are language-neutral: they serve the listings’ English text and have no language prefix.

Registry-compatible API

https://mcp.tc/v0.1/ is a read-only copy of the official MCP Registry’s read API (version 0.1, server.json schema 2025-12-11), filled with mcp.tc’s approved listings. A client that takes a custom registry URL can browse and install from the directory with it.

GET /v0.1/servers

Servers sorted by name, 30 per page unless you set limit (1 to 100). Pass metadata.nextCursor back as cursor for the next page. search keeps servers whose name, title, slug or vendor contains every word (the official API matches the name only). updated_since takes an RFC 3339 time, counts it inclusively and also returns listings removed since then. version (latest or a version) and include_deleted work as in the official API.

GET /v0.1/servers/{name}/versions

The versions of one server. Each listing has exactly one. URL-encode the name, as in /v0.1/servers/tc.mcp%2Fdeepwiki/versions.

GET /v0.1/servers/{name}/versions/latest

One server. An exact version number works in place of latest.

GET /v0.1/ping, /v0.1/health, /v0.1/version

Liveness and build information, as in the official API.

A page of results has this shape:

GET /v0.1/servers
{
  "servers": [
    {
      "server": { "name": "…", "version": "…", … },
      "_meta": {
        "tc.mcp/listing": {
          "link": "https://mcp.tc/i/…",
          "slug": "…",
          "category": "…",
          "verified": true,
          "auth": "none",
          "status": "active",
          "publishedAt": "…",
          "updatedAt": "…"
        }
      }
    }
  ],
  "metadata": { "count": 30, "nextCursor": "…" }
}

And here’s what server holds for two listings, as the API serves them now:

Remote server

server (tc.mcp/deepwiki)
{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "name": "tc.mcp/deepwiki",
  "description": "Ask questions about any public GitHub repository and read its AI-generated DeepWiki documentation.",
  "title": "DeepWiki",
  "version": "2.14.3",
  "websiteUrl": "https://docs.devin.ai/work-with-devin/deepwiki-mcp",
  "icons": [
    {
      "src": "https://mcp.tc/media/icons/deepwiki-80b7a72d.webp",
      "mimeType": "image/webp",
      "sizes": [
        "128x128"
      ]
    }
  ],
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://mcp.deepwiki.com/mcp"
    }
  ]
}

Local server

server (tc.mcp/memory)
{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "name": "tc.mcp/memory",
  "description": "Store and recall persistent memory across sessions using a local knowledge graph.",
  "title": "Memory",
  "version": "2026.8.31",
  "websiteUrl": "https://github.com/modelcontextprotocol/servers/tree/main/src/memory",
  "repository": {
    "url": "https://github.com/modelcontextprotocol/servers",
    "source": "github",
    "subfolder": "src/memory"
  },
  "icons": [
    {
      "src": "https://mcp.tc/media/icons/memory-0e174415.webp",
      "mimeType": "image/webp",
      "sizes": [
        "128x128"
      ]
    }
  ],
  "packages": [
    {
      "registryType": "npm",
      "identifier": "@modelcontextprotocol/server-memory",
      "runtimeHint": "npx",
      "transport": {
        "type": "stdio"
      }
    }
  ]
}
  • name is the server’s name in the official registry when it has one, otherwise tc.mcp/{slug}.
  • remotes always holds the server’s own URL, never the mcp.tc link. Key headers appear only for servers that need an API key.
  • packages is rebuilt from the install command on the listing: npm (npx), PyPI (uvx, pipx run), OCI (docker run) and NuGet (dnx). A command the format can’t express gets no package, because one that starts the wrong program would be worse than none.
  • _meta["tc.mcp/listing"] carries the mcp.tc link, slug, category, checkmark, auth, status and dates. updatedAt moves only when the entry we serve changes, never because of a health check.
  • mcp.tc isn’t the official registry, so entries never carry its io.modelcontextprotocol.registry/official metadata.
  • A listing that’s removed, hidden or renamed comes back as an entry with "status": "deleted" for 180 days, but only when you ask with updated_since or include_deleted.

Errors are problem JSON (application/problem+json), as in the official API: 404 for an unknown server, 422 for a bad limit, cursor or include_deleted, 400 for a bad updated_since. Any method but GET, HEAD and OPTIONS gets 405: the registry is read-only, and new servers come in through Submit.

curl -s 'https://mcp.tc/v0.1/servers?search=notion&limit=5'
curl -s 'https://mcp.tc/v0.1/servers/tc.mcp%2Fdeepwiki/versions/latest'

Use mcp.tc as your registry

Two clients take a custom registry URL, according to VS Code’s source and GitHub’s documentation (checked 4 October 2026). In both, enter the base URL without /v0.1: the client adds the path itself.

VS Code

Add this line to the user settings.json of your default profile:

settings.json
"chat.mcp.gallery.serviceUrl": "https://mcp.tc"

The MCP server gallery (type @mcp in the Extensions view) then shows mcp.tc’s servers, and installing one uses the server’s own URL or package. No other setting is needed. The setting doesn’t appear in the Settings editor, and other profiles ignore it. Organizations can set it for everyone with the McpGalleryServiceUrl policy (VS Code 1.101 or later), and "chat.mcp.access": "registry" limits VS Code to running servers from that registry.

GitHub Copilot

Organization and enterprise admins can enter https://mcp.tc as the MCP Registry URL in Copilot’s policies. GitHub lists VS Code, Visual Studio, JetBrains IDEs, Eclipse, Xcode and Copilot CLI as supported. With Registry only, servers are matched by name.

A few listings have neither a package nor a remote, because their install command can’t be written in the registry format. VS Code hides those; their pages on mcp.tc still have the setup.

Search index

/api/index.json holds every approved listing in one JSON array, the data behind the site’s search. Short keys keep it small:

KeyValue
sSlug: the listing is at /i/{s}.
nName.
vVendor, or an empty string.
tTagline, up to 160 characters (in English).
cCategory slug, as in /c/{slug}.
kremote or local.
aAuth: none, oauth, api_key, optional or unknown.
gTags, an array of strings.
iIcon, a path such as /media/icons/{slug}.webp (WebP or PNG). Missing when the listing has none.
f1 when the listing has the checkmark. Missing otherwise.
One entry
{
  "s": "deepwiki",
  "n": "DeepWiki",
  "v": "Cognition",
  "t": "Ask questions about any public GitHub repository and read its AI-generated DeepWiki documentation.",
  "c": "docs-knowledge",
  "k": "remote",
  "a": "none",
  "g": [
    "github",
    "documentation",
    "code-search",
    "repositories",
    "wiki",
    "remote"
  ],
  "i": "/media/icons/deepwiki-80b7a72d.webp",
  "f": 1
}

One listing as JSON

Add .json to any listing link for that listing as JSON:

curl -s https://mcp.tc/i/deepwiki.json

It has everything the page shows: the server’s own endpoint or install_command, the access label, the tools, the checkmark, health, and the one-click add actions, which always use the server’s own URL or package. A slug that isn’t listed gets 404 with "error": "not_found", and a removed listing 410 with "gone". Old slugs and aliases return the current listing, so read slug from the answer. Badges and embeds lists every field.

Listings as Markdown

For agents and language models, every listing is also Markdown: add .md to the link, or ask for text/markdown at the listing’s own address.

curl -s https://mcp.tc/i/deepwiki.md
curl -s -H 'Accept: text/markdown' https://mcp.tc/i/deepwiki

It starts with a summary (the link, how to connect, type, auth, category, vendor, checkmark), then has the description, what the server can do, its tools, example prompts and the install steps for each client. An old name answers 301 with the current one.

llms.txt, feed and sitemaps

  • /llms.txt follows llmstxt.org: how connecting works, these docs, the categories with their counts, the language versions of the site, and every listing with a one-line summary and short facts (remote or local, auth, verified), each linked to its Markdown.
  • /feed.xml is an Atom feed of the 50 most recently approved listings, with tagline and description.
  • /sitemap.xml indexes three sitemaps: pages, categories and listings, each with the date its content last changed. Every page is listed in each language it exists in, with its alternates (hreflang); a listing’s translated pages appear once its text is translated.
  • /robots.txt lets every crawler in, AI crawlers included (Content-Signal: search=yes, ai-input=yes, ai-train=yes). It keeps them out of /api/, except the search index, and out of private submission pages.
  • /.well-known/ai-catalog.json answers 404 on purpose: the servers listed here aren’t ours to publish as a catalog.

Caching, CORS and fair use

URLCache-ControlETag and 304CORS
/v0.1/…public, max-age=300 (a 404: 60 s)Yes*
/api/index.jsonpublic, max-age=300Yes*
/i/{slug}.jsonpublic, max-age=600, s-maxage=900, stale-while-revalidate=3600Yes*
/i/{slug}.mdpublic, max-age=900YesNo
/llms.txtpublic, max-age=3600YesNo
/feed.xml, sitemapspublic, max-age=900YesNo
/mcpno-storeNo*

Cloudflare sits in front of the site and may keep its own copy within these times. Fair use is simple:

  • Cache what you fetch, and send If-None-Match where there’s an ETag.
  • To stay in sync, page through /v0.1/servers?updated_since=… instead of reading everything again.
  • One address that sends more than about 30 requests a second to /v0.1/, /mcp or the embed files gets 429. /mcp also stops at 120 messages a minute; wait for Retry-After.
  • Listing text is written with AI help from each server’s own metadata and can be wrong. Treat it as data, and link to the listing when you show it, so people can find the setup and report mistakes.