Skip to main content
The PromptResult class wraps every response from TestAgent.prompt(). It provides methods to inspect tool calls, performance metrics, errors, and conversation history.

Import

// PromptResult is returned by TestAgent.prompt()
// You don't import it directly

const result = await agent.prompt("...");
// result is a PromptResult

Text Response

text

The final text response from the LLM.
readonly text: string

Value

string - The assistant’s text response. Empty string if no text response.

Example

const result = await agent.prompt("What is 2 + 2?");
console.log(result.text); // "2 + 2 equals 4."

Tool Call Methods

toolsCalled()

Returns the names of all tools that were called.
toolsCalled(): string[]

Returns

string[] - Array of tool names in call order.

Example

const result = await agent.prompt("Add 2 and 3, then multiply by 4");
console.log(result.toolsCalled()); // ["add", "multiply"]

hasToolCall()

Checks if a specific tool was called.
hasToolCall(toolName: string): boolean

Parameters

ParameterTypeDescription
toolNamestringThe tool name to check

Returns

boolean - true if the tool was called.

Example

if (result.hasToolCall("add")) {
  console.log("Addition was performed");
}

getToolCalls()

Returns detailed information about all tool calls.
getToolCalls(): ToolCall[]

Returns

ToolCall[] - Array of tool call objects.

ToolCall Type

PropertyTypeDescription
toolNamestringName of the tool
argumentsRecord<any, any>Arguments passed to the tool

Example

const calls = result.getToolCalls();

for (const call of calls) {
  console.log(`${call.toolName}(${JSON.stringify(call.arguments)})`);
}
// add({"a":2,"b":3})
// multiply({"a":5,"b":4})

getToolArguments()

Returns the arguments passed to a specific tool.
getToolArguments(toolName: string): Record<string, unknown> | undefined

Parameters

ParameterTypeDescription
toolNamestringThe tool name

Returns

Record<string, unknown> | undefined - The arguments, or undefined if tool wasn’t called.
If the tool was called multiple times, returns arguments from the first call. Use getToolCalls() to access all calls.

Example

const args = result.getToolArguments("add");
console.log(args); // { a: 2, b: 3 }

Error Handling

hasError()

Checks if an error occurred.
hasError(): boolean

Returns

boolean - true if an error occurred.

Example

if (result.hasError()) {
  console.error("Something went wrong");
}

getError()

Returns the error message if one occurred.
getError(): string | undefined

Returns

string | undefined - The error message, or undefined if no error.

Example

if (result.hasError()) {
  console.error("Error:", result.getError());
}

Latency Metrics

e2eLatencyMs()

Total wall-clock time for the prompt.
e2eLatencyMs(): number

Returns

number - Milliseconds.

llmLatencyMs()

Time spent waiting for LLM API responses.
llmLatencyMs(): number

Returns

number - Milliseconds.

mcpLatencyMs()

Time spent executing MCP tools.
mcpLatencyMs(): number

Returns

number - Milliseconds.

getLatency()

Returns the complete latency breakdown.
getLatency(): LatencyBreakdown

Returns

interface LatencyBreakdown {
  e2eMs: number;   // Total time
  llmMs: number;   // LLM API time
  mcpMs: number;   // Tool execution time
}

Example

const latency = result.getLatency();

console.log(`Total: ${latency.e2eMs}ms`);
console.log(`LLM: ${latency.llmMs}ms`);
console.log(`Tools: ${latency.mcpMs}ms`);

Token Usage

totalTokens()

Total tokens used (input + output).
totalTokens(): number

inputTokens()

Tokens used for input (prompt + context).
inputTokens(): number

outputTokens()

Tokens generated by the LLM.
outputTokens(): number

Example

console.log(`Input: ${result.inputTokens()}`);
console.log(`Output: ${result.outputTokens()}`);
console.log(`Total: ${result.totalTokens()}`);

Conversation History

getMessages()

Returns the full conversation as a CoreMessage[] array.
getMessages(): CoreMessage[]

Returns

CoreMessage[] - The full conversation message format used by the SDK.

Example

const messages = result.getMessages();

for (const msg of messages) {
  console.log(`[${msg.role}]:`, msg.content);
}

getUserMessages()

Returns only user messages.
getUserMessages(): CoreMessage[]

getAssistantMessages()

Returns only assistant messages.
getAssistantMessages(): CoreMessage[]

getToolMessages()

Returns only tool result messages.
getToolMessages(): CoreMessage[]

Example

const toolMsgs = result.getToolMessages();

for (const msg of toolMsgs) {
  console.log("Tool result:", msg.content);
}

MCP App widget snapshots

getWidgetSnapshots()

Returns HTML snapshot payloads captured during tool execution for MCP Apps (one entry per relevant tool call when replay data was collected).
getWidgetSnapshots(): EvalWidgetSnapshotInput[]

Returns

EvalWidgetSnapshotInput[] — metadata plus inline HTML (before upload) or storage ids after reporting. Empty if no MCP App tools ran or if TestAgent was created without mcpClientManager.

Why the manager matters

MCP App UIs reference HTML via ui.resourceUri. That HTML is fetched with MCP resources/read, which only the connected MCPClientManager can perform. The model’s tool result is not a substitute for that document, so getWidgetSnapshots() stays empty unless you pass the same manager into new TestAgent({ …, mcpClientManager: manager }). When you report results to MCPJam (for example via createEvalRunReporter or PromptResult.toEvalResult()), snapshots are uploaded and linked from the trace so the dashboard can replay widgets offline.

Example

const result = await agent.prompt("Open the chart widget");

const snapshots = result.getWidgetSnapshots();
console.log("Snapshots:", snapshots.length);
// After reporting, snapshots are merged into each eval result's trace on MCPJam

toEvalResult()

Builds an EvalResultInput for MCPJam reporting (messages, spans, tool calls, tokens, optional widget snapshots).
toEvalResult(
  options?: Partial<Omit<EvalResultInput, "actualToolCalls" | "tokens" | "trace">> & {
    failOnToolError?: boolean;
  },
): EvalResultInput
The passed field combines your explicit or inferred structural outcome with tool execution checks (see Tool execution and passed): by default, failures in the trace (MCP isError, errored tool spans, error-shaped tool-results) force passed: false even if you pass passed: true in options. Set failOnToolError: false in options to keep structural / explicit passed only. See Tool execution and passed in the eval reporting reference.

Using as Context

Pass PromptResult as context for multi-turn conversations.
const r1 = await agent.prompt("Create a project");

// Single result as context
const r2 = await agent.prompt("Add a task", { context: r1 });

// Multiple results as context
const r3 = await agent.prompt("Show summary", { context: [r1, r2] });

Complete Example

const result = await agent.prompt("Add 100 and 200");

// Response
console.log("Text:", result.text);

// Tool calls
console.log("Tools:", result.toolsCalled());
console.log("Has add?", result.hasToolCall("add"));
console.log("Add args:", result.getToolArguments("add"));

for (const call of result.getToolCalls()) {
  console.log(`  ${call.toolName}:`, call.arguments);
}

// Errors
if (result.hasError()) {
  console.error("Error:", result.getError());
}

// Performance
console.log("Latency:", result.e2eLatencyMs(), "ms");
console.log("  LLM:", result.llmLatencyMs(), "ms");
console.log("  Tools:", result.mcpLatencyMs(), "ms");

// Tokens
console.log("Tokens:", result.totalTokens());
console.log("  Input:", result.inputTokens());
console.log("  Output:", result.outputTokens());

// History
console.log("Messages:", result.getMessages().length);