news 2026/10/1 6:16:40

从零手写MCP Server:让AI自动处理Excel的实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零手写MCP Server:让AI自动处理Excel的实战指南

1. 为什么我要自己动手写一个 MCP

1.1 从一次崩溃的 Excel 处理经历说起

上个月帮朋友处理一批销售数据,二十多个 Excel 文件,每个文件里七八个 Sheet,需要把指定列的数据提取出来、做清洗、再合并成一张总表。我一开始想的是用 Python 写个脚本批量跑,结果打开文件一看傻眼了——表头位置不固定,有的在第三行,有的在第五行,列名还有合并单元格,日期格式五花八门,有的是文本有的是日期序列号。写脚本改了三版,每改一版就要重新跑一遍全量数据,调试成本极高。

后来我换了个思路:能不能让 AI 直接理解我的意图,我告诉它“把每个文件里‘销售额’那一列抽出来,按月份汇总”,它自己去看文件结构、自己决定怎么处理?这就是我接触 MCP 的起点。

MCP 全称 Model Context Protocol,翻译过来叫“模型上下文协议”。你可以把它理解成一套标准接口,让 AI 模型能够调用外部工具、读取外部数据。打个比方,AI 本身是个很聪明但被关在房间里的人,MCP 就是给这个房间开了一扇门,让它能伸手拿到外面的东西——文件、数据库、API,都能通过 MCP 接进来。

我做的这个项目,核心就是写一个 MCP Server,专门用来处理 Excel。做完之后的效果是:我在 AI 对话里说“帮我看看这个 Excel 里有哪些 Sheet”,AI 就能通过我写的 MCP 工具去读文件、返回结果;我说“把 Sheet1 里 B 列到 F 列的数据提取出来”,它也能直接操作。整个过程不需要我手动打开 Excel,也不需要写死脚本。

1.2 这个项目适合谁来参考

如果你符合下面任意一条,这篇内容应该对你有用:

  • 日常工作中大量接触 Excel,但不想每次都手动重复操作
  • 有 Python 基础,想了解怎么把自己的代码能力接入 AI 工作流
  • 听说过 MCP 但不知道从哪下手,想找一个完整的实战案例
  • 已经在用 AI 辅助办公,但觉得只能聊天不够,想让 AI 真正“动手干活”

不需要你是 AI 专家,也不需要你写过 MCP。我会从环境搭建开始,把每一步都拆开讲。但前提是你得会一点 Python,至少知道怎么装包、怎么运行脚本。完全零基础的话,建议先花两天把 Python 基础过一遍再来看。

1.3 整体方案的设计思路

我一开始考虑过几种方案。第一种是直接用 AI 平台自带的代码解释器功能,上传 Excel 让它写代码处理。这个方案的问题是:每次都要重新上传文件,而且 AI 写的代码我看不到中间过程,出了问题不好排查。第二种是写一个 Web 服务,用 API 的方式调用。这个方案太重了,要部署、要维护、要考虑并发,对于个人使用来说完全是杀鸡用牛刀。

最终选 MCP 的原因很简单:它是专门为 AI 调用外部工具设计的协议,天然适合“AI 决定什么时候调用什么工具”这个场景。而且 MCP Server 可以跑在本地,文件不用上传到任何地方,数据安全性有保障。我只需要定义好工具的名称、参数和返回值,AI 就能根据对话内容自动判断该调用哪个工具。

整个架构分三层:最底层是 Excel 文件操作层,用 openpyxl 和 pandas 来做实际的读写;中间是 MCP Server 层,把文件操作封装成一个个工具函数;最上层是 AI 对话层,AI 根据用户意图决定调用哪些工具。我写代码的主要工作量在中间层,底层用现成的库,上层用现成的客户端。

这里有个关键决策:我选择用 Python 而不是 Node.js 或 Go 来写 MCP Server。原因是我处理 Excel 最熟悉的库都在 Python 生态里,openpyxl、pandas、xlrd 这些库成熟稳定,遇到问题查资料也方便。如果你更熟悉其他语言,MCP 协议本身是语言无关的,用你顺手的就行。

2. MCP 协议核心概念快速上手

2.1 MCP 到底是什么,用生活化类比讲清楚

