Skill Hub
README.md
# Skill Hub
社内の「AIが得意な人」が Claude Code 用のスキル(指示書+参照資料)を1箇所に登録し、社員は **コマンド1行を Claude Code に貼るだけ** でそのスキル群を使えるようにする、1社1インスタンスのテンプレートです。Cloudflare Workers + D1 上で動く単一Workerアプリで、自社のCloudflareアカウントにデプロイして使います。
## これは何か(正直に)
スキルは「ファイル配布」ではなく「サーバーから都度配信」です。この違いが価値の中心です。
- 導入がコマンド1行で終わる
- 中央でスキルを更新すれば、次の利用から全員が最新版を使う
- 退職・異動時はトークンを失効させれば即座に使えなくなる
- リポジトリごと渡さないので、組織外への再配布が起きにくい
**MCP応答は利用者の会話に平文として渡ります。**「読めない秘匿」ではありません。読もうと思えば読める人には読めます。この仕組みが守っているのは「配布経路」と「失効の即時性」であり、完全に隠したいロジックはこの仕組みの対象外です(そういう用途はv2のサーバー実行型ツールで扱う想定です)。
### Claude Code純正スキルとの違い
配信されるのは「指示書として読ませるテキスト」です。純正スキルの frontmatter 機能・`/スラッシュ起動`・同梱スクリプトの実行はできません。純正の自動発動に近づけるため、スキル登録時の「説明」にツールの発動条件を書く運用にしてください(MCPツールの description としてそのまま使われます)。
## アーキテクチャ
```
[Claude Code (member)] --Streamable HTTP MCP--> POST /mcp ┐
[ブラウザ (admin/editor/member)] --Bearer--> /api/* + 静的UI ├─ Cloudflare Worker (Hono/TS)
[招待リンク] --> /join (明示ボタンPOSTでclaim・1回表示) ┘ │
D1: tokens/skills/skill_files/skill_versions/invites/audit_log
```
単一Worker・単一D1データベース。KV/Durable Objectsは使いません。静的UI(`public/`)もWorker経由で配信し、全応答にセキュリティヘッダを付与します。
## セットアップ
前提: Node.js 20以上、Cloudflareアカウント。
```bash
git clone <このリポジトリ>
cd skill-hub
npm ci
npx wrangler login # 唯一の手作業(ブラウザでCloudflareにログイン)
node scripts/setup.mjs --seed
```
`setup.mjs` は冪等です。何度実行しても安全で、既にある状態はスキップします。
- D1データベース `skill-hub-db` を確認/作成し、`wrangler.jsonc` の `database_id` を書き換えます
- マイグレーションを適用します(未適用分のみ)
- Workerをデプロイします
- 有効なadminトークンが0件の場合のみ、初期adminトークンを1回だけ発行して表示します(**このトークンは二度と表示されません。必ず控えてください**)
- `--seed` を付けると `skills-samples/` の3本のサンプルスキルを投入します
複数のCloudflareアカウントを持っている場合は `CLOUDFLARE_ACCOUNT_ID` 環境変数で対象を指定してください。
## 使い方(役割別)
| 役割 | 誰 | できること |
|---|---|---|
| admin | AI推進担当(導入企業側) | スキル登録・メンバー招待・トークン発行/失効・監査ログ閲覧。何でもできる最上位権限 |
| editor | スキルを作る人 | 自分のgroups内のスキルを作成・更新・削除・ロールバック。下書き保存も可能 |
| member | 一般社員 | 招待リンクからトークンを発行し、Claude Codeにスキルを1コマンドで接続する |
### memberの手順
1. 管理者から届いた招待リンク(`https://<host>/join?code=...`)を開く
2. 「トークンを発行する」ボタンを押す(**GETでは何も起きません**。ボタンを押した時だけトークンが発行されます)
3. 表示されたコマンドをコピーして、Claude Codeのターミナルに貼る
```
claude mcp add --transport http --scope user skillhub https://<host>/mcp --header "Authorization: Bearer <token>"
```
`--scope user` なので、以後は全プロジェクトでスキルが使えます。**表示は1回だけです。**この画面を閉じると二度と見られないので、必ずその場でコピーしてください。
### 権限マトリクス(サーバー側で全て強制。UIの出し分けは補助でしかありません)
| 操作 | member | editor | admin |
|---|---|---|---|
| MCP tools/list・call(自groups内のpublishedのみ) | ✅ | ✅ | ✅ |
| GET /api/me・GET /api/skills(可視のみ) | ✅ | ✅ | ✅ |
| スキル作成/更新/削除/添付/公開切替/ロールバック | ❌ | ✅(対象skillのgroups⊆自groups) | ✅ |
| 下書き閲覧 | ❌ | ✅(同上) | ✅ |
| トークン発行/一覧/失効・招待発行/一覧/取消 | ❌ | ❌ | ✅ |
| 監査ログ閲覧 | ❌ | ❌ | ✅ |
**groupsの可視判定はOR判定です**(`skill.groups` と `token.groups` の積が空でない、またはどちらかが `"*"` なら見える)。複数groupsを指定しても「絞り込み」にはなりません。機密スキルは専用グループ1つで運用してください。
**新しいスキルの発見は新しいセッションから**です。MCPは `tools/listChanged` を送らないため、Claude Codeを起動したまま裏でスキルを追加しても、そのセッションのツール一覧には出てきません(本文の更新は既存セッションでも次回呼び出し時に反映されます)。反映させたい場合はClaude Codeを再起動してください。
## 無料枠と課金
Cloudflare Workers / D1 とも無料枠があります(Workers: 10万リクエスト/日、D1: 500万行読み取り/日・10万行書き込み/日が目安、いずれもCloudflareの料金ページで最新値を確認してください)。数十人規模の社内利用であれば通常は無料枠に収まりますが、超えた場合は自動で有料プラン(Workers Paid)への移行が必要になります。利用状況はCloudflareダッシュボードで確認できます。
## v1のスコープ外(正直な制約)
- OAuth/SSO・IdP連携はしていません(トークン方式のみ)。Cloudflare Accessを前段に置く場合、CLIからのアクセスがブラウザ認証チャレンジで止まることがあるため、Access併用時は事前に確認してください
- スキルの二者承認ワークフローはありません。editorは信頼前提で、監査ログとバージョン履歴・ロールバックで事後対処します
- 可視スキルが40本を超えるとMCPの `tools/list` が肥大化します。大規模組織向けの二段検索方式(`search_skills`)はv2予定です
- バイナリ添付ファイルは非対応(テキストのみ)
- D1のリージョン/jurisdiction選択はセットアップスクリプトの手動オプション案内のみです
- CIは含まれていません
## ライセンス
MIT。詳細は [LICENSE](./LICENSE) を参照してください。
## もっと詳しく
- セキュリティ設計: [docs/security.md](./docs/security.md)
- メンバー向け利用ガイド: [docs/member-guide.md](./docs/member-guide.md)
- 運用ガイド(管理者向け): [docs/operations.md](./docs/operations.md)
- Claude Codeによる自走セットアップ手順: [CLAUDE.md](./CLAUDE.md)
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues