Tacit MCP server
Commit Nov 4, 2026Syncs Slack, GitHub, and Notion into a local knowledge graph to provide searchable team memory for AI clients like Claude and Cursor.
Also known as PhaseYon/tacit
- Stars
- 0
- Tools
- —
- Downloads, 30 days
- —
- Latest version
- —
- Last commit
- Nov 4, 2026
- License
- Apache-2.0
What is Tacit MCP?
Tacit syncs Slack, GitHub, and Notion into a local knowledge graph to provide searchable team memory for AI clients like Claude and Cursor.
Summary generated from the project's README
About Tacit MCP server
Providing searchable team memory to AI assistants is what Tacit enables by syncing Slack, GitHub, and Notion into a local knowledge graph. Developers use this tool to connect their existing documentation and communication history directly to clients like Claude, Cursor, and Claude Code. Because the system is local-first, the sync process, indexing, and the MCP server itself run on your own machine, ensuring your data stays private.
The setup requires a Neo4j database, such as Aura Free or a self-hosted instance, to act as the shared storage for your team. While searching uses local embeddings and full-text search without requiring API keys, you can optionally enable LLM extraction for people and decisions using your own Anthropic or OpenAI keys. The server provides specific tools like search and get_doc to return evidence and citations, ensuring that the AI client receives the exact PRs, threads, or pages needed to answer complex questions about team history.
What you can do with it
- 1Investigating historical team decisionsAsk your AI client why a specific technical choice was made and receive the supporting evidence from Slack or GitHub.
- 2Auditing data access historyCheck the logs to see which team members have accessed specific pieces of information within the knowledge graph.
- 3Performing hybrid information retrievalSearch through combined vector and full-text data to find specific documentation or discussions without using an LLM for the search itself.
- 4Managing synchronization scopeLimit the data being indexed to specific repositories, channels, or pages to maintain strict permission boundaries.
Written from the project's README. Every use case is checked against a quote from it.
README
View on GitHubTacit
Your team's memory, wired into every AI tool.
Tacit syncs your team's GitHub, Slack and Notion into a time-aware knowledge graph that your team owns, and serves it to Claude, Cursor and Claude Code through a local MCP server. Ask "why did we do X, who decided, and where's the evidence?" and get an answer with links to the exact PRs, threads and pages.
- Local-first. Each teammate runs
taciton their own machine: sync, indexing and the MCP server all run locally. The only shared piece is your team's Neo4j (Aura Free or your own server). We host nothing and never see your data. - Free by default. Search uses local embeddings and full-text, with no API keys. LLM extraction of people, decisions and time-aware facts is optional, uses your own key, and has a hard budget per run.
- Deterministic reads.
searchnever calls an LLM. Your AI client writes the answer; Tacit returns the evidence. - Every access logged. Every read and write goes through one function that logs it
first, and refuses to run if it can't.
tacit loganswers "who looked at what".
Each teammate's machine Your team's Neo4j
┌──────────────────────────────────────────────┐ ┌─────────────────────────────┐
│ Claude / Cursor ──stdio──▶ tacit mcp │ │ docs + chunks (search) │
│ (search, get_doc) │ │ graph facts (optional) │
│ tacit sync ──▶ GitHub / Slack / Notion │──Bolt──▶│ scope, cursors, write lease │
│ (your own tokens, only what's in scope) │ │ access log │
└──────────────────────────────────────────────┘ └─────────────────────────────┘
Quickstart
uv tool install git+https://github.com/PhaseYon/tacit
tacit init # your team's Neo4j URI + password, your email
tacit auth github && tacit scope add github:acme/api
tacit sync
tacit mcp install --client claude # or cursor / claude-code
Full walkthrough, including Slack, Notion and graph facts: docs/quickstart.md.
Trust model
Tacit is built for small, high-trust teams:
- One password per team graph. Whoever has it can read everything in the graph. Handing it out carefully is the team's job.
- Scope is the permission boundary. Only the repos, channels and pages you add are
synced. Private Slack channels need an explicit
--private; DMs are never synced. - Access log. Every query is logged with who, what and when, and kept 90 days by default. Known gap: someone with the password can query Neo4j directly and bypass the log. Teams that need more than this need a hosted gateway (design doc §11), which is not built.
Commands
| Command | What it does |
|---|---|
tacit init |
Connect to the team graph and prepare it (safe to re-run) |
tacit auth github|slack|notion|anthropic|openai |
Store a token (keychain, or a 0600 file) |
tacit scope add|ls|rm |
What the graph syncs |
tacit sync [--extract] [--max-usd N] [--watch MIN] |
Pull new and changed items |
tacit search "…" [--as-of DATE] [--json] |
Hybrid search with citations, no LLM |
tacit get <url> |
Full stored text of a cited item |
tacit log [--who] [--since] [--grep] |
Who read or wrote what |
tacit forget <url> |
Remove one item and its graph facts |
tacit mcp / tacit mcp install |
Local MCP server / client config |
tacit doctor |
Check config, secrets, database and tokens |
How it works
- Sync polls each source with the user's own token, skips anything whose content hash hasn't changed, and writes under a single write lease so two laptops never ingest the same thing twice. Cursors live in the graph, so whoever syncs next picks up where the last person stopped.
- Search fuses vector search (local bge-small embeddings) and full-text search over chunks with reciprocal rank fusion. With extraction on, it adds Graphiti facts that know when they became true and when they were superseded.
- Details and trade-offs: docs/design/local-first.md.
Benchmark
52 "why" questions over the fictional Larkspur Labs company (demo/), local bge-small embeddings, k = 10. Retrieval costs $0; building the graph (124 items → 746 facts, 213 entities) cost $1.37 with Claude Haiku 5.5. Repeated runs give identical retrieval numbers.
| arm | recall@10 | evidence found | MRR |
|---|---|---|---|
| vector-only RAG | 0.942 | 0.837 | 0.711 |
| hybrid (RRF) | 0.962 | 0.849 | 0.704 |
| graph facts only | 0.846 | 0.700 | 0.515 |
| hybrid + graph facts | 0.962 | 0.889 | 0.605 |
Caveats, in full in benchmark/README.md:
- Hybrid is no better than keyword-only here. The same author wrote the questions and the corpus, so they share wording; a held-out, paraphrased question set is still needed.
- Not comparable one-to-one with v0 (hybrid recall@10 0.865 on Postgres): v0 indexed every comment as its own document, while the new stack bundles a PR or issue with its discussion, so a top-10 hit is easier.
- The graph finds more evidence but ranks it lower. Adding facts raises the share of supporting evidence found (84% → 89% vs vector-only; 90% → 100% on "who decided" questions) but pushes the first right document down (MRR 0.71 → 0.61). The graph alone is worse than plain RAG. Fusion is untuned on purpose.
Development
uv sync
docker compose --profile test up -d --wait neo4j-test # throwaway Neo4j on :7688
uv run pytest -q
uv run ruff check . && uv run ruff format --check .
docker compose up -d neo4j starts a persistent local Neo4j on :7687 for trying Tacit
solo. The previous hosted architecture (Next.js, FastAPI, Celery, Postgres RLS, OAuth
MCP) is preserved at tag v0-hosted.
License
Apache 2.0
Tacit MCP questions
Is my data stored on Tacit's servers?
No, Tacit is local-first. Syncing, indexing, and the MCP server run on your own machine, and the only shared component is your team's Neo4j database.
Does searching with Tacit require an LLM?
No, the search function uses local embeddings and full-text search without calling an LLM, ensuring deterministic reads.
Can I see who has accessed the data?
Yes, every read and write is logged, and you can use the tacit log command to audit access.