Documentation
MCP server
Connect an AI assistant you already use — Claude, ChatGPT, Cursor, or VS Code — to Client Posture with a per-person API key. We host no model and do not pay for tokens. The assistant can read your organization's data and, on Pro, draft quotes. It cannot send, accept, or delete.
Included with Pro and Founding Partner. Try it free: 7 days of Pro, no card.
Start freeWho can use it
Gating matches the live MCP server. See pricing.
| Plan | MCP access |
|---|---|
| Free | None |
| Starter | None |
| Founding Partner | Same as Pro except quote drafts. Per-person API keys. No sends, accepts, or deletes. |
| Pro | Connect Claude or ChatGPT through MCP to read your org's scans, findings, and prospects, and draft quotes. Per-person API keys. No sends, accepts, or deletes. |
- Create a key in Settings › AI assistants.
- Founding Partner who later upgrades to Pro gets quote drafts as well (quoting is Pro-only).
- Founding Partner can add prospects in the app and through MCP. Quote drafts stay Pro-only.
Supported clients
| Client | API key |
|---|---|
| Cursor | Yes |
| VS Code (Copilot agent mode) | Yes |
| Claude Code | Yes |
| Claude Desktop | Yes |
| ChatGPT desktop | Yes |
| claude.ai / ChatGPT web | Not yet. OAuth on a separate /mcp endpoint is deferred. |
Quick start
- Create a key in Settings › AI assistants. Copy it once.
- Paste a snippet below. Endpoint:
https://www.clientposture.com/api/mcp - Try the prompt “Run the morning risk digest.”
Cursor
Put the key in CLIENT_POSTURE_API_KEY so it is not synced in mcp.json.
{
"mcpServers": {
"client-posture": {
"url": "https://www.clientposture.com/api/mcp",
"headers": { "Authorization": "Bearer ${env:CLIENT_POSTURE_API_KEY}" }
}
}
}VS Code (Copilot agent mode)
Use mcp.json (not .mcp.json). VS Code prompts once and stores the key.
{
"inputs": [
{ "type": "promptString", "id": "cp-key", "description": "Client Posture API key", "password": true }
],
"servers": {
"client-posture": {
"type": "http",
"url": "https://www.clientposture.com/api/mcp",
"headers": { "Authorization": "Bearer ${input:cp-key}" }
}
}
}Claude Code
Replace the key after you create one.
claude mcp add --transport http client-posture https://www.clientposture.com/api/mcp \ --header "Authorization: Bearer cp_live_XXXX"
Claude Desktop
Requires Node.js 18+. No space after Authorization:. Restart Claude after saving.
{
"mcpServers": {
"client-posture": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://www.clientposture.com/api/mcp",
"--header", "Authorization:${CP_AUTH}"],
"env": { "CP_AUTH": "Bearer cp_live_XXXX" }
}
}
}ChatGPT desktop
Set CLIENT_POSTURE_API_KEY in the environment that launches the app, then fully restart it.
[mcp_servers.client-posture] url = "https://www.clientposture.com/api/mcp" bearer_token_env_var = "CLIENT_POSTURE_API_KEY"
Tools
Generated from the live tool catalog. 18 read tools and 4 act tools. Read keys see the 18 read tools. Pro act keys see all 22. Founding Partner act keys see 21 tools — everything except create_quote_draft.
get_account_contextreadPro and Founding PartnerWho you are, plan features, remaining MCP budget, and org counts. Call this first.
No arguments
list_clientsreadPro and Founding PartnerList client domains with the latest grade. A client is a domains row; label is the client name.
- query — string
- grade — array
- include_archived — boolean
- sort — string
- limit — integer
- cursor — string
get_domainreadPro and Founding PartnerFull detail for one client domain. Provide domain_id or domain hostname.
- domain_id — string
- domain — string
get_findingsreadPro and Founding PartnerAll checks for a scan (latest by default), with filters.
- domain_id — string
- prospect_id — string
- scan_id — string
- status — array
- min_severity — integer
- category — array
get_grade_historyreadPro and Founding PartnerScore and grade time series for a client domain.
- domain_id (required) — string
- days — integer
compare_scansreadPro and Founding PartnerWhat changed between two scans. Defaults to latest vs previous.
- domain_id (required) — string
- from_scan_id — string
- to_scan_id — string
get_insurance_answersreadPro and Founding PartnerInsurance-readiness answers with provenance. Never returns the client-link token.
- domain_id (required) — string
- include_history — boolean
- category — array
list_prospectsreadPro and Founding PartnerList prospects in the pipeline.
- status — array
- query — string
- include_converted — boolean
- sort — string
- limit — integer
- cursor — string
get_prospectreadPro and Founding PartnerProspect detail, scans, snapshots, and quotes.
- prospect_id — string
- domain — string
pipeline_summaryreadPro and Founding PartnerAggregate of prospects plus quotes for a period.
- days — integer
list_quotesreadPro and Founding PartnerList Fix-it quotes. Public URL is only present when the quote is published.
- status — array
- domain_id — string
- prospect_id — string
- viewed — boolean
- expiring_within_days — integer
- limit — integer
- cursor — string
get_quotereadPro and Founding PartnerQuote detail including lines and tiers. Does not return IP, user agent, or PDF path.
- quote_id (required) — string
list_alertsreadPro and Founding PartnerChange alerts. Read-only: does not mark alerts read.
- since_days — integer
- unread_only — boolean
- domain_id — string
- limit — integer
- cursor — string
list_reportsreadPro and Founding PartnerReports and share links for a domain, plus prospect Security Briefs.
- domain_id — string
- prospect_id — string
- shared_only — boolean
find_grade_dropsreadPro and Founding PartnerWhich client domains got worse in the last N days.
- days — integer
- min_score_drop — integer
- grade_only — boolean
find_stalled_followupsreadPro and Founding PartnerWho viewed a quote, report, or Security Brief but did not accept.
- kind — string
- viewed_at_least_days_ago — integer
- max_age_days — integer
explain_checkreadPro and Founding PartnerStatic reference text for one scanner check. No tenant data.
- check_id (required) — string
get_scan_statusreadPro and Founding PartnerPoll a scan job started with start_scan.
- job_id (required) — string
start_scanactPro and Founding PartnerQueue a rescan of a client domain or prospect. Does not send email. Dedupes work from the last 15 minutes.
- domain_id — string
- prospect_id — string
add_prospectactPro and Founding PartnerAdd a prospect. If scan_now, queues a scan. AI-created snapshots start unshared until a human enables them in the app.
- company_name (required) — string
- domain (required) — string
- contact_name — string
- scan_now — boolean
create_quote_draftactPro onlyCreate a draft Fix-it quote. Never publishes or sends. A human reviews, edits, and publishes in the app. Pro-only.
- domain_id — string
- prospect_id — string
- scan_id — string
enable_share_linkactPro and Founding PartnerCreate a share-link record for a client report or prospect Security Brief. The link stays disabled until a human enables it in Client Posture. This tool never makes a URL publicly accessible. Quotes are out of scope.
- domain_id — string
- scan_id — string
- prospect_id — string
Prompts
qbr_summaryQuarterly business review brief for one client: grade trend, wins, top risks, insurance, open proposals.
morning_risk_digestOvernight digest: what changed, who got worse, stalled proposals, expiring quotes.
prospect_followup_listCall/email list of prospects who viewed but did not move, with a talking point.
explain_finding_for_clientPlain-English explanation of one scanner check for a client conversation.
Security model
- Per-user keys, hashed with HMAC. Shown once, then masked.
- Read vs act. Act tools never send email, publish, accept, or delete.
- Share links created via MCP start disabled until a human enables them in the app. Available on Pro and Founding Partner.
- Org isolation: every query is scoped to the key's organization.
- Every tools/call is written to an audit log (180 days).
- Prompt injection: scan-derived and client-typed strings are sanitized and labeled untrusted_data. They are data, not instructions.
- Which data your AI vendor receives: whatever your assistant fetches is sent to that AI provider under your agreement with them. Client Posture hosts no model.
Limits and errors
- 60 calls/min per key
- 120 calls/min per org
- 2,000 calls/day per org (midnight ET)
- 100 act calls/day per org
- 401 invalid/expired/revoked key · 403 plan or MCP disabled · 429 rate or daily cap
FAQ
Cursor keeps opening OAuth
If a server advertises OAuth discovery, Cursor may ignore your Authorization header. This endpoint 404s OAuth discovery on purpose. Use the key snippet as written.
VS Code dropped my headers
Use mcp.json, not the older .mcp.json plugins format. VS Code stores the key from the promptString input.
401 vs 403
401 means the key is missing, malformed, revoked, expired, or the member left the org. 403 means the org plan does not include MCP, or an admin turned it off.
Rotating keys
Revoke and create a new one. Rotating the server pepper invalidates every key.
Changelog
v1 — API keys on /api/mcp. OAuth on /mcp is deferred.