OpenClawをまだインストールしていませんか?ワンラインインストールコマンドはこちら
curl -fsSL https://openclaw.ai/install.sh | bash
iwr -useb https://openclaw.ai/install.ps1 | iex
curl -fsSL https://openclaw.ai/install.cmd -o install.cmd && install.cmd && del install.cmd
パソコンへの影響が心配ですか? ClawTank ならクラウド上で動作し、インストール不要で誤削除のリスクもありません
主要な知見
  • OpenClaw Skillsは、skill.md仕様を中心としたモジュール型能力拡張システムです。公式マーケットプレイスには現在100以上のSkillが登録されており、ブラウザ自動化、ファイルシステム操作、カレンダー連携、Shell実行など主要カテゴリを網羅しています。
  • skill.mdはYAMLフロントマターとMarkdown記述のハイブリッド形式を使用しています。capabilitiespermissionsinputsの3つのキーフィールドにより、OpenClawエージェントは実行前にSkillの境界を完全に理解できます。
  • BlogWatcherSupermemoryは、コミュニティで最も広く利用されている2つのSkillです。前者は定期的なウェブコンテンツ監視を担い、後者はセッションをまたぐ長期記憶のベクトルストレージを提供します。
  • 2026年2月、The Registerのレポートにより、コミュニティから投稿された一部のSkillがログ出力でAPIキーを漏洩していたことが明らかになりました。セキュリティチームは、入力バリデーションとキー管理の必須基準を確立すべきです。[4]
  • エンタープライズデプロイにおいては、承認ワークフローとバージョンピニングメカニズムを組み合わせたPrivate Skill Registryの構築が推奨されます。これにより、本番環境の安定性とコンプライアンスが確保されます。

2025年末に「オープンソース・スーパーエージェント」として登場して以来、OpenClawはニッチな開発者ツールから、エンタープライズグレードのAI自動化プラットフォームの有力候補へと急速に進化してきました。[5] その成功の鍵の一つが、柔軟性とセキュリティのバランスを取ったSkill拡張システムの設計です。これにより、あらゆる開発者がコアコードを変更することなく、標準化された方法でエージェントに機能を追加できます。[6]

本記事では、開発者の視点からOpenClaw Skillsのライフサイクル全体を詳細に分析します。skill.md仕様構文の理解、最初のカスタムSkillのステップバイステップ構築、人気公式Skillsの実装パターンの研究、Skillsマーケットプレイスへの安全な公開、そしてエンタープライズ環境でのプライベートSkillエコシステムの管理まで網羅します。社内チーム向けのカスタム自動化ツールを構築したいエンジニアにも、Skillsの商用化に関心のある独立開発者にも、すぐに活用できる技術知識を提供します。[1]

1. Skillsエコシステムの概要

1.1 OpenClaw Skillとは

OpenClawアーキテクチャにおいて、Skillは自己完結型の能力モジュールです。標準化されたインターフェースを通じて「何ができるか」と「それを実行するために必要なリソース」をエージェントに伝えます。ホストプログラムに特定のAPIをマウントする必要がある従来のプラグインシステムとは異なり、OpenClaw Skillsは宣言的な設計を採用しています。開発者がskill.mdファイルに人間が読める形式でSkillの能力を記述し、OpenClawコアエンジンがタスク計画時にこれらの記述を動的に読み取り、いつどのSkillを呼び出すかを判断します。[2]

この設計には2つの重要な利点があります。第一に、エージェントが実行前に各Skillの能力境界を理解できるため、試行錯誤的な呼び出しを回避できます。第二に、人間がskill.mdを直接読むことでSkillの動作を監査でき、コードのリバースエンジニアリングが不要です。これはエンタープライズのコンプライアンスレビューにおいて特に重要です。

各Skillはファイルシステム上で独立したディレクトリとして表現され、構造は以下の通りです。

my-skill/
├── skill.md          # Skill仕様(必須)
├── index.js          # メインロジックのエントリーポイント(必須)
├── package.json      # npm依存関係の宣言(任意)
├── tests/            # ユニットテストディレクトリ(推奨)
│   └── skill.test.js
└── README.md         # 追加ドキュメント(任意)

1.2 公式Skillsマーケットプレイスの現状

2026年2月時点で、OpenClaw公式Skillsマーケットプレイスには100以上のSkillが登録されており、公式コアチーム、認定パートナー、コミュニティ開発者によって提供されています。[3] 機能カテゴリ別の分布は以下の通りです。

また、新規Skillの月次成長率は上昇傾向にあり、コミュニティエコシステムの活力はOpenClawが競合と差別化する重要な要素となっています。

1.3 Skill呼び出しメカニズム