官方文档对 MCP 的定义比较抽象,我用自己的话重新讲一遍。

想象你是一个公司的老板(AI 模型),你想让助理帮你做事。但助理刚来,不知道公司的文件放在哪、打印机怎么用、报销流程是什么。MCP 就是一套标准化的“助理培训手册”,里面规定了:公司有哪些资源可以用(Resources)、有哪些操作可以执行(Tools)、有哪些预设的提示模板(Prompts)。

Resources 是只读的数据源,比如“销售数据表”“员工名单”。Tools 是可以执行的操作,比如“读取 Excel 指定区域”“写入数据到指定单元格”。Prompts 是预设的对话模板,比如“帮我分析这个月的销售趋势”。

AI 通过 MCP 协议和 Server 通信,Server 告诉 AI:“我这里有这三个工具,分别叫什么名字、需要什么参数、返回什么格式。”AI 在对话中判断用户意图,决定调用哪个工具、传什么参数。整个过程是动态的,不需要提前把所有可能性都写死。

2.2 MCP Server 和 Client 的关系

MCP 采用客户端-服务端架构。Server 是提供能力的一方,Client 是使用能力的一方。在我的项目里,我写的是 Server,负责提供 Excel 处理能力。Client 是 AI 应用本身,比如某些支持 MCP 的桌面 AI 工具或开发环境插件。

两者之间的通信支持两种方式:stdio(标准输入输出)和 SSE(Server-Sent Events)。stdio 适合本地运行,Server 和 Client 在同一台机器上,通过标准输入输出流通信,配置简单、延迟低。SSE 适合远程场景,Server 跑在一台机器上,Client 通过网络连接。

我选的是 stdio 方式,因为我的使用场景就是本地处理文件,不需要远程访问。配置的时候只需要在 Client 的配置文件里写上 Server 的启动命令就行,比如python /path/to/my_excel_server.py。

2.3 一个最小可用的 MCP Server 长什么样

先看一个最简单的例子,让你对 MCP Server 的代码结构有个直观感受:

from mcp.server import Server from mcp.server.stdio import stdio_server from mcp.types import Tool, TextContent app = Server("excel-mcp") @app.list_tools() async def list_tools(): return [ Tool( name="read_excel_sheets", description="读取Excel文件中的所有Sheet名称", inputSchema={ "type": "object", "properties": { "file_path": {"type": "string", "description": "Excel文件路径"} }, "required": ["file_path"] } ) ] @app.call_tool() async def call_tool(name: str, arguments: dict): if name == "read_excel_sheets": import openpyxl wb = openpyxl.load_workbook(arguments["file_path"], read_only=True) sheets = wb.sheetnames wb.close() return [TextContent(type="text", text=f"Sheet列表: {', '.join(sheets)}")] async def main(): async with stdio_server() as (read_stream, write_stream): await app.run(read_stream, write_stream, app.create_initialization_options()) if __name__ == "__main__": import asyncio asyncio.run(main())

这段代码虽然短,但已经包含了 MCP Server 的核心要素:声明工具列表、实现工具调用逻辑、启动 stdio 服务。后面我要做的,就是在这个骨架上不断添加更多工具、处理更复杂的逻辑。

3. 环境搭建与依赖安装

3.1 Python 环境准备

我用的 Python 版本是 3.11。建议不要用太老的版本,因为 MCP 的 Python SDK 用到了不少较新的异步特性。3.10 以上都可以,3.11 或 3.12 更稳。

安装 Python 本身就不展开讲了,官网下载安装包一路下一步就行。重点讲一下虚拟环境的创建,这个很重要,因为 MCP Server 的依赖和你的其他项目可能会冲突。

python -m venv mcp-excel-env source mcp-excel-env/bin/activate # Windows 用 mcp-excel-env\Scripts\activate

创建完虚拟环境后,所有依赖都装在这个环境里,不会污染全局。

3.2 核心依赖清单

我列一下这个项目用到的所有依赖,以及每个依赖的作用:

