コンテンツにスキップ

MCP 連携

Model Context Protocol (MCP) は、アプリケーションが LLM にツールとコンテキストを提供する方法を標準化するオープンプロトコルです。MCP のドキュメントでは、次のように説明されています。

MCP は、アプリケーションが LLM にコンテキストを提供する方法を標準化するオープンプロトコルです。MCP は、AI アプリケーションの USB-C ポートのようなものだと考えてください。USB-C がデバイスをさまざまな周辺機器やアクセサリーに接続するための標準化された方法を提供するのと同様に、MCP は AI モデルをさまざまなデータソースやツールに接続するための標準化された方法を提供します。

この SDK は、次の 3 種類の MCP サーバーをサポートしています。

  1. リモート MCP サーバーツールOpenAI Responses API がツールとして使用するリモート MCP サーバー
  2. Streamable HTTP MCP サーバーStreamable HTTP トランスポートを実装するローカルまたはリモートのサーバー
  3. Stdio MCP サーバー – 標準入出力を介してアクセスするサーバー(最も簡単な選択肢)

注:SDK には従来の Server-Sent Events トランスポート向けの MCPServerSSE も含まれていますが、SSE は MCP プロジェクトで非推奨になっています。新しい連携では Streamable HTTP または stdio を優先してください。

ユースケースに応じてサーバーの種類を選択してください。

必要なこと推奨オプション
デフォルトの OpenAI Responses モデルから、公開アクセス可能なリモートサーバーを呼び出す1. リモート MCP サーバーツール
公開アクセス可能なリモートサーバーを使用し、ツール呼び出しはローカルでトリガーする2. Streamable HTTP
ローカルで実行中の Streamable HTTP サーバーを使用する2. Streamable HTTP
OpenAI Responses 以外のモデルで任意の Streamable HTTP サーバーを使用する2. Streamable HTTP
標準 I/O プロトコルのみをサポートするローカル MCP サーバーを使用する3. Stdio

MCP SDK v2 と v1 サーバーの互換性

Section titled “MCP SDK v2 と v1 サーバーの互換性”

Agents SDK は内部で MCP TypeScript SDK v2 クライアントを使用します。ただし、MCP サーバーを v2 サーバーパッケージへ移行する必要はありません。stdio および Streamable HTTP 接続では、Agents SDK がプロトコルを自動的にネゴシエートし、互換性のあるプロトコルバージョンをサポートしていれば、MCP TypeScript SDK v1 で実装された既存のサーバーとの互換性を維持します。

アプリケーションで Agents SDK の MCPServerStdioMCPServerStreamableHttp、または MCPServerSSE クラスのみを使用する場合、この互換性のために MCP v1 と v2 のパッケージをインストールしたり、ブリッジしたりする必要はありません。v2 MCP SDK API を採用する場合は、アプリケーションが所有する MCP SDK オブジェクトを別途移行してください。MCP TypeScript SDK の v1 から v2 への移行ガイドを参照してください。

組み込みツール(Hosted)は、すべてのラウンドトリップをモデル側で処理します。コードから MCP サーバーを呼び出す代わりに、OpenAI Responses API がリモートツールのエンドポイントを呼び出し、その結果をモデルへストリーミングします。

次に、組み込み MCP ツール(Hosted)を使用する最も簡単な例を示します。リモート MCP サーバーのラベルと URL を hostedMcpTool ユーティリティ関数に渡すことで、リモート MCP サーバーツールを簡単に作成できます。

hostedAgent.ts
import { Agent, hostedMcpTool } from '@openai/agents';
export const agent = new Agent({
name: 'MCP Assistant',
instructions: 'You must always use the MCP tools to answer questions.',
tools: [
hostedMcpTool({
serverLabel: 'deepwiki',
serverUrl: 'https://mcp.deepwiki.com/mcp',
}),
],
});

続いて、run 関数(または独自にカスタマイズした Runner インスタンスの run メソッド)を使用してエージェントを実行できます。

リモート MCP サーバーツールでの実行
import { run } from '@openai/agents';
import { agent } from './hostedAgent';
async function main() {
const result = await run(
agent,
'Which language is the repo I pointed in the MCP tool settings written in?',
);
console.log(result.finalOutput);
}
main().catch(console.error);

MCP の逐次的な実行結果をストリーミングするには、Agent の実行時に stream: true を渡します。

リモート MCP サーバーツールでの実行(ストリーミング)
import { isOpenAIResponsesRawModelStreamEvent, run } from '@openai/agents';
import { agent } from './hostedAgent';
async function main() {
const result = await run(
agent,
'Which language is the repo I pointed in the MCP tool settings written in?',
{ stream: true },
);
for await (const event of result) {
if (
isOpenAIResponsesRawModelStreamEvent(event) &&
event.data.event.type !== 'response.mcp_call_arguments.delta' &&
event.data.event.type !== 'response.output_text.delta'
) {
console.log(`Got event of type ${JSON.stringify(event.data)}`);
}
}
console.log(`Done streaming; final result: ${result.finalOutput}`);
}
main().catch(console.error);

機密性の高い操作では、個々のツール呼び出しに人間の承認を必須にできます。requireApproval: 'always'、またはツール名を 'never''always' に対応付ける詳細なオブジェクトを渡します。

ツール呼び出しが安全かどうかをプログラムで判断できる場合は、onApproval コールバックを使用して、ツール呼び出しを承認または拒否できます。人間の承認が必要な場合は、ローカルの関数ツールと同様に、interruptions を使用する人間の介入(HITL)の方法を利用できます。

リモート MCP サーバーツールでの Human in the loop (人間の介入)
import { Agent, run, hostedMcpTool, RunToolApprovalItem } from '@openai/agents';
async function main(): Promise<void> {
const agent = new Agent({
name: 'MCP Assistant',
instructions: 'You must always use the MCP tools to answer questions.',
tools: [
hostedMcpTool({
serverLabel: 'deepwiki',
serverUrl: 'https://mcp.deepwiki.com/mcp',
// 'always' | 'never' | { never, always }
requireApproval: {
never: {
toolNames: ['read_wiki_structure', 'read_wiki_contents'],
},
always: {
toolNames: ['ask_question'],
},
},
}),
],
});
let result = await run(
agent,
'For the repository openai/codex, tell me the primary programming language.',
);
while (result.interruptions && result.interruptions.length) {
for (const interruption of result.interruptions) {
// Human in the loop here
const approval = await confirm(interruption);
if (approval) {
result.state.approve(interruption);
} else {
result.state.reject(interruption);
}
}
result = await run(agent, result.state);
}
console.log(result.finalOutput);
}
import { stdin, stdout } from 'node:process';
import * as readline from 'node:readline/promises';
async function confirm(item: RunToolApprovalItem): Promise<boolean> {
const rl = readline.createInterface({ input: stdin, output: stdout });
const name = item.name;
const params = item.arguments;
const answer = await rl.question(
`Approve running tool (mcp: ${name}, params: ${params})? (y/n) `,
);
rl.close();
return answer.toLowerCase().trim() === 'y';
}
main().catch(console.error);

リモート MCP サーバーツールのオプションリファレンス

Section titled “リモート MCP サーバーツールのオプションリファレンス”

hostedMcpTool(...) は、MCP サーバー URL とコネクター対応サーバーの両方をサポートします。

オプション説明
serverLabelstringイベントおよびトレースでリモート MCP サーバーを識別する必須ラベルです。
serverUrlstringリモート MCP サーバーの URL です(通常のリモート MCP サーバーにはこれを使用します)。
connectorIdstringOpenAI コネクター ID です(コネクター対応のリモートサーバーでは、serverUrl の代わりにこれを使用します)。
authorizationstringリモート MCP バックエンドへ送信する任意の認証トークンです。
headersRecord<string, string>追加のリクエストヘッダーです(任意)。
allowedToolsstring[] | objectモデルに公開するツール名の許可リストです。string[] または { toolNames?: string[] } を渡します。
allowedCallers('direct' | 'programmatic')[]リモート MCP サーバーツールを直接呼び出すか、Programmatic Tool Calling を介して呼び出すか、その両方を許可するかを制御する、Responses 専用の空でないリストです。
deferLoadingbooleanリモート MCP サーバーツールを遅延読み込みする Responses 専用オプションです。同じエージェントに toolSearchTool() が必要です。
requireApproval'never' | 'always' | objectリモート MCP サーバーツール呼び出しの承認ポリシーです。ツールごとに上書きするにはオブジェクト形式を使用します。デフォルトは 'never' です。
onApproval承認コールバックrequireApproval で承認処理が必要な場合に、プログラムから承認または拒否するための任意のコールバックです。

リモート MCP サーバーのツール定義を最初から公開するのではなく、ツール検索を介してモデルが必要に応じて読み込むようにするには、deferLoading: true を設定します。これは OpenAI Responses API でのみ機能し、同じリクエスト内に toolSearchTool() が必要です。また、GPT-5.4 以降のサポート対象モデルリリースで使用してください。遅延読み込みの完全な設定については、ツールガイドを参照してください。

リモート MCP サーバーツールをモデルが生成した JavaScript からのみ呼び出せるようにするには、allowedCallers: ['programmatic'] を設定します。どちらの経路も許可するには、'direct''programmatic' の両方を含めます。同じエージェントに programmaticToolCallingTool() を追加してください。プログラムが MCP ツールを呼び出す場合も、既存の requireApproval および onApproval ポリシーが適用されます。完全な設定については、Programmatic Tool Callingを参照してください。

requireApproval のオブジェクト形式では、任意の always および never エントリを指定できます。各エントリでは、toolNames または読み取り専用アノテーションによってツールを選択できます。任意の onApproval コールバックは、現在の実行コンテキストと承認項目を受け取り、approve と任意の reason を含む Promise を返します。

コネクター対応のリモートサーバー

Section titled “コネクター対応のリモートサーバー”

リモート MCP は OpenAI コネクターもサポートします。serverUrl を指定する代わりに、コネクターの connectorIdauthorization トークンを渡します。Responses API が認証を処理し、コネクターのツールをリモート MCP インターフェースを通じて公開します。

コネクター対応のリモート MCP サーバーツール
import { Agent, hostedMcpTool } from '@openai/agents';
const authorization = process.env.GOOGLE_CALENDAR_AUTHORIZATION!;
export const connectorAgent = new Agent({
name: 'Calendar Assistant',
instructions:
"You are a helpful assistant that can answer questions about the user's calendar.",
tools: [
hostedMcpTool({
serverLabel: 'google_calendar',
connectorId: 'connector_googlecalendar',
authorization,
requireApproval: 'never',
}),
],
});

この例では、GOOGLE_CALENDAR_AUTHORIZATION 環境変数に Google OAuth Playground から取得した OAuth トークンを保持し、コネクター対応サーバーによる Calendar API の呼び出しを承認します。ストリーミングも実演する実行可能なコード例については、examples/connectorsを参照してください。

完全に動作するコード例(組み込みツール(Hosted)/Streamable HTTP/stdio、ストリーミング、HITL、onApproval)は、GitHub リポジトリの examples/mcpにあります。

トランスポートの選択に加えて、Agent.mcpConfig を設定することで、ローカル MCP ツールの準備方法を調整できます。

エージェント用ローカル MCP ツールの設定
import { Agent, MCPServerStreamableHttp } from '@openai/agents';
const server = new MCPServerStreamableHttp({
url: 'https://your-own-domain-here/mcp',
name: 'Docs server',
});
const agent = new Agent({
name: 'Assistant',
mcpServers: [server],
mcpConfig: {
// Try to convert MCP tool schemas to strict JSON schema.
convertSchemasToStrict: true,
// Set to null to raise MCP tool failures instead of returning model-visible error text.
errorFunction: null,
// Prefix local MCP tool names with their server name.
includeServerInToolNames: true,
},
});

注:

  • convertSchemasToStrict はベストエフォートで動作します。スキーマを変換できない場合は、元のスキーマが使用されます。
  • errorFunction は、MCP ツール呼び出しの失敗をモデルにどのように提示するかを制御します。
  • errorFunction が設定されていない場合、SDK はデフォルトのツールエラーフォーマッターを使用します。
  • サーバーレベルの errorFunction 値は、そのサーバーの Agent.mcpConfig.errorFunction を上書きします。
  • includeServerInToolNames はオプトインです。有効にすると、各ローカル MCP ツールが、決定論的なサーバー名プレフィックス付きの名前でモデルに公開されます。複数の MCP サーバーが同じ名前のツールを公開する場合の名前の衝突を回避できます。
  • SDK は、URL から生成されたサーバー名とトランスポートエラーをログ、トレース、およびエラーメッセージに公開する前に、URL の認証情報、クエリパラメーター、フラグメントを削除します。安定したサーバーラベルが必要な場合は、明示的で一意かつ機密情報を含まない name を設定してください。
  • URL から生成された別々のサーバー名が、認証情報、クエリパラメーター、フラグメントの削除後に同一になり、それらのサーバーが同じツール名を公開している場合、モデルへのリクエスト前に設定が失敗します。それらのサーバーには、明示的で一意かつ機密情報を含まない name 値を設定してください。

