Vercel AI SDK 6 : AI SDK Core – Model Context Protocol (MCP)

AI SDK は、Model Context Protocol (MCP) サーバへの接続をサポートし、それらのツール、リソースやプロンプトへのアクセスを可能にします。これは、AI アプリケーションが標準化されたインターフェイスを通して様々なサービスにわたり機能を発見して使用することを可能にします。

Vercel AI SDK 6 : AI SDK Core – Model Context Protocol (MCP)

作成 : Masashi Okumura (@classcat.com)
作成日時 : 01/29/2026
バージョン : ai@6.0.57

* 本記事は ai-sdk.dev/docs の以下のページを参考にしています :

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

 

Vercel AI SDK 6.x : AI SDK Core – Model Context Protocol (MCP)

AI SDK は、Model Context Protocol (MCP) サーバへの接続をサポートし、それらのツール、リソースやプロンプトへのアクセスを可能にします。これは、AI アプリケーションが標準化されたインターフェイスを通して様々なサービスにわたり機能を発見して使用することを可能にします。

ℹ️ If you’re using OpenAI’s Responses API, you can also use the built-in openai.tools.mcp tool, which provides direct MCP server integration without needing to convert tools. See the OpenAI provider documentation for details.

 

MCP クライアントの初期化

本番環境への配備には (StreamableHTTPClientTransport のような) HTTP トランスポートを使用することを勧めます。stdio トランスポートは本番環境には配備できないので、ローカルサーバへの接続のためにだけ使用してください。

以下のトランスポートのオプションの一つを使用して MCP クライアントを作成します :

  • HTTP トランスポート (推奨): transport: { type: ‘http’, … } を使用してクライアント経由で HTTP を設定するか、MCP 公式 TypeScript SDK StreamableHTTPClientTransport を使用します。

  • SSE (Server-Sent Events): 代替の HTTP ベースのトランスポート

  • stdio: ローカル開発専用。ローカル MCP サーバ用に標準入出力ストリームを使用。

 

HTTP トランスポート (推奨)

本番環境の配備では、HTTP トランスポートの使用を勧めます。クライアント上でそれを直接設定できます :

import { createMCPClient } from '@ai-sdk/mcp';

const mcpClient = await createMCPClient({
  transport: {
    type: 'http',
    url: 'https://your-server.com/mcp',

    // optional: configure HTTP headers
    headers: { Authorization: 'Bearer my-api-key' },

    // optional: provide an OAuth client provider for automatic authorization
    authProvider: myOAuthClientProvider,
  },
});

代わりに、MCP の公式 TypeScript SDK の StreamableHTTPClientTransport を使用することもできます :

import { createMCPClient } from '@ai-sdk/mcp';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';

const url = new URL('https://your-server.com/mcp');
const mcpClient = await createMCPClient({
  transport: new StreamableHTTPClientTransport(url, {
    sessionId: 'session_123',
  }),
});

 

SSE トランスポート

SSE は HTTP ベースの代替のトランスポート・オプションを提供します。type と url プロパティで設定します。OAuth のために authProvider を提供することもできます :

import { createMCPClient } from '@ai-sdk/mcp';

const mcpClient = await createMCPClient({
  transport: {
    type: 'sse',
    url: 'https://my-server.com/sse',

    // optional: configure HTTP headers
    headers: { Authorization: 'Bearer my-api-key' },

    // optional: provide an OAuth client provider for automatic authorization
    authProvider: myOAuthClientProvider,
  },
});

 

Stdio トランスポート (ローカルサーバ)

⚠️ The stdio transport should only be used for local servers.

Stdio トランスポートは MCP SDK または AI SDK のいずれかからインポートできます :

import { createMCPClient } from '@ai-sdk/mcp';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
// Or use the AI SDK's stdio transport:
// import { Experimental_StdioMCPTransport as StdioClientTransport } from '@ai-sdk/mcp/mcp-stdio';

const mcpClient = await createMCPClient({
  transport: new StdioClientTransport({
    command: 'node',
    args: ['src/stdio/dist/server.js'],
  }),
});

 

MCP クライアントのクローズ

初期化後、使用パターンに基づいて MCP クライアントをクローズする必要があります :

  • 短時間の使用 (e.g., 単一リクエススト) については、レスポンスが終了したときにクライアントを閉じます。

  • 長時間実行されるクライアント (e.g., コマンドライン・アプリケーション) については、クライアントを開いたままにしますが、アプ入りケーションが終了した場合にはクローズされることを確実にしてください。

