MCP server giving LLM agents a seven-verb API over papers, documents, code, personal state, patents, and cached web/Wolfram/YouTube tool calls — backed by PostgreSQL + pgvector
Project description
precis-mcp
A Model Context Protocol server that
gives language-model agents a small, uniform API for reading, writing,
and searching across papers, documents, personal state, code, and
cached tool calls. Small-model-friendly (7B-class agents are the design
target); stores content in PostgreSQL with pgvector.
Status. v8.0.0 — ground-up redesign of v1. Twenty-two kinds shipping across ref / tool / discovery categories, seven verbs, plugin surface stable. The discovery layer (persistent per-segment keywords + per-sentence embeddings) and the verifier-workflow
citationkind landed 2026-05-31; seedocs/design/storage-v2.md § Discovery layer. v5.2.6 on PyPI is the last v1-line release; seeCHANGELOG.mdfor the migration path.
What it does
One tool surface — seven verbs discriminated by a single kind=
argument — over three categories of content:
- Ref kinds (content addressed by slug or integer id):
paper,skill,oracle,quest,conv,markdown,plaintext,python,todo,memory,gripe,fc(flashcard),citation(verified claim → source quote). - Tool kinds (stateless or cache-backed; pass
q=orid=, get text back):calc,math(Wolfram),youtube,web(fetch + search + bookmark),websearch/think/research(Perplexity Sonar tiers),patent(EPO OPS). - Discovery kind:
random— pick a random indexed block to stumble into content when you don't know what to ask for.
The active set depends on which optional extras and env vars are
configured (see Install). Run
get(kind='skill', id='precis-help') against a live server for the
live enumeration of kinds currently wired (it's a synthesised skill
that introspects the registry); pair with
get(kind='skill', id='precis-overview') for the design-rationale
tour.
Seven verbs
| Verb | Use when |
|---|---|
get |
You know the name (slug, id, file path) — or you're calling a tool. |
search |
You're looking for content by topic or phrase. Hybrid lexical (tsvector) + semantic (pgvector) with RRF fusion. |
put |
Create a new ref. Optionally tag and link on creation. |
edit |
Rewrite a region of a file-kind ref by content anchors (find-replace, append, insert, replace). |
delete |
Soft-delete a numeric ref, or delete a region from a file kind by selector. |
tag |
Add and/or remove tags. Three namespaces: closed (STATUS:done), flag (pinned), open (topic-foo). |
link |
Add or remove a cross-link to another ref. Vocabulary: related-to, blocks, contradicts, cites, derived-from, supports, … |
Address by id= for names, q= for content. No URI selector strings
for ids; region selectors inside files use the compact slug~SELECTOR
shape (e.g. notes--meeting~L42-58).
Install
pip install 'precis-mcp[all]'
Extras (each enables its kinds; omit any you don't want):
| Extra | Enables | Heavy? |
|---|---|---|
paper |
paper kind (sentence-transformers bge-m3 + acatome-extract) |
yes (~2 GB model on first load) |
calc |
calc kind (sympy) |
no |
external |
math (Wolfram), youtube, web, Perplexity trio |
no |
patent |
patent kind (EPO Open Patent Services) |
no |
docx |
(queued — not yet wired) | — |
tex |
(queued — not yet wired) | — |
plot |
(queued — not yet wired) | — |
all |
All of the above. | yes |
A bare pip install precis-mcp gives you the state kinds (todo,
memory, gripe, fc, quest, conv, oracle, skill,
random) and the markdown / plaintext / python file kinds.
Optional deps surface as InitError at boot: the kind silently drops
off the tool surface with a WARNING, the server stays up.
Database
precis-mcp requires PostgreSQL with the pgvector extension. The
CLI precis migrate applies the forward-only numbered SQL migrations
in src/precis/migrations/. See
docs/store_sketch.py for the Python store
interface and 0001_initial.sql for the schema.
createdb precis
psql precis -c 'CREATE EXTENSION pgvector;'
export PRECIS_DATABASE_URL=postgresql://localhost/precis
export PRECIS_EMBEDDER=bge-m3 # or "mock" for tests
precis migrate
Run
precis serve speaks MCP over stdio. Wire it into your agent's MCP
config:
{
"mcpServers": {
"precis": {
"command": "precis",
"args": ["serve"],
"env": {
"PRECIS_DATABASE_URL": "postgresql://localhost/precis",
"PRECIS_EMBEDDER": "bge-m3",
"PRECIS_ROOT": "/absolute/path/to/notes",
"PRECIS_PYTHON_ROOTS": "myrepo:/absolute/path/to/myrepo"
}
}
}
}
Environment variables
| Var | Purpose |
|---|---|
PRECIS_DATABASE_URL |
Postgres DSN (required for all ref kinds). |
PRECIS_EMBEDDER |
"mock" (dev/tests) or "bge-m3" (prod). |
PRECIS_ROOT |
Single root dir for markdown / plaintext / tex kinds. The trio is hidden when unset; every read/write is normalised against this path (Path.resolve() + relative_to). |
PRECIS_PYTHON_ROOTS |
alias:/path,alias2:/path2 — exposed Python repos. |
PRECIS_PYTHON_ALLOW_EXEC=1 |
Gate for python runtrace (spawns subprocess). |
EPO_OPS_CLIENT_KEY + _SECRET + PRECIS_PATENT_RAW_ROOT |
Enables patent kind. |
WOLFRAM_APP_ID |
Enables math kind. |
PERPLEXITY_API_KEY |
Enables websearch / think / research. |
LOG_LEVEL |
DEBUG / INFO / WARNING / ERROR. |
Design highlights
- Seven verbs, one
kind=. The whole surface isget/search/put/edit/delete/tag/link. No per-kind bespoke tools. Seedocs/seven-verb-surface-migration.md. - Content-anchored edits.
edit(find=..., before=..., after=...)resolves by literal content match; unique/first/all/nth policy; fuzzy nearest-line hint on not-found. Pure resolver inprecis.utils.edit_resolve; ships formarkdown,plaintext, andpython. Seedocs/edit-protocol-spec.md. - Hybrid search. Lexical
tsvector+ semanticpgvector(bge-m3) with Reciprocal Rank Fusion. Block-level; paper chunks, markdown paragraphs, Perplexity answers, web pages all searchable. - Persistent discovery layer. Papers get pre-computed per-segment
matryoshka-ordered keywords (distinctiveness-penalty scored against
sibling segments) and per-sentence bge-m3 embeddings. The TOC view
serves from
ref_segmentsdirectly — no per-request DP/KeyBERT recompute. Search hits carry indentedexcerpt @ ~N: "..."sub-lines, picked by pgvector cosine rerank against the query embedding, so result rows are actionable for triage without a second fetch. Thecitationkind closes the loop: an agent's writing-thread workflow can persist verifiedclaim → source quoterecords (seeprecis-citation-help). - Progressive disclosure. Seven verbs and a
kind=argument is the whole visible surface. Behind it sits a fan-out of ~25 per-kind help skills, dozens of read views, an anchored edit protocol, args-dict view payloads, and a tag/link vocabulary — none of which the agent has to know up front. Every response can emit anext=breadcrumb, every error names the skill that explains it, andget(kind='skill', id='precis-<kind>-help')unfolds the manual for whichever capability the agent just bumped into. Think exploding pocket knife: the tool grows blades as you reach for them, instead of advertising 20 unfamiliar buttons intools/list. (UX literature calls this pattern progressive disclosure.) - HintBus. Any layer can emit deduplicated, novelty-decayed tips that are rendered after the verb's main output. Keeps slim models from drowning in self-inflicted reminders.
- Slim exception surface.
BadInput/NotFound/Gone/Unsupported/Upstream/RateLimited/Internal, each carrying a single copy-pasteablenext="breaking hint". psycopg 3sync, raw SQL. No SQLAlchemy, no Alembic, no async below FastMCP — stdio's serial workload doesn't buy anything from async.- In-tree handlers, entry-point plugins. Core kinds are
hand-ordered in
precis.dispatch.boot(). Third-party kinds can register themselves via theprecis.handlersentry-point group without forking — seedocs/plugin-authoring.md.
Extending
Write a plugin handler in 3 steps — see the one-pager at
docs/plugin-authoring.md and the
canonical tiny example in
src/precis/handlers/calc.py.
# your plugin's pyproject.toml
[project]
dependencies = ["precis-mcp>=8.0.0"]
[project.entry-points."precis.handlers"]
wikipedia = "precis_wikipedia:WikipediaHandler"
Plugin failures are logged and skipped — one bad plugin cannot brick the server.
CLI
precis serve # Start the MCP stdio server.
precis migrate # Run pending SQL migrations.
precis jobs ingest [root] # Pre-warm .md / .txt / .tex under PRECIS_ROOT
# (mtime-gated; compose into launchers:
# `precis jobs ingest && precis serve`).
precis jobs ingest-bundle[s] ... # Ingest .acatome paper bundles.
precis jobs ingest-oracles ... # Seed the oracle kind from YAML wisdom files.
precis jobs dedupe-papers # Collapse duplicate paper refs.
precis jobs import-perplexity ... # Bulk-import Perplexity web-UI answers.
precis jobs watch-patents / run-patent-watches / sweep-patent-fulltext
# Saved CQL patent watches (patent kind).
Run any subcommand with --help for detailed options.
Utility scripts
The scripts/ dir holds workspace-side utilities that run against
a precis store but live outside the published CLI surface. See
scripts/README.md for full coverage; the
high-traffic ones:
paper-monitor-ingest-dir— drop-and-go PDF ingest watcher.perplexity-monitor-ingest-dir— bulk-import Perplexity markdown exports.find-citing-papers— sweep S2 for new papers citing the precis corpus, with bge-m3 cosine rerank and several noise- reduction filters; reports land inpaper-ingest/.enrich-paper-identifiers/retrofit-acatome-external-ids— backfill DOI / arXiv ids on legacy refs.
Roadmap
docx,tex,book,rmkfile handlers (Phase 6b/c).webbookmark mode + Wayback enrichment (gripe:3681 phase 2 + 4 — seeOPEN-ITEMS.md).voicekind — STT/TTS bound to transcript refs (seedocs/voice-kind-spec.md).- SDK extraction (
precis-core) once the plugin API has settled.
Documentation
docs/plugin-authoring.md— write a third-party handler.docs/seven-verb-surface-migration.md— verb surface design rationale.docs/edit-protocol-spec.md— anchored edits across file kinds.docs/file-kinds-unified-addressing.md— theslug~SELECTORaddress grammar.docs/python-kind-spec.md— python navigator design.docs/patent-kind-spec.md— EPO OPS integration.docs/paper_ingest.md—.acatomebundle ingest path.docs/design/storage-v2.md— full schema + discovery-layer design.src/precis/data/skills/precis-citation-help.md—citationkind + verifier-workflow agent surface.src/precis/data/skills/precis-toc-help.md— TOC machinery (segments, sentences, matryoshka keywords).CHANGELOG.md— what shipped in each phase.
Contributing
The repo lives at
retospect/precis-mcp.
Issues and PRs welcome. Development workflow:
uv venv && source .venv/bin/activate
uv pip install -e '.[all]' --group dev
pytest -q
ruff check . && ruff format --check .
mypy src tests
License
GPL-3.0-or-later. See the full text at gnu.org/licenses/gpl-3.0.html.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file precis_mcp-8.2.0.tar.gz.
File metadata
- Download URL: precis_mcp-8.2.0.tar.gz
- Upload date:
- Size: 2.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d6d2217a2944a4a3ec8bb042a31578588c7a98a129ca62c6f90c2d094a23132e
|
|
| MD5 |
f9404a6e83c4f6ba8d91cfe4f0462334
|
|
| BLAKE2b-256 |
42ca0aa78192e751ac12f8d86505165a4dab81d400bcbb3f74c0e48c8e9839f2
|
Provenance
The following attestation bundles were made for precis_mcp-8.2.0.tar.gz:
Publisher:
publish.yml on retospect/precis-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
precis_mcp-8.2.0.tar.gz -
Subject digest:
d6d2217a2944a4a3ec8bb042a31578588c7a98a129ca62c6f90c2d094a23132e - Sigstore transparency entry: 1734971232
- Sigstore integration time:
-
Permalink:
retospect/precis-mcp@c6b1c9db213ba3431edfb256914ae2b00330434e -
Branch / Tag:
refs/tags/v8.2.0 - Owner: https://github.com/retospect
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c6b1c9db213ba3431edfb256914ae2b00330434e -
Trigger Event:
push
-
Statement type:
File details
Details for the file precis_mcp-8.2.0-py3-none-any.whl.
File metadata
- Download URL: precis_mcp-8.2.0-py3-none-any.whl
- Upload date:
- Size: 973.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9dc14402abfd9bbc69b2029260836629418dbe03c7e89b88a879be188fd79aa7
|
|
| MD5 |
c5eff14e8b7b43d90868c9e7d0b00572
|
|
| BLAKE2b-256 |
f0f920f99d8f2ee9d14380fc19fabd3737b753e084dbfe8aab65e801de0aa47e
|
Provenance
The following attestation bundles were made for precis_mcp-8.2.0-py3-none-any.whl:
Publisher:
publish.yml on retospect/precis-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
precis_mcp-8.2.0-py3-none-any.whl -
Subject digest:
9dc14402abfd9bbc69b2029260836629418dbe03c7e89b88a879be188fd79aa7 - Sigstore transparency entry: 1734971430
- Sigstore integration time:
-
Permalink:
retospect/precis-mcp@c6b1c9db213ba3431edfb256914ae2b00330434e -
Branch / Tag:
refs/tags/v8.2.0 - Owner: https://github.com/retospect
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c6b1c9db213ba3431edfb256914ae2b00330434e -
Trigger Event:
push
-
Statement type: