メインコンテンツへ移動

リクエストコンテキスト

Agent、Tool、Workflow はいずれも RequestContext をパラメーターとして受け取ることができ、基盤となるプリミティブでリクエスト固有の値を利用できます。

RequestContext を使用する場面
when-to-use-requestcontextへの直接リンク

実行時の条件に応じてプリミティブの動作を変更する必要がある場合に、RequestContext を使用します。たとえば、ユーザー属性に基づいてモデルやストレージバックエンドを切り替えたり、言語に基づいて指示や Tool の選択を調整したりできます。

注記

RequestContext は主に、特定のリクエストへデータを渡すために使用します。複数の呼び出しにわたる会話履歴と状態の永続化を処理する Agent Memory とは異なります。

値の設定
値の設定への直接リンク

Agent、Network、Workflow、または Tool の呼び出しに requestContext を渡すと、実行中に基盤となるすべてのプリミティブで値を利用できます。呼び出しを行う前に .set() を使用して値を定義します。

.set() メソッドは 2 つの引数を取ります。

  1. キー: 値を識別するために使用する名前。
  2. : そのキーに関連付けるデータ。
import { RequestContext } from '@mastra/core/request-context'

export type UserTier = {
'user-tier': 'enterprise' | 'pro'
}

const requestContext = new RequestContext<UserTier>()
requestContext.set('user-tier', 'enterprise')

const agent = mastra.getAgent('weatherAgent')
await agent.generate("What's the weather in London?", {
requestContext,
})

const routingAgent = mastra.getAgent('routingAgent')
routingAgent.network("What's the weather in London?", {
requestContext,
})

const run = await mastra.getWorkflow('weatherWorkflow').createRun()
await run.start({
inputData: {
location: 'London',
},
requestContext,
})
await run.resume({
resumeData: {
city: 'New York',
},
requestContext,
})

await weatherTool.execute({ location: 'London' }, { requestContext })

リクエストヘッダーに基づく値の設定
リクエストヘッダーに基づく値の設定への直接リンク

ランタイムサーバーのミドルウェアでは、リクエストから情報を抽出して requestContext に値を設定できます。この例では、ユーザーのロケールに合ったレスポンスを返すため、Cloudflare の CF-IPCountry ヘッダーに基づいて temperature-unit を設定します。

src/mastra/index.ts
import { Mastra } from '@mastra/core'
import { RequestContext } from '@mastra/core/request-context'
import { testWeatherAgent } from './agents/test-weather-agent'

export const mastra = new Mastra({
agents: { testWeatherAgent },
server: {
middleware: [
async (context, next) => {
const country = context.req.header('CF-IPCountry')
const requestContext = context.get('requestContext')

requestContext.set('temperature-unit', country === 'US' ? 'fahrenheit' : 'celsius')

await next()
},
],
},
})

サーバーミドルウェアの使用方法については、ミドルウェアを参照してください。

Studio
Studioへの直接リンク

ローカルでの開発時には、JSON ファイルでプリセットを定義し、--request-context-presets CLI フラグを使用して Studio に読み込めます。これにより Studio のリクエストコンテキストエディターにドロップダウンが追加され、毎回 JSON を手動で編集せずに設定をすばやく切り替えられます。

mastra dev --request-context-presets ./presets.json
presets.json
{
"development": { "userId": "dev-user", "env": "development" },
"production": { "userId": "prod-user", "env": "production" }
}

ドロップダウンからプリセットを選択すると、JSON エディターにそのプリセットの値が入力されます。JSON を手動で編集すると、ドロップダウンは 「Custom」 に戻ります。

Agent での値へのアクセス
Agent での値へのアクセスへの直接リンク

Agent でサポートされている任意の設定オプションから requestContext 引数にアクセスできます。これらの関数は同期または async にできます。requestContext から値を読み取るには .get() メソッドを使用します。

src/mastra/agents/weather-agent.ts
export type UserTier = {
'user-tier': 'enterprise' | 'pro'
}

export const weatherAgent = new Agent({
id: 'weather-agent',
name: 'Weather Agent',
instructions: async ({ requestContext }) => {
const userTier = requestContext.get('user-tier') as UserTier['user-tier']

if (userTier === 'enterprise') {
}
},
model: ({ requestContext }) => {},
tools: ({ requestContext }) => {},
memory: ({ requestContext }) => {},
})

