跳至主要內容
SHAO MEDIA

一封信先被預覽了,才準被寄出:smart-excel-mcp 的流程設計觀察

從掘金一篇分享 smart-excel-mcp 開發過程的文章看起,觀察一個 MCP 工具如何把預覽與發送拆開、把錯誤訊息設計成給 AI 讀的介面。

科技 設計評論 約 4 分鐘
本章章節
  1. 先從一個檔名看起
  2. 錯誤訊息是寫給模型看的
  3. 預覽與發送,被拆成兩個動作
  4. 結語

2026 年 9 月 25 日,掘金上出現一篇名為「開發自己的第一個 MCP」的分享文,作者記錄了自己從零打造一個名為 smart-excel-mcp 的本地工具:定期從多個 Excel 檔案抽取特定欄位、組出新表、寄送郵件。這件事本身規模不大,卻是一份難得的樣本,讓我們看到一個 MCP 工具的介面,是怎麼被一格一格設計出來的。

先從一個檔名看起

這個工具最容易被忽略的設計,藏在輸出檔案的命名裡。每次欄位抽取完成,新檔案會以「原檔名_YYMMDDHHMMSS.xlsx」的格式存到使用者桌面,時間戳精確到秒。

這組命名解決的是一個很實際的問題:報表會不斷再生,而收件端永遠只需要最新的那份。與其讓人判斷哪份是新的,工具直接把先後順序寫進檔名,讓排序成為檔案系統就能完成的閱讀。這是一種很樸素的資訊設計,把脈絡壓縮成一串數字。

更值得注意的,是檔名之後的去向。工具在後端設了一個記憶體變數,暫存剛生成檔案的路徑;當郵件工具收到空的檔案參數時,會自動抓取這個路徑。對使用者來說,「剛做好的表」與「要寄出的表」之間,不需要任何手動複製粘貼。這與我們先前觀察過的把勾選框重新設計成 AI 驗收關卡是同一類課題:當 AI 成為操作者,工具內部的狀態傳遞就得代替人類的記憶與手勢。

錯誤訊息是寫給模型看的

多數人對「錯誤處理」的想像,是丟出一個例外然後程式停止。這個工具的做法不同:當使用者指定的欄位名在來源表中找不到時,它先對雙方的欄名做去除前後空格的清洗,比對後若仍有缺漏,就回傳該檔案完整的可用欄位清單。

這個細節之所以關鍵,在於訊息的讀者變了。傳統腳本的錯誤訊息是寫給終端機前的人看的;在 MCP 的場景裡,第一個讀到錯誤的是大模型。回傳全量欄位清單,等於把「糾偏」所需的材料一併交出去,模型可以據此比對使用者語意的欄位名與實際欄位名,主動修正後重試。錯誤訊息在這裡被重新設計成一種對話介面,而非終點。

檔案掃描端也有同樣的思路。遞迴遍歷目錄時,工具會主動過濾掉 Office 產生、以 ~$ 開頭的暫存鎖定檔,只鎖定 .xlsx 與 .xls。這些防禦性細節單獨看都平淡,疊起來決定了 AI 操作本地檔案時的穩定性底線。

預覽與發送,被拆成兩個動作

整個工具最大膽的設計決策,是把寄信拆成兩個工具:preview_email 只在後端組裝寄件人、收件人、主旨、附件大小與路徑摘要,明確不觸發 SMTP;send_excel_by_email 才是實際發送,且要求在預覽核對無誤、或經模型引導使用者確認之後才能調用。

寄信是不可逆操作,寄錯收件人就是把資料送出了自己的控制範圍。把預覽獨立成一個可被調用的工具,等於在流程裡安插了一個法定的停頓點,讓確認這個動作有了專屬的介面位置,而非依附在某個彈出視窗或一行提醒文字上。這個取捨犧牲了一點流暢度,換來的是危險動作前的強制閱讀。

在 MCP 工具的設計光譜上,這與我們先前討論過的把剪輯臺搬進 Agent 手裡的畫布與時間線形成了有用的對照:後者把操作顆粒度做細,讓 AI 能逐步接管創作流程;前者則反向操作,在關鍵節點把權限收回給人。兩者方向相反,但都在回答同一個問題:哪些步驟該交給模型,哪些該留下人類的指紋。

結語

smart-excel-mcp 是一個練手專案,分享文裡也沒有迴避這一點。但正因為規模小,它的設計取捨反而清楚可讀:時間戳解決檔案新舊、記憶體狀態消除手動傳遞、錯誤訊息為模型而寫、預覽與發送拆開以安放確認。一個好的 MCP 工具,或許就該長這個樣子:每個危險的地方都有一道門,每個出錯的地方都留一條讓機器自己回頭的路。

相關報導