はじめに
先日、Anthropic社はClaude LLMを通じてモデルコンテキストプロトコル(Model Context Protocol、以下MCP)を発表しました。MCPは、大型言語モデル(large language model、以下LLM)が外部のデータソースや機能を利用するためのプロトコルで、誰でも利用可能なオープンプロトコルとしてAnthropic社が公開しました(参考)。これにより、多くのサービスでMCPをサポートするようになり、多くのユーザーがMCPを使ってLLMと外部サービスを接続する方法に興味を持ち始めました。
この記事では、注目されているMCPの概念とアーキテクチャについて説明し、LINE Messaging APIを利用してMCPサーバーを実装する方法を紹介します。
MCPの概要
MCPとは、LLMが外部機能を利用できるように支援するプロトコルです。下図は、LLMを単体で使用する場合とMCPを利用する場合を比較したものです。
例えば、LINEのオープンソースライブラリArmeriaで特定のコードを検索したい場合、LLMアプリケーションにプロンプトを入力してリクエストを送信すると、LLMアプリケーションは実際にGitHubにアクセスしてArmeriaライブラリを調べるのではなく、事前に学習したモデルに基づいて応答します。これは、AIのハルシネーションが発生する可能性がある状況です。
一方、GitHub MCPを使用すると、LLMアプリケーションがGitHubに接続し、実際のArmeriaリポジトリで対象コードを検索した後、検索結果に基づいて応答します。ただ、そのためには外部サービスであるGitHubがMCPサーバーを提供する必要があり、使用するLLMアプリケーションはこのMCPを使って呼び出す必要があります。このようにLLMアプリケーションで外部機能を利用できるように定義したプロトコルをMCPと言います(ちなみにGitHubは実際にGitHub MCPを提供しています)。
アーキテクチャ
MCPは基本的にホストのクライアントがサーバーと接続するクライアント/サーバーアーキテクチャに基づいています。
このアーキテクチャは、ホスト、クライアント、サーバーの3つの主体で構成されており、それぞれの役割は以下のとおりです。
- ホスト:MCPを使用するLLMアプリケーションを指し、ユーザーのリクエストを受けて応答するアプリケーションです。以下の例では、「Claudeデスクトップアプリケーション」がホストに相当します。
- クライアント:ホストの内部モジュールで、MCPサーバーにリクエストを送信し、応答を受けてホストに返します。
- サーバー:ホストの外部に存在し、MCPクライアントからのリクエストを処理して応答するアプリケーションです。
コンポーネント
MCPホストが使用できる要素はさまざまです。その中で最も重要な要素であるツールとリソースを紹介します。
ツール
ツール(tools)はMCPの中核要素で、外部機能を実行できるようにMCPサーバーが提供します。MCPサーバーは、実行可能なツールのリストを確認できるtools/list
エンドポイントと、目的のツールを呼び出せるtools/call
エンドポイントを提供します。MCPホストは、ユーザープロンプトに対する応答を処理する過程で外部機能の呼び出しが必要な場合、MCPクライアントを通じてMCPサーバーが提供するツールを使用します。
例えば、GitHub MCPサーバーはcreate_pull_request
というツールを提供しており、ユーザーはプロンプトを通じてそのツールを使って新しいプルリクエストを作成できます。
リソース
リソース(resources)もMCPの中核要素で、MCPサーバーが提供できるさまざまな形のデータやコンテンツを意味します。リソースは、ファイルの内容やデータベースレコード、API応答などさまざまな形で存在します。MCPクライアントは、MCPサーバーに使用可能なリソースのリストをリクエストし て受け取り、その中で必要なリソースを再度リクエストし、データが取得できます。MCPクライアントが取得したデータはMCPホストに提供され、MCPホストはそのデータをユーザーのプロンプトへの応答に活用できます。
例えば、GitHub MCPサーバーではrepo://{owner}/{repo}/contents{/path*}
APIリソースを通じて特定のリポジトリのソースコードを提供します。
仕組み
MCPは、どのように実装するかによってさまざまな方法で動作します。この記事では、下図に沿って最も基本的な方法を説明します。
- MCPホストが実行されると、MCPクライアントを通じてMCPサーバーのtools/listエンドポイントを呼び出し、利用可能なツールのリストを取得します。
- ユーザーは、MCPホストにプロンプトを送信します。
- MCPホストは、ユーザーのプロンプトと事前に取得したツールリストをLLMモデルに送信します。LLMモデルは、ツールリストを基に必要なツールを使用すると応答します。
- MCPホストは、MCPクライアントを通じてMCPサーバーのtools/callエンドポイントに、そのツールの使用をリクエストします。
- MCPホストは、MCPサーバーからのツール応答と既存のユーザーのプロンプトをLLMモデルに送信し、これに基づいてLLMモデルは最終応答を生成します。
- MCPホストは、LLMモデルからの最終応答を加工してユーザーに返します。
LINE Messaging APIを利用したMCPの活用例
では、LINEのMessaging APIを利用して実際にMCPを使ってみます。LINEはLINE公式アカウント(Official Account、OA)のためのMessaging APIを提供しており、これによって公式アカウントを友だちに登録したユーザーにメッセージを送信するなどのアクションが可能です。これを利用してMCPサーバーを構築してみます。MCP公式ユーザーガイドのFor Server DevelopersドキュメントやLINE DevelopersサイトのMessaging APIドキュメントも併せてご参照ください。
事前準備
LINE Messaging APIを利用してMCPサーバーを構築するためには、以下の準備が必要です。
- Claudeデスクトップアプリケーションのインストール(参考)
- LINE Messaging APIを使用する準備
- LINE DevelopersのGet started with the Messaging APIを参照し、公式アカウントを作成した後、Messaging APIを有効にしてチャネルを作成する
- LINE Developer Consoleにアクセスし、1で作成したチャネルのMessaging APIタブの下部からチャネルアクセストークン(channel access token)を発行する
- LINEアカウントで作成したチャネル(LINE公式アカウント)を友だちに追加する
LINE Messaging APIを使用する準備が完了したら、取得したチャネルアクセストークンを使ってAPIが正常に動作することを確認します。今回はシェル(shell)で確認します。以下のように、上記の2で 取得したチャネルアクセストークンをAuthorization
ヘッダに記載し、broadcast
APIを呼び出します(broadcast
APIの仕様については、LINE Messaging API公式ガイドのSend broadcast messageを参照してください)。
curl -v -X POST https://api.line.me/v2/bot/message/broadcast \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer {Channel Access Token}" \
-H "X-Line-Retry-Key: ${uuidgen}" \
-d '{
"messages": [
{
"type": "text",
"text": "Hello, world"
}
]
}'
上記のコマンドを実行したとき、あらかじめ友だちに追加した公式アカウントからメッセージが届けば成功です!
MCPサーバーの開発
では、本格的にMCPサーバーを開発してみます。まず、MCP公式ユーザーガイドを参照し、uv
をインストールした後、Pythonプロジェクトを作成してmain.pyを作成します。
# プロジェクト用の新しいディレクトリの作成
uv init line-mcp
cd line-mcp
# 仮想環境の作成と有効化
uv venv
source .venv/bin/activate
# 依存関係のインストール
uv add "mcp[cli]" httpx
# サーバーファイルの作成
touch main.py
次に、以下のPythonコードをmain.pyに追加します。以下のコードは、broadcast_message
というツールを提供するシンプルなMCPサーバーを作成するコードです。MCPクライアントがbroadcast_message
ツールでメッセージを送信すると、LINE Messaging APIの「https://api.line.me/v2/bot/message/broadcast」エンドポイントを呼び出し、受け取ったメッセージをすべての友だちに送信します。
# main.py
import os
import uuid
import httpx
from mcp.server.fastmcp import FastMCP
# FastMCPサーバーの初期化
# "line" チャネルを使用し、httpxとxmltodictを依存関係として追加
mcp = FastMCP("line", dependencies=["httpx", "xmltodict"])
# 環境変数からCHANNEL_ACCESS_TOKENを取得
# LINE Developer Consoleから取得したトークンを設定します。
CHANNEL_ACCESS_TOKEN = os.environ.get("CHANNEL_ACCESS_TOKEN")
@mcp.tool(
name="broadcast_message",
description="LINE Messaging APIを使用してメッセージをブロードキャストします。'messages'パラメータには最大5つのメッセージを指定できます。サポートされているメッセージタイプ:\n"
"- テキストメッセージ: {'type': 'text', 'text': 'Hello, world'}\n"
)
def broadcast_message(messages: list):
# HTTPリクエストヘッダーの設定
# Content-Type:JSON形式
# Authorization:LINE API認証のためのBearerトークン
# X-Line-Retry-Key:リクエストの重複を防ぐための一意のキー(UUIDを使用)
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {CHANNEL_ACCESS_TOKEN}",
"X-Line-Retry-Key": str(uuid.uuid4()),
}
# LINE Messaging APIにHTTP POSTリクエストを送信
# ブロードキャストエンドポイントを使用し、入力メッセージを友だち全員に送信します。
with httpx.Client() as client:
response = client.post(
"https://api.line.me/v2/bot/message/broadcast",
headers=headers,
json={"messages": messages},
)
return response.text
if __name__ == "__main__":
# FastMCPサーバーをstdioトランスポートで実行
mcp.run(transport="stdio")
プロジェクトが正しく作成されたことを確認するために、以下のコマンドを実行してMCPサーバーを起動します。正常に動作すれば、MCPサーバーの構築は完了です。
uv run main.py
ClaudeデスクトップアプリケーションにMCPサーバーを設定
Claudeデスクトップアプリケーション(MCPホスト)でMCPサーバーを使用するには、使用するサーバー情報をホストに登録する必要があります。また、MCPホストに登録するには、設定ファイルを変更する必要があります。MCP公式ユーザーガイドを参照し、claude_desktop_config.json設定ファイルを開いて先に構築したMCPサーバー(line-mcp
)を追加します。
{
"mcpServers": {
"line-mcp": {
"command": "uv",
"args": [
"--directory",
"/{Project Parent Location}/line-mcp",
"run",
"main.py"
],
"env": {
"CHANNEL_ACCESS_TOKEN": "{channel_access_token}"
}
}
}
}
上記のように設定すると、Claudeデスクトップアプリケーションの起動時に、設定した情報に従って構築したMCPサーバーが自動的に実行されます。上記の設定ファイルにどのような情報が入力され、入力された情報はどのような役割を果たすのか、簡単に説明します。
mcpServers
にline-mcp
を追加(「line-mcp」という名前 でMCPサーバーを登録)command
にuv
のパスを入力(サーバー実行コマンドを入力)- macOSで
uv
が正常に動作しない場合、シェルでwhich uv
を実行してuv
のパスを確認し、そのパスを入力
- macOSで
args
に実行するプロジェクトの場所と実行ファイルを入力env
にCHANNEL_ACCESS_TOKEN
設定を追加し、取得したチャネルアクセストークンを入力
設定ファイルを保存し、Claudeデスクトップアプリケーションを実行します。正しく設定した場合、以下の画像のように利用可能なMCPツールがあることを確認できます。
MCPを使用する
本格的に私たちが構築したMCPサーバーとClaudeデスクトップアプリケーションを利用してMCPを使用します。そのために、以下のような状況を想定してみます。
"私たちは「おいしい」という寿司店を経営しており、マーケティングにLINE公式アカウントを使用しています。"
私たちの公式アカウントを友だちに追加したお客様に寿司を宣伝するメッセージを送るために、LINE Messaging APIが提供するbroadcast
APIを利用したいと思います。以下のプロンプトを使って、お客様に寿司を宣伝するメッセージを送信してみます。
私は寿司店「おいしい」の店長です。
お客様に寿司を宣伝するメッセージを送ってください。
プロンプトを入力する と、MCPホストは内部的にbroadcast_message
ツールを使用します。「Claudeデスクトップアプリケーション」のUIで、プラグのアイコンとともにツールが使用されていることが確認でき、実際に公式アカウントからメッセージが送信されていることが確認できます。
上記の動作プロセスをより詳しく説明すると、以下のようになります。
- ユーザーがClaudeデスクトップアプリケーション(MCPホスト)を起動すると同時に、設定ファイルに書かれた
command
設定を通じてMCPサーバーが実行されます。 - MCPホストは、MCPクライアントを通じてMCPサーバーの
tools/list
エンドポイントを呼び出し、利用可能なツールのリストを取得します。 - MCPホストは、ユーザーが入力したプロンプトを利用可能なツールのリストとともにLLMモデルに送信します。
- LLMモデルは、ユーザーが入力したプロンプトのうち「メッセージを送って」という部分から
broadcast_message
ツールの使用を決定し、MCPホストにそのツールの使用を指示します。 - MCPホストは、
broadcast_message
ツールのdescription
で指定されている形式のリクエストを生成し、MCPクライアントを通じてMCPサーバーにそのツールを呼び出します。 - MCPサーバーは、
tools/call
エンドポイントを通じてリクエストを受け取って、定義されたツールを実行し、LINE Messaging APIにリクエストを送信します。