Files
crewAI/lib/crewai/tests/mcp/test_sse_transport.py
Devin AI 1d1c68792a feat: Add SSL verification option (verify parameter) to MCPServerHTTP and MCPServerSSE
This commit adds a 'verify' parameter to MCPServerHTTP and MCPServerSSE
configurations, allowing users to disable SSL certificate verification
or specify a custom CA bundle path when connecting to MCP servers.

This is useful for enterprise environments where:
- Corporate proxies intercept HTTPS traffic with self-signed certificates
- Internal certificate authorities are not in the default trust store
- Development/staging environments use self-signed certificates

Changes:
- Add 'verify' parameter to MCPServerHTTP and MCPServerSSE config classes
  (default: True, accepts bool or str for CA bundle path)
- Add 'verify' parameter to HTTPTransport and SSETransport classes
- Create custom httpx_client_factory that preserves MCP defaults while
  allowing SSL verification customization
- Update agent/core.py to pass verify parameter when creating transports
- Add comprehensive tests for the new functionality

Closes #4100

Co-Authored-By: João <joao@crewai.com>
2025-12-16 15:18:17 +00:00

65 lines
2.0 KiB
Python

"""Tests for SSE transport."""
import pytest
from crewai.mcp.transports.sse import SSETransport, _create_httpx_client_factory
@pytest.mark.asyncio
async def test_sse_transport_connect_does_not_pass_invalid_args():
"""Test that SSETransport.connect() doesn't pass invalid args to sse_client.
The sse_client function does not accept terminate_on_close parameter.
"""
transport = SSETransport(
url="http://localhost:9999/sse",
headers={"Authorization": "Bearer test"},
)
with pytest.raises(ConnectionError) as exc_info:
await transport.connect()
assert "unexpected keyword argument" not in str(exc_info.value)
def test_sse_transport_verify_default():
"""Test SSETransport has verify=True by default."""
transport = SSETransport(url="http://localhost:9999/sse")
assert transport.verify is True
def test_sse_transport_verify_false():
"""Test SSETransport with verify=False."""
transport = SSETransport(
url="http://localhost:9999/sse",
verify=False,
)
assert transport.verify is False
def test_sse_transport_verify_ca_bundle():
"""Test SSETransport with custom CA bundle path."""
transport = SSETransport(
url="http://localhost:9999/sse",
verify="/path/to/ca-bundle.crt",
)
assert transport.verify == "/path/to/ca-bundle.crt"
def test_create_httpx_client_factory_returns_async_client():
"""Test _create_httpx_client_factory returns an AsyncClient."""
import httpx
factory = _create_httpx_client_factory(verify=False)
client = factory()
assert isinstance(client, httpx.AsyncClient)
def test_create_httpx_client_factory_preserves_mcp_defaults():
"""Test _create_httpx_client_factory preserves MCP default settings."""
factory = _create_httpx_client_factory(verify=False)
client = factory(headers={"X-Test": "value"})
assert client.follow_redirects is True
assert client.timeout.connect == 30.0
assert client.headers.get("X-Test") == "value"