AI代理框架

mcp-agent是一个基于Model Context Protocol(MCP)的轻量级AI代理框架,支持构建可组合的多代理工作流,适用于自动化任务处理、内容生成和复杂决策场景。

  • by Nghiauet
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 nghiauet/mcp-agent

使用说明

Build effective agents with Model Context Protocol using simple, composable patterns.

Examples | Building Effective Agents | MCP

概述

mcp-agent 是一个简单、可组合的框架,用于构建代理 模型上下文协议.

灵感Anthropic为AI应用程序开发人员宣布了两项基础更新:

  1. 模型上下文协议 -一个标准化的界面,让AI助手可以通过MCP服务器访问任何软件。
  2. 构建高效代理 -一篇关于构建生产就绪人工智能代理的简单、可组合模式的开创性文章。

mcp-agent 将这两个基础部分放入AI应用程序框架中:

  1. 它可以处理管理MCP服务器连接生命周期的麻烦业务,因此您不必这样做。
  2. 它实现了《构建有效代理》中描述的每个模式,并在 可组合的 方法,允许您将这些模式链接在一起。
  3. 奖金:它实现了 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代理提供了几种路由器实现,包括:

[!注意]

链接到完整示例

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={})

贡献

我们欢迎任何形式的捐款。请查看 贡献指南 开始吧。

特别提及

已经有令人难以置信的社区贡献者在推动这个项目向前发展:

路线图

我们将添加一个详细的路线图(最好由您的反馈驱动)。目前的优先事项包括:

  • 持久执行 --允许工作流暂停/恢复和序列化状态,以便可以无限期地重放或暂停。我们正在努力整合 时序 为了这个目的。
  • 记忆 --增加对长期记忆的支持
  • 流媒体 --支持流式监听器以实现迭代进度
  • 附加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致敬。