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>をname、description、annotations、schemaで定義します。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をチェックし、ハンドラー呼び出し前にページを解決します。 - 共通スキーマフラグメント(
pageIdSchema、timeoutSchema、viewportTransformのような変換)をエクスポートします。これにより、ツール間で正確な文言と検証が共有されます。
例
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(...)でラップするとオーバーロード一致が失われるため、ラップしないでください。- ランタイムスキーマウォーカー(ドキュメントやテレメトリー向け)は、
ZodOptional、ZodDefault、ZodEffectsを_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
関連スキル
agent-browser
AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。
anyskill
AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。
engram
AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。
skyvern
AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。
pinchbench
PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。
openui
OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。