最近,Anthropic 透過 Claude 大型語言模型(LLM)發表了 model context protocol(MCP)。MCP 是一種幫助 LLM 使用外部資料來源或功能的協定,Anthropic 也已經把它開放成大家都能用的協定(參考資料)。因此,現在有越來越多服務開始支援 MCP,也有很多人關心要怎麼用 MCP 讓 LLM 跟外部服務串接。
這篇文章會說明 MCP 這個備受關注的協定的概念和架構,並介紹如何用 LINE Messaging API 實作一個 MCP 伺服器。
MCP 介紹
MCP 是一個讓 LLM 可以用外部功能的協定。下面這張圖比較了 LLM 有沒有用 MCP 的差異。
舉例來說,如果你想在 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。
這個架構主要有三個角色: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 的運作方式會因為實作不同而有差異,這篇文章介紹最基本的方式,請參考下圖。
- MCP host 啟動時,會透過 MCP client 呼叫 MCP server 的
tools/list
endpoint,取得可用工具清單。 - 使用者送出 prompt 到 MCP host。
- MCP host 把使用者 prompt 和工具清單傳給 LLM 模型,LLM 模型會決定要用哪些工具。
- MCP host 透過 MCP client 呼叫 MCP server 的
tools/call
endpoint 使用工具。 - MCP host 把 MCP server 回傳的工具結果和原本的 prompt 一起傳給 LLM 模型,LLM 會根據這些資訊產生最終回應。
- 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,需要先完成以下準備:
- 安裝 Claude 桌面應用程式(參考連結)
- 準備使用 LINE Messaging API
- 參考 Get started with the Messaging API 文件,在 LINE Developers 建立官方帳號、啟用 Messaging API 並建立 channel
- 到 LINE Developer Console,在剛剛建立的 channel 的 Messaging API 分頁申請 channel access token
- 用你的 LINE 帳號把新建立的 channel(LINE 官方帳號)加為好友
完成 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) command
填uv
的路徑(伺服器啟動指令)- 如果 macOS 下
uv
執行有問題,可以在 shell 裡跑which uv
,把查到的路徑填進來
- 如果 macOS 下
args
填專案路徑及執行檔案env
加上CHANNEL_ACCESS_TOKEN
,填入剛剛申請的 channel access token
存檔後,啟動 Claude 桌面應用程式。如果設定正確,你會看到 UI 出現可用的 MCP 工具,如下圖所示。
實際使用 MCP
現在我們要用剛剛做好的 MCP server 和 Claude 桌面應用程式來實際體驗 MCP。假設以下情境:
「我們是名為『Oishi』的日本壽司店老闆,平常用 LINE 官方帳號做行銷。」
我們要用 LINE Messaging API 提供的 broadcast
API,發送壽司宣傳訊息給加官方帳號為好友的顧客。請用以下 prompt 發送壽司宣傳訊息:
我是壽司店 Oishi 的老闆,請幫我發送壽司宣傳訊息給顧客。
輸入這個 prompt 後,MCP host 內部會使用 broadcast_message
工具。你可以在 Claude 桌面應用程式的 UI 看到這個工具被呼叫,並且實際會收到官方帳號發來的訊息。
來看一下剛剛這個操作流程:
- 使用者一啟動 Claude 桌面應用程式(MCP host),就會根據設定檔的
command
啟動 MCP server。 - MCP host 透過 MCP client 呼叫 MCP server 的
tools/list
endpoint,取得可用工具清單。 - MCP host 把使用者 prompt 和工具清單一起傳給 LLM 模型。
- LLM 模型從 prompt 裡「發送訊息」這段判斷要用
broadcast_message
工具,並指示 MCP host 執行該工具。 - MCP host 依據
broadcast_message
工具的description
格式組出請求,透過 MCP client 呼叫 MCP server 執行該工 具。 - 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 真的會根據天氣發送對應的壽司宣傳訊息。
來看一下這個流程:
- MCP host 把使用者 prompt 和可用工具清單傳給 LLM 模型。
- LLM 模型從「明天天氣」這段判斷要用
brave
MCP server 的brave_web_search
工具,並指示 MCP host 執行該工具。 - MCP host 透過 MCP client 呼叫該工具,
brave
MCP server 會內部查詢指定搜尋引擎的天氣資訊並回傳。 - MCP host 用取得的天氣資訊,寫出適合當天氣候的壽 司宣傳訊息。
- MCP host 再呼叫我們自己建的
line-mcp
MCP server 的broadcast_message
工具。 line-mcp
MCP server 最後透過 LINE Messaging API,把訊息發給加了官方帳號的使用者。
結語
大家覺得怎麼樣?MCP 的世界是不是很有趣?如果 LLM 能跟外部服務結合,會變得更強大,生產力也能大幅提升。基於這樣的期待,MCP 相關服務會越來越多,其他 LLM 供應商如 OpenAI 也很可能會採用 MCP 或建立自己的協定。
LINE 官方 GitHub 也有提供 MCP server,給有需要的朋友參考:
希望大家看完這篇文章後,都能動手試試 MCP 的應用,體驗 MCP 的威力。本文就到這邊,謝謝收看!