エージェントがローカルまたはリモートの Streamable HTTP MCP サーバーと直接通信する場合は、サーバーの urlname、および任意の設定を指定して MCPServerStreamableHttp をインスタンス化します。

Streamable HTTP MCP サーバーでの実行
import { Agent, run, MCPServerStreamableHttp } from '@openai/agents';
async function main() {
const mcpServer = new MCPServerStreamableHttp({
url: 'https://mcp.deepwiki.com/mcp',
name: 'DeepWiki MCP Server',
});
const agent = new Agent({
name: 'DeepWiki Assistant',
instructions: 'Use the tools to respond to user requests.',
mcpServers: [mcpServer],
});
try {
await mcpServer.connect();
const result = await run(
agent,
'For the repository openai/codex, tell me the primary programming language.',
);
console.log(result.finalOutput);
} finally {
await mcpServer.close();
}
}
main().catch(console.error);

コンストラクターオプション:

オプション説明
urlstringStreamable HTTP サーバーの URL です。
namestringサーバーの任意のラベルです。
cacheToolsListbooleanレイテンシーを低減するためにツール一覧をキャッシュします。
clientSessionTimeoutSecondsnumberMCP クライアントセッションのタイムアウトです。
toolFilterMCPToolFilterCallable | MCPToolFilterStatic利用可能なツールをフィルタリングします。
toolMetaResolverMCPToolMetaResolver呼び出しごとに MCP の _meta リクエストフィールドを挿入します。
useStructuredContentboolean利用可能で、かつ実行結果がエラーでない場合、JSON にシリアライズされた MCP の structuredContent をモデルに表示される出力として使用します。デフォルトは false です。
customDataExtractorMCPToolCustomDataExtractor出力されたローカル MCP ツール出力項目に、SDK 専用の JSON メタデータを付加します。コールバックは MCP の実行結果に含まれる _metastructuredContentisError、およびモデルに表示されるツール出力を参照できます。
errorFunctionMCPToolErrorFunction | nullMCP 呼び出しの失敗をモデルに表示されるテキストへ変換します。
timeoutnumberリクエストごとのタイムアウト(ミリ秒)です。
loggerLoggerカスタムロガーです。
authProviderOAuthClientProviderMCP TypeScript SDK の OAuth プロバイダーです。
requestInitRequestInitリクエスト用の fetch 初期化オプションです。
fetchFetchLikeカスタム fetch 実装です。
reconnectionOptionsStreamableHTTPReconnectionOptions再接続の調整オプションです。
sessionIdstringMCP 接続の明示的なセッション ID です。

このコンストラクターは、authProviderrequestInitfetchreconnectionOptionssessionId など、MCP TypeScript SDK の追加オプションも受け付けます。詳細については、MCP TypeScript SDK リポジトリとそのドキュメントを参照してください。

標準 I/O のみを公開するサーバーでは、fullCommand を指定して MCPServerStdio をインスタンス化します。

Stdio MCP サーバーでの実行
import { Agent, run, MCPServerStdio } from '@openai/agents';
import * as path from 'node:path';
async function main() {
const samplesDir = path.join(__dirname, 'sample_files');
const mcpServer = new MCPServerStdio({
name: 'Filesystem MCP Server, via local package',
fullCommand: `pnpm exec mcp-server-filesystem ${samplesDir}`,
});
await mcpServer.connect();
try {
const agent = new Agent({
name: 'FS MCP Assistant',
instructions:
'Use the tools to read the filesystem and answer questions based on those files. If you are unable to find any files, you can say so instead of assuming they exist.',
mcpServers: [mcpServer],
});
const result = await run(agent, 'Read the files and list them.');
console.log(result.finalOutput);
} finally {
await mcpServer.close();
}
}
main().catch(console.error);

コンストラクターオプション:

オプション説明
command / argsstring / string[]stdio サーバー用のコマンドと引数です。
fullCommandstringcommandargs の代わりに使用する完全なコマンド文字列です。
envRecord<string, string>サーバープロセスの環境変数です。
cwdstringサーバープロセスの作業ディレクトリです。
cacheToolsListbooleanレイテンシーを低減するためにツール一覧をキャッシュします。
clientSessionTimeoutSecondsnumberMCP クライアントセッションのタイムアウトです。
namestringサーバーの任意のラベルです。
encodingstringstdio ストリームのエンコーディングです。
encodingErrorHandler'strict' | 'ignore' | 'replace'エンコーディングエラーの処理方法です。
toolFilterMCPToolFilterCallable | MCPToolFilterStatic利用可能なツールをフィルタリングします。
toolMetaResolverMCPToolMetaResolver呼び出しごとに MCP の _meta リクエストフィールドを挿入します。
useStructuredContentboolean利用可能で、かつ実行結果がエラーでない場合、JSON にシリアライズされた MCP の structuredContent をモデルに表示される出力として使用します。デフォルトは false です。
customDataExtractorMCPToolCustomDataExtractor出力されたローカル MCP ツール出力項目に、SDK 専用の JSON メタデータを付加します。コールバックは MCP の実行結果に含まれる _metastructuredContentisError、およびモデルに表示されるツール出力を参照できます。
errorFunctionMCPToolErrorFunction | nullMCP 呼び出しの失敗をモデルに表示されるテキストへ変換します。
timeoutnumberリクエストごとのタイムアウト(ミリ秒)です。
loggerLoggerカスタムロガーです。

MCP サーバーのライフサイクル管理

Section titled “MCP サーバーのライフサイクル管理”

複数の MCP サーバーを使用する場合は、connectMcpServers を使用してまとめて接続し、失敗を追跡し、一元的に閉じることができます。このヘルパーは activefailederrors コレクションを持つ MCPServers インスタンスを返すため、正常なサーバーだけをエージェントに渡せます。

複数の MCP サーバーの管理
import {
Agent,
MCPServerStreamableHttp,
connectMcpServers,
run,
} from '@openai/agents';
async function main() {
const servers = [
new MCPServerStreamableHttp({
url: 'https://mcp.deepwiki.com/mcp',
name: 'DeepWiki MCP Server',
}),
new MCPServerStreamableHttp({
url: 'http://localhost:8001/mcp',
name: 'Local MCP Server',
}),
];
const mcpServers = await connectMcpServers(servers, {
connectInParallel: true,
});
try {
console.log(`Active servers: ${mcpServers.active.length}`);
console.log(`Failed servers: ${mcpServers.failed.length}`);
for (const [server, error] of mcpServers.errors) {
console.warn(`${server.name} failed to connect: ${error.message}`);
}
const agent = new Agent({
name: 'MCP lifecycle agent',
instructions: 'Use MCP tools to answer user questions.',
mcpServers: mcpServers.active,
});
const result = await run(
agent,
'Which language is the openai/codex repository written in?',
);
console.log(result.finalOutput);
} finally {
await mcpServers.close();
}
}
main().catch(console.error);

ユースケース:

  • 複数サーバーの同時使用:すべてを並列に接続し、エージェントには mcpServers.active を使用します。
  • 部分的な失敗への対応failederrors を確認し、続行するか再試行するかを決定します。
  • 失敗したサーバーの再試行mcpServers.reconnect() を呼び出します(デフォルトでは、失敗したサーバーのみを再試行します)。

厳密な「オール・オア・ナッシング」接続や異なるタイムアウトが必要な場合は、connectMcpServers(servers, options) を使用して、環境に合わせてオプションを調整します。

connectMcpServers のオプション:

オプションデフォルト説明
connectTimeoutMsnumber | null10000各サーバーの connect() のタイムアウトです。無効にするには null を使用します。
closeTimeoutMsnumber | null10000各サーバーの close() のタイムアウトです。無効にするには null を使用します。
dropFailedbooleantrue失敗したサーバーを active から除外します。
strictbooleanfalseいずれかのサーバーへの接続が失敗した場合に例外をスローします。
suppressAbortErrorbooleantrue失敗したサーバーを追跡しながら、abort 系のエラーを無視します。
connectInParallelbooleanfalseすべてのサーバーを順番にではなく、同時に接続します。

mcpServers.reconnect(options) は次のオプションをサポートします。

オプションデフォルト説明
failedOnlybooleantrue失敗したサーバーのみを再試行する(true)か、すべてのサーバーを再接続する(false)かを指定します。

再接続の前に、MCPServers は選択されたサーバーを閉じます。正常に閉じられたサーバーのみを再接続します。クリーンアップの失敗は、引き続き failed および errors から確認できます。

ランタイムが Symbol.asyncDispose をサポートしている場合、MCPServersawait using パターンもサポートします。TypeScript では、tsconfig.jsonesnext.disposable を有効にします。

{
"compilerOptions": {
"lib": ["ES2018", "DOM", "esnext.disposable"]
}
}

その後、次のように記述できます。

非同期破棄による接続済み MCP サーバーのクローズ
import { MCPServerStreamableHttp, connectMcpServers } from '@openai/agents';
async function main() {
const servers = [
new MCPServerStreamableHttp({
url: 'https://your-own-domain-here/mcp',
name: 'Docs server',
}),
];
await using mcpServers = await connectMcpServers(servers);
}
main().catch(console.error);

Streamable HTTP および Stdio サーバーでは、Agent を実行するたびに、利用可能なツールを検出するために list_tools() が呼び出されることがあります。このラウンドトリップによって、特にリモートサーバーではレイテンシーが増加する可能性があるため、MCPServerStdio または MCPServerStreamableHttpcacheToolsList: true を渡すことで、実行結果をメモリにキャッシュできます。

ツール一覧が変更されないと確信できる場合にのみ、これを有効にしてください。後でキャッシュを無効化するには、サーバーインスタンスで invalidateToolsCache() を呼び出します。getAllMcpTools(...) を介して共有 MCP ツールキャッシュを使用している場合は、invalidateServerToolsCache(serverName) を使用してサーバー名ごとに無効化することもできます。

高度なユースケースでは、getAllMcpTools({ generateMCPToolCacheKey }) を使用して、キャッシュの分割方法をカスタマイズできます(たとえば、サーバー、エージェント、実行コンテキストの組み合わせごとに分割できます)。

サーバー名プレフィックス付きツール名

Section titled “サーバー名プレフィックス付きツール名”

デフォルトでは、ローカル MCP ツールは MCP サーバーから報告されたツール名を維持します。2 つのローカル MCP サーバーが同じツール名を公開すると、モデルが安全に選択できないため、SDK はツール名の重複エラーを発生させます。

決定論的なサーバー名プレフィックス付きの名前をオプトインで使用するには、エージェントで mcpConfig.includeServerInToolNames: true を設定します。

ローカル MCP ツール名へのサーバー名プレフィックスの付加
import { Agent, MCPServerStreamableHttp } from '@openai/agents';
const docsServer = new MCPServerStreamableHttp({
url: 'https://your-own-domain-here/docs/mcp',
name: 'docs',
});
const calendarServer = new MCPServerStreamableHttp({
url: 'https://your-own-domain-here/calendar/mcp',
name: 'calendar',
});
const agent = new Agent({
name: 'Assistant',
mcpServers: [docsServer, calendarServer],
mcpConfig: {
includeServerInToolNames: true,
},
});

この設定では、docs サーバーの search ツールは mcp_docs__search としてモデルに公開され、calendar サーバーの search ツールは mcp_calendar__search として公開されます。SDK は引き続き、元のサーバー上で元の MCP ツール名を使用して呼び出します。

生成された名前は ASCII で安全に使用でき、FunctionTool インスタンスの名前の長さ制限内に収まり、同じエージェント上のローカル FunctionTool インスタンスや有効なハンドオフの名前と衝突しません。この設定は Streamable HTTP、SSE、stdio を含む、すべてのローカル MCP トランスポートに影響します。リモート MCP サーバーツールでは、リモートサーバーのラベルとツールメタデータが維持されます。

createMCPToolStaticFilter を使用した静的フィルターまたはカスタム関数を渡すことで、各サーバーから公開するツールを制限できます。次に、両方の方法を組み合わせた例を示します。

ツールのフィルタリング
import {
MCPServerStdio,
MCPServerStreamableHttp,
createMCPToolStaticFilter,
MCPToolFilterContext,
} from '@openai/agents';
interface ToolFilterContext {
allowAll: boolean;
}
const server = new MCPServerStdio({
fullCommand: 'my-server',
toolFilter: createMCPToolStaticFilter({
allowed: ['safe_tool'],
blocked: ['danger_tool'],
}),
});
const dynamicServer = new MCPServerStreamableHttp({
url: 'http://localhost:3000',
toolFilter: async ({ runContext }: MCPToolFilterContext, tool) =>
(runContext.context as ToolFilterContext).allowAll || tool.name !== 'admin',
});