レスポンスをストリーミングする場合、LLM レスポンスが終了したときにクライアントをクローズできます。例えば、streamText を使用する場合、onFinish コールバックを使用するのが良いでしょう :

Gateway

const mcpClient = await createMCPClient({
  // ...
});

const tools = await mcpClient.tools();

const result = await streamText({
  model: "openai/gpt-4o-mini",
  tools,
  prompt: 'What is the weather in Brooklyn, New York?',
  onFinish: async () => {
    await mcpClient.close();
  },
});

ストリーミングなしでレスポンスを生成する場合は、フレームワークで try/finally かクリーンアップ関数を使用できます :

let mcpClient: MCPClient | undefined;

try {
  mcpClient = await createMCPClient({
    // ...
  });
} finally {
  await mcpClient?.close();
}

 

MCP ツールの使用

クライアントの tools メソッドは MCP ツールと AI SDK ツール間のアダプターとして機能します。それはツールのスキーマと連携するための 2 つのアプローチをサポートしています :

 

スキーマ検出 (Discovery)

スキーマ検出では、サーバにより提供されるすべてのツールが自動的にリストされ、サーバにより提供されるスキーマに基づいて入力パラメータ型が推論されます :

const tools = await mcpClient.tools();

このアプローチは実装が単純で、サーバの変更と自動的に同期します。けれども、開発中は TypeScript の型安全性が保証されずに、サーバからすべてのツールがロードされます。

 

スキーマ定義

より良い型安全性と制御のために、クライアントコードでツールとその入力スキーマを明示的に定義できます :

import { z } from 'zod';

const tools = await mcpClient.tools({
  schemas: {
    'get-data': {
      inputSchema: z.object({
        query: z.string().describe('The data query'),
        format: z.enum(['json', 'text']).optional(),
      }),
    },
    // For tools with zero inputs, you should use an empty object:
    'tool-with-no-args': {
      inputSchema: z.object({}),
    },
  },
});

このアプローチは TypeScript の完全な型安全性と IDE の自動補完を提供し、開発中にパラメータの不一致を捕捉できます。スキーマを定義すると、クライアントは明示的に定義されたツールのみを pull し、アプリケーションは必要なツールにフォーカスできます。

 

型付きツール出力

MCP サーバが (MCP 仕様 毎に) structuredContent を返す場合、outputSchema を定義して型付きのツールの結果を取得できます :

import { z } from 'zod';

const tools = await mcpClient.tools({
  schemas: {
    'get-weather': {
      inputSchema: z.object({
        location: z.string(),
      }),
      // Define outputSchema for typed results
      outputSchema: z.object({
        temperature: z.number(),
        conditions: z.string(),
        humidity: z.number(),
      }),
    },
  },
});

const result = await tools['get-weather'].execute(
  { location: 'New York' },
  { messages: [], toolCallId: 'weather-1' },
);

console.log(`Temperature: ${result.temperature}°C`);

outputSchema が提供される場合 :

  • クライアントはツールの結果から structuredContent を抽出します

  • 出力は実行時にスキーマに対して検証されます

  • 結果に対して完全な TypeScript の型安全性を確保できます

サーバが structuredContent を返さない場合、クライアントはテキストコンテンツから JSON を解析するようにフォールバックします。どちらも利用できないか検証が失敗した場合、エラーが投げられます。

 

MCP リソースの使用

MCP 仕様 によれば、リソースはコンテキストをモデルに提供する、アプリケーション駆動 のデータソースです。(モデル制御の) ツールとは異なり、アプリケーションはリソースをいつ取得して、コンテキストとして渡すかはアプリケーションが決定します。

MCP クライアントはリソースを操作するために 3 つのメソッドを提供します :

 

リソースのリスティング

MCP サーバからすべての利用可能なリソースをリスティングします :

const resources = await mcpClient.listResources();

 

リソースコンテンツの読み取り

URI により特定のリソースのコンテンツを読み取ります :

const resourceData = await mcpClient.readResource({
  uri: 'file:///example/document.txt',
});

 

リソーステンプレートのリスティング

リソーステンプレートは、柔軟なクエリーを可能にする動的 URI パターンです。すべての利用可能なテンプレートをリスティングします :

const templates = await mcpClient.listResourceTemplates();

 

サンプル

以下のサンプルで MCP を実際に確認できます :

 

以上