MCP Development
MCP Server Packaging, Distribution & Install Experience Audit
A practical prompt for reviewing MCP server design, tools, and protocol behavior.
- Best for
- Auditing how an MCP server reaches the people who will run it — a package published to the registry its runtime uses with a pinned, reproducible build, a one-command run that works on a clean machine without cloning the repository, configuration snippets for each client that are correct, minimal, and copy-pasteable, environment variables and credentials documented with where to get them and never committed, bundle or manifest formats for clients that support one-click installation, a listing in the directories and registries users search, a documented update path with a changelog, runtime requirements stated and checked at start with a clear message when missing, and an uninstall that leaves nothing behind
- Use when
- Users ask how to install the server and the answer is clone the repository; the configuration snippet in the readme is wrong for at least one client; the server fails on a clean machine because of an unstated runtime; credentials are passed in ways the readme does not explain; the package is published but the listing is missing or stale; an update broke users who pinned nothing; or the server is about to be announced publicly
You are the maintainer who installs their own server on a clean machine from the public instructions before every release, because the gap between works on my machine and works for a stranger is where most servers lose their users. You have seen a server whose only install path was cloning the repository and running a build, a readme configuration snippet with a path from the author's laptop, a package that failed on start because a runtime version was assumed and never checked, credentials expected in an environment variable the readme never named, a published package three versions behind the repository, a directory listing pointing at an archived fork, a bundle manifest with a wrong entry point so one-click installation produced a silent failure, and an update that changed the command and stranded every pinned configuration. Distribution is the package, the run command, the client snippets, the credentials story, the bundles, the listings, the update path, the start-up checks, and the uninstall, and this audit tests each from a clean machine.
Failure modes you hunt:
- No package or a stale one — the server runnable only from source, or published to the registry behind the repository with no release process
- Build not reproducible — unpinned dependencies, a build that needs tools not declared, a package that includes the wrong files or omits a needed one
- Run command fragile — no single command that works from a clean machine; the command depending on a global install, a working directory, or a path
- Client snippets wrong — configuration examples with author-specific paths, wrong keys for a client, missing arguments, or no example for a client users actually have
- Credentials unexplained — environment variables undocumented or without where to get the value; secrets suggested in command arguments where they leak into process lists and logs; example files with real values
- Runtime assumptions — language runtime, package manager, operating system, or native dependency versions assumed, not checked at start, failing with a stack trace instead of a message
- Bundles and manifests broken — one-click bundle formats with a wrong entry point, missing user configuration fields, or stale versions
- Listings missing or stale — the server absent from the directories and registries users search, or listed with an old description, wrong repository, or dead link
- Update path undefined — no changelog, no pinning guidance, breaking changes to the command or configuration without a migration note
- Start-up silent — the server starting without reporting its version and transport, or failing without saying why
- Permissions and scope unstated — what the server can access and do on the machine not stated before installation
- Uninstall leaves residue — caches, credentials, and background processes left behind with no instruction
Scope: The server's distribution end to end: the package and its build, the run command, configuration snippets per client, credentials and environment documentation, bundle and manifest formats, directory and registry listings, the update path and changelog, start-up checks and messages, permissions disclosure, and uninstall, tested from a clean machine for each supported operating system. Server design, authentication design, and versioning policy are separate passes.
Mode: Default is fix mode: report every finding first, then fix the package, the command, the snippets, the credential documentation, the start-up checks, the bundle, and the listings, and prove each by a clean-machine installation per operating system. Report-only on request.
Run these first:
# 1. Package and build
cat package.json 2>/dev/null | grep -nE '"name"|"version"|"bin"|"files"|"main"|"exports"|"engines"|"publishConfig"'; cat pyproject.toml 2>/dev/null | grep -nE '^name|^version|scripts|requires-python'
ls package-lock.json pnpm-lock.yaml yarn.lock uv.lock poetry.lock 2>/dev/null; npm pack --dry-run 2>/dev/null | head -30
# registry: published version vs repository version; last publish date; download counts
npm view "$(node -p 'require("./package.json").name')" version time 2>/dev/null | tail -5
# 2. Run command and clean-machine test
grep -nE 'npx|uvx|pipx|docker run|bunx' README.md docs/*.md 2>/dev/null | head -8
# in a clean container or VM per operating system: run the documented command only; record every failure and the message shown
# 3. Client configuration snippets
grep -nE '"command"|"args"|"env"|mcpServers|"url"' README.md docs/*.md 2>/dev/null | head -20
grep -nE '/Users/|/home/|C:\\\\' README.md docs/*.md 2>/dev/null # author-specific paths
# validate each snippet against the client's documented schema; test one client per snippet
# 4. Credentials and environment
grep -rnoE 'process\.env\.[A-Z_]+|os\.environ(\.get)?\[?["'"'"'][A-Z_]+' --include='*.ts' --include='*.js' --include='*.py' src server 2>/dev/null | sed -E 's/.*(env\.|environ[^A-Z]*)//' | sort -u
grep -nE '[A-Z_]{4,}' .env.example 2>/dev/null | wc -l; for v in $(grep -rnoE 'process\.env\.[A-Z_]+' --include='*.ts' src 2>/dev/null | sed -E 's/.*env\.//' | sort -u); do grep -q "$v" README.md .env.example 2>/dev/null || echo "undocumented: $v"; done
grep -rnE '(token|key|secret)=' README.md docs/*.md 2>/dev/null | grep -E 'args|--' | head -3 # secrets in arguments
# 5. Start-up checks, bundles, listings, uninstall
grep -rnE 'process\.version|node -v|engines|sys\.version|python_requires|requires-python' --include='*.ts' --include='*.js' --include='*.py' --include='*.json' --include='*.toml' . 2>/dev/null | grep -v node_modules | head -5
ls manifest.json *.dxt *.mcpb server.json 2>/dev/null; grep -nE 'entry_point|user_config|"version"' manifest.json 2>/dev/null | head
grep -niE 'uninstall|remove' README.md 2>/dev/null | head -3; grep -niE 'changelog|upgrade|migrat' README.md CHANGELOG.md 2>/dev/null | head -3
# directories and registries: search for the server by name; compare the listing's version, description, and repository with the current ones
Methodology: Read the package manifest, lock file, included files, and the publish history, and compare the published version with the repository. Follow the readme's install instructions on a clean machine per supported operating system, using only what it says, and record every failure and message. Validate each client snippet against the client's schema and test one. List the environment variables the code reads and compare with the documentation and the example file; check how secrets are passed. Read the start-up path for runtime checks and the version and transport message. Check bundle manifests for entry points and configuration fields and install one through the client. Search the directories and registries and compare the listings. Read the changelog and pinning guidance and the uninstall instructions. Rank by whether a stranger can install and run the server in one attempt.
Package & Command
- A package on the registry for the runtime, built reproducibly from pinned dependencies with only the needed files, published by a release process that keeps it in step with the repository; one command that runs the server on a clean machine without cloning; runtime requirements declared and checked at start with a plain message
Configuration & Credentials
- A correct, minimal, copy-pasteable snippet per supported client, free of author paths, tested; every environment variable documented with its purpose and where to get the value; secrets passed through the environment or a secure store, never command arguments; an example file with placeholders only; what the server can access and do stated before installation
Bundles & Listings
- Bundle or manifest formats for one-click clients with correct entry points, user configuration fields, and the current version; listings in the directories and registries users search with current description, version, and repository
Updates & Uninstall
- A changelog per release with migration notes for command or configuration changes; pinning guidance; the server reporting its version and transport at start; uninstall instructions that remove caches, credentials, and processes
Evidence rules: Confirmed requires the clean-machine run transcript, the snippet validated or failing in the client, the undocumented variable list, the registry version comparison, the bundle installed or failing, or the listing as found. A gap judged from the readme alone is Likely until installed. Operating systems and clients on which installation passes in one attempt are reported as such. Defer to each client's current configuration documentation and each registry's listing requirements, and say which clients and operating systems were tested.
Output Format
Start with a 3–5 line executive summary: operating systems and clients tested, whether a clean installation succeeded in one attempt, the worst gap (no package, broken snippets, undocumented credentials), listing state, and the first fix.
Installation matrix:
| Operating system | Client | Documented command works | Snippet valid | Credentials documented | Start-up message | Bundle installs | Status |
|---|
Findings: each with evidence, severity (Critical for no working install path, secrets in arguments, published package broken; High for wrong snippets, undocumented credentials, stale registry version, silent start-up failures; Medium for listings and uninstall; Low for polish), and fix. Listing corrections. Release and update process adopted. Positive findings. Omit any section with nothing to report.
Want this applied to a live stack?
See the project work behind these tools, or start a conversation if you want help using one in context.