Agent Skills by ALSEL
汎用LLM・AI開発⭐ リポ 0品質スコア 65/100

zod-defined-tool-factory

MCPツール定義をTyped型の`defineTool`ヘルパーでラップして、Zodスキーマがランタイム検証とハンドラーのTypeScriptパラメータ型の両方を駆動し、あらかじめ解決されたページコンテキストが必要なツール用に別の`definePageTool`バリアントを用意します。

description の原文を見る

Wrap MCP tool definitions in a typed `defineTool` helper so zod schemas drive both runtime validation and the handler's TypeScript param types, with a separate `definePageTool` variant for tools that need a pre-resolved page context.

SKILL.md 本文

型付きツール定義ファクトリー

使用時期

  • MCPまたは同様のJSONスキーマ駆動型ツールシステムを持つ多数のツールがあり、宣言スキーマとハンドラーのパラム型の間に差異がないようにしたい場合
  • 一部のツールに追加セットアップ(例えば事前解決された「現在のページ」またはDBコネクション)が必要であり、毎回ハンドラーにコピー&ペーストしたくない場合
  • ビルド時に同じツール定義からドキュメントやCLIを生成したい場合

動作原理

  • BaseToolDefinition<Schema extends zod.ZodRawShape>namedescriptionannotationsschemaで定義します。TypeScriptがzodからパラム型を推論できるようSchemaをジェネリックとして保持します。
  • defineTool(def)を提供します。これは単に引数を返しますがジェネリックを絞ります。ハンドラーシグネチャは(request: { params: zod.objectOutputType<Schema, ZodTypeAny> }, response, context) => Promise<void>として型付けされます。
  • 2番目のオーバーロードdefineTool(factoryFn)を提供します。これはパース済みCLI引数の関数を受け入れ、ツールを返します。これにより、ツールは起動フラグに基づいてスキーマ/動作を調整できます。
  • 「ページが必要」のケースでは、definePageToolを追加します。これはpageScoped: trueをスタンプし、拡張されたハンドラーシグネチャ(request & { page: ContextPage }, response, context)を持ちます。サーバーディスパッチャーはpageScopedをチェックし、ハンドラー呼び出し前にページを解決します。
  • 共通スキーマフラグメント(pageIdSchematimeoutSchemaviewportTransformのような変換)をエクスポートします。これにより、ツール間で正確な文言と検証が共有されます。

export const takeSnapshot = definePageTool({
  name: 'take_snapshot',
  description: 'Take a text a11y snapshot of the selected page.',
  annotations: { category: ToolCategory.DEBUGGING, readOnlyHint: false },
  schema: {
    verbose: zod.boolean().optional().describe('Include all a11y attrs.'),
    filePath: zod.string().optional().describe('Save to file instead.'),
  },
  // `request.params.verbose` は `boolean | undefined` として型付けされます。
  // `definePageTool` により `request.page` が存在します。
  handler: async (request, response) => {
    response.includeSnapshot({
      verbose: request.params.verbose ?? false,
      filePath: request.params.filePath,
    });
  },
});

注意点

  • zod.ZodRawShapeはコンパイルされたオブジェクトスキーマではなく、生のプロパティマップです。スキーマをzod.object(...)でラップするとオーバーロード一致が失われるため、ラップしないでください。
  • ランタイムスキーマウォーカー(ドキュメントやテレメトリー向け)は、ZodOptionalZodDefaultZodEffects_def.innerType / _def.schemaを再帰的にアンラップして処理する必要があります。そうしないと型を誤読みします。
  • ファクトリー変種ツール(args) => defは登録時にtypeof tool === 'function'で検出される必要があります。1つの配列内で遅延ツールと即座ツールを混在させると「tool.name is undefined」のバグが発生します。
  • ハンドラーシグネチャはPromise<void>に保ちます。レスポンスビルダーへの副作用がコントラクトです。値を返すことはビルダー抽象化がリークしていることを示す兆候です。

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
kjuhwa
リポジトリ
kjuhwa/skills-hub
ライセンス
MIT
最終更新
2026/4/26

Source: https://github.com/kjuhwa/skills-hub / ライセンス: MIT

本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: kjuhwa · kjuhwa/skills-hub · ライセンス: MIT