agentsworkflowsscorersinputProcessorsoutputProcessors などのほかのオプションでも requestContext を使用できます。

動的な指示
動的な指示への直接リンク

Agent の指示は非同期関数として指定できるため、実行時にプロンプトを解決できます。requestContext と組み合わせることで、次のようなパターンを実現できます。

  • パーソナライズ: ユーザーの属性、設定、またはティアに基づいて指示を調整する
  • ローカライズ: ロケールに基づいて口調、言語、または動作を調整する
  • A/B テスト: 実験のために異なるプロンプトのバリエーションを提供する
  • 外部プロンプト管理: 再デプロイせずにレジストリサービスからプロンプトを取得する
src/mastra/agents/dynamic-agent.ts
import { Agent } from '@mastra/core/agent'

export const dynamicAgent = new Agent({
id: 'dynamic-agent',
name: 'Dynamic Agent',
instructions: async ({ requestContext }) => {
const userTier = requestContext?.get('user-tier')
const locale = requestContext?.get('locale')

// Personalize based on user tier
const basePrompt =
userTier === 'enterprise'
? 'You are a premium support agent. Provide detailed, thorough responses with technical depth.'
: 'You are a helpful assistant. Be concise and friendly.'

// Localize behavior
const localeInstructions = locale === 'ja' ? 'Respond in Japanese using formal keigo.' : ''

return `${basePrompt} ${localeInstructions}`.trim()
},
model: 'openai/gpt-5.6-sol',
})

プロンプトレジストリからの取得
プロンプトレジストリからの取得への直接リンク

組織でプロンプトを一元管理するためにプロンプトレジストリサービスを使用している場合は、実行時に指示を取得できます。再デプロイせずにプロンプトを更新し、バリエーションを使った実験を実行できるほか、Agent 全体でのプロンプト使用状況を追跡できます。

src/mastra/agents/registry-agent.ts
import { Agent } from '@mastra/core/agent'

// Your prompt registry client
import { promptRegistry } from '../lib/prompt-registry'

export const registryAgent = new Agent({
id: 'registry-agent',
name: 'Registry Agent',
instructions: async ({ requestContext }) => {
const prompt = await promptRegistry.getPrompt({
promptId: 'customer-support-agent',
// Pass context for variant selection or tracking
variant: requestContext?.get('experiment-variant'),
userId: requestContext?.get('user-id'),
})

return prompt.content
},
model: 'openai/gpt-5.6-sol',
})

設定オプションの全一覧については、Agentを参照してください。

Workflow ステップでの値へのアクセス
Workflow ステップでの値へのアクセスへの直接リンク

Workflow ステップの execute 関数から requestContext 引数にアクセスできます。この関数は同期または非同期にできます。requestContext から値を読み取るには .get() メソッドを使用します。

src/mastra/workflows/weather-workflow.ts
export type UserTier = {
'user-tier': 'enterprise' | 'pro'
}

const stepOne = createStep({
id: 'step-one',
execute: async ({ requestContext }) => {
const userTier = requestContext.get('user-tier') as UserTier['user-tier']

if (userTier === 'enterprise') {
}
},
})

設定オプションの全一覧については、createStep()を参照してください。

Tool での値へのアクセス
Tool での値へのアクセスへの直接リンク

Tool の execute 関数から requestContext 引数にアクセスできます。この関数は async です。requestContext から値を読み取るには .get() メソッドを使用します。

src/mastra/tools/weather-tool.ts
export type UserTier = {
'user-tier': 'enterprise' | 'pro'
}

export const weatherTool = createTool({
id: 'weather-tool',
execute: async (inputData, context) => {
const userTier = context?.requestContext?.get('user-tier') as UserTier['user-tier'] | undefined

if (userTier === 'enterprise') {
}
},
})

設定オプションの全一覧については、createTool()を参照してください。

予約済みキー
予約済みキーへの直接リンク

Mastra はセキュリティのために特別なコンテキストキーを予約しています。これらのキーが設定されている場合、クライアントが指定した値より優先されます。サーバーは所有権を自動的に検証し、ユーザーが所有していないリソースへアクセスしようとすると 403 エラーを返します。

MASTRA_RESOURCE_ID_KEY を設定する最も簡単な方法は、認証設定で mapUserToResourceId コールバックを使用することです。

auth: {
authenticateToken: async token => verifyToken(token),
mapUserToResourceId: user => user.id,
}

この方法でリソース ID を導出すると、クライアントは Agent の generate および stream リクエストボディから memory.resource を省略でき、代わりにサーバーが導出した値が使用されます(クライアントが指定した値より常に優先されます)。リクエストが Memory を使用しており、ボディにもリクエストコンテキストにもリソース ID が指定されていない場合、サーバーは 400 エラーを返します。

ミドルウェアでこれらのキーを手動で設定することもできます。

import { MASTRA_RESOURCE_ID_KEY, MASTRA_THREAD_ID_KEY } from '@mastra/core/request-context'

// In middleware: force memory operations to use authenticated user's ID
requestContext.set(MASTRA_RESOURCE_ID_KEY, user.id)

// In middleware: set validated thread ID
requestContext.set(MASTRA_THREAD_ID_KEY, threadId)
キー目的
MASTRA_RESOURCE_ID_KEYすべての Memory 操作でこのリソース ID を強制的に使用します。サーバーは、アクセスされたスレッドがこのリソースに属することを検証し、属していない場合は 403 を返します。
MASTRA_THREAD_ID_KEYクライアントが指定した値を上書きし、スレッド操作でこのスレッド ID を強制的に使用します。

これらのキーは、マルチテナントアプリケーションでユーザーを分離するために使用します。使用例については、認可ミドルウェアを参照してください。

TypeScript サポート
TypeScript サポートへの直接リンク

RequestContext に型パラメーターを指定すると、すべてのメソッドに完全な型が付与されます。

import { RequestContext } from '@mastra/core/request-context'

type MyContext = {
userId: string
maxTokens: number
isPremium: boolean
}

const ctx = new RequestContext<MyContext>()

// set() enforces correct value types
ctx.set('userId', 'user-123') // ✓ valid
ctx.set('maxTokens', 4096) // ✓ valid
ctx.set('maxTokens', 'wrong') // ✗ TypeScript error: expected number

// get() returns the correct type automatically
const tokens = ctx.get('maxTokens') // inferred as number
const id = ctx.get('userId') // inferred as string

// keys() returns typed keys
for (const key of ctx.keys()) {
// key is "userId" | "maxTokens" | "isPremium"
}

// entries() supports type narrowing
for (const [key, value] of ctx.entries()) {
if (key === 'maxTokens') {
// TypeScript knows value is number here
console.log(value.toFixed(2))
}
if (key === 'userId') {
// TypeScript knows value is string here
console.log(value.toUpperCase())
}
}

スキーマ検証
スキーマ検証への直接リンク

requestContextSchema を使用して、実行時にリクエストコンテキストの値を検証する Standard JSON SchemaZodValibotArkType など)を定義します。これにより、欠落または無効なコンテキスト値を早期に検出して明確なエラーメッセージを提供できるほか、コンポーネント内で型推論を利用できます。

Agent のスキーマ検証
Agent のスキーマ検証への直接リンク

Agent に requestContextSchema を定義すると、generate() または stream() の開始時にコンテキストが検証されます。検証に失敗した場合、LLM が呼び出される前に Agent が MastraError をスローします。

src/mastra/agents/validated-agent.ts
import { Agent } from '@mastra/core/agent'
import { z } from 'zod'

export const validatedAgent = new Agent({
id: 'validated-agent',
name: 'Validated Agent',
requestContextSchema: z.object({
userId: z.string(),
apiKey: z.string(),
}),
instructions: ({ requestContext }) => {
// Access all values as a typed object
const { userId, apiKey } = requestContext.all
// { userId: string; apiKey: string }

// Or retrieve individual values with .get()
const id = requestContext.get('userId')
// string

return `You are helping user ${userId}`
},
model: 'openai/gpt-5.6-sol',
})

検証に失敗すると、エラーには Agent ID と、失敗したフィールドの詳細が含まれます。

