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:
get_account_evidence(domain)returns numbered, cited evidence. Optionalnews_dayswidens or narrows the news window (clamped 7-365, default 90).score_account(...)takes your four 1-5 axis scores and returns the weighted total and verdict. Unrationed: pure arithmetic, no LLM call.icp://rubricandicp://eval-reportare readable resources: the live rubric this server scores against, and the eval calibration narrative behind its groundedness numbers.
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.