MCPClient
MCPClient
クラスは、Mastraアプリケーションで複数のMCPサーバー接続とそのツールを管理する方法を提供します。接続のライフサイクル、ツールの名前空間管理を処理し、設定されたすべてのサーバーにわたるツールへのアクセスを提供します。
このクラスは非推奨のMastraMCPClient
に代わるものです。
コンストラクタ
MCPClientクラスの新しいインスタンスを作成します。
constructor({
id?: string;
servers: Record<string, MastraMCPServerDefinition>;
timeout?: number;
}: MCPClientOptions)
MCPClientOptions
id?:
servers:
timeout?:
MastraMCPServerDefinition
servers
マップ内の各サーバーはMastraMCPServerDefinition
タイプを使用して設定されます。トランスポートタイプは提供されたパラメータに基づいて検出されます:
command
が提供されている場合、Stdioトランスポートを使用します。url
が提供されている場合、最初にStreamable HTTPトランスポートを試み、初期接続が失敗した場合はレガシーSSEトランスポートにフォールバックします。
command?:
args?:
env?:
url?:
requestInit?:
eventSourceInit?:
logger?:
timeout?:
capabilities?:
enableServerLogs?:
メソッド
getTools()
設定されたすべてのサーバーからすべてのツールを取得し、ツール名はサーバー名で名前空間化されます(serverName_toolName
の形式)。これは競合を防ぐためです。
Agentの定義に渡すことを意図しています。
new Agent({ tools: await mcp.getTools() });
getToolsets()
名前空間化されたツール名(serverName.toolName
の形式)をそのツール実装にマッピングするオブジェクトを返します。
generateまたはstreamメソッドに動的に渡すことを意図しています。
const res = await agent.stream(prompt, {
toolsets: await mcp.getToolsets(),
});
disconnect()
すべてのMCPサーバーから切断し、リソースをクリーンアップします。
async disconnect(): Promise<void>
例
静的ツール設定
アプリ全体で単一のMCPサーバー接続を持つツールの場合、getTools()
を使用してツールをエージェントに渡します:
import { MCPClient } from "@mastra/mcp";
import { Agent } from "@mastra/core/agent";
import { openai } from "@ai-sdk/openai";
const mcp = new MCPClient({
servers: {
stockPrice: {
command: "npx",
args: ["tsx", "stock-price.ts"],
env: {
API_KEY: "your-api-key",
},
log: (logMessage) => {
console.log(`[${logMessage.level}] ${logMessage.message}`);
},
},
weather: {
url: new URL("http://localhost:8080/sse"),∂
},
},
timeout: 30000, // グローバルな30秒タイムアウト
});
// すべてのツールにアクセスできるエージェントを作成
const agent = new Agent({
name: "Multi-tool Agent",
instructions: "You have access to multiple tool servers.",
model: openai("gpt-4"),
tools: await mcp.getTools(),
});
動的ツールセット
各ユーザーに新しいMCP接続が必要な場合は、getToolsets()
を使用し、streamまたはgenerateを呼び出す際にツールを追加します:
import { Agent } from "@mastra/core/agent";
import { MCPClient } from "@mastra/mcp";
import { openai } from "@ai-sdk/openai";
// まずツールなしでエージェントを作成
const agent = new Agent({
name: "Multi-tool Agent",
instructions: "You help users check stocks and weather.",
model: openai("gpt-4"),
});
// 後で、ユーザー固有の設定でMCPを構成
const mcp = new MCPClient({
servers: {
stockPrice: {
command: "npx",
args: ["tsx", "stock-price.ts"],
env: {
API_KEY: "user-123-api-key",
},
timeout: 20000, // サーバー固有のタイムアウト
},
weather: {
url: new URL("http://localhost:8080/sse"),
requestInit: {
headers: {
Authorization: `Bearer user-123-token`,
},
},
},
},
});
// すべてのツールセットをstream()またはgenerate()に渡す
const response = await agent.stream(
"How is AAPL doing and what is the weather?",
{
toolsets: await mcp.getToolsets(),
},
);
リソース管理
MCPClient
クラスには、複数のインスタンスを管理するためのメモリリーク防止機能が組み込まれています:
- 同一の構成で
id
なしの複数のインスタンスを作成すると、メモリリークを防ぐためにエラーがスローされます - 同一の構成で複数のインスタンスが必要な場合は、各インスタンスに一意の
id
を提供してください - 同じ構成でインスタンスを再作成する前に
await configuration.disconnect()
を呼び出してください - 1つのインスタンスだけが必要な場合は、再作成を避けるために構成をより高いスコープに移動することを検討してください
例えば、id
なしで同じ構成の複数のインスタンスを作成しようとすると:
// 最初のインスタンス - OK
const mcp1 = new MCPClient({
servers: {
/* ... */
},
});
// 同じ構成の2番目のインスタンス - エラーがスローされます
const mcp2 = new MCPClient({
servers: {
/* ... */
},
});
// 修正するには、以下のいずれかを行います:
// 1. 一意のIDを追加する
const mcp3 = new MCPClient({
id: "instance-1",
servers: {
/* ... */
},
});
// 2. または再作成する前に切断する
await mcp1.disconnect();
const mcp4 = new MCPClient({
servers: {
/* ... */
},
});
サーバーライフサイクル
MCPClientはサーバー接続を適切に処理します:
- 複数のサーバーへの自動接続管理
- 開発中にエラーメッセージが表示されないようにするための適切なサーバーシャットダウン
- 切断時のリソースの適切なクリーンアップ
SSEリクエストヘッダーの使用
レガシーSSE MCPトランスポートを使用する場合、MCP SDKのバグにより、requestInit
とeventSourceInit
の両方を設定する必要があります:
const sseClient = new MCPClient({
servers: {
exampleServer: {
url: new URL("https://your-mcp-server.com/sse"),
// 注意:requestInitだけではSSEには不十分です
requestInit: {
headers: {
Authorization: "Bearer your-token",
},
},
// これもカスタムヘッダーを持つSSE接続には必要です
eventSourceInit: {
fetch(input: Request | URL | string, init?: RequestInit) {
const headers = new Headers(init?.headers || {});
headers.set("Authorization", "Bearer your-token");
return fetch(input, {
...init,
headers,
});
},
},
},
},
});
関連情報
- Model Context Protocolの詳細については、@modelcontextprotocol/sdkのドキュメント を参照してください