MCPServer
MCPServer
クラスは、既存のMastraツールやエージェントをModel Context Protocol(MCP)サーバーとして公開する機能を提供します。これにより、任意のMCPクライアント(CursorやWindsurf、Claude Desktopなど)がこれらの機能に接続し、エージェントが利用できるようになります。
Mastraアプリケーション内でツールやエージェントを直接使用するだけであれば、必ずしもMCPサーバーを作成する必要はないことに注意してください。このAPIは特にMastraツールやエージェントを外部のMCPクライアントに公開するためのものです。
stdio(サブプロセス)とSSE(HTTP)の両方のMCPトランスポート をサポートしています。
Constructor
新しいMCPServer
を作成するには、サーバーに関する基本情報、提供するツール、そしてオプションでツールとして公開したいエージェントを提供する必要があります。
import { openai } from "@ai-sdk/openai";
import { Agent } from "@mastra/core/agent";
import { createTool } from "@mastra/core/tools";
import { MCPServer } from "@mastra/mcp";
import { z } from "zod";
import { dataProcessingWorkflow } from "../workflows/dataProcessingWorkflow";
const myAgent = new Agent({
name: "MyExampleAgent",
description: "A generalist to help with basic questions."
instructions: "You are a helpful assistant.",
model: openai("gpt-4o-mini"),
});
const weatherTool = createTool({
id: "getWeather",
description: "Gets the current weather for a location.",
inputSchema: z.object({ location: z.string() }),
execute: async ({ context }) => `Weather in ${context.location} is sunny.`,
});
const server = new MCPServer({
name: "My Custom Server",
version: "1.0.0",
tools: { weatherTool },
agents: { myAgent }, // this agent will become tool "ask_myAgent"
workflows: {
dataProcessingWorkflow, // this workflow will become tool "run_dataProcessingWorkflow"
}
});
設定プロパティ
コンストラクタは以下のプロパティを持つMCPServerConfig
オブジェクトを受け取ります:
name:
version:
tools:
agents?:
workflows?:
id?:
description?:
repository?:
releaseDate?:
isLatest?:
packageCanonical?:
packages?:
remotes?:
resources?:
AgentをToolとして公開する
MCPServer
の強力な機能の一つは、Mastra AgentをCallableなToolとして自動的に公開する能力です。設定のagents
プロパティでAgentを提供すると:
-
Tool命名: 各Agentは
ask_<agentKey>
という名前のToolに変換されます。ここで<agentKey>
はagents
オブジェクトでそのAgentに使用したキーです。例えば、agents: { myAgentKey: myAgentInstance }
と設定した場合、ask_myAgentKey
という名前のToolが作成されます。 -
Tool機能:
- 説明: 生成されたToolの説明は次の形式になります:「Agent
<AgentName>
に質問する。元のAgent指示:<agent description>
」。 - 入力: Toolは
message
プロパティ(文字列)を持つ単一のオブジェクト引数を期待します:{ message: "Agentへの質問" }
。 - 実行: このToolが呼び出されると、対応するAgentの
generate()
メソッドを呼び出し、提供されたquery
を渡します。 - 出力: Agentの
generate()
メソッドからの直接的な結果がToolの出力として返されます。
- 説明: 生成されたToolの説明は次の形式になります:「Agent
-
名前の衝突:
tools
設定で明示的に定義されたToolがAgent由来のToolと同じ名前を持つ場合(例:ask_myAgentKey
という名前のToolがあり、かつmyAgentKey
というキーのAgentもある場合)、明示的に定義されたToolが優先されます。この競合する場合、AgentはToolに変換されず、警告がログに記録されます。
これにより、MCPクライアントが他のToolと同様に自然言語クエリを使用してAgentと対話することが簡単になります。
AgentからToolへの変換
agents
設定プロパティでAgentを提供すると、MCPServer
は各Agentに対応するToolを自動的に作成します。Toolはask_<agentIdentifier>
という名前になり、<agentIdentifier>
はagents
オブジェクトで使用したキーです。
この生成されたToolの説明は:「Agent <agent.name>
に質問する。Agentの説明:<agent.description>
」となります。
重要: AgentがToolに変換されるためには、インスタンス化時の設定で空でないdescription
文字列プロパティが設定されている必要があります(例:new Agent({ name: 'myAgent', description: 'このAgentはXを行います。', ... })
)。description
が欠落しているか空のAgentがMCPServer
に渡された場合、MCPServer
のインスタンス化時にエラーが投げられ、サーバーのセットアップが失敗します。
これにより、MCPを通じてAgentの生成機能を迅速に公開でき、クライアントがAgentに直接質問することが可能になります。
メソッド
これらはMCPServer
インスタンスで呼び出すことができる関数で、その動作を制御し情報を取得するためのものです。
startStdio()
このメソッドを使用して、標準入出力(stdio)を使用して通信するようにサーバーを起動します。これは、サーバーをコマンドラインプログラムとして実行する場合の典型的な方法です。
async startStdio(): Promise<void>
以下は、stdioを使用してサーバーを起動する方法です:
const server = new MCPServer({
// example configuration above
});
await server.startStdio();
startSSE()
このメソッドは、MCPサーバーを既存のWebサーバーと統合して、Server-Sent Events(SSE)を通信に使用するのに役立ちます。WebサーバーのコードからSSEまたはメッセージパスへのリクエストを受信したときに、このメソッドを呼び出します。
async startSSE({
url,
ssePath,
messagePath,
req,
res,
}: {
url: URL;
ssePath: string;
messagePath: string;
req: any;
res: any;
}): Promise<void>
以下は、HTTPサーバーのリクエストハンドラー内でstartSSE
を使用する例です。この例では、MCPクライアントはhttp://localhost:1234/sse
であなたのMCPサーバーに接続できます:
import http from "http";
const httpServer = http.createServer(async (req, res) => {
await server.startSSE({
url: new URL(req.url || "", `http://localhost:1234`),
ssePath: "/sse",
messagePath: "/message",
req,
res,
});
});
httpServer.listen(PORT, () => {
console.log(`HTTP server listening on port ${PORT}`);
});
以下は、startSSE
メソッドに必要な値の詳細です:
url:
ssePath:
messagePath:
req:
res:
startHonoSSE()
このメソッドは、MCPサーバーを既存のWebサーバーと統合して、Server-Sent Events(SSE)を通信に使用するのに役立ちます。WebサーバーのコードからSSEまたはメッセージパスへのリクエストを受信したときに、このメソッドを呼び出します。
async startHonoSSE({
url,
ssePath,
messagePath,
req,
res,
}: {
url: URL;
ssePath: string;
messagePath: string;
req: any;
res: any;
}): Promise<void>
以下は、HTTPサーバーのリクエストハンドラー内でstartHonoSSE
を使用する例です。この例では、MCPクライアントはhttp://localhost:1234/hono-sse
であなたのMCPサーバーに接続できます:
import http from "http";
const httpServer = http.createServer(async (req, res) => {
await server.startHonoSSE({
url: new URL(req.url || "", `http://localhost:1234`),
ssePath: "/hono-sse",
messagePath: "/message",
req,
res,
});
});
httpServer.listen(PORT, () => {
console.log(`HTTP server listening on port ${PORT}`);
});
以下は、startHonoSSE
メソッドに必要な値の詳細です:
url:
ssePath:
messagePath:
req:
res:
startHTTP()
このメソッドは、MCPサーバーを既存のWebサーバーと統合し、通信にServer-Sent Events(SSE)を使用するのに役立ちます。WebサーバーがSSEまたはメッセージパスのリクエストを受信したときに、Webサーバーのコードからこれを呼び出します。
async startHTTP({
url,
ssePath,
messagePath,
req,
res,
}: {
url: URL;
ssePath: string;
messagePath: string;
req: any;
res: any;
}): Promise<void>
以下は、HTTPサーバーのリクエストハンドラー内でstartHTTP
を使用する方法の例です。この例では、MCPクライアントはhttp://localhost:1234/http
でMCPサーバーに接続できます:
import http from "http";
const httpServer = http.createServer(async (req, res) => {
await server.startHTTP({
url: new URL(req.url || "", `http://localhost:1234`),
ssePath: "/http",
messagePath: "/message",
req,
res,
});
});
httpServer.listen(PORT, () => {
console.log(`HTTP server listening on port ${PORT}`);
});
以下は、startHTTP
メソッドで必要な値の詳細です:
url:
ssePath:
messagePath:
req:
res:
close()
このメソッドはサーバーを閉じ、すべてのリソースを解放します。
async close(): Promise<void>
getServerInfo()
このメソッドは、サーバーの基本情報を確認できます。
getServerInfo(): ServerInfo
getServerDetail()
このメソッドは、サーバーの詳細情報を確認できます。
getServerDetail(): ServerDetail
getToolListInfo()
このメソッドは、サーバーを作成したときに設定されたツールを確認できます。これは読み取り専用のリストで、デバッグ目的に役立ちます。
getToolListInfo(): ToolListInfo
getToolInfo()
このメソッドは、特定のツールに関する詳細情報を提供します。
getToolInfo(toolName: string): ToolInfo
executeTool()
このメソッドは、特定のツールを実行し、結果を返します。
executeTool(toolName: string, input: any): Promise<any>
getStdioTransport()
startStdio()
でサーバーを開始した場合、これを使用してstdio通信を管理するオブジェクトを取得できます。これは主に内部チェックやテスト用です。
getStdioTransport(): StdioServerTransport | undefined
getSseTransport()
startSSE()
でサーバーを開始した場合、これを使用してSSE通信を管理するオブジェクトを取得できます。getStdioTransport
と同様に、これは主に内部チェックやテスト用です。
getSseTransport(): SSEServerTransport | undefined
getSseHonoTransport()
startHonoSSE()
でサーバーを開始した場合、これを使用してSSE通信を管理するオブジェクトを取得できます。getSseTransport
と同様に、これは主に内部チェックやテスト用です。
getSseHonoTransport(): SSETransport | undefined
getStreamableHTTPTransport()
サーバーを startHTTP()
で開始した場合、このメソッドを使用してHTTP通信を管理するオブジェクトを取得できます。getSseTransport
と同様に、これは主に内部チェックやテスト用です。
getStreamableHTTPTransport(): StreamableHTTPServerTransport | undefined
tools()
このMCPサーバーが提供する特定のツールを実行します。
async executeTool(
toolId: string,
args: any,
executionContext?: { messages?: any[]; toolCallId?: string },
): Promise<any>
toolId:
args:
executionContext?:
Resource Handling
MCPリソースとは?
リソースは、Model Context Protocol(MCP)の中核的なプリミティブであり、サーバーがクライアントによって読み取られ、LLMインタラクションのコンテキストとして使用できるデータとコンテンツを公開することを可能にします。これらは、MCPサーバーが利用可能にしたい任意の種類のデータを表します。例えば:
- ファイルの内容
- データベースレコード
- APIレスポンス
- ライブシステムデータ
- スクリーンショットと画像
- ログファイル
リソースは一意のURI(例:file:///home/user/documents/report.pdf
、postgres://database/customers/schema
)によって識別され、テキスト(UTF-8エンコード)またはバイナリデータ(base64エンコード)のいずれかを含むことができます。
クライアントは以下の方法でリソースを発見できます:
- 直接リソース: サーバーは
resources/list
エンドポイントを介して具体的なリソースのリストを公開します。 - リソーステンプレート: 動的リソースの場合、サーバーはクライアントがリソースURIを構築するために使用するURIテンプレート(RFC 6570)を公開できます。
リソースを読み取るために、クライアントはURIを使用してresources/read
リクエストを行います。サーバーは、クライアントがそのリソースにサブスクライブしている場合、リソースリストの変更(notifications/resources/list_changed
)や特定のリソースコンテンツの更新(notifications/resources/updated
)についてクライアントに通知することもできます。
詳細については、リソースに関する公式MCPドキュメント を参照してください。
MCPServerResources
型
resources
オプションはMCPServerResources
型のオブジェクトを受け取ります。この型は、サーバーがリソースリクエストを処理するために使用するコールバックを定義します:
export type MCPServerResources = {
// 利用可能なリソースをリストするコールバック
listResources: () => Promise<Resource[]>;
// 特定のリソースのコンテンツを取得するコールバック
getResourceContent: ({ uri }: { uri: string; }) => Promise<MCPServerResourceContent | MCPServerResourceContent[]>;
// 利用可能なリソーステンプレートをリストするオプションのコールバック
resourceTemplates?: () => Promise<ResourceTemplate[]>;
};
export type MCPServerResourceContent = { text?: string } | { blob?: string };
例:
import { MCPServer } from "@mastra/mcp";
import type { MCPServerResourceContent, Resource, ResourceTemplate } from "@mastra/mcp";
// リソース/リソーステンプレートは一般的に動的に取得されます。
const myResources: Resource[] = [
{ uri: "file://data/123.txt", name: "Data File", mimeType: "text/plain" },
];
const myResourceContents: Record<string, MCPServerResourceContent> = {
"file://data.txt/123": { text: "This is the content of the data file." },
};
const myResourceTemplates: ResourceTemplate[] = [
{
uriTemplate: 'file://data/{id}',
name: 'Data File',
description: 'A file containing data.',
mimeType: 'text/plain',
},
];
const myResourceHandlers: MCPServerResources = {
listResources: async () => myResources,
getResourceContent: async ({ uri }) => {
if (myResourceContents[uri]) {
return myResourceContents[uri];
}
throw new Error(`Resource content not found for ${uri}`);
},
resourceTemplates: async () => myResourceTemplates,
};
const serverWithResources = new MCPServer({
name: "Resourceful Server",
version: "1.0.0",
tools: { /* ... your tools ... */ },
resources: myResourceHandlers,
});
リソース変更のクライアント通知
利用可能なリソースやそのコンテンツが変更された場合、サーバーは特定のリソースにサブスクライブしている接続されたクライアントに通知できます。
server.resources.notifyUpdated({ uri: string })
特定のリソース(そのuri
によって識別される)のコンテンツが更新されたときにこのメソッドを呼び出します。このURIにサブスクライブしているクライアントがある場合、それらはnotifications/resources/updated
メッセージを受信します。
async server.resources.notifyUpdated({ uri: string }): Promise<void>
例:
// 'file://data.txt'のコンテンツを更新した後
await serverWithResources.resources.notifyUpdated({ uri: "file://data.txt" });
server.resources.notifyListChanged()
利用可能なリソースの全体的なリストが変更されたとき(例:リソースが追加または削除された)にこのメソッドを呼び出します。これにより、クライアントにnotifications/resources/list_changed
メッセージが送信され、リソースのリストを再取得するよう促されます。
async server.resources.notifyListChanged(): Promise<void>
例:
// 'myResourceHandlers.listResources'によって管理されるリストに新しいリソースを追加した後
await serverWithResources.resources.notifyListChanged();
例
MCPServerのセットアップとデプロイの実践的な例については、MCPServerのデプロイ例を参照してください。
このページの冒頭の例でも、ツールとエージェントの両方を使用してMCPServer
をインスタンス化する方法を示しています。
関連情報
- MastraでMCPサーバーに接続する方法については、MCPClientのドキュメントをご覧ください。
- Model Context Protocolの詳細については、@modelcontextprotocol/sdkのドキュメント をご参照ください。