GTM Research Pipeline

A grounded account-research pipeline, exposed as an MCP server.

This is the live demo tier: given a company domain it retrieves recent, cited evidence (about pages and last-90-day news), numbered so a calling agent can trace every claim back to its source, then the agent scores each ICP axis from that evidence and calls score_account, which computes the weighted total and verdict deterministically. Cited evidence retrieval is rationed to 5 calls per IP per hour and 25 per day; score_account is unrationed pure arithmetic on top of it. The full pipeline (personas, citation-checked outreach) is BYOK and runs locally.

MCP endpoint

https://170.9.7.144.sslip.io/mcp

Connect from Codex

codex mcp add poc-scraper --url https://170.9.7.144.sslip.io/mcp

Connect from Claude Code

claude mcp add --transport http poc-scraper https://170.9.7.144.sslip.io/mcp

Connect from Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "poc-scraper": {
      "command": "npx",
      "args": ["mcp-remote", "https://170.9.7.144.sslip.io/mcp"]
    }
  }
}

Any other MCP client

npx mcp-remote https://170.9.7.144.sslip.io/mcp

First call

Once connected, run the research_account prompt on a domain. In Claude Code that is a slash command:

/mcp__poc-scraper__research_account notion.so

It returns a six-step flow for the agent to follow: retrieve cited evidence, read the rubric, score each ICP axis carrying an [N] citation, call score_account, present the verdict, then propose personas and outreach hooks. To drive the pieces yourself instead:

What comes back

Evidence arrives numbered, and those indices are the citation vocabulary for everything downstream. Real output for notion.so, trimmed:

{
  "retrieval_status": "ok",
  "justifications": [
    {"index": 1, "summary": "Llms",
     "citation": {"url": "https://www.notion.so/llms.txt", "source": "exa"}},
    {"index": 6, "summary": "Notion just turned its workspace into a hub for AI agents",
     "citation": {"url": "https://techcrunch.com/2026/05/13/...", "source": "exa"}}
  ]
}

Score those axes, cite an index in each reason, and score_account returns:

{
  "domain": "notion.so",
  "total": 4.2,
  "verdict": "strong",
  "verdict_description": "Clear ICP fit; prioritize outreach.",
  "weights": {"support_volume": 0.4, "ai_maturity": 0.3,
              "stage_fit": 0.2, "channel_breadth": 0.1},
  "verdict_thresholds": {"strong": 4, "borderline": 2.5, "weak": 0}
}

The weights and thresholds ship with every score, so the total is checkable by hand: 4(0.4) + 5(0.3) + 4(0.2) + 3(0.1) = 4.2, clearing the 4.0 strong threshold. An agent made the judgment; it did not do the arithmetic. Invalid input and provider errors come back as sanitized one-line messages, never stack traces.