fastmcp/tests/client/test_slim_package_boundaries.py
Jeremiah Lowin bb4894d215
Add fastmcp-slim for client-only installs (#4122)
* Add fastmcp-client workspace package

* Fix client package static checks

* Document client-only package

* Harden fastmcp-client package split

* Preserve forwarded headers in full package

* Switch to fastmcp-slim package

* Fix fastmcp-slim release edges

* Match pydantic-style slim layout

* Polish fastmcp-slim packaging
2026-05-11 17:13:21 -04:00

61 lines
1.7 KiB
Python

from __future__ import annotations
import builtins
import contextlib
import types
from collections.abc import Mapping, Sequence
from typing import Any, cast
import pytest
@contextlib.contextmanager
def block_server_imports():
original_import = builtins.__import__
def blocked_import(
name: str,
globals: Mapping[str, object] | None = None,
locals: Mapping[str, object] | None = None,
fromlist: Sequence[str] | None = (),
level: int = 0,
) -> types.ModuleType:
if level == 0 and (
name == "fastmcp.server" or name.startswith("fastmcp.server.")
):
raise ImportError(f"blocked server import: {name}")
return original_import(name, globals, locals, fromlist, level)
cast(Any, builtins).__import__ = blocked_import
try:
yield
finally:
cast(Any, builtins).__import__ = original_import
def test_client_http_headers_do_not_require_server() -> None:
from fastmcp.client.dependencies import get_http_headers
with block_server_imports():
assert get_http_headers(include_all=True) == {}
@pytest.mark.asyncio
async def test_multiserver_config_requires_server_for_now() -> None:
from fastmcp.client.transports import MCPConfigTransport
with block_server_imports():
transport = MCPConfigTransport(
{
"mcpServers": {
"one": {"command": "uvx", "args": ["one"]},
"two": {"command": "uvx", "args": ["two"]},
}
}
)
with pytest.raises(
ImportError, match="multiple servers require the full `fastmcp`"
):
async with transport.connect_session():
pass