依赖包版本要求用途说明
mcp>=1.0.0MCP 协议 Python SDK,提供 Server 和 Client 实现
openpyxl>=3.1.0读写 xlsx 格式 Excel 文件,支持公式、样式、合并单元格
pandas>=2.0.0数据处理和分析,适合批量操作和复杂计算
xlrd>=2.0.0读取旧版 xls 格式文件(openpyxl 不支持 xls)
pydantic>=2.0.0数据校验,MCP 内部依赖它做参数验证

安装命令:

pip install mcp openpyxl pandas xlrd pydantic

注意:pandas 安装的时候可能会编译一些 C 扩展,如果遇到报错,可以先升级 pip:pip install --upgrade pip,然后再装。Windows 用户如果遇到编译问题,建议直接装预编译的 wheel 包,或者用 conda 安装。

3.3 验证环境是否可用

装完之后跑一段测试代码,确认所有库都能正常导入:

import mcp import openpyxl import pandas as pd import xlrd print("mcp version:", mcp.__version__) print("openpyxl version:", openpyxl.__version__) print("pandas version:", pd.__version__) print("所有依赖导入成功")

如果这段代码能跑通不报错,环境就没问题了。如果报 ModuleNotFoundError,检查一下虚拟环境是否激活、包是否装到了正确的环境里。

4. Excel 处理工具的核心实现

4.1 工具设计:先想清楚 AI 需要什么能力

在写代码之前,我先列了一下 AI 处理 Excel 时最需要哪些能力。这个列表不是拍脑袋想的,是我回顾了自己平时处理 Excel 的流程,把重复度最高的操作提取出来:

  • 读取文件基本信息:有哪些 Sheet、每个 Sheet 有多少行多少列
  • 读取指定区域的数据:给定 Sheet 名和单元格范围,返回数据
  • 按条件筛选数据:比如“找出销售额大于 1000 的行”
  • 写入数据:在指定位置写入值或公式
  • 创建新 Sheet、删除 Sheet
  • 数据格式转换:比如把文本日期转成标准日期格式
  • 批量处理多个文件:对文件夹下所有 Excel 执行相同操作

我最终实现了前六个,第七个因为涉及文件系统遍历,我单独做了一个工具。每个工具都对应 MCP 里的一个 Tool 定义。

4.2 读取 Excel 文件结构

这是最基础的工具,AI 拿到一个文件路径后,第一件事就是了解这个文件里有什么。

