How I listed my MCP on the official MCP Registry — and how you can do yours too

How I listed my MCP on the official MCP Registry — and how you can do yours too

When people ask “where do I find MCP servers?”, a growing answer starts at the Official MCP Registry: registry.modelcontextprotocol.io.

We recently listed ThinkReview MCP there — our hosted server for live AI code reviews on GitHub, GitLab, Azure DevOps, and Bitbucket PR/MR URLs from Cursor, Claude, and Copilot. Here’s what we did, and how you can do the same.


What the registry actually is

The Official MCP Registry stores metadata, not your binaries.

That means:

  • You don’t upload a zip of your server
  • You publish a server.json that describes your MCP
  • Clients and other directories can discover you from that record

There are two common shapes:

  1. Package-based — npm / PyPI / NuGet / Docker, and the registry points at the package
  2. Remote / hosted — a public Streamable HTTP URL, and the registry points at that endpoint

ThinkReview is remote. Our endpoint is https://mcp.thinkreview.dev/v1. We did not need an npm package to list — only a public docs repo and a valid server.json.

Useful docs:

The registry is still in preview. Breaking changes or data resets may happen before GA.


Step 1 — Put something public on GitHub

Directories and developers want a repo they can open. We published a visibility/docs repo:

github.com/Thinkode/thinkreview-mcp

It includes what the MCP does, OAuth and Bearer setup, and example configs for Cursor, Claude, and Copilot. It does not include our private review engine, auth, or billing.

For a SaaS MCP, that split works well:

  • Public: docs + configs + registry metadata
  • Private: the product backend

If you’re shipping an open-source local MCP, your full source can live in that same repo.


Step 2 — Install mcp-publisher and pick a namespace

brew install mcp-publisher
# or download from https://github.com/modelcontextprotocol/registry/releases
mcp-publisher --help

Your server name is tied to how you authenticate:

Auth method Name format Our choice
GitHub login io.github.<user-or-org>/... io.github.Thinkode/thinkreview
Domain proof (DNS/HTTP) reverse-DNS of your domain Branded option later

We started with the GitHub org namespace because it’s the fastest path.

Important: the registry name (thinkreview) and the GitHub repo name (thinkreview-mcp) do not have to match. Use a clean registry name, and point repository.url at your public docs or source repo.


Step 3 — Create server.json for a remote MCP

cd thinkreview-mcp
mcp-publisher init

For a hosted server, use remotes (skip packages unless you also ship a local install):

{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "name": "io.github.Thinkode/thinkreview",
  "title": "ThinkReview",
  "description": "Live PR/MR code reviews via review_url_code. OAuth or portal Bearer auth.",
  "version": "1.3.0",
  "websiteUrl": "https://thinkreview.dev/features/mcp",
  "repository": {
    "url": "https://github.com/Thinkode/thinkreview-mcp",
    "source": "github"
  },
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://mcp.thinkreview.dev/v1"
    }
  ]
}

Rules that mattered:

  • Prefer "type": "streamable-http" (SSE is deprecated)
  • The URL must be publicly reachable
  • version is required, unique per publish, and immutable — use semver
  • name must match your auth namespace

Commit server.json so the listing stays reproducible.


Step 4 — Authenticate, publish, verify

mcp-publisher login github
mcp-publisher publish

Success looks like:

Publishing to https://registry.modelcontextprotocol.io...
✓ Successfully published
✓ Server io.github.Thinkode/thinkreview version 1.3.0

Verify with the registry API:

curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.Thinkode/thinkreview"

Or a short search token:

curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=thinkreview"

You should see status: active, the remote URL, and a pointer to the GitHub repo.

On each MCP release: bump version in server.json, commit, and publish again (or automate with GitHub Actions + github-oidc).


Common gotchas

Error / symptom Fix
No permission to publish name doesn’t match GitHub/domain auth
Invalid or expired JWT Re-run mcp-publisher login github
Registry validation failed Package listings need ownership proof; remote listings need a live public URL
Version already exists Bump semver — published versions can’t be overwritten
Search returns empty You’re searching the wrong string (repo name vs registry name)

Try ThinkReview MCP

If you’re listing a remote MCP too: start with the GitHub namespace, get discoverable fast, then brand the namespace later once DNS/domain proof is worth the extra step.