For developers

Build with Bridge.

Bridge ships an MCP server, an OpenAPI 3.1 spec, and a.well-known/mcp.jsondiscovery manifest so your agents (Claude Desktop, Cursor, your own) can read and act on your CRM.

Live tool catalog

Pulled directly from /api/v1/.well-known/mcp.json. Updated within a minute of registry changes.

bridge_activity_listsafe

Get the activity history (emails, meetings, calls, notes) for a specific contact. Use when the user asks about past interactions, communication history, or "when did I last talk to…". Pass the contact UUID — if you only have a name, call bridge_contacts_search first.

bridge_activity_logreversible

Log an activity (email, meeting, call, note, message, SMS, WhatsApp) for a contact. Use when the user says they had a meeting, call, message, or interaction with someone and wants to record it. Also the default way to save a new fact or update about a person ("he is leading a new fund"): use type NOTE. It appends to their timeline and never overwrites existing notes. Put where you met in the subject ("Met at UCLA Anderson demo day") so it is searchable. occurredAt defaults to now; for an earlier time pass ISO 8601 with the user's UTC offset. Pass the contact UUID — call bridge_contacts_search first if you only have a name.

bridge_commitments_listsafe

Get open commitments (promises/action items) the user has made or that others have made to them. Use when the user asks "what do I owe?", "what have I promised?", "what does [contact] owe me?", "what are my open commitments?", "what do I need to follow up on?". Returns commitments AI-extracted from emails, meetings, and notes. Pass the contact UUID for the optional contactId filter — call bridge_contacts_search first if you only have a name.

bridge_contacts_createreversible

Create a new contact. Call bridge_contacts_search first and reuse an existing contactId; ask before creating from a first name. displayName required. Optional: email, phone, company, title, location, notes, meetingContext, education, tags, linkedinUrl, websiteUrl, githubUsername, xHandle, instagramHandle. Copy name and company exactly as given. meetingContext = where you met. Applies immediately; undoable for 24h in Bridge. If deduplicated=true, the fields in notApplied were NOT saved; record them with bridge_activity_log. Pass the returned contactId to bridge_deals_create. Set education on school+year info ("Brown 2027") — seeds enrichment. A social URL goes in its matching field. bio, birthday, photo, custom fields cannot be set here. Tags: bridge_tags_manage. CRITICAL: only set email/phone/any social field when the user EXPLICITLY names BOTH the field and the value. NEVER infer from vague language, memory, or earlier search/OSINT — a wrong identity silently attaches another person. If asked to find a link, ask the user to paste it.

bridge_contacts_getsafe

Get the full profile for a specific contact by UUID. Use after bridge_contacts_search to retrieve detailed information about a person, or when the user asks for details about a specific contact. Pass the contact UUID — call bridge_contacts_search first if you only have a name.

bridge_contacts_searchsafe

Search the user's contacts by name, company, school, location, role, or keywords. Use when the user asks about people in their network, wants to find contacts matching criteria, or asks "who do I know at…" style questions. Also call it before creating or updating anyone, to reuse the existing contactId: name matches any part of the stored name, so if the full name finds nothing try the surname alone. contextKeywords match notes, meeting context and logged activity text (e.g. who the user met at an event). Each keyword is a case-insensitive substring and any one match counts, so pass the most specific phrase ("demo day") rather than broad words.

bridge_contacts_transferreversible

Send one of the user's contacts to another Bridge user. The transfer is pending until the recipient accepts/declines or it expires (30 days). Both sides see status via bridge_contacts_transfers_list.

bridge_contacts_transfers_acceptreversible

Accept a pending contact transfer sent to you. The contact is added to your CRM, deduplicated against anyone you already know.

bridge_contacts_transfers_declinereversible

Decline a pending contact transfer addressed to you. The sender sees the decline; no contact is added.

bridge_contacts_transfers_listsafe

List pending and historical contact transfers involving the user. direction=inbox (received), outbox (sent), or all.

bridge_contacts_updatereversible

