生活分享
Claude Code|設計 MCP 工具名稱、輸入 Schema 與分頁
讓模型能選對工具,也能正確處理空值與大量結果。MCP 連線成功之後,下一個問題是工具能不能被正確使用。本篇設計 list_tasks 與 get_task 的分工、輸入 Schema、查無資料及分頁結果,並用真正的 MCP 客戶端檢查空結果、錯誤參數和多頁資料,最後再觀察 Claude 是否選對工具。
閱讀時間約 7 分鐘

MCP模型上下文協定(MCP)是什麼:連接工具與資料的共同介面MCP 是讓 AI 應用程式與外部工具、資料和提示範本交換資訊的開放協定,不是模型本身,也不保證接上就能完成任務。本文用查詢社區圖書室資料的例子,說明主機、用戶端、伺服器及工具、資源、提示的分工,並比較 MCP、A2A 與 Agent Skills。附連線驗證與權限檢查方法,幫你區分已設定、已連接、可呼叫與真正取得結果。閱讀全文 連線成功之後,下一個問題是工具能不能被正確使用。本篇設計 list_tasks 與 get_task 的分工、輸入 Schema、查無資料及分頁結果,並用真正的 MCP 客戶端檢查空結果、錯誤參數模型參數(Model Parameters)是什麼模型參數是訓練時調整、用來把輸入轉成輸出的數值,例如權重與偏差。本文用簡單算式示例說明參數如何影響預測,區分模型參數、訓練超參數、提示詞與生成設定,並解釋參數量、數值精度和啟用參數為何是不同指標。讀完能更準確閱讀模型規格,理解參數增加不等於知識逐條增加,也不代表每次聊天都在重新訓練模型。閱讀全文和多頁資料,最後再觀察 Claude 是否選對工具。
先讀自建唯讀 MCPClaude Code|建立自己的唯讀 MCP 工具讓 Claude 查詢本機練習待辦資料。本篇讓 Claude 讀取你自己提供的待辦資料。你會建立唯讀 MCP server,先用測試客戶端驗證工具清單與呼叫結果,再連進 Claude Code。完成不是畫面顯示 Connected,而是工具真的回傳指定資料、參數錯誤可以辨認,而且伺服器沒有修改原始檔案。閱讀全文。下載第 80 篇材料,進入 starter。需要 Node.js 22 以上;執行 npm ci --ignore-scripts 安裝鎖定版本。真實 Claude 呼叫需要有效登入。閱讀約 20 分鐘,實作約 45 分鐘。
把清單查詢與單筆查詢分開
閱讀完整文字說明
設計 MCP 工具名稱、輸入 Schema 與分頁,以流程和文件圖形呈現教學重點。
list_tasks 回答「有哪些符合條件的項目」,接受 offset、limit 與可選的 completed。get_task 回答「這個 id 的項目是什麼」,只接受 id。兩個工具名字與描述應讓使用者理解用途,不需要先猜 query、action、mode 的多層組合。
本課只有三筆固定假資料:a、c 未完成,b 已完成;a 與 c 標題相同但 id 不同。固定資料讓你能明確驗證回應,不會因資料在測試中被其他人修改而難以比較。實際系統的清單可能變動,屆時還要考慮排序、游標或快照一致性。
清單工具每頁最多二十筆,預設兩筆;offset 從零開始。回應包含 items、nextOffset、total。最後一頁 nextOffset=null,讓呼叫者知道真正結束。不要只回傳前二十筆卻沒有下一頁資訊,否則模型可能把部分資料誤當成全部。
用 Schema 拒絕不合法輸入
材料使用已鎖定的 MCP TypeScript SDK v2 套件與 Zod。inputSchema 是 z.object,offset 與 limit 要是整數,completed 必須是布林值。字串 "false" 不是布林 false;若靜默轉型,呼叫者可能以為已過濾,實際卻得到另一組結果。
import {z} from 'zod';
export const listInput = z.object({
offset: z.number().int().min(0).default(0),
limit: z.number().int().min(1).max(20).default(2),
completed: z.boolean().optional()
});
Schema 驗證與資料存取層的檢查可以互補。材料的 data.mjs 也檢查分頁與 completed,因此直接呼叫資料函式時不會完全失去基本契約。兩層規則應一致,不能一層允許 limit=100,另一層再無聲截成二十。
get_task 的 id 必須是非空字串。合法但不存在的 id 是資料結果,回傳 found=false、item=null;空字串是不合法輸入,應回報驗證錯誤。這兩個情況分開,讀者才知道是修改查詢資料,還是修正呼叫程式。
把工具回應與內層資料分開讀
MCP 呼叫回應有自己的結構,本課將業務資料放在文字 content 裡的 JSON。客戶端先判斷工具是否回報 isError,再解析內層資料。不要直接對所有回應執行 JSON.parse,假設錯誤訊息也一定符合成功資料形狀。
{"found":false,"item":null}
{
"items": [{"id":"c","title":"買牛奶","completed":false}],
"nextOffset": null,
"total": 3
}
第二個區塊展示回應形狀,title 應以你材料的實際 fixture 為準;驗證識別碼、筆數及分頁結束,不依賴示例文案。沒有資料時 items 是空陣列、nextOffset 為 null,仍是成功查詢。不要把空清單誤標成伺服器故障。
readOnlyHint 說明工具用途,但不會自動把寫入程式禁止。本課的唯讀性來自伺服器只有讀取 fixture 和回傳資料的路徑。新增寫入功能時需要重新設計工具、授權與驗證,不能保留同一個提示就繼續聲稱唯讀。
先用真實客戶端跑完整契約
執行 contract-probe,客戶端會建立 stdio 連線、逐頁取資料,最後查一個不存在 id 及超過末頁的 offset。預期 ids 是 a、b、c;missing 包含 found=false;empty.items 為空。腳本 finally 關閉客戶端,避免完成後留著伺服器程序。
node mcp/contract-probe.mjs
node --test tests/mcp.test.mjs
測試包含 limit=0、limit=21、offset=-1 與 completed="false",預期工具錯誤;也包含合法的 completed=false,預期 a、c。這些是透過 MCP 客戶端送入伺服器的測試,不只是直接呼叫資料函式,因此能發現 Schema 或封裝層的差異。
分頁迴圈另外限制最多頁數並記錄已見 offset。若伺服器錯誤地一直回傳同一個 nextOffset,客戶端應停止並回報異常,而不是永遠查下一頁。上限是故障控制,超出時需要明確錯誤,不能把已讀部分當成完整成功結果。
觀察 Claude 是否選對工具
使用上一篇的 fixtures.mcp.json 在本機啟動 Claude,先查看 /mcp,再分別要求「列出所有未完成項目」與「查詢 id=b」。第一個任務應使用清單及篩選,第二個適合單筆查詢。保存實際工具名稱、參數與回應,不只看最後自然語言答案。
使用 todo-lab 的工具列出所有未完成待辦,回報 id 與數量。
如果有下一頁,繼續到 nextOffset 為 null,再說明總數。
使用 todo-lab 查詢 id=b,不修改任何資料。
若模型用清單找 b,結果可能仍正確,但你可以分析工具描述是否足夠清楚。不要只因它沒使用你偏好的工具就判定業務答案錯誤;分別評估工具選擇、資料完整性與實際成本。需要引導單筆查詢時,改善描述並以同一個任務重測。
查詢未知 id 時,模型應說明沒有找到,不自行編造內容;清單需要多頁時,不應只讀第一頁就回答全部。本課假資料很少,因此可直接人工核對。擴充到大量資料時,保留相同契約及已知結果的測試集合。
故障練習:無聲截斷與空值
在獨立副本中讓 list_tasks 固定只回兩筆,卻把 nextOffset 改為 null。重跑契約測試,應發現完整 id 集合少了 c。這個失敗不是模型能力問題,是工具說了一個不正確的完成訊號;先修正伺服器,再重新觀察模型。
另一個案例是把 get_task 的未知結果改成空物件,保留客戶端的原契約。預期檢查會發現 found 與 item 缺少。回應欄位是介面的一部分,不能因為「看起來也是沒資料」就任意變更。需要改契約時,文件、客戶端與測試應一起更新。
| 案例 | 預期結果 | 不應發生 |
|---|---|---|
| 未完成清單 | a、c | 把 "false" 當真值 |
| 完整分頁 | a、b、c,最後 null | 第一頁就宣稱完整 |
| 不存在 id | found=false、item=null | 編造一筆資料 |
| 不合法參數 | 明確工具錯誤 | 默默改成預設值 |
完成判準與小練習
交付兩個工具契約、實際協定測試、分頁探測輸出與 Claude 工具選擇紀錄。帳號未登入時,協定測試可完成,但模型選擇欄位仍為待測。資料 fixture 前後應相同,不能因查詢測試把原始內容改掉。
小練習是加入只查已完成項目的案例,確認 total 指的是篩選後的數量,並在描述中寫清楚。接著以MCP 故障實驗Claude Code|MCP 排錯實驗室:斷線、逾時與格式錯誤用固定故障重現診斷及復原流程。MCP 顯示錯誤時,先找出故障發生在啟動、協定、工具或結果處理哪一層,比反覆重新安裝更有效。本篇提供會退出、輸出錯誤格式和持續等待的伺服器材料,讓你練習有限時間內結束、保留診斷資料並恢復正常連線。閱讀全文測試斷線和逾時,再用JSON 流程Claude Code|把 claude -p 接進有驗證的 JSON 流程處理合法結果、錯誤、逾時與不完整輸出。這次輸出只要兩個欄位:summary 是非空的繁體中文摘要,taskIds 是不重複的待辦識別碼陣列。先把契約寫清楚,才能決定什麼資料不應往下傳。如果只是要求「回傳 JSON」,模型即使回傳一個空物件,語法上仍是合法 JSON,卻不能完成工作。閱讀全文思考下游如何驗證工具結果,避免只靠自然語言聲稱成功。
回 Claude Code 教學總目錄Claude Code 完整教學目錄:從入門到自動化依平台、程度與功能找到需要的教學,從 96 篇文章與共用練習專案逐步完成操作。這個教學中心把 Claude Code 分成 96 個可以獨立閱讀的小題目,從桌面、CLI、網頁與手機開始,再學 MD 規則、常用指令、Skills、MCP 與自動化。你可以依推薦路線循序學習,也可以直接搜尋正在遇到的功能、命令或檔名。目錄依目前公開狀態顯示可閱讀文章。閱讀全文
同主題延伸閱讀
生活分享
Claude Code|建立第一個 mod:在 Claude Code 行程內數工具呼叫
寫一個三檔案的 mod,用驗證器與測試確認它掛上的事件。文件把 mod 定義成多了入口檔的 plugin:入口檔叫 hooks module,Claude Code 在事件發生時呼叫裡面的函式,函式可以觀察、改寫或接手事件。
生活分享
Claude Code|Git Worktree 平行工作
隔離多個任務的檔案與分支。Git Worktree 讓同一儲存庫擁有多個工作目錄,各自使用分支與檔案。本篇會把待辦篩選與文件整理分開,確認兩個 session 不會直接改到彼此的檔案,再把其中一個成果整合回主分支。你也會知道何時可以安全清理工作目錄。
生活分享
Claude Code|雙 Worktree 實作與衝突整合
隔離兩項功能,最後完成整合與回歸。兩個 Claude 工作階段同時編輯專案,最容易出現的問題是互相改到同一份檔案,或各自測試通過、整合後卻失敗。本篇用兩個 Worktree 分別處理篩選預設值與介面文字,故意製造一次小衝突,再完成整合、驗證與清理。你不需要先啟用 Agent Teams。
生活分享
Claude Code|比較流程品質、用量與執行時間
以同一資料集比較兩種工作方法。比較兩種 Claude 工作方法時,不能只挑成功那一次,也不能只看第一個答案有多快。本篇用固定案例、原始紀錄和一致判準,比較品質、重試、等待與人工整合時間,最後寫出有樣本數與限制的報告,而不是保證某個方法一定省錢。
引用本文的文章
最新旅遊情報攻略

情報
2026 韓國楓葉預測:雪嶽山 10 月 20 日、首爾近郊 10 月底、內藏山與漢拏山 11 月上旬
韓國山林廳 2026 年 9 月 22 日公布的楓紅高峰預測:雪嶽山 10 月 20 日,春川、國立樹木園到首爾植物園落在 10 月 28 日到 11 月 2 日,內藏山 11 月 4 日、漢拏山 11 月 6 日,整體比最近 5 年晚約 0.8 天。整理各地楓樹與銀杏的預測日、首爾出發怎麼排,以及出發前去哪裡看即時楓況。2026 年 10 月查證。
- 季節活動
- 自然
- 觀景

攻略胡志明市
胡志明市到頭頓一日遊:白藤碼頭搭高速船、船票與班次,下船就是胡梅纜車與耶穌基督像
人在胡志明市挪一天去頭頓看海:市中心的白藤高速船碼頭搭船,航程 120 分鐘到頭頓的胡梅碼頭,平日成人 320,000 越南盾、週末 350,000,回程末班平日 15:00。下船就是胡梅纜車站,同一條路上有白宮,小山頂上是耶穌基督像。平日一天只有兩班船,整天要從末班船倒推著排。
- 交通
- 行程範例
- 海灘

攻略沖繩
沖繩不開車攻略:單軌只到浦添,美麗海水族館要坐兩個多小時的巴士,回那霸的最後一班直達車 17:22 就開走
不租車的沖繩怎麼移動:那霸市區靠沖繩都市單軌電車(ゆいレール),那霸機場站到終點てだこ浦西 19 站、17 公里、37 分鐘,一日券 1,000 日圓;美麗海水族館有那霸機場直達的高速巴士,單程 2,000 日圓起、官方時刻表上 2 小時上下,下車後還要走 10 分鐘;古宇利島要在今帰仁村役場轉車,當天來回光坐車就六個半小時;回程的最後一班直達車 17:22 就從記念公園前開走(2026 年 9 月查證)。
- 交通
- 行程範例
- 預算
資料來源
- Connect Claude Code to tools via MCP · 查證日期:
- Build an MCP server - Model Context Protocol · 查證日期:
- or · 查證日期: