tangerine-mcp
v0.1.0
Published
Model Context Protocol server that exposes Tangerine team memory to Claude Code, Cursor, and any MCP-compatible AI client.
Maintainers
Readme
tangerine-mcp
Align every AI tool on your team with your team's actual workflow.
License — transition in progress (2026-04)
Tangerine is moving from Apache 2.0 to AGPL v3 + Dual Commercial License.
See LICENSE (draft AGPL v3 + dual) and COMMERCIAL-LICENSE.md (draft
commercial terms). Until ratification announced, codebase is governed
by Apache 2.0 — see PRIOR-LICENSE-APACHE-2.0.txt.
Your team uses Cursor, Claude, ChatGPT — but each AI sees a different slice of what your team's actually doing. This MCP server is the Sink that aligns them: it exposes Tangerine team memory to Claude Code, Cursor, Claude Desktop, and any other MCP-compatible AI client.
Once installed, your AI tool gains 7 tools it can call autonomously — no copy-paste, no manual injection:
| Tool | Calls when… |
|---|---|
| query_team_memory(query, limit?) | the user asks about prior decisions, meetings, anything that might be in team context |
| get_today_brief() | session start — pulls today's brief so the AI loads context before the user asks |
| get_my_pending(user) | the user asks "what's on my plate", "what do I owe", "what's overdue" |
| get_for_person(name) | "what's been working on", "catch me up on ", before a 1:1 |
| get_for_project(slug) | "status of ", "what's happening with " |
| get_thread_state(topic) | "where did we land on ", "is still open" |
| get_recent_decisions(days?) | "what did we decide recently", session start to load decision context |
Ask Claude "what did we decide about Whisper?" → it auto-calls query_team_memory("Whisper").
Ask "what's on my plate?" → it auto-calls get_my_pending("daizhe").
No prompt engineering required.
Install
npx tangerine-mcp # zero-config, uses ~/.tangerine-memoryOr install globally:
npm install -g tangerine-mcp
tangerine-mcp --helpUsage
tangerine-mcp 0.1.0
MCP server that exposes Tangerine team memory to any MCP-compatible AI client.
USAGE
npx tangerine-mcp [options]
tangerine-mcp [options]
OPTIONS
--root <path> Memory root directory. Overrides $TANGERINE_MEMORY_ROOT.
Default: ~/.tangerine-memory
-h, --help Show this help and exit.
-v, --version Print version and exit.
ENVIRONMENT
TANGERINE_MEMORY_ROOT Memory root if --root is not given.The server speaks MCP over stdio — stdout is JSONRPC, stderr is logs.
Add to Claude Code
Edit ~/.config/claude/config.json (macOS/Linux) or %APPDATA%\Claude\config.json (Windows):
{
"mcpServers": {
"tangerine": {
"command": "npx",
"args": ["-y", "tangerine-mcp"]
}
}
}Restart Claude Code. The query_team_memory tool appears in the tool list. Ask Claude anything about prior decisions and it'll call the tool automatically.
Add to Cursor
Edit ~/.cursor/mcp.json:
{
"mcpServers": {
"tangerine": {
"command": "npx",
"args": ["-y", "tangerine-mcp"]
}
}
}Add to Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"tangerine": {
"command": "npx",
"args": ["-y", "tangerine-mcp"]
}
}
}Custom memory root
{
"mcpServers": {
"tangerine": {
"command": "npx",
"args": ["-y", "tangerine-mcp", "--root", "/path/to/team/memory"]
}
}
}Or set the env var:
export TANGERINE_MEMORY_ROOT=/path/to/team/memory
npx tangerine-mcpMemory layout
The server expects a directory of markdown files, optionally organized into the standard Tangerine subdirectories:
~/.tangerine-memory/
├── meetings/
│ └── 2026-04-25-v15-scope.md
├── decisions/
│ └── pricing-vercel-open-core.md
├── people/
├── projects/
├── threads/
└── glossary/Each .md file may have YAML frontmatter:
---
title: Pricing Vercel-style open core (OSS forever + Cloud $10/seat + Enterprise)
date: 2026-04-26
source: meeting
---
We need to lock pricing before HN launch...Frontmatter is parsed via gray-matter and surfaced in tool results.
Response envelope (Stage 1 AGI hook 4)
Every tool response is wrapped in this envelope — same shape, every tool, so MCP clients (Cursor, Claude Code, Claude Desktop) can render confidence indicators, freshness badges, and source attribution from day one. Stage 2 fills in the placeholder fields with real values.
{
"data": {"...": "actual tool payload — shape depends on the tool"},
"confidence": 1.0,
"freshness_seconds": 60,
"source_atoms": ["evt-2026-04-25-aBc12dEf", "..."],
"alternatives": [],
"reasoning_notes": null
}| Field | Stage 1 (now) | Stage 2 (~6 mo out) |
|---|---|---|
| confidence | always 1.0 | LLM-graded 0..1 trust score |
| freshness_seconds | seconds since the freshest source atom / file mtime | same |
| source_atoms | atom ids that contributed ([] for substring search) | full citation graph |
| alternatives | always [] | competing interpretations when ambiguous |
| reasoning_notes | always null | reasoning loop annotation |
Schema is also documented in <root>/.tangerine/SCHEMA.md (written by the desktop daemon).
What it exposes
Tool: query_team_memory
Substring search across all memory markdown.
Input:
{
"query": { "type": "string" },
"limit": { "type": "number", "default": 5, "minimum": 1, "maximum": 20 }
}data field shape:
{
"query": "pricing",
"root": "/path/to/memory",
"searched": 12,
"hits": [
{
"file": "decisions/pricing-vercel-open-core.md",
"title": "Pricing Vercel-style open core (OSS forever + Cloud $10/seat + Enterprise)",
"frontmatter": {"date": "2026-04-26", "source": "meeting"},
"snippet": "...Vercel-style: OSS forever, Cloud $10/seat, Enterprise custom...",
"content_preview": "<first 4000 chars>",
"matches": 3
}
]
}Tool: get_today_brief()
Returns today's daily brief from <sidecar>/briefs/<today>.md if the desktop daemon has written it, otherwise synthesises one from the timeline index. data.origin is "brief_file" | "synthesised" | "empty".
Tool: get_my_pending(user)
Open action items where lifecycle.owner == user AND lifecycle.closed is null. Sorted overdue-first.
Tool: get_for_person(name)
Last 30 days, max 20 atoms involving the named person (matches refs.people and actors).
Tool: get_for_project(slug)
Last 30 days, max 20 atoms in the project (matches refs.projects).
Tool: get_thread_state(topic)
Chronological atoms attached to the thread, plus thread status (active | closed), decisions_resolved list, and the verbatim narrative from memory/threads/<topic>.md if present.
Tool: get_recent_decisions(days?)
Decision atoms (kind == "decision") in the last N days (default 7, max 365). Capped at 50 results, newest first.
Resource: team-memory://
team-memory://— JSON index of every file (path, title, frontmatter)team-memory://decisions/pricing-vercel-open-core.md— full markdown content with frontmatter
Behavior
- Memory root resolution:
--rootflag →$TANGERINE_MEMORY_ROOT→~/.tangerine-memory - Missing root: logs to stderr, returns empty results, doesn't crash
- Search: case-insensitive substring across body (frontmatter stripped), ranked by descending match count
- Caps: 1000 files, 4000-char content preview, 20 results max
- Performance: < 100ms for 100 files of ~5KB each
- Logging: stderr only (stdout reserved for MCP JSONRPC)
Development
git clone https://github.com/Tangerine-Intelligence/tangerine-meeting-live.git
cd tangerine-meeting-live/mcp-server
npm install
npm run build
npm testLicense
Currently effective: Apache-2.0 — see PRIOR-LICENSE-APACHE-2.0.txt.
Transition draft (pending CEO + legal counsel ratification): AGPL v3 + Dual Commercial. See LICENSE and COMMERCIAL-LICENSE.md.
