Agnost AIAgnost AIBook a demo
Open +
← All articles

Why HTTP 200 Does Not Mean Your AI Agent Succeeded

Separate transport success, tool execution, business results, and agent claims. Learn what to log when a tool returns 200 but the task still fails.

HTTP 200 confirms a successful HTTP response under the endpoint’s contract. It does not, by itself, confirm that an AI agent completed the user’s task. A tool can return a valid response containing a rejected operation, an empty result, a queued job, or information about the wrong object.

Agent monitoring needs separate records for transport status, tool result, business outcome, and the final claim made to the user.

Four questions for one tool call

Layer Question Example
Transport Did the client receive a valid response? HTTP 200
Tool Did the requested tool operation succeed according to its contract? Lookup returned successfully
Business outcome Did the intended task reach the required state? Refund remains pending
User communication Did the assistant describe that state accurately? Assistant incorrectly says “refunded”

These layers can disagree without any network exception. A monitoring system that collapses them into one boolean discards the evidence needed to explain the disagreement.

Example: accepted is not completed

Imagine a document-export tool returning:

{
  "job_id": "export_208",
  "status": "queued",
  "download_url": null
}

The response can be valid and useful. The agent should explain that the export is queued and provide the appropriate way to check it. “Your file is ready” would be premature.

A checker needs the tool contract to distinguish these states. It should not treat every null URL as a failure because null is expected while the job is pending. Conversely, it should not treat a nonempty job_id as proof that a file exists.

For long-running actions, join later status events to the original request using a stable operation ID. The asynchronous monitoring guide covers that lifecycle.

MCP has more than one error channel

The MCP tool specification describes tool execution errors returned within a tool result using isError, separately from protocol-level errors. A client that only records transport success loses this distinction.

For your integration, inspect the protocol result, structured tool output, and domain-specific status. Do not assume a library’s generic “success” attribute means the task succeeded. Document exactly which boundary produced that attribute.

This is not specific to MCP. REST, queue-based workflows, and custom function tools all need a clear result contract.

Design a result that is hard to misread

Use explicit states rather than a catch-all success: true. A proposed application response might include operation_id, state, reason_code, and subject_id. Define terminal states and the conditions for transitions. Keep display text separate from machine-readable state.

State Safe interpretation
Accepted The request entered the workflow
Pending Work remains outstanding
Completed The defined terminal condition has been confirmed
Rejected The operation did not proceed under the contract
Unknown The system cannot currently establish the outcome

These names are illustrative. Use the provider’s actual states and an explicit mapping rather than renaming them until important distinctions disappear.

Test the adapter, not just the happy path

Build fixtures for a business rejection inside a successful HTTP response, an empty lookup, a queued action, an inconsistent object ID, and a malformed payload. Add a network timeout whose external outcome is unknown. That last case must not automatically trigger another side effect.

Check what reaches the agent after the adapter processes each response. The raw provider response may be correct while a wrapper reduces every 200 to “done.” A trace of both the raw status metadata and the normalized result can expose that bug without storing the entire sensitive payload.

Agnost’s tool-call view connects execution records to conversations. Supply the business outcome when it is necessary to judge the task; transport telemetry cannot substitute for it.

For a reproducible example, the synthetic detector exercise includes a business error with no execution exception. For a stronger user-facing safeguard, connect final completion language to the verified action receipt.