Menu

AI

How to Publish a Remote MCP Server to the MCP Registry Under Your Company Domain

Publish a hosted MCP server to the official MCP Registry under your company domain: DNS or HTTP proof, a remote server.json, mcp-publisher and CI releases.

By: Irina ShvayaNovember 6, 2026

How to Publish a Remote MCP Server to the MCP Registry Under Your Company Domain

This guide is part of Launch and list your MCP server, within The MCP Guide. Want help getting found? See MCP marketing.

To publish a remote MCP server to the official MCP Registry under your company name, you prove you own your domain with a DNS TXT record or a /.well-known/mcp-registry-auth file, write a server.json with a remotes entry, then run mcp-publisher login dns (or login http) and mcp-publisher publish. Your server then appears as com.yourcompany/your-server in the registry's public API.

This guide is the company version of the process. Our Lesson 28: Publish to the MCP Registry covers the beginner path with an npm package and a GitHub login. Here we focus on a hosted server, a domain namespace and automated releases.

Commands and fields below match the MCP Registry docs and the 2025-12-11 server.json schema, checked on 6 November 2026. The latest mcp-publisher release on GitHub that day was v1.8.8, published 6 November 2026. The registry is still in preview, and its docs warn that "Breaking changes or data resets may occur before general availability."

Key Takeaways

  • A domain namespace such as com.example/ needs DNS or HTTP proof; GitHub logins only allow io.github.username/ or io.github.orgname/ names.
  • A remote-only server.json needs name, description and version, plus a remotes entry with "type": "streamable-http" and a public URL.
  • The schema caps description and title at 100 characters each, so write a plain one-line summary.
  • Each version string must be unique and can't be changed or deleted after publishing.
  • For CI, the DNS method needs one MCP_PRIVATE_KEY secret; GitHub OIDC needs none but ties the name to GitHub.
  • The registry is separate from Claude's and ChatGPT's directories; publishing here doesn't list you in either.

Before you start

You need four things:

  • A public remote server. The remote servers guide says it "MUST be publicly accessible at its specified URL." The registry's About page says it "does not support private servers."
  • Control of your domain's DNS, or the ability to host a file at https://yourdomain/.well-known/mcp-registry-auth.
  • OpenSSL, to make a key pair. The docs also show Google Cloud KMS and Azure Key Vault options.
  • mcp-publisher, installed with brew install mcp-publisher or the prebuilt binary from the quickstart.

If you're not sure the registry is worth it, read what the MCP Registry is first. It explains how directories pull from it.

Step 1: Choose your namespace

The namespace is the part of the name before the slash. The authentication guide says your login method decides which namespaces you can use.

