MCP Integration

Connect your AI agent to your developer data.

The Built for Devs MCP integration gives any AI agent direct access to everything your dashboard shows: your adoption score and the layers it stands on, agent evaluation runs, recommendations with evidence, your developer funnel, friction signals, error groups, TTV trends, session data, and evaluation reports. All scoped to your account, no manual exports required.

What it enables

Ask your AI agent about your developers

Once connected, your AI agent can answer questions about your developer experience directly from your real data.

“What is our adoption score standing on, and how has it moved over the last quarter?”

“How agent-ready are we? Where did the AI agent get blocked on its last run?”

“Which recommendations are still open, and what evidence backs each one?”

“What audience should we target next? Suggest a complementary ICP we are not already covering.”

“Where are developers dropping off in my onboarding funnel?”

“Which pages are developers rage-clicking? What does that tell us?”

“Has our TTV improved over the last 6 months?”

“Which JavaScript errors correlate with developers abandoning their session?”

“Walk me through everything developer sarah@acme.com has done in our product.”

“What did the last evaluation report say about our auth setup?”

“What are developers copying most from our docs? Show me the pages and previews.”

Step 1

Get your MCP API key

Go to Settings → Tracking Script and find the MCP Integration card. Your MCP API key is listed there alongside your endpoint URL.

Your MCP key is separate from your tracking script API key. It authenticates AI agent connections to your account and can be rotated independently if needed.

Endpoint

https://builtfor.dev/mcp

Auth header

X-BFD-MCP-Key: <your-key>
Get your MCP key →
Step 2

Connect your AI client

The MCP integration uses the Streamable HTTP transport, which is supported by Claude Code, Claude Desktop, Cursor, and any other client that supports MCP over HTTP.

Claude Code

Add the following to your .mcp.json file in your project root, or to ~/.claude.json for global access:

{
  "mcpServers": {
    "builtfordevs": {
      "type": "http",
      "url": "https://builtfor.dev/mcp",
      "headers": {
        "X-BFD-MCP-Key": "<your-mcp-key>"
      }
    }
  }
}

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "builtfordevs": {
      "type": "http",
      "url": "https://builtfor.dev/mcp",
      "headers": {
        "X-BFD-MCP-Key": "<your-mcp-key>"
      }
    }
  }
}

Cursor

Go to Cursor Settings → MCP → Add new global MCP server and paste:

{
  "builtfordevs": {
    "type": "http",
    "url": "https://builtfor.dev/mcp",
    "headers": {
      "X-BFD-MCP-Key": "<your-mcp-key>"
    }
  }
}

After saving, restart your AI client. The Built for Devs tools will appear automatically, and your agent can start using them immediately without any additional setup.

Tools

What your agent can access

Adoption Score

read-only

get-adoption-score

Returns your living adoption score: a 0 to 100 synthesis of the three layers Built for Devs measures. Agent readiness comes from the latest agent evaluation run per ICP, human evaluation from the latest published findings report, and live signal from real developer sessions hitting your TTV definition. The response shows exactly what the score stands on: per layer, whether data was available, the layer sub-score, how fresh the reading is, and the supporting details behind it. It also includes the movement history, so you can see how the score has changed over time and what triggered each recompute. Pass history_limit to control how many past readings come back (default 12, max 52). Use this as the single number to track, and drill into the layers when you want to know why it moved.

Agent Evaluation

read-only

get-agent-evaluation

