こんにちは!タイミーでバックエンドエンジニアとして働いている福井 (bary822) です。
皆さんは「Claude Code の Skills を社内の Cursor ユーザーも使えるようにしたい」と思ったことはないでしょうか?
Claude Code には Claude Plugin という仕組みがあり、社内で共有したい Skills を簡単に配布できます。しかし、Cursor には Claude Plugin に相当する機能がなく、さらに Claude Code の Skills は独自の構文をサポートしているため、そのままでは動作しません。
この記事では、Claude Plugin 形式で配布している Skills を Cursor でも利用できるようにした取り組みについてご紹介します。
背景
タイミーでは、社内の開発ガイドラインに沿った開発を行いやすくすることを目的に、Claude Code の Skills を整備し、Claude Plugin 経由で配布しています。
Claude Code の Skills はエージェントに対してタスク実行時のコンテキストや手順を提供する機能です。この機能はもともと Claude Code 独自のものでしたが、現在では Agent Skills としてファイル名やディレクトリ構成、メタデータの種類などのオープンスタンダードが確立されつつあり、さまざまなAIプラットフォームで再利用できるようになっています。
Skills for organizations, partners, the ecosystem | Claude
課題: Claude Plugin で配布している Skills を Cursor で使えない
Agent Skills の仕様自体は標準化が進んでいますが、配布の仕組みやサポートされる構文にはプラットフォーム間で差分があります。
配布の仕組みの差分
Claude Code には Plugin という仕組みがあり、Skills のインストール・アップデートを簡単に行えます。一方、Cursor には同等の配布機構がサポートされていません。
構文の差分
Claude Code の Skills には、Cursor でサポートされていない独自構文がいくつかあります。
!command構文:SKILL.md内で許可されたシェルコマンドを実行する構文。たとえば!gh api ...と書くことで GitHub API 経由でドキュメントを動的に取得できる。Cursor ではサポートされていない$ARGUMENTS変数: スキル実行時にユーザーが渡す引数を受け取るための変数。こちらもCursor ではサポートされていない
つまり、Claude Plugin で配布している Skills をそのまま Cursor に持ってきても、動的なコンテンツ取得ができず引数も渡せないため、まともに動作しない状態でした。
Cursor ユーザーにも同じ体験を提供するために、これらの構文を Cursor が理解できる形式に変換し、適切なディレクトリに配置する必要がありました。
解決策:変換スクリプトの作成
Claude Plugin 形式の Skills を Cursor 互換形式に変換するシェルスクリプト build-cursor-skills.sh を作成しました。
このスクリプトは以下の変換を行います。
- 動的コンテンツの埋め込み:
!command構文で動的に取得していたコンテンツを、ローカルのファイルから読み取ってテキストとして直接SKILL.mdに埋め込む - 変数の変換:
$ARGUMENTSを「ユーザーの指示に従って」という固定テキストに置換する - 補助ファイルのコピー: Skills が参照する補助ファイル(
intro.md,workflow.md,troubleshooting.mdなど)もコピーする
変換後の Skills を構成する各種ファイルは、ユーザー領域( ~/.cursor/skills/ )に配置されるようにしました。Cursor はこのディレクトリを自動的に走査するため、配置するだけで Skills が利用可能になります。
# Skills を管理するリポジトリで実行するだけ ./scripts/build-cursor-skills.sh
変換処理の具体例
たとえばある Claude Code Skill の SKILL.md には、以下のように GitHub API 経由でドキュメントを動的に取得する構文が含まれています。
# API設計ガイドライン 以下のガイドラインに従って API を設計してください。 !`gh api /repos/org/repo/contents/docs/web_api_design.md ...`
変換スクリプトはドキュメントを管理するリポジトリ上に配置します。こうすることで、この !gh の行をローカルにあるドキュメントの内容で置き換えることができます。
# API設計ガイドライン 以下のガイドラインに従って API を設計してください。 (ローカル参照した web_api_design.md の内容がここに展開される)
これにより、GitHub API を呼び出さなくてもドキュメントの全文がスキルに含まれるようになり、Cursor でも問題なく動作します。
動的に取得する Claude Code 形式と比較すると、ドキュメントに変更があるたびにスクリプトの再実行が必要になります。この点に関しては Claude Plugin を使っていたとしても手動でアップデート(claude plugin update <plugin>)する必要があるため、大きな差はないだろうと判断して許容しました。
出力されるディレクトリ構造
スクリプトを実行するとユーザー領域に下記のようなディレクトリ構成でファイルが展開されます。
~/.cursor/skills/ ├── skill-ref-design-api/ │ └── SKILL.md # ドキュメントが埋め込まれたスキル ├── skill-ref-design-table/ │ └── SKILL.md ├── skill-wf-design/ │ ├── SKILL.md │ ├── intro.md │ ├── workflow.md │ ├── troubleshooting.md │ └── samples/ │ └── default.md ...
Dev Container 環境への対応
変換スクリプトをリリースした後、Cursor で Dev Container を使って開発しているメンバーから「スキルが認識されない」という報告がありました。
原因はシンプルで、Dev Container 内からはホスト側の ~/.cursor/skills/ が参照できないためです。
これを解決するためにいくつかの方法を検討しました。
| 方法 | メリット | デメリット |
|---|---|---|
devcontainer.json で ~/.cursor をマウント |
設定一箇所で済む | Cursor を使っていない人のホストにも ~/.cursor/ が作成されてしまう |
| ワークスペース直下に配置 | マウント不要(ワークスペースはデフォルトでマウント済み) | gitignore の設定が必要 |
チーム内には Cursor を使っていないメンバーもいるため、devcontainer.json にマウント設定を追加する方法は副作用が大きいと判断し、ワークスペース直下に配置する方法を選択しました。
具体的には、変換スクリプトに --target オプションを追加し、出力先ディレクトリを指定できるようにしました。
# Dev Container 環境向け:ワークスペース直下に配置 ./scripts/build-cursor-skills.sh --target /path/to/repo
これにより、スキルファイルはワークスペース直下( <repo>/.cursor/skills/ )に配置されます。ワークスペースはデフォルトで Dev Container にマウントされているため、追加のマウント設定なしでスキルが認識されます。
ただし、ドキュメントが更新されてスクリプトを再実行すると、そのたびに更新された Skills を構成するファイルに差分が出てしまいます。そこで、利用する側のリポジトリでスクリプトによって配置されるディレクトリ以下を gitignore する対応も合わせて行いました。
今後の展望
現在はビルドスクリプトを手動で実行する必要がありますが、Cursor 側で Claude Plugin と同等の配布機構や !command 構文がサポートされれば、変換スクリプト自体が不要になる可能性もあります。その動向もウォッチしつつ、現時点で最もシンプルに課題を解決できる方法として、この変換スクリプトによるアプローチを採用しています。
また、元のドキュメントに更新が入った時に手元の Skills をアップデートすることを促す通知を送信するなど、ユーザーの利便性に配慮した仕組みづくりも進めていきます。
おわりに
今回は、Claude Plugin 形式で配布している Agent Skills を Cursor でも利用できるようにした取り組みをご紹介しました。
「Claude Code で便利に使っている Skills を他のツールでも使いたい、でもプラットフォームごとに構文や配布の仕組みが違って大変」というのは、多くのチームが直面しうる課題だと思います。私たちのアプローチはシンプルなシェルスクリプトによる変換という泥臭い方法ですが、低コストで確実に課題を解決できました。少なくとも今後 Agent Skills の配布の仕組みが Cursor に搭載されるまでの暫定対応としては十分に機能していると思っています。
この記事が、同じような課題に取り組む方の参考になれば幸いです。
最後までお読みいただき、ありがとうございました!