developing-genkit-tooling について
developing-genkit-tooling は、Genkit の CLI コマンドや MCP ツールを開発するための実践ガイドです。命名規則、ランタイムとの連携方法、エラー処理を説明しています。
主な機能
- 01CLI サブコマンドの命名規則
- 02MCP ツールの命名規則
- 03静的ツールとランタイムツールの構成
- 04Genkit プロジェクトのランタイム連携パターン
- 05構造化されたエラー応答
活用シーン
- 01Genkit に CLI コマンドを追加
- 02プロジェクトランタイム用 MCP ツールの登録
- 03ドキュメント向け静的 MCP ツールの実装
MCP 対応
静的なドキュメントツールとプロジェクトランタイムを必要とするツールを含む、Genkit MCP ツールの構築方法を説明します。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ genkit-ai/ genkit --skill developing-genkit-toolingインストール後、Claude Code で/developing-genkit-toolingを入力して読み込まれたか確認します。
詳細
Genkit ツールの開発
命名規則
命名に一貫性を持たせると、ユーザーやエージェントがツールを見つけやすくなります。
CLI コマンド
サブコマンドには、コロンで区切った ケバブケース を使用します。
- 形式:
noun:verbまたはcategory:action - 例:
flow:run、eval:run、init - 引数:コードではキャメルケース(
flowName)、ヘルプテキストでは標準形式(<flowName>)を使用します。
MCP ツール
MCP の標準に合わせ、ツール名には スネークケース を使用します。
- 形式:
verb_noun - 例:
list_flows、run_flow、list_genkit_docs、read_genkit_docs
CLI コマンドのアーキテクチャ
コマンドは commander を使用して cli/src/commands/ に実装します。
ランタイムとの連携
ほとんどのコマンドでは、ユーザーのプロジェクトのランタイムとの連携が必要です。runWithManager ユーティリティを使用して、ランタイムプロセスのライフサイクルを管理します。
import { runWithManager } from '../utils/manager-utils';
// ... command definition ...
.action(async (arg, options) => {
await runWithManager(await findProjectRoot(), async (manager) => {
// Interact with manager here
const result = await manager.runAction({ key: arg });
});
});
出力形式
- ログ出力:
@genkit-ai/tools-common/utilsのloggerを使用します。 - 機械可読形式:コマンドがデータを生成する場合は、JSON 出力またはファイルへの書き込みオプションを用意します。
- ストリーミング:操作がストリーミング(
flow:runなど)に対応している場合は、--streamフラグを用意し、出力を stdout にパイプします。
MCP ツールのアーキテクチャ
cli/src/mcp/ の MCP ツールは、静的 と ランタイム の 2 種類のパターンに従います。
静的ツール(ドキュメントなど)
これらのツールは、Genkit プロジェクトの実行中のコンテキストを必要としません。
- 登録:
defineDocsTool(server: McpServer) - 依存関係:
serverインスタンスのみです。 - 用途:ドキュメント、使用ガイド、グローバル設定。
ランタイムツール(フロー、ランタイム制御など)
これらのツールは、特定の Genkit プロジェクトのランタイムと連携します。
- 登録:
defineRuntimeTools(server: McpServer, options: McpToolOptions) - 依存関係:
manager(プロセスマネージャー)とprojectRootを含むoptionsが必要です。 - スキーマ:ツールが必要に応じて(複数プロジェクト環境など)
projectRoot引数を受け取れるよう、getCommonSchema(options.explicitProjectRoot, ...)を必ず使用します。
// Runtime tool definition pattern
server.registerTool(
'my_runtime_tool',
{
inputSchema: getCommonSchema(options.explicitProjectRoot, {
myArg: z.string(),
}),
},
async (opts) => {
// Resolve project root before action
const rootOrError = resolveProjectRoot(
options.explicitProjectRoot,
opts,
options.projectRoot
);
if (typeof rootOrError !== 'string') return rootOrError;
// access manager via options.manager
}
);
エラー処理
MCP ツールでは通常、エラーを例外としてスローするのではなく捕捉し、isError: true を指定したコンテンツブロックとして返します。これにより、クライアントは構造化されたエラーレスポンスを受け取れます。
try {
// operation
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
return {
isError: true,
content: [{ type: 'text', text: `Error: ${message}` }],
};
}
コメント
Markdown 対応