createTool()
createTool() 関数は、Mastra Agent が実行できるカスタム Tool を定義するために使用します。Tool を使うと、外部システムとの連携、計算の実行、特定データへのアクセスが可能になり、Agent の機能を拡張できます。
使用例使用例への直接リンク
import { createTool } from '@mastra/core/tools'
import { z } from 'zod'
export const weatherTool = createTool({
id: 'weather-tool',
description: 'Get the current weather for a location',
inputSchema: z.object({
location: z.string(),
}),
outputSchema: z.object({
location: z.string(),
temperatureCelsius: z.number(),
conditions: z.string(),
}),
execute: async ({ location }) => {
return {
location,
temperatureCelsius: 21,
conditions: 'sunny',
}
},
})
execute の第1パラメーターは、inputSchema で検証済みの値です。{ location } のように、関数シグネチャでスキーマのフィールドを直接分割代入します。省略可能な第2パラメーターには実行コンテキストが渡されます。
パラメーターパラメーターへの直接リンク
id:
description:
inputSchema?:
execute 関数に渡す入力パラメーターを定義する Standard JSON Schema。outputSchema?:
execute 関数が返す出力構造を定義する Standard JSON Schema。strict?:
toModelOutput?:
execute 出力をモデルへ返す前に変換する省略可能な関数。アプリケーションコードには完全な生の出力を保持したまま、text、json、content 形式の出力(画像やファイルなどのマルチモーダルパートを含む)をモデルへ返すために使用します。transform?:
input、inputDelta、output、error、approval、suspend、resume などのフェーズに対して display と transcript の変換を設定します。suspendSchema?:
suspend() に渡すペイロードの構造を定義する Standard JSON Schema。Tool が実行を一時停止すると、このペイロードがクライアントに返されます。resumeSchema?:
resumeData の構造を定義する Standard JSON Schema。autoResumeSuspendedTools が有効な場合、Agent がユーザーメッセージからデータを抽出するために使用します。requireApproval?:
tool-call-approval チャンクを生成し、承認または拒否されるまで一時停止します。mcp?:
annotations(title、readOnlyHint、destructiveHint、idempotentHint、openWorldHint など、Tool の動作に関するヒント)と _meta(MCP クライアントへ渡す任意のメタデータ)を含みます。requestContextSchema?:
providerOptions?:
anthropic や openai などの Provider 名で、値は Provider 固有の設定オブジェクトです。inputExamples?:
background?:
execute?:
execute を指定しますが、別の場所で実行または適合される Tool 定義では、型として省略できます。inputSchema に基づいて検証された入力データ(第1パラメーター)と、requestContext、abortSignal などの実行メタデータを含む実行コンテキストオブジェクト(第2パラメーター)を受け取ります。input:
context?:
requestContext?:
abortSignal?:
agent?:
workflow?:
mcp?:
observe:
span は関数を直接実行し、log は何もしません。onInputStart?:
(options: ToolCallOptions) => void | PromiseLike<void>。onInputDelta?:
({ inputTextDelta, ...options }: { inputTextDelta: string } & ToolCallOptions) => void | PromiseLike<void>。onInputAvailable?:
({ input, ...options }: { input: TSchemaIn } & ToolCallOptions) => void | PromiseLike<void>。onOutput?:
({ output, toolName, ...options }: { output: TSchemaOut; toolName: string } & Omit<ToolCallOptions, 'messages'>) => void | PromiseLike<void>。mastra や mcpMetadata など Runtime によって設定されるフィールドはソースの型に含まれますが、Mastra または MCP アダプターによって設定されます。通常の createTool() の使用では設定する必要はありません。
戻り値戻り値への直接リンク
createTool() 関数は Tool オブジェクトを返します。
Tool:
スキーマの定義スキーマの定義への直接リンク
Tool の inputSchema と outputSchema は、Standard JSON Schema をサポートする任意のライブラリで定義できます。Zod、Valibot、ArkType などが該当します。
- Zod
- Valibot
- ArkType
import { createTool } from '@mastra/core/tools'
import { z } from 'zod'
export const weatherTool = createTool({
id: 'weather-tool',
description: 'Fetches weather for a location',
inputSchema: z.object({
location: z.string(),
}),
outputSchema: z.object({
location: z.string(),
temperatureCelsius: z.number(),
conditions: z.string(),
}),
execute: async ({ location }) => {
return { location, temperatureCelsius: 21, conditions: 'sunny' }
},
})
import { createTool } from '@mastra/core/tools'
import * as v from 'valibot'
import { toStandardJsonSchema } from '@valibot/to-json-schema'
export const weatherTool = createTool({
id: 'weather-tool',
description: 'Fetches weather for a location',
inputSchema: toStandardJsonSchema(
v.object({
location: v.string(),
}),
),
outputSchema: toStandardJsonSchema(
v.object({
location: v.string(),
temperatureCelsius: v.number(),
conditions: v.string(),
}),
),
execute: async ({ location }) => {
return { location, temperatureCelsius: 21, conditions: 'sunny' }
},
})
import { createTool } from '@mastra/core/tools'
import { type } from 'arktype'
export const weatherTool = createTool({
id: 'weather-tool',
description: 'Fetches weather for a location',
inputSchema: type({
location: 'string',
}),
outputSchema: type({
location: 'string',
temperatureCelsius: 'number',
conditions: 'string',
}),
execute: async ({ location }) => {
return { location, temperatureCelsius: 21, conditions: 'sunny' }
},
})
厳密な Tool 入力を使用する例厳密な Tool 入力を使用する例への直接リンク
対応するモデル Provider に Tool スキーマと完全に一致する Tool 引数を生成させる場合は、strict: true を設定します。
import { createTool } from '@mastra/core/tools'
import { z } from 'zod'
export const weatherTool = createTool({
id: 'weather-tool',
description: 'Get the current weather for a location',
strict: true,
inputSchema: z.object({
location: z.string(),
}),
outputSchema: z.object({
location: z.string(),
temperatureCelsius: z.number(),
conditions: z.string(),
}),
execute: async ({ location }) => {
return {
location,
temperatureCelsius: 21,
conditions: 'sunny',
}
},
})
Mastra は、厳密な Tool 呼び出しに対応するモデルアダプターへ strict: true を転送します。対応していないアダプターでは、このオプションは無視されます。
toModelOutput を使用する例example-with-tomodeloutputへの直接リンク
Tool からアプリへは情報量の多い内部データを返し、モデルへは単純化した値またはマルチモーダルコンテンツを渡す場合に、toModelOutput を使用します。
import { createTool } from '@mastra/core/tools'
import { z } from 'zod'
export const weatherTool = createTool({
id: 'weather-tool',
description: 'Get the current weather for a location',
inputSchema: z.object({
location: z.string(),
}),
outputSchema: z.object({
location: z.string(),
temperatureCelsius: z.number(),
conditions: z.string(),
radarImageUrl: z.string().url(),
}),
execute: async ({ location }) => ({
location,
temperatureCelsius: 21,
conditions: 'sunny',
radarImageUrl: 'https://example.com/radar/seattle.png',
}),
toModelOutput: output => {
return {
type: 'content',
value: [
{
type: 'text',
text: `${output.location}: ${output.temperatureCelsius}°C and ${output.conditions}`,
},
{ type: 'image-url', url: output.radarImageUrl },
],
}
},
})
Tool は完全な execute の結果をアプリケーションに返し、モデルは変換後の toModelOutput の値を受け取ります。
toModelOutput は次の形式を返せます。
type: 'text'type: 'json'text、image-url、image-data、file-url、file-data、file-id、image-file-id、customなどのパートを持つtype: 'content'
transform を使用する例example-with-transformへの直接リンク
Runtime の動作には生の入力または出力を保持しながら、表示ストリームや Transcript メッセージには、より小さく安全な形式を渡す場合に transform を使用します。
import { createTool } from '@mastra/core/tools'
import { z } from 'zod'
export const customerTool = createTool({
id: 'lookup-customer',
description: 'Looks up a customer',
inputSchema: z.object({
customerId: z.string(),
internalPath: z.string(),
}),
outputSchema: z.object({
displayName: z.string(),
apiKey: z.string(),
debugScore: z.number(),
}),
execute: async () => {
return {
displayName: 'Acme',
apiKey: 'secret-value',
debugScore: 0.97,
}
},
transform: {
display: {
input: ({ input }) => ({ customerId: input?.customerId }),
output: ({ output }) => ({ displayName: output?.displayName }),
error: () => ({ message: 'Customer lookup failed' }),
},
transcript: {
input: ({ input }) => ({ customerId: input?.customerId }),
output: ({ output }) => ({ displayName: output?.displayName }),
error: () => ({ message: 'Customer lookup failed' }),
},
},
})
Tool は生の inputSchema の値を受け取り、生の execute の結果を返します。Mastra は、ストリーミングされる UI ペイロードに display の変換を、ユーザーに表示される Transcript メッセージに transcript の変換を適用します。
MCP アノテーションを使用する例MCP アノテーションを使用する例への直接リンク
MCP(Model Context Protocol)経由で Tool を公開する場合、Tool の動作を説明し、クライアントでの表示方法をカスタマイズするためのアノテーションを追加できます。これらの MCP 固有プロパティは mcp プロパティにまとめられます。
import { createTool } from '@mastra/core/tools'
import { z } from 'zod'
export const weatherTool = createTool({
id: 'weather-tool',
description: 'Get the current weather for a location',
inputSchema: z.object({
location: z.string().describe('City name or coordinates'),
}),
outputSchema: z.object({
location: z.string(),
temperatureCelsius: z.number(),
conditions: z.string(),
}),
// MCP-specific properties
mcp: {
// Annotations for client behavior hints
annotations: {
title: 'Weather Lookup', // Human-readable display name
readOnlyHint: true, // Tool doesn't modify environment
destructiveHint: false, // Tool doesn't perform destructive updates
idempotentHint: true, // Same args = same result
openWorldHint: true, // Interacts with external API
},
// Custom metadata for client-specific functionality
_meta: {
version: '1.0.0',
category: 'weather',
},
},
execute: async ({ location }) => {
return {
location,
temperatureCelsius: 21,
conditions: 'sunny',
}
},
})
Tool のライフサイクルフックTool のライフサイクルフックへの直接リンク
Tool は、実行の各段階を監視し、対応できるライフサイクルフックをサポートしています。これらのフックは、ストリーミング中のログ記録、分析、検証、リアルタイム更新に特に役立ちます。
次の例は、すべてのライフサイクルフックを設定した Tool を示しています。
import { createTool } from '@mastra/core/tools'
import { z } from 'zod'
export const weatherTool = createTool({
id: 'weather-tool',
description: 'Get the current weather for a location',
inputSchema: z.object({
location: z.string(),
}),
outputSchema: z.object({
location: z.string(),
temperatureCelsius: z.number(),
conditions: z.string(),
}),
execute: async ({ location }) => {
return {
location,
temperatureCelsius: 21,
conditions: 'sunny',
}
},
onInputStart: ({ toolCallId }) => {
console.log(`Tool call ${toolCallId} input started`)
},
onInputDelta: ({ inputTextDelta, toolCallId }) => {
console.log(`Tool call ${toolCallId} received input chunk: ${inputTextDelta}`)
},
onInputAvailable: ({ input, toolCallId }) => {
console.log(`Tool call ${toolCallId} received location: ${input.location}`)
},
onOutput: ({ output, toolCallId, toolName }) => {
console.log(`Tool ${toolName} call ${toolCallId} returned conditions: ${output.conditions}`)
},
})
利用可能なフック利用可能なフックへの直接リンク
onInputStartoninputstartへの直接リンク
Tool 呼び出しの入力ストリーミングが開始されたとき、入力データを受信する前に呼び出されます。
export const tool = createTool({
id: 'example-tool',
description: 'Example tool with hooks',
onInputStart: ({ toolCallId, messages, abortSignal }) => {
console.log(`Tool ${toolCallId} input streaming started`)
},
})
onInputDeltaoninputdeltaへの直接リンク
ストリーミングされる入力テキストの増分チャンクごとに呼び出されます。リアルタイムの進行状況の表示や、部分的な JSON の解析に役立ちます。
export const tool = createTool({
id: 'example-tool',
description: 'Example tool with hooks',
onInputDelta: ({ inputTextDelta, toolCallId, messages, abortSignal }) => {
console.log(`Received input chunk: ${inputTextDelta}`)
},
})
onInputAvailableoninputavailableへの直接リンク
Tool の完全な入力が利用可能になり、解析され、inputSchema に対して検証されたときに呼び出されます。
export const tool = createTool({
id: 'example-tool',
description: 'Example tool with hooks',
inputSchema: z.object({
location: z.string(),
}),
onInputAvailable: ({ input, toolCallId, messages, abortSignal }) => {
console.log(`Tool received complete input:`, input)
// input is fully typed based on inputSchema
},
})
onOutputonoutputへの直接リンク
Tool が正常に実行され、出力を返した後に呼び出されます。結果のログ記録、後続処理のトリガー、分析に役立ちます。
export const tool = createTool({
id: 'example-tool',
description: 'Example tool with hooks',
outputSchema: z.object({
result: z.string(),
}),
execute: async input => {
return { result: 'Success' }
},
onOutput: ({ output, toolCallId, toolName, abortSignal }) => {
console.log(`${toolName} execution completed:`, output)
// output is fully typed based on outputSchema
},
})
フックの実行順序フックの実行順序への直接リンク
一般的な Tool のストリーミング呼び出しでは、フックは次の順序で呼び出されます。
- onInputStart: 入力ストリーミングを開始
- onInputDelta: チャンクを受信するたびに複数回呼び出し
- onInputAvailable: 完全な入力を解析、検証
- Tool の execute 関数を実行
- onOutput: Tool が正常に完了
フックのパラメーターフックのパラメーターへの直接リンク
フックのコールバックは、ソースで定義された次の形式のパラメーターを受け取ります。
onInputStart:toolCallId、messages、abortSignalなどのフィールドを含むToolCallOptionsを受け取ります。onInputDelta:{ inputTextDelta: string } & ToolCallOptionsを受け取ります。onInputAvailable:{ input: TSchemaIn } & ToolCallOptionsを受け取ります。inputの型はinputSchemaから決まります。onOutput:{ output: TSchemaOut; toolName: string } & Omit<ToolCallOptions, 'messages'>を受け取ります。outputの型はoutputSchemaから決まります。このフックはmessagesを受け取りません。
エラー処理エラー処理への直接リンク
フックのエラーは自動的に捕捉、記録され、Tool の実行は継続します。フックがエラーをスローした場合、コンソールに記録されますが、Tool 呼び出しが失敗することはありません。
MCP Tool のアノテーションMCP Tool のアノテーションへの直接リンク
Model Context Protocol(MCP)経由で Tool を公開する場合、Tool の動作を説明するアノテーションを指定できます。これらのアノテーションにより、OpenAI Apps SDK などの MCP クライアントは Tool の表示方法と処理方法を判断できます。
MCP 固有のプロパティは mcp プロパティにまとめられ、annotations と _meta が含まれます。
mcp: {
annotations: { /* behavior hints */ },
_meta: { /* custom metadata */ },
}
ToolAnnotations のプロパティtoolannotations-propertiesへの直接リンク
title?:
readOnlyHint?:
destructiveHint?:
idempotentHint?:
openWorldHint?:
これらのアノテーションは MCP 仕様に準拠し、MCP 経由で Tool が一覧表示されるときにそのまま渡されます。