Pinax

Local MCP server for docs

Any docs site.
A local MCP server.
Under a minute.

Pinax crawls a public documentation site, indexes its structure, and exposes it to any MCP client as four focused tools. Pages are fetched live, so what your agent reads is what the docs site serves today.

$ brew install desmondsanctity/tap/pinax
Read the docs →
Works with

15

curated docs sites

one-word names → indexed

4

MCP tools

list · search · sections · get

0

cloud

stays on your machine

How it works

Three commands. Zero servers to manage.

  1. 01

    Add

    $ pinax add stripe

    Pick a name from the catalog or paste any docs URL. Pinax discovers structure via llms.txt or sitemap.xml, escalates to a JS renderer for SPAs, and writes a local manifest.

  2. 02

    Serve

    $ pinax serve

    A local MCP server speaks stdio to your client and HTTP to the log UI. Pages are fetched live, so what your agent reads is what the docs site serves today.

  3. 03

    Use

    $ mcp tools/call search_pages

    Your client gets four focused tools: list manifests, list sections, full-text search a page, and fetch the page. No vectors, no retraining.

Install

Pick one. Run it.

01

Homebrew

$ brew install desmondsanctity/tap/pinax

Recommended on macOS · auto-updates with brew upgrade.

02

Go install

$ go install github.com/desmondsanctity/pinax/cmd/pinax@latest

Requires Go 1.22+. Binary lands in $GOBIN.

03

Prebuilt binary

$ curl -L https://github.com/desmondsanctity/pinax/releases/latest -o pinax

Linux/macOS/Windows builds on the releases page.

MCP clients

Wire it into the agent you already use.

Each client gets a copy-pasteable JSON snippet and a config-path reminder.

FAQ

Honest answers, in advance.

What is Pinax? +

A small Go CLI that turns any public documentation site into a local Model Context Protocol server. Run it once, point your MCP client at it, and the docs become live tools your agent can call, with no copy-pasting pages into chat.

Why MCP and not just RAG or a vector database? +

Docs already have structure (headings, sitemaps, llms.txt). Pinax keeps that structure intact and serves pages live, so answers come from the version of the docs that exists today, not a stale embedding from last month. No embeddings, no re-indexing, no drift.

Does Pinax send anything off my machine? +

Only the requests you'd make anyway, fetching pages from the docs site itself. No telemetry, no analytics, no first-party cloud. The MCP transport is stdio between Pinax and your client; the log UI is a localhost-only HTTP server. The one opt-in exception is the JS renderer: if you set JINA_API_KEY to unlock SPA support, the page URLs you index are proxied through Jina Reader (jina.ai) so it can execute JS and hand back HTML. Pass --renderer=off to stay fully first-party.

Which docs sites work? Which don't? +

Two tiers. Anything with a sitemap.xml or llms.txt that renders real HTML on the server works out of the box, and most popular dev docs land here. JS-heavy sites (Mintlify, ReadMe.io, framework SPAs) work via the built-in renderer once you set JINA_API_KEY. The catalog page lists the sites we know index cleanly today; any URL with /, . or :// is a valid add target.

What about JS-heavy docs sites like Mintlify, ReadMe.io, or SPAs? +

v0.5 added a pluggable renderer. When pinax add sees a page that is too sparse to be real static HTML, it automatically re-fetches via Jina Reader and records the choice in the manifest so pinax serve keeps using it. Bring your own free key from https://jina.ai/reader and export JINA_API_KEY (or set it in your MCP client env block). Pinax intentionally does not ship a shared key, so your rate limit stays yours and no ToS is bent. Prefer to skip SPAs? Pass --renderer=off.

How do I add a docs site that isn't in the catalog? +

Run pinax add <url> with any HTTPS URL. Pinax discovers structure on the fly. If you want it shipped in the curated catalog, open an issue or PR against internal/catalog/catalog.json and add the three required fields: displayName, url, tags.

Can I run it against private or auth-gated docs? +

Not today. Pinax fetches as an anonymous HTTP client, so anything behind a login, an API key, or a session cookie is invisible to it. There is no built-in support for auth headers, bearer tokens, or cookie jars in the current release. If you need this, open an issue on the repo with your use case so it can be scoped.

How is it different from gitingest, repomix, or just downloading llms.txt? +

Those tools concatenate or summarise content into one large blob. Pinax exposes structured tools like list_sections, search_pages, and get_page, so the agent fetches only the page it needs, when it needs it. No prompt-bloat, no out-of-date copies.

One last thing

Index your first docs site now.

$ pinax add stripe && pinax serve
Or read the quick start →
Pinax