Update a contact's profile fields. Use when the user explicitly tells you to change a field on a specific contact. Allowed fields: company, title, location, education, bio, notes, birthday, email, phone. CRITICAL: only set email or phone when the user explicitly names BOTH the field and the new value (e.g. "set Sarah's email to sarah@new.co"). NEVER infer email/phone changes from vague language ("looks like Sarah moved jobs"). Only change company or title when the user states the new value, and copy it exactly. notes REPLACES the whole existing note: to add a fact, meeting or update about someone, use bridge_activity_log instead, and set notes only when the user asks to rewrite the note. The name cannot be changed here. For tags, use bridge_tags_manage. Pass the contact UUID — call bridge_contacts_search first if you only have a name.

bridge_deals_createreversible

Create a new deal in a pipeline. Pass the pipeline UUID, stage UUID, and title. Optionally link a contact (UUID). Use bridge_pipelines_list to resolve pipeline/stage IDs and bridge_contacts_search to resolve contact IDs.

bridge_deals_listsafe

List the user's deals. Optionally filter by pipeline UUID, stage UUID, contact UUID, or status. Use when the user asks "what deals do I have", "show my pipeline", or "deals with [contact]". Pass UUIDs for filters — call bridge_pipelines_list first to resolve pipeline/stage names, bridge_contacts_search for contact names.

bridge_deals_move_stagereversible

Move a deal to a different stage in its pipeline. Use when the user says "move [deal] to [stage]", "[deal] won", or "mark as closed". Pass the deal UUID + target stage UUID — call bridge_deals_list first to resolve the deal, bridge_pipelines_list to resolve the stage.

bridge_inbox_list_forwardssafe

Retrieve emails the user has recently forwarded to their Bridge inbox address (e.g. u_xxx@in.bridge-ai.social). Use when the user asks: "did you get the email I forwarded?", "check my forwarded mail", "what just came in", "show me the email I sent over". Returns sender, subject, snippet, matched contact (if any), and reply links. If nothing is returned, tell the user no recent forwards arrived and surface their forwarding address so they can verify they sent it to the right place.

bridge_networking_asks_upsertreversible

Record what the user is looking for (an 'ask') on their networking profile, so the matcher can surface relevant people. Use when the user (via their own connected agent) states something they want — e.g. 'looking for a technical co-founder', 'raising a seed round', 'want intros to fintech operators'. This writes the USER'S OWN ask — never another person's. Pass a concise `what`; optionally a `why` for context.

bridge_networking_offers_upsertreversible

Record something the user can offer or help with (an 'offer') on their networking profile, so the matcher can surface people who need it. Use when the user (via their own connected agent) states something they can give — e.g. 'happy to advise seed-stage founders', 'can intro to VCs', 'offering design feedback'. This writes the USER'S OWN offer — never another person's. Pass a concise `what`; optionally a `why` for context.

bridge_networking_profile_updatereversible

Set a single field on the user's OWN networking profile so the matcher has self-authored context. Use when the user (via their own connected agent) states a profile fact about THEMSELVES — e.g. their title, company, industry, bio, expertise, or what they're open to. Allowed fields: displayName, title, company, industry, location, bio, expertise, openTo, email, phone, linkedinUrl, twitterUrl. High-sensitivity fields the user has locked (e.g. email/phone) will be rejected — that is expected; ask the user to edit those in the app. This writes the USER'S OWN profile only.

bridge_pipelines_createreversible

Create a pipeline with its stages. Pass a name and a type; omit `stages` to seed the standard stages for that type, or pass your own ordered list. Optionally attach the pipeline to a Project by UUID. Call bridge_pipelines_list afterwards (or read the returned stage UUIDs) to file deals into it.

bridge_pipelines_listsafe

List the user's sales/investor pipelines with their stages. Use when the user asks 'what pipelines do I have', 'show me my pipelines', or before referring to a specific pipeline by name.

bridge_pipelines_summarysafe

Summarize a sales pipeline by stage with deal counts and total value. Use when the user asks 'show my pipeline', 'how is X pipeline doing', or compares stages. Returns each stage with deal count, total value, and top deals.

