LINEヤフー Tech Blog

LINEヤフー株式会社のサービスを支える、技術・開発文化を発信しています。

This post is also available in the following languages. English, Korean, Chinese

MCPの概念とLINE Messaging APIを利用したMCPサーバー構築事例の紹介

はじめに

先日、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を利用する場合を比較したものです。

image

例えば、LINEのオープンソースライブラリArmeriaで特定のコードを検索したい場合、LLMアプリケーションにプロンプトを入力してリクエストを送信すると、LLMアプリケーションは実際にGitHubにアクセスしてArmeriaライブラリを調べるのではなく、事前に学習したモデルに基づいて応答します。これは、AIのハルシネーションが発生する可能性がある状況です。

一方、GitHub MCPを使用すると、LLMアプリケーションがGitHubに接続し、実際のArmeriaリポジトリで対象コードを検索した後、検索結果に基づいて応答します。ただ、そのためには外部サービスであるGitHubがMCPサーバーを提供する必要があり、使用するLLMアプリケーションはこのMCPを使って呼び出す必要があります。このようにLLMアプリケーションで外部機能を利用できるように定義したプロトコルをMCPと言います(ちなみにGitHubは実際にGitHub MCPを提供しています)。

アーキテクチャ

MCPは基本的にホストのクライアントがサーバーと接続するクライアント/サーバーアーキテクチャに基づいています。

image

このアーキテクチャは、ホスト、クライアント、サーバーの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は、どのように実装するかによってさまざまな方法で動作します。この記事では、下図に沿って最も基本的な方法を説明します。

image

  1. MCPホストが実行されると、MCPクライアントを通じてMCPサーバーのtools/listエンドポイントを呼び出し、利用可能なツールのリストを取得します。
  2. ユーザーは、MCPホストにプロンプトを送信します。
  3. MCPホストは、ユーザーのプロンプトと事前に取得したツールリストをLLMモデルに送信します。LLMモデルは、ツールリストを基に必要なツールを使用すると応答します。
  4. MCPホストは、MCPクライアントを通じてMCPサーバーのtools/callエンドポイントに、そのツールの使用をリクエストします。
  5. MCPホストは、MCPサーバーからのツール応答と既存のユーザーのプロンプトをLLMモデルに送信し、これに基づいてLLMモデルは最終応答を生成します。
  6. 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サーバーを構築するためには、以下の準備が必要です。

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サーバーが自動的に実行されます。上記の設定ファイルにどのような情報が入力され、入力された情報はどのような役割を果たすのか、簡単に説明します。

  • mcpServersline-mcpを追加(「line-mcp」という名前でMCPサーバーを登録)
  • commanduvのパスを入力(サーバー実行コマンドを入力)
    • macOSでuvが正常に動作しない場合、シェルでwhich uvを実行してuvのパスを確認し、そのパスを入力
  • argsに実行するプロジェクトの場所と実行ファイルを入力
  • envCHANNEL_ACCESS_TOKEN設定を追加し、取得したチャネルアクセストークンを入力

設定ファイルを保存し、Claudeデスクトップアプリケーションを実行します。正しく設定した場合、以下の画像のように利用可能なMCPツールがあることを確認できます。

image

MCPを使用する

本格的に私たちが構築したMCPサーバーとClaudeデスクトップアプリケーションを利用してMCPを使用します。そのために、以下のような状況を想定してみます。

"私たちは「おいしい」という寿司店を経営しており、マーケティングにLINE公式アカウントを使用しています。"

私たちの公式アカウントを友だちに追加したお客様に寿司を宣伝するメッセージを送るために、LINE Messaging APIが提供するbroadcast APIを利用したいと思います。以下のプロンプトを使って、お客様に寿司を宣伝するメッセージを送信してみます。

私は寿司店「おいしい」の店長です。
お客様に寿司を宣伝するメッセージを送ってください。