@app.list_tools() async def list_tools(): return [ Tool( name="get_excel_info", description="获取Excel文件的基本信息,包括所有Sheet名称、每个Sheet的行数和列数", inputSchema={ "type": "object", "properties": { "file_path": { "type": "string", "description": "Excel文件的绝对路径" } }, "required": ["file_path"] } ), # ... 其他工具 ]

对应的处理逻辑:

@app.call_tool() async def call_tool(name: str, arguments: dict): if name == "get_excel_info": file_path = arguments["file_path"] try: wb = openpyxl.load_workbook(file_path, read_only=True, data_only=True) info = [] for sheet_name in wb.sheetnames: ws = wb[sheet_name] info.append({ "sheet_name": sheet_name, "max_row": ws.max_row, "max_column": ws.max_column }) wb.close() result = json.dumps(info, ensure_ascii=False, indent=2) return [TextContent(type="text", text=result)] except Exception as e: return [TextContent(type="text", text=f"读取失败: {str(e)}")]

这里有几个细节值得说。read_only=True让 openpyxl 以只读模式打开文件,速度更快、内存占用更低,适合大文件。data_only=True表示如果单元格里是公式,返回公式计算后的值而不是公式本身。这两个参数搭配使用,在只需要读取数据不需要修改的场景下是最优选择。

4.3 读取指定区域数据

这个工具比上一个复杂一些,因为要处理单元格范围解析。用户可能说“A1 到 D10”,也可能说“从第三行到第十行”,我需要把这些自然语言描述转成 openpyxl 能理解的格式。

Tool( name="read_range", description="读取指定Sheet中指定单元格区域的数据", inputSchema={ "type": "object", "properties": { "file_path": {"type": "string", "description": "Excel文件路径"}, "sheet_name": {"type": "string", "description": "Sheet名称"}, "start_cell": {"type": "string", "description": "起始单元格,如A1"}, "end_cell": {"type": "string", "description": "结束单元格,如D10"} }, "required": ["file_path", "sheet_name", "start_cell", "end_cell"] } )

处理逻辑用 openpyxl 的iter_rows方法:

if name == "read_range": file_path = arguments["file_path"] sheet_name = arguments["sheet_name"] start_cell = arguments["start_cell"] end_cell = arguments["end_cell"] wb = openpyxl.load_workbook(file_path, read_only=True, data_only=True) ws = wb[sheet_name] rows = [] for row in ws[f"{start_cell}:{end_cell}"]: row_data = [cell.value for cell in row] rows.append(row_data) wb.close() # 转成Markdown表格格式,方便AI理解和展示 if rows: header = rows[0] md_table = "| " + " | ".join(str(h) for h in header) + " |\n" md_table += "| " + " | ".join(["---"] * len(header)) + " |\n" for row in rows[1:]: md_table += "| " + " | ".join(str(v) if v is not None else "" for v in row) + " |\n" return [TextContent(type="text", text=md_table)] return [TextContent(type="text", text="指定区域没有数据")]

这里我特意把返回结果转成了 Markdown 表格格式。原因是 AI 对 Markdown 表格的理解能力很强,能直接从中提取结构化信息。如果返回的是 JSON 数组,AI 也能理解,但展示给用户看的时候不够直观。这个设计在实际使用中效果很好,AI 经常能直接基于表格内容做分析。

4.4 数据筛选与条件查询

这个工具让 AI 能够根据条件筛选数据。我设计的时候考虑了一个问题:条件表达式怎么传?如果让 AI 直接传 Python 表达式,有安全风险;如果设计一套复杂的查询 DSL,AI 学习成本高。

最后我选了一个折中方案:支持简单的比较条件,用 JSON 格式传递。

Tool( name="filter_data", description="根据条件筛选Excel中的数据行", inputSchema={ "type": "object", "properties": { "file_path": {"type": "string"}, "sheet_name": {"type": "string"}, "header_row": {"type": "integer", "description": "表头所在行号,从1开始"}, "conditions": { "type": "array", "items": { "type": "object", "properties": { "column": {"type": "string"}, "operator": {"type": "string", "enum": ["eq", "gt", "lt", "gte", "lte", "contains"]}, "value": {"type": "string"} } }, "description": "筛选条件列表,多个条件之间是AND关系" } }, "required": ["file_path", "sheet_name", "header_row", "conditions"] } )

实现逻辑用 pandas 来做,因为 pandas 的筛选功能非常成熟:

if name == "filter_data": df = pd.read_excel( arguments["file_path"], sheet_name=arguments["sheet_name"], header=arguments["header_row"] - 1 ) mask = pd.Series([True] * len(df)) for cond in arguments["conditions"]: col = cond["column"] op = cond["operator"] val = cond["value"] if op == "eq": mask &= (df[col].astype(str) == val) elif op == "gt": mask &= (pd.to_numeric(df[col], errors="coerce") > float(val)) elif op == "lt": mask &= (pd.to_numeric(df[col], errors="coerce") < float(val)) elif op == "gte": mask &= (pd.to_numeric(df[col], errors="coerce") >= float(val)) elif op == "lte": mask &= (pd.to_numeric(df[col], errors="coerce") <= float(val)) elif op == "contains": mask &= df[col].astype(str).str.contains(val, na=False) filtered = df[mask] result = filtered.to_markdown(index=False) return [TextContent(type="text", text=f"筛选到 {len(filtered)} 行数据:\n\n{result}")]

用 pandas 的to_markdown方法直接输出 Markdown 表格,省去了手动拼接的麻烦。不过要注意,to_markdown需要安装tabulate库,记得加到依赖里。

4.5 写入数据与创建新 Sheet

写入操作比读取要小心,因为一旦写错就可能覆盖原始数据。我的做法是:所有写入操作默认创建一个新文件,不直接修改原文件。如果用户明确要求修改原文件,才在原文件上操作。

Tool( name="write_data", description="向Excel指定位置写入数据,默认创建新文件", inputSchema={ "type": "object", "properties": { "file_path": {"type": "string", "description": "源文件路径"}, "output_path": {"type": "string", "description": "输出文件路径,不填则覆盖源文件"}, "sheet_name": {"type": "string"}, "start_cell": {"type": "string"}, "data": { "type": "array", "items": {"type": "array", "items": {"type": "string"}}, "description": "二维数组,每个子数组代表一行" } }, "required": ["file_path", "sheet_name", "start_cell", "data"] } )

写入逻辑:

if name == "write_data": src = arguments["file_path"] dst = arguments.get("output_path", src) wb = openpyxl.load_workbook(src) ws = wb[arguments["sheet_name"]] start_cell = arguments["start_cell"] start_col = openpyxl.utils.column_index_from_string( ''.join(filter(str.isalpha, start_cell)) ) start_row = int(''.join(filter(str.isdigit, start_cell))) for i, row_data in enumerate(arguments["data"]): for j, value in enumerate(row_data): ws.cell(row=start_row + i, column=start_col + j, value=value) wb.save(dst) wb.close() return [TextContent(type="text", text=f"数据已写入 {dst}")]

这里有个坑我踩过:openpyxl 的column_index_from_string只接受纯字母,如果传入 "A1" 这种带数字的会报错。所以要先分离字母和数字部分。这个细节在官方文档里没有明确说,是我调试的时候发现的。

5. 把 MCP Server 接入 AI 工作流

5.1 配置文件的写法

MCP Server 写好了,接下来要让 AI 客户端知道它的存在。不同的客户端配置方式略有差异,但核心都是告诉客户端:启动命令是什么、参数是什么。

以常见的配置文件格式为例:

{ "mcpServers": { "excel-processor": { "command": "/path/to/mcp-excel-env/bin/python", "args": ["/path/to/excel_server.py"], "env": { "PYTHONUNBUFFERED": "1" } } } }

关键点:command要指向虚拟环境里的 Python 解释器,不是系统全局的 Python。因为依赖装在虚拟环境里,用全局 Python 会找不到包。args是 Server 脚本的路径。env里设置PYTHONUNBUFFERED=1是为了让输出实时刷新,避免日志延迟。

5.2 实际对话中的调用效果

配置好之后,我在 AI 对话里测试了几个场景。

第一个场景:我输入“帮我看看 D:\data\sales.xlsx 这个文件里有哪些 Sheet”。AI 自动调用了get_excel_info工具,返回了 Sheet 列表和每个 Sheet 的规模。整个过程我没有写任何代码,就是一句话的事。

第二个场景:我说“把 Sheet1 里 A1 到 E20 的数据读出来给我看看”。AI 调用read_range,返回了一个 Markdown 表格。我接着问“销售额超过 5000 的有哪些”,AI 又调用filter_data,在刚才读取的数据基础上做筛选。注意这里 AI 并没有重新读文件,而是基于上下文里的数据直接筛选,说明它理解了工具返回结果的含义。

第三个场景:我说“把筛选出来的结果写到新文件 D:\data\result.xlsx 的 Sheet1 里”。AI 调用write_data,把数据写入了新文件。我打开文件检查,数据完全正确。

5.3 工具描述的重要性

这里我要特别强调一点:MCP 工具的description字段非常关键。AI 是根据这个描述来判断什么时候该调用哪个工具的。如果描述写得含糊,AI 就可能调错工具或者不调用。

我一开始把read_range的描述写成“读取 Excel 数据”,结果 AI 经常在只需要 Sheet 列表的时候也调用这个工具。后来改成“读取指定 Sheet 中指定单元格区域的数据,需要提供起始和结束单元格”,AI 的调用准确率明显提升。

同理,参数的description也要写清楚。比如start_cell我写的是“起始单元格,如 A1”,给了一个具体例子,AI 就知道格式是什么样的。如果不写例子,AI 可能会传“第1行第1列”这种自然语言描述,导致解析失败。

6. 踩坑记录与问题排查

6.1 常见报错与解决方法

报错信息原因解决方法
ModuleNotFoundError: No module named 'mcp'依赖没装或装错环境确认虚拟环境已激活,重新 pip install mcp
FileNotFoundError文件路径不对用绝对路径,Windows 路径注意反斜杠转义
openpyxl.utils.exceptions.InvalidFileException文件格式不支持确认是 xlsx 格式,xls 需要用 xlrd
PermissionError文件被其他程序占用关闭 Excel 再试,或者写入新文件
JSONDecodeError参数格式不对检查 AI 传的参数是否符合 inputSchema

6.2 大文件处理的性能问题

我测试过一个 50MB 的 Excel 文件,大约 20 万行数据。用read_only=True模式读取 Sheet 列表很快,不到一秒。但用 pandas 读取全部数据做筛选时,内存占用飙升到 1GB 以上,耗时将近半分钟。

优化方案:对于大文件,不要一次性读全部数据。可以先用get_excel_info了解规模,然后分批次读取。或者用 openpyxl 的iter_rows逐行处理,避免一次性加载到内存。

# 分批读取示例 batch_size = 10000 for i, row in enumerate(ws.iter_rows(min_row=2, values_only=True)): if i % batch_size == 0: # 处理一批数据 pass

6.3 AI 调用工具时的参数错误

AI 有时候会传一些意料之外的参数。比如header_row我定义的是 integer,AI 可能传字符串 "3"。虽然 pydantic 会做类型转换,但为了保险,我在代码里加了显式转换:

header_row = int(arguments["header_row"])

还有一种情况是 AI 传了不存在的 Sheet 名。我在代码里加了检查:

if sheet_name not in wb.sheetnames: return [TextContent(type="text", text=f"Sheet '{sheet_name}' 不存在,可用的Sheet: {wb.sheetnames}")]

这样 AI 收到错误信息后,会自动根据可用 Sheet 列表重新尝试。

6.4 中文编码问题

处理中文 Excel 时遇到过乱码问题。原因是文件本身编码不对,或者 pandas 读取时默认编码不匹配。解决方法是在读取时指定编码:

df = pd.read_excel(file_path, sheet_name=sheet_name, encoding="utf-8")

如果还是乱码,可能是文件本身的问题,用 Excel 打开另存为一次通常能解决。

7. 后续扩展方向

7.1 支持更多文件格式

目前只支持 xlsx 和 xls,后续可以加上 csv、tsv 的支持。pandas 本身就能读这些格式,只需要在工具里加一个格式判断分支就行。

7.2 增加图表生成能力

用 openpyxl 的 chart 模块可以在 Excel 里生成柱状图、折线图、饼图。这个功能对于做报表很有用。我打算下一步加一个create_chart工具,让 AI 能根据数据自动生成图表。

7.3 批量文件处理

现在的工具都是针对单个文件的。实际工作中经常需要处理一个文件夹下的所有 Excel。可以加一个batch_process工具,接受文件夹路径和一个操作列表,对每个文件执行相同操作。

7.4 与数据库打通

Excel 处理完之后,数据可能需要入库。可以加一个工具,把 Excel 数据写入 SQLite 或 PostgreSQL。这样 AI 就能完成从文件读取到数据入库的完整流程。

7.5 错误恢复与重试机制

目前如果某个工具调用失败,整个流程就中断了。可以加一个重试机制,对于临时性错误(如文件被占用)自动重试几次。这个用 Python 的tenacity库很容易实现。

from tenacity import retry, stop_after_attempt, wait_fixed @retry(stop=stop_after_attempt(3), wait=wait_fixed(2)) def load_workbook_with_retry(path): return openpyxl.load_workbook(path)

8. 一些实操心得

写这个 MCP Server 的过程中,我最大的体会是:工具的设计比代码的实现更重要。代码写得再漂亮,如果工具定义不符合 AI 的使用习惯,效果就是不好。反过来,工具定义得清晰合理,代码稍微粗糙一点,AI 也能用得很好。

具体来说,有几点经验值得分享。

第一,工具粒度要适中。太粗了 AI 不好控制,比如一个“处理 Excel”工具,AI 不知道具体能做什么;太细了调用次数太多,比如把“读取单元格”和“读取区域”分成两个工具,AI 经常搞混。我的经验是按操作类型分,读、写、筛选、转换各一个工具,每个工具内部处理细节。

第二,返回值格式要统一。我所有工具都返回 Markdown 格式的文本,AI 处理起来最顺畅。如果有的返回 JSON、有的返回纯文本、有的返回表格,AI 需要花精力去理解不同格式,容易出错。

第三,错误信息要具体。不要只返回“操作失败”,要返回“Sheet 'Sheet3' 不存在,可用的Sheet有:Sheet1, Sheet2”。这样 AI 能根据错误信息自动纠正,不需要人工干预。

第四,先在本地测试再接入 AI。MCP Server 写完后,可以写一个简单的测试脚本直接调用工具函数,确认逻辑正确后再配置到 AI 客户端。这样排查问题的时候能快速定位是工具本身的问题还是 AI 调用的问题。

第五,日志要打全。我在每个工具函数的入口和出口都加了日志,记录传入参数和返回结果。调试的时候看日志就能知道 AI 传了什么、工具返回了什么,比在 AI 对话里猜要高效得多。

import logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) # 在工具函数里 logger.info(f"调用工具: {name}, 参数: {arguments}")