Request context validation failed for agent 'validated-agent':
- apiKey: Required

Tool のスキーマ検証
Tool のスキーマ検証への直接リンク

Tool に requestContextSchema を定義すると、execute() の実行前にコンテキストが検証されます。Agent とは異なり、Tool は例外をスローせず、検証エラーオブジェクトを返します。

src/mastra/tools/validated-tool.ts
import { createTool } from '@mastra/core/tools'
import { z } from 'zod'

export const validatedTool = createTool({
id: 'validated-tool',
description: 'A tool that requires authenticated context',
inputSchema: z.object({
query: z.string(),
}),
requestContextSchema: z.object({
userId: z.string(),
}),
execute: async (inputData, context) => {
// Access all values as a typed object
const { userId } = context.requestContext?.all ?? {}
// { userId: string }

// Or retrieve individual values with .get()
const id = context.requestContext?.get('userId')
// string | undefined

return { result: `Processed for ${userId}` }
},
})

検証に失敗すると、Tool は例外をスローせず、エラーオブジェクトを返します。

{
"error": true,
"message": "Request context validation failed for validated-tool. Please fix the following errors and try again:\n- userId: Required\n\nProvided context: {}"
}

Workflow のスキーマ検証
Workflow のスキーマ検証への直接リンク

Workflow に requestContextSchema を定義すると、run.start() の開始時にコンテキストが検証されます。検証に失敗した場合、いずれかのステップが実行される前に Workflow がエラーをスローします。

src/mastra/workflows/validated-workflow.ts
import { createWorkflow, createStep } from '@mastra/core/workflows'
import { z } from 'zod'

// Define schema once and share between workflow and steps
const workflowContextSchema = z.object({
tenantId: z.string(),
})

const step1 = createStep({
id: 'step-1',
inputSchema: z.object({ message: z.string() }),
outputSchema: z.object({ result: z.string() }),
// Add schema to step for type inference
requestContextSchema: workflowContextSchema,
execute: async ({ inputData, requestContext }) => {
// Access all values as a typed object
const { tenantId } = requestContext.all
// { tenantId: string }

// Or retrieve individual values with .get()
const id = requestContext.get('tenantId')
// string

return { result: `Processed for tenant ${tenantId}` }
},
})

export const validatedWorkflow = createWorkflow({
id: 'validated-workflow',
inputSchema: z.object({ message: z.string() }),
outputSchema: z.object({ result: z.string() }),
requestContextSchema: workflowContextSchema,
})
.then(step1)
.commit()

検証に失敗すると、Workflow はエラーをスローします。

Request context validation failed for workflow 'validated-workflow':
- tenantId: Required

ステップに独自の requestContextSchema を定義して、ステップ単位で検証することもできます。ステップの検証は、そのステップの execute() 関数が実行される前に行われます。

検証の動作
検証の動作への直接リンク

コンポーネントプロパティ検証のタイミング失敗時の動作
AgentrequestContextSchemagenerate() / stream() の開始時MastraError をスロー
ToolrequestContextSchemaexecute() の実行前エラーオブジェクトを返す
WorkflowrequestContextSchemarun.start() の開始時Error をスロー
SteprequestContextSchemaステップの execute() の実行前エラーによりステップが失敗

ベストプラクティス
ベストプラクティスへの直接リンク

ミドルウェアと一致させる: ミドルウェアで設定する必須フィールドと同じフィールドをスキーマに定義します。これにより、ミドルウェアとコンポーネント間の契約が明示され、検証されます。

// Middleware sets these fields
requestContext.set('userId', user.id)
requestContext.set('tenantId', tenant.id)

// Schema validates they exist
requestContextSchema: z.object({
userId: z.string(),
tenantId: z.string(),
})

条件付きコンテキストにはオプションフィールドを使用する: 常に存在するとは限らない値には .optional() を使用します。

requestContextSchema: z.object({
userId: z.string(), // Always required
experimentVariant: z.string().optional(), // May not be set
})

Tool の検証エラーを処理する: Tool は例外をスローせずにエラーオブジェクトを返すため、Tool の実行が重要な場合は Agent または Workflow のロジックでエラーを確認してください。