01
Homebrew
$ brew install desmondsanctity/tap/pinax Recommended on macOS · auto-updates with brew upgrade.
Local MCP server for docs
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 15
curated docs sites
one-word names → indexed
4
MCP tools
list · search · sections · get
0
cloud
stays on your machine
How it works
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.
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.
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
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
Each client gets a copy-pasteable JSON snippet and a config-path reminder.
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json
Setup guide →
Claude Code
claude mcp add … -- pinax serve …
Setup guide →
Cursor
~/.cursor/mcp.json
Setup guide →
Windsurf
~/.codeium/windsurf/mcp_config.json
Setup guide →
Cline (VS Code)
cline_mcp_settings.json
Setup guide →
GitHub Copilot
.vscode/mcp.json
Setup guide →
FAQ
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.
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.
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.
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.
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.
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.
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.
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
$ pinax add stripe && pinax serve