Tacitus Mcp Server

io.github.ionasrobert由 GitHub 账号 ionasrobert 发布v0.1.3更新于 Oct 31, 2026

Long-term memory for AI agents: local-first PKM with provenance and hybrid search.

发布方自己的服务:DACIX — The Store for AI Agents

概览

AI 生成的概览

把 Markdown 笔记文件夹变成助手可用的本地知识库,支持带来源的记忆、笔记检索、链接遍历,以及可审计、可回滚的写入。

可以做什么
  • 存储、召回和删除带来源的类型化记忆,遇到冲突时如实提示而非默默取舍
  • 按混合、词法或语义相关性搜索笔记,并以大纲、frontmatter 或全文方式逐步读取
  • 列出笔记,并通过出链、反向链接和邻居遍历 wikilink 图谱
  • 先提出变更集并查看前后差异,再原子提交,或按版本回滚
  • 直接创建、更新笔记,添加链接和标签,每次返回版本号
  • 查看最近的提交与回滚审计日志,并列出可用工具与当前权限范围
适用场景
适合希望助手保留长期记忆,或在已有 Markdown 笔记库中工作,并且需要遵守 token 预算的检索与安全可回滚写入的场景。也适用于笔记必须保持为本地纯文本文件的个人知识管理流程。
运行要求
以 stdio 在本地运行,通过 npx 加笔记库路径启动,或使用 macOS、Linux、Windows 的预编译原生二进制。未声明需要账号或 API 密钥。可选的神经嵌入需要额外安装依赖包或本地 Ollama 服务;原生二进制支持只读权限范围设置。
安装前请注意
写入类工具会在笔记库中创建、更新、链接、打标签和删除笔记,但变更可先预览差异、再提交并回滚,且都有审计记录。记忆与版本快照存放在笔记库内的隐藏目录中。可选的同步功能会把加密数据块上传到中继服务,并有付费档位;笔记库密钥是唯一钥匙,丢失后无法恢复。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Tacitus Mcp Server,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

Tacitus

Long-term memory for your AI agents — local-first, with provenance.

[npm] [CI] [license]

Tacitus is an MCP server that turns any folder of Markdown notes into an agent-native knowledge base. It gives AI agents (Claude Code, Claude Desktop, and any MCP client) three things they actually need:

  1. Memory with provenance — typed, queryable long-term memory. Every fact carries its source and is returned within a token budget; contradictions are surfaced, not silently resolved.
  2. Retrieval that fits the context window — search returns ranked snippets (never whole notes) under a token budget; get_note discloses progressively (outline → frontmatter → full); the wikilink graph is a queryable API. Hybrid lexical + semantic search, with an optional neural embedder.
  3. Safe write-back — propose a changeset, preview the diff, commit atomically, and revert by version. Read-only scope forbids mutations; every write is audited.

Notes stay as plain .md files in your folder. No cloud, no lock-in.

[An agent remembering a fact with its source, recalling it under a token budget, proposing a diff, committing it, and reverting it]

Recorded from a real session — the memory id, changeset id, version id and audit line above are what the binary actually returned (how).

Quick start

bash
npx -y @dashiro/tacitus-mcp-server /path/to/your/vault

Claude Code

bash
claude mcp add tacitus -- npx -y @dashiro/tacitus-mcp-server /path/to/your/vault

Claude Desktop (claude_desktop_config.json)

json
{  "mcpServers": {    "tacitus": {      "command": "npx",      "args": ["-y", "@dashiro/tacitus-mcp-server", "/path/to/your/vault"]    }  }}

Native binary (no Node)

Prefer a single, zero-dependency binary? The Rust server ships prebuilt for macOS, Linux, and Windows on every release.

bash
# macOS / Linux — installs `tacitus-mcp` into your Cargo bin dircurl --proto '=https' --tlsv1.2 -LsSf \  https://github.com/ionasrobert/tacitus-mcp-server/releases/latest/download/tacitus-mcp-installer.sh | sh
powershell
# Windows (PowerShell)irm https://github.com/ionasrobert/tacitus-mcp-server/releases/latest/download/tacitus-mcp-installer.ps1 | iex

