Skip to content

MCP

MCP 把外部工具服务暴露给 AI 应用。Agently 通过 MCPActionExecutor 把 MCP tool 接入 Action Runtime,所以模型会把 MCP tool 和本地 @agent.action_func 看成同一组可用能力。

如果工具已经由 MCP server 提供,不需要再把它包装成本地函数。

先分清 Server、Client 和 Host

MCP 接入企业系统时,最容易误判的是:写完 Server 不等于治理完成。

角色负责什么
MCP Server暴露工具、资源或 prompt,定义 schema,执行真实能力
MCP Client管连接、握手、发现和调用转发
MCP Host决定什么时候让模型看到哪个能力、如何注入身份、怎么脱敏、如何审计

Agently 的 use_mcp(...) 帮你把 MCP tools 接进 Action Runtime;业务应用仍要掌握 Host 责任。尤其是一个后端服务多个最终用户时,不能把桌面客户端式的 Host 假设直接搬进企业应用。

企业 Host 至少要处理:

  • 当前 end-user 的身份和 token 如何透传到 MCP Server;
  • 不同角色或任务阶段能看到哪些 MCP tools;
  • 返回结果进入模型上下文前如何脱敏、聚合或裁剪;
  • Host 为什么暴露、选择和调用某个工具,如何留下审计记录。

这些不是模型该即兴决定的内容,也不是 MCP Server 能单独替应用完成的业务编排。

先接一个 HTTP MCP endpoint

python
import asyncio
from agently import Agently

agent = Agently.create_agent()


async def main():
    await agent.use_mcp(
        "https://example.com/mcp",
        headers={"Authorization": "Bearer <token>"},
    )

    result = agent.input("用可用工具回答这个问题。").get_result()
    print(await result.async_get_text())


asyncio.run(main())

use_mcp(...) 是 async,因为它需要连接服务、列出 tools 并注册到 action surface。

HTTP、stdio 和 legacy SSE

服务集成优先使用 URL / Streamable HTTP MCP endpoint。本地开发、桌面客户端或单用户本地 server 可以用 stdio command config。SSE endpoint 只作为 legacy 兼容路径。

stdio 示例:

python
await agent.use_mcp({
    "mcpServers": {
        "filesystem": {
            "command": "npx",
            "args": [
                "-y",
                "@modelcontextprotocol/server-filesystem",
                "./workspace",
            ],
        }
    }
})

和本地 Action 混用

python
@agent.action_func
async def lookup_internal(id: str):
    """在内部数据库查记录。"""
    ...


await agent.use_mcp("https://example-mcp/server")
agent.use_actions([lookup_internal])

result = agent.input(question).get_result()
answer = await result.async_get_text()

MCP tools 和本地 actions 没有固定优先级。模型根据名称、描述和 prompt 上下文选择。

看实际调用了什么

python
turn = agent.input("使用 MCP server 回答这个问题。")
records = agent.get_action_result(prompt=turn.prompt)

for record in records:
    print(record)

action 记录写入 extra.action_logs。旧 tools 入口下的兼容字段是 extra.tool_logs

密钥怎么传

优先使用 header 和环境变量:

python
await agent.use_mcp(
    "https://example.com/mcp",
    headers={"Authorization": f"Bearer {token}"},
)

URL query 参数可能进入日志。除非服务只能这样鉴权,否则不要把密钥拼在 URL 里。

什么时候不用 MCP

  • 工具只是应用里的一个本地函数,直接用 @agent.action_func 更简单。
  • 工具调用频率高、延迟敏感,hosted MCP 服务成为瓶颈。
  • 需要本地托管 sandbox、browser、SQLite 生命周期,可以先看 Execution Environment。
  • 还没有明确 Host 侧身份、可见工具裁剪、脱敏和审计策略。先把治理边界设计清楚,再接生产 MCP Server。

常见误用

  • 忘记 await agent.use_mcp(...)
  • 把密钥放进 URL query。
  • 把远程 MCP 当本地函数一样频繁调用,忽略网络延迟和限速。
  • 手工把 MCP tool 描述写进 prompt,而不是让 action runtime 注入真实工具目录。
  • 不看 action logs,无法确认模型到底调用了哪个 MCP tool。
  • 把 MCP 当成权限和脱敏方案。MCP 标准化能力供应,企业治理仍要由 Host / Actions / ExecutionEnvironment / Observability 承担。

下一步