こんにちは。
ファインディ株式会社 で Tech Lead をやらせてもらってる戸田です。
現在のソフトウェア開発の世界は、生成AIの登場により大きな転換点を迎えています。
GitHub CopilotやClaude Codeなど生成AIを活用した開発支援ツールが次々と登場し、開発者の日常的なワークフローに組み込まれつつあります。
そのような状況の中で、MCP(Model Context Protocol)の新バージョンが公開され、いくつかの機能が追加されました。
そこで今回は、その中でも特に注目すべき3つの機能について紹介したいと思います。
それでは見ていきましょう!
toolの表示名の項目追加
MCPサーバーにtoolやpromptを登録する際に、title を設定することが出来るようになりました。
今までのMCPサーバーでのtoolの登録は次のようなコードで実行されていました。
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; const mcpServer = new McpServer({ name: "Sample MCP Server", version: "0.0.1" }); mcpServer.registerTool( "addition", { description: "足し算をする", inputSchema:{ a: z.number(), b: z.number() } }, ({ a, b }) => { return { content: [{ type: "text", text: String(a + b) }] }; } );
MCPクライアントからtoolの情報を確認すると、次のような出力になります。
╭───────────────────────────────────────────────────────────────────────────────────────────╮ │ Tools for sample (1 tools) │ │ │ │ ❯ 1. addition │ ╰───────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────╮ │ addition (sample) │ │ │ │ Tool name: addition │ │ Full name: mcp__sample__addition │ │ │ │ Description: │ │ 足し算をする │ ╰───────────────────────────────────────────────────────────────────────────────────────────╯
Tool nameに addition が、Full nameに mcp__sample__addition が設定されているのがわかります。
同じMCPクライアントで複数のMCPサーバーに接続した場合、tool名が重複してしまうケースが有り得ます。そのため、Tool nameとは別にFull nameが用意されており、MCPサーバー名とtool名を組み合わせた一意な名前が用意されています。
しかしここで重要な問題が起こります。MCPクライアントによっては、Full nameに文字数制限が存在しており、制限を越えてしまうとMCPサーバーの実行に影響が出ることがあります。とはいえ、tool名はLLMが実行対象を決めるための判断材料となっているため、短縮しすぎることはできません。
そこで今回追加された title の出番です。title を次のように設定します。
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; const mcpServer = new McpServer({ name: "Sample MCP Server", version: "0.0.1" }); mcpServer.registerTool( "addition", { description: "足し算をする", inputSchema:{ a: z.number(), b: z.number() }, annotations: { title: "add two numbers", } }, ({ a, b }) => { return { content: [{ type: "text", text: String(a + b) }] }; } );
MCPクライアントでtool情報を再確認すると、次のような出力に変化します。
╭───────────────────────────────────────────────────────────────────────────────────────────╮ │ Tools for sample (1 tools) │ │ │ │ ❯ 1. add two numbers │ ╰───────────────────────────────────────────────────────────────────────────────────────────╯ ╭───────────────────────────────────────────────────────────────────────────────────────────╮ │ add two numbers (sample) │ │ │ │ Tool name: addition │ │ Full name: mcp__sample__addition │ │ │ │ Description: │ │ 足し算をする │ ╰───────────────────────────────────────────────────────────────────────────────────────────╯
title を活用することで、Full nameの文字数制限を気にすることなく、よりわかりやすい名前をMCPクライアントに提供できるようになります。
MCPサーバーからの出力データの構造化
MCPサーバーにtool等を登録する際に inputSchema を設定することは以前から可能でしたが、今回のバージョンアップから outputSchema を設定できるようになりました。
outputSchema を定義して、MCPサーバーからのresponseに、content とは別に structuredContent を設定することで、MCPクライアントは構造化されたデータを受け取ることができるようになります。
実際に outputSchema を設定したMCPサーバーのtoolを見てみましょう。
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; const mcpServer = new McpServer({ name: "Sample MCP Server", version: "0.0.1" }); mcpServer.registerTool( "addition", { description: "足し算をする", inputSchema:{ a: z.number(), b: z.number() }, outputSchema: { result: z.number().describe("Sum of the two numbers") }, }, ({ a, b }) => { const result = a + b; return { content: [{ type: "text", text: JSON.stringify({ result }) }], structuredContent: { result } }; } );
toolを登録する際に、inputSchema だけではなく outputSchema も設定しています。更にtoolのresponseには content に加えてstructuredContent を追加しています。
後方互換性を持たせるために、content には structuredContent をJSON文字列に変換して返します。
これらの設定により、MCPクライアントはtoolの実行結果をより構造化された形で受け取ることができます。
今回の outputSchema と structuredContent の追加により、MCPクライアントとLLMがMCPサーバーからのresponseをより適切に解析して利用できるようになることを期待できます。
Elicitation
最後になりますが、今回のMCPの新バージョンで追加された機能の中でも特に注目すべき機能が Elicitation です。
Elicitation を活用することで、MCPサーバーとMCPクライアントの通信中に、ユーザーに追加情報を要求できるようになります。
今まで紹介したMCPの機能とは一線を画しているのでイメージしづらいと思いますので、実際のコードと具体例で説明していきます。
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; const mcpServer = new McpServer({ name: "Sample MCP Server", version: "0.0.1" }); mcpServer.registerTool( "validate_username", {}, async () => { const elicitInputResponse = await mcpServer.server.elicitInput({ message: "Input your username.", requestedSchema: { type: "object", properties: { username: { type: "string", title: "your username", description: "input your username." } }, required: ["username"] } }); if (elicitInputResponse.action !== 'accept') { throw new Error("username is required."); } const userName = elicitInputResponse.content?.['username'] as string; if (userName.length > 12) { throw new Error("username must be less than 12 characters."); } return { content: [{ type: "text", text: `${userName} is valid.` }], }; } );
elicitInput を呼び出すことで、ユーザーに追加情報を要求できます。GitHub Copilotで実行した場合、次のような表示になります。

usernameを入力するように要求されているので、次のように入力してみます。

追加要求が成功した場合、ユーザーの入力内容を取得でき、その内容を元に処理を続行できます。
今回は入力されたユーザー名の長さをチェックして、12文字以下であれば有効なユーザー名として処理を続行しています。
今回は12文字以内で入力して送信したため、次のような結果になりました。

また、elicitInput は文字列の入力だけではなく、enumを使って選択式にするといったことも可能です。選択式にすることにより、入力内容からの分岐をより明確にできます。
mcpServer.server.elicitInput({ message: "select period", requestedSchema: { type: "object", properties: { period: { type: "string", title: "Period", description: "Select the period", enum: ["today", "yesterday", "this_week"], enumNames: ["Today", "Yesterday", "This week"] } }, required: ["period"] } });

このように Elicitation を活用することで、MCPサーバーからの追加要求を通じて、ユーザーとのインタラクションをより柔軟に行うことが可能になります。MCPサーバーの使い方、作り方、提供内容がより多様化し、ユーザーにとっても使いやすいツールを提供できるようになることが期待されます。
まとめ
いかがでしたでしょうか?
今回紹介したMCPの新バージョンでは、 title、 outputSchema と structuredContent、そして Elicitation といった重要な機能が追加されました。
これらの機能は、MCPサーバーとMCPクライアントの連携をより強化し、ユーザーにとって使いやすいツールを提供することが期待できます。
現在、ファインディでは一緒に働くメンバーを募集中です。
興味がある方はこちらから ↓ herp.careers