はじめに
OpenClaw の真の力はその拡張性にあります。モデルが脳であるとすれば、スキルは手です。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)を開き、新しい MCP サーバーの起動方法を OpenClaw に伝えます。
{
"mcpServers": {
"weather_check": {
"command": "node",
"args": ["/absolute/path/to/my-first-skill/index.js"]
}
}
}5. 統合のテスト
OpenClaw デーモンを再起動し、AI に質問してみましょう:
ねえ、今日パリでは傘が必要ですか?
正しく設定されていれば、LLM はコンテキスト内の get_weather ツールを認識し、「パリ」の JSON 呼び出し引数を生成します。すると index.js がモックテキストを返し、LLM はそのテキストを読んで自然に返答します。
スキルとは実際には何か
言葉の印象より単純です。スキルとは、必須のfrontmatterが2つあるMarkdownファイルで、いつ動くべきか、何をするかをモデルに伝えるものです。学ぶべきプラグインAPIも、コンパイルするものもありません。
| フィールド | 必須 | 役割 |
|---|---|---|
| name | はい | 小文字・数字・ハイフン。フォルダ名ではなくこれがスキルの識別子です。 |
| description | はい | 160文字未満の1行。モデルはこのスキルが関係あるかを判断する際にこれを読みます。 |
| user-invocable | いいえ | スラッシュコマンドとして出すかどうか。既定はtrueです。 |
| disable-model-invocation | いいえ | システムプロンプトから外し、手動でのみ起動できるようにします。 |
| homepage | いいえ | スキル探索時に表示されます。 |
descriptionはファイル内の他のどの部分よりも重要な働きをします。モデルがそのスキルを使うか判断するときに見える唯一の部分だからです。「git logからリリースノートを生成する」は使われ、「リリースノート補助」は使われません。タイトルではなく「いつ使うべきか」への答えとして書いてください。
書いて、読み込ませる
全体で4つのコマンドです。人が躓くのは最後だけです。スキルはセッション開始時に読み込まれるため、進行中の会話は今書いたファイルを認識しません。
mkdir -p ~/.openclaw/workspace/skills/hello-world cd ~/.openclaw/workspace/skills/hello-world
入れ子は自由です。`personal/my-skill/SKILL.md` でもトップレベルでも同じです。識別子はパスではなくfrontmatterに由来します。
cat > SKILL.md <<'MD' --- name: hello-world description: A simple skill that prints a greeting. --- # Hello World When the user asks for a greeting, use the `exec` tool to run: ```bash echo "Hello from your custom skill!" ``` MD
本文はモデル宛のMarkdownです。まず発動条件、次に手順を書いてください。「何をするか」だけで「いつするか」がないスキルは使われないままになります。
# Skills are picked up on a fresh session, not live. # In a chat, start one with: /new # # Or test it from the shell: openclaw agent --message "give me a greeting"
ここが見落とされる手順です。ゲートウェイはファイルを監視していますが、進行中のセッションは既にプロンプトを組み立て終えています。可視化するのは `/new` です。
# Invoke it directly by name instead of hoping it gets chosen: # /skill hello-world
`/skill hello-world` は動くのに自然文だと動かないなら、スキル自体は正常でdescriptionが問題です。この切り分けで無駄な推測を大幅に減らせます。
他人のスキルを入れ、自分のを公開する
ClawHubが公開レジストリです。2つの異なるツールが関わり、混同が最初の躓きになります。`openclaw skills` は検索と導入を担い、公開のような認証付き操作は別途 `clawhub` CLIが担当します。
npm i -g clawhub clawhub login
公開にはアカウントが必要なため、エージェントのCLIではなく独立したツールになっています。`openclaw skills` にpublishサブコマンドは無く、探すのはよくある行き止まりです。
clawhub skill publish ./my-skill --slug my-skill
パスはSKILL.mdを含むフォルダです。`--slug`、`--version`、`--changelog`、`--tags` が使えます。レジストリはバージョン、ダウンロード数、セキュリティスキャンの要約を記録します。
openclaw skills search "calendar" openclaw skills install @openclaw/demo openclaw skills update --all
これらは現在のワークスペースに入り、取得元を記録します。記録があるからこそ、後で `skills update --all` が意味のある動作をできます。
他人が書いたスキルを入れる前に
- ✗スキルは、コマンドを実行できるエージェントへの指示書です。シェルスクリプトをbashにパイプする前に読むのと同じように、導入前にSKILL.mdを読んでください。
- ✗レジストリはセキュリティスキャンの要約を表示します。それは指標であって保証ではなく、その指示が自分の環境にとって妥当かどうかは何も語っていません。
- ✗スキルはツールポリシーを継承します。スキルが実行を指示しても tools.allow と tools.deny の範囲内です。何かを入れる前に整えるべきなのはこの層です。
- ✗発動しないスキルは、ほぼ常に読み込みではなくdescriptionの問題です。まず /skill で試せば切り分けられます。
ClawdHub への公開
スキルが完成してテストが完了したら、リポジトリをパッケージ化し、Starmadebydata/clawdhub-registry にプルリクエストを送信してください。コミュニティへの採用はここから始まります!詳細については 公式パブリッシュガイドライン。