Technical writer for your repo. Authors and curates docs as code changes — card, README, CHANGELOG, skills, anything that tells the project what it is.
uvx --from git+https://github.com/eidos-agi/scribe.git@v0.1.3 scribe When an agent changes the code, the documentation should follow. It never does — README lags a month, CHANGELOG has three open "write me" TODOs, the card says features that got renamed. Scribe is the teammate that closes that gap: it authors, curates, and keeps the whole repo's self-description coherent as the code evolves.
It reads what you changed, decides which docs need to move, writes the diffs, and pushes them as part of the same commit. The README keeps up, the CHANGELOG has real entries, and the repo's self-description never drifts from the code.
An agent ships a schema migration. Scribe detects that the change touches the data-layer section of the README, the CHANGELOG has no entry for this release, and the card's feature list is outdated. It authors fresh copy for each, groups them into one commit, and hands the agent a clean PR.
1. Scribe sees the change, authors the updates
2. One PR, every doc in lockstep with the code
One PR, three files, all coherent. Reviewers see the code change and every piece of documentation that had to move with it — in the same place, the same tooling, the same review flow they already use.
scribe_update(repo, path, change_summary, new_content?, author_tool?) authors any file under the repo. Card, README, CHANGELOG, skills, docs/* — all in scope.scribe_review(repo) flags tracked docs whose last git-touch predates the most recent non-doc commit. Three statuses: stale, fresh, unknown.scribe_suggest(repo, change) delegates to claude -p to rank which tracked docs need updates for a given code change, with reasoning. No SDK import — subscription tooling only..scribe/scribe.yaml lists which paths scribe treats as tracked docs. scribe_init writes safe defaults (card.md, README.md, CHANGELOG.md) on first run.{timestamp, path, change_summary, file_written, author_tool} in .scribe/updates.jsonl. Log-only updates still fire when content isn't written.scribe_suggest returns status ∈ {ok, claude-unavailable, timeout, parse-error}. Never raises.git clone https://github.com/eidos-agi/scribe
cd scribe
uv sync
claude mcp add scribe --scope user -- /path/to/scribe/.venv/bin/scribe # initialize .scribe/ — writes a default scribe.yaml tracked list
mcp__scribe__scribe_init repo: "/path/to/my-repo"
# review: which tracked docs look stale after recent code changes?
mcp__scribe__scribe_review repo: "my-repo"
# suggest: given a change description, rank the docs that should move
mcp__scribe__scribe_suggest \
repo: "my-repo" \
change: "added user_preferences table"
# update: author a fresh version of any tracked doc (path is repo-relative)
mcp__scribe__scribe_update \
repo: "my-repo" \
path: "README.md" \
change_summary: "data layer: 2 → 3 tables" \
new_content: "# my-repo\n\n..." \
author_tool: "scribe-review"
# read: card + last N updates + callers_seen
mcp__scribe__scribe_read repo: "my-repo" Five MCP tools: scribe_init, scribe_read, scribe_update, scribe_review, scribe_suggest. scribe_suggest delegates to claude -p via subprocess — no Anthropic SDK import, ever. If claude isn't on PATH the call returns status: "claude-unavailable" with an empty suggestions list. Never raises.