mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-08 23:58:34 +00:00
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>
65 lines
2.0 KiB
Python
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"
|