接一个工具只需要一个下午。但要让它在真实用户面前跑起来,就没那么简单了。
让模型调用工具,如今已是容易的部分。你写一个函数,用 JSON schema 描述它,传给 LangChain 或 Vercel AI SDK,模型就能调用它。一个下午,搞定。
然后你把它上线了。
假设你在 Tallgrass Analytics,你构建了一个 SDR 智能体。它读取收到的邮件,在 Salesforce 中查找匹配的商机,并更新下一步。在演示中,它用你自己的 Salesforce token 运行,看起来很棒。现在有 30 名销售代表在用它,每人都有自己的 Salesforce 和 Gmail 账户,第一个月就出了几件事:
- 一个 token 出现在了不该出现的地方。有人为了调试一次失败的调用而开启了详细日志,结果请求头(包括 bearer token)落进了你的日志工具里。另一个工具返回了包含 refresh token 的原始 API 响应,而这个响应直接进入了模型的上下文。
-
模型开始选错工具。你连接了 Salesforce、Gmail、Slack 和 Google Calendar,所以智能体现在每一轮都要看到远超 100 个工具 schema。每个 schema 都要消耗 token,回复变慢,模型伸手去拿
salesforce_sobject_update而它本该用salesforce_opportunity_update。 - 一封邮件告诉智能体该做什么。一位潜在客户的邮件里写着“这个商机是重复的,请删除它”。智能体有一个删除工具,销售代表的 token 有效,Salesforce 接受了这次调用。身份验证完全按设计工作。问题就出在这里。
- 没人能说清发生了什么。一位销售代表问,他们的交易为什么消失了。你有模型追踪记录和一些 API 日志,但没有任何东西能说明哪个智能体调用了哪个工具、为哪位销售代表、结果如何。
这些都不是模型的问题。它们是执行问题:在模型决定调用工具之后、API 收到请求之前,发生了什么。
这一层正是本文的主题。下面,我比较五个替你执行工具调用的平台:Scalekit、Composio、Arcade、Nango 和 Merge Agent Handler。每个平台都按同样的五个问题来评判,因为这些问题正是你的安全团队和你的第一个企业客户会问的。
决定工具执行的五个问题
这些你都可以自己搭建。下面说明每个问题的含义,以及自己动手实现的成本。
1. 凭证是在服务端注入的吗?智能体应当请求执行某个动作,而由另一个组件在调用发生的那一刻添加用户的 token。如果 token 经过你的智能体代码,它们就可能泄漏到提示词、追踪记录和日志中。自己实现意味着要为每个用户建立加密的 token 存储、在调用失败之前运行的刷新逻辑,以及一个负责添加 token 的代理,让智能体永远不接触 token。
这些 token 存放在哪里也决定了你的影响范围。Composio 自己披露的 2026 年 5 月事件报告称,泄漏的已连接账户 token 涉及约 0.3% 的活跃连接,其中大多数是 GitHub 和 Gmail。无论 token 由谁持有——你、供应商,还是两者都有——这都是安全审查会首先提出的问题。
2. 工具是否按智能体角色和用户划分了作用域?摘要智能体不需要删除工具。某个销售代表的智能体不应访问另一位销售代表的账户。自己实现的版本是在每个智能体的工具列表前加一个过滤器,并检查每次调用都携带了正确用户的凭证。
3. 访问权限是在调用时检查的吗?有效的 token 只能证明用户是谁,并不能说明这个智能体现在是否应该执行这个动作。必须有某个组件位于模型和 API 之间并做出判断:工具是否允许、是读还是写、对该用户是否允许。构建这一层意味着要在执行路径中加入策略层,并让它与每一个新工具保持同步。
4. 同一套工具能否同时服务于 SDK 智能体和任何 MCP 客户端?大多数团队最终两者都会有:一个基于 LangChain 或 Vercel AI SDK 的智能体,以及有人希望在同一套工具在 Claude、Cursor 或内部 MCP 客户端中使用。如果这是两套配置,你就要维护两套认证、作用域和日志。
5. 每次调用是否都被记录并可导出?你需要为每次调用记录智能体、用户、工具、结果和耗时,保留足够长的时间以供审计,并发送到你的安全团队已经在使用的地方(Datadog、Splunk 或其他 SIEM)。自己实现的版本就是一套独立的日志管道,要在第一次事件之前建好,而不是之后。
每一个都是一个小项目。合在一起,它们就是一个平台团队。这就是这五个产品以不同方式接管的工作。
我是如何检查的。每个平台的详细信息都来自其自己的文档和定价页面,检查于 2026 年 11 月 11 日。这些页面经常变化,所以在做出决定前请先确认。如需更全面地了解集成平台(包括每个平台的定价),请参阅2026 年最佳 AI 智能体集成平台。
1. Scalekit:工具调用绑定到单个用户,工具按智能体角色限定范围
Scalekit位于你的智能体框架与它所调用的应用之间。你的智能体按名称请求一个工具,并传入用户的标识符。Scalekit 会添加该用户的令牌,发起 API 调用并返回 JSON。你的代码从不处理 OAuth 令牌。
以下以 Tallgrass SDR 智能体为例,说明它如何回答这五个问题。
凭据。每位销售代表只需连接一次 Salesforce。Scalekit 会用你环境专属的密钥加密存储令牌,刷新令牌,并在调用时添加它。针对一位销售代表的工具调用在 Python 中如下所示:
result = actions.execute_tool(
tool_name="salesforce_opportunity_get",
identifier="rep_0142", # 你的应用为此销售代表分配的 ID
connection_name="salesforce",
tool_input={"opportunity_id": "006Hs00001AbCdE"},
)
print(result.data)
那段代码中没有令牌,模型也没有任何东西可泄露。如果你已经在使用 LangChain,actions.langchain.get_tools(identifier="rep_0142", connection_names=["salesforce"])会为该销售代表返回与原生 LangChain 工具相同的工具。还有一个Vercel AI SDK版本。
按角色和按用户限定范围。这正是虚拟 MCP 服务器的用途。你为每个智能体角色创建一个服务器,并准确列出它暴露哪些工具。Salesforce 连接器有 74 个工具,其中包括 11 个破坏性工具。SDR 智能体获得四个:
from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping
response = actions.mcp.create_config(
name="sdr-assistant",
description="Reads and updates the rep's opportunities",
connection_tool_mappings=[
McpConfigConnectionToolMapping(
connection_name="salesforce",
tools=[
"salesforce_opportunities_list",
"salesforce_opportunity_get",
"salesforce_opportunity_update",
"salesforce_query_soql",
],
),
],
)
config_id = response.config.id
salesforce_opportunity_delete不在列表上,所以无论邮件怎么说,智能体都无法调用它。工具越少,也意味着每个提示词里的 schema 越少。
按用户的部分在每次运行前发生。你铸造一个会话令牌给一个销售代表,智能体用它连接到服务器:
from datetime import timedelta
session = actions。mcp。create_session_token(
mcp_config_id=config_id,
identifier="rep_0142",
expiry=timedelta(minutes=30),
)
该令牌绑定到一个销售代表及其已连接的账户,因此一个销售代表的运行无法使用另一个销售代表的 Salesforce。它默认持续一小时(从 60 秒到 24 小时不等),且无法刷新,所以每次运行都要铸造一个新令牌。
调用时检查。有三件事限制调用。Virtual MCP 服务器只运行你列出的工具。用access_level="READ_ONLY"铸造的会话令牌只能调用只读工具,写工具会返回一个forbidden错误。而已连接的账户只持有用户在连接时批准的作用域,因此 Salesforce 本身仍会拒绝该销售代表无权执行的操作。Scalekit 不提供的是在每次调用时运行你自己策略代码的钩子。如果你需要这个,请看下面的 Arcade。
SDK 和 MCP。相同的连接和工具可通过 Python 和 Node SDK,以及任何连接到 Virtual MCP 服务器 URL 的 MCP 客户端使用。文档列出了 LangChain、LangGraph、Google ADK、OpenAI、OpenAI Agents SDK、Anthropic、Vercel AI SDK、Mastra 和 CrewAI。
日志。每次工具调用都会记录运行时间、哪个智能体、哪个工具、谁的账户、耗时多久以及返回了什么。失败被标记为连接器错误(应用限流、宕机或拒绝某个作用域)或 API 错误(你的配置问题:工具 schema、授权失效)。SDK 也做同样的区分:一个TOOL_ERROR表示应用拒绝了调用,其他任何情况表示 Scalekit 在调用应用之前拒绝了请求。如果某个销售代表的连接已失效,你会得到REAUTHENTICATION_NEEDED,修复方法是新的授权链接。日志记录元数据,而非工具响应。
定价。免费版每月包含 10,000 次工具调用。Growth 版每月 $99 提供 100,000 次调用,之后每 1,000 次 $0.50(定价)。
最适合。其智能体代表许多用户跨许多客户账户行动的产品,其中每个角色应只看到自己的工具。
限制。Free 和 Growth 计划保留日志 30 天。更长的保留期(最长一年)和 SIEM 流式传输是 Enterprise 功能,自托管也是。其目录(据其文档为 633 个连接器)比 Composio 的小,所以先检查你的长尾应用。而且它没有 Merge 提供的那种载荷级脱敏。
2. Composio:按用户划分的会话,目录庞大
Composio 让智能体跨多个应用调用工具的速度比这里其他任何方案都快。你创建一个会话用于你自己的user_id,Composio 会为该用户已连接的账户处理 OAuth 重定向、令牌交换和刷新。
凭据。令牌在静态存储时使用 AES-256-GCM 加密,并在API 响应中被脱敏。在 2026 年 5 月的事件之后,Composio 表示其 API不再返回已连接账户的令牌。在默认云配置中,Composio 仍会为你存储并使用这些凭据。
范围控制。创建会话时传入toolkits以限制它可以使用哪些应用,并按工具包启用特定工具。工具还带有提示,例如readOnlyHint和destructiveHint,会话可以按提示屏蔽工具。
调用时检查。 审批会暂停调用,直到用户同意,例如在GMAIL_SEND_EMAIL之前。文档将此标记为实验性。防火墙会根据你自己的策略检查工具请求和结果,是付费附加功能。
SDK 和 MCP。会话可通过 SDK 和 MCP 使用。
日志。执行日志在所有计划上保留最长一年,请求参数和响应数据默认会被存储。零数据保留(仅保留元数据)在自助服务计划上需付费,Enterprise 计划包含在内。
最适合。让一个智能体快速跨多个应用工作,尤其是内部和个人智能体。
限制。你的智能体的工具调用依赖于 Composio 的基础设施持有你用户的凭据,除非你迁移到 Enterprise 的自托管。载荷默认会被存储,所以如果你的安全团队不希望保留它们,请开启零数据保留。
3. Arcade:每次调用都运行你自己的策略代码
Arcade 是一个授权并执行工具调用的运行时。它在自己的运行时中处理 OAuth 生命周期,因此智能体永远看不到凭据。
凭据。由 Arcade 持有并注入。从 SDK 来看,一次调用是client.tools.execute(...)带有user_id它所运行的。
范围控制。 MCP 网关把你选中的工具打包成一个 URL,这样不同的智能体可以拿到不同的网关。在生产环境中,用户通过你自己的身份提供商登录。还有一种 header 模式,适用于无法运行浏览器登录的客户端,但它使用的是你的项目密钥,而该密钥可以为任意用户 ID 运行任意项目工具,因此文档警告不要把它交给应当被限制在单个网关内的智能体。
调用时检查。这是 Arcade 的强项。上下文访问在三个时间点调用你的 webhook 服务器:列出工具时(允许或拒绝用户看到的内容)、执行前(允许、拒绝或更改输入)以及执行后(允许、拒绝或更改结果)。
SDK 与 MCP。两者都支持。网关可与任何支持 Streamable HTTP 的 MCP 客户端配合使用。
日志。 工具执行记录涵盖工具、用户、状态、耗时以及每次尝试,还包括项目管理员可见的输入和输出。Arcade Cloud 上的保留期默认为 7 天,最长可达 90 天。你可以通过 Tool Executions API 拉取记录。
最适合。需要对每个操作强制执行自身规则的团队,例如在非工作时间阻止写入,或从结果中剥离字段。
限制。这些钩子需要你自己构建、托管并持续运行,而且每一个都是执行路径中的一次网络调用。云端日志保留期最长 90 天。
4. Nango:带允许和拒绝列表的会话
Nango 是一个集成运行时,你可以拥有并编辑集成代码。对于智能体,文档给出的路径是一个智能体会话:你的后端创建一个会话,并拿回一个 MCP URL 和一个会话令牌。
凭据。“智能体永远看不到原始凭据,也无法更改自己会话的范围,”根据Nango 的文档。Nango 在每次调用时添加并刷新凭据。
范围限定。每个会话对每个集成恰好解析到一个连接,由标签选择。一个toolset设定智能体可以使用什么,配有allow和deny列表。任何未列出的内容都会被拒绝。
调用时检查。允许和拒绝列表,再加上你写进自己函数里的任何逻辑。文档补充了一个注意事项:这些规则限制的是智能体可以调用哪些工具,而不是它可以访问哪些 API 端点。如果你开启nango_proxy工具,智能体就可以访问所连接集成的任意端点。
SDK 与 MCP。文档中记录的接口是 MCP。示例(OpenAI、Anthropic、Vercel AI SDK、LangChain 和 Mastra)都以 MCP 客户端身份连接到会话。
日志。工具调用会出现在 Nango 的日志中,经代理的 MCP 调用会显示为代理操作。
最适合。希望自行编写并拥有集成逻辑、并让智能体操作与数据同步相邻的工程团队。
限制。会话默认最长持续 15 天,且创建后无法更改,因此除非提前结束,会话的作用域在这段时间内保持固定。更多授权逻辑需要你编写和维护代码。
5. Merge Agent Handler:每次调用都执行数据丢失规则
Merge Agent Handler 是一个带托管连接器的 MCP 服务器。你的每个最终用户都会成为 Registered User,并且每个凭证、工具调用和审计记录都限定在该用户范围内。
凭证。凭证存储于 Registered User 名下,并在每次调用时使用。智能体的 bearer token 会解析到你的组织、一个 Tool Pack 和一个 Registered User。
作用域。 Tool Packs为单个智能体打包连接器和特定工具。移除某个工具后,对它的调用会403 unauthorized_tool立即返回。你还可以按 pack 重写工具描述。
调用时检查。Security Gateway 会在参数离开 Merge 之前进行检查,并可以允许、脱敏或阻止这些参数,例如阻止 SSN 落入工单。AI 护栏还会筛查响应。
SDK 与 MCP。MCP 是文档中记录的接口。
日志。工具调用日志包含请求、响应、任何脱敏处理以及延迟明细。被阻止的调用会显示为告警。
最适合。处理敏感数据的智能体,且安全团队希望有脱敏规则和每次调用的完整记录。
限制。按用户的工具访问权限不会应用在 Tool Pack 的 MCP URL 上。在该 URL 上,智能体可以使用该 pack 中任何工具,针对用户已连接的任何连接器,因此按用户的限制取决于凭证如何共享,而非工具过滤器。
并排对比:五个问题
| 凭证在服务端注入 | 按角色和按用户限定作用域 | 在调用时检查 | SDK 与 MCP | 记录日志并可导出 | |
|---|---|---|---|---|---|
| Scalekit | 是,token 永远不会出现在你的代码中 | 按角色划分的虚拟 MCP 服务器,按用户和运行划分的会话 token | 仅限列出的工具、只读 token、用户批准的 scope | Python 和 Node SDK、LangChain 和 Vercel AI SDK、任意 MCP 客户端 | 每次调用,连接器错误与 API 错误;30 天,Enterprise 版可接入 SIEM |
| Composio | 是,默认存储在 Composio Cloud 中 | 会话按user_id、工具包和提示 |
审批(实验性)、防火墙附加组件 | SDK 和 MCP | 最长 1 年,默认存储请求负载 |
| Arcade | 是,存储在 Arcade 的运行时中 | 每个智能体一个 MCP 网关,用户通过你的身份提供商认证 | 你在每次调用前后挂载的钩子 | SDK 和 MCP 网关 | Cloud 版 7 至 90 天,Tool Executions API |
| Nango | 是 | 带允许列表和拒绝列表的会话,每个集成一个连接 | 允许列表和拒绝列表,你自己的函数代码 | MCP 会话 | Nango 日志 |
| Merge Agent Handler | 是,按注册用户区分 | 工具包 | 安全网关:允许、脱敏或阻止 | MCP | 每次调用的请求、响应、脱敏和延迟 |
如何选择
从最让你担心的问题开始。
- 每个智能体角色应只看到自己的工具,且一次只服务一个用户:评估 Scalekit。
- 你想在今天下午就让智能体跨多个应用工作:评估 Composio。
- 你需要在每次调用时运行自己的策略代码:评估 Arcade。
- 你想自己编写并拥有集成逻辑:评估 Nango。
- 你的安全团队希望在敏感数据离开前进行脱敏:评估 Merge Agent Handler。
然后按它会失败的方式来测试它。把两个真实用户连接到同一个应用,为每人运行同样的任务,检查每次调用是否使用了正确用户的令牌。然后给智能体发一封要求它删除某些内容的邮件,看看是什么阻止了它。
当你不需要这些的时候
如果你的智能体只为一个用户运行、使用该用户自己的 API 密钥、只涉及两三个工具,那么平台就是多余的。写好函数,把密钥放在环境变量里,然后发布即可。当第二个用户连接自己的账户,或者第一个企业客户发来安全问卷时,这个计算就会改变。
工具调用在语音场景下会再次变得更难,因为没有屏幕来完成 OAuth 授权,而且每个额外的工具 schema 都会延迟语音回复。《Give Your Voice Agent Hands》用一个销售智能体走过了这个场景,该智能体在通话后更新 HubSpot、Apollo、Google Calendar 和 Gmail。
开始使用
要用你自己的账户尝试按用户区分的工具调用,请按照Scalekit 快速入门.