ユーザーがOpenClawにリクエストを送信すると、エージェントは以下のワークフローを実行します。まず、インストール済みの全Skillsのskill.mdファイルをスキャンして能力インデックスを構築し、次にタスクのセマンティクスに基づいて最適なSkillをマッチングし、必要な権限がユーザーによって承認されていることを確認した後、Skillのindex.jsロジックを実際に実行します。プロセス全体はユーザーにとってほぼ透過的ですが、このワークフローを理解することは、開発者が効果的なSkill記述を設計する上で極めて重要です。[9]

2. skill.md仕様の詳細

2.1 全体構造

skill.mdはYAMLフロントマターとMarkdown本文のハイブリッド形式を使用します。YAMLブロックには機械可読な構造化メタデータが含まれ、Markdown本文にはAIモデルと人間の開発者が読むための詳細な説明が記載されます。両方が不可欠です。YAMLはSkillの発見可能性と実行境界を決定し、Markdownはエージェントがいつ、どのようにSkillを使用するかを正しく理解できるかを決定します。[2]

以下は完全なskill.md構造の例です。

---
name: my-custom-skill
version: 1.2.0
description: "このSkillのコア機能の一行説明"
author: your-username
license: MIT

capabilities:
  - id: fetch-webpage
    description: "指定されたURLのコンテンツを取得する"
  - id: extract-text
    description: "HTMLからプレーンテキストの段落を抽出する"

permissions:
  network: true
  filesystem: false
  shell: false
  env:
    - MY_API_KEY

inputs:
  - name: url
    type: string
    required: true
    description: "対象ウェブページの完全なURL"
  - name: selector
    type: string
    required: false
    default: "body"
    description: "抽出範囲を指定するCSSセレクタ"

outputs:
  - name: text
    type: string
    description: "抽出されたプレーンテキストコンテンツ"
  - name: wordCount
    type: number
    description: "文字数統計"

tags:
  - browser
  - scraping
  - text-extraction

minOpenClawVersion: "2.1.0"
---

## Skill説明

このSkillは指定されたウェブページからテキストコンテンツを抽出するために使用されます。
ウェブ情報への素早いアクセス、コンテンツ分析、
またはデータパイプライン構築が必要なシナリオに適しています。

## 使用例

https://example.com の本文テキストを抽出して文字数をカウントしてください。

## 注意事項

- ログイン認証が必要なページには対応していません
- JavaScriptで動的にレンダリングされるコンテンツは完全に取得できない場合があります
- 対象ウェブサイトのrobots.txtルールを遵守してください

2.2 必須フィールドの解説

name:Skillの一意識別子で、ケバブケース形式(例:blog-watcher)を使用します。同一OpenClawインスタンス内で名前の重複は許可されません。マーケットプレイスに公開する場合、名前に著者のプレフィックスが付きます(例:@username/blog-watcher)。

version:セマンティックバージョニング仕様に従い、MAJOR.MINOR.PATCH形式です。メジャーバージョン変更は互換性を破壊するAPI変更を示し、マイナーバージョンは新機能、パッチバージョンはバグ修正を示します。

capabilitiesskill.mdで最も重要なフィールドであり、OpenClawエージェントが適切なタイミングでこのSkillを呼び出せるかどうかを直接決定します。各capabilityにはid(機械可読な識別子)とdescription(AI推論のための自然言語記述)が必要です。descriptionはできる限り具体的にし、「処理する」「管理する」などの曖昧な表現を避け、「指定されたチャンネルにSlackメッセージを送信する」のような動詞+目的語の構造を使用してください。

permissions:Skill実行に必要なシステムリソースへのアクセス権限を宣言します。OpenClawは最小権限の原則に従い、ここで宣言された権限のみが実行可能です。主な権限タイプは以下の通りです。

2.3 入出力仕様

inputsフィールドはSkillが受け付けるパラメータを定義し、各パラメータにはname(パラメータ名)、type(データ型:stringnumberbooleanarrayobject)、required(必須かどうか)、default(デフォルト値)、description(説明)が含まれます。明確なinputs定義により、エージェントは会話から自動的にパラメータを抽出でき、ユーザーが明示的にパラメータを指定する必要が減ります。

outputsフィールドはSkillが返すデータ構造を記述し、エージェントがマルチステップタスクを計画する際に、このSkillの出力を次のステップに正しく渡すことを可能にします。

2.4 バージョン互換性管理

minOpenClawVersionフィールドはSkillに必要なOpenClawの最小バージョンを指定します。新しいAPI機能を使用するSkillにとって特に重要です。ユーザーのOpenClawバージョンが要件を満たさない場合、ランタイムでサイレントに失敗するのではなく、インストール前に警告が表示されます。

3. 最初のカスタムSkillをゼロから構築する

