Skip to main content
v1.0 · GA

The MCP server.
Every model, on your terms.

Pulse ships a Model Context Protocol server that exposes your map, briefings, skills, and answer tools to any MCP-aware client, Claude Desktop, Cursor, Zed, Continue, and the dozen others shipping monthly. No middleman, no per-token markup, no telemetry on your prompts.

# claude_desktop_config.json (Desktop launches stdio servers,
# so the remote endpoint goes through the mcp-remote bridge)
{
  "mcpServers": {
    "pulse": {
      "command": "npx",
      "args": [
        "-y", "mcp-remote",
        "https://YOUR_PULSE_HOST/api/mcp",
        "--header", "Authorization: Bearer pk_live_..."
      ]
    }
  }
}

# Cursor (~/.cursor/mcp.json) speaks HTTP directly:
{
  "mcpServers": {
    "pulse": {
      "url": "https://YOUR_PULSE_HOST/api/mcp",
      "headers": { "Authorization": "Bearer pk_live_..." }
    }
  }
}

 JSON-RPC 2.0 over HTTP, no npm dep, no proxy
 14 read + 7 capture + 3 personal-memory + 1 action-proposal tools registered · listed via tools/list
 bearer auth · same pk_live_* token your other API uses
initialize
server capabilities · 25 tools
tools/call · search_company
200 · ranked hits + citations
Why MCP?
The Model Context Protocol is an open standard from Anthropic that lets AI tools talk to your data without a custom integration for each one. One MCP server, every client. Pulse runs it for you as part of the hosted product, so there’s no daemon to install.
Implementation
A direct JSON-RPC 2.0 server. No @modelcontextprotocol/sdk dependency: the route handler at /api/mcp implements initialize, tools/list, tools/call, and notifications/initialized directly.
Hosting
SaaS-hosted, served from the same Next.js app as the rest of Pulse. No daemon to install, no proxy to keep alive, no npm package to update.
Transport
HTTP only in v1 (most modern MCP clients support it). One POST to /api/mcp with a JSON-RPC envelope; one GET for server discovery. TLS via Vercel; bearer auth via the existing API-key system.
Surface
Twenty-five tools: fifteen reads (fourteen graph/answer reads plus pulse_recall) and ten writes, seven capture tools (Claude Desktop, Cursor, Codex push conversations / snippets / decisions into Pulse via MCP), pulse_remember / pulse_forget for private personal memory, and pulse_propose_action, which files an action proposal (a PR, a Slack post, a task) into the human approval inbox and never executes anything itself. Every tool exposes a JSON Schema input contract via tools/list so MCP clients can introspect capabilities.

The tool surface

Fifteen read tools (including pulse_recall) and ten write tools, seven team-visible capture tools, action proposals via pulse_propose_action, plus pulse_remember / pulse_forget for private personal memory. Every call is permission-filtered, audited, and rate-limited via the existing per-key budget. Capture and personal-memory tools require an MCP token from /app/settings/integrations/mcp-tokens.

search_company(query, limit?)

Hybrid search across decisions, documents, customers, and skills. Returns ranked hits with citations and per-hit confidence.

read
get_decision(decisionId)

Fetch one decision by id with rationale, evidence URLs, regret score, and linked PRs.

read
list_recent_decisions(days?, category?)

Most recent decisions in the workspace, optionally filtered by category and lookback window.

read
find_expert(topic, limit?)

Given a topic, return ranked humans most likely to be experts on it. Ranking uses authored docs + decisions + answered questions.

read
get_feature(featureId)

Fetch a feature record with stage, status, owner, and timeline metadata.

read
list_similar_features(description, limit?)

Given a feature description, return prior features whose embeddings are most similar. Useful for 'has someone built this before?'

read
get_person(userId)

Profile for a person in this workspace plus inferred skills (recent activity, authored docs, decisions made).

read
get_pulse(userId?)

The user's current Pulse: open commitments, recent decisions, customer alerts, top stuck items.

read
pulse_workspace_snapshot()

On-demand workspace-wide snapshot: 7-day timeline, top commitments, recent decisions, alerts, stuck items, features in flight, plus counts. ACL-filtered so private-channel items stay private.

read
pulse_ls(path?)

List the immediate children of a virtual knowledge path (/documents, /decisions/{YYYY-MM}, /people, /people/{slug}/commitments, /skills, /features, /topics). Entities you can't see are absent, never labelled.

read
pulse_tree(path?, depth?)

Recursive listing of a virtual path, capped at depth 3 and 25 entries per level. Same ACL filter as pulse_ls.

read
pulse_grep(pattern, path?)

Hybrid retrieval search (vector + lexical) with optional path scoping. /people/{slug} narrows to that person's authored documents.

read
pulse_glob(pattern)

Glob match (* and ?) against slugs in the visible tree, e.g. "/people/s*" or "/decisions/2026-05/*".

read
list_commitments(toUserId?, fromUserId?, status?)

List commitments filtered by who owes the work, who the work is for, and status.

read
pulse_capture_conversation(content, title?, ...)

Save the current AI conversation to Pulse so the team can see and learn from it. User-initiated only; the model never calls this autonomously.