Returns agent evaluation runs: automated sessions where an AI agent attempts your onboarding the way a real developer would, once per ICP. By default you get the latest finished run per ICP, which includes both completed runs and runs that ended Blocked because the agent hit a wall it could not cross on its own (a CAPTCHA, email verification, or a payment gate); failed and unfinished runs are excluded. Each run exposes its status (complete or blocked), whether the agent reached time to value and how long it took, every point where it got blocked and what a human would have needed to do, time spent per journey stage, whether your CLI and docs were accessible to an agent, the agent-friendliness score, and a narrative summary of what the agent could and could not do. Each run also returns facets: a per-resource agent-readiness checklist, judged in the ICP's persona, marking each of docs, quickstart, cli, sdk, apiReference, codeExamples, apiKey, and mcp as accessible, not_found, not_applicable, or null when the agent did not assess it. Alongside the narrative you get friction_items and improvement_items — severity-ranked lists (high, medium, low) of exactly where the agent hit friction and what it would change — and what_was_missing, the persona-relative gaps: the resources this developer needed and could not find. Runs also return code_executions: the exact terminal transcript the agent ran in its sandbox — the commands it issued with their stdout, stderr, and exit codes, already redacted and truncated — so your own AI agent can see precisely what was executed. Pass icp_id to focus on one ICP, or agent_evaluation_id for a specific run regardless of status. Use this to answer the question your customers are already asking: can an AI coding assistant actually use this product?

Recommendations

read-only

get-recommendations

Returns the recommendations Built for Devs generates from your data, each with cited evidence: which layer it came from (agent readiness, human evaluation, or live signal), the specific data sources behind it, and the expected impact. Nothing here is generic advice; every recommendation traces back to something observed in your product. Each one carries a deliverable_type (content_pr, strategy_doc, or advisory), a scope describing exactly what a paid result would deliver, and quote_cents — the engine-quoted price for a content_pr result, the flat price for a strategy_doc, and null only for advisory recommendations you can act on yourself. Once a result is purchased, the recommendation includes its result status (queued, in_progress, or delivered) and the delivered artifact URL. Completed recommendations include the outcome: TTV before, TTV after, the delta, and whether the change moved the needle. Filter with status (active, completed, dismissed, or all; default active); results come back newest first alongside per-status counts. Use this to pull your open DX backlog straight into your planning workflow, or to report on which past changes actually paid off.

Product Profile

read-only

get-product-profile

Returns the product profile detected during onboarding enrichment: your docs URL, pricing model, product category, and positioning summary, along with the evidence behind each detection. When you have confirmed the profile, is_confirmed is true and any corrections you made are included. This is the context agent evaluations and recommendations are grounded in, so it is useful for verifying that Built for Devs understands your product the way you do.

ICPs

read-only

list-icps

Lists the Ideal Customer Profiles defined for your product. Each ICP describes a developer persona the weekly agent evaluation runs as: the matching criteria (role, seniority, languages, frameworks) and the persona the agent embodies during its run. Each entry includes the latest finished agent evaluation for that ICP (completed or blocked), so your agent can chain straight into get-agent-evaluation for the full report. Use this to see who your product is being evaluated as, and to compare agent-readiness across the audiences you care about.

Suggest ICP

read-only

suggest-icp

Suggests the next-best, complementary audience for your product: a distinct developer persona you are not already targeting, grounded in your product profile and the ICPs you already have. Deciding who else to target is one of the hardest calls a developer-tool team makes, and this puts an opinionated starting point in front of you. Returns the suggestion as data — a label, the evaluation persona (title and narrative), the full taxonomy criteria (role, seniority, languages, frameworks, stack, industries, company and team size, buying influence, and more), and a short rationale for why it broadens your coverage — alongside your current plan slot usage (used and remaining) so your agent knows whether a slot is even free. This tool is advisory and read-only: it does not create the ICP. Review the suggestion, tweak it, and create it from the Manage ICPs page in your dashboard — the same one-click flow the Suggest ICP button uses there.

Error Groups

read-only

get-error-groups

Returns JavaScript errors from real developer sessions, grouped by normalized error message. Each group includes occurrence and session counts, first and last seen timestamps, the top pages where the error fires, and a drop-off correlation: the share of affected sessions that showed no further activity after first hitting the error. That correlation is the difference between an error that is noise and an error that is costing you developers. Bots, internal traffic, and agent evaluation sessions are excluded. Pass days (1 to 90, default 30) to control the window; results are paginated. Use this to prioritize which errors to fix first based on real impact, not raw counts.

Developer Journey Funnel

read-only

get-developer-funnel

