MCPServer
MCPServer
クラスは、既存のMastraツールとエージェントをModel Context Protocol(MCP)サーバーとして公開する機能を提供します。これにより、任意のMCPクライアント(Cursor、Windsurf、Claude Desktopなど)がこれらの機能に接続し、エージェントで利用できるようになります。
Mastraアプリケーション内でツールやエージェントを直接使用するだけの場合は、MCPサーバーを作成する必要はありません。このAPIは、Mastraツールとエージェントを_外部の_MCPクライアントに公開することを目的としています。
stdio(サブプロセス)とSSE(HTTP)の両方のMCPトランスポート をサポートしています。
コンストラクター
新しい MCPServer
を作成するには、サーバーの基本情報、提供するツール、そして必要に応じてツールとして公開するエージェントを指定します。
import { openai } from "@ai-sdk/openai";
import { Agent } from "@mastra/core/agent";
import { MCPServer, createMCPTool } 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 = createMCPTool({
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 }, // このエージェントはツール "ask_myAgent" になります
workflows: {
dataProcessingWorkflow, // このワークフローはツール "run_dataProcessingWorkflow" になります
}
});
設定プロパティ
コンストラクターは、以下のプロパティを持つ MCPServerConfig
オブジェクトを受け取ります。
name:
version:
tools:
agents?:
workflows?:
id?:
description?:
repository?:
releaseDate?:
isLatest?:
packageCanonical?:
packages?:
remotes?:
resources?:
prompts?:
エージェントをツールとして公開する
MCPServer
の強力な機能の一つは、Mastraエージェントを呼び出し可能なツールとして自動的に公開できることです。設定のagents
プロパティでエージェントを提供すると:
-
ツール命名: 各エージェントは
ask_<agentKey>
という名前のツールに変換されます。ここで<agentKey>
はagents
オブジェクトでそのエージェントに使用したキーです。例えば、agents: { myAgentKey: myAgentInstance }
と設定した場合、ask_myAgentKey
という名前のツールが作成されます。 -
ツール機能:
- 説明: 生成されたツールの説明は次の形式になります:「エージェント
<AgentName>
に質問します。元のエージェント指示:<agent description>
」。 - 入力: ツールは
message
プロパティ(文字列)を持つ単一のオブジェクト引数を期待します:{ message: "エージェントへの質問" }
。 - 実行: このツールが呼び出されると、対応するエージェントの
generate()
メソッドを呼び出し、提供されたquery
を渡します。 - 出力: エージェントの
generate()
メソッドからの直接的な結果がツールの出力として返されます。
- 説明: 生成されたツールの説明は次の形式になります:「エージェント
-
名前の衝突:
tools
設定で明示的に定義されたツールがエージェント由来のツールと同じ名前を持つ場合(例:ask_myAgentKey
という名前のツールがあり、かつmyAgentKey
というキーのエージェントもある場合)、明示的に定義されたツールが優先されます。この競合が発生した場合、エージェントはツールに変換されず、警告がログに記録されます。
これにより、MCPクライアントが他のツールと同様に自然言語クエリを使用してエージェントと対話することが簡単になります。
エージェントからツールへの変換
agents
設定プロパティでエージェントを提供すると、MCPServer
は各エージェントに対応するツールを自動的に作成します。ツールはask_<agentIdentifier>
という名前になり、<agentIdentifier>
はagents
オブジェクトで使用したキーです。
この生成されたツールの説明は次のようになります:「エージェント<agent.name>
に質問します。エージェントの説明:<agent.description>
」。
重要: エージェントがツールに変換されるためには、インスタンス化時の設定で空でないdescription
文字列プロパティが設定されている必要があります(例:new Agent({ name: 'myAgent', description: 'このエージェントはXを実行します。', ... })
)。description
が欠落しているか空のエージェントがMCPServer
に渡された場合、MCPServer
のインスタンス化時にエラーが発生し、サーバーのセットアップが失敗します。
これにより、MCPを通じてエージェントの生成機能を迅速に公開でき、クライアントがエージェントに直接質問できるようになります。
メソッド
これらはMCPServer
インスタンスで呼び出すことができる関数で、サーバーの動作を制御し、情報を取得するために使用します。
startStdio()
このメソッドを使用して、標準入力と標準出力(stdio)を使用して通信するサーバーを開始します。これは、サーバーをコマンドラインプログラムとして実行する際の一般的な方法です。
async startStdio(): Promise<void>
stdioを使用してサーバーを開始する方法は次のとおりです:
const server = new MCPServer({
// 上記の設定例
});
await server.startStdio();
startSSE()
このメソッドは、MCPサーバーを既存のWebサーバーと統合して、通信にServer-Sent Events(SSE)を使用するのに役立ちます。WebサーバーがSSEまたはメッセージパスへのリクエストを受信した際に、Webサーバーのコードからこのメソッドを呼び出します。
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またはメッセージパスへのリクエストを受信した際に、Webサーバーのコードからこのメソッドを呼び出します。
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サーバーと統合し、通信にストリーマブルHTTPを使用するのに役立ちます。WebサーバーがHTTPリクエストを受信したときに、Webサーバーのコードからこのメソッドを呼び出します。
async startHTTP({
url,
httpPath,
req,
res,
options = { sessionIdGenerator: () => randomUUID() },
}: {
url: URL;
httpPath: string;
req: http.IncomingMessage;
res: http.ServerResponse<http.IncomingMessage>;
options?: StreamableHTTPServerTransportOptions;
}): 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'),
httpPath: `/mcp`,
req,
res,
options: {
sessionIdGenerator: undefined,
},
});
});
httpServer.listen(PORT, () => {
console.log(`HTTP server listening on port ${PORT}`);
});
以下は、startHTTP
メソッドで必要な値の詳細です:
url:
httpPath:
req:
res:
options:
StreamableHTTPServerTransportOptions
オブジェクトを使用すると、HTTPトランスポートの動作をカスタマイズできます。利用可能なオプションは以下の通りです:
sessionIdGenerator:
onsessioninitialized:
enableJsonResponse:
eventStore:
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?:
リソースハンドリング
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: "これはデータファイルの内容です。" },
};
const myResourceTemplates: ResourceTemplate[] = [
{
uriTemplate: "file://data/{id}",
name: "Data File",
description: "データを含むファイル。",
mimeType: "text/plain",
},
];
const myResourceHandlers: MCPServerResources = {
listResources: async () => myResources,
getResourceContent: async ({ uri }) => {
if (myResourceContents[uri]) {
return myResourceContents[uri];
}
throw new Error(`${uri}のリソースコンテンツが見つかりません`);
},
resourceTemplates: async () => myResourceTemplates,
};
const serverWithResources = new MCPServer({
name: "Resourceful Server",
version: "1.0.0",
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();
プロンプトハンドリング
MCPプロンプトとは?
プロンプトは、MCPサーバーがクライアントに公開する再利用可能なテンプレートまたはワークフローです。引数を受け取り、リソースコンテキストを含み、バージョニングをサポートし、LLMとのやり取りを標準化するために使用できます。
プロンプトは一意の名前(およびオプションのバージョン)で識別され、動的または静的にできます。
MCPServerPrompts
型
prompts
オプションはMCPServerPrompts
型のオブジェクトを受け取ります。この型は、サーバーがプロンプトリクエストを処理するために使用するコールバックを定義します:
export type MCPServerPrompts = {
// 利用可能なプロンプトをリストするコールバック
listPrompts: () => Promise<Prompt[]>;
// 特定のプロンプトのメッセージ/コンテンツを取得するコールバック
getPromptMessages?: ({
name,
version,
args,
}: {
name: string;
version?: string;
args?: any;
}) => Promise<{ prompt: Prompt; messages: PromptMessage[] }>;
};
例:
import { MCPServer } from "@mastra/mcp";
import type { Prompt, PromptMessage, MCPServerPrompts } from "@mastra/mcp";
const prompts: Prompt[] = [
{
name: "analyze-code",
description: "コードの改善点を分析",
version: "v1"
},
{
name: "analyze-code",
description: "コードの改善点を分析(新しいロジック)",
version: "v2"
}
];
const myPromptHandlers: MCPServerPrompts = {
listPrompts: async () => prompts,
getPromptMessages: async ({ name, version, args }) => {
if (name === "analyze-code") {
if (version === "v2") {
const prompt = prompts.find(p => p.name === name && p.version === "v2");
if (!prompt) throw new Error("プロンプトバージョンが見つかりません");
return {
prompt,
messages: [
{
role: "user",
content: { type: "text", text: `新しいロジックでこのコードを分析してください:${args.code}` }
}
]
};
}
// デフォルトまたはv1
const prompt = prompts.find(p => p.name === name && p.version === "v1");
if (!prompt) throw new Error("プロンプトバージョンが見つかりません");
return {
prompt,
messages: [
{
role: "user",
content: { type: "text", text: `このコードを分析してください:${args.code}` }
}
]
};
}
throw new Error("プロンプトが見つかりません");
}
};
const serverWithPrompts = new MCPServer({
name: "Promptful Server",
version: "1.0.0",
tools: { /* ... */ },
prompts: myPromptHandlers,
});
プロンプト変更のクライアント通知
利用可能なプロンプトが変更された場合、サーバーは接続されたクライアントに通知できます:
server.prompts.notifyListChanged()
利用可能なプロンプトの全体的なリストが変更された場合(例:プロンプトが追加または削除された場合)にこのメソッドを呼び出します。これにより、クライアントにnotifications/prompts/list_changed
メッセージが送信され、プロンプトのリストを再取得するよう促します。
await serverWithPrompts.prompts.notifyListChanged();
プロンプトハンドリングのベストプラクティス
- 明確で説明的なプロンプト名と説明を使用する。
getPromptMessages
で必要な引数をすべて検証する。- 破壊的変更を予期する場合は
version
フィールドを含める。 version
パラメータを使用して正しいプロンプトロジックを選択する。- プロンプトリストが変更されたときにクライアントに通知する。
- 情報的なメッセージでエラーを処理する。
- 引数の期待値と利用可能なバージョンを文書化する。
例
MCPServerのセットアップとデプロイの実践的な例については、MCPServerデプロイ例を参照してください。
このページの冒頭の例では、ツールとエージェントの両方を使ってMCPServer
をインスタンス化する方法も紹介しています。
Elicitation
What is Elicitation?
Elicitation は Model Context Protocol (MCP) の機能で、サーバーがユーザーに対して構造化された情報の提供を求められるようにするものです。これにより、サーバーが動的に追加データを収集できる対話型ワークフローが可能になります。
MCPServer
クラスには、Elicitation 機能が自動的に含まれています。ツールは execute
関数で options
パラメータを受け取り、その中の elicitation.sendRequest()
メソッドでユーザー入力をリクエストできます。
Tool Execution Signature
ツールが MCP サーバーのコンテキストで実行されると、追加の options
パラメータを受け取ります:
execute: async (params, { elicitation, extra }) => {
// params には検証済みのツール入力パラメータが含まれます
// elicitation はユーザーとの対話機能を提供します
// extra には MCP 固有のコンテキスト (認証、セッションなど) が含まれます
// 認証情報へのアクセス (利用可能な場合)
if (extra?.authInfo) {
console.log('Authenticated request from:', extra.authInfo.clientId);
}
// Elicitation 機能を使用
const result = await elicitation.sendRequest({
message: "Please provide information",
requestedSchema: { /* schema */ }
});
return result;
}
How Elicitation Works
一般的なユースケースはツールの実行中です。ツールがユーザー入力を必要とする場合、実行オプションで提供される Elicitation 機能を利用できます:
- ツールがメッセージとスキーマを指定して
options.elicitation.sendRequest()
を呼び出す - リクエストが接続された MCP クライアントへ送信される
- クライアントがリクエストをユーザーに提示する (UI、コマンドラインなど)
- ユーザーが入力する、拒否する、またはキャンセルする
- クライアントがレスポンスをサーバーに返送する
- ツールがレスポンスを受け取り、実行を継続する
Using Elicitation in Tools
以下は、Elicitation を使ってユーザーの連絡先情報を収集するツールの例です:
import { MCPServer, createMCPTool } from "@mastra/mcp";
import { z } from "zod";
const server = new MCPServer({
name: "Interactive Server",
version: "1.0.0",
tools: {
collectContactInfo: createMCPTool({
id: "collectContactInfo",
description: "Collects user contact information through elicitation",
inputSchema: z.object({
reason: z.string().optional().describe("Reason for collecting contact info"),
}),
execute: async (params, { context, elicitation, extra }) => {
const { reason } = params;
// 利用可能であればセッション情報をログ出力
console.log('Request from session:', extra?.sessionId);
try {
// Elicitation 経由でユーザー入力をリクエスト
const result = await elicitation.sendRequest({
message: reason
? `Please provide your contact information. ${reason}`
: 'Please provide your contact information',
requestedSchema: {
type: 'object',
properties: {
name: {
type: 'string',
title: 'Full Name',
description: 'Your full name',
},
email: {
type: 'string',
title: 'Email Address',
description: 'Your email address',
format: 'email',
},
phone: {
type: 'string',
title: 'Phone Number',
description: 'Your phone number (optional)',
},
},
required: ['name', 'email'],
},
});
// ユーザーのレスポンスを処理
if (result.action === 'accept') {
return `Contact information collected: ${JSON.stringify(result.content, null, 2)}`;
} else if (result.action === 'decline') {
return 'Contact information collection was declined by the user.';
} else {
return 'Contact information collection was cancelled by the user.';
}
} catch (error) {
return `Error collecting contact information: ${error}`;
}
},
}),
},
});
Elicitation Request Schema
requestedSchema
はプリミティブなプロパティのみを持つフラットなオブジェクトである必要があります。サポートされる型は次のとおりです:
- String:
{ type: 'string', title: 'Display Name', description: 'Help text' }
- Number:
{ type: 'number', minimum: 0, maximum: 100 }
- Boolean:
{ type: 'boolean', default: false }
- Enum:
{ type: 'string', enum: ['option1', 'option2'] }
スキーマ例:
{
type: 'object',
properties: {
name: {
type: 'string',
title: '氏名',
description: 'フルネームを入力してください',
},
age: {
type: 'number',
title: '年齢',
minimum: 18,
maximum: 120,
},
newsletter: {
type: 'boolean',
title: 'ニュースレターを購読する',
default: false,
},
},
required: ['name'],
}
応答アクション
ユーザーは情報収集リクエストに対して次の3つの方法で応答できます:
- 承認 (
action: 'accept'
): ユーザーがデータを提供し、送信を確認した- 提供されたデータを含む
content
フィールドがある
- 提供されたデータを含む
- 拒否 (
action: 'decline'
): ユーザーが情報提供を明確に拒否した- content フィールドはない
- キャンセル (
action: 'cancel'
): ユーザーが判断せずにリクエストを閉じた- content フィールドはない
ツールは、これら3つの応答タイプすべてを適切に処理する必要があります。
セキュリティ上の考慮事項
- パスワード、SSN、クレジットカード番号などの機密情報を決して要求しない
- 提供されたスキーマに基づいてすべてのユーザー入力を検証する
- 拒否およびキャンセルを丁寧に扱う
- データ収集の明確な理由を提示する
- ユーザーのプライバシーと選好を尊重する
ツール実行 API
情報収集機能はツール実行時の options
パラメータで利用可能です:
// ツールの execute 関数内(createMCPTool を使用)
execute: async (params, { elicitation, extra }) => {
// ユーザー入力に elicitation を使用
const result = await elicitation.sendRequest({
message: string, // ユーザーに表示するメッセージ
requestedSchema: object // 期待される応答構造を定義する JSON スキーマ
}): Promise<ElicitResult>
// 必要に応じて認証情報にアクセス
if (extra?.authInfo) {
// extra.authInfo.token などを使用
}
}
HTTP ベースのトランスポート(SSE または HTTP)を使用する場合、情報収集はセッションを認識します。これは、複数のクライアントが同じサーバーに接続しているとき、情報収集リクエストがツール実行を開始した正しいクライアントセッションにルーティングされることを意味します。
ElicitResult
型:
type ElicitResult = {
action: 'accept' | 'decline' | 'cancel';
content?: any; // action が 'accept' の場合のみ存在
}
認証コンテキスト
HTTP ベースのトランスポートを使用する場合、ツールは options.extra
を通じてリクエストのメタデータにアクセスできます:
execute: async (params, { elicitation, extra }) => {
if (!extra?.authInfo?.token) {
return "Authentication required";
}
// 認証トークンを使用
const response = await fetch('/api/data', {
headers: { Authorization: `Bearer ${extra.authInfo.token}` },
signal: extra.signal,
});
return response.json();
}
extra
オブジェクトには次が含まれます:
authInfo
: 認証情報(サーバーのミドルウェアによって提供される場合)sessionId
: セッション IDsignal
: キャンセル用の AbortSignalsendNotification
/sendRequest
: MCP プロトコルの関数
注: 認証を有効にするには、
server.startHTTP()
を呼び出す前にreq.auth
を設定するミドルウェアを HTTP サーバーに組み込む必要があります。例:httpServer.createServer((req, res) => { // 認証ミドルウェアを追加 req.auth = validateAuthToken(req.headers.authorization); // その後 MCP サーバーへ渡す await server.startHTTP({ url, httpPath, req, res }); });
関連情報
- MastraでMCPサーバーに接続する方法については、MCPClientドキュメントをご覧ください。
- Model Context Protocolの詳細については、@modelcontextprotocol/sdkドキュメント をご覧ください。