我搭建了MCP服务器,这样我就再也不需要手动导入Excel数据了
抱歉,我无法直接访问外部链接获取文章内容。请您把需要翻译的文本粘贴在这里,我会按照要求保留源链接并将正文翻译成简体中文。
开始的一切问题
想象一下:你在经营一家小咖啡馆。你的菜单保存在 Excel 表格中(因为大家都用这个,对吧?)。现在你需要把这些数据导入 MongoDB,以供新的网站应用使用。
你的选择
- 手动复制粘贴每一项(令人崩溃)
- 编写一次性的 Node.js 脚本(一次能用,下次就会出错)
- 请 ChatGPT 编写脚本(帮你完成 80 % ,剩下的就得自己搞)
我想要的是选项 4:像和人对话一样和 Claude 交流,让它直接…工作。
这就是 MCP(Model Context Protocol) 出现的原因。
MCP 到底是什么?
MCP 基本上是一种让 Claude(或任何 AI)拥有超能力的方式。Claude 不再只是回答问题,而是可以实际做事——比如读取文件、调用 API,或者在我的案例中,将 Excel 数据导入数据库。
| 没有 MCP 时 | 使用 MCP 时 |
|---|---|
| Claude 是一个非常聪明的朋友,只能提供建议。 | Claude 是一个非常聪明的朋友,实际上可以 SSH 登录你的服务器并进行修复。 |
问题是?你必须自己构建执行实际工作的“服务器”。
构建 MindfulMapper
愿景
我希望能够说:
“嘿 Claude,把 menu.xlsx 导入我的 products 集合。将 ‘Name (EN)’ 映射到
name.en,将 ‘Name (TH)’ 映射到name.th。还有,自动生成前缀为 ‘spb’ 的 ID。”
……并且它能直接工作。
现实(即痛点)
痛点 #1 – Dotenv 灾难
我的第一个版本使用 dotenv 来加载环境变量:
import dotenv from 'dotenv';
dotenv.config();
dotenv 会向 stdout 打印一条提示信息:
[dotenv@17.2.4] injecting env (4) from .env
Claude Desktop 看到这条信息后,尝试将其解析为 JSON(因为 MCP 使用 JSON‑RPC),于是立刻崩溃。花了我太久才弄清楚这件事。
解决方案: 抑制该信息或在 Claude Desktop 配置中硬编码环境变量。我选择了后者。
痛点 #2 – SDK 版本地狱
MCP SDK 更新速度极快——真的非常快。1.26.0 版本的语法与网上的示例完全不同。
示例中展示的(1.26.0 之前):
server.addTool({
name: "my_tool",
description: "Does a thing",
parameters: z.object({ /* … */ }),
execute: async ({ /* … */ }) => { /* … */ }
});
在 v1.26.0 实际可用的写法:
const server = new Server(
{ name: "my-server", version: "1.0.0" },
{ capabilities: { tools: {} } }
);
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [/* … */]
}));
server.setRequestHandler(CallToolRequestSchema, async (request) => {
// Handle tool calls
});
完全不同。为此花了好几个小时。
痛点 #3 – 自动生成 ID
我想要的 ID 形如 spb-0001、spb-0002 等。关键在于在 MongoDB 中维护一个计数器:
async function getNextId(prefix = 'spb') {
const counterCollection = db.collection('counters');
const result = await counterCollection.findOneAndUpdate(
{ _id: 'item_id' },
{ $inc: { seq: 1 } },
{ upsert: true, returnDocument: 'after' }
);
const num = result.seq || 1;
return `${prefix}-${String(num).padStart(4, '0')}`;
}
这可以确保:
- 不会出现重复 ID(即使多次导入同一文件)
- 编号是顺序的
- 不同项目类型可以使用自定义前缀
The Cool Parts
1. Flexible Column Mapping
想把 Excel 列映射到嵌套的 MongoDB 对象吗?很简单:
// Excel columns: "Name (EN)", "Name (TH)"
// Mapping: { "name.en": "Name (EN)", "name.th": "Name (TH)" }
// Result in MongoDB:
{
id: "spb-0001",
name: {
en: "Americano",
th: "อเมริกาโน่"
}
}
映射器会自动处理点号表示法。
2. Natural Language Interface
不必每次都写代码,我只需要对 Claude 说:
“将 menu.xlsx 导入 products 集合。使用前缀 ‘spb’。清除已有数据。”
Claude 会把它转换为正确的 MCP 工具调用并带上相应参数。这就像拥有一个永不疲倦、非常耐心的数据导入助理。
3. It Actually Works in Production
我在 MongoDB Atlas(云)上使用它来管理真实的咖啡馆菜单系统。它在生产环境中能够可靠运行,这一点仍然让我感到惊讶。
如何使用
1. 安装
git clone https://github.com/kie-sp/mindful-mapper.git
cd mindful-mapper
npm install
2. 配置 Claude Desktop
将以下内容添加到 ~/Library/Application Support/Claude/claude_desktop_config.json(根据你的环境调整路径/数值):
{
"mcpServers": {
"mindful-mapper": {
"command": "node",
"args": ["/full/path/to/mindful-mapper/upload-excel.js"],
"env": {
"MONGODB_URI": "your-mongodb-connection-string",
"MONGODB_DB_NAME": "your_db",
"ID_PREFIX": "spb"
}
}
}
}
3. 使用它
-
重启 Claude Desktop。
-
说,例如:
“将 /path/to/menu.xlsx 导入 products 集合。使用前缀 ‘spb’。”
就这么简单。


教训
1. MCP 仍处于早期阶段
SDK 更新迅速。两个月前还能运行的代码今天可能会出错。始终检查你使用的版本。
2. 调试 MCP 服务器……很有意思
当你的服务器静默崩溃时,你在 Claude 中看不到堆栈跟踪。你的最佳帮手变成了:
node your-server.js 2>&1
以及位于以下位置的日志:
~/Library/Logs/Claude/mcp*.log
3. 收获值得
一旦成功,它就是魔法。我从害怕数据导入变成了真的享受它们(好吧,至少不再害怕了)。
接下来是什么?
我想要修复的当前限制:
- No schema validation – 它会愉快地导入垃圾数据。
- No update/upsert mode – 只能“插入”或“清除后插入”。
- MongoDB only – 已有 PostgreSQL 支持,但需要完善。
- No multi‑sheet support – 只处理第一张工作表。
但说实话,对于约 90 % 的使用场景,它已经完美运行。
亲自尝试
- GitHub:
- 需求: Node.js 18+, MongoDB, Claude Desktop
- 许可证: MIT(随意使用)
如果你用它做出了很酷的东西,告诉我一声!或者如果你遇到了和我相同的痛点,至少现在你知道自己并不孤单。
最后思考
构建 MCP 服务器很奇怪。它既不像后端开发,也不像 AI 工程——它是一种全新的为 AI 代你使用的工具构建方式。
当它正常工作时,你可以随意让 Claude 处理你的数据导入,而你去泡咖啡。这相当酷。
如果你最终使用了它或构建了类似的东西,我很想听听你的经验!欢迎在 GitHub 上打开 issue 或直接联系我。
导入愉快! 🎉
构建使用:Node.js、MongoDB、MCP SDK,以及大量不合理的反复试验