3.1 環境の準備

開発を開始する前に、環境にOpenClaw 2.1.0以上およびNode.js 20.0.0以上がインストールされていることを確認してください。OpenClawはSkill開発を支援する公式CLIツールを提供しています。[9]

# OpenClaw CLIのインストール(未インストールの場合)
npm install -g @openclaw/cli

# バージョンの確認
openclaw --version

# インストール済みSkillの表示
openclaw skills list

3.2 Skillディレクトリの作成

本チュートリアルでは、「デイリー天気サマリー」Skill(daily-weather)を作成します。ユーザーが指定した都市の当日の天気情報を取得し、簡潔なサマリーを生成するSkillです。

# Skillディレクトリ構造を手動で作成
mkdir daily-weather && cd daily-weather

# 以下の構造を作成:
# daily-weather/
# ├── skill.md
# ├── index.js
# ├── package.json
# └── tests/
#     └── skill.test.js

3.3 skill.mdの記述

skill.mdファイルを開き、完全なSkill仕様を記入します。

---
name: daily-weather
version: 1.0.0
description: "指定された都市の当日の天気情報を取得し、人間が読みやすい天気サマリーレポートを生成する"
author: your-username
license: MIT

capabilities:
  - id: get-weather-summary
    description: "指定された都市の今日の天気状況(気温、湿度、降水確率、風速)を取得する"
  - id: format-weather-report
    description: "天気データを会話で直接報告できる自然言語サマリーにフォーマットする"

permissions:
  network: true
  filesystem: false
  shell: false
  env:
    - OPENWEATHER_API_KEY

inputs:
  - name: city
    type: string
    required: true
    description: "都市名。日本語または英語をサポート(例:'Taipei' または 'Tokyo')"
  - name: language
    type: string
    required: false
    default: "en"
    description: "サマリーの言語コード。デフォルトは英語"
  - name: units
    type: string
    required: false
    default: "metric"
    description: "温度単位:metric(摂氏)またはimperial(華氏)"

outputs:
  - name: summary
    type: string
    description: "天気サマリーテキスト。会話で直接表示に適しています"
  - name: rawData
    type: object
    description: "天気APIの生レスポンスデータ"
  - name: city
    type: string
    description: "APIが確認した標準化された都市名"

tags:
  - weather
  - data-fetching
  - productivity

minOpenClawVersion: "2.1.0"
---

## Skill説明

daily-weather Skillは世界の主要都市のリアルタイム天気情報を取得し、
技術的な気象データを自然言語のサマリーに変換して、
OpenClawの会話インターフェースで直接読めるようにします。

## 使用例

- 「今日の台北の天気は?」
- 「東京の今日の天気を調べて」
- 「シンガポールの現在の気温と湿度は?」

## 前提条件

`OPENWEATHER_API_KEY` 環境変数の設定が必要です。
無料のAPIキーは https://openweathermap.org/api で取得できます。

## 注意事項

- 天気データは10分ごとに更新されます
- 無料プランではAPI呼び出しが1分あたり60回に制限されています
- 一部の遠隔地の都市では正確なデータが利用できない場合があります

3.4 Skillロジックの実装

次に、index.jsでコアロジックを実装します。OpenClaw Skillのメインプログラムは、標準的な非同期実行関数をエクスポートする必要があります。

// index.js
import { SkillContext } from '@openclaw/skill-sdk';

/**
 * @param {Object} inputs - skill.mdで定義された入力パラメータ
 * @param {SkillContext} context - OpenClawが提供する実行コンテキスト
 * @returns {Promise<Object>} skill.mdのoutputs定義に準拠した返却オブジェクト
 */
export async function execute(inputs, context) {
const { city, language = 'en', units = 'metric' } = inputs;

// セキュアな環境変数からAPIキーを読み取る
// 注意:apiKeyの値をログに出力しないこと
const apiKey = context.env.get('OPENWEATHER_API_KEY');

if (!apiKey) {
throw new Error(
'Missing required environment variable OPENWEATHER_API_KEY. ' +
'Please add this environment variable to your OpenClaw configuration.'
);
}

context.log.info(`Querying weather for city: ${city}`);

const url = new URL('https://api.openweathermap.org/data/2.5/weather');
url.searchParams.set('q', city);
url.searchParams.set('appid', apiKey);
url.searchParams.set('units', units);
url.searchParams.set('lang', language === 'zh-TW' ? 'zh_tw' : 'en');

const response = await context.fetch(url.toString());

if (!response.ok) {
if (response.status === 404) {
throw new Error(`Could not find weather data for city "${city}". Please verify the city name is correct.`);
}
throw new Error(`Weather API request failed with status code: ${response.status}`);
}

const data = await response.json();

const tempUnit = units === 'metric' ? '°C' : '°F';
const summary = formatWeatherSummary(data, tempUnit, language);

return {
summary,
rawData: data,
city: data.name,
};
}

