mcpField
S
skill-mcp

skill-mcp

ローカル
github.com/chrischallAI・エージェント01 日前に更新

skill-mcp について

Agent Skills のディレクトリを MCP クライアントに提供する汎用サーバーです。指示と同梱ファイルを公開し、制限と確認のもとで、スキルが宣言したスクリプトだけを実行できます。

主な機能

  1. 01スキルの検出と一覧表示
  2. 02スキル指示とファイル一覧の取得
  3. 03複数スキルファイルの一括取得
  4. 04宣言済みスクリプトの実行
  5. 05検出上の問題の報告と実行制限

活用シーン

  1. 01エージェントによる利用可能なスキルの随時検出
  2. 02スキル指示と参照ファイルの読み込み
  3. 03確認後の許可済みスクリプトの実行
  4. 04提供されなかったスキルの問題調査

MCP 対応

スキルの一覧表示、読み込み、ファイル取得、宣言済みスクリプトの実行を MCP ツールとして提供します。各スキルは MCP プロンプトとして登録され、同梱ファイルはリソースとして公開されます。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"chrischall-skill": {
"command": "npx",
"args": [
"-y",
"@chrischall/skill-mcp"
],
"env": {
"SKILLS_DIR": "<SKILLS_DIR>"
}
}
}
}
起動コマンドnpx -y @chrischall/skill-mcp
設定が必要な環境変数
SKILLS_DIRDirectory of skills to serve (':'-separated for several). Defaults to the example skill bundled with this package.

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@chrischall/skill-mcp1.2.3

ツール

4

掲載時のツール一覧 · 1 日前に更新

このツールにパラメーターはありません。

詳細

skill-mcp

Agent Skills のディレクトリを提供する MCP サーバーです。スキルを指定すると、 一覧を表示し、その手順と同梱ファイルを渡し、スキルが宣言したスクリプト のみを実行します。

これはキュレーションされたセットではなく、汎用アダプターです。スキルは読み込む コンテンツであり、同じビルドで指定されたあらゆるディレクトリに対応します。

npx @chrischall/skill-mcp                       # serves the example skill bundled here
SKILLS_DIR=~/my-skills npx @chrischall/skill-mcp

npm パッケージは @chrischall/skill-mcp です(スコープなしの skill-mcp は npm で別の人が使用しています)。それ以外はすべて、リポジトリ、バイナリ、 レジストリ ID io.github.chrischall/skill-mcp を含め、スコープなしです。

スキルとは

SKILL.md を含むディレクトリです。YAML フロントマター(name、description、 および任意の mcp-host: ブロック)に続いて手順が記述され、さらにその手順で参照 されるファイルが含まれます。各ルートの下には、次の 3 つのレイアウトがあります。

<root>/SKILL.md              # the root IS one skill
<root>/<name>/SKILL.md       # a directory of skills
<root>/skills/<name>/SKILL.md

スキルは自身の DIRECTORY 名で提供されます。フロントマター内の name では ありません(フロントマターの name が一致しない場合は報告され、それ以外は無視 されます。ルート自体がスキルの場合は、そのルートディレクトリ名が使われます)。 これは整理のためではなく、セキュリティ上のルールです。所有者の許可はスキル名を 指定するため、バンドルが独自の名前を選べると、隣のスキルの名前を名乗り、その スキルに許可されたスクリプトや変数を渡される可能性があります。同じ理由から、 実際に同じ名前を提供する 2 つのディレクトリ(2 つのルート間でのみ発生し得ます) は、スキャン順でどちらか一方が優先されるのではなく、両方とも拒否され、報告 されます。

ツール

toolargumentsreturns
skill_list—見つかったすべてのスキル:名前、説明、使用するタイミング、ファイル数、実行可能スクリプトを宣言しているかどうかと、宣言している場合はその正確な一覧。さらに problems も返すため、空の一覧でも理由がわかります
skill_loadnameSKILL.md の本文をそのまま返し、バンドルのファイルのマニフェストも返します。参照先のファイルは本文に埋め込まれません。そのためのツールが skill_file です
skill_filename, paths[]パスごとにリクエスト順で 1 件を返します。内容はテキスト、メディアタイプ付きの base64、またはそのパス固有のエラーです。各エントリは最大 1 MiB で、無言で切り詰める代わりに truncated: true を返します
skill_runname, script, args[], confirmToken{exitCode, stdout, stderr, truncated, durationMs}

