An MCP handshake proves that two endpoints can start a session. It does not prove that an Agent can understand the tool, call it correctly, distinguish display text from machine-readable state, or know when to stop.
I ran an independent test with FastMCP 3.4.7 as the client and WebAZ's public shopping MCP as the remote server.
The question was deliberately narrow:
What should an MCP smoke test verify beyond connection success?
A four-part minimum
1. Advertised schema
Call list_tools() and inspect the input schema, not just the tool name. A caller should be able to construct a valid request and identify conflicting fields.
The tested endpoint exposed one anonymous tool, webaz_search. It did not advertise account, order, reservation or settlement actions.
2. Explicit error state
Check CallToolResult.is_error. A text block alone is not proof that an operation completed successfully.
The test call returned is_error=false.
3. Concise model-facing content
The ordinary content block summarized that three products were found without copying the full payload into model context.
4. Deterministic structured content
The structured result carried destination normalization, product fields and workflow state:
response_type=comparisoncompletion=completeassistant_action=answer-
Singaporenormalized toSG - three products returned from four matches
Checking only rendered text would have missed the fields a deterministic client or UI needs.
Minimal reproduction
import asyncio
from fastmcp import Client
async def main():
async with Client("https://webaz.xyz/mcp/shopping-v1") as client:
tools = await client.list_tools()
assert [tool.name for tool in tools] == ["webaz_search"]
result = await client.call_tool(
"webaz_search",
{
"query": "tissue",
"ship_to": "Singapore",
"sort": "price_asc",
"limit": 3,
},
)
assert result.is_error is False
assert result.content
assert result.structured_content["completion"] == "complete"
assert result.structured_content["assistant_action"] == "answer"
asyncio.run(main())
Observed on 2026-08-28 with Python 3.13.12 and FastMCP 3.4.7.
The Agent-commerce implication
A fluent answer can hide an incomplete transaction state. Discovery is not a quote. A quote is not an order. An order is not settlement. Settlement is not fulfillment.
Those boundaries should be represented in schemas and structured results, not only in prose prompts.
This was one public, read-only call. It was not a security audit, load test, OAuth test, renderer test, order test or payment test. FastMCP did not participate in or endorse the experiment.
The takeaway: verify the advertised schema, is_error, concise content and raw structured_content separately. Connection success is only the beginning.
FastMCP client documentation: https://gofastmcp.com/clients/tools
Public test endpoint: https://webaz.xyz/mcp/shopping-v1
Top comments (0)