关于 mcp-coda
mcp-coda 是连接 Coda API 的 MCP 服务,供 AI 助手读取和编辑文档、页面、表格及行。它还支持公式、权限、文件夹、发布、自动化和分析,并可锁定为只读模式。
主要功能
- 01管理文档和页面
- 02查询及写入表格与行
- 03运行公式并管理控件
- 04管理权限、文件夹和发布
- 05触发自动化并查看分析
- 06可配置只读模式
适用场景
- 01通过 AI 助手维护 Coda 文档
- 02查询或批量更新表格行
- 03检查文档权限与使用分析
- 04限制连接仅执行读取操作
MCP 相关
该项目是 Coda 的 MCP 服务,向兼容客户端提供 54 个工具、12 个资源和 5 个提示词。支持 stdio 与 streamable HTTP 传输,并可配置为只读。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx mcp-codaCODA_API_TOKEN密钥Coda API token (also accepts CODA_TOKEN or CODA_PAT)CODA_READ_ONLYAlias for MCP_READ_ONLY. Any value other than false/0/no/off/empty locks the server read-only; --read-only can only raise the lockMCP_READ_ONLYLocks the server read-only: write tools and write-workflow prompts are not listed and nothing lifts the lock at runtime. Shared name across the mcp-* servers; set it in the deployer's envCODA_HTTP_BEARER_TOKEN密钥Bearer token (min 16 chars) required to bind an HTTP transport to a non-loopback host; clients send it as 'Authorization: Bearer <token>'本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
mcp-coda
安装: uvx mcp-coda | PyPI | MCP Registry | 更新日志
uvx mcp-coda # with writes
MCP_READ_ONLY=true uvx mcp-coda # locked read-only: write tools are not listed
mcp-coda 是一个用于 Coda 的 Model Context Protocol (MCP) 服务。它让 AI 助手通过 Coda API 读取和写入 Coda 文档、页面、表格和行。它还可以运行公式、管理权限和文件夹、发布文档并触发自动化。该服务提供 54 个工具、12 个资源和 5 个提示词。它支持 MCP 2026-07-28 规范(通常称为 MCP 2.0),并与 2025-11-25 客户端保持兼容。它适用于 Claude Desktop、Claude Code、Cursor、Windsurf、VS Code Copilot 以及任何兼容 MCP 的客户端。支持两种运行模式:允许写入,或锁定为只读(MCP_READ_ONLY=true),此时不会向模型提供 20 个写入工具。
mcp-coda 使用 FastMCP、httpx 和 Pydantic。
一键安装
提示: 对于其他 AI 助手(Claude Code、Windsurf、IntelliJ、Gemini CLI),请访问 Coda MCP 安装入口。
手动配置指南(点击展开)
前置条件:请先安装
uv(所有uvx安装流程都需要)。安装 uv。
Claude Code
# with writes
claude mcp add coda -e CODA_API_TOKEN=your-token-here -- uvx mcp-coda
# locked read-only
claude mcp add coda -e MCP_READ_ONLY=true -e CODA_API_TOKEN=your-token-here -- uvx mcp-coda
Windsurf 和 IntelliJ
Windsurf: 添加到 ~/.codeium/windsurf/mcp_config.json
IntelliJ: 添加到 Settings | Tools | MCP Servers
注意: 实际的服务配置位于
mcpServers对象内的coda项下。 删除MCP_READ_ONLY即可允许写入。
{
"mcpServers": {
"coda": {
"command": "uvx",
"args": ["mcp-coda"],
"env": {
"CODA_API_TOKEN": "your-token-here",
"MCP_READ_ONLY": "true"
}
}
}
}
Gemini CLI
# with writes
gemini mcp add -s user -e CODA_API_TOKEN=your-token-here coda uvx mcp-coda
# locked read-only
gemini mcp add -s user -e MCP_READ_ONLY=true -e CODA_API_TOKEN=your-token-here coda uvx mcp-coda
VS Code
添加到 .vscode/mcp.json:
{
"servers": {
"coda": {
"type": "stdio",
"command": "uvx",
"args": ["mcp-coda"],
"env": { "CODA_API_TOKEN": "your-token-here", "MCP_READ_ONLY": "true" }
}
}
}
Codex
# with writes
codex mcp add coda --env CODA_API_TOKEN=your-token-here -- uvx mcp-coda
# locked read-only
codex mcp add coda --env MCP_READ_ONLY=true --env CODA_API_TOKEN=your-token-here -- uvx mcp-coda
pip / uv
uv pip install mcp-coda
删除 MCP_READ_ONLY 即可允许写入。对于共享或托管的服务,请将其设置在部署者的环境中,而不是客户端配置中。
| 变量 | 必需 | 默认值 | 描述 |
|---|---|---|---|
CODA_API_TOKEN | 是 | - | Coda API 令牌(在此获取) |
MCP_READ_ONLY | 否 | false | mcp-* 服务之间共用的名称。任何不为 false/0/no/off/空值的值都会将服务锁定为只读:不会列出 20 个写入工具和写入工作流提示词,且运行时无法解除锁定 |
CODA_READ_ONLY | 否 | false | MCP_READ_ONLY 的服务专用别名;设置其中任意一个都会将服务锁定为只读。--read-only 只能加强锁定 |
CODA_BASE_URL | 否 | https://coda.io/apis/v1 | API 基础 URL |
CODA_TIMEOUT | 否 | 30 | 请求超时时间,单位为秒 |
CODA_HTTP_BEARER_TOKEN | 否 | - | 将 HTTP 传输绑定到非环回主机时必需。客户端发送 Authorization: Bearer <token>。至少 16 个字符 |
支持的令牌类型
服务按以下顺序检查这些环境变量——以第一个匹配项为准:
CODA_API_TOKENCODA_TOKENCODA_PAT
在 coda.io/account#apiSettings 生成令牌。令牌可访问其所有者能够访问的全部文档。令牌没有范围限制。文档级访问权限由 Coda 的共享设置控制。
兼容性
| 客户端 | 支持 | 安装方式 |
|---|---|---|
| Claude Desktop | 是 | claude_desktop_config.json |
| Claude Code | 是 | claude mcp add |
| Cursor | 是 | 一键深层链接或 .cursor/mcp.json |
| VS Code Copilot | 是 | 一键深层链接或 .vscode/mcp.json |
| Windsurf | 是 | ~/.codeium/windsurf/mcp_config.json |
| 任意 MCP 客户端 | 是 | stdio 或 HTTP 传输 |
协议支持
mcp-coda 实现了 Model Context Protocol 2026-07-28 规范,通常称为 MCP 2.0。它也继续兼容 2025-11-25 客户端。固定使用 2026-07-28 的 FastMCP 客户端和旧版客户端都能列出所有工具,并通过 stdio 调用 Coda API。配套的代码 PR 添加了一项回归测试,用固定使用 2026-07-28 的内存客户端检查 tools/list。
- 规范版本:MCP 2026-07-28(MCP 2.0),向后兼容 2025-11-25。
- 基于:FastMCP 4.x 和 MCP Python SDK 2.x。
- 传输方式:
stdio(默认)和streamable-http(远程连接推荐)。sse(HTTP+SSE)仍可使用,但 2026-07-28 规范已弃用该方式,因此服务会打印警告。 - 功能:工具、资源和提示词。服务不使用 Roots、Sampling、Logging、elicitation 或资源订阅,因此 2026-07-28 的弃用事项不会影响它。
错误结果
预期的失败情况——404、401、速率限制,或因触发只读保护而被拦截的写入操作——会作为带有 isError: true 的工具结果返回,而不是要求调用方检查是否存在 error 键的值。(在锁定的只读模式下,写入工具会被隐藏,因此调用其中一个会返回 Unknown tool 错误;下方的错误封装是保护机制本身的响应,仅当客户端仍然调用写入工具时才会返回。)结果正文是文本内容:一个包含 error、可操作的 hint,以及视情况而定的 status_code、body 和 retry_after 的 JSON 对象。结果不包含 structuredContent——TypeScript MCP SDK 会根据工具的输出架构验证 structuredContent,即使 isError 为 true 也是如此,因此将错误载荷放在那里会导致严格客户端拒绝整个结果。意外异常(工具中的 Bug)也会以 isError: true 返回,文本格式为 TypeName: message,并且服务端会记录异常及其回溯信息。
成功的结果会在格式化文本旁的 structuredContent 中携带 Coda JSON 对象,且工具不声明 outputSchema:载荷会以无类型方式传递上游字段,因此严格客户端不会验证任何内容,并会直接收到该对象,而不是收到双重编码的 {"result": "<json>"} 封装。可通过每个工具上的 @mcp.tool(output_schema=…) 选择启用类型化架构。
工具(54)
| 类别 | 数量 | 工具 |
|---|---|---|
| 账户 | 3 | whoami、resolve browser link、mutation status |
| 文档 | 5 | 列表、获取、创建、更新、删除 |
| 页面 | 9 | 列表、获取、创建、更新、删除、获取内容、删除内容、导出、导出状态 |
| 表格 | 4 | 列出表格、获取表格、列出列、获取列 |
| 行 | 7 | 列表、获取、插入/插入或更新、更新、删除、批量删除、按下按钮 |
| 权限 | 6 | 共享元数据、列表、添加、删除、搜索主体、ACL 设置 |
| 文件夹 | 5 | 列表、获取、创建、更新、删除 |
| 其他 | 8 | 公式(列表、获取)、控件(列表、获取)、发布(列出类别、发布、取消发布)、触发自动化 |
| 分析 | 7 | 文档分析、文档摘要、页面分析、Pack 分析、Pack 摘要、公式分析、分析数据更新时间 |
完整工具参考(点击展开)
账户
| 工具 | 描述 |
|---|---|
coda_whoami | 获取当前用户信息 |
coda_resolve_browser_link | 将浏览器 URL 转换为 API ID |
coda_get_mutation_status | 检查异步写入状态 |
文档
| 工具 | 描述 |
|---|---|
coda_list_docs | 列出可访问的文档 |
coda_get_doc | 获取文档元数据 |
coda_create_doc | 创建新文档 |
coda_update_doc | 更新文档标题/图标 |
coda_delete_doc | 删除文档 |
页面
| 工具 | 描述 |
|---|---|
coda_list_pages | 列出文档中的页面 |
coda_get_page | 获取页面元数据 |
coda_create_page | 创建页面 |
coda_update_page | 更新页面名称/内容 |
coda_delete_page | 删除页面 |
coda_get_page_content | 读取页面内容 |
coda_delete_page_content | 清空页面内容 |
coda_export_page | 将页面导出为 HTML 或 Markdown |
coda_get_export_status | 轮询由 coda_export_page 发起的导出任务 |
表格
| 工具 | 描述 |
|---|---|
coda_list_tables | 列出表格和视图 |
coda_get_table | 获取表格元数据 |
coda_list_columns | 列出表格中的列 |
coda_get_column | 获取列元数据 |
行
| 工具 | 描述 |
|---|---|
coda_list_rows | 列出并筛选行 |
coda_get_row | 获取单行 |
coda_insert_rows | 插入或插入/更新行 |
coda_update_row | 更新一行 |
coda_delete_row | 删除一行 |
coda_delete_rows | 根据筛选条件批量删除行 |
coda_push_button | 按下按钮列的值 |
控件
| 工具 | 描述 |
|---|---|
coda_list_controls | 列出控件 |
coda_get_control | 获取控件值 |
权限
| 工具 | 描述 |
|---|---|
coda_get_sharing_metadata | 获取共享配置 |
coda_list_permissions | 列出 ACL 条目 |
coda_add_permission | 授予访问权限 |
coda_delete_permission | 撤销访问权限 |
coda_search_principals | 搜索用户/群组 |
coda_get_acl_settings | 获取 ACL 设置 |
发布
| 工具 | 描述 |
|---|---|
coda_list_categories | 列出发布类别 |
coda_publish_doc | 发布文档 |
coda_unpublish_doc | 取消发布文档 |
文件夹
| 工具 | 描述 |
|---|---|
coda_list_folders | 列出文件夹 |
coda_get_folder | 获取文件夹详情 |
coda_create_folder | 创建文件夹 |
coda_update_folder | 重命名文件夹 |
coda_delete_folder | 删除文件夹 |
自动化
| 工具 | 描述 |
|---|---|
coda_trigger_automation | 触发自动化规则 |
分析
| 工具 | 描述 |
|---|---|
coda_list_doc_analytics | 文档使用指标 |
coda_get_doc_analytics_summary | 汇总文档指标 |
coda_list_page_analytics | 页面使用指标 |
coda_list_pack_analytics | Pack 使用指标 |
coda_get_pack_analytics_summary | 汇总 Pack 指标 |
coda_list_pack_formula_analytics | 公式级指标 |
coda_get_analytics_updated | 分析数据更新时间戳 |
资源(12)
该服务提供 MCP 资源,用于提供环境上下文,且不会消耗工具调用。
数据资源(实时 API)
| URI | 名称 | 描述 |
|---|---|---|
coda://docs | Coda 文档 | 当前 API 令牌可访问的文档列表 |
coda://docs/{doc_id}/schema | Coda 文档架构 | 文档的表和列定义 |
规则(静态知识)
| URI | 名称 | 描述 |
|---|---|---|
resource://rules/coda-doc-structure | Coda 文档结构 | 文档/页面层级、页面类型、命名,以及何时拆分文档与文件夹 |
resource://rules/coda-table-design | Coda 表格设计 | 列类型、关系、显示列、行数限制,以及表格与视图的区别 |
resource://rules/coda-permissions | Coda 权限模型 | 文档级与页面级锁定、ACL、域共享、主体类型 |
resource://rules/coda-automations | Coda 自动化模式 | Webhook、按钮触发器、速率限制、载荷设计、幂等性 |
resource://rules/coda-api-patterns | Coda API 最佳实践 | 速率限制、分页、异步变更、错误处理、重试 |
指南(操作方法)
| URI | 名称 | 描述 |
|---|---|---|
resource://guides/row-operations | 行操作指南 | 插入与更新插入、批量操作、键列、单元格格式、删除策略 |
resource://guides/page-content | 页面内容指南 | HTML 与 Markdown、插入模式、导出工作流 |
resource://guides/formula-controls | 公式与控件指南 | 命名公式、控件类型、读取值 |
resource://guides/publishing-analytics | 发布与分析指南 | 发布类别、图库设置、分析日期筛选 |
resource://guides/folder-organization | 文件夹整理指南 | 文件夹 CRUD、文档与文件夹的关系、层级、批量整理 |
提示词(5)
该服务器提供 MCP 提示词——可供客户端调用的可复用任务模板。
| 提示词 | 参数 | 描述 |
|---|---|---|
analyze_doc_structure | doc_id | 分析文档的页面层级、表格布局和组织结构 |
design_table_schema | description | 根据自然语言描述设计表格架构 |
migrate_spreadsheet | doc_id、source_format | 指导将 CSV/Excel/Sheets 数据迁移到 Coda |
setup_automation | doc_id、trigger_type | 设置 webhook/按钮/定时自动化,并处理错误 |
audit_permissions | doc_id | 审查共享和权限,并建议收紧权限 |
使用示例
文档和页面
"List all my Coda docs"
→ coda_list_docs(is_owner=True)
"Get the content of page 'Sprint Planning' in doc d1"
→ coda_list_pages(doc_id="d1") → find page ID
→ coda_get_page_content(doc_id="d1", page_id_or_name="canvas-abc")
"Create a new doc from a template"
→ coda_create_doc(title="Q1 Planning", source_doc="template-doc-id")
表格和行
"List all tables in doc d1"
→ coda_list_tables(doc_id="d1")
"Find rows where Status is 'Done'"
→ coda_list_rows(doc_id="d1", table_id_or_name="Tasks", query="Done")
"Insert a new row into the Tasks table"
→ coda_insert_rows(doc_id="d1", table_id_or_name="Tasks", rows=[{"cells": [{"column": "Name", "value": "New task"}]}])
"Update a row's status"
→ coda_update_row(doc_id="d1", table_id_or_name="Tasks", row_id_or_name="i-abc", row={"cells": [{"column": "Status", "value": "In Progress"}]})
公式和控件
"Get the value of the TotalBudget formula"
→ coda_get_formula(doc_id="d1", formula_id_or_name="TotalBudget")
"Check the current value of the DateFilter control"
→ coda_get_control(doc_id="d1", control_id_or_name="DateFilter")
权限和共享
"Share a doc with a teammate"
→ coda_add_permission(doc_id="d1", access="write", principal_email="[email protected]")
"List who has access to a doc"
→ coda_list_permissions(doc_id="d1")
安全注意事项
- 令牌范围:Coda API 令牌可以访问令牌所有者有权访问的所有文档。生产部署时请使用专用服务账户,以限制暴露范围。
- 只读模式:在你控制的启动配置中设置
MCP_READ_ONLY=true(或CODA_READ_ONLY=true),服务器启动后便会锁定:不会列出 20 个写入工具和写入工作流提示词,调用它们会返回“Unknown tool”,且保护机制会拒绝任何仍到达服务器的写入操作。运行时无法解除锁定——其他来源提供的false、.env文件或工具参数都不行;除false/0/no/off/空值以外的任何值都会锁定,而--read-only只能启用锁定。锁定强度取决于启动配置:请在用户无法编辑的位置设置该选项(例如受管理的 MCP 配置,如 Claude Codemanaged-mcp.json、容器、k8s 或 systemd 环境变量,或托管的 HTTP 部署)。自行启动服务器的用户可以控制其环境。Coda 令牌没有权限范围,因此此锁定是唯一的只读控制措施。 - MCP 工具注释:每个工具都声明
readOnlyHint、destructiveHint和idempotentHint,供客户端侧权限提示使用。 - 不存储凭据:服务器不会持久化令牌。它会在启动时从环境变量读取凭据。
- HTTP 传输身份验证:Host/Origin 保护不等同于身份验证。将 HTTP 传输绑定到非回环主机时,必须设置
CODA_HTTP_BEARER_TOKEN(至少 16 个字符);客户端发送Authorization: Bearer <token>,其他任何内容都会得到 401 响应。未设置时,服务器会拒绝在非回环主机上启动。
升级到 0.9.0
两项默认值已更改。对于依赖旧行为的调用方,这两项更改都会造成破坏性影响:
coda_publish_doc默认不再将文档列入公共图库。discoverable现在默认为False——仅发布文档会使其可通过 URL 访问;传入discoverable=True可将其列入 Coda 图库。mode现在仅限view、play或edit。- 现在,在非回环主机上使用 HTTP 传输必须提供承载令牌。 如果未设置
CODA_HTTP_BEARER_TOKEN(至少 16 个字符),uvx mcp-coda --transport streamable-http --host 0.0.0.0(或任何非回环主机)将报错退出;客户端随后发送Authorization: Bearer <token>。绑定到127.0.0.1的行为不变。
速率限制和权限
速率限制
Coda 会对每个令牌实施速率限制(具体限制因套餐而异)。当 Coda 对请求进行速率限制时,工具会返回一个 429 错误,并附带 retry_after 秒数。当 Retry-After 小于或等于 5 秒时,客户端会对 429 重试一次(仅限 GET 请求,并加入随机抖动;也适用于 502/503/504);否则会直接返回 retry_after,不进行重试——等待相应秒数后再重试。写入操作绝不会重试。大多数分页端点默认每页返回 50 条结果(coda_list_docs 为 25 条,coda_list_columns 为 100 条)。使用 limit 调整数量。
异步变更
Coda 会异步处理写入操作(插入、更新、删除行)。工具会返回一个 requestId。使用 coda_get_mutation_status 检查该 ID,以确认操作已完成。
所需权限
| 操作 | 最低 Coda 文档角色 |
|---|---|
| 列出文档、读取页面、表格、行、公式、控件 | Viewer |
| 读取权限、分析数据 | Viewer(分析数据需文档所有者) |
| 创建/更新页面、插入/更新/删除行 | Editor |
| 创建/删除文档、管理文件夹 | Editor(或文档所有者) |
| 添加/移除权限、发布/取消发布 | Doc Owner |
| 触发自动化 | Editor |
访问控制
| 层级 | 机制 |
|---|---|
| 服务级别 | CODA_READ_ONLY=true / MCP_READ_ONLY=true 会隐藏所有写入工具(需要由部署方控制启动) |
| MCP 注释 | readOnlyHint、destructiveHint、idempotentHint,供客户端提示使用 |
| Coda 令牌 | 文档级访问权限由 Coda 的共享设置强制执行 |
CLI 和传输选项
# Default: stdio transport (for MCP clients)
uvx mcp-coda
# HTTP transport (SSE or streamable-http)
uvx mcp-coda --transport sse --host 127.0.0.1 --port 8000
uvx mcp-coda --transport streamable-http --port 9000
# Binding to a non-loopback host requires a bearer token
CODA_HTTP_BEARER_TOKEN=$(openssl rand -hex 32) \
uvx mcp-coda --transport streamable-http --host 0.0.0.0 --port 9000
# Clients authenticate with the token:
# curl -H "Authorization: Bearer $CODA_HTTP_BEARER_TOKEN" http://host:9000/mcp
# Config comes from env vars
CODA_API_TOKEN=your-token uvx mcp-coda --read-only
--coda-token 仍可使用,但已弃用并从 --help 中隐藏:它会使令牌暴露在 ps 和 shell 历史记录中。请使用 CODA_API_TOKEN。
服务器会通过 python-dotenv 自动从工作目录加载 .env 文件。
Docker
此映像采用精简的非 root python:3.13-slim 构建。映像默认锁定为只读(MCP_READ_ONLY=true);传入 -e MCP_READ_ONLY=false 即可允许写入。
docker build -t mcp-coda .
# stdio (default), locked read-only
docker run -i --rm -e CODA_API_TOKEN=your-token mcp-coda
# HTTP transport on a non-loopback host requires a bearer token (min 16 chars);
# clients then send Authorization: Bearer <token>
BEARER=$(openssl rand -hex 32)
docker run --rm -p 9000:9000 \
-e CODA_API_TOKEN=your-token \
-e CODA_HTTP_BEARER_TOKEN="$BEARER" \
mcp-coda --transport streamable-http --host 0.0.0.0 --port 9000
常见问题
mcp-coda 是否支持 MCP 2.0(2026-07-28 规范)?
支持。mcp-coda 实现了 MCP 2026-07-28 规范,通常称为 MCP 2.0。它也兼容 2025-11-25 客户端。
mcp-coda 支持哪些传输方式?
服务器支持 stdio(默认)和 streamable-http。它也支持 sse,但 2026-07-28 规范已弃用该方式。远程连接建议使用 streamable-http。
我能否以只读模式运行 mcp-coda,防止助手进行任何更改?
可以。使用 MCP_READ_ONLY=true(或 CODA_READ_ONLY=true)启动。此时,20 个写入工具和写入工作流提示词都不会列出,因此模型看不到它们;调用其中任何工具都会返回“Unknown tool”,且进程运行期间无法重新启用写入功能。请在由你控制的启动配置中设置该变量,例如受管理的 MCP 配置、容器或 systemd 环境变量,或者托管部署;因为自行启动服务器的用户可以不设置该变量。Coda 令牌没有作用域,因此此锁定是唯一的只读控制方式。
mcp-coda 需要哪些令牌作用域?
Coda 令牌没有作用域。令牌可以访问其所有者能够访问的每个文档。文档级访问权限由 Coda 的共享设置控制。请使用专用服务账号来限制暴露范围。
mcp-coda 是否适用于可自托管的 Coda?
Coda 是托管服务,因此没有可自托管的部署方式。仅在需要指定代理或非默认 API 基础地址时,才设置 CODA_BASE_URL。
哪些客户端适用于 mcp-coda?
mcp-coda 适用于 Claude Desktop、Claude Code、Cursor、Windsurf、VS Code Copilot,以及任何通过 stdio 或 HTTP 兼容 MCP 的客户端。
它提供多少个工具、资源和提示词?
mcp-coda 提供 54 个工具、12 个资源和 5 个提示词,涵盖文档、页面、表格、行、公式、控件、权限、文件夹、发布、自动化和分析数据。
相关 MCP 服务
- mcp-gitlab — GitLab 集成(83 个工具、7 个资源、6 个提示词)
- mcp-atlassian-extended — Jira + Confluence 集成(22 个工具、15 个资源、5 个提示词)
- mcp-argocd — Argo CD 集成(37 个工具、7 个资源、7 个提示词)
开发
git clone https://github.com/vish288/mcp-coda.git
cd mcp-coda
uv sync --all-extras
uv run pytest --cov
uv run ruff check .
uv run ruff format --check .
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。