Capabledevelopers
capable//developers · public api

Capable’s API is MCP.

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.

endpointhttps://crm.capable.run/api/mcp
streamable http
works with
ClaudeClaude CodeClaude DesktopMCP Inspectoryour own agent
connect in one line
# 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.

Generated from the live tool catalog — these docs cannot drift.
1

Connect

Point any MCP client at the endpoint — Streamable HTTP, discovery built in.

2

Authorize

OAuth 2.1 for apps, personal access tokens for scripts — full or read-only scope.

3

Work

The same 48 tools the agent uses, through the same rulebook — role, scope, policy, audit.

02#authentication

Two credentials, one door.

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.

OAuth 2.1

for apps
  • Dynamic client registration (RFC 7591) — clients register at runtime; no manual key exchange.
  • PKCE on every grant, discovery via RFC 8414 / RFC 9728 metadata.
  • Access tokens live 1h; refresh tokens rotate on every use and cap at 30d — a replayed refresh token revokes its whole family.

Personal access tokens

for scripts
  • Minted in Settings → You, scoped to you in one workspace — shown once, cpbl_pat_…, hashed at rest (SHA-256).
  • Pick the scope at mint — full or read-only — and an optional expiry; revoke anytime from the same panel.
  • Identity and workspace ride the token — never the request.

Two scopes

#scopes
crm:fullFull access

Every listed tool — reads, writes, schema. Still bounded by the caller's role, write scope, and workspace policies.

  • The default — the standard Claude connection runs on it
  • Writes remain subject to role + per-record write scope
  • Admin governance policies apply on top, unchanged
crm:readRead-only

Every read tool — including read-type exports (CSV) — and nothing that writes.

  • Writes are refused before governance — a read-only credential can never queue a write for approval
  • Exports still ride the audited egress path (row caps, redaction)
  • An unrecognized scope authorizes nothing — the guard fails closed

Scopes narrow; they never grant. Whatever the credential, workspace governance policies and per-record write scope still apply on top.

Token lifetimes

credentiallifetime
OAuth access token1 hourrefresh on demand
OAuth refresh token30 daysrotates on every use; a replayed token revokes the family
Personal access tokennone · 30 · 90 · 365 daysyour call at mint; revoke anytime — expiry is encouraged for script keys
connect claude
# claude.ai → Settings → Connectors
# → Add custom connector
Name Capable
URL https://crm.capable.run/api/mcp
# consent screen shows the requested
# scope; approve once per workspace.
connect claude code
$ claude mcp add --transport http \
capable https://crm.capable.run/api/mcp
# registers via OAuth dynamic client
# registration (RFC 7591) + PKCE.
scripts · bearer pat
# 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.

04#tools

Tools, grouped by job.

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.

Onboarding

3 tools

start_onboarding

read

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).

show_workspace_setup

read

Render the interactive workspace-setup card so the user can confirm the motion(s) you recommended, name the workspace, and Save.

finalize_workspace_setup

idempotent

Commit onboarding answers into the workspace config.

Accounts

3 tools

add_account_contact

create

Link a contact to an account with a role (champion / economic_buyer / decision_maker / user / blocker / influencer / csm_primary).

remove_account_contact

destructive

Unlink a contact from an account (the contact and the account themselves are kept).

update_account_health

update

Set the customer health score (0-100) on an account.

Opportunities

2 tools

get_pipeline_summary

read

Aggregate roll-up of the workspace's opportunities and revenue.

set_opportunity_products

update

Set the products on an opportunity so its VALUE derives from them (replace-all).

Subscriptions

2 tools

renew_subscription

idempotent

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_subscription

destructive

Cancel a subscription.

Touches

1 tool

log_touch

create

Record an activity (call / email / meeting / LinkedIn).

log_touch { "type": "call", "contact_id": "6f2c…",
"summary": "Kickoff — scope agreed" }

Signals

1 tool

get_expansion_candidates

read

Ranked list of CUSTOMERS that look under-monetized versus firmographically-similar customers in this workspace (low ARR-per-employee for their headcount).

Recorder

2 tools

record_meeting

create

