/mcp[BETA]- Model Context Protocol
MCP-Tools auf LiteLLM Proxy Server bereitstellen
Dies ermöglicht es Ihnen, Tools zu definieren, die von jedem MCP-kompatiblen Client aufgerufen werden können. Definieren Sie Ihre mcp_servers mit LiteLLM und alle Ihre Clients können verfügbare Tools auflisten und aufrufen.
LiteLLM MCP Architektur: MCP-Tools mit allen von LiteLLM unterstützten Modellen verwenden
Wie es funktioniert
LiteLLM stellt die folgenden MCP-Endpunkte bereit
/mcp/tools/list- Alle verfügbaren Tools auflisten/mcp/tools/call- Ein bestimmtes Tool mit den bereitgestellten Argumenten aufrufen
Wenn sich MCP-Clients mit LiteLLM verbinden, können sie diesem Workflow folgen
- Verbinden Sie sich mit dem LiteLLM MCP Server
- Alle auf LiteLLM verfügbaren Tools auflisten
- Client führt LLM-API-Anfrage mit Tool-Aufruf(en) durch
- LLM-API gibt zurück, welche Tools aufgerufen werden sollen und mit welchen Argumenten
- MCP-Client führt MCP-Tool-Aufrufe an LiteLLM durch
- LiteLLM führt die Tool-Aufrufe an den entsprechenden MCP-Server durch
- LiteLLM gibt die Ergebnisse der Tool-Aufrufe an den MCP-Client zurück
Verwendung
1. Definieren Sie Ihre Tools unter mcp_servers in Ihrer config.yaml-Datei.
LiteLLM ermöglicht es Ihnen, Ihre Tools im Abschnitt mcp_servers Ihrer config.yaml-Datei zu definieren. Alle hier aufgeführten Tools sind für MCP-Clients verfügbar (wenn sie sich mit LiteLLM verbinden und list_tools aufrufen).
model_list:
- model_name: gpt-4o
litellm_params:
model: openai/gpt-4o
api_key: sk-xxxxxxx
mcp_servers:
zapier_mcp:
url: "https://actions.zapier.com/mcp/sk-akxxxxx/sse"
fetch:
url: "https://:8000/sse"
2. LiteLLM Gateway starten
- Docker-Ausführung
- litellm pip
docker run -d \
-p 4000:4000 \
-e OPENAI_API_KEY=$OPENAI_API_KEY \
--name my-app \
-v $(pwd)/my_config.yaml:/app/config.yaml \
my-app:latest \
--config /app/config.yaml \
--port 4000 \
--detailed_debug \
litellm --config config.yaml --detailed_debug
3. Führen Sie eine LLM-API-Anfrage aus
In diesem Beispiel werden wir Folgendes tun
- Verwenden Sie den MCP-Client, um MCP-Tools auf dem LiteLLM Proxy aufzulisten
- Verwenden Sie
transform_mcp_tool_to_openai_tool, um MCP-Tools in OpenAI-Tools zu konvertieren - Stellen Sie die MCP-Tools für
gpt-4obereit - Behandeln Sie den Tool-Aufruf von
gpt-4o - Konvertieren Sie den OpenAI-Tool-Aufruf in einen MCP-Tool-Aufruf
- Führen Sie den Tool-Aufruf auf dem MCP-Server aus
import asyncio
from openai import AsyncOpenAI
from openai.types.chat import ChatCompletionUserMessageParam
from mcp import ClientSession
from mcp.client.sse import sse_client
from litellm.experimental_mcp_client.tools import (
transform_mcp_tool_to_openai_tool,
transform_openai_tool_call_request_to_mcp_tool_call_request,
)
async def main():
# Initialize clients
# point OpenAI client to LiteLLM Proxy
client = AsyncOpenAI(api_key="sk-1234", base_url="https://:4000")
# Point MCP client to LiteLLM Proxy
async with sse_client("https://:4000/mcp/") as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# 1. List MCP tools on LiteLLM Proxy
mcp_tools = await session.list_tools()
print("List of MCP tools for MCP server:", mcp_tools.tools)
# Create message
messages = [
ChatCompletionUserMessageParam(
content="Send an email about LiteLLM supporting MCP", role="user"
)
]
# 2. Use `transform_mcp_tool_to_openai_tool` to convert MCP tools to OpenAI tools
# Since OpenAI only supports tools in the OpenAI format, we need to convert the MCP tools to the OpenAI format.
openai_tools = [
transform_mcp_tool_to_openai_tool(tool) for tool in mcp_tools.tools
]
# 3. Provide the MCP tools to `gpt-4o`
response = await client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=openai_tools,
tool_choice="auto",
)
# 4. Handle tool call from `gpt-4o`
if response.choices[0].message.tool_calls:
tool_call = response.choices[0].message.tool_calls[0]
if tool_call:
# 5. Convert OpenAI tool call to MCP tool call
# Since MCP servers expect tools in the MCP format, we need to convert the OpenAI tool call to the MCP format.
# This is done using litellm.experimental_mcp_client.tools.transform_openai_tool_call_request_to_mcp_tool_call_request
mcp_call = (
transform_openai_tool_call_request_to_mcp_tool_call_request(
openai_tool=tool_call.model_dump()
)
)
# 6. Execute tool call on MCP server
result = await session.call_tool(
name=mcp_call.name, arguments=mcp_call.arguments
)
print("Result:", result)
# Run it
asyncio.run(main())
LiteLLM Python SDK MCP-Bridge
Das LiteLLM Python SDK fungiert als MCP-Bridge, um MCP-Tools mit allen von LiteLLM unterstützten Modellen zu nutzen. LiteLLM bietet die folgenden Funktionen für die Verwendung von MCP
- Auflisten von verfügbaren MCP-Tools: OpenAI-Clients können alle verfügbaren MCP-Tools anzeigen
litellm.experimental_mcp_client.load_mcp_tools, um alle verfügbaren MCP-Tools aufzulisten
- Aufrufen von MCP-Tools: OpenAI-Clients können MCP-Tools aufrufen
litellm.experimental_mcp_client.call_openai_tool, um ein OpenAI-Tool auf einem MCP-Server aufzurufen
1. Verfügbare MCP-Tools auflisten
In diesem Beispiel verwenden wir litellm.experimental_mcp_client.load_mcp_tools, um alle verfügbaren MCP-Tools auf jedem MCP-Server aufzulisten. Diese Methode kann auf zwei Arten verwendet werden
format="mcp"- (Standard) MCP-Tools zurückgeben- Gibt zurück:
mcp.types.Tool
- Gibt zurück:
format="openai"- MCP-Tools konvertiert in für die OpenAI API kompatible Tools zurückgeben. Ermöglicht die Verwendung mit OpenAI-Endpunkten.- Gibt zurück:
openai.types.chat.ChatCompletionToolParam
- Gibt zurück:
- LiteLLM Python SDK
- OpenAI SDK + LiteLLM Proxy
# Create server parameters for stdio connection
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
import os
import litellm
from litellm import experimental_mcp_client
server_params = StdioServerParameters(
command="python3",
# Make sure to update to the full absolute path to your mcp_server.py file
args=["./mcp_server.py"],
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# Initialize the connection
await session.initialize()
# Get tools
tools = await experimental_mcp_client.load_mcp_tools(session=session, format="openai")
print("MCP TOOLS: ", tools)
messages = [{"role": "user", "content": "what's (3 + 5)"}]
llm_response = await litellm.acompletion(
model="gpt-4o",
api_key=os.getenv("OPENAI_API_KEY"),
messages=messages,
tools=tools,
)
print("LLM RESPONSE: ", json.dumps(llm_response, indent=4, default=str))
In diesem Beispiel werden wir Schritt für Schritt durchgehen, wie Sie das OpenAI SDK, das auf den LiteLLM-Proxy zeigt, verwenden können, um MCP-Tools aufzurufen. Der Hauptunterschied besteht hier darin, dass wir das OpenAI SDK verwenden, um die LLM-API-Anfrage zu stellen
# Create server parameters for stdio connection
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
import os
from openai import OpenAI
from litellm import experimental_mcp_client
server_params = StdioServerParameters(
command="python3",
# Make sure to update to the full absolute path to your mcp_server.py file
args=["./mcp_server.py"],
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# Initialize the connection
await session.initialize()
# Get tools using litellm mcp client
tools = await experimental_mcp_client.load_mcp_tools(session=session, format="openai")
print("MCP TOOLS: ", tools)
# Use OpenAI SDK pointed to LiteLLM proxy
client = OpenAI(
api_key="your-api-key", # Your LiteLLM proxy API key
base_url="https://:4000" # Your LiteLLM proxy URL
)
messages = [{"role": "user", "content": "what's (3 + 5)"}]
llm_response = client.chat.completions.create(
model="gpt-4",
messages=messages,
tools=tools
)
print("LLM RESPONSE: ", llm_response)
2. MCP-Tools auflisten und aufrufen
In diesem Beispiel werden wir verwenden
litellm.experimental_mcp_client.load_mcp_tools, um alle verfügbaren MCP-Tools auf jedem MCP-Server aufzulistenlitellm.experimental_mcp_client.call_openai_tool, um ein OpenAI-Tool auf einem MCP-Server aufzurufen
Die erste LLM-Antwort gibt eine Liste von OpenAI-Tools zurück. Wir nehmen den ersten Tool-Aufruf aus der LLM-Antwort und übergeben ihn an litellm.experimental_mcp_client.call_openai_tool, um das Tool auf dem MCP-Server aufzurufen.
Wie litellm.experimental_mcp_client.call_openai_tool funktioniert
- Akzeptiert einen OpenAI-Tool-Aufruf aus der LLM-Antwort
- Konvertiert den OpenAI-Tool-Aufruf in ein MCP-Tool
- Ruft das MCP-Tool auf dem MCP-Server auf
- Gibt das Ergebnis des MCP-Tool-Aufrufs zurück
- LiteLLM Python SDK
- OpenAI SDK + LiteLLM Proxy
# Create server parameters for stdio connection
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
import os
import litellm
from litellm import experimental_mcp_client
server_params = StdioServerParameters(
command="python3",
# Make sure to update to the full absolute path to your mcp_server.py file
args=["./mcp_server.py"],
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# Initialize the connection
await session.initialize()
# Get tools
tools = await experimental_mcp_client.load_mcp_tools(session=session, format="openai")
print("MCP TOOLS: ", tools)
messages = [{"role": "user", "content": "what's (3 + 5)"}]
llm_response = await litellm.acompletion(
model="gpt-4o",
api_key=os.getenv("OPENAI_API_KEY"),
messages=messages,
tools=tools,
)
print("LLM RESPONSE: ", json.dumps(llm_response, indent=4, default=str))
openai_tool = llm_response["choices"][0]["message"]["tool_calls"][0]
# Call the tool using MCP client
call_result = await experimental_mcp_client.call_openai_tool(
session=session,
openai_tool=openai_tool,
)
print("MCP TOOL CALL RESULT: ", call_result)
# send the tool result to the LLM
messages.append(llm_response["choices"][0]["message"])
messages.append(
{
"role": "tool",
"content": str(call_result.content[0].text),
"tool_call_id": openai_tool["id"],
}
)
print("final messages with tool result: ", messages)
llm_response = await litellm.acompletion(
model="gpt-4o",
api_key=os.getenv("OPENAI_API_KEY"),
messages=messages,
tools=tools,
)
print(
"FINAL LLM RESPONSE: ", json.dumps(llm_response, indent=4, default=str)
)
In diesem Beispiel werden wir Schritt für Schritt durchgehen, wie Sie das OpenAI SDK, das auf den LiteLLM-Proxy zeigt, verwenden können, um MCP-Tools aufzurufen. Der Hauptunterschied besteht hier darin, dass wir das OpenAI SDK verwenden, um die LLM-API-Anfrage zu stellen
# Create server parameters for stdio connection
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
import os
from openai import OpenAI
from litellm import experimental_mcp_client
server_params = StdioServerParameters(
command="python3",
# Make sure to update to the full absolute path to your mcp_server.py file
args=["./mcp_server.py"],
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# Initialize the connection
await session.initialize()
# Get tools using litellm mcp client
tools = await experimental_mcp_client.load_mcp_tools(session=session, format="openai")
print("MCP TOOLS: ", tools)
# Use OpenAI SDK pointed to LiteLLM proxy
client = OpenAI(
api_key="your-api-key", # Your LiteLLM proxy API key
base_url="https://:8000" # Your LiteLLM proxy URL
)
messages = [{"role": "user", "content": "what's (3 + 5)"}]
llm_response = client.chat.completions.create(
model="gpt-4",
messages=messages,
tools=tools
)
print("LLM RESPONSE: ", llm_response)
# Get the first tool call
tool_call = llm_response.choices[0].message.tool_calls[0]
# Call the tool using MCP client
call_result = await experimental_mcp_client.call_openai_tool(
session=session,
openai_tool=tool_call.model_dump(),
)
print("MCP TOOL CALL RESULT: ", call_result)
# Send the tool result back to the LLM
messages.append(llm_response.choices[0].message.model_dump())
messages.append({
"role": "tool",
"content": str(call_result.content[0].text),
"tool_call_id": tool_call.id,
})
final_response = client.chat.completions.create(
model="gpt-4",
messages=messages,
tools=tools
)
print("FINAL RESPONSE: ", final_response)
Berechtigungsverwaltung
Derzeit können alle virtuellen Schlüssel auf die MCP-Endpunkte zugreifen. Wir arbeiten an einer Funktion, um den MCP-Zugriff nach Schlüsseln/Teams/Benutzern/Organisationen einzuschränken.
Diskutieren Sie mit hier