Local mirror of docs.aws.amazon.com/**.md with a sqlite FTS5 search index,
consumed as a Claude Code skill.
AWS publishes a hosted MCP server (aws-mcp.us-east-1.api.aws/mcp) that
bundles both docs lookup and live AWS API calls (call_aws). This mirror is
for contexts where you want docs access without any API call capability — a
classifier that can only read files has zero blast radius.
bb sync # fetch all ~130k docs (~45min, uses ETag conditional GETs)
bb index # build FTS5 search index (~5min)After that, point a Claude Code skill at this repo (see skill/SKILL.md).
bb search has been removed. Search is now done via sqlite3 directly
(see skill/SKILL.md for query recipes). sqlite3 with FTS5 is a runtime
dependency of the skill.
bb sync && bb index # re-run anytime; unchanged docs are skipped (304)Or via cron:
0 7 * * * cd /path/to/aws-docs-mirror && bb sync && bb indexA no-change sync on an already-mirrored repo takes ~45s.
bb services # list all service prefixes
bb sync --services AmazonS3,AWSEC2 # sync specific services onlyAWS uses inconsistent prefixes (AmazonS3, AWSEC2, amazondynamodb,
access-analyzer...). bb sync --services validates against the upstream
list and suggests corrections.
mirror/ mirrored .md files, upstream paths 1:1
index/
search.sqlite page/chunk FTS5 tables + manifest + cache; everything is in here
src/ Clojure source (com.latacora.aws-docs-mirror.*)
deps.edn Clojure deps and task aliases
bb.edn bb task entry points
skill/
SKILL.md skill manifest for the consuming agent
resolver.md action-name → path conventions
~130k files, ~1GB on disk. index/search.sqlite holds a section-level FTS
index and is ~1.9GB for the current full mirror. Full text is indexed once, at
the section level; the page-level docs table keeps only url/title/service.
(Indexing page bodies and sections roughly doubled the file for marginal
recall.) Both are gitignored; rebuild from scratch with bb sync && bb index.
Search via sqlite3 directly against index/search.sqlite. Strategy order:
exact API URL → title/path LIKE → section FTS → page-level rollup of section
hits. See skill/SKILL.md for the full query recipes and FTS5 syntax notes.
Full-text search lives in chunks (section-level), which joins to chunkids
on chunks.rowid = chunkids.id for heading/anchor metadata. The docs table
is a plain lookup table (url, title, service) — not full-text searchable.