Send the Capable notetaker bot to a video call.

stop_recording

destructive

Pull the notetaker bot out of a call and cancel the recording.

Scheduling

5 tools

find_times

read

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" }

propose_meeting

create

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.

send_meeting_invite

update

Sends the picker email to the invitee.

cancel_meeting

destructive

Cancel a meeting — DESTRUCTIVE: confirm with the user first.

reschedule_meeting

update

Move an ALREADY-CONFIRMED (booked) meeting to a new time, in place.

Universal

10 tools

add_note

create

Attach a free-form note to any record (account / contact / opportunity / touch).

get_record

read

Fetch the full detail of any record by id.

get_record { "type": "task", "id": "91ab…" }

create_record

create

Create a record of ANY object type.

create_record { "object_type": "partner",
"data": { "name": "Globex" } }

update_record

update

Patch fields on a record by id.

update_record { "object_type": "task", "id": "91ab…",
"data": { "status": "done" } }

search_records

read

List/filter records of any object type.

search_records { "object_type": "contact",
"query": "lindqvist" }

delete_record

destructive

Archive (soft-delete) a record by object_type + id.

propose_updates

readthe wedge — propose, approve, commit

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

review_proposed_updates

read

Present atomic proposed CRM updates for field-by-field approval — from a transcript, a prompt, or any source.

get_context

read

Single-call view of everything Claude needs to reason about a record.

get_context { "type": "contact",
"id": "6f2c…" }

get_help

read

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').

Reports

3 tools

run_report

read

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_report

read

Export a report's results as CSV through the single audited egress path.

schedule_report

update

Schedule a saved report to be emailed as a digest (CSV attached) to workspace members on a daily / weekly / monthly cadence (UTC).

Quoting

2 tools

create_quote

create

Draft a quote on an account from a SELECTION of catalog products + quantities.

update_quote

update

Update a quote: change its status (draft → sent → accepted / lost), link an opportunity, or replace its line items.

Schema

14 tools

define_object

create

Create a new custom object TYPE (e.g. Partner, Product, Investor) that Claude can then operate on via create_record/update_record/search_record.

update_object

update

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).

archive_object

idempotent

Soft-delete (archive) a custom object type by key.

define_field

create

Add a custom field to any object that supports them (core objects with custom fields, or any custom object).

update_field

update

Patch a custom field by object_type + key — change its label or choice options.

define_enum_value

idempotent

Add or relabel a value for a built-in enum field (e.g. account.lifecycle_stage, opportunity.type, subscription.status, touch.type, task.priority).

define_pipeline

create

Create an additional pipeline (a named stage sequence) for opportunities or a custom object.

update_pipeline

update

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_pipeline

idempotent

Archive (soft-delete) a named pipeline by pipeline_key (or pipeline_id; id wins if both are given).

define_program

create

Create a top-level program (a parallel workstream like Investor Relations or Partnerships, a peer of the built-in Revenue motion).

define_rollup

create

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).

define_automation

create

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_template

idempotent

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.

describe_schema

read

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).

48 tools · one door — the count is computed from tools/list, never typed.
05#limits

Built to be trusted with the door open.

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.

Rate limits

per workspace × user · rolling minute
read
120req/min

get_context, search_records, run_report…

write
60req/min

create_record, log_touch, update_record…

expensive
20req/min

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.

Additive-only outputs

A tool’s result only gains fields — existing fields don’t disappear or change meaning. Build against today’s shapes and tomorrow’s release won’t break them.

Admins hold the keys

Workspace admins can gate any tool behind approval, deny it outright, or cap exports per role — and API traffic obeys the same policies as every other door. Tokens are revocable the moment they should be.

Every call leaves a row

Tool, actor, workspace, source, outcome — reads and writes, denials included. Exports ride a single audited egress path with per-role row caps and column redaction.

One door, honestly

MCP is the whole API — there is no separate REST surface or webhook fan-out to fall behind it. What the agent can do, your agent can do; nothing more, nothing hidden.

What every call passes through

#governance
rate limitsuspensiontoken scopeobject gatepolicyfield valueswrite scopehandleraudit