mcp:capture
pulse_capture_snippet(content, language?, ...)

Save a specific code block, paragraph, or quote from the current conversation. Optional language hint drives syntax highlighting in the Pulse UI.

mcp:capture
pulse_capture_decision(decisionStatement, rationale, ...)

Record a structured decision with rationale, alternatives, tradeoffs, and confidence. Creates a Decision entity directly and links it back to a Document holding the full reasoning.

mcp:capture
pulse_capture_commitment(commitmentStatement, ownerName?, recipientName?, dueDate?, ...)

Record a commitment (who owes what to whom, by when) extracted from the conversation.

mcp:capture
pulse_capture_failure_case(title, pattern, ...)

Save a failure case (what was tried, what broke, what the fix was) so the team can avoid repeating it.

mcp:capture
pulse_capture_note(content, title?, ...)

Save a general note or working memo for the workspace.

mcp:capture
pulse_suggest_skill(skillName, description, steps, ...)

Propose a new Skill candidate. Enqueues a SkillExtractionJob; an admin reviews and compiles through the standard DRAFT → SHADOW → ACTIVE pipeline.

mcp:capture
pulse_remember(content, kind?, ...)

Save a durable PERSONAL fact or preference to your private cross-AI memory. Only you can ever see it; it follows you across tools. Not team knowledge.

mcp:capture
pulse_recall(query?, limit?)

Load your private facts + writing/coding style as a compact instruction block so any AI tool continues work in your voice. Returns only your own data.

mcp:captureread
pulse_forget(query)

Remove the closest-matching fact from your private memory by natural-language query.

mcp:capture
pulse_propose_action(kind, title, payload)

Draft a real action (a Slack post, a Linear issue, a Salesforce update, any of the 98 public kinds) into the human approval inbox at /app/actions. Never executes anything itself; a person always clicks approve.

mcp:capturewrite

Tested with

The clients we use day to day. Anything that speaks JSON-RPC 2.0 over HTTP works, with or without the mcp-remote bridge.

Claude Desktop

Drop the mcp-remote config block into claude_desktop_config.json (Desktop launches stdio servers, so the bridge carries the HTTP endpoint), Pulse appears as a tool source in your next conversation.

macOS · Windows

Cursor

Settings → MCP → add server. Pulse tools become available in chat and the inline composer. Auth completes in the browser.

0.42+ · stable

Zed

Native MCP support since Zed 0.165. Pulse shows up in the assistant panel; tool calls appear inline with the diff.

0.165+ · GPU-fast

Continue

Coding assistant with a pluggable model router. Pair Pulse for local-LLM-plus-grounded-context workflows.

0.9.211+

Claude Code

The CLI flavour of Claude with native MCP. claude mcp add --transport http pulse https://YOUR_PULSE_HOST/api/mcp --header "Authorization: Bearer …" and you’re done.

terminal-first

CLI / scripts

Anything that speaks JSON-RPC 2.0 works. POST the envelope from the install block to /api/mcp with your bearer token, no client library needed.

curl-friendly

VS Code

Via the GitHub Copilot MCP extension or the Continue plugin. Pulse tools surface in the chat side panel.

via plugin

Yours, presumably

Build a client and want it on this page? Open a PR with a one-paragraph description and a screenshot.

apache 2.0

Security model

An MCP server is a key into your data, and we treat it that way. Same login, same audit log, same instant kill switch as the Pulse app itself.

01 · auth

Bearer auth via existing API keys

AI tools sign in with the same pk_live_* tokens your other API integrations already use. Read scope is required. Generate one from /app/admin/api-keys; revoke it in one click.

02 · enforcement

Permission check per call

Every tool call passes through the same retrieval permission filter as the in-app surface. The MCP server can't bypass ACLs, it's a thin shell over the same auth path.

03 · audit

Full call log per workspace

Every call is written to the audit log with the caller, tool name, API-key id, and timestamp. Pull it anytime via GET /v1/audit; real-time SIEM streaming is on the Enterprise roadmap.

04 · isolation

Scoped to your workspace

Keys are scoped to your workspace, matching the rest of /api/v1/*. The token's owner is the person who created it. No tool can reach another workspace's data.

05 · kill switch

An admin can revoke in one click

Revoking a key takes one click and takes effect immediately: the very next call is rejected. There's no client-side cache to wait out.

06 · privacy

Read by default, capture only on request

Fifteen tools are read-only (fourteen graph/answer reads plus pulse_recall, which returns only your own private memory). Ten write to Pulse, the seven capture tools and skill suggestions (team-visible), pulse_remember and pulse_forget (your private personal memory), and pulse_propose_action, and only when you explicitly invoke them in your AI client; their descriptions tell the model never to call them on its own. pulse_propose_action never executes anything: it files a proposal into the same human approval inbox at /app/actions that every agent action goes through, so your AI can suggest a PR, a Slack post, or a calendar event and a person always clicks approve.

The server is ready.
Your model is, too.

If you’re already on Pulse, the MCP server takes 90 seconds to set up. MCP access is included on every plan, no upgrade required.