bridge_relationship_contexts_searchsafe

Search the user's private imported event, trip, cohort, or list contexts and return the contacts attached to each context with exact relationship classifications. Use for questions like "who was listed in X?" or "who was on X trip/cohort?". LISTED_ONLY means the person only appeared in the imported source. Shared context never means participants know each other.

bridge_reminders_createreversible

Create a reminder for the user. Use when the user asks to be reminded about something — following up with a contact, a deadline, or any future task. dueAt is an exact time: resolve relative dates like "next Tuesday" from today in the user's time zone, use 9:00 local if no time was given, and pass it with that UTC offset (2026-10-13T09:00:00-07:00). Ask the user if you do not know their time zone. Pass the contact UUID for the optional contactId — call bridge_contacts_search first if you only have a name.

bridge_tags_managereversible

Add or remove tags on a contact. Use when the user says "tag [contact] as [x]" or "remove the [x] tag from [contact]". Pass the contact UUID — call bridge_contacts_search first if you only have a name. Provide at least one of addTags / removeTags.

bridge_warm_intros_evaluatesafe

Find warm introduction paths to a target contact. Returns people who know the target well, split into "Ready" (strong on both sides — you can ask for the intro) and "Opportunity" (they know the target well but you need to build your relationship with them first). Use when the user asks "how can I get introduced to X?", "warm intro to X", "who can introduce me to X?", "do I have any mutual connections with X?". Pass the target contact UUID — call bridge_contacts_search first if you only have a name.

Quickstart

Three steps. No SDK to install. Bridge speaks MCP and HTTP directly.

Step 1

Mint a token

Sign in to Bridge and visit /settings/mcp-tokens. Choose a label, an allowlist of capabilities, and a tier. The raw token appears once. Copy it.

Format: pat_live_<32-hex>. Store like any other credential.

Step 2

Point your MCP host at Bridge

Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "bridge": {
      "command": "npx",
      "args": [
        "-y", "mcp-remote",
        "https://staging.bridge-ai.social/api/v1/mcp",
        "--header", "Authorization:Bearer ${BRIDGE_TOKEN}"
      ],
      "env": { "BRIDGE_TOKEN": "pat_live_..." }
    }
  }
}
Step 3

Or call it directly

Plain JSON-RPC over HTTP works too:

curl -X POST https://staging.bridge-ai.social/api/v1/mcp \
  -H "Authorization: Bearer pat_live_..." \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

JavaScript / TypeScript:

const res = await fetch("https://staging.bridge-ai.social/api/v1/mcp", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BRIDGE_TOKEN}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    jsonrpc: "2.0",
    id: 1,
    method: "tools/call",
    params: {
      name: "bridge_contacts_search",
      arguments: { name: "Sarah" },
    },
  }),
});
const data = await res.json();

Python:

import httpx, os

r = httpx.post(
    "https://staging.bridge-ai.social/api/v1/mcp",
    headers={
        "Authorization": f"Bearer {os.environ['BRIDGE_TOKEN']}",
        "Content-Type": "application/json",
    },
    json={
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {
            "name": "bridge_contacts_search",
            "arguments": {"name": "Sarah"},
        },
    },
)
print(r.json())

Built for trust

PII redaction by default

Tokens without the `includesPII` flag get redacted responses. Email, phone, notes, locations are stripped before they leave the server. Opt in explicitly when your agent needs them.

Undo for every reversible action

Each reversible call returns a one-shot `undoToken`. Hit `bridge_undo` within the window to revert. The recipient of a contact transfer can decline; the sender can revoke.

Confirm-required for destructive

Destructive capabilities return a `confirm_required` envelope first. Your agent retries with the `_confirm_token` to commit, or calls `bridge_cancel` to abandon.

Per-token scoping

Each token carries a capability allowlist. Empty = wildcard-safe (every safe-class capability). Reversible / destructive / external capabilities require an explicit entry. Wildcards never silently widen.

Rate limits

Per-token, per-minute. Pick a tier when minting.

TierRequests / minute
free30
pro300
enterprise3,000