Ian Chou's Blog

OAuth 2.0 測試實戰(Mock Provider + Inspector):用 Bearer Token 保護 MCP SSE

OAuth 2.0 測試實戰(Mock Provider + Inspector):用 Bearer Token 保護 MCP SSE

這篇文章把本 repo 的 OAuth 2.0 測試流程整理成一條可重現的路徑,涵蓋:

本文對應程式在:


0. 你會用到的端點

你的 MCP Server(localhost)

你的 OAuth 測試頁(localhost)

OAuth Provider(這次用 Cloudflare 上的 mock)

Mock OAuth Server:


1. 先把 server 跑起來(指向 mock provider)

用 OIDC Discovery(最省事):

OAUTH_ISSUER=https://oauth.aicodecleanup.us/ \
OAUTH_CLIENT_ID=test_client_id \
OAUTH_CLIENT_SECRET=test_client_secret \
bun run server

如果你不想用 issuer,也可以手動指定 endpoints(本 repo 也支援別名):

OAUTH_CLIENT_ID=test_client_id \
OAUTH_CLIENT_SECRET=test_client_secret \
OAUTH_AUTH_URL=https://oauth.aicodecleanup.us/authorize \
OAUTH_TOKEN_URL=https://oauth.aicodecleanup.us/token \
OAUTH_USERINFO_URL=https://oauth.aicodecleanup.us/userinfo \
bun run server

2. 用瀏覽器跑一次 OAuth 2.0(確認 provider 能用)

  1. 打開:
  1. 點「開始登入」,完成授權後會回到 callback 頁,看到兩段 JSON:

如果你看到 Missing OAUTH_CLIENT_ID,代表 server 沒吃到 OAUTH_CLIENT_ID。你也可以臨時用:


3. /sse 的 Bearer token 保護:驗什麼、怎麼驗?

這個 repo 目前採用「用 userinfo endpoint 驗 token」的策略:

你可以用 curl 快速檢查(先把 token 換成你自己的):

curl -N -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' http://127.0.0.1:3000/sse

如果沒帶 token,預期會看到:

Missing Authorization: Bearer 

4. 用 Inspector 連 MCP SSE:兩條路徑

路徑 A(最穩):先用 /oauth 拿 token,再貼到 Inspector

  1. 先用瀏覽器跑 http://localhost:3000/oauth,複製 access_token
  2. 打開 Inspector,Transport 選 SSE、URL 填:
  1. Authentication → Custom Headers:
Authorization: Bearer <access_token>

記得把 header 左邊的 toggle 打開(沒打開不會送出)。

路徑 B:用 Inspector 內建 OAuth Flow(容易踩坑,但已提供解法)

某些 Inspector 版本會把 OAuth provider「視為」你填的 MCP server 同源,因此它會去打:

如果你的 server 沒有這些路由,就會看到 404 Not Found。為了讓這條路徑能跑,本 repo 已在 server.ts 補上 proxy:

因此就算 Inspector 「打錯地方」(打到 localhost),localhost 也會把它導到真正的 provider。


5. 常見錯誤排查

5.1 你在瀏覽器打 https://oauth.aicodecleanup.us/token 看到 404

多半是因為你用瀏覽器做了 GET。token endpoint 正確用法是 POSTapplication/x-www-form-urlencoded),本 repo 在 callback 換 token 是用 POST,所以可以成功。

5.2 Inspector 跳到 http://localhost:3000/authorize?... 然後 404

代表 Inspector 目前把 provider 當 localhost。這個 repo 已提供 /authorize proxy,更新後應該不會再 404。

5.3 redirect_uri 不被允許

Inspector 的 redirect 通常是 http://localhost:6274/oauth/callback。如果 provider 需要白名單 redirect URI,而你沒有權限配置 provider,就改走「路徑 A」:用 http://localhost:3000/oauth 拿 token,再貼到 Inspector。


6. 最終驗收:在 Inspector 呼叫 echo_tool

連線成功後:

{
  "message": "Hello from Inspector!"
}

預期回應類似:

Server received via SSE: Hello from Inspector!