はじめに

生成 AI の技術は日進月歩ですが、昨今よく聞く話題の一つに MCP (Model Context Protocol) があります。

公式サイト を見ると MCP は『AI アプリケーション用の USB-C ポートのようなもの』という説明がされています。
ちなみに、私はこの説明で挫折しました。

この記事では、生成 AI を活用して具体的なビジネスニーズにあったエージェントを作成するエンジニアの方に向けて、私が MCP を使って覚えた、MCP とは何か? について説明を行います。

ニーズの整理

新しい技術には、常に新しいニーズが隠れています。
ニーズについて整理を行い、MCP が何を目的としているのか理解したいと思います。

私が理解するところでは、MCP は生成 AI が主体的な動作を行うためのプロトコルです。

生成 AI で、外部 API 連携を行う場合などは、tools という形で連携を実装する必要がありました。
これは、API ごとに車輪の再発明が必要となるとともに、個々の生産性も低い作業となっています。

MCP が実現する機能

MCP によって、外部連携に関わる機能を、外部サービス提供者が MCP Server として提供できるようになります。

外部連携が MCP Server という形で汎用的に提供されるため、LLM 利用者側での個別の連携開発作業が省略されます。
また、個々の機能は Resources / Prompts / Tools / Sampling / etc. といった、生成 AI で汎用的に利用される形で提供されるため、再利用性が非常に高くなっています。

プログラム例

エンジニアとして見る場合、コードを見たほうが分かりやすいです。

MCP Server

MCP Server は、外部ツールのデータを提供する側の機能です。

生成 AI に関するライブラリなので、LLM などとの連携がされるような機能かと誤解されがちですが、基本的には必要ありません。
MCP Server に求められる機能は、LLM が活用するデータを、LLM が利用可能な形で提供することです。

MCP Server Core Concepts のコードを見てみます。

MCP は、STDIO 経由および、Streamable HTTP で提供されています。
Streamable HTTP を利用する際は、express サーバーなどと連携してください。

Resources

Resources は、URI で指定されるリソースを返す形式のデータです。
URL は、config のような固定も、users://{userId}/profile のような可変も可能です。
単純にデータを提供するような種類のデータは、Resource が適しています。

// Static resource
server.resource(
  "config",
  "config://app",
  async (uri) => ({
    contents: [{
      uri: uri.href,
      text: "App configuration here"
    }]
  })
);

Tools

Tools は、データ提供元のデータへの副作用を伴うような指示や、計算結果を返すような用途に汎用的に利用されます。
計算結果や、現在の天気など、動的に結果が変わるものについては Tools が適しています。

// Simple tool with parameters
server.tool(
  "calculate-bmi",
  {
    weightKg: z.number(),
    heightM: z.number()
  },
  async ({ weightKg, heightM }) => ({
    content: [{
      type: "text",
      text: String(weightKg / (heightM * heightM))
    }]
  })
);

Prompts

プロンプトは、LLM が再利用する効果的なプロンプトを提供するものです。
これに関しては、私がまだ効果的な使い方を理解しきれていないため、このような形の提供も可能という説明に止めさせていただきます。
(今後、具体的な使い方が分かり次第、追記します)

server.prompt(
  "review-code",
  { code: z.string() },
  ({ code }) => ({
    messages: [{
      role: "user",
      content: {
        type: "text",
        text: `Please review this code:\n\n${code}`
      }
    }]
  })
);

MCP Client

続いて、MCP Client に関して見てみます。
LangChain では、MCP に関する機能は LangChain.js MCP Adapters として提供されています。

Client から、重要な箇所を抜粋してみてみます。

最小限の例に絞ると、下記のような形になります。
MCP Server の URLを指定して初期化を行うことで、tools を取得できる例がわかります。

(ここでは、LLM との連携や invoke は省略します。通常の tools と変わりません)

// Create client and connect to server
const client = new MultiServerMCPClient({
  // Server configuration
  mcpServers: {
   // Sreamable HTTP transport example, with auth headers and automatic SSE fallback disabled (defaults to enabled)
    weather: {
      url: "https://example.com/weather/mcp",
      headers: {
        Authorization: "Bearer token123",
      }
      automaticSSEFallback: false
    },
  },
});

const tools = await client.getTools();

まとめ

MCP は生成 AI の拡張方法で、近年大きく活用が進んでいます。

LLM などの生成 AI 側と、データ提供側をつなぐためのプロトコルが MCP です。
これを活用することで、LLM 側では URL を指定するだけで LLM に利用するデータを取得でき、データ提供側では汎用的なプロトコルで複数の LLM に対してデータ提供が可能となります。

車輪の再開発をなくし、生成 AI を活用した開発の効率を上げるためにも、これらの技術を正しく活用できると良いと考えます。