Claude Code 使用 MCP 实践记录
初衷:用一个真实问题入门 MCP
用 MCP 解决一个实际项目中遇到的问题,既学习了新知识,又解决了自己遇到的问题,提高了工作效率。
- 三次迭代:手工 NimbleText 批量替换 → Claude.md 策略生成登记 SQL → MCP 工具自动写入。
- 关键收益:新增 WebAPI 后,不必再手工拼主键、手工执行入库 SQL。
- 前提与风险:
/mcp当前匿名可访问且可写,仅限可信内网 / 开发环境使用。
需求描述
前后台网站分离开发,后台有一套完善的 WebAPI 验证系统,不允许匿名访问。每新增一个 WebAPI,就要在后台登记一次,这是一项纯重复劳动。
- 没用 Vibe Coding 的时候,做法是新增 API 先匿名运行跳过验证,积累到一定数量后,在 Swagger 页面集体复制,再用 NimbleText 这类工具批量替换成 Insert SQL,插入后台数据库。
- 用上 Claude Code 后的第一版,是让大模型在 Claude.md 中加入策略:产生 WebAPI 时自动生成 SQL 归档到一个文件,自己再手动执行。问题是数据库主键需要每次手工修改,还是不够智能。
三种做法的人工成本和主键处理方式差异如下:
| 方案 | 人工步骤 | 主键(id)处理 | 来源标记 |
|---|---|---|---|
| NimbleText 批量替换 | Swagger 复制 + 批量替换后手工执行 SQL | 手工修改 | db |
| Claude.md 策略生成 SQL | 从 webapi.txt 手工执行 | 需手工调整 | db |
MCP CreateApiAsync | 无,工具直接入库 | 雪花号自动生成 | mcp |
改进型解决方案:把登记交给 MCP
后台创建 MCP,让大模型自动调用加入 WebAPI 登记,完全自动化,嘿嘿。为以防万一和多机部署,保留 SQL 归档,同时增加 MCP 提示插入。两条通道的关系如下图:
WebAPI 接口权限登记(webapi.txt)
sys_apis(Ape.Volo.Entity/Permission/Apis.cs)保存全部受权限管控的接口清单,新增接口需登记后才能授权。
触发条件:在 Ape.Volo.Api/Controllers/**(命名空间 Ape.Volo.Api.Controllers,后台管理)新增或改动 HTTP Action(带 HttpGet/HttpPost/HttpPut/HttpDelete 等)时,必须同步在仓库根目录 webapi.txt 追加一条登记 SQL(文件缺失则新建,随代码一起提交)。
去重:追加前先检索 webapi.txt 与库中 sys_apis,同 url + method 已存在则不再重复追加。
字段推导(逐字段从控制器代码推导,不手填):
| SQL 字段 | 取值 |
|---|---|
method | Http 方法特性大写(GET/POST/PUT/DELETE…) |
url | 控制器级 [Route] 前缀 + Action 级 [Route] 拼接;例:控制器 [Route("/api/statistics")] + Action [Route("collectionPeople")] → /api/statistics/collectionPeople |
description | 优先取 Action 的 [Description("…")],否则取 XML <summary> 首句 |
group | 沿用 webapi.txt / 库中同 url 首段的既有 group;无先例时取 {控制器路由首段}_bk(如 /api/statistics → statistics_bk) |
id | 读 webapi.txt 现有记录最大 id 后递增:同批依次 max+1、max+2…;文件为空时首条基准取库内 sys_apis 当前 max(id)。禁止照抄固定基准,否则多次追加会撞主键 |
create_by / create_time / is_deleted | 恒为 'apevolo' / NOW() / 0 |
行格式(一行一条完整 INSERT,示意):
INSERT INTO `sys_apis`(`id`,`group`,`url`,`description`,`method`,`create_by`,`create_time`,`is_deleted`)
values(2035953193959034880+1,'statistics_bk','/api/statistics/collectionPeople','采集人数统计','POST','apevolo',NOW(),0);若某 Action 被删除或改了路由/方法,需同步删除/更新 webapi.txt 对应行,并在库中执行对应 UPDATE/DELETE,避免登记与实现漂移。
后端运行时可经 Claude Code 调用后端 MCP 工具 CreateApiAsync,直接把新接口登记进 sys_apis,权限立即生效,作为上述 webapi.txt 手工登记的补充:
- 连接:项目根
.mcp.json已声明fa-backend-mcp(type=http,url=http://localhost:8002/mcp,由Program.cs的AddMcpServer()+MapMcp("/mcp")提供)。需先dotnet run --project xxxx启动后端,Claude Code 载入该服务器后即可列出/调用工具(本机可在.claude/settings.local.json以enabledMcpjsonServers预批准)。 - 调用:登记 Everspry 后台 HTTP Action 时,按上表字段推导给出
group/url/description/method调用CreateApiAsync(内部走IApisService.CreateAsync写入sys_apis,id 雪花号自动生成)。 - 与 webapi.txt 关系:本流程不替代上文;新增/改动 Action 仍须向
webapi.txt追加登记 SQL。若CreateApiAsync已成功入库同一条接口,其后不要再执行 webapi.txt 中对应 SQL,避免重复登记。 - 去重/来源:工具对已存在
Url返回“已存在/重复”文本,不重复入库;MCP 写入记录create_by='mcp'(手工执行 webapi.txt SQL 为'apevolo'),可在sys_apis区分来源。 - 注意:
/mcp当前匿名可访问,CreateApiAsync可写sys_apis,仅限可信内网/开发环境使用。
MCP 配置(自动生成)
根目录 .mcp.json:
{
"mcpServers": {
"fa-backend-mcp": {
"type": "http",
"url": "http://localhost:8002/mcp"
}
}
}.claude/settings.local.json:
{
"enabledMcpjsonServers": [
"fa-backend-mcp"
]
}其他后台如何接入 MCP
以 ASP.NET Core 为例(这里只是自己的记录)。其他语言怎么实现,直接问大模型就有答案,这里略过。
常见问题
webapi.txt 和 MCP 会不会重复登记?
不会。MCP 工具对已存在的 Url 会返回“已存在/重复”提示,不再入库。若 CreateApiAsync 已成功写入同一条接口,就不要再执行 webapi.txt 中对应的 SQL。
主键(id)怎么避免冲突?
读 webapi.txt 现有记录的最大 id 后递增;文件为空时,首条以库内 sys_apis 当前的 max(id) 为基准。禁止照抄固定基准,否则多次追加会撞主键。
/mcp 直接暴露安全吗?
当前 /mcp 匿名可访问,且 CreateApiAsync 可以写入 sys_apis,因此仅限可信内网 / 开发环境使用;生产环境需要额外补上访问控制。
总结
这次收获也许不算特别大,但确实感受到了一点智能化的气息。
这里只是分享一下经验。
AI 已经可以在一系列复杂工作中(完成开发后新增 WebAPI、自动归档)识别出该调用哪个工具,并执行预先设计好的逻辑。
时代真的变了。