tools について
Agent のツール定義、設定バリエーションへの追加、検証を支援する LaunchDarkly のスキルです。プロバイダー別のスキーマ変換やツール呼び出しループも扱います。
主な機能
- 01JSON Schema によるツール定義
- 02設定バリエーションへのツール追加
- 03ツールと設定バリエーションの確認
- 04モデルプロバイダー向けスキーマ変換
- 05ツール呼び出しループの追跡と制限
活用シーン
- 01Agent に API やデータベース呼び出しを追加
- 02作成済みツールを設定バリエーションに追加
- 03ツールスキーマと設定の紐付けを確認
MCP 対応
リモートでホストされた LaunchDarkly MCP サーバーが必要です。そのツールを使って AI ツールの作成、追加、検証を行います。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ launchdarkly/ ai-tooling --skill toolsインストール後、Claude Code で/toolsを入力して読み込まれたか確認します。
同梱ファイルREADME.md
詳細
設定ツール
あなたは、ツール(関数呼び出し)を通じてエージェントに機能を追加する作業をガイドするスキルを使用しています。あなたの役割は、エージェントが何を行う必要があるかを特定し、ツール定義を作成し、それらをバリエーションにアタッチし、動作することを検証することです。
前提条件
このスキルを使用するには、リモートでホストされている LaunchDarkly MCP サーバーが環境内で設定されている必要があります。
必須の MCP ツール:
create-ai-tool-- スキーマを持つ新しいツール定義を作成しますupdate-ai-config-variation-- ツールを設定バリエーションにアタッチしますget-ai-config-- ツールがバリエーションにアタッチされていることを検証します
任意の MCP ツール:
list-ai-tools-- プロジェクト内の既存のツールを閲覧しますget-ai-tool-- 特定のツールのスキーマを検査します
基本原則
- 機能から始める: ツールを作成する前に、エージェントが何を行う必要があるかを考えます
- フレームワークが重要: LangGraph/CrewAI はしばしばスキーマを自動生成します。OpenAI SDK には手動のスキーマが必要です
- アタッチする前に作成する: ツールをバリエーションにアタッチするには、まずツールが存在している必要があります
- 検証する: エージェントは設定を取得してアタッチを確認します
- ワークフロー全体を完了する: 既存のツールを一覧表示することは discovery のステップであり、最終目標ではありません。一覧表示した後は、常に要求されたツールの作成、アタッチ、検証へと進んでください。探索しただけで止めないでください。
ワークフロー
ステップ 1: 必要な機能を特定する
エージェントは何ができるべきでしょうか?
- データベースへのクエリ、API の呼び出し、計算の実行、通知の送信
- コードベースに何が存在するかを確認する(API クライアント、関数)
- フレームワークを考慮する: LangGraph/LangChain はスキーマを自動生成します。直接 SDK を使う場合は手動のスキーマが必要です
ユーザーが最初に既存のツールを確認するよう求めた場合、またはどのようなツールが存在するかについてコードベースのコンテキストがない場合は、次の順序に正確に従ってください:
list-ai-tools-- 何が存在するかを探索するcreate-ai-tool-- 新しいツールを作成する(既存のものとは異なるキーを使用します)update-ai-config-variation-- それをアタッチするget-ai-config-- 検証する
何かを作成する前に、最初の ツール呼び出しとして list-ai-tools を呼び出してください。一覧表示だけで止めないでください -- 常に 4 つのステップすべてを進めてください。
ステップ 2: ツールを作成する
create-ai-tool を次の内容で使用します:
key-- ツールの一意の識別子description-- 明確な説明(LLM はこれを使ってツールをいつ呼び出すかを判断します)schema-- 生の JSON Schema(OpenAI の関数呼び出しラッパーは使用しないでください):
{
"type": "object",
"properties": {
"query": {"type": "string", "description": "Search query"},
"limit": {"type": "integer", "default": 10}
},
"required": ["query"]
}
ステップ 3: バリエーションにアタッチする
update-ai-config-variation を使用してツールをアタッチします。tools フィールドのみを渡してください。 ユーザーが明示的にそれらのフィールドも更新するよう求めていない限り、この PATCH に instructions、messages、model、parameters を含めないでください。これらのフィールドは、バリエーションが作成された後に LaunchDarkly UI で編集されている可能性があり、ツールをアタッチする PATCH にそれらを含めると、UI での編集を黙って上書きしてしまいます。
{
"projectKey": "my-project",
"configKey": "support-chatbot",
"variationKey": "default",
"tools": [
{"key": "search-knowledge-base", "version": 1}
]
}
ツールをアタッチすると他のフィールドが消去されるという UI クリアのバグが発生した場合、以前の get-ai-config レスポンスからそれらのフィールドを再送信して回避しないでください — それはバグを覆い隠し、ユーザーがその後編集した古い値を復活させる可能性があります。代わりにバグを報告してください。
ステップ 4: 検証する
get-ai-toolを使用して、ツールが有効なスキーマで存在することを確認しますget-ai-configを使用して、ツールがバリエーションにアタッチされていることを確認します(バリエーションの出力内のtoolsを確認してください)
結果を報告する:
- ツールが有効なスキーマで作成された
- ツールがバリエーションにアタッチされた
- 問題があれば報告する
呼び出し箇所におけるプロバイダーごとのスキーマ
LaunchDarkly はツールスキーマを 1 か所に保存します。それは create-ai-tool に渡したフラットな {type, name, description, parameters} 形式です。アプリケーションはこれを config.model.parameters.tools (completion モード) または agent_config.model.parameters.tools (agent モード) を介して読み戻し、プロバイダー SDK が期待する形式に変換します。LaunchDarkly がプロバイダー呼び出しを行うことはありません。それはあなたのコードが行います。各ツールを実装するハンドラーもアプリケーションコード内に残ります。LaunchDarkly はスキーマを保存し、あなたのアプリケーションが動作を担います。
| プロバイダー / フレームワーク | 目標とする形式 | 呼び出し時の配置先 |
|---|---|---|
| OpenAI Chat Completions (直接 SDK) | {type: "function", function: {name, description, parameters}} | トップレベルの tools=[...] |
| Anthropic 直接 SDK | {name, description, input_schema} — parameters → input_schema に名前変更 | トップレベルの tools=[...] |
| Bedrock Converse | {toolSpec: {name, description, inputSchema: {json: parameters}}} | toolConfig.tools=[...] の内部 |
Gemini (google-genai) | {function_declarations: [{name, description, parameters}]} (Python) / {functionDeclarations: [...]} (Node) | GenerateContentConfig.tools=[...] |
| OpenAI Responses API | LaunchDarkly のフラットな形式がそのまま通過します | トップレベルの tools=[...] |
| LangChain / LangGraph | createLangChainModel(config) (Node) / create_langchain_model(config) (Python) を使用し、ai_config.tools (または独自の StructuredTool リスト) を bind_tools(...) / create_react_agent(tools=[...]) に渡します | フレームワークネイティブ。呼び出しごとの変換は不要 |
| Strands Agents | LaunchDarkly のフラットな形式。Strands のモデルクラス (AnthropicModel、OpenAIModel) にパラメーターを渡す前に parameters.tools を外します — Python の @tool デコレートされた呼び出し可能オブジェクトはコード内に残ります | Agent(tools=[...]) コンストラクター。呼び出しごとの変換は不要 |
最小限の変換スニペット (Python):
ld_tools = (ai_config.model.to_dict().get("parameters") or {}).get("tools", []) or []
# OpenAI Chat Completions
openai_tools = [
{
"type": "function",
"function": {
"name": t["name"],
"description": t.get("description", ""),
"parameters": t.get("parameters", {"type": "object", "properties": {}}),
},
}
for t in ld_tools
]
# Anthropic
anthropic_tools = [
{
"name": t["name"],
"description": t.get("description", ""),
"input_schema": t.get("parameters", {"type": "object", "properties": {}}),
}
for t in ld_tools
]
# Bedrock Converse
bedrock_tool_config = {
"tools": [
{
"toolSpec": {
"name": t["name"],
"description": t.get("description", ""),
"inputSchema": {"json": t.get("parameters", {"type": "object", "properties": {}})},
}
}
for t in ld_tools
]
}
# Gemini
gemini_tools = [
{
"function_declarations": [
{
"name": t["name"],
"description": t.get("description", ""),
"parameters": t.get("parameters", {"type": "object", "properties": {}}),
}
for t in ld_tools
]
}
] if ld_tools else []
ツール呼び出しを伴うエージェントループ
ツールを使用するエージェントは短いループを実行します。プロバイダーを呼び出し、ツール呼び出しをディスパッチし、再びループし、プロバイダーが最終的な回答を返したら停止します。プロバイダーに関係なく、次の 3 つのルールが適用されます。
- ループを制限します。
MAX_STEPS = 5が安全なデフォルトです。暴走するツールループはほとんど常にプロンプトまたはスキーマのバグであり、50 回の反復を必要とするケースではありません。 - すべてのツール呼び出しを追跡します。 エージェントが実際に実行する各ツールに対して
tracker.track_tool_call(tool_name)/tracker.trackToolCall(toolName)を呼び出します。これが Monitoring タブでツール使用量としてカウントされるものです。 - プロバイダーの「これ以上ツール呼び出しがない」というシグナルで中断します。 正確なシグナルはプロバイダーごとに異なります。OpenAI Chat Completions →
choice.finish_reason != "tool_calls"、Anthropic →response.stop_reason != "tool_use"、Bedrock Converse →response["stopReason"] != "tool_use"、Gemini →response.function_callsが空、OpenAI Responses API →response.outputにfunction_call項目がない。
スケルトン (Python、Anthropic — 他のプロバイダーもそれぞれの停止理由チェックとツール結果のフォーマットで同じ形に従います):
messages = [{"role": "user", "content": initial_input}]
MAX_STEPS = 5
for _ in range(MAX_STEPS):
response = tracker.track_metrics_of(
anthropic_metrics,
lambda: anthropic_client.messages.create(
model=agent.model.name,
system=agent.instructions,
messages=messages,
tools=anthropic_tools,
**params,
),
)
if response.stop_reason != "tool_use":
break
messages.append({"role": "assistant", "content": response.content})
tool_results = []
for block in response.content:
if block.type != "tool_use":
continue
if block.name not in tool_handlers:
raise ValueError(f"Unknown tool: {block.name}")
result = tool_handlers[block.name](**block.input)
tracker.track_tool_call(block.name)
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result,
})
messages.append({"role": "user", "content": tool_results})
プロバイダーごとのツール呼び出しペイロードの形式は built-in-metrics のリファレンスにあります。
- openai-tracking.md — Chat Completions + Responses API
- anthropic-tracking.md —
tool_useブロックとtool_resultペイロード - bedrock-tracking.md —
toolUse/toolResultConverse 形式 - gemini-tracking.md —
functionCalls/functionResponseパート - langchain-tracking.md — LangGraph のツールループは
create_react_agentから継承します
オーケストレーターへの注意
LangGraph、CrewAI、AutoGen は多くの場合、関数定義からスキーマを生成します。SDK が何を利用できるかを把握できるように、LaunchDarkly でツールを作成し、キーをバリエーションにアタッチする必要があります。
エッジケース
| 状況 | 対応 |
|---|---|
| ツールがすでに存在する (409) | 既存のものを使用するか、別のキーで作成します |
| スキーマが無効 | 生の JSON Schema 形式 (type: object, properties, required) を使用します |
| 誤ったエンドポイントを想定 | ツールは /ai-tools を使用します。/ai-configs/tools ではありません |
やってはいけないこと
- 設定の作成中にツールをアタッチしようとしないでください -- バリエーションを後から更新します
- 明確なツールの説明を省略しないでください (LLM がいつ呼び出すかを判断するために必要です)
- バリエーションを更新した後にアタッチを検証することを忘れないでください
instructions、messages、model、またはparametersをツールアタッチの PATCH にまとめないでください。ユーザーが明示的に複数フィールドの更新を求めない限り、toolsのみを送信してください -- まとめた PATCH は他のフィールドに対する UI での編集を黙って上書きします。
関連スキル
configs-create-- ツールをアタッチする前に設定を作成しますconfigs-variations-- 異なるツールセットを持つバリエーションを管理します