npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

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.

Readme

tangerine-mcp

Align every AI tool on your team with your team's actual workflow.

License: Apache-2.0 (current) License: AGPL v3 + Commercial (transition draft)

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-memory

Or install globally:

npm install -g tangerine-mcp
tangerine-mcp --help

Usage

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-mcp

Memory 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: --root flag → $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 test

License

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.