function formatWeatherSummary(data, tempUnit, language) {
const temp = Math.round(data.main.temp);
const feelsLike = Math.round(data.main.feels_like);
const humidity = data.main.humidity;
const description = data.weather[0].description;
const windSpeed = data.wind.speed;

if (language === 'zh-TW') {
return (
`${data.name} today: ${description}. ` +
`Temperature ${temp}${tempUnit}, feels like ${feelsLike}${tempUnit}, ` +
`humidity ${humidity}%, wind speed ${windSpeed} m/s.`
);
}

return (
`${data.name} today: ${description}. ` +
`Temperature ${temp}${tempUnit}, feels like ${feelsLike}${tempUnit}, ` +
`humidity ${humidity}%, wind speed ${windSpeed} m/s.`
);
}

3.5 ローカルテスト

OpenClawはSkillサンドボックステスト環境を提供しており、開発者は実際のエージェントワークフローに影響を与えることなくSkillの動作を検証できます。

# ユニットテストの実行
cd daily-weather && npm test

# Skillの要件準備状況を確認
openclaw skills check

テストに合格したことを確認したら、ローカルのOpenClawインスタンスにSkillをインストールして統合テストを行います。

# plugins installでローカルSkillをインストール
openclaw plugins install ./daily-weather

# OpenClawの会話でテスト
# 入力: 「今日の台北の天気は?」

4. 人気公式Skillsの詳細分析

4.1 ブラウザ自動化Skill

ブラウザ自動化SkillはOpenClaw Skillsマーケットプレイスで最もダウンロード数の多いカテゴリです。コアSkillである@openclaw/browserはPlaywrightをベースに構築されており、完全なヘッドレスブラウザ制御機能を提供します。[1]

そのskill.mdは以下の主要なcapabilitiesを宣言しています。

注目すべき点として、Browser Skillはデフォルトで各タスク完了後にCookieとセッションデータをクリアします。マルチステップタスクでログイン状態を維持する必要がある場合は、呼び出し時にpersistSession: trueパラメータを渡し、関連するセキュリティへの影響を十分に理解した上で使用してください。

4.2 BlogWatcher Skill

BlogWatcher(@openclaw/blog-watcher)は、OpenClawコミュニティで最も人気のあるモニタリングSkillの一つです。指定されたウェブサイトやRSSソースの新着コンテンツを定期的に追跡し、新しい記事が公開された際に通知やフォローアップアクションをトリガーするよう設計されています。

BlogWatcherの技術的なハイライトは、Scheduled Skill(定時実行)とEvent Emission(イベント発行)の2つの高度なパターンを組み合わせている点です。skill.mdの主要セクションは以下の通りです。

capabilities:
  - id: watch-blog
    description: "指定されたブログまたはRSSソースを監視し、新しい記事が公開された際に通知をトリガーする"
  - id: list-watched-sources
    description: "現在監視中のすべてのソースとその最終チェック時刻を一覧表示する"
  - id: unwatch-source
    description: "指定されたソースの監視を停止する"
  - id: get-latest-posts
    description: "指定されたソースから最新の記事リストを即座に取得する"

schedule:
  type: interval
  intervalMinutes: 30
  capability: check-for-updates

events:
  - id: new-post-detected
    description: "監視中のソースに新しい記事が公開された際に発行される"
    payload:
      - name: sourceUrl
        type: string
      - name: postTitle
        type: string
      - name: postUrl
        type: string
      - name: publishedAt
        type: string

BlogWatcherの典型的なユースケースには、競合のアクティビティ追跡、研究分野のプレプリント監視、テックブログの更新通知、新着コンテンツを自動的に要約してSlackチャンネルにプッシュすることなどが含まれます。

4.3 Supermemory Skill

Supermemory(@openclaw/supermemory)は、AIエージェントの最も基本的な制約の一つであるコンテキストウィンドウの有限性に対処します。ベクトルデータベースを通じてOpenClawにセッションをまたぐ長期記憶機能を提供し、エージェントが過去のインタラクションからユーザーの好み、完了したタスク、学習した情報を「記憶」できるようにします。[1]

SupermemoryのCapabilities設計は非常にきめ細かいものです。

技術的な実装面では、Supermemoryはローカルの埋め込みモデル(デフォルトはnomic-embed-text)を使用してメモリコンテンツをベクトル化し、OpenClawデータディレクトリ内のSQLite+ベクトルインデックスに保存します。これにより、すべてのメモリデータがローカルに保持され、外部サービスにアップロードされることはありません。

