LY Corporation Tech Blog

支持 LY Corporation 和 LY Corporation Group (LINE Plus, LINE Taiwan and LINE Vietnam) 服務,宣傳技術和開發文化。

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

MCP 介紹:用 LINE Messaging API 打造 MCP 伺服器

最近,Anthropic 透過 Claude 大型語言模型(LLM)發表了 model context protocol(MCP)。MCP 是一種幫助 LLM 使用外部資料來源或功能的協定,Anthropic 也已經把它開放成大家都能用的協定(參考資料)。因此,現在有越來越多服務開始支援 MCP,也有很多人關心要怎麼用 MCP 讓 LLM 跟外部服務串接。

這篇文章會說明 MCP 這個備受關注的協定的概念和架構,並介紹如何用 LINE Messaging API 實作一個 MCP 伺服器。

MCP 介紹

MCP 是一個讓 LLM 可以用外部功能的協定。下面這張圖比較了 LLM 有沒有用 MCP 的差異。

image

舉例來說,如果你想在 LINE 的開源程式庫 Armeria 搜尋特定程式碼,然後寫個 prompt 給 LLM 應用程式,這個 LLM 應用程式會根據訓練資料回應,而不會真的去 GitHub 查 Armeria 程式庫。這就可能導致 AI 幻覺(hallucination)。

但如果用 GitHub MCP,LLM 應用程式會實際去 GitHub 查 Armeria repo 裡的程式碼,然後根據查到的結果回應。要做到這件事,外部服務(例如 GitHub)必須有 MCP server,LLM 應用程式還要能呼叫這個 MCP。這個讓 LLM 應用程式能用外部功能的協定就叫 MCP(補充:GitHub 真的有提供 GitHub MCP)。

架構

MCP 採用 client-server 架構,host 的 client 會連到 server。

image

這個架構主要有三個角色:host、client、server,各自的角色如下:

  • Host:就是用 MCP 的 LLM 應用程式,負責接收和回應使用者請求。下一節的範例裡,Claude 桌面應用程式就是 host。
  • Client:host 內部的模組,負責把請求送到 MCP server,然後把回應帶回給 host。
  • Server:host 以外的實體,負責處理 MCP client 傳來的請求並回應。

元件

MCP host 可以用的元素很多,這裡介紹最重要的兩個:工具(tools)和資源(resources)。

工具(Tools)

工具是 MCP 的核心元素,由 MCP server 提供外部功能。MCP server 會有 tools/list endpoint 可以查有哪些工具,還有 tools/call endpoint 可以呼叫想用的工具。MCP host 在處理使用者 prompt 時需要呼叫外部功能,就會透過 MCP client 使用 MCP server 提供的工具。

例如 GitHub MCP server 有個 create_pull_request 工具,使用者可以直接透過 prompt 建立新的 PR。

資源(Resources)

資源也是 MCP 的核心元素,意思是 MCP server 可以提供的各種資料或內容。資源可以是檔案內容、資料庫紀錄或 API 回應等。MCP client 會先跟 MCP server 要一份可用資源清單,再請求需要的資源來取得資料。這些資料會交給 MCP host,host 可以用來回應使用者 prompt。

例如 GitHub MCP server 可以透過 repo://{owner}/{repo}/contents{/path*} API resource,提供指定 repo 的原始碼。

運作方式

MCP 的運作方式會因為實作不同而有差異,這篇文章介紹最基本的方式,請參考下圖。

image

  1. MCP host 啟動時,會透過 MCP client 呼叫 MCP server 的 tools/list endpoint,取得可用工具清單。
  2. 使用者送出 prompt 到 MCP host。
  3. MCP host 把使用者 prompt 和工具清單傳給 LLM 模型,LLM 模型會決定要用哪些工具。
  4. MCP host 透過 MCP client 呼叫 MCP server 的 tools/call endpoint 使用工具。
  5. MCP host 把 MCP server 回傳的工具結果和原本的 prompt 一起傳給 LLM 模型,LLM 會根據這些資訊產生最終回應。
  6. MCP host 處理 LLM 模型的最終回應,並傳給使用者。

MCP 搭配 LINE Messaging API 的應用案例

現在我們直接用 LINE 的 Messaging API 來實際操作 MCP。LINE 為官方帳號(OA)提供 Messaging API,可以對加好友的使用者發送訊息。我們就用這個來打造 MCP server。建議同時參考 MCP 官方使用指南(For Server Developers)LINE Developers 的 Messaging API 文件

準備工作

要用 LINE Messaging API 建立 MCP server,需要先完成以下準備:

完成 LINE Messaging API 的設定後,用取得的 channel access token 測試 API 是否可用。本文用 shell 驗證,在 Authorization header 放入剛剛取得的 token,然後呼叫 broadcast API(詳細規格請參考 LINE Messaging API 官方文件)。

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 server。請先參考 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

接著在 main.py 裡加入以下 Python 程式碼。這段程式會建立一個簡單的 MCP 伺服器,提供一個叫 broadcast_message 的工具。當 MCP client 透過 broadcast_message 工具送出訊息時,會呼叫 LINE Messaging API 的 `https://api.line.me/v2/bot/message/broadcast` endpoint,把收到的訊息廣播給所有好友。

# main.py
import os
import uuid
import httpx
from mcp.server.fastmcp import FastMCP

# 初始化 FastMCP 伺服器
# 使用 "line" channel,並加上 httpx、xmltodict 相依套件
mcp = FastMCP("line", dependencies=["httpx", "xmltodict"])

