用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 秒)。
上手清单与常见坑 💡
- 忘记装扩展:
ImportError: nooa[mcp] not installed→ 执行uv sync --extra mcp - stdio 服务器路径错误:相对路径受工作目录影响,示例中通过
Path(__file__).resolve()做了修正,建议照抄这个习惯 - 一个 Agent 实例一个 MCPTool:工具实例持有连接状态,请在
__init__中创建,不要跨实例共享 - 工具方法名冲突: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),仅供参考