目录

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 Action 后,有两条登记通道。通道 A 由 Claude.md 策略生成登记 SQL 写入 webapi.txt,再手工执行;通道 B 由 MCP 工具 CreateApiAsync 直接写入。两条通道最终都落到 sys_apis 接口权限表。新增 / 改动 WebAPI Action通道 A通道 BClaude.md 策略生成登记 SQL → webapi.txt手工执行 SQLMCP CreateApiAsync工具直接写入(雪花号自动生成)sys_apis 接口权限表来源:本文实践整理
双通道二选一;CreateApiAsync 成功入库后,不再执行 webapi.txt 中对应 SQL。
策略一:Claude.md 自动生成 webapi.txt 归档

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 字段取值
methodHttp 方法特性大写(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,避免登记与实现漂移。

策略二:MCP 自动登记(CreateApiAsync,双通道补充)

后端运行时可经 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、自动归档)识别出该调用哪个工具,并执行预先设计好的逻辑。

时代真的变了。