Returns your complete developer journey funnel from the most recent snapshot. Agent evaluation sessions, bots, and internal traffic are excluded, so the numbers reflect real developers only. Includes session counts, drop-off rates, and average time spent at each of the seven stages: Discovery, First Impression, Onboarding Setup, First Value, Adoption, Expansion, and Advocacy. Also returns a list of all identified developers who have been observed in your product, with their current journey stage and last seen timestamp. Use this as the starting point to understand the overall health of your developer onboarding: where developers are getting stuck, how long the critical path to first value actually takes, and which stage has the worst drop-off.

Friction Signals

read-only

get-friction-signals

Returns aggregated behavioral friction signals from the last 30 days, grouped by type and page. Built for Devs tracks four categories of developer frustration that most analytics tools miss entirely: rage clicks (rapid repeated clicks in the same spot, indicating broken or confusing UI), copy events (what developers are copying and from which pages, with a 40-character preview; when a key or token is detected the preview is suppressed and replaced with a key_type label like "API key" or "Bearer token" so you know what they found without seeing the value), JavaScript errors (uncaught exceptions and unhandled promise rejections with filename and line number), and scroll depth patterns (how far developers scroll on key pages before leaving). Use this to surface exactly where your developer experience is breaking down, which pages are causing the most frustration, and what content developers are extracting for later use.

TTV Trend

read-only

get-ttv-trend

Returns time to value (TTV) trend data for your product, broken down by month, showing whether developer onboarding is getting faster or slower over time. TTV measures the median time in seconds from a developer's first session to the moment they reach your defined "first value" event, the moment they've successfully built something meaningful with your product. Pass months (1–12) to control the lookback window; default is 6 months. Each data point includes the month, the median TTV in seconds, the number of developers who reached first value that month, and a comparison delta versus the prior period. Use this to measure the long-term impact of developer experience improvements. If you rewrote your getting started guide, this is where you'd see whether it worked.

Developer Session

read-only

get-developer-session

Returns a complete behavioral profile for a specific developer or a single session. Pass a developer_id (the identifier you set via BFD.identify()) to retrieve every session that developer has had across your product: their full journey, every page visited, time spent per page, and any friction events encountered. Pass a session_id to drill into a single session. Each session includes an AI-generated narrative summary of what the developer was doing and where they got stuck, a chronological list of pages visited with timestamps, a breakdown of event types that occurred, and details on any rage clicks or JavaScript errors. Single-session responses carry the agent/human dimension: is_agent_session is true when the session came from an agent evaluation run rather than a real developer. Use this when a specific developer reports a problem, when you want to understand why someone churned, or to build an accurate mental model of what onboarding actually feels like in practice.

Evaluation Report

read-only

get-evaluation-report

Returns the published findings report from a completed evaluation project. Built for Devs evaluation projects are live sessions where real developers attempt to build something with your product while their screen is recorded. After transcription and AI analysis, a structured findings report is generated. This tool exposes that report: the executive summary, a scored rubric across key developer experience dimensions, critical blocking issues, quick wins that would have the highest impact, specific things developers praised, and the full narrative report. Pass a project_id from your Evaluations page. Recording files and raw transcripts are never exposed. Use this to bring your evaluation findings directly into your planning workflow: have your AI agent summarize findings into Linear issues, prioritize them against your roadmap, or write a post-mortem.

Query Events

read-only

query-events

Raw, paginated access to your tracking events with full filtering. Supports filtering by date range (max 90 days), event type (pageview, click, scroll_depth, copy, rage_click, js_error, form_focus, form_submit, return_visit, external_link, time_on_page), page URL (partial match), session ID, or developer ID. Returns up to 200 results per page. Bots and internal traffic are always excluded. Agent evaluation sessions are excluded by default; pass include_agent_sessions to include them, and use the agent_evaluation_id field on each event to tell agent traffic from human traffic. Each event includes the URL it occurred on, its type, a timestamp, the session ID, the developer's identifier (if identified), and a metadata field whose contents vary by event type. See the event reference on this page. Use this when you have a specific question the higher-level tools don't answer: "show me every form_submit event on the quickstart page in the last two weeks," "what pages did this session visit before they hit a JS error," or "how many developers clicked this specific button."

