文档API 参考📓 教程🧑‍🍳 食谱🤝 集成💜 Discord🎨 Studio
文档

MCP Toolkits

MCPToolset 连接到 MCP 兼容服务器并自动将所有可用工具加载到一个可管理单元中。这些工具可以直接与 Chat Generator、ToolInvokerAgent.

必需的初始化变量"server_info": 要连接的 MCP 服务器的信息
API 参考mcp
GitHub 链接https://github.com/deepset-ai/haystack-core-integrations/tree/main/integrations/mcp

概述

MCPToolset 是Toolset 的一个子类,可动态发现和加载来自任何 MCP 兼容服务器的工具。

它支持

  • Streamable HTTP 用于连接 HTTP 服务器
  • SSE (Server-Sent Events) (已弃用)用于通过 HTTP 连接远程 MCP 服务器
  • StdIO 用于通过子进程本地执行工具

MCPToolset 可以轻松地将外部工具插入管道(与 Chat Generators 和ToolInvoker)或代理中,并内置支持过滤(通过tool_names).

参数

要初始化 MCPToolset,请使用以下参数

  • server_info(必需):MCP 服务器的连接信息
  • tool_names(可选):要添加到 Toolset 的工具名称列表

📘

请注意,如果tool_names 未指定,将加载 MCP 服务器上的所有工具。如果有许多工具(20-30+),请谨慎操作,因为这可能会压倒 LLM 的工具解析逻辑。

安装

pip install mcp-haystack

用法

使用 StdIO 传输

from haystack_integrations.tools.mcp import MCPToolset, StdioServerInfo

server_info = StdioServerInfo(command="uvx", args=["mcp-server-time", "--local-timezone=Europe/Berlin"])
toolset = MCPToolset(server_info=server_info, tool_names=["get_current_time"])  # If tool_names is omitted, all tools on this MCP server will be loaded (can overwhelm LLM if too many)

使用 Streamable HTTP 传输

from haystack_integrations.tools.mcp import MCPToolset, StreamableHttpServerInfo

server_info = SSEServerInfo(url="https://:8000/mcp")  
toolset = MCPToolset(server_info=server_info, tool_names=["get_current_time"])

使用 SSE 传输(已弃用)

from haystack_integrations.tools.mcp import MCPToolset, SSEServerInfo

server_info = SSEServerInfo(url="https://:8000/sse")
toolset = MCPToolset(server_info=server_info, tool_names=["get_current_time"])  

在 Pipeline 中

from haystack import Pipeline
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.tools import ToolInvoker
from haystack.components.converters import OutputAdapter
from haystack.dataclasses import ChatMessage
from haystack_integrations.tools.mcp import MCPToolset, StdioServerInfo

server_info = StdioServerInfo(command="uvx", args=["mcp-server-time", "--local-timezone=Europe/Berlin"])
toolset = MCPToolset(server_info=server_info)

pipeline = Pipeline()
pipeline.add_component("llm", OpenAIChatGenerator(model="gpt-4o-mini", tools=toolset))
pipeline.add_component("tool_invoker", ToolInvoker(tools=toolset))
pipeline.add_component("adapter", OutputAdapter(
    template="{{ initial_msg + initial_tool_messages + tool_messages }}",
    output_type=list[ChatMessage],
    unsafe=True,
))
pipeline.add_component("response_llm", OpenAIChatGenerator(model="gpt-4o-mini"))

pipeline.connect("llm.replies", "tool_invoker.messages")
pipeline.connect("llm.replies", "adapter.initial_tool_messages")
pipeline.connect("tool_invoker.tool_messages", "adapter.tool_messages")
pipeline.connect("adapter.output", "response_llm.messages")

user_input = ChatMessage.from_user(text="What is the time in New York?")
result = pipeline.run({
    "llm": {"messages": [user_input]},
    "adapter": {"initial_msg": [user_input]}
})

print(result["response_llm"]["replies"][0].text)

使用 Agent

from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.components.agents import Agent
from haystack.dataclasses import ChatMessage
from haystack_integrations.tools.mcp import MCPToolset, StdioServerInfo

toolset = MCPToolset(
    server_info=StdioServerInfo(command="uvx", args=["mcp-server-time", "--local-timezone=Europe/Berlin"]),
    tool_names=["get_current_time"]  # Omit to load all tools, but may overwhelm LLM if many
)

agent = Agent(chat_generator=OpenAIChatGenerator(), tools=toolset, exit_conditions=["text"])
agent.warm_up()

response = agent.run(messages=[ChatMessage.from_user("What is the time in New York?")])
print(response["messages"][-1].text)