news 2026/10/7 20:03:08

用MCP扩展NOOA能力边界:把外部MCP服务器变成Agent的即插即用工具

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用MCP扩展NOOA能力边界:把外部MCP服务器变成Agent的即插即用工具

用MCP扩展NOOA能力边界:把外部MCP服务器变成Agent的即插即用工具

【免费下载链接】labs-OO-AgentsNVIDIA Object Oriented Agents: the Pythonic way to build AI Agents.项目地址: https://gitcode.com/gh_mirrors/la/labs-OO-Agents

如果你正在用 NOOA(NVIDIA Object Oriented Agents)构建 AI Agent,那么 Model Context Protocol(MCP)是你扩展能力的最佳入口:只需一个配置文件和一行代码,就能把任意外部 MCP 服务器变成 Agent 的即插即用工具,而不用手写任何工具定义。本文带你用 3 步完成接入,并讲清楚 NOOA 背后的工作方式。

MCP 能为 Agent 做什么 🧩

NOOA 的核心理念是"Agent 就是一个 Python 对象":字段是状态,方法是能力,docstring 是提示词。但再强大的 Agent 也需要"手脚"——查询知识库、调用数据库、操作浏览器等能力往往封装在外部服务中。

MCP 正是为这类场景而生的开放协议。一个 MCP 服务器会声明一组带 JSON Schema 的工具(tools),任何符合协议的客户端都能发现并调用它们。NOOA 在 src/nooa/mcp/ 模块中完整实现了客户端侧能力:

  • 自动发现:连接服务器后自动拉取工具列表
  • 动态生成:为每个 MCP 工具生成带类型注解的异步方法
  • 即插即用:工具实例作为一个普通字段挂到 Agent 上,LLM 即可直接调用

三步完成即插即用接入 🔌

NOOA 官方提供了一个零网络依赖的完整示例:一个内置的 wiki 知识搜索服务器(examples/assets/wiki_mcp_server.py),配合 examples/quickstart/11_mcp.py 即可跑通全流程。

第一步:安装 MCP 扩展依赖

MCP 支持是独立扩展包,安装方式:

uv sync --extra mcp # 仓库内开发环境 # 或 uv add "nooa[mcp]" # 在项目中安装

第二步:用 .mcp.json 注册 MCP 服务器

NOOA 直接复用了 VS Code / Claude Code 的.mcp.json配置格式,你在别处写过的配置可以原样搬过来。示例中的配置(见 examples/quickstart/.mcp.json):

{ "mcpServers": { "wiki": { "command": "python", "args": ["examples/assets/wiki_mcp_server.py"], "transport": "stdio" } } }

第三步:把 MCP 工具声明为 Agent 字段

核心代码只有几行(完整版本见 examples/quickstart/11_mcp.py):

class WikiAgent(Agent, llm=llm): """Agent with MCP tool access to an internal wiki.""" wiki: MCPTool def __init__(self, **kwargs): super().__init__(**kwargs) self.wiki = MCPManager.create_from_server( "wiki", mcp_file=MCP_CONFIG, args=[WIKI_SERVER] ) async def respond(self, prompt: str) -> str: """Answer the user's question using the wiki search tool. ...""" ...

调用MCPManager.create_from_server("wiki")后,self.wiki就是一个"活的"工具对象——服务器上每声明一个 MCP 工具,它就会多出一个对应的异步方法(如search_wiki),LLM 在推理时像调用普通 Python 方法一样调用它。

NOOA 让 MCP 工具"原生"化的三个细节 ⚡

1. JSON Schema 变 Python 签名NOOA 会读取每个工具的 input schema,自动生成带类型注解的方法(string→str、integer→int 等),并把 min/max、pattern、enum 等约束写进 docstring,让 LLM 在生成调用代码时"看得见"参数约束。相关实现在 src/nooa/mcp/tool.py。

2. 每个实例独占一条连接每个MCPTool实例与一个 MCP 客户端一一对应(src/nooa/mcp/tool.py),连接状态互相隔离,多 Agent、多服务器并存时不会串线。

3. 连接失败报错"可读"工具调用失败时,NOOA 会展开 ExceptionGroup,把真正的底层错误(如 HTTP 401、超时原因)提炼成人话抛给 Agent,方便其自我纠错;若配置了 OAuth,遇到 401 还会自动刷新令牌并重试一次(src/nooa/mcp/oauth.py)。

选对传输方式:stdio / SSE / streamable-http

create_from_server支持三种传输(src/nooa/mcp/client.py):

传输适用场景特点
stdio本地脚本型服务器子进程启动,零网络配置,开发调试首选
sse现有 HTTP 服务兼容老式 Server-Sent Events 服务器
streamable-http云端/远程 MCP 服务现代主流方案,支持 OAuth 鉴权

经验法则:本地开发用 stdio,生产接云服务用 streamable-http。对于调用慢工具(如内部再套一次 LLM 调用)的服务器,记得调大tool_call_timeout(默认 60 秒)。

上手清单与常见坑 💡

  1. 忘记装扩展:ImportError: nooa[mcp] not installed→ 执行uv sync --extra mcp
  2. stdio 服务器路径错误:相对路径受工作目录影响,示例中通过Path(__file__).resolve()做了修正,建议照抄这个习惯
  3. 一个 Agent 实例一个 MCPTool:工具实例持有连接状态,请在__init__中创建,不要跨实例共享
  4. 工具方法名冲突:MCP 工具名会规范化为 Python 方法名,避免与 Agent 已有方法重名

深入阅读 📚

  • 完整示例代码:examples/quickstart/11_mcp.py
  • 配套 MCP 服务器源码:examples/assets/wiki_mcp_server.py
  • MCP 管理器与工具生成实现:src/nooa/mcp/tool.py
  • 工具可见性机制说明:docs/concepts/tools-and-visibility.md
  • 更多可运行示例索引:examples/README.md

从.mcp.json到 Agent 字段,MCP 服务器在 NOOA 里只需要"名字 + 一个字段"。把生态里现成的 MCP 工具搬进来,你的 Agent 能力边界也随之打开。

【免费下载链接】labs-OO-AgentsNVIDIA Object Oriented Agents: the Pythonic way to build AI Agents.项目地址: https://gitcode.com/gh_mirrors/la/labs-OO-Agents

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 20:01:41

基于S7-200 PLC与组态王的物料传送带控制系统设计与调试

1. 需求拆解与方案选型:先搞清楚传送带到底要什么我最早拿到这个题目的时候,第一反应是:物料传送带装置听着简单,不就是电机转起来把东西送过去嘛。但真正开始做才发现,一个能称为"装置"而不是"一台电机…

作者头像 李华
网站建设 2026/10/7 20:00:36

义乌出口退税公司如何选择?

义乌出口退税公司如何选择?在选择义乌出口退税公司时,企业应综合考虑公司的专业能力、服务范围、客户口碑以及合规性等因素。以下是几个关键点,帮助企业做出明智的选择。1. 专业能力与团队背景选择一家具备丰富经验和专业知识的公司至关重要。…

作者头像 李华
网站建设 2026/10/7 19:59:31

Manus开放注册后,用TaoToken统一Key跑通MCP智能体工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/7 19:59:23

GY-30光照传感器入门指南:零基础玩转ESP32 I2C通信

1. 为什么GY-30是零基础学ESP32时最值得优先动手的传感器?刚拿到一块ESP32开发板,面对密密麻麻的引脚和一堆英文手册,很多人第一反应是:从哪下手?烧个LED灯?太单薄;连个WiFi发个HTTP请求&#x…

作者头像 李华