Or grab a .tar.xz / .zip for your platform from the latest release. Then point any MCP client at the binary instead of npx:

bash
claude mcp add tacitus -- tacitus-mcp /path/to/your/vault

The native binary is the flagship server (25 tools; the npm server has the core 16 — see the table below). Both share the same on-disk formats, so a vault works with either. Set TACITUS_SCOPE=read-only to run the native server without write permissions.

Tools

GroupTools
Memoryremember, recall, forget
Retrievalsearch, get_note, graph_query, list_notes, properties_query*
Write-backpropose_changes, commit_changes, revert, rename_note, delete_note, get_version*
Conveniencecreate_note, update_note, link, tag, audit_log
Templateslist_templates, create_from_template
Taskslist_tasks, toggle_task
Metacapabilities

* Native-Rust-server first (the npm server will catch up): properties_query — Bases-like structured queries over YAML frontmatter (filters eq|ne|contains|exists|not_exists|gt|lt|gte|lte, sort, select, token_budget). Templates — Markdown files in .tacitus/templates/ whose {{var}} placeholders form a schema; substitution happens before YAML parsing so numeric vars stay typed, {{date}}/{{time}}/{{datetime}} auto-fill, and creation is versioned + audited like any agent write. Tasks — every checklist line (- [ ]) as a typed entity (done, due from due:YYYY-MM-DD or 📅, #tags), queryable and toggleable; toggling takes the task text as a concurrency guard so a stale caller gets a CONFLICT instead of flipping the wrong task. rename_note retargets every wikilink that resolves to the note (alias/heading kept) in one atomic changeset — a single revert undoes the whole rename; delete_note is versioned too.

Every tool validates input with a schema and returns structured, actionable errors ({ code, reason, suggestion }) rather than stack traces.

For developers: plugins & integrations

In Tacitus, a plugin is an MCP client — the tool contract above is the public API, with permission scoping, versioning, and audit built in.

  • docs/PLUGINS.md — integration guide: connect an agent, write a plugin in Python/TypeScript, embed the Rust engine, plugin patterns
  • TypeScript SDK — @dashiro/tacitus-sdk: every tool as a typed method, {code, reason, suggestion} errors thrown as TacitusToolError:
    ts
    const tacitus = await TacitusClient.spawn({ vault: '/path/to/vault' });const hits = await tacitus.search({ query: 'client X', token_budget: 500 });
  • Sandboxed WASM plugins (experimental) — crate tacitus-plugins runs guest wasm under Wasmtime with manifest-declared permissions (tool allowlist
    • scope), fuel and memory limits, no WASI: tacitus.call is tools/call. The native binary embeds the runtime: tacitus-mcp plugin list|run for cron agents and scripts. See docs/PLUGINS.md §5
  • docs/MCP_API.md — full reference for all 25 tools (params, returns, error codes)
  • Neural search (opt-in): TACITUS_EMBEDDER=ollama uses a local Ollama daemon for embeddings (TACITUS_OLLAMA_EMBED_MODEL, default nomic-embed-text; needs an Ollama with embedding support). Vectors cached in .tacitus/vectors/; falls back to the deterministic hashing embedder when unavailable.
  • docs/SYNC.md — Sync (beta): E2E-encrypted CRDT sync between devices (tacitus-mcp sync init; sync status shows how much of the relay quota a vault uses)
  • docs/DATA_FORMAT.md — the on-disk format (.tacitus/ internals, stable ids, note conventions)
  • examples/ — three complete plugins (Python read-only analyzer, Node daily-note cron agent, sandboxed WASM guest), tested against the binary

What the sync relay can see

[Two devices exchanging a note through a relay: plain Markdown on the devices, only base64 ciphertext in the relay's log]

Left: two devices, plain Markdown. Right: everything the relay stores for that vault. Those blobs were read out of a real log.jsonl after the recording — no note title, no path, no plaintext. The vault code is the key and never leaves your devices; lose it and the relay's copy is undecryptable forever.

The relay is MIT like everything else — self-host it with no limits, or use the hosted one at sync.tacitus.md: free up to 100 MB per vault, Pro 1 GB for €5/month or €48/year (tacitus.md/#pro). No account — Pro is bought per vault id.

Semantic search (optional neural embeddings)

search defaults to hybrid mode (lexical + a deterministic, offline embedder that catches morphological variants). For synonym/paraphrase matching, opt into a neural embedder:

bash
npm i @huggingface/transformersTACITUS_EMBEDDER=transformers npx @dashiro/tacitus-mcp-server /path/to/vault

Vectors are cached under .tacitus/vectors/. Falls back to the deterministic embedder if the optional dependency or model isn't available.

How it stores things

your-vault/├── notes...             ← your Markdown files (untouched format)└── .tacitus/    ├── memory/*.md      ← agent memories (Markdown + YAML frontmatter)    ├── vectors/*.json   ← cached embeddings    ├── history/*.json   ← version snapshots (for revert)    └── audit.log        ← JSONL log of every agent write

Development

Polyglot monorepo. The reference server (shipped on npm) is TypeScript in packages/mcp-server. A native Rust server in crates/ provides a single-binary, zero-runtime-deps build (crates/tacitus-core engine + crates/tacitus-mcp rmcp server) — a superset of the TS server (25 vs 16 tools). Its stable_id matches the TS engine byte-for-byte, so memory ids are identical across both engines.

bash
# TypeScript servernpm cinpm test          # vitestnpm run typechecknpm run lintnpm run build     # tsup → packages/mcp-server/distnpm run eval      # retrieval quality report
# Rust server (native, single binary)cargo testcargo clippy --all-targets -- -D warningscargo fmt --checkcargo run -p tacitus-mcp -- /path/to/vault   # runs the MCP server on stdiocargo build --release                         # → target/release/tacitus-mcp

Cross-platform release binaries are built and published to GitHub Releases by cargo-dist (dist-workspace.toml + .github/workflows/release.yml) on every v* tag.

License

MIT — see LICENSE.

来源:README.md,提交 c7ee6c9

工具

16

remember

Store a typed memory (user|feedback|project|reference) with mandatory provenance. Returns a stable memory_id; idempotent for identical content+source.

输入参数keyttltagstype必填sourcecontent必填

recall

Recall memories relevant to a query, ranked, within an optional token_budget. Surfaces conflicting memories instead of silently choosing.

输入参数typequery必填token_budget

forget

Delete a memory by id. Returns whether a memory was removed.

输入参数memory_id必填

get_note

Fetch a note progressively: outline (headings) | frontmatter_only | full, with an optional max_tokens ceiling.

输入参数formatnote_id必填max_tokens

graph_query

Traverse the wikilink graph: links (outgoing) | backlinks | neighbors (both directions, to depth).

输入参数from必填depthrelation必填

list_notes

List all note ids with their titles and paths.

无需输入参数。

propose_changes

Dry-run a changeset (create/update/delete notes). Returns a change_id and a before/after diff. Nothing is written until commit_changes.

输入参数ops必填

commit_changes

Atomically apply a previously proposed change_id (all-or-nothing). Returns a version_id usable with revert.

输入参数change_id必填

revert

Undo a committed change by version_id, restoring the prior note state.

输入参数version_id必填

create_note

Create a note (auto-committed). Fails if it already exists. Returns a version_id.

输入参数content必填note_id必填frontmatter

update_note

Update a note body and/or frontmatter (auto-committed). Returns a version_id.

输入参数contentnote_id必填frontmatter

tag

Add a tag to a note (deduplicated). Returns a version_id.

输入参数tag必填note_id必填

audit_log

Read recent agent actions (commits/reverts), most recent first.

输入参数limit

capabilities

List available tools and the current permission scope.

无需输入参数。

版本历史

2
  1. v0.1.3最新Oct 31, 2026
  2. v0.1.2Sep 16, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

其他 Dacix 集成