Agent feedback: what agents needed and couldn't find (opt in)

View as Markdown

An AI agent working through your MCP server sometimes gives up because the tool it needs isn't there, a field is missing, or a step doesn't work. Agent feedback lets it tell you, in its own words, in one or two sentences. Each note shows in Issues (category Agent feedback), on the MCP session in Sessions, and in the bell.

This is the one place Telltale keeps text an agent wrote, so it is off by default in two places, and both must agree:

  1. A workspace owner or admin turns it on in Settings › Data & privacy › Agent feedback. The change is recorded in the audit log.
  2. Your MCP server asks for it: Telltale for MCP servers 1.3.0 or later with feedback: true. The SDK checks GET /api/v1/agent-feedback/state when it starts (and again at most every five minutes) and lists the tool only while the workspace has it on.

Turn it on

Download the MCP adapter and its companion files into lib/telltale/ first.

JavaScript
import {withTelltale} from './lib/telltale/mcp.js';

withTelltale(server, {
  endpoint: 'https://app.trytelltale.dev',
  serverKey: process.env.TELLTALE_SERVER_KEY,
  identify: ctx => ({accountId: ctx.authInfo?.extra?.accountId}),
  feedback: true, // or {name: 'report_missing_capability'}
});

Your server's tools/list then ends with one more tool, agent_feedback (or the name you chose), with a single required argument, needed: "What you needed and could not find, in one or two sentences." The SDK answers that tool itself. It never reaches your own handlers, and it is never counted as a call in Tools, Issues or chargeable use. If your server already has a tool with that name, yours wins and the SDK adds nothing.

What is kept, and what isn't

What it never does

Where you see it

Sending it yourself

If you don't use the SDK, send a note with your server key:

HTTP
POST /api/v1/agent-feedback
Authorization: Bearer <server key>
Content-Type: application/json

{"eventId": "fb_7d1c2e9a40", "text": "I needed a bulk refund tool", "accountId": "acct_123"}

eventId makes a retry the same note. Optional fields: tool, at, client {name, version}, userId and session {key, source} (the same SHA-256 grouping key the SDK sends with calls). Unknown fields are refused. The answer is {"stored": true} or {"stored": false, "reason": "off"}.