pmcp

Getting started

Reading installed skills needs no login or model. The local MCP server reads files already on your disk; CLI commands manage additional skill packages.

1. Register the server

{
  "mcpServers": {
    "pmcp": { "command": "npx", "args": ["-y", "@modootoday/pmcp"] }
  }
}

Hosts differ about which file that goes in, and two of them will write it for you from the install page. Nothing has to be installed first: npx -y fetches the package when needed.

2. See what it can see

npx -y @modootoday/pmcp list

One row per skill: the name, as <package>/<slug>, and the one-line description that skill_find ranks. Do this before you ask an agent anything, because it answers the question the server cannot ask you back.

An empty catalog exits 1 rather than 0, and prints the roots it walked. That is usually one of two things: the working directory is not the project, or none of the installed packages ships a SKILL.md at all.

3. Ask in a sentence

skill_find takes an intent: what you are trying to do, written as an English sentence. It returns names only, ranked, and never a body.

> skill_find "a job ran twice because two workers took the same lock"
+ redis-toolkit/locks
  ranking lexical > skill_call redis-toolkit/locks
  the body, once

A bare keyword ranks badly on purpose. Descriptions are written as symptoms, so a sentence shares vocabulary with one of them and a single noun matches many of them weakly and none of them strongly. When you want to browse rather than search, skill_catalog is the tool that filters.

4. Read exactly one

skill_call takes the name skill_find returned and gives back that skill's body. It is the only call that costs a document, which is the whole point of the split: looking is cheap, and reading is deliberate.

An unknown name comes back as an error naming the tool to call instead, rather than as an empty result that reads like an empty catalog.

Where it looks

By default, the node_modules directories above the working directory. Two options change that, and both belong in the args array beside pmcp:

npx -y @modootoday/pmcp list --root ./node_modules
npx -y @modootoday/pmcp list --scope @acme/

--scope matches the start of the package name, so @acme also matches @acmetools/thing. Include the trailing slash when you mean the scope. Both options are repeatable.

When two roots hold the same package, the first one wins: a nested node_modules holds an older copy of something the outer root already resolved.

If you want semantic ranking

npm install --save-dev @huggingface/transformers
npx -y @modootoday/pmcp index

index encodes descriptions and stores local vectors. The default MCP server currently ranks lexically; installing the optional encoder alone does not activate semantic ranking.

The model runtime and weights add installation and loading costs. Skip this optional step when local lexical search meets your needs.

If step 2 came back short

It usually does. Most packages ship no skill, so the server has nothing to serve for them, and that is the gap we write into: skills for the packages an agent gets wrong most often, each verified by running its examples against the version it names.

npx -y @modootoday/pmcp available   # which of them match this project
npx -y @modootoday/pmcp preview <skill>  # its contents and one full example

Both are free and need no account. Installing one needs a subscription; the list of what exists is open to read.

What to do next