diff --git a/docs/my-website/docs/mcp.md b/docs/my-website/docs/mcp.md index 45cec48cd7..1e523600a8 100644 --- a/docs/my-website/docs/mcp.md +++ b/docs/my-website/docs/mcp.md @@ -195,70 +195,155 @@ litellm_settings: ## Using your MCP +### Use on LiteLLM UI + +### Use with Responses API + +Replace `http://localhost:4000` with your LiteLLM Proxy base URL. + - - -#### Connect via OpenAI Responses API - -Use the OpenAI Responses API to connect to your LiteLLM MCP server: + ```bash title="cURL Example" showLineNumbers -curl --location 'https://api.openai.com/v1/responses' \ +curl --location 'http://localhost:4000/v1/responses' \ --header 'Content-Type: application/json' \ ---header "Authorization: Bearer $OPENAI_API_KEY" \ +--header "Authorization: Bearer sk-1234" \ --data '{ - "model": "gpt-4o", + "model": "gpt-5", + "input": [ + { + "role": "user", + "content": "give me TLDR of what BerriAI/litellm repo is about", + "type": "message" + } + ], "tools": [ { "type": "mcp", "server_label": "litellm", "server_url": "litellm_proxy", - "require_approval": "never", - "headers": { - "x-litellm-api-key": "Bearer YOUR_LITELLM_API_KEY" - } + "require_approval": "never" } ], - "input": "Run available tools", + "stream": true, "tool_choice": "required" }' ``` + - +```python title="Python SDK Example" showLineNumbers +import openai -#### Connect via LiteLLM Proxy Responses API +client = openai.OpenAI( + api_key="sk-1234", + base_url="http://localhost:4000" +) -Use this when calling LiteLLM Proxy for LLM API requests to `/v1/responses` endpoint. - -```bash title="cURL Example" showLineNumbers -curl --location '/v1/responses' \ ---header 'Content-Type: application/json' \ ---header "Authorization: Bearer $LITELLM_API_KEY" \ ---data '{ - "model": "gpt-4o", - "tools": [ +response = client.responses.create( + model="gpt-5", + input=[ + { + "role": "user", + "content": "give me TLDR of what BerriAI/litellm repo is about", + "type": "message" + } + ], + tools=[ { "type": "mcp", "server_label": "litellm", "server_url": "litellm_proxy", - "require_approval": "never", - "headers": { - "x-litellm-api-key": "Bearer YOUR_LITELLM_API_KEY" - } + "require_approval": "never" } ], - "input": "Run available tools", + stream=True, + tool_choice="required" +) + +print(response) +``` + + + + +#### Specifying MCP Tools + +You can specify which MCP tools are available by using the `allowed_tools` parameter. This allows you to restrict access to specific tools within an MCP server. + +To get the list of allowed tools when using LiteLLM MCP Gateway, you can naigate to the LiteLLM UI on MCP Servers > MCP Tools > Click the Tool > Copy Tool Name. + + + + +```bash title="cURL Example with allowed_tools" showLineNumbers +curl --location 'http://localhost:4000/v1/responses' \ +--header 'Content-Type: application/json' \ +--header "Authorization: Bearer sk-1234" \ +--data '{ + "model": "gpt-5", + "input": [ + { + "role": "user", + "content": "give me TLDR of what BerriAI/litellm repo is about", + "type": "message" + } + ], + "tools": [ + { + "type": "mcp", + "server_label": "litellm", + "server_url": "litellm_proxy/mcp", + "require_approval": "never", + "allowed_tools": ["GitMCP-fetch_litellm_documentation"] + } + ], + "stream": true, "tool_choice": "required" }' ``` + - +```python title="Python SDK Example with allowed_tools" showLineNumbers +import openai -#### Connect via Cursor IDE +client = openai.OpenAI( + api_key="sk-1234", + base_url="http://localhost:4000" +) + +response = client.responses.create( + model="gpt-5", + input=[ + { + "role": "user", + "content": "give me TLDR of what BerriAI/litellm repo is about", + "type": "message" + } + ], + tools=[ + { + "type": "mcp", + "server_label": "litellm", + "server_url": "litellm_proxy/mcp", + "require_approval": "never", + "allowed_tools": ["GitMCP-fetch_litellm_documentation"] + } + ], + stream=True, + tool_choice="required" +) + +print(response) +``` + + + + +### Use with Cursor IDE Use tools directly from Cursor IDE with LiteLLM MCP: @@ -281,9 +366,6 @@ Use tools directly from Cursor IDE with LiteLLM MCP: } ``` - - - #### How it works when server_url="litellm_proxy" When server_url="litellm_proxy", LiteLLM bridges non-MCP providers to your MCP tools. diff --git a/docs/my-website/img/mcp_tools.png b/docs/my-website/img/mcp_tools.png new file mode 100644 index 0000000000..825dbf6ed8 Binary files /dev/null and b/docs/my-website/img/mcp_tools.png differ diff --git a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py index 34a0d604f3..b35b3ad93d 100644 --- a/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py +++ b/litellm/proxy/_experimental/mcp_server/mcp_server_manager.py @@ -241,6 +241,9 @@ class MCPServerManager: transport=server_config.get("transport", MCPTransport.http), spec_version=server_config.get("spec_version", MCPSpecVersion.jun_2025), auth_type=server_config.get("auth_type", None), + authentication_token=server_config.get( + "authentication_token", server_config.get("auth_value", None) + ), mcp_info=mcp_info, access_groups=server_config.get("access_groups", None), ) @@ -716,8 +719,8 @@ class MCPServerManager: tasks = [] if proxy_logging_obj: # Create synthetic LLM data for during hook processing - from litellm.types.mcp import MCPDuringCallRequestObject from litellm.types.llms.base import HiddenParams + from litellm.types.mcp import MCPDuringCallRequestObject request_obj = MCPDuringCallRequestObject( tool_name=name, diff --git a/tests/mcp_tests/test_mcp_auth_priority.py b/tests/mcp_tests/test_mcp_auth_priority.py index 4b9c0cfbb5..b1dcb02ccb 100644 --- a/tests/mcp_tests/test_mcp_auth_priority.py +++ b/tests/mcp_tests/test_mcp_auth_priority.py @@ -42,3 +42,26 @@ def test_mcp_server_works_without_config_auth_value(): # Verify header token is used assert client._mcp_auth_value == "Bearer token_from_header_only" assert client.auth_type == MCPAuth.authorization + + +@pytest.mark.parametrize("token_key", ["authentication_token", "auth_value"]) +def test_mcp_server_config_auth_value_header_used(token_key): + """Ensure auth header is sent when auth token configured in config""" + config = { + "test_server": { + "url": "https://api.example.com/mcp", + "transport": "http", + "auth_type": "bearer_token", + token_key: "example_token", + } + } + + manager = MCPServerManager() + manager.load_servers_from_config(config) + + server = next(iter(manager.config_mcp_servers.values())) + client = manager._create_mcp_client(server) + headers = client._get_auth_headers() + + assert headers["Authorization"] == "Bearer example_token" + assert client.auth_type == MCPAuth.bearer_token