MCPアップデート(2025-06-18)徹底解説!開発体験を変える3つの新機能とは!?

こんにちは。

ファインディ株式会社 で Tech Lead をやらせてもらってる戸田です。

現在のソフトウェア開発の世界は、生成AIの登場により大きな転換点を迎えています。

GitHub CopilotやClaude Codeなど生成AIを活用した開発支援ツールが次々と登場し、開発者の日常的なワークフローに組み込まれつつあります。

そのような状況の中で、MCP(Model Context Protocol)の新バージョンが公開され、いくつかの機能が追加されました。

modelcontextprotocol.io

そこで今回は、その中でも特に注目すべき3つの機能について紹介したいと思います。

それでは見ていきましょう!

toolの表示名の項目追加

MCPサーバーにtoolやpromptを登録する際に、title を設定することが出来るようになりました。

github.com

今までの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 を設定できるようになりました。

modelcontextprotocol.io

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の実行結果をより構造化された形で受け取ることができます。

今回の outputSchemastructuredContent の追加により、MCPクライアントとLLMがMCPサーバーからのresponseをより適切に解析して利用できるようになることを期待できます。

Elicitation

最後になりますが、今回のMCPの新バージョンで追加された機能の中でも特に注目すべき機能が Elicitation です。

modelcontextprotocol.io

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で実行した場合、次のような表示になります。

elicitInputの要求

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

usernameを入力

追加要求が成功した場合、ユーザーの入力内容を取得でき、その内容を元に処理を続行できます。

今回は入力されたユーザー名の長さをチェックして、12文字以下であれば有効なユーザー名として処理を続行しています。

今回は12文字以内で入力して送信したため、次のような結果になりました。

toolの実行結果

また、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の新バージョンでは、 titleoutputSchemastructuredContent、そして Elicitation といった重要な機能が追加されました。

これらの機能は、MCPサーバーとMCPクライアントの連携をより強化し、ユーザーにとって使いやすいツールを提供することが期待できます。

現在、ファインディでは一緒に働くメンバーを募集中です。

興味がある方はこちらから ↓ herp.careers