4.4 メッセージ送信Skills

OpenClaw Skillsマーケットプレイスには重要なSkillサブカテゴリがあります。メッセージ送信Skillsで、エージェントがユーザーに代わってクロスプラットフォームで通知やメッセージを送信できるようにします。主なSkillは以下の通りです。

@openclaw/send-slack:Slackチャンネルまたはダイレクトメッセージへの送信をサポートし、Block Kitフォーマットの構造化コンテンツにも対応します。そのcapabilityは「指定されたワークスペースのチャンネルまたはユーザーにSlackメッセージを送信する」と宣言されています。

@openclaw/send-email:SMTPまたはSendGrid APIと統合し、プレーンテキストまたはHTML形式のメール送信が可能です。

@openclaw/send-telegram:Telegram Bot APIを通じて個人またはグループにメッセージを送信します。

@openclaw/send-discord:Discord WebhookとBot APIの両方の送信モードをサポートします。

すべてのメッセージ送信Skillsは、skill.mdで明示的にrequiresUserConfirmation: trueを宣言しており、エージェントは実際に送信する前にユーザーに確認する必要があります。これにより、誤った大量メッセージ送信を防止します。

4.5 Shell実行Skill

@openclaw/shellは強力ながら慎重に使用すべきシステム実行Skillで、制御された環境でエージェントがShellコマンドを実行することを可能にします。このSkillのpermissions.shell: true宣言が昇格されたシステムアクセスを付与するため、OpenClawはインストール時に追加のセキュリティ警告を表示し、ユーザーの明示的な確認を要求します。[7]

Shell Skillはホワイトリストメカニズムにより実行可能なコマンドカテゴリを制限しています。デフォルトで許可されるコマンドには、lscatgrepfindgitnpmpython3などの一般的な開発ツールが含まれます。一方、rm -rfsudo、ネットワーク設定コマンドなどの高リスクコマンドは、デフォルト設定でブロックされています。

5. 高度なSkill開発パターン

5.1 ステートフルSkills

ほとんどのSkillはステートレスです。各実行は独立しており、前回の呼び出しのデータを保持しません。しかし、特定のシナリオではSkillが複数回の呼び出しにまたがって状態を維持する必要があります。例えばBlogWatcherは、更新があるかどうかを判断するために「前回のチェック時の最新記事」を記録する必要があります。

OpenClaw Skill SDKは、安全な状態永続化のためのcontext.state APIを提供しています。

export async function execute(inputs, context) {
// 以前に保存した状態を読み取る
const prevState = await context.state.get('lastCheck') || {
lastPostId: null,
lastCheckedAt: null,
};

// ロジックを実行...
const latestPosts = await fetchLatestPosts(inputs.sourceUrl);
const newPosts = latestPosts.filter(
post => post.id !== prevState.lastPostId
);

// 状態を更新(暗号化ストレージに自動永続化)
await context.state.set('lastCheck', {
lastPostId: latestPosts[0]?.id,
lastCheckedAt: new Date().toISOString(),
});

return { newPosts };
}

状態データはOpenClawの暗号化データディレクトリに保存され、Skill名にバインドされ、セッション間で永続化されます。

5.2 Skill間通信

高度な応用シナリオでは、あるSkillが別のSkillのcapabilityを呼び出す必要がある場合があります。OpenClawはSkill間の連携のためにcontext.skills.invoke APIを提供しています。

export async function execute(inputs, context) {
// ブラウザSkillを使用してページコンテンツを抽出
const pageContent = await context.skills.invoke(
'@openclaw/browser',
'extract-content',
{ url: inputs.targetUrl, selector: 'article' }
);

// SupermemorySkillを使用して抽出した情報を保存
await context.skills.invoke(
'@openclaw/supermemory',
'remember-fact',
{
content: pageContent.text,
tags: ['web-research', inputs.topic],
}
);

return { status: 'saved', contentLength: pageContent.text.length };
}

依存関係はskill.mdで宣言する必要があり、メインSkillのインストール時にユーザーにプロンプトが表示されます。

dependencies:
  skills:
    - name: "@openclaw/browser"
      minVersion: "3.0.0"
    - name: "@openclaw/supermemory"
      minVersion: "2.0.0"

5.3 スケジュール実行Skills

BlogWatcherに代表されるスケジュール実行パターンにより、ユーザーが手動で開始することなくSkillをバックグラウンドで定期的に実行できます。skill.mdでスケジュール設定を宣言します。

schedule:
  type: cron
  expression: "0 9 * * 1-5"  # 平日毎朝9時
  capability: generate-daily-report
  timezone: "Asia/Taipei"

