mcpship
by emanueltns
README.md
# mcpship
Check a remote MCP server against the Claude connector directory rules, then publish it: npm, the official MCP Registry, a Claude Code plugin repo and the Claude connector directory. One step at a time, for people and for agents.
## Quick start
npx mcpship init https://example.com/mcp # writes publish.json; fill in the fields
MCPSHIP_TOKEN=<access token or API key> npx mcpship check
npx mcpship next # the next step, with the exact command
## Commands
| Command | What it does |
| --- | --- |
| `init <url>` | Writes a publish.json template in the current folder |
| `check [url]` | Tests sign-in discovery, tools and listing; exit code 1 if a rule fails |
| `packet` | Writes docs/directory/submission.md: the text for each directory form step |
| `next` | The first unfinished step, with the command or click |
| `status` | Live state of npm, the MCP Registry, the plugin repo and the directory |
| `done directory` | Records that you submitted the directory form |
| `mcp` | Runs as a local MCP server over stdio |
Add `--json` for machine-readable output and `--dir <path>` to point at another folder.
npm counts as published only when you are a maintainer of the package. mcpship asks `npm whoami`; if you publish with a token instead of `npm login`, set `channels.npm.maintainer` to your npm user name in publish.json.
## What check tests
| Rule | Fails when |
| --- | --- |
| auth.https | the server URL is not https |
| auth.www-authenticate | an unauthenticated call does not return 401 with resource_metadata |
| auth.resource-metadata | protected resource metadata is missing or has no authorization server |
| auth.as-metadata | authorization server metadata is missing |
| auth.pkce | S256 is not supported |
| auth.client-registration | neither Dynamic Client Registration nor Client ID Metadata Documents |
| tools.reachable | tools/list fails with the given token (skipped without one) |
| tools.title | a tool has no title |
| tools.annotations | a tool has neither readOnlyHint nor destructiveHint |
| tools.instructions | a description tells the model what to do ("use it first", "you must", "call X") |
| tools.hidden-text | a description holds invisible characters or encoded text |
| listing.icon-url | the icon URL is not a public https PNG |
| listing.pages | docs, privacy or terms page does not load |
| listing.lengths | name, one-liner or description is over the form limit, or a field is empty |
| listing.unpublished-mention | a page tells users to run `npx <package>` before it is on npm |
Warnings: `tools.mentions` (a description names another tool) and `listing.em-dash`.
## Use it from Claude Code
/plugin marketplace add emanueltns/mcpship
/plugin install mcpship@mcpship
Then ask Claude to publish your MCP server. The plugin adds the mcpship tools and a skill that walks through each step.
## Privacy
mcpship runs on your machine. It calls your server, the URLs in your publish.json, the MCP Registry API, and whatever `npm` and `gh` call. It sends no telemetry. MCPSHIP_TOKEN is read from the environment and never printed.
## License
MIT
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues