Developer45 min read
为 OpenClaw 构建自定义技能
简介
OpenClaw 的真正威力在于其可扩展性。如果说模型(Model)是大脑,那么技能(Skill)就是双手。尽管 ClawdHub 社区注册表已包含数百个开箱即用的技能,但您可能还需要与自有公司 API、数据库系统或本地化硬件集成。
本指南将带您使用 Node.js 构建一个名为"WeatherCheck"的技能,将其暴露给 OpenClaw Agent,并正确格式化模型上下文协议(MCP)。
1. 理解架构(MCP)
OpenClaw 支持 Anthropic 的开放标准:模型上下文协议(MCP)。这意味着您无需编写脆弱的自定义解析器。您只需构建一个标准的 JSON-RPC 服务器(或 HTTP SSE 流),并暴露以下内容:
- 资源(Resources): 资源(Resources):模型可以选择读取的静态上下文(例如:"公司 API 文档")。
- 工具(Tools): 工具(Tools):模型可以决定执行的动作(例如:"fetch_weather_by_city")。
2. 项目初始化
让我们使用官方 MCP SDK 创建一个新的 Node.js 包。
mkdir my-first-skill && cd my-first-skill
npm init -y
npm install @modelcontextprotocol/sdk3. 编写技能服务器
创建一个 index.js 文件。我们将定义一个使用 stdio 传输的 MCP 服务器(这是 OpenClaw 启动并与您的本地技能通信的最简单方式)。
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
// Initialize the standard MCP server
const server = new McpServer({
name: "WeatherCheck-Skill",
version: "1.0.0"
});
// Register a Tool that the AI can call
server.tool("get_weather",
"Fetch current weather for a specific city",
{
city: z.string().describe("The name of the city (e.g. London, Beijing)")
},
async ({ city }) => {
console.error(`Fetching hardware sensor or API for: ${city}`);
const mockTemp = Math.floor(Math.random() * 30);
return {
content: [{ type: "text", text: `The weather in ${city} is ${mockTemp}°C and Sunny.` }]
};
}
);
// Connect via standard I/O pipes
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("WeatherCheck Skill is running on stdio!");4. 在 OpenClaw 中注册技能
打开您的 ~/.openclaw/config.json(或根据版本为 skills.yml),告诉 OpenClaw 如何启动您的新 MCP 服务器。
{
"mcpServers": {
"weather_check": {
"command": "node",
"args": ["/absolute/path/to/my-first-skill/index.js"]
}
}
}5. 测试集成
重启您的 OpenClaw 守护进程,然后向 AI 提问:
嘿,今天在巴黎需要带伞吗?
如果配置正确,LLM 将在其上下文中看到 get_weather 工具,为'巴黎'生成 JSON 调用参数,您的 index.js 将返回模拟文本。LLM 随后会读取该文本并自然地回复您。
发布到 ClawdHub
当您的技能完善并经过测试后,打包您的代码库并向 Starmadebydata/clawdhub-registry 提交 Pull Request。社区采用从这里开始!更多详情,请参阅 官方发布指南。
$ cd ../* END_OF_FILE */