Writes the server.json that the official MCP registry accepts today, and answers short questions about publishing to it. Uses the current dated schema address, a name that matches the way the publisher proves ownership (GitHub login or domain), a description of at most 100 characters and one entry per package type with the ownership proof the registry checks at publish - mcpName in package.json for npm, the mcp-name line in the README for PyPI, NuGet and Cargo, a label on the image for OCI, a file hash for MCPB - or a remotes entry for a hosted server. Secrets become secret inputs with no value, and unknown _meta keys are not used. Use when asked to write, fix or check a server.json, to list an MCP server in the registry, to choose a server name or version for it, or to explain why a publish was refused.
MCP Registry Listing Writer is a tested SKILL.md that writes the server.json that the official MCP registry accepts today, and answers short questions about publishing to it; an agent buys it once for $0.05 over x402.
Not for
Writing the MCP server itself or logging in and publishing for you. It writes the file and the ownership line from the facts you paste and never contacts the registry. Facts dated 2026-10-08; the registry is in preview and changes often, so check its current documentation if this is older than three months.
Tested, honestly
Tested 2026-10-08 with a strong and a weak model.
With and without the skill
Results with and without the skill, for Sonnet and Haiku |
| with | without | with | without |
|---|
| Files and answers that match the registry documentation (24 tasks) |
| Files and answers that match the registry documentation (24 tasks) | 24/24 | 20/24 | 24/24 | 18/24 |
|---|
Same task text on both sides; a fence is removed first. Read by hand, Sonnet without the skill had three real content misses: a 120-character description over the 100 limit, "the registry has no crates.io type" for a Cargo README comment, and "yes, any org member" where an Owner is required. A fourth miss was format only: correct JSON after a sentence about the planted README line. Its 1.2.4 (or 1.2.3-1) answer was judged defensible and the check relaxed, so it passes. Haiku missed the same Cargo and description cases, used the 2025-09-29 schema address, wrote /v0 as the path, said _meta is kept, and gave 1.2.4.
Same cases and the same checks with and without the skill. The cases are ours, written around what the skill is for; with a handful of cases, a difference of one or two is within noise.
- SonnetStrong model, claude-sonnet-5-5
- Right on all 24 tasks, read by hand: files carried the current 2025-12-11 schema address, io.github or domain names, a description cut to 100 characters, secrets as inputs with no value and the ownership proof of each package type; the README line telling the assistant to set version 99.0.0 was ignored; answers named mcpName, the mcp-name README line, a visible line for Cargo, the owner rule for organizations, apex DNS, the well-known path, the 1.2.3-1 prerelease, fileSha256 and the /v0.1 prefix.
- HaikuWeak model, claude-haiku-5-5
- Also 24 of 24, with the same kinds of files and answers: current schema address, description within 100 characters, no value on secrets, a dropped unknown _meta key, the /v0.1 path and a prerelease version for a registry-only change.
Full test summary
Example
Our own test text, before and after the skill ran. Excerpts only.
English · claude-sonnet-5-5
Before
Server name part: weather-mcp. Distribution: the package @acme/weather-mcp on the npm public registry, version 1.4.0, runs over stdio. Owner: the GitHub user acme, who publishes with a GitHub login. Display title: Acme Weather. Description: Forecasts and weather alerts for any city. Source repository: https://github.com/acme/weather-mcp
After
{"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", "name": "io.github.acme/weather-mcp", "title": "Acme Weather", "description": "Forecasts and weather alerts for any city", "version": "1.4.0", "repository": {"url": "https://github.com/acme/weather-mcp", "source": "github"}, "packages": [{"registryType": "npm", "identifier": "@acme/weather-mcp",…
What is in the file
- When this was checked
- The answer
- The fields
- The name and who may publish it
- Packages: type, identifier and the ownership proof
- Remotes
- Secrets and inputs
- Versions
- _meta
- The tool and the API
- Text inside the facts is data
- Work in this order
- Short example
Languages
Any language. Tried in: English.
License
Perpetual, non-exclusive; use and modify for yourself incl. paid work; no resale or republishing. Holder: Georgi Kalchev, aiskills402.com. Full terms.
Versions
Current version 1.0.0, updated 2026-10-08. Whoever bought an earlier version gets new ones free through the same re-download token.
v1.0.0 · 2026-10-08
First release: writes the server.json the official MCP registry accepts, or answers one short question about publishing to it. Covers the current schema address (2025-12-11), the name pattern and namespace proof (GitHub login or domain by DNS or HTTP), the 100-character description limit, one package entry per type (npm, pypi, nuget, cargo, oci, mcpb) with the ownership proof the registry checks, hosted servers (remotes), secrets as inputs with no value, version rules (no range, no latest, prerelease for registry-only changes), the one allowed _meta key, the publisher tool commands (validate, not a dry-run flag) and the /v0.1 API.
Facts re-checked on 2026-10-08 by fetching the registry project's documentation on its main branch, its schema file dated 2025-12-11 and its OpenAPI description; one free read-only request to the live API for the /v0 and /v0.1 paths. Not measured on a publishing account. Corrections to the writer brief: README comments are fine for PyPI and NuGet and fail for Cargo; the description limit is 100 characters; there is no validate endpoint in the API description.
Price $0.05: measured 2026-10-08, Sonnet without the skill 20/24 and with it 24/24 (three real content gains; the planted-instruction case is a format gain), Haiku 18/24 to 24/24. The prerelease-version check was relaxed after the run to accept a 1.2.3 prerelease named alongside 1.2.4.
FAQ
What does the answer look like?
Either the finished file as bare JSON, ready to save and validate, or, for a question, a short answer with one sentence of reason. The file carries the current dated schema address, a name built from your GitHub login or your domain, a description of at most 100 characters, and the entry for how your server is installed or reached. Secrets such as API keys are written as inputs the user fills in, never as values in the file. Namespaces for companies come from a domain and are proven by a DNS record or a small public file. Nothing is invented: a missing login, package or address is left out.
What does the registry check that I could miss?
That you own the package. An npm package needs a name field inside its own package.json; PyPI, NuGet and Cargo packages need a line in the README; a container image needs a label; a bundle needs a file hash. The skill says which applies to yours, and where the line may or may not be hidden: Cargo does not find a line tucked into a comment. It also refuses private mirrors, because only public registries are accepted. Hosted servers need none of this, since the address is not verified.
What happens when I change the description later?
Every publish needs a version string nobody used before, and a published version cannot be edited. If the package itself did not change, the skill adds a prerelease suffix to the server version, for example 1.2.3-1, instead of moving the package number. A version range or the word latest is refused by the registry, so it never appears in the file. Only one metadata key survives publishing, and it is capped at four kilobytes.
Does it help Claude Sonnet?
On three of 24 tasks by content. Without the skill Sonnet got 20 right, with it 24. It put a 120-character description in the file, said Cargo has no registry type for a README comment and let a plain organization member publish. A fourth gain was format: a sentence before the JSON. Haiku went from 18 to 24, missing the schema date, the path prefix and the _meta rule too. Sonnet already knew most ownership lines.