Circulara Observe MCP plugin - meters your AI agents' token spend and carbon, free tier.
Circulara Observe tier: per-tenant backend + MCP plugin. Sprints 1-4: WS0 (scaffold), WS6 (pricing registry), WS1 (MCP plugin), WS2 (auth + BYO keys + gateway), WS3 (telemetry pipeline: normalize -> re-price -> append; free-tier cap; OpenAI-format gateway for Cursor-class hosts), WS4 (meter compute: registry pricing, energy/CO2e ranges with confidence labels, per user/team/module/month report), WS5 (Observe dashboard + savings-potential report + monthly statement, server-rendered, Ledger Light brand tokens; seed a demo tenant with packages/backend/scripts/seed-demo.ts and open the printed /dashboard URL). Architecture: /outputs/reports/architecture_v1.md (AD1-AD6, rev 2026-07-07) + the sourcing addendum (AD7-AD12).
Pricing placement: the meter owns money. All three capture paths (hook, tool, gateway) deliver tokens + model; pricing happens ONCE in the WS3/WS4 pipeline from the approved registry snapshot. Client-submitted observe events are re-priced server-side; client cost is a hint, never the booked number. Engine-computed events (reuse/sourcing, waves 3+) carry their own math and are born meter-priced in-process.
| Package | What |
|---|---|
| packages/schema | THE event schema (zod, v1.0+v1.1, AD4/AD12 incl. call_id + M1 stacking rule). Single source of truth for backend intake AND plugin emission |
| packages/backend | Per-tenant backend: tenancy/isolation (PGlite+pgvector dev, per-tenant Postgres prod), append-only meter, seats (AD6), WS2 auth (OIDC + short-lived agent tokens + dev mode), BYO provider keys envelope-encrypted at rest, gateway metering mode (AD3-B, M2 per-seat credentials), object store, WS6 pricing registry + carbon coefficients |
| packages/plugin | MCP plugin (AD3 path C tools: circulara_report, circulara_status) + Claude Code PostToolUse hook (path A observe capture). Validates events against the shared schema BEFORE sending |
npm install
npm test # all workspaces: backend 11 + plugin 4 (in-memory, no keys)
npm run typecheck
npm run dev # backend on 127.0.0.1:8787 (CIRCULARA_AUTH_MODE=dev|oidc)
# WS6 registry flow (human approves diffs, D12):
npm run registry -- update|approve|show
# WS2 LIVE smoke (deliberate; ~cents on the configured Anthropic key):
cd packages/backend && npx tsx scripts/live-smoke.ts
circulara_role=admin claim).Bearer dev-admin-token / dev-seat-token.claude mcp add circulara \
-e CIRCULARA_BACKEND_URL=http://127.0.0.1:8787 \
-e CIRCULARA_TENANT_ID=<uuid> -e CIRCULARA_TOKEN=<bearer> \
-e CIRCULARA_SEAT_ID=<uuid> -e CIRCULARA_USER_ID=<sso-subject> \
-- npx tsx <repo>/packages/plugin/src/server.ts
Hook capture (path A): wire packages/plugin/src/hook.ts as a PostToolUse hook (see file
header). The hook never fails the host tool call.
Runtime keys come ONLY from the external env file via loadSecret() (path in src/config.ts, names in /context/api.md): CIRCULARA_MASTER_KEY (envelope KEK), CIRCULARA_AGENT_TOKEN_SECRET (agent JWTs), tenant provider keys via the API. Never hardcoded, never logged, never committed.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
npx -y @circulara/pluginMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"ai-circulara-plugin": {
"command": "npx",
"args": [
"-y",
"@circulara/plugin"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup reference@circulara/pluginnpmai.circulara/plugin works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.