DEV Community

Jay Elsheikh
Jay Elsheikh

Posted on

How I listed my MCP on the official MCP Registery and how you can do yours too ?

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

I recently listed ThinkReview MCP there — our hosted server that runs AI code reviews on GitHub, GitLab, Azure DevOps, and Bitbucket PR/MR URLs from Cursor, Claude, and Copilot.

Here’s exactly what I did, and how you can do the same.


First, 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 — your server lives on npm / PyPI / NuGet / Docker, and the registry points at that package
  2. Remote / hosted — your server is a public URL (Streamable HTTP), and the registry points at that endpoint

ThinkReview is remote. Our endpoint is:

https://mcp.thinkreview.dev/v1

So I didn’t need to publish an npm package just to get listed. I only needed a solid public docs repo + a valid server.json.

Docs that mattered:

The registry is still in preview. Expect possible breaking changes before GA.


Step 1 — Put something public on GitHub

Directories and developers want a repo they can open.

I created a public visibility/docs repo:

github.com/Thinkode/thinkreview-mcp

It includes:

  • What the MCP does
  • Endpoint + transport
  • OAuth and Bearer setup for Cursor / Claude / Copilot
  • Example configs

It does not include our private review engine, auth, or billing backend. For a SaaS MCP, that’s the right split:

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

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


Step 2 — Install the publisher CLI

brew install mcp-publisher
mcp-publisher --help
Enter fullscreen mode Exit fullscreen mode

Or grab a binary from the registry releases.

You’ll use three commands most of the time:

  • mcp-publisher init
  • mcp-publisher login ...
  • mcp-publisher publish

Step 3 — Choose your namespace (this is the gotcha)

Your server name is tied to how you authenticate.

Auth method Name format Example
GitHub login io.github.<user-or-org>/... io.github.Thinkode/thinkreview
Domain proof (DNS/HTTP) reverse-DNS of your domain branded names under your company domain

I used the GitHub org namespace because it’s the fastest path:

io.github.Thinkode/thinkreview

Note: the registry name (thinkreview) and the GitHub repo name (thinkreview-mcp) do not have to match. Pick a clean registry name; point repository.url at whatever public repo you use for docs or source.

Later, you can move to a branded domain namespace if you want cleaner naming — that needs DNS TXT or a /.well-known/mcp-registry-auth proof on your domain.


Step 4 — Create server.json for a remote MCP

In the repo:

cd thinkreview-mcp
mcp-publisher init
Enter fullscreen mode Exit fullscreen mode

Then edit the file for a hosted server. Skip packages unless you also ship a local install. Use remotes instead:

{
  "$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"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

A few rules that saved me time:

  • Prefer "type": "streamable-http" (SSE is deprecated)
  • The URL must be publicly reachable
  • version is required, unique per publish, and immutable once published — use semver
  • name must match your auth namespace (io.github.Thinkode/... if you logged in as that org)

Commit server.json so the listing is reproducible.


Step 5 — Authenticate

For the GitHub namespace path:

mcp-publisher login github
Enter fullscreen mode Exit fullscreen mode

You’ll get a device code, authorize it in the browser, and the CLI confirms you’re logged in.

That login only lets you publish under io.github.<that-account-or-org>/....


Step 6 — Publish

mcp-publisher publish
Enter fullscreen mode Exit fullscreen mode

When it works, you’ll see something like:

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

That’s it. Your MCP is now in the official upstream registry.


Step 7 — Verify

Search by a short token that matches your listing:

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

Or use the exact registry name:

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

You should see metadata like:

  • name: io.github.Thinkode/thinkreview
  • version: 1.3.0
  • status: active
  • remote: https://mcp.thinkreview.dev/v1
  • repository: https://github.com/Thinkode/thinkreview-mcp

From there, community directories (PulseMCP, Glama, mcp.so, mcpservers.org, etc.) often pick listings up over time — but the official registry is the upstream source you want first.


How to keep it updated

Every meaningful MCP release:

  1. Bump version in server.json
  2. Commit
  3. Run mcp-publisher publish again

Or automate it in GitHub Actions with mcp-publisher login github-oidc on version tags so every release republishes metadata.


If something fails

Error What it usually means
No permission to publish this server Your name doesn’t match your GitHub/domain auth
Invalid or expired JWT Re-run mcp-publisher login github
Registry validation failed Package listings need ownership proof (mcpName, etc.). 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 (e.g. repo name vs registry name)

The short version

  1. Make a public repo (docs + examples is enough for remote MCP)
  2. Install mcp-publisher
  3. Add a server.json with remotes pointing at your hosted URL
  4. mcp-publisher login github
  5. mcp-publisher publish
  6. Verify with the registry API

That’s how ThinkReview MCP got onto the official MCP Registry — and the same path works whether you’re shipping a local open-source server or a hosted product like ours.

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.


Links

Top comments (0)