スケジュールSkillはOpenClawのバックグラウンドデーモンプロセスで実行されます。ユーザーが会話ウィンドウを開いていなくても、Skillは指定された時刻に自動的に実行されます。実行結果は通知キューに保存され、ユーザーが次にOpenClawを開いた際に表示されます。

5.4 非同期長時間タスクSkills

Skillの実行に30秒以上かかるタスクの場合は、非同期長時間タスクパターンを採用して会話インターフェースのブロッキングを回避すべきです。

export async function execute(inputs, context) {
// 長時間タスクモードとしてマーク
context.setLongRunning(true);

// タスクが開始されたことをユーザーに知らせる初期確認を返す
context.sendProgressUpdate('Processing started, estimated 2-5 minutes...');

// 長時間タスクの実行
const result = await processLargeDataset(inputs.dataPath, {
onProgress: (percent) => {
context.sendProgressUpdate(`Processing progress: ${percent}%`);
}
});

return { result, completedAt: new Date().toISOString() };
}

6. Skillsマーケットプレイス公開プロセス

6.1 公開前の準備

Skillsマーケットプレイスにスキルを提出する前に、開発者は以下のチェックリストを完了する必要があります。[3]

6.2 パッケージングと提出

OpenClaw CLIを使用してSkillをパッケージングし、レビューに提出します。

# Skillディレクトリでtarballにパッケージ
npm pack

# daily-weather-1.0.0.tgzアーカイブが生成されます

# セキュリティ監査の実行
openclaw security audit

# npm経由で公開(認証済みnpmアカウントが必要)
npm publish --access public

openclaw security auditはローカルセキュリティスキャンを実行し、設定ファイルの権限が正しいか、既知のセキュリティ脆弱性が存在するか、package.jsonの依存関係に既知の脆弱性がないかを重点的にチェックします。

6.3 レビュープロセス

提出後、Skillは通常3〜7営業日を要するOpenClaw公式レビュープロセスに入ります。

  1. 自動スキャン(即時):セキュリティ脆弱性、悪意のあるコード、依存関係のコンプライアンス
  2. 手動レビュー(1〜3日):Skill機能説明の正確性、ユーザーエクスペリエンス評価
  3. サンドボックステスト(1〜2日):隔離されたテスト環境でSkillを実際に実行し、動作が宣言と一致することを確認
  4. 掲載または却下:レビューに合格すればマーケットプレイスに公開。問題が見つかった場合は詳細な説明とともに開発者に返却

6.4 バージョン更新メカニズム

公開済みSkillのバージョン更新は以下のルールに従います。パッチバージョン(PATCH)更新は再レビュー不要で直接公開可能です。マイナーバージョン(MINOR)更新は自動スキャンに合格後に公開されます。ブレーキングAPIの変更を伴うメジャーバージョン(MAJOR)更新は完全な再レビューが必要で、旧バージョンはマーケットプレイスで「非推奨」とマークされますが、ユーザーの移行期間として90日間保持されます。

# パッチバージョン更新の公開
npm version patch
npm publish

# メジャーバージョン更新の公開(skill.mdのバージョン番号も更新すること)
npm version major
npm publish

7. セキュリティレビューとベストプラクティス

7.1 APIキー漏洩リスク

2026年2月、The Registerが深刻なセキュリティ問題を報道しました。Skillsマーケットプレイスにリストされた一部のコミュニティSkillが、実行ログにAPIキーを平文で出力しており、OpenClawログファイルにアクセスできる人であれば容易に取得可能な状態でした。[4] この問題は、Skill開発者におけるセキュリティ意識の広範な欠如を露呈しました。

CrowdStrikeのセキュリティ研究レポートはさらに、一部の悪意あるSkillがログやエラーメッセージに環境変数の値を埋め込むことで、APIキーを攻撃者が制御するサーバーに流出させていたことを明らかにしました。[7] Ciscoの研究でも、パーソナルAIエージェントシステムのAPIキーへの依存が、高価値な攻撃対象にしていることが強調されました。[10]

以下は、漏洩を引き起こす典型的なアンチパターンです。開発者は必ず回避してください。

// 危険:絶対にこうしないこと
export async function execute(inputs, context) {
const apiKey = context.env.get('MY_API_KEY');

// 間違い1:ログにキーを出力する
context.log.info(`Using API key: ${apiKey}`);

// 間違い2:エラーメッセージにキーを含める
throw new Error(`API call failed, key ${apiKey} is invalid`);

// 間違い3:返却値にキーを含める
return { status: 'ok', usedKey: apiKey };
}

キーの正しい取り扱い方法:

// 安全:正しいAPIキーの取り扱い
export async function execute(inputs, context) {
const apiKey = context.env.get('MY_API_KEY');

if (!apiKey) {
// エラーメッセージは「欠落」のみ記載し、キー情報は一切公開しない
throw new Error('Missing required environment variable MY_API_KEY');
}

// デバッグ用にキーの先頭4文字のみをログに記録
const keyPrefix = apiKey.substring(0, 4) + '****';
context.log.info(`Using API key: ${keyPrefix}`);

// 使用時は直接渡し、表示可能な場所には一切保存しない
const result = await callExternalAPI(inputs.data, apiKey);

// 返却値にキーを絶対に含めない
return { status: 'ok', result };
}

7.2 入力バリデーション

skill.mdが入力の型と必須フィールドを定義していますが、開発者はフレームワークの自動バリデーションに頼るべきではありません。代わりに、index.jsでプロアクティブな入力バリデーションを実装し、インジェクション攻撃と予期しない動作を防止してください。

export async function execute(inputs, context) {
// URL形式を明示的に検証
let targetUrl;
try {
targetUrl = new URL(inputs.url);
} catch {
throw new Error('Invalid URL format. Please provide a complete URL starting with https://');
}

// HTTPSのみに制限
if (targetUrl.protocol !== 'https:') {
throw new Error('For security reasons, only HTTPS protocol URLs are supported');
}

// 文字列長を検証して過大な入力を防止
if (inputs.query && inputs.query.length > 1000) {
throw new Error('Query string too long. Maximum 1000 characters supported');
}

// 実行を続行...
}

7.3 サンドボックスの限界を理解する

OpenClawのSkillサンドボックスは完全に隔離されたコンテナ環境ではなく、Node.jsモジュールシステムに基づくソフトな隔離です。つまり、悪意のあるSkillが理論的には一部のシステムリソースにアクセスできる可能性があります。サードパーティSkillを評価する際、開発者は以下を優先すべきです。公式レビューに合格したSkill、完全なオープンソースコードを持つSkill、GitHubでアクティブなメンテナンス記録があるSkill、インストール数が1,000を超え好意的なレビューのあるSkillです。[7]

7.4 最小権限の原則

Skill開発者は最小権限の原則を厳格に遵守し、Skillが本当に必要とする権限のみを宣言すべきです。

8. エンタープライズ内部Skill管理

8.1 Private Skill Registry

エンタープライズ環境では、従業員がパブリックマーケットプレイスから任意のSkillをインストールすることはセキュリティとコンプライアンスのリスクをもたらします。npmプライベートレジストリ(VerdaccioやGitHub Packagesなど)をバックエンドとして使用するPrivate Skill Registryの構築が推奨されます。[8]

# エンタープライズOpenClaw設定でプライベートレジストリを指定
# openclaw.config.json
{
"skillRegistry": {
"primary": "https://skills.internal.company.com",
"fallback": null,
"allowPublicMarketplace": false
},
"skillApproval": {
"required": true,
"approvers": ["[email protected]"]
}
}

allowPublicMarketplacefalseに設定することで、すべてのSkillsインストールリクエストがプライベートレジストリを対象とするようになり、従業員が未レビューのパブリックSkillをインストールすることを効果的に防止します。

8.2 エンタープライズSkill承認ワークフロー

標準化されたSkill承認プロセスを確立し、エンタープライズ環境に入るすべてのSkillがセキュリティ評価を受けるようにします。

  1. 申請フェーズ:従業員がSkillインストールリクエストを提出し、ビジネス要件とSkillのソースを説明する
  2. セキュリティスキャンopenclaw skills auditを自動実行し、スキャンレポートを生成する
  3. コードレビュー:セキュリティチームがSkillのskill.mdindex.jsをレビューし、権限宣言と外部呼び出しに焦点を当てる
  4. サンドボックステスト:隔離されたテスト環境でSkillを実際に実行し、動作が説明と一致することを確認する
  5. プライベートレジストリへの公開:レビュー承認後、Skillのバージョンをピニングしてエンタープライズプライベートレジストリに公開する
  6. 定期的な再レビュー:承認済みSkillのセキュリティ再レビューを四半期ごとに実施する

8.3 バージョン管理と依存関係管理

エンタープライズの本番環境では、上流の更新が予期しない動作を導入することを防ぐためにSkillバージョンをピニングすべきです。

# エンタープライズSkillピニング設定
# skills.lock.json(バージョン管理下に置くべき)
{
"@openclaw/browser": {
"version": "3.2.1",
"integrity": "sha512-abc123...",
"approvedAt": "2026-01-15",
"approvedBy": "security-team"
},
"@company/internal-crm-skill": {
"version": "2.0.0",
"integrity": "sha512-def456...",
"approvedAt": "2026-02-01",
"approvedBy": "it-team"
}
}

8.4 社内Skill開発基準

