使用说明
Build effective agents with Model Context Protocol using simple, composable patterns.
Examples | Building Effective Agents | MCP
概述
mcp-agent 是一个简单、可组合的框架,用于构建代理 模型上下文协议.
灵感Anthropic为AI应用程序开发人员宣布了两项基础更新:
mcp-agent 将这两个基础部分放入AI应用程序框架中:
- 它可以处理管理MCP服务器连接生命周期的麻烦业务,因此您不必这样做。
- 它实现了《构建有效代理》中描述的每个模式,并在 可组合的 方法,允许您将这些模式链接在一起。
- 奖金:它实现了 OpenAI的Swarm 多代理编排模式,但采用与模型无关的方式。
总之,这是构建健壮代理应用程序的最简单和最简单的方法。与MCP一样,该项目也处于早期开发阶段。 我们欢迎各种各样的 贡献,反馈和您的帮助,使其成为新的标准。
开始使用
我们建议使用 紫外线 管理你的Python项目:
uv add "mcp-agent"
或者:
pip install mcp-agent
快速启动
[!提示] 这
examples目录中有几个示例应用程序可供入门。 要运行一个示例,请克隆此仓库,然后:cd examples/basic/mcp_basic_agent # Or any other example cp mcp_agent.secrets.yaml.example mcp_agent.secrets.yaml # Update API keys uv run main.py
这是一个基本的“查找器”代理,它使用fetch和文件系统服务器查找文件、阅读博客和写推文。 示例链接:
finder_agent.py
import asyncio
import os
from mcp_agent.app import MCPApp
from mcp_agent.agents.agent import Agent
from mcp_agent.workflows.llm.augmented_llm_openai import OpenAIAugmentedLLM
app = MCPApp(name="hello_world_agent")
async def example_usage():
async with app.run() as mcp_agent_app:
logger = mcp_agent_app.logger
# This agent can read the filesystem or fetch URLs
finder_agent = Agent(
name="finder",
instruction="""You can read local files or fetch URLs.
Return the requested information when asked.""",
server_names=["fetch", "filesystem"], # MCP servers this Agent can use
)
async with finder_agent:
# Automatically initializes the MCP servers and adds their tools for LLM use
tools = await finder_agent.list_tools()
logger.info(f"Tools available:", data=tools)
# Attach an OpenAI LLM to the agent (defaults to GPT-4o)
llm = await finder_agent.attach_llm(OpenAIAugmentedLLM)
# This will perform a file lookup and read using the filesystem server
result = await llm.generate_str(
message="Show me what's in README.md verbatim"
)
logger.info(f"README.md contents: {result}")
# Uses the fetch server to fetch the content from URL
result = await llm.generate_str(
message="Print the first two paragraphs from https://www.anthropic.com/research/building-effective-agents"
)
logger.info(f"Blog intro: {result}")
# Multi-turn interactions by default
result = await llm.generate_str("Summarize that in a 128-char tweet")
logger.info(f"Tweet: {result}")
if __name__ == "__main__":
asyncio.run(example_usage())
mcp_agent.config.yaml
execution_engine: asyncio
logger:
transports: [console] # You can use [file, console] for both
level: debug
path: "logs/mcp-agent.jsonl" # Used for file transport
# For dynamic log filenames:
# path_settings:
# path_pattern: "logs/mcp-agent-{unique_id}.jsonl"
# unique_id: "timestamp" # Or "session_id"
# timestamp_format: "%Y%m%d_%H%M%S"
mcp:
servers:
fetch:
command: "uvx"
args: ["mcp-server-fetch"]
filesystem:
command: "npx"
args:
[
"-y",
"@modelcontextprotocol/server-filesystem",
"<add_your_directories>",
]
openai:
# Secrets (API keys, etc.) are stored in an mcp_agent.secrets.yaml file which can be gitignored
default_model: gpt-4o
Agent output
目录
为什么使用 mcp-agent?
现在已经有太多的AI框架了。但是 mcp-agent 是唯一专为共享协议而构建的- 主控程序它也是最轻量级的,比框架更接近代理模式库。
像 更多服务具有MCP意识,您可以使用mcp-agent构建健壮且可控的AI代理,这些代理可以开箱即用地利用这些服务。
例子
在我们进入mcp-agent的核心概念之前,让我们展示一下可以用它构建什么。
简而言之,您可以使用mcp-agent构建任何类型的AI应用程序:多代理协作工作流、人在环工作流、RAG管道等等。
克劳德桌面
您可以将mcp代理应用程序集成到像Claude Desktop这样的mcp客户端中。
mcp代理服务器
此应用程序将mcp代理应用程序封装在mcp服务器内,并将该服务器暴露给Claude Desktop。 该应用程序公开了Claude Desktop可以调用的代理和工作流,以满足用户的请求。
https://github.com/user-attachments/assets/7807cffd-dba7-4f0c-9c70-9482fd7e0699
此演示显示了一个多代理评估任务,其中每个代理评估输入诗的各个方面,以及 然后,聚合器将他们的发现总结成最终回复。
详情:从用户的文本请求开始,应用程序:
- 动态定义代理来完成这项工作
- 使用适当的工作流来编排这些代理(在本例中为并行工作流)
代码链接: examples/basic/mcp_agent_server
[!注意] 非常感谢 林(@StreetLamb) 感谢您开发和贡献这个例子!
溪流
您可以使用Streamlit部署mcp代理应用程序。
Gmail代理
该应用程序能够使用文本提示在gmail上执行读写操作,即阅读、删除、发送电子邮件、标记为已读/未读等。 它使用Gmail的MCP服务器。
https://github.com/user-attachments/assets/54899cac-de24-4102-bd7e-4b2022c956e3
代码链接: gmailmcp服务器
[!注意] 非常感谢 Jason Summer(@jasonsum) 感谢您开发和贡献这个例子!
简单的RAG聊天机器人
该应用程序使用Qdrant矢量数据库(通过MCP服务器)对文本语料库进行问答。
https://github.com/user-attachments/assets/f4dcd227-cae9-4a59-aa9e-0eceeb4acaf4
代码链接: 示例/用例/streamlit_mcp_rag_agent
[!注意] 非常感谢 林(@StreetLamb) 感谢您开发和贡献这个例子!
马里莫
马里莫 是一个反应式Python笔记本,取代了Jupyter和Streamlit。 这是“文件查找器”代理 快速启动 在马里莫实施:
代码链接: 示例/用例/marimo_mcp_basic_agent
[!注意] 非常感谢 阿克沙伊·阿格拉瓦尔(@akshayka) 感谢您开发和贡献这个例子!
python
您可以将mcp代理应用程序编写为Python脚本或Jupyter笔记本。
群集
此示例演示了使用Swarm工作流模式在航空公司环境中处理不同客户服务请求的多代理设置。代理可以对请求进行分类,处理航班修改、取消和丢失行李的情况。
https://github.com/user-attachments/assets/b314d75d-7945-4de6-965b-7f21eb14a8bd
代码链接: 示例/工作流/workflow_swarm
核心组件
以下是mcp代理框架的构建块:
- MCPApp:全局状态和应用程序配置
- MCP服务器管理:
gen_client和MCPConnectionManager轻松连接到MCP服务器。 - 代理:代理是一个可以访问一组MCP服务器并将其作为工具调用暴露给LLM的实体。它有一个名称和目的(指令)。
- 增强LLM:通过MCP服务器集合提供的工具增强的LLM。下面描述的每个工作流模式都是
AugmentedLLM它本身,允许您将它们组合并链接在一起。
框架中的所有内容都是这些核心功能的衍生。
工作流
mcp代理为Anthropic的每个模式提供实现 构建高效代理,以及OpenAI 群集 图案。
每种模式都与模型无关,并作为 AugmentedLLM,使一切变得非常可组合。
增强LLM
增强LLM 是一个LLM,可以通过代理访问MCP服务器和功能。
LLM提供者实现AugmentedLLM接口以公开3个函数:
generate:根据提示生成消息,可能需要多次迭代并根据需要调用工具。generate_str:通话generate并将结果作为字符串输出返回。generate_structured:用途 导师 将生成的结果作为Pydantic模型返回。
另外, AugmentedLLM 有记忆,可以记录长期或短期的历史。
Example
from mcp_agent.agents.agent import Agent
from mcp_agent.workflows.llm.augmented_llm_anthropic import AnthropicAugmentedLLM
finder_agent = Agent(
name="finder",
instruction="You are an agent with filesystem + fetch access. Return the requested file or URL contents.",
server_names=["fetch", "filesystem"],
)
async with finder_agent:
llm = await finder_agent.attach_llm(AnthropicAugmentedLLM)
result = await llm.generate_str(
message="Print the first 2 paragraphs of https://www.anthropic.com/research/building-effective-agents",
# Can override model, tokens and other defaults
)
logger.info(f"Result: {result}")
# Multi-turn conversation
result = await llm.generate_str(
message="Summarize those paragraphs in a 128 character tweet",
)
logger.info(f"Result: {result}")
并行
将任务扇出给多个子代理,并扇出结果。每个子任务都是一个AugmentedLLM,整个并行工作流也是如此,这意味着每个子任务本身都可以是一个更复杂的工作流。
[!注意]
Example
proofreader = Agent(name="proofreader", instruction="Review grammar...")
fact_checker = Agent(name="fact_checker", instruction="Check factual consistency...")
style_enforcer = Agent(name="style_enforcer", instruction="Enforce style guidelines...")
grader = Agent(name="grader", instruction="Combine feedback into a structured report.")
parallel = ParallelLLM(
fan_in_agent=grader,
fan_out_agents=[proofreader, fact_checker, style_enforcer],
llm_factory=OpenAIAugmentedLLM,
)
result = await parallel.generate_str("Student short story submission: ...", RequestParams(model="gpt4-o"))
路由器
给定一个输入,路由到 top_k 最相关的类别。类别可以是代理、MCP服务器或常规函数。
mcp代理提供了几种路由器实现,包括:
EmbeddingRouter:使用嵌入模型进行分类LLMRouter:使用LLM进行分类
[!注意]
Example
def print_hello_world:
print("Hello, world!")
finder_agent = Agent(name="finder", server_names=["fetch", "filesystem"])
writer_agent = Agent(name="writer", server_names=["filesystem"])
llm = OpenAIAugmentedLLM()
router = LLMRouter(
llm=llm,
agents=[finder_agent, writer_agent],
functions=[print_hello_world],
)
results = await router.route( # Also available: route_to_agent, route_to_server
request="Find and print the contents of README.md verbatim",
top_k=1
)
chosen_agent = results[0].result
async with chosen_agent:
...
IntentClassifier
作为Router的近亲,Intent Classifier模式标识了 top_k 与给定输入最接近的意图。
就像路由器一样,mcp代理提供了 嵌入 和 LLM基础 意图分类器。
评估器优化器
一个LLM(“优化器”)对响应进行优化,另一个(“评估者”)对其进行批评,直到响应超过质量标准。
[!注意]
Example
optimizer = Agent(name="cover_letter_writer", server_names=["fetch"], instruction="Generate a cover letter ...")
evaluator = Agent(name="critiquer", instruction="Evaluate clarity, specificity, relevance...")
llm = EvaluatorOptimizerLLM(
optimizer=optimizer,
evaluator=evaluator,
llm_factory=OpenAIAugmentedLLM,
min_rating=QualityRating.EXCELLENT, # Keep iterating until the minimum quality bar is reached
)
result = await eo_llm.generate_str("Write a job cover letter for an AI framework developer role at LastMile AI.")
print("Final refined cover letter:", result)
编排人员
高级LLM生成一个计划,然后将其分配给子代理,并综合结果。 Orchestrator工作流自动并行化可以并行完成的步骤,并阻止依赖关系。
[!注意]
Example
finder_agent = Agent(name="finder", server_names=["fetch", "filesystem"])
writer_agent = Agent(name="writer", server_names=["filesystem"])
proofreader = Agent(name="proofreader", ...)
fact_checker = Agent(name="fact_checker", ...)
style_enforcer = Agent(name="style_enforcer", instructions="Use APA style guide from ...", server_names=["fetch"])
orchestrator = Orchestrator(
llm_factory=AnthropicAugmentedLLM,
available_agents=[finder_agent, writer_agent, proofreader, fact_checker, style_enforcer],
)
task = "Load short_story.md, evaluate it, produce a graded_report.md with multiple feedback aspects."
result = await orchestrator.generate_str(task, RequestParams(model="gpt-4o"))
print(result)
群集
OpenAI有一个名为 群集,我们为in-mcp代理提供了一个模型无关的参考实现。
mcp代理Swarm模式与mcp服务器无缝协作,并作为 AugmentedLLM,允许与上述其他模式组合。
[!注意]
Example
triage_agent = SwarmAgent(...)
flight_mod_agent = SwarmAgent(...)
lost_baggage_agent = SwarmAgent(...)
# The triage agent decides whether to route to flight_mod_agent or lost_baggage_agent
swarm = AnthropicSwarm(agent=triage_agent, context_variables={...})
test_input = "My bag was not delivered!"
result = await swarm.generate_str(test_input)
print("Result:", result)
高级
可组合性
可组合性的一个例子是使用 评估器优化器 工作流程作为LLM内部的规划者 这 编排器 工作流程。生成一个高质量的执行计划对于健壮的行为很重要,评估器优化器可以帮助确保这一点。
这样做在mcp代理中是无缝的,因为每个工作流都是作为一个 AugmentedLLM.
Example
optimizer = Agent(name="plan_optimizer", server_names=[...], instruction="Generate a plan given an objective ...")
evaluator = Agent(name="plan_evaluator", instruction="Evaluate logic, ordering and precision of plan......")
planner_llm = EvaluatorOptimizerLLM(
optimizer=optimizer,
evaluator=evaluator,
llm_factory=OpenAIAugmentedLLM,
min_rating=QualityRating.EXCELLENT,
)
orchestrator = Orchestrator(
llm_factory=AnthropicAugmentedLLM,
available_agents=[finder_agent, writer_agent, proofreader, fact_checker, style_enforcer],
planner=planner_llm # It's that simple
)
...
信号和人工输入
信号传导:该框架可以暂停/恢复任务。代理或LLM可能会“发出信号”表示它需要用户输入,因此工作流正在等待。开发人员可以在工作流期间发出信号,在继续工作流之前寻求批准或审查。
人力投入:如果代理人有 human_input_callback,LLM可以调用 __human_input__ 在工作流程中请求用户输入的工具。
Example
这 Swarm示例 展示了这一点。
from mcp_agent.human_input.handler import console_input_callback
lost_baggage = SwarmAgent(
name="Lost baggage traversal",
instruction=lambda context_variables: f"""
{
FLY_AIR_AGENT_PROMPT.format(
customer_context=context_variables.get("customer_context", "None"),
flight_context=context_variables.get("flight_context", "None"),
)
}\n Lost baggage policy: policies/lost_baggage_policy.md""",
functions=[
escalate_to_agent,
initiate_baggage_search,
transfer_to_triage,
case_resolved,
],
server_names=["fetch", "filesystem"],
human_input_callback=console_input_callback, # Request input from the console
)
应用程序配置
创建一个 mcp_agent.config.yaml 和一个被忽视的人 mcp_agent.secrets.yaml 定义MCP应用程序配置。这控制日志记录、执行、LLM提供程序API和MCP服务器配置。
MCP服务器管理
mcp代理使连接到mcp服务器变得轻而易举。创建一个 mcp_agent.config.yaml 在下定义服务器配置 mcp 章节:
mcp:
servers:
fetch:
command: "uvx"
args: ["mcp-server-fetch"]
description: "Fetch content at URLs from the world wide web"
gen_client
在异步上下文管理器中管理MCP服务器的生命周期:
from mcp_agent.mcp.gen_client import gen_client
async with gen_client("fetch") as fetch_client:
# Fetch server is initialized and ready to use
result = await fetch_client.list_tools()
# Fetch server is automatically disconnected/shutdown
gen_client函数使建立与MCP服务器的连接变得容易。
持久服务器连接
在许多情况下,您希望MCP服务器保持在线以供持续使用(例如在多步骤工具使用工作流中)。 对于持久连接,请使用:
from mcp_agent.mcp.gen_client import connect, disconnect
fetch_client = None
try:
fetch_client = connect("fetch")
result = await fetch_client.list_tools()
finally:
disconnect("fetch")
MCPConnectionManager为了对服务器连接进行更精细的控制,您可以使用MCPConnectionManager。
Example
from mcp_agent.context import get_current_context
from mcp_agent.mcp.mcp_connection_manager import MCPConnectionManager
context = get_current_context()
connection_manager = MCPConnectionManager(context.server_registry)
async with connection_manager:
fetch_client = await connection_manager.get_server("fetch") # Initializes fetch server
result = fetch_client.list_tool()
fetch_client2 = await connection_manager.get_server("fetch") # Reuses same server connection
# All servers managed by connection manager are automatically disconnected/shut down
MCP服务器聚合器
MCPAggregator 充当“服务器中的服务器”。
它提供了一个MCP服务器接口,用于与多个MCP服务器交互。
这允许您将工具从多个服务器暴露给LLM应用程序。
Example
from mcp_agent.mcp.mcp_aggregator import MCPAggregator
aggregator = await MCPAggregator.create(server_names=["fetch", "filesystem"])
async with aggregator:
# combined list of tools exposed by 'fetch' and 'filesystem' servers
tools = await aggregator.list_tools()
# namespacing -- invokes the 'fetch' server to call the 'fetch' tool
fetch_result = await aggregator.call_tool(name="fetch-fetch", arguments={"url": "https://www.anthropic.com/research/building-effective-agents"})
# no namespacing -- first server in the aggregator exposing that tool wins
read_file_result = await aggregator.call_tool(name="read_file", arguments={})
贡献
我们欢迎任何形式的捐款。请查看 贡献指南 开始吧。
特别提及
已经有令人难以置信的社区贡献者在推动这个项目向前发展:
- 肖恩·史密斯(@evalstate) --世卫组织一直在领导无数复杂的改进工作,包括
mcp-agent并且通常涉及MCP生态系统。 - 林(@StreetLamb) --他为这个项目贡献了无数的时间和优秀的例子,以及伟大的想法。
- Jason Summer(@jasonsum) --用于识别几个问题并调整他的Gmail MCP服务器以与MCP代理配合使用
路线图
我们将添加一个详细的路线图(最好由您的反馈驱动)。目前的优先事项包括:
- 持久执行 --允许工作流暂停/恢复和序列化状态,以便可以无限期地重放或暂停。我们正在努力整合 时序 为了这个目的。
- 记忆 --增加对长期记忆的支持
- 流媒体 --支持流式监听器以实现迭代进度
- 附加MCP功能 --扩展到工具调用之外的支持:
- 资源
- 提示
- 通知
常见问题
使用mcp代理的核心好处是什么?
mcp-agent提供了一种使用以下功能构建AI代理的简化方法: 主控程序 (模型上下文协议)服务器。
MCP是相当低级的,该框架处理连接到服务器、使用LLM、处理外部信号(如人类输入)以及通过持久执行支持持久状态的机制。这让你,开发人员,专注于你的人工智能应用程序的核心业务逻辑。
核心优势:
- 🤝 互操作性:确保任何数量的MCP服务器暴露的任何工具都可以无缝地插入到您的代理中。
- ⛓️ 可组合性和可定制性:实现定义良好的工作流,但以可组合的方式实现复合工作流,并允许跨模型提供者、日志记录、编排器等进行完全定制。
- 💻 程序化控制流程:让事情变得简单,因为开发人员只需编写代码,而不是用图、节点和边来思考。对于分支逻辑,您可以编写
if声明。对于循环,请使用while循环。 - 🖐️ 人工输入和信号:支持暂停外部信号(如人工输入)的工作流,这些信号作为Agent可以进行的工具调用公开。
您需要MCP客户端来使用MCP代理吗?
不,您可以在任何地方使用mcp代理,因为它为您处理MCPClient的创建。这允许您在MCP主机(如Claude Desktop)之外利用MCP服务器。
以下是设置mcp代理应用程序的所有方法:
MCP代理服务器
您可以将mcp代理应用程序作为mcp服务器本身公开(请参阅 例子),允许MCP客户端使用MCP服务器的标准工具API与复杂的人工智能工作流程对接。这实际上是一个服务器的服务器。
MCP客户端或主机
您可以将mcp代理直接嵌入mcp客户端,以管理多个mcp服务器之间的编排。
独立
您可以以独立的方式使用mcp代理应用程序(即它们不是mcp客户端的一部分)。这 examples 都是独立的应用程序。
告诉我一个有趣的事实
我曾讨论过这个项目的命名 silsila (The chain of events),在乌尔都语中意为一连串的事件。事实上,mcp代理更为平淡,但该项目中仍有一个复活节彩蛋向silsila致敬。