Developer CRM

Identify developers across sessions

By default, Built for Devs tracks developers anonymously by session. To unlock per-developer views in the MCP and in your dashboard, call BFD.identify() when a developer authenticates in your product.

Example

// Call this after the developer logs in
BFD.identify('sarah@acme.com');

// Or use any stable identifier: user ID, UUID, hash
BFD.identify('usr_8f3k2m9x');

The identifier is your choice: an email address, a user ID, a hashed value, whatever fits your privacy model. Built for Devs doesn't prescribe the format and doesn't cross-reference it with any external data.

Once a developer is identified, you can ask your AI agent to pull their full history across every session:

“Show me everything developer sarah@acme.com has done in our product, and flag any errors or friction points she hit.”

Their complete session history, every page visited, every error encountered, every rage click, is available through get-developer-session and query-events filtered by their identifier.

Event reference

What each event contains

The metadata field returned by query-events varies by event type. Every event also includes the URL it occurred on, the session ID, the developer ID (if identified), and a timestamp.

pageview Fired on every page load. Referrer URL is in the referrer field on the event.
click Fired on interactive elements (buttons, links, inputs).
tag HTML element tag (button, a, input, etc.)
text Visible text of the element, up to 50 characters.
href Link destination, if applicable.
external_link Fired when a developer clicks a link leaving your domain.
tag HTML element tag.
text Link text, up to 50 characters.
href Full destination URL.
destination_hostname The external domain being navigated to.
rage_click Fired when 3+ clicks occur within 700ms in a 40px radius, a strong frustration signal.
tag Element tag at the click location, if interactive.
text Element text, up to 50 characters.
x / y Pixel coordinates of the click cluster.
click_count Number of rapid clicks detected.
is_interactive Whether the clicks landed on an interactive element.
copy Fired when a developer copies text on the page.
preview First 40 characters of the copied text. Null when key_type is set.
length Total character count of the copied selection.
key_type Credential type detected, e.g. "API key", "Secret key", "Bearer token", "JWT". Null when nothing was detected.

Key detection runs client-side before transmission. When a key is detected, preview is suppressed at the source and key_type tells you what category of credential the developer copied. Useful signal for understanding where they are in your onboarding (e.g. a developer copying an API key from your quickstart page is a strong first-value indicator).

scroll_depth Fired at 25%, 50%, 75%, 90%, and 100% scroll milestones.
percent Scroll milestone reached (25, 50, 75, 90, or 100).
js_error Fired on uncaught JavaScript errors and unhandled promise rejections.
message Error message, up to 200 characters.
filename Source file where the error occurred, up to 200 characters.
lineno / colno Line and column number of the error.

event_name is set to unhandled_rejection for promise rejections.

form_focus Fired when a developer focuses a form (intent to fill it out).
form_id The form's id attribute, if set.
form_name The form's name attribute, if set.
form_submit Fired when a form is submitted.
form_id The form's id attribute, if set.
form_name The form's name attribute, if set.
action The form's action path (path only, no domain or query params).
time_on_page Fired when the developer leaves the page. Duration in seconds is in the time_on_page field on the event.
return_visit Fired alongside a pageview when the developer has visited this page before in a prior session.
Security

Your data stays yours

Every MCP request is authenticated against your account. An AI agent using your MCP key can only ever see data scoped to your product. No other account's data is accessible, regardless of what's requested.

All thirteen tools are read-only. No agent can write, delete, or modify any data through the MCP integration — the suggest-icp tool is advisory only and never creates an ICP
Session recording files and transcripts are never exposed through any MCP tool
When a developer copies something that looks like an API key or token, the value is suppressed before it ever leaves their browser. You receive a key_type label ("API key", "Secret key", "Bearer token") so you understand what the developer found without seeing the value. This is always on and cannot be disabled.
Your MCP key can be found in Settings and treated like any API key: keep it out of version control and rotate it if compromised

Ready to connect?

Get your MCP key from Settings, add it to your AI client, and start asking questions about your developer experience.

Get your MCP key →