这套东西搭起来之后,我处理 Excel 的效率确实上了一个台阶。以前要写脚本、调试、跑数据,现在就是几句话的事。当然也不是万能的,特别复杂的逻辑还是得写代码,但日常百分之七八十的重复操作都能覆盖了。如果你也经常跟 Excel 打交道,建议花一个周末把这个搭起来,后面省下的时间绝对值得。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 6:16:11

从Claude Code到Pi:AI Coding工具链迁移与harness架构解析

1. 从 Claude Code 到 Pi&#xff1a;一场关于 AI Coding 工具链的理性迁移最近半年&#xff0c;我身边不少做 AI Coding 的朋友都在悄悄换工具。不是从 Cursor 换到 Windsurf 那种小打小闹&#xff0c;而是把已经深度嵌入日常开发流程的 Claude Code 逐步替换成了 Pi。这个现象…

作者头像 李华
网站建设 2026/10/1 6:16:11

稗草马唐等20+类杂草数据集构建与YOLOv8训练避坑全攻略

简介&#xff1a;农业杂草识别是智慧农业与精准植保的核心场景之一。针对计算机视觉与农业AI研究者&#xff0c;这份数据集收录近2700张真实农田环境下的杂草高清图像&#xff0c;覆盖稗草、马唐等多种常见恶性杂草、不同生长期与作物伴生背景&#xff0c;图像统一缩放至256256…