skill_file は paths[] によるバッチ処理に対応しているため、SKILL.md が参照する ファイルを 1 回の往復で取得できます。1 回の呼び出しにつき最大 8 パス、各エントリ は 1 MiB、呼び出し全体では 4 MiB です(バイトを読み取る前にファイルサイズを合計 するため、パスを列挙した順番に応答が左右されることはありません)。不正なパスが あってもエラーになるのはそのエントリだけで、バッチ内のほかのファイルは引き続き 提供されます。上限はこのサーバー自身のヒープ使用量に対する制限として捉えてくだ さい。上限が制約するのは応答だけではなく、割り当てです。ホストされた子プロ セスのデータ上限は 256 MiB に固定されており、バンドルがそれを超える場合もある ためです。

各スキルは、MCP プロンプト(本文をメッセージとして)としても登録され、同梱され た各ファイルはリソース(skill://<name>/<path>)として登録されます。こうした インターフェースに対応するクライアントでは、ツール呼び出しよりもスキルを適切に 提示できるためです。これは 2 つ目の入り口であり、唯一の入り口ではありません。 このサーバーを mcp-host 上で実行し、登録によって enabledTools が絞り込まれると、prompts/list と resources/list は空で返り、 ハンドシェイクでもそれらの機能は通知されなくなります。そのため、 体験のすべてを担うのはツールです。

検出レポートは絶えません

ディレクトリの提供を妨げるものはすべて、パスと理由とともに skill_list の problems に返されます。SKILL.md がない、パースできないフロントマター、 2 つのディレクトリが同じ名前を主張している(両方とも拒否)、バンドル内に存在しない 宣言済みスクリプト、ルートの外またはスキルの外へ出るシンボリックリンク、読み取り ツールで扱えないファイル名などです。問題のあるスキルはそれ自体が対象外になるだけで、 一覧全体が対象外になることはありません。また、何かが通知なく破棄されるという 3 つ目の結果もありません。シンボリックリンクされたスキルディレクトリは、ルート内に とどまる場合は提供されます(そのため skills/foo -> ../shared/foo は機能します)。 ルート外に出る場合は報告されます。提供時には リンク先 ディレクトリの名前で 扱われます。つまり skills/foo -> ../bar はスキル bar となり、権限が正しい名前に 対して付与されるよう name-mismatch として報告されます。同じディレクトリに 2 回 到達した場合(直接一覧に含まれるスキルへのリンクがある場合など)は、重複ではなく 1 つのスキルとして扱われます。

問題の理由

problems の各エントリは {path, reason, detail} です。detail は人が読むための 説明で、reason は処理の分岐に使う安定した値です。

reason意味
root-unreadable設定されたルートを読み取れなかった
no-skill-md候補ディレクトリに SKILL.md がない
unreadable-skill-mdSKILL.md が通常ファイルではない、または読み取れなかった
malformed-frontmatterフロントマターをパースできない
declarationmcp-host: ブロックが拒否された、または不明なキーが含まれている(キー名は detail に記載)。影響を受けるのはスキルのスクリプトであり、指示ではない
duplicate-name2 つのディレクトリが 1 つのスキル名を構成している。両方とも拒否される
name-mismatchフロントマターの name がディレクトリ名と一致しない。ディレクトリ名が優先される
unusable-nameディレクトリ名を扱えないため、スキルがスキップされた
declared-script-missing宣言済みスクリプトがバンドル内にない
symlink-escapeシンボリックリンクがルートの外またはスキルの外へ出ている
unusable-path読み取りツールで扱えないファイル名がマニフェストから除外された
file-limitスキルにファイルまたはディレクトリがスキルごとの上限(各 2000)を超えて含まれている。マニフェストには走査した内容が一覧表示される
skill-limitMAX_SKILLS(32)を超えるスキルが見つかった。残りは無視される
grantMCP_SKILL_RUN がスキルで宣言されていないスクリプトを指定しているため、その行は何も許可しない
environ-unscrubbedホスト環境で、実行時の環境ブロックを消去できなかったため、スクリプトは実行されない(以下の環境変数許可リストに関する注記を参照)

理由の種類は追加されていきます。 メジャーバージョンの変更なしに新しい理由が 追加されます(最新のものは environ-unscrubbed です)。そのため、reason によって 分岐するクライアントは、認識できない値を一般的な問題として扱い、detail を表示 しなければなりません。決してエラーで停止してはいけません。

実行の防護策

skill_run はサードパーティのコードを実行します。以下の各ルールは、実行されるコードと そのコードに渡される内容を限定します。各ルールにはそれぞれテストがあります。

  • スキルが宣言したスクリプトのみです。 scripts/ 以下の「任意のファイル」でも、「実行可能なものなら何でも」でもありません。宣言されていないパスは拒否され、宣言が必要であることと、宣言済みのパスが示されます。
  • そのスキル自身のディレクトリ内に限ります。 まずパスを文字列として検証します(通常のセグメントのみ。先頭の /、. や ..、バックスラッシュ、パーセントエスケープ、NUL は不可)。さらに解決後にも検証します。シンボリックリンクをたどった実際のパスが、スキルの実際のディレクトリ内にあり、通常のファイルでなければなりません。両方の検証が必要です。文字列の検証だけではバンドル内に仕込まれたシンボリックリンクを見逃し、解決後の検証だけでは、本来結合すべきでないパスの形を受け入れてしまうためです。同じ規律は skill_file にも適用されます。スキルディレクトリ外からの読み取りは、せいぜい別のスキルのバンドルです。
  • シェル文字列ではなく、常に argv 配列を使います。 shell: false で spawn し、補間は行わず、sh -c も使いません。引数はそのまま渡されます。
  • インタープリターは宣言で指定された固定の選択肢から選びます。 拡張子から推測することも、ファイル自身の shebang から取得することもありません。ファイル自身がインタープリターを選べるなら、その時点ですでに実行するプログラムを選べてしまうためです。v1 で実行するのは node のみです(v1 で実行できないものを参照)。
  • 実行には上限があり、呼び出しは必ず戻ります。 実時間のタイムアウト(デフォルトは 60 s。スクリプトごとに上書きでき、上限は 300 s)、各ストリーム 1 MiB のキャプチャ(黙って切り詰めるのではなく truncated: true を設定)、同時に実行できる skill_run は 1 つです。タイムアウト時にはプロセスグループにシグナルを送るため、スクリプトと、そのグループ内にとどまっている子プロセスに届きます。独自のグループに切り離された孫プロセスには届かず、そのような孫プロセスは標準入出力のパイプも開いたままにします。そのため、実行の終了はパイプが閉じるまで待つのではなく、プロセスの終了と短い排出時間を基準にし、厳格な期限を設けています。これにより、ツール呼び出しが割り当て時間内に戻り、1 件ずつ実行するためのロックが解放されます。意図的に切り離された孫プロセスの終了を保証するものではありません。それを制限するのはこの層の役割です(非特権 uid、prlimit NPROC、停止するマシン)。このアダプターの役割ではありません。
  • 環境変数の許可リストを設けています。 スクリプトに渡されるのは PATH、HOME、LANG、TZ、TMPDIR、ホストが設定している場合の MCP_DATA_DIR、ホストが設定している場合の送信プロキシ変数(HTTP_PROXY、HTTPS_PROXY、http_proxy、https_proxy、NO_PROXY、no_proxy、NODE_USE_ENV_PROXY)、そしてスクリプトが要求し、所有者が許可した変数のみです。このサーバー自身の環境変数が渡されることはありません。固定部分は mcp-host の INSTALL_ALLOWLIST(packages/runner-node/src/spawn-env.ts)に合わせています。そのファイルに記載されている理由は、ホスト側の定数であればホスト型の宣言が変数名を追加できないためです。これはスクリプトに渡される変数を決めるものであり、悪意あるスクリプトがアクセスできる範囲を決めるものではありません。 スクリプトはこのサーバーと同じ uid で実行されます。Linux では同じ uid のプロセスから /proc/<parent pid>/environ を読み取れるため、起動時にサーバーはその exec 時の環境ブロックを消去します(src/scrub-environ.ts。process.env の値はすべて保持されます)。そのため、その方法で読み取っても何も返りません。カーネルやサンドボックスがこの消去を拒否した場合、所有者が MCP_SKILL_ALLOW_UNSCRUBBED=1 を設定しない限り、ホスト型サーバーはスクリプトを一切実行しません。skill_run は拒否され、skill_list は environ-unscrubbed を報告します。スタンドアロンの場合は stderr に警告するだけです。値は引き続きサーバーのメモリー内にあり、Yama の ptrace_scope = 0 に設定されたカーネルでは、ptrace や /proc/<pid>/mem を通じてアクセスできます。互いに信頼しないスキル間を実際に隔離するには、この層が必要です(スクリプトごとに異なる uid を割り当てる、/proc を hidepid=2 でマウントする、またはサーバーをダンプ不可にする)。それまでは、登録するスキルすべてに、その登録で保持するすべての認証情報を渡してもよい場合に限って登録してください。
  • ゼロ以外の終了は通常の報告対象の結果です。 終了コード、stdout、stderr がすべて返されます。出力が失われる例外として扱われることはありません。
  • skill_run は、何かを実行する前に確認を求めます。 確認プロンプトを表示できるクライアント(Claude Code)では、サーバーが MCP_CONFIRM_ELICITATION=off を設定していない限り、そこでユーザーに確認します。それ以外の場合、最初の呼び出しではプロセスを起動せず、実行される内容(インタープリター、argv、作業ディレクトリ、タイムアウト、スクリプトに渡される変数の名前を含む。詳細はプレビューを参照)を示す status: "confirmation-required" と confirmToken を返します。同じ引数とそのトークンを指定した再度の呼び出しでのみ、スクリプトが 1 回実行されます。トークンはその実行内容にひも付けられています。スキル、スクリプト、argv を変更すると DRAFT_CHANGED として拒否され、使用済みのトークンは TOKEN_REUSED として拒否されます。確認を参照してください。
skill_run のプレビュー

最初の呼び出しの preview.willRun がユーザーの承認対象であり、confirmToken のペイロードです。トークンはこれに紐付けられます。名前のみで、値は含めません。

フィールド
skillディレクトリ名で識別されるスキル
interpreter宣言されたインタープリター(node)
argvスクリプトのパスと、それに続く引数。実際に渡される内容と完全に一致します
cwdスキル自身のディレクトリ。スクリプトはここで実行されます
timeoutMs300 秒の上限適用後の実行時間の上限
envNamesスクリプトに渡されるすべての変数をソートして列挙したもの。許可された変数だけではありません。設定されている固定許可リスト(PATH、HOME、LANG、TZ、TMPDIR)と、ホストが注入する MCP_DATA_DIR およびエグレスプロキシ変数(HTTP_PROXY、HTTPS_PROXY、その小文字形式、NO_PROXY/no_proxy、NODE_USE_ENV_PROXY)、さらに設定されている宣言済みかつ許可済みの各変数です。実行時と同じ関数で計算されるため、スクリプトが受け取る変数名と完全に一致します
envNotSet(空でない場合のみ) 宣言済みかつ許可済みの変数のうち、このサーバーの環境に設定されていないもの。スクリプトには渡されません
envWarning(スタンドアロンのみ、該当する場合) このサードパーティ製スクリプトに渡される変数を示す文。渡されるのは、そのスクリプト自身の SKILL.md が要求した場合に限られ、MCP_SKILL_RUN による許可はありません。そのスキルにその秘密情報を渡してもよい場合に限り、承認してください

クライアントは認識しているフィールドを表示し、残りはそのまま引き渡してください。上記の problems と同様に、オプションのフィールドは追加される可能性があります。

確認ゲートを一律に設ける理由

この環境の慣例では、状態を変更するツールにゲートを設けます。個々のスクリプトが何かを変更するかどうかは、このサーバーには分かりません。スクリプトを読み取ることはなく、意図的に解析もしません。他人のコードに対する機械生成の判定は、作者の申告よりも信頼されてしまうためです。そのため、影響が不明な場合は状態を変更するものとして扱います。

一見すると妥当な緩和策として、スキルがスクリプトを読み取り専用と指定した場合はゲートを省略する方法がありますが、循環論法になるため採用していません。同じ作者がスクリプトと、それを説明する文の両方を書いているため、自己申告の「読み取り専用」では何も承認できないからです。結果として、ゲートは一律に適用されます。読み取り専用のヘルパーでは余分な往復が一度増えますが、呼び出しが実行される前に、呼び出しの正確な内容を呼び出し元が確認できる唯一の場所がプレビューになります。

このフェンスで実現できないこと

スクリプトが宣言されていても、任意のコードであることに変わりはありません。 これらのルールは、実行されるコードとその実行方法を制限しますが、コードを安全にするものではありません。許可したスクリプトは、スキルのツリー全体を読み取り、マシンの CPU を消費し、ネットワークで許可される任意の場所に、保持している情報を送信できます。skill_run の出力上限は切り詰めるだけで、機密性を保証するものではありません。スクリプトの標準出力を伏せる仕組みはなく、そもそもそのような仕組みは実現できません。

これはサンドボックスではありません。 読んだことのあるスキルに対して実行するか、フェンスで隔離された場所で実行してください。mcp-host では、これは分離されたティア(fly-machine)を意味します。登録ごとにマイクロ VM を用意し、非特権 UID、prlimit による制限、宣言されたエグレス許可リストを用いた nftables のデフォルト拒否を適用します。このサーバーは、そのようなフェンスの上に制限を追加するものであり、置き換えるものではありません。

v1 で実行できないもの

インタープリターは node のみです。これは見落としではなく、実測に基づく判断です。mcp-host のランナーイメージには Node、git、tar、util-linux、nftables が含まれていますが、python3、curl、jq は含まれていません。一方、実際のスキルの大半は Python で書かれています(anthropics/skills の 3b3fad96 では、.py が 70 件、.js が 1 件です)。

そのため、Python スクリプトを宣言しているスキルは、skill_list の unavailableScripts に、インタープリターとこのデプロイ環境で利用可能なインタープリターの一覧とともに表示され、skill_run も同じ内容を示して実行を拒否します。ただし、スキルの指示は引き続き役立ちます。指示のみのスキルにも価値があり、公開されているスキルのほとんどはまさにその形式です。インタープリターを固定する機能は、イメージの変更ではなく、依存関係として今後追加されます。

mcp-host: 宣言ブロック

省略可能です。SKILL.md のフロントマター内に記述します。

---
name: weather
description: Forecasts and geocoding.
mcp-host:
  version: 1
  run:
    - script: scripts/forecast.js
      interpreter: node
      env: [WEATHER_API_KEY]     # variables this SCRIPT asks for
      timeout: 30                # seconds; clamped to 300
  env:                           # fields proposed for the SERVER's environment
    - name: WEATHER_API_KEY
      secret: true
  egress: [api.weather.example]  # hosts this skill reaches; a proposal
---

宣言は対象を絞るものであり、許可を与えるものではありません。 スクリプトの作成者が、それらを指定するブロックも記述しています。そのため、このブロックに認可の意味はありません。どのファイルがエントリーポイントで、それぞれが何を必要としているかを示すものです。スクリプトの実行を可能にし、変数をスクリプトに渡すのは、それを受け入れる別の人です。

厳密に読み取ります。YAML 1.2 コアスキーマを使用し、アンカーとエイリアスは拒否し、上限は 64 KiB とします。未知の MAJOR バージョンは全体を拒否し、未知のキーは無視しますが、名前を報告します。また、ブロックを解析できない場合は、存在しないものとして扱うのではなく、パーサーが示す位置とともに報告します。壊れたブロックによってスキルのスクリプトが使えなくなることはあっても、その指示や一覧の残りが使えなくなることはありません。

設定

変数意味
MCP_SKILLS_PATHmcp-host のランナーが注入する、: 区切りのスロットルートです。ほかのすべての設定より優先されます
SKILLS_DIRローカルで使用する場合の同等の設定です。MCP_SKILLS_PATH が未設定の場合にのみ読み取られます
MCP_SKILL_RUN省略可能な JSON [{skill, script, env?}] です。所有者による許可です。対象を絞るのみ
MCP_SKILL_ALLOW_UNSCRUBBED1 にすると、実行時の環境ブロックを消去できなかった場合でも、ホストされたサーバーでスクリプトを実行できます(環境変数の許可リストに関する注記を参照)。デフォルトでは無効です
(どちらも未設定)このパッケージ独自の skills/ ディレクトリです

MCP_SKILL_RUN については、強調しておく必要があります。この変数が設定されている場合、実行できるものは宣言との積集合になります。スキルが宣言していないスクリプトを指定する行は何も許可せず(その旨が報告されます)、スクリプトが要求していない変数を指定する行も何も許可しません。スキルが宣言していないものを実行可能にする記述方法はありません。そのため、登録自体の変数も含まれる環境から安全に読み取れます。

この変数が未設定の場合、デフォルトの動作はホストがこの子プロセスを起動したかどうかによって異なり、ホスト環境ではフェイルクローズになります。

  • ホスト環境 — mcp-host のランナーが注入する変数が 1 つでも存在する場合(MCP_SKILLS_PATH、MCP_HOST_METER_FILE、MCP_DATA_DIR、MCP_BLOB_BASE_URL):何も許可されず、何も実行されません。 すべてのスキルの指示とファイルは引き続き提供されるため、コネクターとして問題なく役立ちます。理由は、1 つの子プロセスが、所有者の設定したすべての認証情報を含む 1 つの環境を保持しているためです。フロントマターで隣のスキルの変数を指定したスキルに、その隣のスキルの認証情報が渡されることになり、誰もその受け渡しを決めていない状態が生じるためです。(これはスクリプトに何が渡されるかに関する話であり、サンドボックスではありません。/proc/<pid>/environ に関する上記の環境変数の許可リスト注記を参照してください。)デフォルトの判定に MCP_SKILLS_PATH だけを使うことは意図的に避けています。mcp-host はまだその変数を注入していないためです。現時点で唯一のホスト経由の経路は、登録の通常の env にある SKILLS_DIR であり、これがオープンなデフォルトに適用されてはなりません。このマーカーのチェックによってデフォルトの動作が変わる場合も、フェイルクローズの方向に限られます。
  • スタンドアロン — 注入されたマーカーがない場合:スキル自身の宣言が有効になります。何も注入されておらず、サーバーにディレクトリを指定した人が所有者です。スクリプトが宣言する変数も含まれます。 env: で GITHUB_TOKEN を指定するスキルには、このサーバーの環境にある GITHUB_TOKEN(通常は MCP クライアントがシェルから設定します)が渡されます。制御されるのは skill_run による確認のみです。プレビューにはその旨が変数名とともに表示されます(envWarning)。スタンドアロンのサーバーには、そうした秘密情報を渡してもよいスキルだけを指定するか、MCP_SKILL_RUN を設定して変数を明示的に許可してください。

skill_list は、どちらのケースに該当するかを報告し(grantFrom、ホスト環境の場合は grantNote も表示)、宣言されているものの許可されていないスクリプトをスキルごとに一覧表示します。そのため、「何も実行されない」状態が「何も宣言されていない」状態と混同されることはありません。

確認
variabledefault
MCP_CONFIRM_MODEask-user確認プロンプトを表示できないクライアント(claude.ai、Claude Desktop)で、書き込みをどう処理するかを指定します。ask-user:2 段階で処理します。最初の呼び出しでは何も行わず、プレビューとトークンを返します。モデルは、トークンを付けて再度呼び出す前に、チャットであなたの承認を得る必要があります。auto:同じく 2 段階で処理しますが、モデルはプレビューを自ら確認した後、トークンを使用できます。refuse:そのようなクライアントでは書き込みを拒否します。プロンプトを表示できるクライアント(Claude Code)には、MCP_CONFIRM_ELICITATION=off でない限り、常に実際のプロンプトが表示されます。認識できない値は refuse として扱われます。
MCP_CONFIRM_ELICITATIONonoff にすると確認プロンプトが表示されず、すべてのクライアントで MCP_CONFIRM_MODE の動作が適用されます。プロンプトを表示できるとするものの実際には表示しないクライアント(opencode 2.0.x では書き込みが停止します)に設定してください。それ以外の値は on として扱われ、stderr に警告が表示されます。
MCP_CONFIRM_TTL_SECONDS600トークンの有効期間です。
MCP_CONFIRM_SECRETプロセスごとにランダム署名キーです。サーバー再起動後もトークンを有効にする必要がある場合にのみ設定してください。

信頼に関する方針

  • このサーバーのコードは運用者のものです。スキルはあなたのものです。指定された固定のディレクトリだけを読み取り、何も取得・インストールしません。また、スキル自身のディレクトリ外のパスを受け取るツールはありません。
  • 何も審査しません。 バッジも、発行者の許可リストも、スキャンもありません。スキルの指示やスクリプトの信頼性は、それを書いた人の信頼性と同じです。
  • 読み取りも実行と同じくらい危険なものとして扱います。読み取り元のディレクトリは、マシン上のほかのすべてのものと隣接しているためです。
  • 何もキャッシュせず、保存もしません。 カタログは起動時に一度スキャンされ、メモリ上に保持されます。ファイルがどこかに書き込まれることはありません。

mcp-host でのホスティング

リポジトリのルートにある mint.yaml は、この MCP の登録方法を示します。意図的に提案していない項目が 4 つあります。これらは登録時にのみ決定できるためです。

  • ランタイム — ルール上、指定することはできません。 マニフェストでランタイムを指定することはできません(docs/MINT-MANIFEST.md §5)。登録がどのティアに配置されるかは、パッケージではなく、登録を行う人が決めます。fly-shared を要求できるファイルが、見知らぬ人のパッケージから運用者自身のマシンの利用を要求できてしまうためです。ホスト型スキルサーバーは、宣言済みのエグレスポリシーを設定した isolated ティア(fly-machine)に配置する必要があり、その選択は登録時に行います。

  • スキルそのもの。 ピン留めされた依存関係(リポジトリと厳密なコミットを指定する github-archive)として取り込まれ、ランナーが MCP_SKILLS_PATH で指定する読み取り専用スロットに配置されます。このパッケージからは、個々の登録にどのスキルが含まれるかを把握できません。

  • state.dataDir。 アダプターは永続化を必要としません。登録されたスキルのスクリプトが書き込み先を必要とする場合は有効にし、その理由を記載してください。スロットは読み取り専用なので、スクリプトの出力先には、有効時は MCP_DATA_DIR、無効時は TMPDIR が使われます。

  • 実際のエグレス許可リスト。 mint.yaml が提案する allow: [] は、何にもアクセスしないアダプター自体に必要な設定です。登録に必要なホストは、スキルが宣言するもので、プレビューに宣言者とともに表示され、所有者が承認します。isolated ティアでは、リストにないホストへのアクセスは、ループバックプロキシからの HTTP 403 か、単なるタイムアウトとして現れます。スクリプトの内部からはこの 2 つを区別できないため、フェンスされていると思われるマシンで呼び出しに失敗すると、skill_run がその旨を示す注記を付けます。

enabledTools を [skill_list, skill_load, skill_file] に絞ると、実行不可に切り替えられます。これはここでの skill_run の拒否よりも強い制限で、ゲートウェイ側で適用されます。ただし、プロンプトとリソースの機能はすべて利用できなくなります。

開発

npm install
npm run build      # tsc → dist/, esbuild → dist/bundle.js
npm test           # tsc typecheck + vitest

このプロジェクトは AI によって開発・保守されています。ご自身の判断でご利用ください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。