Docs

From connect to a verified result — the same correct bytes every run, with a manifest you can re-run.

Connect an agent — MCP

Pinakes is an MCP server first. Point your client at the hosted server — nothing to install, and no key for public catalog reads. Add your pk_live_ key only to raise limits. The agent then calls a typed tool (catalog, search, get, resolve, export, verify), not a portal.

Fastest — one installer

Install the pinakes CLI (below), then let it write each client’s config into the correct file for you. It detects Claude Code, Cursor, VS Code, Windsurf, Zed, and Codex:

$ pinakes mcp install

Target one with pinakes mcp install --client cursor. Run pinakes login (or export PINAKES_API_KEY) first to bind your key; skip it to stay on public reads.

Or configure one client

Prefer to wire it yourself? Pick your client — each reads MCP servers from its own file:

Writes the hosted server straight into Claude Code’s config — no CLI, no key for public reads.

$ claude mcp add --transport http pinakes https://mcp.pinakes.sh/mcp

Keys, headless & troubleshooting

Pre-launch: mcp.pinakes.sh and the published pinakes packages go live at launch — the commands above are the real, final shapes.

CLI, MCP & REST — which do I use?

One deterministic engine, three surfaces — all produce identical, verifiable manifests; the difference is purely how you reach it.

MCP — for agents, mid-task

Point an agent or IDE (Claude Code, Cursor, VS Code, Codex, Windsurf, Zed) at mcp.pinakes.sh/mcp and it calls the typed tools live while reasoning — “fetch this protein and its AlphaFold model while I work.” Nothing to install; public reads need no key. Reach for it when the consumer is an agent retrieving data inside a task loop.

CLI — for scripts & files on disk

The pinakes binary for your shell, CI/CD, and notebooks — it writes files plus a re-runnable manifest to disk, and doubles as a local stdio MCP server (pinakes mcp). Reach for it when you’re automating, or want artifacts you can verify() and cite later.

REST — for arbitrary code

Plain HTTP access to the same engine from any language or runtime, with no native client. Reach for it when you’re embedding Pinakes into a service or web backend.

Mix them freely — pin a snapshot with the CLI in CI, then let an agent query that same snapshot over MCP — and every result carries a manifest verify() can re-derive byte-for-byte.

Install the CLI

One line installs the pinakes CLI and puts it on your path — for shell use and the local MCP server.

$ curl -fsSL https://pinakes.sh/install | sh

Also pip install pinakes · brew install pinakes · conda. Pre-launch: packages and the installer publish at launch — see GitHub for current availability.

Authenticate

Sign in and create a key on the dashboard at /app/, then export it as an environment variable; the published CLI and the hosted MCP server use it to raise your limits. The public catalog needs no key.

$ export PINAKES_API_KEY=pk_live_REPLACE_ME

Your first query

Export every Zaire ebolavirus sequence, pinned to a snapshot — complete-or-fails-loudly, and it writes a manifest you can re-run.

$ pinakes export --source-id ncbi-virus --filters 'organism:eq:Zaire ebolavirus' --snapshot-version 2026-06 106 records · complete · served_from snapshot@v7 · manifest written

Verify it

Re-run the manifest to reproduce the result from scratch.

$ pinakes verify --manifest @manifest.json reproduced 106/106 · hash match · reproducible: true

reproducible: true proves the result is complete and byte-identical: every record was reproduced (106/106, never a silent truncation) and the content hash matches the original. The @ prefix tells the CLI to read the manifest from a file. Anyone with the manifest gets the same answer.

Core concepts

snapshot
A versioned, content-addressed, point-in-time materialization of a source’s data. Pinning a query to a specific snapshot version (rather than latest) is what makes a result reproducible: the same query against the same pinned snapshot plus pinned connector code yields a byte-identical normalized record set. A result served from latest is explicitly reproducible:false because live sources reorder and mutate.
manifest
The re-runnable provenance record emitted with every result. It pins everything needed to reconstruct and check the result — the canonical query, contributing sources and their snapshot versions, the serializer codec, the identifier-graph version, completeness status, and the logical_record_hash. It is the citable, machine-readable receipt that verify() consumes; the Go Manifest type and its JSON Schema are frozen as a pair.
resolve (the metered unit)
One deterministic record retrieval — a single get, search, or export operation. Resolves are the billing unit across tiers (e.g. 50k/mo on Free, 4M/mo on Pro). Asset downloads (structures, AlphaFold models, figures) are not resolves; they count separately against a per-tier GB allowance. (Distinct from the resolve verb, which maps an identifier across namespaces via the identifier graph.)
verify()
The reproducibility keystone. Given a manifest, verify() re-derives the result against the pinned content-addressed snapshot plus the vendored pinned connector code and confirms the logical_record_hash matches. It runs the vendored serializer version a manifest was created with, so old manifests keep verifying even after the serializer evolves.
completeness (complete-or-fail-loudly)
Pinakes never silently truncates. A result is marked complete:true only after reconciling the delivered record count against the source’s authoritative count; if it cannot reconcile, it is downgraded to best_effort with an explicit reason, or it fails — never a quiet partial answer. This is the guarantee that prevents the famous failure where a silent truncation once dated an Ebola outbreak’s origin anywhere from 1922 to 2014.
the catalog
The public, key-free index of every source Pinakes integrates — the agent-readable ‘card catalog’ (the name Pínakes is the catalogue of the Library of Alexandria). Each entry declares its maturity level, license posture, and whether it is queryable and determinism-claimable. Reading the catalog needs no API key.
the identifier graph
A versioned, snapshot-aware, content-addressed graph that resolves cross-source biological identifiers deterministically — e.g. an Ensembl gene id to its UniProt accession. Resolution is ‘as-of’ a date and direct-edge only (no transitive hops in v1). When sources disagree it returns the full candidate set ordered by an authority policy and surfaces the conflict as a typed Ambiguity; its version is pinned into the manifest.
L1 Proxied / reachable
The source is queryable via CLI/MCP/REST and paginated as completely as its API allows, but semantics are unverified and results are proxied live. L1 carries no determinism claim — it is always reproducible:false. This is the honest floor: a reachable source must never wear the word ‘deterministic’.
L2 Normalized / verified
Adds cross-source identifier mapping, a unified schema with the source-native record preserved, benchmark-verified web-UI filter semantics, and snapshot-bound caching. Results are reproducible against the pinned snapshot version — a pinned L2 query is reproducible, an L2 query against latest is not. The accuracy SLO applies.
L3 Materialized / full determinism
Adds versioned, content-addressed offline snapshots, byte-exact reproducibility of the normalized logical record set, and cross-version diff. This is the full determinism guarantee: an identical query against a pinned snapshot plus pinned connector code yields a byte-identical normalized record set and manifest. Maturity is monotonic (L0 < L1 < L2 < L3); only L2 and L3 are determinism-claimable, and only when snapshot-served.

Command reference

catalog

List/inspect integrated sources from the public, key-free index — including each source's maturity level and license posture.

search

Run a filtered, complete-or-fail query against a source; pin --snapshot-version for a reproducible result. Counts as one resolve.

get

Deterministically retrieve specific records by identifier. Pin to a snapshot for byte-identical results.

resolve

Map identifiers across namespaces via the versioned identifier graph; conflicts surface as explicit ambiguities, not silent picks.

export

Write a query result to disk as files plus a re-runnable manifest (e.g. for pipelines, notebooks, or a citable dataset).

verify

Re-derive a result from its manifest against the pinned snapshot and confirm the logical-record hash matches.

login

Published CLI (at launch): authenticate with a pk_live_ key to raise limits. Public catalog reads need no key.

mcp install

Wire Pinakes into an agent/IDE — connect the hosted MCP server, or run the CLI as a local stdio MCP server.

Examples — pin --snapshot-version for a reproducible result; repeat --ids per id; filters are field:operator:value; @ reads a file:

$ pinakes catalog --source-id pdb $ pinakes search --source-id ncbi-virus --filters 'organism:eq:Zaire ebolavirus' --snapshot-version 2026-06 --limit 500 $ pinakes get --source-id uniprot --ids P0DTC2 --ids P0DTD1 --snapshot-version 2026-06 $ pinakes resolve --source-id ensembl --ids ENSG00000130234 --resolve-to uniprot --snapshot-version 2026-06 $ pinakes export --source-id chembl --filters 'target:eq:CHEMBL5118' --output-format parquet --snapshot-version 2026-06 $ pinakes verify --manifest @./results/manifest.json

login and mcp install ship with the published CLI at launch; the engine verbs above run today against the local binary.

Use cases

An AI research agent (Claude Code, Cursor) mid-task

Connects to the hosted MCP server and retrieves a protein record, its AlphaFold model, and ClinVar variants live while reasoning — never getting IP-banned, never silently truncated, with a manifest it can hand back for verification.

A computational biologist building a reproducible pipeline

Uses the CLI in a notebook or script to pull a dataset pinned to a specific snapshot, writing files plus a manifest to disk so the exact same records can be re-derived and verified months later.

An author publishing a paper with a citable dataset

Exports the figures' underlying data against a pinned L3 snapshot and cites the manifest as a re-runnable provenance record, so any reviewer can run verify() and confirm the bytes match what the paper reports.

A platform team running data checks in CI/CD

Adds a CLI verify() step to the pipeline that re-derives a manifest and fails the build loudly if the result hash drifts or a source returns an incomplete (non-reconciled) record set — catching silent truncation before it reaches production.

A bioinformatician stitching databases together

Uses the resolve verb over the versioned identifier graph to map identifiers across namespaces (Ensembl gene → UniProt accession → PDB structure) deterministically, with conflicting mappings surfaced as explicit ambiguities rather than a silently chosen winner.

An engineer integrating from a non-Go service

Calls the REST API from any language to embed deterministic, snapshot-pinned retrieval into a web backend, getting the same verifiable manifests the CLI and MCP produce without installing a binary.

An academic lab and a literature-driven agent

Queries the arXiv literature domain (full-corpus, rehosted) for citable paper records through the same typed tools — and qualifying labs claim a free research upgrade by email to raise resolve limits.

The authoritative CLI and API reference lives in the GitHub repo.