夜雨聆风学习资料网

ARTICLE · 1173095

基于openclaw实现自定义mcp/skill(终结篇)

基于openclaw实现自定义mcp/skill(终结篇)

先不经过 OpenClaw 裸测一下 STDIO 是否正常:

cmd执行:

echo {"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}} | java -jar target\recharge-risk-demo-1.0.0.jar

通了。6 个工具都出来了(妫€娴嬫伓鎰忓厖鍊� 这种乱码只是 cmd 的 GBK 编码显示问题,OpenClaw 走 STDIO 是 UTF-8,不影响)。

恢复脏数据(把之前封号处理的用户状态恢复至正常,看看openclaw会不会再把他封了)

恢复前状态:

数据恢复至:

正式使用openclaw

由于本次测试使用的模型质量一般,所以对话给出的指令需要详细一下,正常情况只需简单给出指令即可

空转循环:

这个现象很典型:MCP 没连上,qwen2.5:7b 在空转瞎调 tool_search,7 次全失败。不是你口令的问题。

模型太小了读不到skill,要么先把skill喂给它要么换好模型,或者关掉 lean 模式(后续有机会了试试)

换模型:openai的gpt4o:

还报错:

你切到 gpt-4o 后,Gateway 给这个模型默认分配了 codex 这个 Runtime,但你根本没装这个插件,所以连 Agent 都起不来,更没机会调 detectRisk。

修法:给 gpt-4o 指定用 openclaw 这个 Runtime

  1. 给 gpt-4o 加 agentRuntime: openclaw,顺手把 localModelLean 关了,不然 4o 也会被 lean 坑

    再次重启gateway

    网关又异常了,自己跟着ai重新清了一遍重新打开后,检查mcp是否通:

    注意科学上网不然大模型跑不通,毕竟用了gpt 还是llm超时,原因是本机浏览器访问外网和openclaw请求外网逻辑不一样

    改用其他模型吧

    找一个兼容某公司的接口即可不必严格某公司,比如我这种就可以,模型已经正常了:

    但是模型还是读不到那六个工具

    发现代码有问题:

    做了什么(RechargeMcpServer.java):

    • 修了 initialize:以前错回成 tools/call 格式的 content,现在正确返回 protocolVersion + capabilities.tools + serverInfo,这就是 probe 报的那三个 invalid_type 缺的字段。
    • 加了 notifications/initialized:直接回空对象,不再报 unknown method。
    • 补了每个 tool 的 inputSchema.properties:避免严格客户端拒掉空 schema。
    openclaw mcp probe recharge-riskopenclaw mcp reload

    两个命令检测一下:欧了

    再试试:

    成了!!

    让openclaw进行封禁操作后数据库的结果不符合预期,很明显就剩下操作数据库的代码问题了,解决如下:(这些其实都不用管让ai写就行了)

    1. mcp/RechargeMcpServer.java
       — tools/list 补全 schema:  
      • banUser
         声明 user_id(必填)+ reason,restrictBonus / getAccountStatus 声明 user_id(必填),detectRisk 等无参工具保持空。这样模型不会再空参调用。
      • tools/call
         加校验:user_id 为空直接抛 requires user_id 错误返回,不再写入空 user 的脏数据。
    2. dao/AccountStatusDao.java
       — 封禁逻辑补齐:
      • UPSERT 改为写入 ban_until + updated_at,banned 时 ban_until = 现在+7天,其他状态置 NULL。之前 ban_until 永远 NULL,7 天封禁没落地。

    恢复数据库:

    又成了!!!

    数据库中也完美修改:

    相关学习资料