npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

mcprush

v0.1.3

Published

Install MCP servers and agent skills from mcprush.com into the client you already use, through one gateway and one key.

Readme

mcprush

npm test

Install MCP servers and agent skills from mcprush.com into the client you already use.

npx mcprush@latest login              # hold a key from your dashboard
npx mcprush@latest add <server>       # install it and write it into a client
npx mcprush@latest skill add <skill>  # write a skill's folder to disk

What it does

One key, one address. add asks the marketplace what a name resolves to, records the install against your account, and writes a single entry into your client's config pointing at the gateway rather than at the publisher.

That indirection is the product: the key is yours to revoke, the plan is enforced before a call is made rather than invoiced after it, the call log is one both you and the publisher can read, and a publisher cannot widen the tool surface you approved without you seeing it.

A skill is the other half of the catalogue and works differently, because it is not an endpoint: it is a folder of instructions your client reads. So skill add asks the marketplace for that folder and writes it into the place the client looks in — .claude/skills/ for Claude Code, .cursor/skills/ for Cursor, and so on, taken from the marketplace rather than guessed here. The files are text. Nothing is executed, before or after the write.

A free skill needs no account: its folder is served to anyone, the same way the website serves it, so skill add works before you have signed up for anything. A paid one is served against the key of the account that bought it, and the marketplace says so in its own words if you have not.

What it does not do

  • It never takes a card. A paid listing is bought in the browser, where there is a price you have seen and an invoice you can keep.
  • It never runs anybody's code. A proxied server runs on the publisher's own machine; a local one is installed by its own instructions. skill add downloads text files and writes them — it does not execute them, and it refuses any file path that would land outside the skill's own folder.
  • It never rewrites a config file it could not parse. If your config has comments in it or is half-edited, it stops and prints what to paste.

Every write keeps a .bak of what was there before, next to the file. Both are written mode 0600, because a client config holds your key.

Commands

| | | |---|---| | mcprush login [key] | hold a key; it is checked before it is stored | | mcprush add <server> [<server> …] | install and write the client entry | | mcprush remove <server> | take it out of the client and off the account | | mcprush skill add <skill> | write a skill's folder to disk | | mcprush skill remove <skill> | delete that folder again | | mcprush stack add <stack> | install the free members of a curated set | | mcprush add-list <list> | install one of your saved lists | | mcprush budget [--max --alert] | the ceiling on what this account spends | | mcprush list | what this account has installed | | mcprush whoami | which account this key belongs to | | mcprush clients | which clients can be written to on this machine |

Flags:

| | | |---|---| | --client <id> | which client to write (default: claude-code) | | --global | for skills: the home folder rather than this project | | --host <url> | a different marketplace (default: mcprush.com) | | --json | machine-readable output, including on --dry-run | | --dry-run | say what would be written, write nothing |

Amounts keep the dollar sign inside single quotes, or your shell eats it: mcprush budget --max '$900/mo' --alert 80%.

Where things are kept

Your key is in ~/.mcprush/config.json, mode 0600. Nothing else is stored — no catalogue cache, no history.

Clients whose config path is documented and stable are written directly: Claude Code, Claude Desktop (--client claude, and claude-desktop is accepted too), Cursor, Windsurf, VS Code (per workspace) and Zed. For anything else, mcprush add <server> --json prints the address and the header to paste.

VS Code is the one exception to writing your key into a file. Its config lives at .vscode/mcp.json inside the folder you have open — that is, inside your repository, which VS Code invites you to commit and share. So the entry written there references ${input:mcprush-key} and VS Code asks you for the key once, keeping it in the editor's own secret store. Every other client's config lives in your home directory and carries the key directly.

Skills are written to the folder the client actually reads: .claude/skills/ (Claude Code, Claude Desktop), .cursor/skills/ (Cursor), .github/skills/ (VS Code), .agents/skills/ (Codex, Zed), .gemini/skills/, .grok/skills/, .windsurf/skills/. With --global the same path is used under your home directory instead of the current project. A client that declares no folder gets ./skills/<name> and is told so plainly.

The marketplace can name that folder — a client changes where it looks, and the table it is looked up in should not need a release of this tool. What it cannot do is name somewhere else: an answer is only used when it is a relative path ending in skills, resolving under the project or your home directory, with no step upwards and no symlink leading out. Anything else falls back to the table above without a word, because a marketplace naming .ssh is not a folder preference.

Environment

  • MCPRUSH_KEY — use this key instead of the stored one
  • MCPRUSH_HOST — point at a different marketplace
  • NO_COLOR — plain output

MIT. Issues and the catalogue: https://mcprush.com

Working on it

No dependencies and no build step: the files in bin/ and lib/ are what ships.

npm test                 # 22 tests, node:test, no runner to install
npm pack --dry-run       # what would go to the registry
node bin/mcprush.js --help

Point it at a marketplace of your own while you work:

MCPRUSH_HOST=http://127.0.0.1:3000 MCPRUSH_KEY=… node bin/mcprush.js clients

A release is a tag: npm version patch, then git push --follow-tags. The workflow in .github/workflows/publish.yml checks that the tag and package.json name the same version, runs the tests and publishes with provenance — see the comments in that file for the one-time npm setup.

Security reports: SECURITY.md. Everything else: mcprush.com/contact.