プロンプトを入力すると、MCPホストは内部的にbroadcast_messageツールを使用します。「Claudeデスクトップアプリケーション」のUIで、プラグのアイコンとともにツールが使用されていることが確認でき、実際に公式アカウントからメッセージが送信されていることが確認できます。

image

上記の動作プロセスをより詳しく説明すると、以下のようになります。

  1. ユーザーがClaudeデスクトップアプリケーション(MCPホスト)を起動すると同時に、設定ファイルに書かれたcommand設定を通じてMCPサーバーが実行されます。
  2. MCPホストは、MCPクライアントを通じてMCPサーバーのtools/listエンドポイントを呼び出し、利用可能なツールのリストを取得します。
  3. MCPホストは、ユーザーが入力したプロンプトを利用可能なツールのリストとともにLLMモデルに送信します。
  4. LLMモデルは、ユーザーが入力したプロンプトのうち「メッセージを送って」という部分からbroadcast_messageツールの使用を決定し、MCPホストにそのツールの使用を指示します。
  5. MCPホストは、broadcast_messageツールのdescriptionで指定されている形式のリクエストを生成し、MCPクライアントを通じてMCPサーバーにそのツールを呼び出します。
  6. MCPサーバーは、tools/callエンドポイントを通じてリクエストを受け取って、定義されたツールを実行し、LINE Messaging APIにリクエストを送信します。

MCPを応用する

他のMCPサーバーを追加して、より多様なユースケースを作成してみましょう。

天気によって食べたい寿司が変わってくると思うので、今度は、その日の天気に合う寿司を宣伝するメッセージを送信してみます。天気情報を取得するために、私たちが構築したMCPサーバーではなく、別のMCPサーバーを使ってみます。MCP GitHubのserversリポジトリには、利用可能なMCPサーバーが何種類か用意されています。その中で、天気検索のためにBrave Searchを使用します。Brave Searchは検索エンジンで、MCPを使って検索できるツールを提供しています。ちなみにこのツールを使用するには、Brave Searchに会員登録後、APIキーを取得する必要があります。詳しくは、MCP GitHubのBrave Search MCP Serverを参照してください。

準備ができたら、以下のプロンプトを使って、お客様に寿司を宣伝するメッセージを送信します。

私は寿司店「おいしい」の店長です。
明日の天気に合う寿司を宣伝するメッセージを送ってください。

上記のプロンプトを入力すると、MCPホストが天気に合う寿司を宣伝するメッセージを送信することが確認できます。

image

上記の動作プロセスをより詳しく説明すると、以下のようになります。

  1. MCPホストは、ユーザーが入力したプロンプトを利用可能なツールのリストとともにLLMモデルに送信します。
  2. LLMモデルは、ユーザーが入力したプロンプトのうち「明日の天気」という部分からbrave MCPサーバーのbrave_web_searchツールの使用を決定し、MCPホストにそのツールの使用を指示します。
  3. MCPホストはMCPクライアントを通じてそのツールを呼び出し、brave MCPサーバーは内部的に指定された検索エンジンから天気情報を検索して応答します。
  4. MCPホストは天気情報を活用し、天気に合う寿司を宣伝するメッセージを作成します。
  5. MCPホストは、先に構築したline-mcp MCPサーバーのbroadcast_messageツールを呼び出します。
  6. 最終的に、line-mcp MCPサーバーはLINE Messaging APIを利用して、LINE公式アカウントを友だち登録したユーザーにメッセージを送信します。

おわりに

いかがだったでしょうか?MCPの世界はとても面白いと思いませんか?LLMを外部サービスと連携できれば、より強力なツールとなり、生産性もさらに向上することでしょう。このような期待からMCPサービスがどんどん出てきており、OpenAIのような他のLLMモデルプロバイダーもMCPを導入したり、独自のプロトコルを構築したりすることが予想されます。

LINE GitHubでは、必要な方が自由に使用できるよう、以下のように公式が作成したMCPサーバーを提供しています。

この記事の読者のみなさんには、MCPを活用したアプリケーションを使っていただき、MCPの力を実感していただければと思います。ありがとうございました。