Docs

ICP

What it does

ICP defines who a motion is for, so fit scores and win rate sit on the same profile instead of in a slide.

Open ICP (/marketing-icp). Three blocks share the page: profile versions, a fit-and-intent grid, and a win-rate card. Drafting a new version does not activate it. Activation waits on an approval, the same pattern as a charter. The screen is a thin client over the session routes. Agents call the MCP tools and land on the same rows.

Attaching profiles to a campaign is campaign_icp_set, documented with the tools below and on Campaigns.

MCP tools

ToolScopeRole
icp_listicp:readList versions. Filters: status, slug, include_criteria, limit
icp_geticp:readOne profile and its version history
icp_propose_versionicp:writeDraft a version. Activation waits on an approval
account_fit_scoreicp:writeScore an account and write the fit fields
accounts_by_tiericp:readAccounts in a fit tier
campaign_icp_setcampaigns:writeAttach profiles to a campaign

HTTP endpoints

MethodPathRole
GET, POST/cockpit/api/icp-profilesList, or propose a version. ?slug=&history=1 loads history
GET/cockpit/api/icp-fit-intentFit and intent grid
GET/cockpit/api/icp-win-rateWin-rate summary

The fit and win-rate routes are read-only. Scoring an account is the MCP tool, not a button that bypasses it.

Permissions

Token scopes come from one permission-set layer. Reading needs icp:read. Proposing a version or writing a fit score needs icp:write. Linking a campaign needs campaigns:write. The screen uses the signed-in session.

Row access is RLS by creator. Admins see all rows. Members see their own.

Agent example

Call icp_propose_version with a slug. Reusing a slug drafts the next version. It does not publish.

{
  "tool": "icp_propose_version",
  "arguments": {
    "slug": "mid-market-ops",
    "name": "Mid-market operations",
    "summary": "Operators who own data quality for more than one system.",
    "criteria": {
      "industry": ["software"],
      "segment": ["mid-market"]
    }
  }
}

Expected result: a draft version and a pending approval. The fit grid does not use that version until the card is approved.

{
  "ok": true,
  "status": "draft",
  "slug": "mid-market-ops"
}