Debriefer
Recipes

Let an agent run an interview

Wire an autonomous agent to create, launch, and read Debriefer interviews via MCP.

Your autonomous agent just detected a churn signal in account data. It needs qualitative input — why did this customer stop expanding? — and it needs it without a human in the loop.

This is the pattern MCP was built for: the agent is the creator, the human is the respondent, Debriefer is the interface.

The pattern

sequenceDiagram
    participant Agent as Your Agent
    participant MCP as Debriefer MCP (HTTP)
    participant Human as Respondent
    Agent->>MCP: initialize (Bearer key)
    MCP-->>Agent: Mcp-Session-Id
    Agent->>MCP: scaffold_interview
    MCP-->>Agent: blueprint_id, hosted_url
    Agent->>MCP: launch_interview(respondent)
    MCP-->>Human: hosted conversation link
    Human-->>MCP: completes interview
    MCP-->>Agent: webhook / get_interview_summary
    Agent->>Agent: acts on structured data

Step 1. Connect to the MCP HTTP endpoint

Use the official MCP SDK. The server you're connecting to is your own deployment of @debriefer/mcp-server in HTTP mode (see Transports).

import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';

const transport = new StreamableHTTPClientTransport(
  new URL('https://mcp.debriefer.ai/mcp'),
  {
    requestInit: {
      headers: { Authorization: `Bearer ${process.env.DEBRIEFER_API_KEY}` },
    },
  },
);

const client = new Client({ name: 'my-agent', version: '1.0.0' }, { capabilities: {} });
await client.connect(transport);

Step 2. Scaffold the interview

const { content } = await client.callTool({
  name: 'scaffold_interview',
  arguments: {
    topic: 'expansion churn on account ' + accountId,
    question_count: 4,
    modality: 'voice',
  },
});

const { blueprint_id, hosted_url } = JSON.parse(content[0].text);

One call creates the agent, draft blueprint, graph, and publishes it.

Step 3. Launch one interview per respondent

for (const stakeholder of accountStakeholders) {
  await client.callTool({
    name: 'launch_interview',
    arguments: {
      blueprint_id,
      participant: { email: stakeholder.email, name: stakeholder.name },
      channel: { kind: 'voice' },
    },
  });
}

Each call creates a channel and a run. Debriefer emails the hosted link to each respondent.

Step 4. Wait for completion

Two options. Poll:

const run = await client.callTool({
  name: 'get_interview_run',
  arguments: { id: runId, expand: ['responses', 'analysis'] },
});

Or subscribe — register a webhook on the Debriefer API so your agent is woken up when runs complete. See the Debriefer API's webhooks documentation for the full event list.

Step 5. Read the results and act

const { content } = await client.callTool({
  name: 'get_interview_summary',
  arguments: { blueprint_id },
});

const { themes, sentiment, verbatims } = JSON.parse(content[0].text);

if (sentiment.negative_ratio > 0.5) {
  await triggerRetentionPlaybook(accountId, themes);
}

Structured data in, structured decision out. The agent never needed to read a transcript.

Why this matters

AI agents manage increasingly complex workflows — product roadmaps, customer success pipelines, hiring funnels, compliance monitoring. They hit decision points where they need human judgment.

An agent can't call a meeting. It can't run a focus group. But it can call the Debriefer MCP server, get structured input from real humans in minutes, and keep going.

That's the thing Debriefer does that nothing else does.

On this page