No description
  • Python 79.2%
  • JavaScript 11.7%
  • CSS 4.9%
  • HTML 3.6%
  • Dockerfile 0.6%
Find a file
Jay Honnold b8ea991792 docs(plans): add web "Add raw" ingest design+execution plan (#17)
Replicates the plan-mode design/execution doc for the web-UI raw ingest form (shipped in #16) into `docs/plans/2026-06-27-ai-wiki-mcp-web-add-raw.md`, matching the repo convention that implemented plans are mirrored into the repo.

Version 0.5.0 → 0.5.1 (docs-only, but the version-check workflow requires a bump).

Co-authored-by: Claude Agent <claude@home.arpa>
Reviewed-on: https://gitea.home.arpa/jhonnold/ai-wiki-mcp/pulls/17
Co-authored-by: Jay Honnold <jayhonnold@gmail.com>
Co-committed-by: Jay Honnold <jayhonnold@gmail.com>
2026-06-27 00:24:54 -07:00
.gitea/workflows feat: publish docker image via gitea actions with semver gate (#7) 2026-06-21 14:46:40 -07:00
docs/plans docs(plans): add web "Add raw" ingest design+execution plan (#17) 2026-06-27 00:24:54 -07:00
src/ai_wiki_mcp feat(web): add raw-source ingest form to the web UI (#16) 2026-06-27 00:17:44 -07:00
tests feat(web): add raw-source ingest form to the web UI (#16) 2026-06-27 00:17:44 -07:00
.dockerignore feat: initial ai-wiki-mcp server (Phase 1) (#4) 2026-06-21 08:25:47 -07:00
.gitignore feat: initial ai-wiki-mcp server (Phase 1) (#4) 2026-06-21 08:25:47 -07:00
.schema.yaml.example feat: initial ai-wiki-mcp server (Phase 1) (#4) 2026-06-21 08:25:47 -07:00
CLAUDE.md docs: add CLAUDE.md with agent-facing operational context (#8) 2026-06-21 15:40:37 -07:00
Dockerfile feat: initial ai-wiki-mcp server (Phase 1) (#4) 2026-06-21 08:25:47 -07:00
pyproject.toml docs(plans): add web "Add raw" ingest design+execution plan (#17) 2026-06-27 00:24:54 -07:00
README.md feat: read-only web UI (file tree, link graph, search) (#9) 2026-06-22 17:28:03 -07:00
ruff.toml feat: initial ai-wiki-mcp server (Phase 1) (#4) 2026-06-21 08:25:47 -07:00
uv.lock docs(plans): add web "Add raw" ingest design+execution plan (#17) 2026-06-27 00:24:54 -07:00

ai-wiki-mcp

A small, wiki-aware MCP server over the ai-wiki/ markdown knowledge base. It replaces the Obsidian + cyanheads/obsidian-mcp-server stack: agents (Claude Code, Hermes, Open WebUI) operate the wiki over a single streamable-HTTP MCP endpoint, while the files stay plain markdown on disk.

Why a purpose-built server instead of a generic filesystem MCP:

  • Structured search — recovers the frontmatter querying Obsidian's dataview gave us (lost on leaving Obsidian).
  • Schema-validated writes — frontmatter crosses the wire as JSON and is emitted as real YAML; the old "['a','b']" array-mangling bug is impossible by construction.
  • Server-side lint — one wiki_lint call runs every structural check instead of dozens of agent round-trips.

Tools

Tool Purpose
wiki_list directory snapshot of notes (optional frontmatter)
wiki_read read a note; full | map | section projections
wiki_search full-text (ripgrep) and/or structured frontmatter filter
wiki_write create/overwrite a note with validated, structured frontmatter
wiki_edit surgical body edit (replace_section/append/replace_text); frontmatter untouched
wiki_set_frontmatter structured frontmatter mutation; taxonomy-checked tags
wiki_lint all structural checks server-side; pure read
wiki_archive move a page to _archive/; report inbound links to fix

Structured search filter DSL

{"type": "concept"}                  # scalar equality
{"confidence": ["high", "medium"]}   # scalar membership
{"tags.contains": "domain/ai"}       # list contains
{"tags.contains_any": [...]}         # list intersects
{"tags.contains_all": [...]}         # list superset
{"missing": ["sources"]}             # keys absent
{"present": ["contested"]}           # keys present

Schema

Validation is driven by <wiki>/.schema.yaml (see .schema.yaml.example), the machine-readable source of truth for frontmatter rules and the tag taxonomy. The human-readable ai-wiki/SCHEMA.md is kept in sync (a wiki_lint drift check guards this). The file is stat-reloaded on change, so adding a domain takes effect without a restart. With no .schema.yaml, validation degrades to warn-not-block.

Configuration

Env Default Meaning
WIKI_ROOT /wiki wiki tree root (bind-mounted)
AI_WIKI_MCP_HOST 0.0.0.0 bind host
AI_WIKI_MCP_PORT 3010 port; endpoint path is /mcp

Metrics

Prometheus metrics are served unauthenticated at GET /metrics on the same AI_WIKI_MCP_PORT as /mcp (no extra port to expose). They cover per-tool call counts/latency/errors plus scrape-time wiki state — file count and size by layer, wikilink totals, broken/ambiguous/orphan links, and lint findings by severity. All metric names are prefixed ai_wiki_mcp_. The wiki gauges are recomputed on each scrape, so keep the scrape interval at 15s or longer.

Web UI

A read-only viewer is served at GET /app on the same AI_WIKI_MCP_PORT as /mcp (no extra port to expose; / redirects to /app/). It gives a navigable file tree, a force-directed link graph (nodes sized by wikilink degree, broken/orphan markers), search (client-side fuzzy jump + server full-text and the frontmatter filter DSL), click-through [[wikilink]] navigation, and markdown rendering with a render⇄source toggle. It is a no-build vanilla-JS SPA reading a small JSON API (/app/api/{tree,page,graph,index,search,stats}); third-party libraries are vendored under static/vendor/ so it works offline. Read-only: no write/edit endpoints are exposed.

Develop

uv sync
uv run pytest          # offline against tests/fixtures/wiki
uv run ruff check src tests
uv run ai-wiki-mcp     # serve (set WIKI_ROOT first)

Docker: docker build -t ai-wiki-mcp . then run with -v <wiki>:/wiki.

Releasing

Versioning is semver, single-sourced from [project].version in pyproject.toml.

  • Every PR must bump the version (major/minor/patch). The version-check workflow fails a PR unless its pyproject.toml version is a valid X.Y.Z strictly greater than main's, so each merge produces a fresh tag. Bump with an edit + uv lock.
  • Merging to main runs the release job (after lint + tests pass): it builds the image, publishes it to the Gitea container registry, and pushes a vX.Y.Z git tag.

Published image (Gitea built-in registry, direct endpoint):

docker pull 192.168.10.32:3000/jhonnold/ai-wiki-mcp:<version>   # or :latest
docker run --rm -p 3010:3010 -v <wiki>:/wiki \
  192.168.10.32:3000/jhonnold/ai-wiki-mcp:<version>