# 從環境變數取得 CHANNEL_ACCESS_TOKEN
# 請設定從 LINE Developer Console 取得的 token
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: Bearer token(LINE API 認證)
    # X-Line-Retry-Key: 防止重複請求的唯一識別碼(UUID)
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {CHANNEL_ACCESS_TOKEN}",
        "X-Line-Retry-Key": str(uuid.uuid4()),
    }
    # 送出 HTTP POST 請求到 LINE Messaging API
    # 用 broadcast endpoint 把訊息廣播給所有好友
    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__":
    # 用 stdio transport 執行 FastMCP 伺服器
    mcp.run(transport="stdio")

為了驗證專案是否建立成功,可以用以下指令啟動 MCP 伺服器。如果沒出錯,代表 MCP server 設定完成。

uv run main.py

在 Claude 桌面應用程式設定 MCP server

要在 Claude 桌面應用程式(MCP host)裡使用 MCP server,需要把 server 資訊註冊到 host。註冊方式是修改設定檔。請參考 MCP 官方指南,打開 claude_desktop_config.json 設定檔,加入剛剛做好的 MCP server(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 server 就會自動照設定檔啟動。來簡單說明一下設定檔裡每個資訊的用途:

  • mcpServers 加入 line-mcp(用這個名稱註冊 MCP server)
  • commanduv 的路徑(伺服器啟動指令)
    • 如果 macOS 下 uv 執行有問題,可以在 shell 裡跑 which uv,把查到的路徑填進來
  • args 填專案路徑及執行檔案
  • env 加上 CHANNEL_ACCESS_TOKEN,填入剛剛申請的 channel access token

存檔後,啟動 Claude 桌面應用程式。如果設定正確,你會看到 UI 出現可用的 MCP 工具,如下圖所示。

image

實際使用 MCP

現在我們要用剛剛做好的 MCP server 和 Claude 桌面應用程式來實際體驗 MCP。假設以下情境:

「我們是名為『Oishi』的日本壽司店老闆,平常用 LINE 官方帳號做行銷。」

我們要用 LINE Messaging API 提供的 broadcast API,發送壽司宣傳訊息給加官方帳號為好友的顧客。請用以下 prompt 發送壽司宣傳訊息:

我是壽司店 Oishi 的老闆,請幫我發送壽司宣傳訊息給顧客。

輸入這個 prompt 後,MCP host 內部會使用 broadcast_message 工具。你可以在 Claude 桌面應用程式的 UI 看到這個工具被呼叫,並且實際會收到官方帳號發來的訊息。

image

來看一下剛剛這個操作流程:

  1. 使用者一啟動 Claude 桌面應用程式(MCP host),就會根據設定檔的 command 啟動 MCP server。
  2. MCP host 透過 MCP client 呼叫 MCP server 的 tools/list endpoint,取得可用工具清單。
  3. MCP host 把使用者 prompt 和工具清單一起傳給 LLM 模型。
  4. LLM 模型從 prompt 裡「發送訊息」這段判斷要用 broadcast_message 工具,並指示 MCP host 執行該工具。
  5. MCP host 依據 broadcast_message 工具的 description 格式組出請求,透過 MCP client 呼叫 MCP server 執行該工具。
  6. MCP server 收到請求後,透過 tools/call endpoint 執行定義好的工具,並發送請求到 LINE Messaging API。

MCP 的應用延伸

我們也可以用其他 MCP 伺服器,做出更多元的應用情境。

這次假設壽司店想根據天氣發送不同的壽司宣傳訊息。為了取得天氣資訊,我們會用另一個 MCP server。MCP 的 servers repository(GitHub)有多種 MCP server 可以用。查天氣這次我們用 Brave Search,它是一個支援 MCP 搜尋工具的搜尋引擎。要用這個工具,需先註冊 Brave Search 並取得 API key。詳細步驟請參考 Brave Search MCP Server 官方說明

準備好後,請用以下 prompt 發送壽司宣傳訊息給顧客:

我是壽司店 Oishi 的老闆。請幫我發送一則適合明天天氣的壽司宣傳訊息。

輸入這個 prompt 後,你會發現 MCP host 真的會根據天氣發送對應的壽司宣傳訊息。

image

來看一下這個流程:

  1. MCP host 把使用者 prompt 和可用工具清單傳給 LLM 模型。
  2. LLM 模型從「明天天氣」這段判斷要用 brave MCP server 的 brave_web_search 工具,並指示 MCP host 執行該工具。
  3. MCP host 透過 MCP client 呼叫該工具,brave MCP server 會內部查詢指定搜尋引擎的天氣資訊並回傳。
  4. MCP host 用取得的天氣資訊,寫出適合當天氣候的壽司宣傳訊息。
  5. MCP host 再呼叫我們自己建的 line-mcp MCP server 的 broadcast_message 工具。
  6. line-mcp MCP server 最後透過 LINE Messaging API,把訊息發給加了官方帳號的使用者。

結語

大家覺得怎麼樣?MCP 的世界是不是很有趣?如果 LLM 能跟外部服務結合,會變得更強大,生產力也能大幅提升。基於這樣的期待,MCP 相關服務會越來越多,其他 LLM 供應商如 OpenAI 也很可能會採用 MCP 或建立自己的協定。

LINE 官方 GitHub 也有提供 MCP server,給有需要的朋友參考:

希望大家看完這篇文章後,都能動手試試 MCP 的應用,體驗 MCP 的威力。本文就到這邊,謝謝收看!