{"slug": "how-i-listed-my-mcp-on-the-official-mcp-registery-and-how-you-can-do-yours-too", "title": "How I listed my MCP on the official MCP Registery and how you can do yours too ?", "summary": "Thinkode has listed its ThinkReview MCP server on the official MCP Registry at registry.modelcontextprotocol.io, using the mcp-publisher CLI. The hosted server, which runs AI code reviews on GitHub, GitLab, Azure DevOps, and Bitbucket PR/MR URLs from Cursor, Claude, and Copilot, is published under the GitHub org namespace io.github.Thinkode/thinkreview. The process involves creating a public docs repo, initializing a server.json with remote endpoint metadata, and publishing via the CLI.", "body_md": "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](https://registry.modelcontextprotocol.io).\n\nI 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.\n\nHere’s exactly what I did, and how you can do the same.\n\nThe Official MCP Registry stores **metadata**, not your binaries.\n\nThat means:\n\n`server.json`\n\nthat describes your MCPThere are two common shapes:\n\nThinkReview is **remote**. Our endpoint is:\n\n`https://mcp.thinkreview.dev/v1`\n\nSo 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`\n\n.\n\nDocs that mattered:\n\nThe registry is still in preview. Expect possible breaking changes before GA.\n\nDirectories and developers want a repo they can open.\n\nI created a public visibility/docs repo:\n\n[github.com/Thinkode/thinkreview-mcp](https://github.com/Thinkode/thinkreview-mcp)\n\nIt includes:\n\nIt does **not** include our private review engine, auth, or billing backend. For a SaaS MCP, that’s the right split:\n\nIf you’re building an open-source local MCP, your full source can live in that same repo.\n\n```\nbrew install mcp-publisher\nmcp-publisher --help\n```\n\nOr grab a binary from the [registry releases](https://github.com/modelcontextprotocol/registry/releases).\n\nYou’ll use three commands most of the time:\n\n`mcp-publisher init`\n\n`mcp-publisher login ...`\n\n`mcp-publisher publish`\n\nYour server `name`\n\nis tied to how you authenticate.\n\n| Auth method | Name format | Example |\n|---|---|---|\n| GitHub login | `io.github.<user-or-org>/...` |\n`io.github.Thinkode/thinkreview` |\n| Domain proof (DNS/HTTP) | reverse-DNS of your domain | branded names under your company domain |\n\nI used the **GitHub org namespace** because it’s the fastest path:\n\n`io.github.Thinkode/thinkreview`\n\nNote: the registry **name** (`thinkreview`\n\n) and the GitHub **repo** name (`thinkreview-mcp`\n\n) do not have to match. Pick a clean registry name; point `repository.url`\n\nat whatever public repo you use for docs or source.\n\nLater, you can move to a branded domain namespace if you want cleaner naming — that needs DNS TXT or a `/.well-known/mcp-registry-auth`\n\nproof on your domain.\n\n`server.json`\n\nfor a remote MCP\nIn the repo:\n\n```\ncd thinkreview-mcp\nmcp-publisher init\n```\n\nThen edit the file for a **hosted** server. Skip `packages`\n\nunless you also ship a local install. Use `remotes`\n\ninstead:\n\n```\n{\n  \"$schema\": \"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json\",\n  \"name\": \"io.github.Thinkode/thinkreview\",\n  \"title\": \"ThinkReview\",\n  \"description\": \"Live PR/MR code reviews via review_url_code. OAuth or portal Bearer auth.\",\n  \"version\": \"1.3.0\",\n  \"websiteUrl\": \"https://thinkreview.dev/features/mcp\",\n  \"repository\": {\n    \"url\": \"https://github.com/Thinkode/thinkreview-mcp\",\n    \"source\": \"github\"\n  },\n  \"remotes\": [\n    {\n      \"type\": \"streamable-http\",\n      \"url\": \"https://mcp.thinkreview.dev/v1\"\n    }\n  ]\n}\n```\n\nA few rules that saved me time:\n\n`\"type\": \"streamable-http\"`\n\n(SSE is deprecated)`version`\n\nis required, unique per publish, and immutable once published — use semver`name`\n\nmust match your auth namespace (`io.github.Thinkode/...`\n\nif you logged in as that org)Commit `server.json`\n\nso the listing is reproducible.\n\nFor the GitHub namespace path:\n\n```\nmcp-publisher login github\n```\n\nYou’ll get a device code, authorize it in the browser, and the CLI confirms you’re logged in.\n\nThat login only lets you publish under `io.github.<that-account-or-org>/...`\n\n.\n\n```\nmcp-publisher publish\n```\n\nWhen it works, you’ll see something like:\n\n```\nPublishing to https://registry.modelcontextprotocol.io...\n✓ Successfully published\n✓ Server io.github.Thinkode/thinkreview version 1.3.0\n```\n\nThat’s it. Your MCP is now in the official upstream registry.\n\nSearch by a short token that matches your listing:\n\n```\ncurl \"https://registry.modelcontextprotocol.io/v0.1/servers?search=thinkreview\"\n```\n\nOr use the exact registry name:\n\n```\ncurl \"https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.Thinkode/thinkreview\"\n```\n\nYou should see metadata like:\n\n`io.github.Thinkode/thinkreview`\n\n`1.3.0`\n\n`active`\n\n`https://mcp.thinkreview.dev/v1`\n\n`https://github.com/Thinkode/thinkreview-mcp`\n\nFrom 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.\n\nEvery meaningful MCP release:\n\n`version`\n\nin `server.json`\n\n`mcp-publisher publish`\n\nagainOr automate it in GitHub Actions with `mcp-publisher login github-oidc`\n\non version tags so every release republishes metadata.\n\n| Error | What it usually means |\n|---|---|\n| No permission to publish this server | Your `name` doesn’t match your GitHub/domain auth |\n| Invalid or expired JWT | Re-run `mcp-publisher login github`\n|\n| Registry validation failed | Package listings need ownership proof (`mcpName` , etc.). Remote listings need a live public URL |\n| Version already exists | Bump semver — published versions can’t be overwritten |\n| Search returns empty | You’re searching the wrong string (e.g. repo name vs registry `name` ) |\n\n`mcp-publisher`\n\n`server.json`\n\nwith `remotes`\n\npointing at your hosted URL`mcp-publisher login github`\n\n`mcp-publisher publish`\n\nThat’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.\n\nIf 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.", "url": "https://wpnews.pro/news/how-i-listed-my-mcp-on-the-official-mcp-registery-and-how-you-can-do-yours-too", "canonical_source": "https://dev.to/jay_elsheikh_59b14ad67922/how-i-listed-my-mcp-on-the-official-mcp-registery-and-how-you-can-do-yours-too--1lp", "published_at": "2026-08-10 11:25:49+00:00", "updated_at": "2026-08-10 11:47:58.373994+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools", "ai-products"], "entities": ["Thinkode", "ThinkReview", "MCP Registry", "mcp-publisher", "GitHub", "GitLab", "Azure DevOps", "Bitbucket"], "alternates": {"html": "https://wpnews.pro/news/how-i-listed-my-mcp-on-the-official-mcp-registery-and-how-you-can-do-yours-too", "markdown": "https://wpnews.pro/news/how-i-listed-my-mcp-on-the-official-mcp-registery-and-how-you-can-do-yours-too.md", "text": "https://wpnews.pro/news/how-i-listed-my-mcp-on-the-official-mcp-registery-and-how-you-can-do-yours-too.txt", "jsonld": "https://wpnews.pro/news/how-i-listed-my-mcp-on-the-official-mcp-registery-and-how-you-can-do-yours-too.jsonld"}}