不确定用哪个版本?看客户端配置里填什么:填一个 URL → COM 版;填 exe 路径 → 桥接版。
Excel 插件里打开「智能体接入(MCP)」
下面生成器里填桥接程序的位置
贴进你那个客户端的配置文件
问一句「工作簿里有几张表」
API设置」→ 设置面板底部「智能体接入(MCP)」→ 打开开关。
ExcelAI.McpBridge.exe)
来补上这一段。桥接程序在你打开 Excel 之后才拿得到地址和令牌。
WorkBuddy / Trae / Codex / Cursor … 你的 AI 客户端 │ │ stdio(客户端启动子进程,管道收发) ▼ ExcelAI.McpBridge.exe 桥接程序(随插件发布) │ │ HTTP → 127.0.0.1:17890 + 一次性令牌 ▼ ExcelAI 插件内的 MCP 服务 跑在 Excel 进程里 │ │ 调度回 Excel 主线程(COM 不能跨线程) ▼ Excel 对象模型 → 读数据 / 写单元格 / 建图表 / 改 VBA …
三个关键点,决定了后面所有配置长得都差不多:
command(exe 路径)和 args(留空)。不用装 Node、不用装 Python。%LOCALAPPDATA%\ExcelAI\mcp-endpoint.json 读,而且令牌每次启动都换,写死在配置里反而会过期。
默认是开发机上的路径。请改成你自己机器上的实际位置;如果安装包把文件放在别处,以安装目录里的
ExcelAI.McpBridge.exe 为准。
不确定它在哪:在文件资源管理器里搜 ExcelAI.McpBridge.exe,右键该文件 → 复制文件地址,粘到上面即可。
{
"mcpServers": {
"excelai": {
"command": "F:\\Excelai2028online\\McpBridge\\bin\\Debug\\ExcelAI.McpBridge.exe",
"args": []
}
}
}{
"servers": {
"excelai": {
"type": "stdio",
"command": "F:\\Excelai2028online\\McpBridge\\bin\\Debug\\ExcelAI.McpBridge.exe",
"args": []
}
}
}# 追加到 ~/.codex/config.toml 末尾 # ⛔ 表名是 mcp_servers(下划线),不是 mcpServers [mcp_servers.excelai] command = 'F:\Excelai2028online\McpBridge\bin\Debug\ExcelAI.McpBridge.exe' args = []
\ 是转义符)。上面①已经自动帮你转好了;你手改时若看到 F:\Excelai… 只写一个,配置会解析失败。点下面的名字切换。ExcelAI 只在 Windows 上跑,所以只列 Windows 路径。
{
"mcpServers": {
"excelai": {
"command": "F:\\Excelai2028online\\McpBridge\\bin\\Debug\\ExcelAI.McpBridge.exe",
"args": []
}
}
}新开一个会话,问「工作簿里有几张表」。
在任何已接好的客户端里直接问:
用 excelai 看一下当前工作簿里有几张表,分别叫什么
能列出真实的表名 = 全链路通了。答不上来或说没有这个工具 = 看下一节排错。
打开 PowerShell,逐段粘贴:
# 1) 看端点文件在不在(不在 = 插件没监听,回去开 Excel + 打开开关)
Get-Content "$env:LOCALAPPDATA\ExcelAI\mcp-endpoint.json"
# 2) 带着令牌问一次工具列表
$ep = Get-Content "$env:LOCALAPPDATA\ExcelAI\mcp-endpoint.json" -Raw | ConvertFrom-Json
$h = @{ Authorization = "Bearer $($ep.token)" }
$b = '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
$r = Invoke-RestMethod -Uri "http://127.0.0.1:$($ep.port)/mcp" -Method Post -Headers $h -ContentType 'application/json' -Body $b
"可用工具数:" + $r.result.tools.Count401 和错误码 -32001 —— 这是设计如此,说明服务活着在正常鉴权。
| 现象 | 原因 | 怎么办 |
|---|---|---|
| 客户端里看不到任何 excelai 工具 | 插件开关没开 / Excel 没开 | 先确认 mcp-endpoint.json 存在(见第五节);没有就回 Excel 打开「智能体接入」开关。改完重启客户端。 |
报 -32000 找不到 MCP 端点 |
桥接程序连不上插件 | Excel 没开,或插件没加载。打开 Excel 后不用重启客户端,下次调用会自动重连。 |
报 -32001 未授权 / 401 |
令牌过期 | 令牌每次随 Excel 启动更换。桥接程序会自动重读,无需手动改配置;若一直报,重启客户端。 |
| 配置保存了但没生效 | 客户端没重载配置 | Claude Desktop 要完全退出(含托盘图标)再开;Cursor/Windsurf 在设置里点刷新;Trae / VS Code 重启窗口。 |
| VS Code 里加了配置工具列表还是空 | 根键写错了 | VS Code 用的是 servers,不是 mcpServers —— 它是唯一一个这么干的,见生成器②。 |
Codex 报 command not found 或工具不出现 |
把 JSON 贴进了 TOML 文件 | Codex 读 config.toml,表名必须是 [mcp_servers.名字]。codex mcp list 可查看状态。 |
| 工具能列出来,但一调用就报权限不足 | 权限档被关掉了 | 见第七节。默认全开;被关掉的那一档需要到 mcp-policy.json 里打开。 |
| Excel 重启后客户端突然不通 | 端口或令牌变了 | 这是正常的:端点文件已更新。桥接程序会自己重读一次;不行就重启客户端。 |
Write-Host : 拒绝访问 之类 |
PowerShell 执行策略 | 上面那段是交互命令,不用保存成脚本,直接粘到窗口里回车即可。 |
在插件自己的对话面板里,AI 要写单元格会弹确认框。走 MCP 时不会 —— 客户端直连工具内核, 这类确认框属于对话面板,不在这条链路上。所以插件给了三条兜底,都在本地文件里、改完即生效:
| 护栏 | 位置 | 作用 |
|---|---|---|
| 可追查 | %LOCALAPPDATA%\ExcelAI\mcp-audit.log | 每次调用记录:时间、分类、工具名、成功/失败、参数(截断 600 字) |
| 可回退 | 工具 undo_last_operation | 单步撤销,连续调用可多步回退。直接让 AI「撤销上一步」即可 |
| 可收回 | %APPDATA%\AIExcelCopilot\mcp-policy.json | 关掉某一档权限,改完即生效,不用重启插件 |
{
"allow_write": true,
"allow_vba": false,
"allow_batch": false,
"allow_office": true
}allow_write / allow_vba / allow_batch
都改成 false。VBA 与批量处理是最危险的一档(改代码、批量动多个工作簿),务必按需开。
插件的工具会全部暴露给客户端(只有一个例外:remember,那是对话面板的记忆功能,不属于 Excel 操作)。
数量随版本变,别记数字。按用途分五档:
| 档位 | 权限开关 | 能做什么 | 代表工具 |
|---|---|---|---|
| 读取 | 始终允许 | 看工作簿结构、列画像、读区域、条件聚合、跨表找关联键 | get_workbook_summary read_excel_data get_sheet_profile query_data |
| 写入 | allow_write | 写单元格/区域、公式、格式、边框、排序、筛选、去重、合并、透视、图表 | write_range set_format create_chart create_pivot_table |
| Office | allow_office | 生成 Word 文档 / PPT、读写外部 Office 文件 | create_word_document create_presentation read_office_file |
| VBA | allow_vba | 读工程/模块/窗体、写模块、建改窗体、运行宏、备份还原 | read_vba_project write_vba_module run_vba_macro |
| 批量 | allow_batch | 批量处理多个工作簿、导出 CSV | batch_process_workbooks export_csv |
COM 版插件把 MCP 服务端直接开在 Excel 进程里,客户端用一个 URL 连它 ——
不需要 ExcelAI.McpBridge.exe,也不用装 Node / Python。
本页只讲 COM 版;要看桥接版,点顶部切到「桥接版」。
| 对比项 | COM 版(本节) | 桥接版(第一~八节) |
|---|---|---|
| 传输方式 | Streamable HTTP,客户端直连 | stdio,客户端启动桥接 exe |
| 客户端里填什么 | url(一个地址) | command + args(exe 路径) |
| 令牌放哪 | 写在 URL 路径末尾 | 不用填,桥接程序自己去读 |
| 令牌会不会变 | 不变,固定存在本机,配一次长期用 | 每次启动 Excel 都换,桥接程序自动重读 |
| 要不要 Authorization 头 | 不要 | 要(桥接程序自动带) |
| 默认端口 | 8931(可改) | 17890 |
http://127.0.0.1:… 地址就是 COM 版。
也可以看设置页:COM 版在「MCP 服务」分区里会显示一个可复制的连接地址。
Codex / WorkBuddy … 你的 AI 客户端(MCP 客户端) │ │ HTTP(仅本机回环)· POST /mcp/<随机令牌> ▼ ExcelAIPlus(跑在 Excel 进程内) │ ├ MCP 服务端 │ └ ToolCallHandler ▼ 当前打开的那个工作簿 → 读数据 / 写单元格 / 建图表 / 做透视 / 跑 VBA …
为什么必须由插件来起服务端:MCP 是「客户端主动连服务端」。 Codex / WorkBuddy 是客户端,而插件寄生在 Excel 里、本来没有端口,谁也连不进来。 所以插件在进程内起了一个回环 HTTP 服务,客户端连它,它再转发给 Excel。
服务端能力只声明 tools(不提供 resources / prompts),协议版本 2025-06-18。
Excel 里点 Ribbon 上的 设置 按钮(或插件设置入口),滚动到 「MCP 服务」 分区。
勾选 「允许外部 AI 工具连接并操作当前 Excel」。
write_cell 会直接写进你的表,不弹任何确认框。只在你信任那个客户端时打开。
开关打开并 保存 后,分区里会显示:
http://127.0.0.1:8931/mcp/<你的令牌>
上面 8931 是端口,<你的令牌> 是 32 位十六进制随机串。
它生成一次就固定保存在本机(%LOCALAPPDATA%\ExcelAI\mcp-token.txt),重启 Excel 也不会变 —— 客户端配置一次即可长期用。
还是建议点「复制」拿,别手打:32 位字符打错一位,表现是「地址看着对、就是连不上」,很难查。 地址框下面那行会写明令牌有没有固定住。想换令牌时,点旁边的「重置令牌」(需连点两次确认)。
8931,可在 1024–65535 之间改。127.0.0.1,不对局域网开放。任何支持 MCP Streamable HTTP 的客户端都能接。已验证 / 推荐的:
| 客户端 | 传输方式 | 说明 |
|---|---|---|
| Codex(CLI / IDE 扩展 / 桌面应用) | Streamable HTTP | 配置最简单,见 5.1 |
| WorkBuddy | Streamable HTTP | 走「连接器 → 自定义连接器」入口,见 5.2 |
| Claude Code / Cursor / Cline 等 | Streamable HTTP | 填法大同小异,见 5.3 |
| 只支持 STDIO 的老客户端 | — | 不支持,本服务不提供 STDIO |
Codex 把 MCP 配置存在 ~/.codex/config.toml(项目级可用 .codex/config.toml)。在文件末尾加上:
[mcp_servers.excel] url = "http://127.0.0.1:8931/mcp/<你的令牌>"
把 url 换成你在 3 复制到的那串即可。不需要 bearer_token_env_var 或 http_headers —— 令牌已经在 URL 路径里了。
几个可选项(按需加):
[mcp_servers.excel] url = "http://127.0.0.1:8931/mcp/<你的令牌>" startup_timeout_sec = 20 # 启动超时,默认 10 tool_timeout_sec = 120 # 工具超时,默认 60 —— 跑大表建议调大 default_tools_approval_mode = "auto" # 免审批(本服务已是免确认语义)
/mcp 查看是否连上;或直接问它「用 excel 工具列出当前工作表」。WorkBuddy 走 连接器 入口:
多数客户端用 mcpServers 这一段 JSON:
{
"mcpServers": {
"excel": {
"type": "http",
"url": "http://127.0.0.1:8931/mcp/<你的令牌>"
}
}
}要点:
command / args —— 那是 STDIO 用的,本服务是 HTTP。Authorization 头,令牌在 URL 里。type 写作 "streamable-http" 或 "sse",按客户端要求填。连上之后直接用自然语言,不需要记工具名。
好的开场是让 AI 先看:
用 excel 工具看一下当前工作簿有哪些表、各多少行。
它会调 get_workbook_summary / get_sheet_profile / inspect_current_data。
之后你说「把 B 列的空值填成上一行的值」这类话,它才知道该动哪儿。
| 你说的话 | 它会做的事 |
|---|---|
| 「把订单表按金额从高到低排序,前 20 行标黄」 | multi_sort → color_range |
| 「给每个销售区域做一张柱状图」 | group_and_summarize → create_chart |
| 「这两列日期格式不统一,规整成 yyyy-mm-dd」 | normalize_dates |
| 「找出金额的异常值,单独列到新表」 | detect_outliers → create_sheet → write_range |
| 「做个透视表:部门 × 月份,求和金额」 | create_pivot_table |
| 「按部门算平均薪资,只看超过 1 万的」 | advanced_query |
| 「帮我写个宏,把当前表导出成 CSV」 | vba_add_code → vba_run_macro |
| 「刚才那步不对,撤销」 | undo_last_operation |
get_range_preview 或 get_sheet_profile,比上来就写要靠谱得多。preview_write_range 看差异。
免确认意味着没有「要不要覆盖」这一问。服务端一共暴露 85 个工具。工具表和对话框里的 AI 用的是同一份定义
(都来自 ToolCallHandler.GetToolDefinitions),所以能力与插件本体基本一致 ——
不是另起一套,MCP 只是把同一张表换了个协议发出去(另有两处刻意的删减,见 7.0)。
| 环节 | 数量 |
|---|---|
工具表里的全部名字(属性 72 + MakeTool 24 + 内联 .Name 68,去重) | 102 |
其中真能被 ExecuteToolCall 分发的 | 101 |
减:死工具(batch_process_workbooks,见 ①) | 1 |
| 减:OfficeCLI 一族(能执行,但 MCP 刻意不提供,见 ②) | 16 |
| MCP 实际暴露 | 85 |
vbcheck/check_mcp_tool_reach.py 守着 —— 上面的数字是它算出来的,不是手抄的,避免文档里的数悄悄过期。
batch_process_workbooks —— 列不出来,因为调不动它(批量合并文件夹内的 Excel)不在 MCP 工具表里,但在对话框里能用。
原因:它挂在对话框的编排层执行(WebChatControl.xaml.vb 里 Await HandleBatchProcessAsync),
因为要弹一个文件夹选择框让用户选目录。MCP 走的是同步分发链(McpBridge.InvokeTool → ExecuteToolCall),
到不了那里,硬调只会得到「未知工具」。
read_excel_data 逐个读再 write_range 汇总,或干脆在插件对话框里操作。
officecli_* 那 16 个工具也不在 MCP 工具表里,但它们在对话框里能用。
这不是因为「它们坏了」,而是语义不是一回事:MCP 服务的作用域是「操作当前正在运行的这个 Excel」, 而 OfficeCLI 是外部进程去读写磁盘上的文件。混在同一张工具表里,外部 AI 会挑到它去改用户没打算改的文件。
两道门都是关着的,防的不是同一件事:
GetToolDefinitions 的 mcpReachableOnly 分支里整族摘掉);McpBridge.InvokeTool 里在碰 COM 之前就拒)—— 客户端会缓存 tools/list,模型也可能凭上一轮记忆直接调,只靠不列挡不住。| 工具名 | 功能 |
|---|---|
get_workbook_summary | 获取工作簿概要 |
list_workbook_sheets | 列出工作表 |
get_sheet_profile | 工作表画像 |
get_range_preview | 区域预览 |
read_excel_data | 读取数据 |
inspect_current_data | 探查当前表 |
analyze_columns | 列画像分析 |
list_definitions | 查看已定义口径 |
| 工具名 | 功能 |
|---|---|
write_cell | 写入单元格 |
write_formula | 写入公式 |
write_range | 批量写入 |
preview_write_range | 预览写入差异 |
clear_range | 清空区域 |
find_and_replace | 查找替换 |
set_format | 设置格式 |
beautify_table | 一键美化表格(套用整套样式) |
set_borders | 设置边框 |
color_range | 批量着色 |
apply_conditional_format | 条件格式 |
set_data_validation | 数据验证 |
merge_cells / unmerge_cells | 合并 / 取消合并 |
auto_fit_columns / auto_fit_rows | 自适应列宽 / 行高 |
freeze_panes | 冻结窗格 |
| 工具名 | 功能 |
|---|---|
create_sheet / delete_sheet / rename_sheet / copy_sheet | 新建 / 删除 / 重命名 / 复制工作表 |
split_sheet / merge_sheets | 拆分 / 合并工作表 |
insert_rows / insert_columns | 插入行 / 列 |
delete_rows / delete_columns | 删除行 / 列 |
sort_data / multi_sort | 排序 / 多级排序 |
auto_filter / clear_filter | 筛选 / 清除筛选 |
group_and_summarize | 分组汇总 |
remove_duplicates | 删除重复项 |
| 工具名 | 功能 |
|---|---|
query_data | 聚合查询 |
advanced_query | 高级查询(分组聚合 / 明细) |
detect_outliers | 异常值检测 |
detect_relationships | 跨表关联键探测(找候选键 + 重合度) |
join_and_analyze | 跨表关联并聚合(关联后可直接出结果) |
group_and_summarize | 分组汇总 |
define_metric / delete_definition | 定义业务口径 / 删除口径 |
| 工具名 | 功能 |
|---|---|
clean_whitespace | 清理首尾空格 |
convert_text_to_number | 文本转数字 |
normalize_dates | 规范日期 |
split_column / merge_columns | 拆分列 / 合并列 |
| 工具名 | 功能 |
|---|---|
create_chart | 创建图表 |
create_pivot_table | 数据透视表 |
create_native_dashboard | 生成原生数据看板 |
| 工具名 | 功能 |
|---|---|
submit_plan | 提交执行计划 |
review_changes | 复核本轮改动 |
undo_last_operation | 撤销上一步 |
undo_turn | 撤销本轮改动 |
| 工具名 | 功能 |
|---|---|
vba_add_code | 写入 VBA 代码 |
vba_run_macro | 运行 VBA 宏 |
vba_import_component | 导入 VBA 组件 |
vba_list_components | 列出组件 |
vba_get_module_code | 读取模块代码 |
vba_get_macro_infos / vba_get_macro_code | 读取宏信息 / 代码 |
vba_update_macro / vba_delete_macro | 更新 / 删除宏 |
vba_remove_component | 移除组件 |
vba_get_references / vba_set_reference | 读取 / 设置 VBA 引用 |
vba_project_index | 大型项目结构索引 |
vba_get_diagnostics / vba_clear_diagnostics | 读取 / 清空运行诊断 |
vba_lint | 代码体检 |
vba_get_form_info / vba_add_form_control | 读取窗体信息 / 添加窗体控件 |
vba_set_form_control_property / vba_set_form_style | 设置控件属性 / 窗体样式 |
vba_save_lesson / vba_recall_lesson | 记录 / 检索经验教训 |
vba_log_progress / vba_get_project_log | 记录 / 读取项目进度 |
create_vba_form(创建窗体)属于基础工具集,不在上面这批里。读写磁盘上别的 Office 文件(不是当前工作簿):
officecli_get_status、officecli_get_capabilities、officecli_get_schema、
officecli_inspect_file、officecli_validate_file、officecli_query_file、
officecli_get_element、officecli_modify_copy、officecli_batch_modify_copies、
officecli_batch_modify_selected、officecli_create_presentation、
officecli_get_selected_files、officecli_run_command、officecli_batch、
officecli_watch_preview、officecli_unwatch_preview。
服务做了三重防护:
127.0.0.1 —— 非回环地址的请求一律 403,不对局域网开放。Origin 头 —— 拦截恶意网页的跨站请求(DNS rebinding)。没有 Origin 的原生客户端正常放行。另外:
%LOCALAPPDATA%\ExcelAI\mcp-token.txt)—— 重启 Excel 不会变,客户端配置长期有效。只有在设置页点过「重置令牌」之后旧地址才会作废,届时回设置页重新复制即可。| 现象 | 原因 / 处理 |
|---|---|
| 状态点 🟢 但客户端说连不上 | 检查客户端填的完整 URL(含末尾令牌)。复制时别漏字符。 |
| 状态点 🔴「未运行 —— 端口可能被占用」 | 换个端口(如 8932)重新保存。 |
| 设置页开关打开了但状态没变 | 需要保存才生效(页面会提示「正在保存设置…」)。 |
客户端报 404 | URL 里的令牌作废了(你点过「重置令牌」)→ 回设置页点「复制」拿新地址。若地址框下提示「仅本会话有效」,说明令牌写不进 %LOCALAPPDATA%\ExcelAI\,检查一下那个目录的权限。 |
客户端报 403 | 请求带了非本机的 Origin,或来自非回环地址。 |
| 刚还好好的,突然连不上 | 多半是点过「重置令牌」(旧地址当场作废)→ 回设置页重新复制。若近期没重置过,先看状态点还在不在跑。 |
| 工具调用超时 | 大表操作较慢。Codex 侧把 tool_timeout_sec 调大(如 120)。 |
| 写入几百行时特别慢 / 卡死 | AI 很可能在循环调 write_cell 逐格写。每次调用都是一次独立往返,500 行 = 500 次。让它改用 write_range 一次写完整块 —— 明确要求它「用 write_range」。 |
| AI 说「无法连接 Excel」 | 确认 Excel 已打开、加载项在运行;重启一次 Excel 再试。 |
| 改东西没反应 | 检查最近调用列表里有没有记录 —— 有记录说明请求到了,看返回内容里的错误。 |
1. 设置 → MCP 服务 → 打开开关
2. 填端口(默认 8931)→ 保存
3. 点「复制」拿到连接地址
4. 客户端配置:
Codex → ~/.codex/config.toml
[mcp_servers.excel]
url = "<粘贴地址>"
其他 → mcpServers JSON,type: "http",url: <粘贴地址>
5. 用完关开关 → 端口立刻停止监听GetToolDefinitions)。
唯一例外是 batch_process_workbooks —— 它靠弹文件夹选择框取路径,MCP 下用不了,已剔除。