Guidance for coding agents working inside the mcp-servers registry repo. Complements README.md and CONTRIBUTING.md; when anything here conflicts with an explicit user instruction in the current session, the user wins.
mcp-servers is the community-maintained registry of MCP server definitions for McpMux. Each server is a single JSON file in servers/, validated against a JSON Schema on every PR. Merges to main are bundled and published to the McpMux discovery API, so definitions land in user installs automatically.
This is not a code repo — there is no runtime to ship, no UI to build. The artefact is the set of JSON files and the bundle generated from them. Agent changes here are almost always JSON edits plus CI green.
mcp-servers/
├── servers/ # One JSON file per MCP server — the registry
├── schemas/
│ └── server-definition.schema.json # JSON Schema 2020-12 — the contract
├── categories.json # Allowed categories
├── examples/ # Starter templates for contributors
│ ├── complete-example.json
│ ├── remote-hosted-example.json
│ ├── read-only-example.json
│ └── sponsored-example.json
├── scripts/
│ ├── validate.js # AJV validation + conflict detection
│ └── build-bundle.js # Aggregates servers into bundle/bundle.json
├── tests/ # Vitest — schema, consistency, categories, bundle
├── bundle/ # Generated — do not edit by hand
├── CONTRIBUTING.md
└── LICENSE # Elastic License 2.0 (ELv2)
pnpm installNode.js 20+ and pnpm 9+. No Rust, no native deps.
| Command | What it does |
|---|---|
pnpm validate servers/<file>.json |
Validate specific definition(s) against the schema. |
pnpm validate:all |
Validate every file in servers/. |
pnpm check-conflicts |
Detect ID/alias collisions across definitions. |
pnpm test |
Full test suite (schema, consistency, categories, bundle). |
pnpm test:watch |
Watch mode for local iteration. |
pnpm build |
Generate bundle/bundle.json. |
Always run pnpm validate:all && pnpm check-conflicts && pnpm test before claiming a change is done. CI runs the same checks on every PR.
Every definition must include id, name, and transport. Recommended additions: description, alias, categories, capabilities, links.repository, contributor, platforms, auth.
- Format
{tld}.{publisher}-{name}, lowercase, regex^[a-z0-9]+\.[a-z0-9][a-z0-9-]*$. com.*— official publishers / well-known orgs (com.github-mcp,com.notion-mcp).community.*— community contributions (community.sqlite,community.brave-search).- The filename must match the ID:
servers/community.brave-search.json.
stdio— local command, runs on the user's machine. Providecommand,args, optionalenv.http— remote Streamable-HTTP endpoint. Provideurl.
User-supplied values flow through ${input:VAR} substitution in env and args. Every placeholder must have a matching entry in transport.metadata.inputs. For secrets, set secret: true and type: "password" so McpMux encrypts them in the OS keychain. Include an obtain block with step-by-step instructions whenever the user has to visit a dashboard.
See examples/complete-example.json for the full shape.
Must come from categories.json. Need a new one? Open a registry issue — don't invent an ID inline.
Contributor PRs that touch these are rejected:
badges,stats,sponsored,featuredpublisher.official,publisher.verified,publisher.domain_verified- Any
_platform*prefix
These are computed or granted by McpMux maintainers after verification.
- Reference third-party products with "works with", "for", or "connects to" — never "official", "certified", "endorsed" unless you represent the trademark owner and are verified.
- Logos are referenced by HTTP(S) URL in the
logofield — McpMux does not host logo files and emoji are not accepted. Only link to assets you have the right to reference. The legacy field nameiconis still accepted for backward compatibility. - See
TRADEMARK-TAKEDOWN.mdfor the full IP policy.
- Commits must be signed off (DCO):
git commit -s -m "...". CI rejects unsigned commits. - One server per PR keeps review fast. Multi-server PRs are fine for coordinated maintenance sweeps.
- PRs follow
.github/PULL_REQUEST_TEMPLATE.md. The checklist exists to catch the common failure modes — please actually tick it. - Don't bypass hooks (
--no-verify) or DCO signing unless explicitly told to.
Two templates live in .github/ISSUE_TEMPLATE/:
request-server.yml— ask the community to add a server you don't have a definition for. Deep-linked from the McpMux desktop app — keep the filename stable.bug-report.yml— flag a broken or incorrect existing definition. Deep-linked from the McpMux desktop app — keep the filename stable.
Contributors who want to add a server open a PR against servers/ — there is no issue-based submission path. See CONTRIBUTING.md for the flow.
Renaming or removing either template breaks deep links shipped in every installed McpMux — don't do it without coordinating with the app.
- Copy the closest template from
examples/toservers/<your-id>.json. - Set
id,name,description,transport,categories,links.repositoryat minimum. - For every user-provided value, add an entry to
transport.metadata.inputswithobtaininstructions. pnpm validate servers/<your-id>.json && pnpm check-conflicts && pnpm test.git commit -s -m "Add <your-server-name>"and open a PR.
- Don't edit
bundle/— it's generated byscripts/build-bundle.js. CI will overwrite anything you put there. - Don't edit
schemas/server-definition.schema.jsonas part of a server submission. Schema changes are their own PR, discussed separately. - Don't claim official status (
publisher.official: true, "official" badge, etc.) unless you're a verified publisher. - Don't remove or rename issue-template files without coordinating with the McpMux app — the desktop app links to specific template filenames.
- Don't add servers that require the user to run arbitrary shell scripts during install. Stick to
npx,uvx,docker,python,node, or HTTPS endpoints.