企業内部で開発されたカスタムSkillについては、以下の開発基準が推奨されます。

9. よくある開発上の問題とトラブルシューティング

9.1 Skillがエージェントに正しく呼び出されない

最も一般的な問題の一つは、Skillの実装を完了した後、関連するタスクに対してエージェントが自動的にSkillを呼び出さないというものです。根本原因は通常、skill.mdcapabilities.descriptionが十分に具体的でないか、ユーザーの実際の表現と大きく異なっていることにあります。

トラブルシューティングの方法:

# Skillの準備状況を確認
openclaw skills check

# 特定のSkillの詳細情報を表示
openclaw skills info daily-weather

マッチングスコアが低い(0.6未満の)場合は、capability descriptionの修正を試みてください。ユーザーの自然言語に近い表現を使用し、具体的な動詞(「取得する」「検索する」「抽出する」)と目的語(「天気情報」「気温データ」)を含めてください。

9.2 環境変数の読み取り失敗

Skillがskill.mdpermissions.envで環境変数を宣言しているにもかかわらず、ランタイムでcontext.env.get()undefinedを返す場合があります。一般的な原因:

# Skillの要件状況を確認
openclaw skills check

# 特定のSkillの詳細と要件を表示
openclaw skills info daily-weather

9.3 ネットワークリクエストのブロック

Skillがnetwork: trueを宣言しているにもかかわらず、送信ネットワークリクエストがOpenClawによってインターセプトされる場合があります。考えられる原因:

# Skillではcontext.fetchを正しく使用する(グローバルfetchではない)
// 間違い:グローバルfetchを直接使用、セキュリティチェックをバイパスする可能性
const response = await fetch(url);

// 正しい:context.fetchを使用してセキュリティインターセプトを確実に有効化
const response = await context.fetch(url);

9.4 Skill実行タイムアウト

OpenClawのデフォルトのSkill実行タイムアウトは30秒です。Skillがより多くの時間を必要とする場合は、skill.mdで明示的に宣言すべきです。

execution:
  timeout: 120        # 秒単位、最大許容値は600
  longRunning: true   # 長時間タスクとしてマーク、進行状況報告メカニズムを有効化

9.5 Skill状態の破損

ステートフルSkillは異常終了後に不整合な状態データを残す可能性があり、後続の実行が失敗する原因となります。防御的な状態読み取りの実装が推奨されます。

export async function execute(inputs, context) {
let state;
try {
state = await context.state.get('myState');
// 状態データ構造の整合性を検証
if (!state || typeof state.lastId !== 'string') {
context.log.warn('State data format is incorrect, resetting to initial values');
state = getInitialState();
}
} catch (error) {
context.log.error('Unable to read state, resetting to initial values', error.message);
state = getInitialState();
}

// 実行を続行...
}

function getInitialState() {
return { lastId: null, lastCheckedAt: null };
}

9.6 パフォーマンス分析

Skillの実行速度が遅い場合は、OpenClawのパフォーマンス分析ツールを使用してボトルネックを特定します。

# Gatewayログを表示してSkill実行を追跡
openclaw logs --follow

一般的なパフォーマンスの問題には、ループ内でシリアルにAPIリクエストを行うこと(Promise.allを使用して並列実行すべき)、繰り返しの外部リクエストをキャッシュしていないこと、状態の読み書きが頻繁すぎること(状態更新をバッチ化すべき)などがあります。

まとめ:信頼できるSkillsエコシステムの構築

OpenClaw Skillsシステムは、AIエージェントの能力を拡張する新しいパラダイムを代表するものです。従来のプラグインAPIの代わりに宣言的なskill.md仕様を使用することで、Skillの能力境界を人間とマシンの双方が明確に読み取れるようにしています。この設計は開発の障壁を下げるだけでなく、セキュリティレビューへの明確なエントリーポイントも提供します。[1]

しかし、The Registerが明らかにしたAPIキー漏洩の事例は、技術設計の善意だけでは不十分であり、厳格な開発者セキュリティ教育とマーケットプレイスレビューメカニズムで補完する必要があることを示しています。[4] 個人開発者であれ、エンタープライズのエンジニアリングチームであれ、セキュリティはSkill開発における最優先事項であるべきで、後付けで考えるものではありません。

OpenClaw Skillsマーケットプレイスが拡大を続け、BlogWatcherやSupermemoryなどのコアSkillが成熟し、エンタープライズのプライベートSkillエコシステムが徐々に確立されていく中、私たちはSkillを原子単位としたエージェント能力マーケットプレイスの形成を目の当たりにしています。このSkill開発パラダイムを理解し習得することは、2026年のAIエージェントエンジニアにとってコアコンピテンシーとなるでしょう。