{"name":"bridge","version":"1.0.0","protocol":{"name":"mcp","versions":["2025-06-18","2025-03-26"]},"endpoint":{"url":"/api/v1/mcp","transport":"streamable-http","methods":["POST","GET"]},"auth":{"type":"bearer","tokenMintEndpoint":"/api/mcp-tokens","oauth":{"authorizationServer":"https://bridge-ai-production-6d13.up.railway.app/.well-known/oauth-authorization-server","registrationEndpoint":"https://bridge-ai-production-6d13.up.railway.app/register","scopesSupported":["activity.list","analytics.pipeline_summary","contacts.get","contacts.search","contacts.transfers.list","contacts.warm_intros","deals.list","forwards.list","personal_notes","pipeline.list"]}},"rateLimits":{"free":30,"pro":300,"enterprise":3000},"metaTools":[{"name":"bridge_undo","description":"Reverse any still-valid reversible action addressed by the `undoToken` you pass — provided that token was minted for THIS same MCP token. Pass the `undoToken` from the action's prior tool result at `structuredContent._bridgeUndoToken` (also mirrored in `_meta.undoToken`). One-shot, expires at the prior result's `structuredContent.undoExpiresAt` (~30s window). Do NOT quote the bearer value in user-facing text; it is a sensitive credential meant for programmatic replay only.","annotations":{"title":"bridge_undo","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"undoToken":{"type":"string","minLength":20,"maxLength":128,"description":"The undoToken from a prior tool result's structuredContent._bridgeUndoToken (also mirrored in _meta.undoToken)."}},"required":["undoToken"]}},{"name":"bridge_cancel","description":"Decline a pending confirmation. Pass the `confirmToken` from the prior tool result at `structuredContent.confirmRequired.confirmToken` (also mirrored in `_meta.confirmToken`). The pending action is marked cancelled; no side effect runs. Sibling to bridge_undo but strictly for the pending-confirm state — cannot cancel a completed action. One-shot. Do NOT quote the bearer value in user-facing text; it is a sensitive credential meant for programmatic replay only.","annotations":{"title":"bridge_cancel","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"confirmToken":{"type":"string","minLength":20,"maxLength":128,"description":"The confirmToken from a prior tool result's structuredContent.confirmRequired.confirmToken (also mirrored in _meta.confirmToken)."}},"required":["confirmToken"]}}],"tools":[{"name":"bridge_activity_list","capabilityId":"activity.list","description":"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 search_contacts first.","trustClass":"safe","piiPolicy":"sensitive_in_results","confirmRequired":false,"annotations":{"title":"bridge_activity_list","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid"},"limit":{"type":"integer","minimum":1,"maximum":50,"default":10},"type":{"type":"string","enum":["EMAIL","MEETING","CALL","NOTE","MESSAGE","SMS","LINKEDIN","WHATSAPP"]}},"required":["contactId"]}},{"name":"bridge_activity_log","capabilityId":"activities.log","description":"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. Pass the contact UUID — call search_contacts first if you only have a name.","trustClass":"reversible","piiPolicy":"sensitive_in_results","confirmRequired":false,"annotations":{"title":"bridge_activity_log","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["EMAIL","MEETING","CALL","NOTE","MESSAGE","SMS","LINKEDIN","WHATSAPP"]},"subject":{"type":"string","minLength":1},"description":{"type":"string"},"occurredAt":{"type":"string","format":"date-time"},"tags":{"type":"array","items":{"type":"string","minLength":1},"maxItems":20}},"required":["contactId","type","subject"]}},{"name":"bridge_commitments_list","capabilityId":"commitments.list","description":"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 search_contacts first if you only have a name.","trustClass":"safe","piiPolicy":"sensitive_in_results","confirmRequired":false,"annotations":{"title":"bridge_commitments_list","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid"},"direction":{"type":"string","enum":["I_OWE","THEY_OWE","ALL"]}}}},{"name":"bridge_contacts_get","capabilityId":"contacts.get","description":"Get the full profile for a specific contact by UUID. Use after search_contacts to retrieve detailed information about a person, or when the user asks for details about a specific contact. Pass the contact UUID — call search_contacts first if you only have a name.","trustClass":"safe","piiPolicy":"sensitive_in_results","confirmRequired":false,"annotations":{"title":"bridge_contacts_get","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid"}},"required":["contactId"]}},{"name":"bridge_contacts_search","capabilityId":"contacts.search","description":"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.","trustClass":"safe","piiPolicy":"sensitive_in_results","confirmRequired":false,"annotations":{"title":"bridge_contacts_search","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"name":{"type":"string"},"company":{"type":"string"},"school":{"type":"string"},"location":{"type":"string"},"role":{"type":"string"},"contextKeywords":{"type":"array","items":{"type":"string"}},"limit":{"type":"integer","minimum":1,"maximum":50,"default":10}}}},{"name":"bridge_contacts_transfer","capabilityId":"contacts.transfer","description":"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.","trustClass":"reversible","piiPolicy":"write_only","confirmRequired":false,"annotations":{"title":"bridge_contacts_transfer","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"recipientUserId":{"type":"string","minLength":1,"maxLength":200,"description":"Bridge user id of the recipient. Self-transfer is rejected."},"contactId":{"type":"string","minLength":1,"maxLength":200,"description":"Connection id (must belong to the calling user). Call bridge_contacts_search to resolve a name first."},"reason":{"type":"string","maxLength":1000,"description":"Free-form context shown to the recipient."}},"required":["recipientUserId","contactId"]}},{"name":"bridge_contacts_transfers_accept","capabilityId":"contacts.transfers.accept","description":"Accept a pending contact transfer sent to you. The contact is added to your CRM, deduplicated against anyone you already know.","trustClass":"reversible","piiPolicy":"write_only","confirmRequired":false,"annotations":{"title":"bridge_contacts_transfers_accept","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"transferId":{"type":"string","minLength":1,"maxLength":200,"description":"ContactTransfer id (from bridge_contacts_transfers_list)."}},"required":["transferId"]}},{"name":"bridge_contacts_transfers_decline","capabilityId":"contacts.transfers.decline","description":"Decline a pending contact transfer addressed to you. The sender sees the decline; no contact is added.","trustClass":"reversible","piiPolicy":"write_only","confirmRequired":false,"annotations":{"title":"bridge_contacts_transfers_decline","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"transferId":{"type":"string","minLength":1,"maxLength":200,"description":"ContactTransfer id (from bridge_contacts_transfers_list)."}},"required":["transferId"]}},{"name":"bridge_contacts_transfers_list","capabilityId":"contacts.transfers.list","description":"List pending and historical contact transfers involving the user. direction=inbox (received), outbox (sent), or all.","trustClass":"safe","piiPolicy":"sensitive_in_results","confirmRequired":false,"annotations":{"title":"bridge_contacts_transfers_list","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"direction":{"type":"string","enum":["inbox","outbox","all"],"default":"inbox"},"status":{"type":"string","enum":["pending","accepted","declined","revoked","expired"]},"limit":{"type":"integer","minimum":1,"maximum":100,"default":25}}}},{"name":"bridge_contacts_update","capabilityId":"contacts.update","description":"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\"). For tags, use manage_tags. Pass the contact UUID — call search_contacts first if you only have a name.","trustClass":"reversible","piiPolicy":"sensitive_in_results","confirmRequired":false,"annotations":{"title":"bridge_contacts_update","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid"},"company":{"type":["string","null"]},"title":{"type":["string","null"]},"location":{"type":["string","null"]},"education":{"type":["string","null"]},"bio":{"type":["string","null"]},"notes":{"type":["string","null"]},"birthday":{"type":["string","null"],"format":"date-time"},"email":{"type":["string","null"],"format":"email"},"phone":{"type":["string","null"],"minLength":3,"maxLength":40}},"required":["contactId"]}},{"name":"bridge_deals_list","capabilityId":"deals.list","description":"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 list_pipelines first to resolve pipeline/stage names, search_contacts for contact names.","trustClass":"safe","piiPolicy":"sensitive_in_results","confirmRequired":false,"annotations":{"title":"bridge_deals_list","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"pipelineId":{"type":"string","format":"uuid"},"stageId":{"type":"string","format":"uuid"},"contactId":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["OPEN","WON","LOST","ABANDONED"]},"limit":{"type":"integer","minimum":1,"maximum":50,"default":20}}}},{"name":"bridge_deals_move_stage","capabilityId":"deals.move_stage","description":"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 list_deals first to resolve the deal, list_pipelines to resolve the stage.","trustClass":"reversible","piiPolicy":"sensitive_in_results","confirmRequired":true,"annotations":{"title":"bridge_deals_move_stage","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"dealId":{"type":"string","format":"uuid"},"toStageId":{"type":"string","format":"uuid"}},"required":["dealId","toStageId"]}},{"name":"bridge_inbox_list_forwards","capabilityId":"forwards.list","description":"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.","trustClass":"safe","piiPolicy":"sensitive_in_results","confirmRequired":false,"annotations":{"title":"bridge_inbox_list_forwards","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"sinceMinutes":{"type":"integer","minimum":1,"maximum":43200},"limit":{"type":"integer","minimum":1,"maximum":25},"includeDismissed":{"type":"boolean"}}}},{"name":"bridge_pipelines_list","capabilityId":"pipeline.list","description":"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.","trustClass":"safe","piiPolicy":"metadata_only","confirmRequired":false,"annotations":{"title":"bridge_pipelines_list","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{}}},{"name":"bridge_pipelines_summary","capabilityId":"analytics.pipeline_summary","description":"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.","trustClass":"safe","piiPolicy":"sensitive_in_results","confirmRequired":false,"annotations":{"title":"bridge_pipelines_summary","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"pipelineName":{"type":"string"},"includeClosed":{"type":"boolean","default":false},"topPerStage":{"type":"integer","minimum":0,"maximum":10,"default":3}}}},{"name":"bridge_reminders_create","capabilityId":"reminders.create","description":"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. Pass the contact UUID for the optional contactId — call search_contacts first if you only have a name.","trustClass":"reversible","piiPolicy":"sensitive_in_results","confirmRequired":false,"annotations":{"title":"bridge_reminders_create","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"title":{"type":"string","minLength":1},"dueAt":{"type":"string","format":"date-time"},"contactId":{"type":"string","format":"uuid"},"recurrence":{"type":"string","enum":["none","daily","weekly","biweekly","monthly","quarterly"],"default":"none"}},"required":["title","dueAt"]}},{"name":"bridge_warm_intros_evaluate","capabilityId":"contacts.warm_intros","description":"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 search_contacts first if you only have a name.","trustClass":"safe","piiPolicy":"metadata_only","confirmRequired":false,"annotations":{"title":"bridge_warm_intros_evaluate","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid"}},"required":["contactId"]}}],"generatedAt":"2026-06-02T07:09:43.122Z"}