Skip to Content

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:

string
サーバーの説明的な名前(例:'My Weather and Agent Server')。

version:

string
サーバーのセマンティックバージョン(例:'1.0.0')。

tools:

ToolsInput
キーがツール名で、値がMastraツール定義(`createTool`またはVercel AI SDKで作成)であるオブジェクト。これらのツールは直接公開されます。

agents?:

Record<string, Agent>
キーがエージェント識別子で、値がMastra Agentインスタンスであるオブジェクト。各エージェントは自動的に`ask_<agentIdentifier>`という名前のツールに変換されます。エージェントは、コンストラクタ設定で定義された空でない`description`文字列プロパティを**必須**で持つ必要があります。この説明はツールの説明に使用されます。エージェントの説明が欠落しているか空の場合、MCPServerの初期化中にエラーがスローされます。

workflows?:

Record<string, Workflow>
キーがワークフロー識別子で、値がMastra Workflowインスタンスであるオブジェクト。各ワークフローは`run_<workflowKey>`という名前のツールに変換されます。ワークフローの`inputSchema`がツールの入力スキーマになります。ワークフローは空でない`description`文字列プロパティを**必須**で持つ必要があり、これがツールの説明に使用されます。ワークフローの説明が欠落しているか空の場合、エラーがスローされます。ツールは`workflow.createRun().start({ inputData: <tool_input> })`を呼び出してワークフローを実行します。エージェントやワークフローから派生したツール名(例:`ask_myAgent`や`run_myWorkflow`)が明示的に定義されたツール名や他の派生名と衝突する場合、明示的に定義されたツールが優先され、警告がログに記録されます。その後の衝突を引き起こすエージェント/ワークフローはスキップされます。

id?:

string
サーバーのオプションの一意識別子。提供されない場合、UUIDが生成されます。このIDは最終的なものと見なされ、提供された場合はMastraによって変更できません。

description?:

string
MCPサーバーが何をするかのオプションの説明。

repository?:

Repository
サーバーのソースコードのオプションのリポジトリ情報。

releaseDate?:

string
このサーバーバージョンのオプションのリリース日(ISO 8601文字列)。提供されない場合、インスタンス化時刻がデフォルトになります。

isLatest?:

boolean
これが最新バージョンかどうかを示すオプションのフラグ。提供されない場合、デフォルトでtrueになります。

packageCanonical?:

'npm' | 'docker' | 'pypi' | 'crates' | string
サーバーがパッケージとして配布される場合のオプションの正規パッケージ形式(例:'npm'、'docker')。

packages?:

PackageInfo[]
このサーバーのインストール可能なパッケージのオプションのリスト。

remotes?:

RemoteInfo[]
このサーバーのリモートアクセスポイントのオプションのリスト。

resources?:

MCPServerResources
サーバーがMCPリソースをどのように処理するかを定義するオブジェクト。詳細については、リソース処理セクションを参照してください。

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の出力として返されます。
  • 名前の衝突: 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:

URL
ユーザーがリクエストしているウェブアドレス。

ssePath:

string
クライアントがSSE接続するためのURLの特定の部分(例:'/sse')。

messagePath:

string
クライアントがメッセージを送信するためのURLの特定の部分(例:'/message')。

req:

any
Webサーバーからの着信リクエストオブジェクト。

res:

any
Webサーバーからのレスポンスオブジェクト。データを送り返すために使用されます。

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:

URL
ユーザーがリクエストしているWebアドレス。

ssePath:

string
クライアントがSSE接続するURLの特定の部分(例:'/hono-sse')。

messagePath:

string
クライアントがメッセージを送信するURLの特定の部分(例:'/message')。

req:

any
Webサーバーからの受信リクエストオブジェクト。

res:

any
Webサーバーからのレスポンスオブジェクト。データを送り返すために使用される。

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:

URL
ユーザーがリクエストしているWebアドレス。

ssePath:

string
クライアントがSSE接続するURLの特定の部分(例:'/http')。

messagePath:

string
クライアントがメッセージを送信するURLの特定の部分(例:'/message')。

req:

any
Webサーバーからの受信リクエストオブジェクト。

res:

any
Webサーバーからのレスポンスオブジェクト。データを送り返すために使用される。

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:

string
実行するツールのID/名前。

args:

any
ツールの実行関数に渡す引数。

executionContext?:

object
メッセージやtoolCallIdなど、ツール実行のオプションコンテキスト。

Resource Handling

MCPリソースとは?

リソースは、Model Context Protocol(MCP)の中核的なプリミティブであり、サーバーがクライアントによって読み取られ、LLMインタラクションのコンテキストとして使用できるデータとコンテンツを公開することを可能にします。これらは、MCPサーバーが利用可能にしたい任意の種類のデータを表します。例えば:

  • ファイルの内容
  • データベースレコード
  • APIレスポンス
  • ライブシステムデータ
  • スクリーンショットと画像
  • ログファイル

リソースは一意のURI(例:file:///home/user/documents/report.pdfpostgres://database/customers/schema)によって識別され、テキスト(UTF-8エンコード)またはバイナリデータ(base64エンコード)のいずれかを含むことができます。

クライアントは以下の方法でリソースを発見できます:

  1. 直接リソース: サーバーはresources/listエンドポイントを介して具体的なリソースのリストを公開します。
  2. リソーステンプレート: 動的リソースの場合、サーバーはクライアントがリソース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をインスタンス化する方法を示しています。

関連情報