工具与 MCP
LLM 本身只会"说话"。要让它实际操作世界——查天气、查数据库、写文件、调 GitHub API——必须给它接「工具」。这一页讲 ETOS 的三类工具,以及怎么用「审批策略」保证 AI 不会乱来。
这些名词先说清楚
工具是什么
工具就是"模型可以调用的函数"。每个工具有名字、说明、参数列表。模型在回答时如果觉得需要工具,会输出一个工具调用请求,App 帮它真的执行,把结果再喂给模型继续生成。
举个最简单例子:你问"今天北京天气怎么样?",AI 自己其实不知道。如果给它接了天气工具,它会:
- 输出:「调用
getWeather,参数city=北京」 - App 真的去查天气,把结果("晴,22℃")喂回去
- AI 用这个结果生成中文回答给你
没工具的话,AI 只能说"我无法查询实时天气"。
ETOS 的三类工具
| 类别 | 来自哪里 | 在哪管理 |
|---|---|---|
| 拓展工具(本地工具) | App 内置 | 设置 → 工具中心 → 拓展工具 |
| MCP 工具 | 你连接的 MCP 服务器 | 设置 → MCP 工具集成 |
| 快捷指令工具 | iOS Shortcuts 暴露的指令 | 设置 → 快捷指令工具集成 |
| Agent Skills | 你导入的 Skill 包(用脚本/资源给模型加专项能力) | 设置 → Agent Skills |
它们彼此独立
你完全可以只用本地工具,或只接 MCP,或只用 Skills。不要因为 ETOS 提供了 4 套就觉得必须全开。
新手必读
工具中心:所有工具的总开关
打开「设置 → 工具中心」会看到一个工具大列表。每个工具行有三件东西:
| 元素 | 作用 |
|---|---|
| 总开关(Section 顶部) | 「向模型暴露拓展工具」/「向模型暴露 MCP 工具」 —— 关掉这个,对应类别的工具就全部不再发给模型。 |
| 单项工具开关 | 单独控制某个工具是否暴露。比如你可能只想给 AI getWeather 但不给 executeShellCommand。 |
| 审批策略 | 控制工具被调用时的"放行规则",详见下文。 |
工具中心顶部还有搜索框(占位文字「搜索工具」),适合在工具数量多时找。
审批策略:三档可选
这是 ETOS 工具系统最重要的概念——它防止 AI 没经过你同意就执行高风险操作。
每个工具的审批策略有三档:
| 策略 | 行为 | 适合谁 |
|---|---|---|
| 每次询问(默认) | AI 想调这个工具时,会先弹出确认气泡问你 | 不熟悉这个工具行为时;或工具有副作用(写文件、发请求)时 |
| 总是允许 | 直接放行,不打扰你 | 你已经信任这个工具且确认它安全(比如计算器、查天气这种纯读取) |
| 始终拒绝 | AI 永远调不到这个工具,连询问都不会出现 | 你不希望某个工具被使用(比如不想让 AI 操作文件) |
询问气泡长什么样
当审批策略是「每次询问」时,AI 想调用工具会在聊天页弹出一个气泡,给你 5 个按钮:
| 按钮 | 干什么 |
|---|---|
| 允许(绿色✓) | 放行这一次 |
| 拒绝(红色✗) | 拒绝这一次,AI 会被告知"用户拒绝了" |
| 补充提示(蓝色) | 拒绝并补充一段提示给 AI,让它换种方式 |
| 保持允许(青色) | 这次允许,且把这个工具的策略改成「总是允许」,下次不再问 |
| 完全权限(紫色) | 这次允许,且把所有工具的策略都改成「总是允许」 |
::: warning「完全权限」是个核弹按钮 按一次相当于解除所有工具的限制。只在你已经完全理解所有已启用工具的行为后再用。 :::
拓展工具(App 内置)
ETOS 已经内置了一组开箱即用的工具:
| 工具 | 干什么 |
|---|---|
| 文件操作类 | 搜索文件、分块读取、差异查看、局部编辑、移动、复制、删除(仅在 App 沙盒内,不能动你的整个文件系统) |
| 数据库类 | SQLite 数据库操作 |
| 网页卡片 | 让 AI 把外部链接整理成卡片样式插入到聊天里 |
| 反馈 | AI 可以自动给开发者提反馈工单 |
| 计算 / 文本处理 | 各种基础数据操作 |
| 写入记忆 | 让 AI 主动把"用户偏好""项目背景"写入长期记忆系统 |
这些都在 设置 → 工具中心 → 拓展工具 里逐项开关。
怎么用:典型场景
场景 1:让 AI 帮你查文件
- 设置 → 工具中心 → 拓展工具
- 打开「向模型暴露拓展工具」总开关
- 把"文件搜索""文件读取"两个工具开关打开
- 回到聊天,问"找出我的 Markdown 笔记里提到'年度总结'的文件"
- AI 会请求调用文件搜索工具 → 弹询问气泡 → 你按"允许"
- AI 拿到结果后给你列表
场景 2:让 AI 总结某个网页
- 设置 → MCP 工具集成 → 接入一个 Fetch 类的 MCP 服务器(详见下文)
- 聊天里发"帮我看下 https://example.com/blog/abc 这篇文章"
- AI 调用 Fetch 工具拉网页内容 → 你审批 → AI 总结
MCP 是什么 / 为什么要用
MCP(Model Context Protocol)是 Anthropic 开源的一套开放协议,定义了「模型客户端如何标准化地连接外部工具服务器」。
打个比方:
- 没 MCP 之前:每个 LLM 客户端都自己写各种插件,工具难复用
- 有了 MCP:工具开发者按 MCP 规范写一个服务器,任何支持 MCP 的客户端(ETOS、Claude Desktop、Cursor 等)都能用
ETOS 内置了完整的 MCP 客户端,可以连任何符合 MCP 规范的服务器——包括官方维护的(filesystem、github、postgres、puppeteer 等几十个)和社区项目(搜索、邮件、地图、各种 SaaS API)。
接你的第一个 MCP 服务器
位置:设置 → MCP 工具集成 → 右上角「+ 新增 MCP Server」
会进入「新增 MCP Server」表单:
基本信息
| 字段 | 填什么 |
|---|---|
| 显示名称 | 自己给它起名,比如「GitHub MCP」「网页抓取」 |
| 传输类型 | 三选一:Streamable HTTP(推荐)/ SSE / HTTP。新服务器优先用 Streamable HTTP。 |
服务地址
填服务器实际地址。比如官方 fetch 服务器可能是 https://fetch-mcp.example.com/mcp。
具体地址要查你接的那个服务器的文档。
鉴权(可选)
如果服务器要鉴权,可以填:
- Bearer API Key:填一个 Token,最常用
- OAuth 2.0:完整 OAuth 流程,填 Token Endpoint、Client ID、Scope 等
请求头覆盖(可选)
支持 key=value 表达式,包含 {token} 占位符(会被上面的 Bearer API Key 替换):
Authorization=Bearer {token}
X-Org-ID=org_abc保存 → 自动握手
保存后 ETOS 会自动尝试 MCP 握手。成功后会拉到这个服务器公布的工具列表,自动出现在工具中心里。
聊天工具总开关
「设置 → MCP 工具集成 → 向模型暴露 MCP 工具」是一键总开关。
「关闭后不会再把任何 MCP 工具提供给模型,也不会响应聊天中的 MCP 工具调用。服务器连接、调试和单项配置仍可继续使用。」
适合"我接了一堆 MCP 但今天不想让 AI 用任何工具"这种场景。
进阶选项
会话级隔离
某些会话你可能希望"完全不带工具"——比如你在用某个特定世界书做角色扮演。
机制:当一个会话开启了世界书的"隔离发送"模式时,工具列表里会显示「当前会话因世界书隔离发送而不会实际启用该工具」,AI 在这个会话里调不到任何工具。
详见 记忆与世界书 里的"世界书隔离"。
MCP 服务器调试
进入某个 MCP Server 详情可以看到:
- 连接状态(已连接 / 断开 / 错误)
- 工具列表(这个服务器声明的所有工具)
- 手动重连按钮
- 错误日志
如果某个工具调用失败,先来这里看连接是不是断了、错误信息是什么。
工具来源标识
工具中心里每个工具行下面会显示「来源:xxx」。MCP 工具的"来源"就是 MCP Server 显示名,方便你知道这个工具是哪个服务器提供的。
工具调用结果展示
当 AI 在回答里调了工具,工具结果不会塞进消息正文,而是显示成可展开的卡片。点击卡片可以看:
- 完整的请求参数
- 完整的返回值(JSON / 文本 / 图片)
- 失败时的错误堆栈
- 调用耗时
这是排查"AI 为什么这么回答"最重要的入口。
下一步
- 想给 AI 加专项能力包 → Skills 与快捷指令
- 想让 AI 跨会话记事 → 记忆与世界书
- 想看局域网调试和反馈链路 → 调试与反馈