MCP Fusion/Core concepts/ツール公開
ツール公開
アクションを一度定義し、ワイヤーに公開する形を選択できます。ディスクリミネーター付きのグループ化されたツールか、アクションごとのアトミックなツールに加え、タグベースの可視性とアクション別スキーマを利用できます。
コネクターの作成方法とエージェントからの見え方は、MCP Fusion では別々の決定です。公開層はその間に位置し、ビルダーを受け取ってクライアントに送る tools/list のサーフェスをコンパイルします。ハンドラーを 1 つも変更せずに戦略を切り替えられます。
名前空間: 1 つのツール、複数のアクション
作成時はドット区切りの名前を使い、最初のドットで名前空間とアクションを分けます。
| 記述 | MCP ツール | アクション |
|---|---|---|
f.query('billing.get_invoice') | billing | get_invoice |
f.mutation('billing.refund') | billing | refund |
f.action('support.tickets.search') | support.tickets | search |
ツール名に含められるドットは最大 1 つです。ネストしたプレフィックスには f.router('support.tickets') を使います。同じ名前空間を共有するビルダーはレジストリによって統合されるため、compliance.scan、compliance.report、compliance.status をそれぞれ export する 3 つのファイルから、3 つのアクションを持つ compliance ツールが生成されます。エージェントには一貫したサーフェスが見え、開発者はアクションごとのファイル構成を維持できます。
2 つの戦略
attachToServer(server, { toolExposition }) でワイヤー上の形を選択します。
グループ化は複数アクションの名前空間に対するデフォルトです。名前空間ごとに 1 つの MCP ツールを作り、デフォルトでは action となるディスクリミネーターフィールドを持たせます。.discriminator('operation') で名前を変更できます。エージェントはリソース指向 API と同じように、引数としてアクションを選択します。
フラットではアクションごとに 1 つのアトミックな MCP ツールを作り、billing_get_invoice のように名前を付けます。区切り文字は設定可能です。各ツールには専用の整理済みスキーマが与えられ、共通フィールドはそのアクションのフィールドとのみ統合され、ディスクリミネーターは除去され、固有のアノテーションが付きます。クライアントのツール選択が弱い場合や、アクション間の共通点がほとんどない場合にフラットを使います。
フラットなツールでは HATEOAS のアフォーダンスも直接的になります。フラットなサーフェスからの .suggest('billing.remind') は、クライアントがすでに一覧表示しているツールです。
アノテーションの正確さ
意味を持つ動詞が MCP アノテーションを設定し、公開層はそれをアクションごとに保持します。
| ビルダー | アノテーション |
|---|---|
f.query() | readOnlyHint: true |
f.mutation() | destructiveHint: true |
f.action() | 中立 |
.idempotent() | idempotentHint: true |
フラットモードでは各アトミックなツールが固有のヒントを持ちます。グループ化モードではツールが最も安全な集約値を持ち、アクションごとのヒントは各アクションのスキーマ説明に含まれます。破壊的なミューテーションが読み取り専用だと名乗るのは、クライアントがその情報をもとに動くため問題です。したがってフレームワークは、宣言されていない安全性を推測しません。
パラメーターアノテーションが説明を担います
グループ化されたスキーマは共通パラメーターとアクション固有のパラメーターを統合します。各フィールドの説明には、アクションそのものから生成された必須性のアノテーションが加わります。
| アノテーション | 意味 |
|---|---|
(always required) | ツールのすべてのアクションで必須 |
Required for: refund, void | 記載されたすべてのアクションで必須 |
Required for: refund. For: get | 一部で必須、他では任意 |
For: get, list | 必須ではないが、該当アクションで使用 |
エージェントはエラーからこのマトリクスを学ぶ必要がありません。スキーマが示すからです。ディスクリミネーターの enum と組み合わせることで、グループ化されたツールは自己記述型 API になります。
タグによる可視性
.tags('billing', 'finance') でツールをマークし、attachToServer(server, { filter }) で公開対象を決めます。
attachToServer(server, {
filter: {
tags: ['finance'], // AND: must carry every tag
anyTag: ['public'], // OR: at least one
exclude: ['internal'], // NOT
},
});タグを使うと、1 つのコードベースで複数のプロダクトに対応できます。無料プランでは公開ツールを公開し、エンタープライズ環境では内部ツールを公開し、ハンドラーのコードは同一のままです。同じ考え方をリクエスト単位で適用する方法は マルチテナントコネクター をご覧ください。
トークン戦略としてのグループ化
すべてのツール名、説明、スキーマは毎ターンのコンテキストを消費します。フラットなツールが 100 個あると、モデルは計画前に 100 個の説明を読みます。10 個のアクションをディスクリミネーター enum 付きの 1 つのツールにまとめると、スキーマサイズとプロンプトサイズを交換でき、通常は約 10 アクションを超えると大きな効果があります。.toonDescription() は説明をさらに圧縮し、compactDescription() は FSM の段階的開示に短い形式を提供します。詳しくは トークンエコノミーで説明します。
次のステップ
- トークンエコノミー: 同じサーフェスでコンテキストを減らす
- FSMステートゲーティング: 状態で禁止されるツールを除去する
- ルーティング: ビルダーがディスク上のどこにあるか