Login methodName must look likeProof
GitHubio.github.username/* or io.github.orgname/*Browser device-code login
DNScom.example.*/* (your domain reversed)TXT record with your public key
HTTPcom.example.*/*Key file at /.well-known/mcp-registry-auth

For a company, the domain name is the stronger signal. A user who sees com.acme/crm can tell it came from the owner of acme.com. Pick DNS if you can edit DNS records. Pick HTTP if a web team can publish a static file faster.

The official registry's server.json requirements, in the registry's GitHub repository, put it simply: to publish to com.example/server, "the publisher must prove they own the example.com domain."

Step 2: Generate a key and publish the proof

These commands come from the authentication guide. Replace example.com with your domain.

DNS method (Ed25519)

MY_DOMAIN="example.com"

# Generate public/private key pair using Ed25519
openssl genpkey -algorithm Ed25519 -out key.pem

# Generate TXT record
PUBLIC_KEY="$(openssl pkey -in key.pem -pubout -outform DER | tail -c 32 | base64)"
echo "${MY_DOMAIN}. IN TXT \"v=MCPv1; k=ed25519; p=${PUBLIC_KEY}\""

Add the printed TXT record at your DNS provider. The docs say propagation "may take several minutes."

HTTP method (Ed25519)

openssl genpkey -algorithm Ed25519 -out key.pem
PUBLIC_KEY="$(openssl pkey -in key.pem -pubout -outform DER | tail -c 32 | base64)"
echo "v=MCPv1; k=ed25519; p=${PUBLIC_KEY}" > mcp-registry-auth

Host the mcp-registry-auth file at /.well-known/mcp-registry-auth on your domain.

Treat key.pem like any production secret. Anyone with it can publish under your namespace. Store it in your secrets manager, not in the repository.

Step 3: Write a remote server.json

You can run mcp-publisher init to generate a template, then edit it. For a hosted server, the remote servers guide shows this shape:

{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "name": "com.example/acme-analytics",
  "title": "ACME Analytics",
  "description": "Real-time business intelligence and reporting platform",
  "version": "2.0.0",
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://analytics.example.com/mcp"
    }
  ]
}

Field rules from the 2025-12-11 schema:

FieldRule
nameRequired; 3 to 200 characters; pattern namespace/server-name
descriptionRequired; 1 to 100 characters
versionRequired; up to 255 characters; unique per publish
titleOptional; up to 100 characters
remotes[].type"streamable-http" or "sse"

The guide says to prefer Streamable HTTP. SSE is deprecated, so publish an "sse" remote "only to support existing clients."

Optional remote settings

  • Headers. If clients must send an API key, add a headers array with name, description, isRequired and isSecret. Never put a real key in the file.
  • Per-tenant URLs. Use {curly_braces} variables, such as https://{tenant_id}.analytics.example.com/mcp, with a variables object. Variables support default, choices and isSecret.
  • A package too. remotes can sit alongside packages if you also ship a local version. Then the package needs its own ownership marker, as Lesson 28 explains.
  • Custom metadata. Only data under _meta key io.modelcontextprotocol.registry/publisher-provided is kept, and it is limited to 4 KB. Other _meta keys "are silently dropped."

Check the file with our server.json validator before you publish. The description is the part people read most, and the moderation policy treats "a description stuffed with marketing copy" as spam.

Step 4: Log in with your domain

After the TXT record propagates, or the file is live, log in. From the authentication guide:

MY_DOMAIN="example.com"
PRIVATE_KEY="$(openssl pkey -in key.pem -noout -text | grep -A3 "priv:" | tail -n +2 | tr -d ' :\n')"
mcp-publisher login dns --domain "${MY_DOMAIN}" --private-key "${PRIVATE_KEY}"

For the HTTP method, the command is the same with login http in place of login dns.

If you see "You do not have permission to publish this server," the quickstart says your login method doesn't match your name's namespace. If you see "Invalid or expired Registry JWT token," log in again.

Step 5: Publish and verify

mcp-publisher publish

Then search the public API. The quickstart uses this pattern:

curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=com.example/acme-analytics"

Your server's metadata should appear in the servers array. Downstream directories don't update instantly. The About page says aggregators are expected to pull "on a regular but infrequent basis (for example, once per hour)."

Step 6: Version every change

The versioning guide sets the rules:

  • "The version string MUST be unique for each publication of the server." Once published, it and other metadata "cannot be changed."
  • Semantic versioning is recommended. Ranges such as ^1.2.3 or 1.x are prohibited.
  • For a remote server with an API version, "the server version should align with the API version," for example 2.1.0 for .../mcp/v2.1.
  • For a metadata-only update, such as a better description, use a prerelease version like 1.2.3-1.

The registry FAQ says you can't currently delete or unpublish a server. Plan your name and first version carefully.

Step 7: Automate releases in CI

The GitHub Actions guide has a DNS version of its workflow. It triggers on version tags, installs mcp-publisher, then runs:

      - name: Authenticate to MCP Registry
        run: ./mcp-publisher login dns --domain example.com --private-key ${{ secrets.MCP_PRIVATE_KEY }}

      - name: Publish server to MCP Registry
        run: ./mcp-publisher publish

Add an MCP_PRIVATE_KEY repository secret with your Ed25519 private key. The guide also shows an optional jq step that sets version in server.json from the tag. Tag a release with git tag v1.0.0 and git push origin v1.0.0 to run it.

The guide's other options are GitHub OIDC (login github-oidc, which needs id-token: write and no secret) and a GitHub personal access token. Both tie your name to an io.github. namespace, so a company domain needs the DNS route.

After publishing: what the registry does and doesn't do

A listing proves who published the server. It doesn't vouch for quality. The moderation policy says maintainers "only remove illegal content, malware, spam, and completely broken servers," and consumers "should assume minimal-to-no moderation."

It also doesn't reach every AI app. Anthropic's directory vs custom page says the Anthropic Directory is independent of the MCP Registry, and "Publishing to those doesn't surface your server in Claude." Submit there separately, as covered in how to get listed in Claude's connectors directory. ChatGPT has its own process too: see how to submit an app to ChatGPT.

The registry is one item on the wider MCP server launch checklist. For other listing channels, see the best MCP directories.

Next step

Publishing makes your server findable by aggregators. Turning that into users takes docs, setup pages and AI search visibility. eSEOspace's MCP marketing service handles registry and directory submissions and the launch pages around them, scoped per project.

More in the MCP Guide

Latest research: State of MCP: October 2026

Frequently asked questions

Can I publish under my company domain with a GitHub login?

No. GitHub login only allows io.github.username/ or io.github.orgname/ names. A name like com.yourcompany/server needs DNS or HTTP verification of the domain.

Can I use a subdomain in the namespace?

The authentication guide writes the domain format as com.example.*/*, where com.example is your domain reversed. Prove ownership of the domain you reverse. Test the name with mcp-publisher before you announce it.

Do I need an npm or Docker package for a hosted server?

No. A remote server can be listed with only a remotes entry. Add packages only if you also ship a local version, and then add that package's ownership marker.

How do I fix a typo in my description?

Publish a new version. The registry doesn't allow edits to a published version. The versioning guide suggests a prerelease version such as 1.2.3-1 for metadata-only updates.

Is the MCP Registry production-ready?

As of 6 November 2026 its docs still say it is in preview, and that breaking changes or data resets may occur before general availability. Keep your server.json in version control so you can republish if needed.

Get a FREE Website Audit

Enter your website and get a 20–30 page SEO, GEO, AEO & CRO audit within 24 hours. Completely free.

Don't have a site yet? Get in touch →

Ready to speak with a marketing expert?
Give us a call! (916) 866-7893

Websites Launched
1407
Websites Launched
Marketing Experts
29
Marketing Experts
Hours of Dedicated Work
204533
Hours of Dedicated Work
Irina S.Benjamin G.Jeanette M.David G.