作者头像 李华
网站建设 2026/10/1 6:15:44

校友管理系统源码落地实战:从解压到生产部署全链路指南

简介&#xff1a;这是一套面向计算机、数学及电子信息等专业学生的校友管理系统C桌面应用源码&#xff0c;适用于课程设计、期末大作业与毕业设计参考&#xff0c;帮助学习者掌握Qt框架开发、SQLite数据库操作、MVC架构设计及模块化UI实现。资源共50个文件&#xff0c;包含12个…

作者头像 李华
网站建设 2026/10/1 6:15:44

ComfyUI+Flux本地部署显存优化实战指南

1. 为什么“最强本地部署ComfyUIFlux模型”不是噱头&#xff0c;而是实打实的省钱路径&#xff1f;最近在几个AI绘画技术群和本地部署交流论坛里&#xff0c;几乎每天都有人问&#xff1a;“我这台i7-10700 RTX 3060 12G的旧电脑&#xff0c;还能不能跑Flux&#xff1f;秋叶包…

作者头像 李华
网站建设 2026/10/1 6:15:41

人类目标检测数据集从解压到训练:格式转换与清洗实战

简介&#xff1a;用于目标检测任务的人类目标检测数据集&#xff0c;共456张真实场景图片&#xff0c;统一标注为单一Human类别&#xff0c;适合需要高一致性人员检测的开发者与研究者。数据集已划分训练集390张、验证集38张、测试集28张&#xff0c;采用标准YOLO格式标注边界框…

作者头像 李华
网站建设 2026/10/1 6:14:40

Claude Code 配置模板化:从环境复现到监控闭环

1. 项目概述与核心需求解析先说结论&#xff1a;claude-code-templates 是我在大量使用 Claude Code 之后&#xff0c;被配置碎片化、环境不可复现、状态不可观测这三座大山压出来的一个开源整理项目。它本质上就是一个配置模板仓库 监控中心&#xff0c;把散落在各处的 Claud…

作者头像 李华