Back to Fastmcp

Provider Tests: Direct Server Calls

v3-notes/provider-test-pattern.md

3.2.41.7 KB
Original Source

Provider Tests: Direct Server Calls

This document captures the design decision to test providers via direct server method calls rather than wrapping in a Client.

Problem

Provider tests were using the Client pattern:

python
async with Client(mcp) as client:
    result = await client.call_tool("add", {"x": 1, "y": 2})
    assert result.data == 3

This conflated two concerns:

  1. Does the provider/server work correctly?
  2. Does the Client-Server interaction work correctly?

Additionally, ~1,200 lines of tests in test_server_interactions.py duplicated provider tests.

Solution

Provider tests now call server methods directly:

python
result = await mcp.call_tool("add", {"x": 1, "y": 2})
assert result.structured_content == {"result": 3}

This establishes clear test ownership:

  • Provider tests → verify server functionality
  • Integration tests → verify Client-Server interaction

Result Access Patterns

Direct server calls return canonical FastMCP types, not MCP protocol types:

ComponentAccess Pattern
Toolresult.structured_content or result.text
Resourceresult.contents[0].content
Promptresult.messages[0].content.text

Error Types

Direct calls raise FastMCP exceptions:

  • NotFoundError - component not found
  • DisabledError - component disabled by visibility

Client calls raise MCP protocol errors (wrapped in McpError).

Implementation

  • Consolidated duplicate tests from test_server_interactions.py into provider test files
  • Reduced test_server_interactions.py from 1,455 → 179 lines
  • Only TestMeta tests remain in interactions file (require Client for context injection)

PR

  • #2748 - Convert provider tests to use direct server calls