start_onboarding
readReturns the workspace-setup interview: import evidence to infer the workspace's motion(s) from, the available motions/templates, and the open questions for the active motion(s).
The same 48 tools our agent works with — one endpoint, one rulebook — open to any authorized agent. No second surface, nothing bolted on the side.
# any MCP client — Claude Code shown$ claude mcp add --transport http capable \https://crm.capable.run/api/mcp# OAuth sign-in opens in the browser —# no key to paste, nothing to configure.
OAuth 2.1 with dynamic client registration — a compliant client needs the URL and nothing else.
Point any MCP client at the endpoint — Streamable HTTP, discovery built in.
OAuth 2.1 for apps, personal access tokens for scripts — full or read-only scope.
The same 48 tools the agent uses, through the same rulebook — role, scope, policy, audit.
Apps sign in with OAuth 2.1; scripts carry a personal access token. Both arrive at the same endpoint, resolve to a person in a workspace, and pass the same rulebook — there is no service backdoor.
Every listed tool — reads, writes, schema. Still bounded by the caller's role, write scope, and workspace policies.
Every read tool — including read-type exports (CSV) — and nothing that writes.
Scopes narrow; they never grant. Whatever the credential, workspace governance policies and per-record write scope still apply on top.
| credential | lifetime | |
|---|---|---|
| OAuth access token | 1 hour | refresh on demand |
| OAuth refresh token | 30 days | rotates on every use; a replayed token revokes the family |
| Personal access token | none · 30 · 90 · 365 days | your call at mint; revoke anytime — expiry is encouraged for script keys |
# claude.ai → Settings → Connectors# → Add custom connectorName CapableURL https://crm.capable.run/api/mcp# consent screen shows the requested# scope; approve once per workspace.
$ claude mcp add --transport http \capable https://crm.capable.run/api/mcp# registers via OAuth dynamic client# registration (RFC 7591) + PKCE.
# scripts: a personal access token as# a bearer — plain JSON-RPC over HTTP.$ curl -s https://crm.capable.run/api/mcp \-H "Authorization: Bearer cpbl_pat_…" \-H "Content-Type: application/json" \-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Any MCP client works the same way — the endpoint advertises its authorization server; compliant clients handle the rest.
Every tool the agent has is a tool you have — all 48 of them, generated from the same catalog the agent reads, so this reference cannot drift. read tools are available to crm:read; anything that writes needs crm:full. Writes return the affected record’s full state, and searches are keyset-paginated.
Returns the workspace-setup interview: import evidence to infer the workspace's motion(s) from, the available motions/templates, and the open questions for the active motion(s).
Render the interactive workspace-setup card so the user can confirm the motion(s) you recommended, name the workspace, and Save.
Commit onboarding answers into the workspace config.
Link a contact to an account with a role (champion / economic_buyer / decision_maker / user / blocker / influencer / csm_primary).
Unlink a contact from an account (the contact and the account themselves are kept).
Set the customer health score (0-100) on an account.
Aggregate roll-up of the workspace's opportunities and revenue.
Set the products on an opportunity so its VALUE derives from them (replace-all).
Renew a subscription: advance current_term_started_at and current_term_ends_at forward by one billing cadence (or accept explicit dates), optionally update mrr_cents/seats/plan_name (for renewals with uplift).
Cancel a subscription.
Record an activity (call / email / meeting / LinkedIn).
log_touch { "type": "call", "contact_id": "6f2c…","summary": "Kickoff — scope agreed" }
Ranked list of CUSTOMERS that look under-monetized versus firmographically-similar customers in this workspace (low ARR-per-employee for their headcount).
Send the Capable notetaker bot to a video call.
Pull the notetaker bot out of a call and cancel the recording.
Find three meeting times across the host's (and optional co-hosts') calendars.
find_times { "duration": 30,"window_start": "2026-07-06","window_end": "2026-07-10" }
Create the meeting: places one tentative, opaque hold per (slot × host) on the host's calendar — reversible, invisible to the invitee, auto-released on expiry — and STAGES the invitee's pick-a-time email.
Sends the picker email to the invitee.
Cancel a meeting — DESTRUCTIVE: confirm with the user first.
Move an ALREADY-CONFIRMED (booked) meeting to a new time, in place.
Attach a free-form note to any record (account / contact / opportunity / touch).
Fetch the full detail of any record by id.
get_record { "type": "task", "id": "91ab…" }
Create a record of ANY object type.
create_record { "object_type": "partner","data": { "name": "Globex" } }
Patch fields on a record by id.
update_record { "object_type": "task", "id": "91ab…","data": { "status": "done" } }
List/filter records of any object type.
search_records { "object_type": "contact","query": "lindqvist" }
Archive (soft-delete) a record by object_type + id.
Flagship source-to-updates flow.
tools/call propose_updates{"text": "Call with Sara — moving to Oslo in March; will intro their platform lead…"}# → matched records + schema; approved changes# commit through the individual write tools
Present atomic proposed CRM updates for field-by-field approval — from a transcript, a prompt, or any source.
Single-call view of everything Claude needs to reason about a record.
get_context { "type": "contact","id": "6f2c…" }
Answer a question ABOUT CAPABLE ITSELF — how-to, setup, or troubleshooting (e.g. 'how do I connect Claude', 'why didn't this email become a contact', 'what can each role do', 'how do I build a report').
Run a report and return its rows or grouped aggregates.
run_report { "definition": { "version": 1, "object": "touch","group_by": { "ref": { "kind": "field", "field": "type" } },"aggregations": [{ "fn": "count", "alias": "n" }] } }
Export a report's results as CSV through the single audited egress path.
Schedule a saved report to be emailed as a digest (CSV attached) to workspace members on a daily / weekly / monthly cadence (UTC).
Draft a quote on an account from a SELECTION of catalog products + quantities.
Update a quote: change its status (draft → sent → accepted / lost), link an opportunity, or replace its line items.
Create a new custom object TYPE (e.g. Partner, Product, Investor) that Claude can then operate on via create_record/update_record/search_record.
Rename or reconfigure a custom object type by key — change its label, plural, blurb, icon, shared-write mode, enabled flag, or display_field (the data key holding a record's display name; null resets to the 'name' default) — and/or set its sidebar-menu visibility (show_in_menu: navigation only — true pins the object into the web app's menu, false removes its menu row while the object stays fully usable everywhere else).
Soft-delete (archive) a custom object type by key.
Add a custom field to any object that supports them (core objects with custom fields, or any custom object).
Patch a custom field by object_type + key — change its label or choice options.
Add or relabel a value for a built-in enum field (e.g. account.lifecycle_stage, opportunity.type, subscription.status, touch.type, task.priority).
Create an additional pipeline (a named stage sequence) for opportunities or a custom object.
Update a pipeline by pipeline_key (or pipeline_id; id wins if both are given) — rename it (label), re-point it (applies_to), replace its stages, or set which opportunity types default to it (default_for_types).
Archive (soft-delete) a named pipeline by pipeline_key (or pipeline_id; id wins if both are given).
Create a top-level program (a parallel workstream like Investor Relations or Partnerships, a peer of the built-in Revenue motion).
Create a derived-metric rollup that aggregates a custom source object onto a target field (e.g. usage_revenue = sum of usage records onto an account field).
Create an automation rule: when trigger_event fires (record.written) and condition_spec matches, run action_tool with action_args (a {{placeholder}} template over the trigger facts).
Apply a curated schema template from this workspace's template registry — a pre-vetted bundle of objects, fields, pick-list values, pipelines, and starter views — in one step.
Learn the complete shape of this CRM workspace in one call: its objects and their fields (built-in + custom), the valid values for each field (with each value's semantic role where it has one), how objects relate (the FK graph), the pipelines and their stages, the active motions, and the qualification framework (plus the programs, rollups, automation rules, and Phase 4 flags).
The API is the agent’s own door, so it carries the agent’s own discipline: metered, additive, governed, audited — the same rulebook, whoever is calling.
get_context, search_records, run_report…
create_record, log_touch, update_record…
the heavy reads — exports, wide summaries
Every tool declares its tier. Over the limit, the call is refused with a machine-readable budget — tier, limit, remaining, seconds to reset.