contextpulse-mcp
by DIYA73
README.md
# contextpulse-mcp
**Real-time context budget tracking for any AI coding agent.**
Plug into Claude Code, Cursor, or any MCP-compatible tool and get:
- š Live token budget bar per agent run
- š Loop detection (when an agent calls the same tool 3Ć in a row)
- ā ļø Warning / critical alerts before context overflow
- šļø Full run history stored in PostgreSQL
- š Budget timeline for every run
- š“ BullMQ alert queue for async threshold notifications
- š Run diff engine ā compare two agent runs side by side
No cloud. No telemetry. Runs entirely on your machine.
---
## How it works
ContextPulse is a **transparent MCP server**. You call its tracking tools from your agent's workflow. It counts tokens using `tiktoken`, updates a live budget in memory, persists everything to PostgreSQL, and fires alerts when thresholds are crossed.
Your agent ā calls cp_track_tool_call ā ContextPulse counts tokens
ā updates live budget
ā warns at configurable thresholds (70% / 90% by default, model-calibrated ā see below)
ā detects loops
ā saves to DB
ā queues BullMQ alert jobs
The [contextpulse dashboard](https://github.com/DIYA73/contextpulse) connects over WebSocket and visualizes everything in real time.
---
## Quick start
### 1. Start PostgreSQL
```bash
brew services start postgresql@16
# or Docker
docker run -d --name contextpulse-db -e POSTGRES_DB=contextpulse -p 5432:5432 postgres:16
```
### 2. Start Redis (required for BullMQ alert queue)
```bash
brew services start redis
# or Docker
docker run -d --name contextpulse-redis -p 6379:6379 redis:7
```
### 3. Add to Claude Code (`~/.claude/settings.json`)
```json
{
"mcpServers": {
"contextpulse": {
"command": "npx",
"args": ["-y", "contextpulse-mcp"],
"env": {
"DATABASE_URL": "postgresql://apple@localhost:5432/contextpulse"
}
}
}
}
```
### 4. Add to Cursor (`~/.cursor/mcp.json`)
```json
{
"mcpServers": {
"contextpulse": {
"command": "npx",
"args": ["-y", "contextpulse-mcp"],
"env": {
"DATABASE_URL": "postgresql://localhost:5432/contextpulse"
}
}
}
}
```
> The DB schema is created automatically on first run.
---
## Usage in your agent
cp_start_session ā get sessionId
cp_start_run ā get runId (optionally pass baselineOverheadTokens ā see Accuracy & limitations)
cp_track_tool_call ā after every tool call (pass tool name, args, output)
cp_get_budget ā check current budget at any time
cp_get_run_summary ā full run summary with timeline
cp_end_run ā clean up
### Example response from `cp_track_tool_call`
```json
{
"toolCallId": "a1b2c3...",
"inputTokens": 142,
"outputTokens": 87,
"totalTokens": 229,
"budget": {
"used": 14820,
"limit": 200000,
"percentUsed": 7.41,
"warningThresholdPct": 60,
"criticalThresholdPct": 85
},
"budgetStatus": "ok",
"alert": null
}
```
When budget hits the warning threshold (60% by default for Claude models ā see [Accuracy & limitations](#accuracy--limitations)):
```json
{
"budgetStatus": "warning",
"alert": "warning"
}
```
---
## Environment variables
| Variable | Default | Description |
|---|---|---|
| `DATABASE_URL` | `postgresql://apple@localhost:5432/contextpulse` | PostgreSQL connection string |
| `REDIS_URL` | `redis://localhost:6379` | Redis connection for BullMQ |
| `MODEL` | `claude-sonnet-4-6` | Model in use. Picks the default `CONTEXT_LIMIT` / thresholds below from a per-model profile (see [Accuracy & limitations](#accuracy--limitations)). |
| `CONTEXT_LIMIT` | model-derived, else `200000` | Token limit per session. Set this to override the model's default. |
| `WARNING_THRESHOLD_PCT` | model-derived, else `70` | Warning alert threshold (%). Set this to override the model's default. |
| `CRITICAL_THRESHOLD_PCT` | model-derived, else `90` | Critical alert threshold (%). Set this to override the model's default. |
| `LOOP_DETECTION_THRESHOLD` | `3` | Same tool calls before loop alert |
`CONTEXT_LIMIT` / `WARNING_THRESHOLD_PCT` / `CRITICAL_THRESHOLD_PCT` always win if set explicitly. Otherwise ContextPulse picks defaults from `MODEL` ā currently `claude`, `gpt`, and `gemini` have profiles in `src/config/index.ts`; anything else falls back to 200k / 70% / 90%. Edit that file directly if your model isn't covered or the numbers don't match your plan.
---
## Accuracy & limitations
Be aware of two gaps before you treat the reported percentage as exact:
**Token counts are an approximation.** ContextPulse counts tokens with `tiktoken`'s `cl100k_base` encoding, which is OpenAI's tokenizer, not Claude's ā there's no public Claude tokenizer to use instead. It will drift from what Claude actually bills, especially on code. Treat `percentUsed` as a trend signal ("am I climbing toward the wall") rather than an exact remaining-token count.
**This proxy can't see everything in the context window.** ContextPulse only counts tokens that flow through `cp_track_tool_call`. It has no visibility into your agent's system prompt, other MCP servers' tool schemas, or any server-side context injection ā all of which can be substantial (a single MCP server's tool definitions alone can run tens of thousands of tokens). So the tracked total is a floor, not the full picture.
Two ways to close the gap a bit:
- **`baselineOverheadTokens`** on `cp_start_run` ā pass a rough estimate of what's already spent before the first tracked call (system prompt + other tool schemas), and it's added to the running total from the start.
- **Per-model thresholds** ā `claude` profiles default to tighter thresholds (60% / 85%) than the generic default (70% / 90%) specifically to hedge against this blind spot. Tune `WARNING_THRESHOLD_PCT` / `CRITICAL_THRESHOLD_PCT` further if you find alerts firing early or late for your setup.
---
## What gets stored
cp_sessions -- one row per coding session
cp_runs -- one row per agent task
cp_tool_calls -- every intercepted tool call
cp_budget_snapshots -- token usage timeline per run
cp_alerts -- warnings, criticals, loop detections
---
## Architecture
contextpulse-mcp/
src/
mcp/ ā MCP tool handlers
context/ ā token counting + budget engine
alerts/ ā BullMQ queue + worker
diff/ ā run diff engine
db/ ā PostgreSQL schema + queries
contextpulse/ ā dashboard repo
app/dashboard/
components/
---
## Related
- [contextpulse](https://github.com/DIYA73/contextpulse) ā Real-time Next.js dashboard for this server
---
## License
MIT
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues