Research guide · MCP Registry publishing
mcp-publisher 403: fix a missing GitHub organization namespace
If mcp-publisher publish validates your server but then says you can publish only under your personal io.github.<user>/* namespace, treat the permission list as the decisive clue. Do not burn time rewriting a valid server.json or create a second public identity just to get past the error.
Published and sources checked 13 September 2026
3 open reports
Independent 2026 org-namespace 403 reports remain open
1 decisive clue
The granted namespace list tells you whether auth is the blocker
0 identity shortcuts
Do not create a duplicate personal listing by accident
Error fingerprint
The 403 can tell you exactly what is missing
Multiple current Registry reports show the same shape: validation succeeds, publishing returns HTTP 403, and the error says the token can publish only to the user namespace while the requested name belongs to a GitHub organization. In that state, repeatedly editing package metadata is low-value because the authorization grant does not include the requested owner.
mcp-publisher validate
# passes
mcp-publisher publish
# 403 Forbidden
# You do not have permission to publish this server.
# You have permission to publish: io.github.<user>/*
# Attempting: io.github.<org>/serverSix-step diagnosis
Separate server metadata from namespace authorization
1
Validate before debugging auth
Run mcp-publisher validate against the intended server.json. A clean validation plus a publish-time 403 narrows the failure to authorization or namespace ownership rather than schema shape.
2
Read the permission list literally
The 403 response commonly states the namespaces currently granted. If it lists io.github.<user>/* but not io.github.<org>/*, stop changing package metadata: the publisher token does not currently carry the organization namespace.
3
Confirm the exact public identity
Check that server.json uses the organization name you intend to keep, with the correct spelling and case. Do not silently substitute a personal namespace just because it publishes.
4
Check organization visibility and role
For GitHub interactive auth, confirm the relevant organization membership is public and that the account has the ownership level required by the Registry. Then perform one fresh logout/login cycle.
5
Escalate auth method, not retries
If a fresh interactive login still returns only the personal namespace, use a documented organization-capable path: a PAT with organization membership read permission, GitHub Actions OIDC from an organization-owned repository, or an intentionally chosen custom-domain namespace.
6
Verify the published record
After a successful publish, query the Registry for the exact canonical server name. A local success message is not enough; verify that the intended organization identity is the one clients can discover.
Supported organization auth paths
Use a documented owner-aware credential instead of looping OAuth
PAT
Read organization membership
The current official GitHub Actions guide says a classic PAT needs read:org. A fine-grained PAT should be scoped to the organization and grant Members → Read-only. The CLI accepts a PAT through mcp-publisher login github --token=....
GitHub OIDC
Publish from the organization-owned repo
The official CI path uses mcp-publisher login github-oidc with id-token: write. The granted GitHub namespace is derived from the repository owner, so the workflow repository itself must be owned by the organization you intend to publish under.
DNS / HTTP
Choose a stable domain namespace
The Registry also supports DNS and HTTP proof for custom-domain namespaces. This is useful when a domain is the desired durable identity, but changing namespaces just to bypass one failed login creates a different public server identity.
Current evidence
Why this is not just a one-off typo
The official CLI reference currently says GitHub interactive authentication grants access to both personal and organization io.github.* namespaces. However, three separate open Registry issues from July and August 2026 report organization publishing returning 403 even after public membership and re-authentication. Two reports explicitly show the permission set remaining personal-only.
That does not prove every interactive login is broken. It does mean the practical diagnostic should trust the permission list returned by the Registry rather than assuming that public membership alone guarantees the organization namespace was actually granted.
After the fix
Verify the exact identity that agents will discover
A successful publish should be followed by a Registry lookup for the exact canonical name. Check the organization namespace, server version and endpoint/package metadata that clients will consume. Do not count a CLI success message, directory row or crawler hit as a real visitor, installation or paid conversion.
curl -s "https://registry.modelcontextprotocol.io/v0/servers?search=io.github.<org>/<server>"Continue the implementation path
Discovery is useful only if the live server is trustworthy
Make an MCP server discoverable
Canonical Registry, DNS/HTTP auth, directory and verification checklist.
Verify an MCP server before connecting
Separate listing presence from live transport, authorization and tool behavior.
Troubleshoot MCP OAuth
Protected-resource metadata, token audience, scopes and authorization failures.
Machine API services
Move from research into machine-readable zFinia services and current commercial contracts.