使用手冊 › Slima MCP › 結構化檔案的保護:拒絕訊息怎麼讀

結構化檔案的保護:拒絕訊息怎麼讀

最後更新 2026 年 9 月 9 日 · 閱讀約 6 分鐘

一句話:這篇教你讀懂 MCP 的拒絕訊息——哪一種是「換個工具就好」、哪一種是「升級才有」、哪一種是「永遠不行」。

這解決什麼問題

拒絕訊息看起來都像牆,其實不是。Slima 的 MCP 錯誤刻意分成不同的碼,因為下一步完全不同:有的是換一支工具、有的是叫作者自己在 app 裡做、有的是升級方案。分不出來的話,AI 會做那件最糟的事——同一個呼叫再試一次。

為什麼結構化檔會被擋

站內的 AI 寫作教練如果把整檔寫入對準一份 .beats,前端會直接攔下來,代價只是一次白費的呼叫。

透過 MCP 就不一樣了:同樣的動作會成功。 一份 .beats 裡有幕、有節拍、還有作者拖上去的章節卡,AI 只看到其中一部分,卻送回整份文件——檔案照樣打得開,作者的東西少了一塊,而且沒有任何錯誤訊息。

所以這道閘設在伺服器上,不是只寫在工具說明裡。工具說明是給模型看的建議,伺服器的拒絕才是保證。

四種你會遇到的拒絕

錯誤碼 狀態 意思 下一步
AI_READONLY_FILE_TYPE 403 這個型別不是 AI 可以整檔寫的 五種結構化檔:訊息會直接告訴你該用哪一支 update_*。.character / .location / .json / .yaml:沒有替代路徑,讀完用文字描述你的建議
SUBSCRIPTION_REQUIRED 403 這個能力屬於訂閱方案 讀取不受限制。把檔案讀出來、說清楚你建議怎麼改,作者可以自己動手,或訂閱之後讓 AI 直接改
INVALID_PATH 400 舊的劇本工作室書,寫到規劃資料夾以外 改寫到 .script_studio/planning/ 底下,或請作者在 app 裡改
FOLDER_NOT_EMPTY 422 你要刪的資料夾裡還有東西 確定要整棵刪就再送一次並帶 recursive: true。這不是權限問題,是「你這句話的後果比你講的大」

兩個 403 刻意用不同的碼,因為一個是「升級就能用」,一個是「永遠不能用」。同一個碼的話,AI 沒辦法分辨該叫作者升級,還是該閉嘴改用文字描述。

拒絕訊息本身就是答案

Slima 的 MCP 錯誤是設計來給 AI 讀完就能修好的,不是設計來讓它猜的:

  • 送了一個不存在的 id → 訊息會把真實的 id 全部列出來
  • 送了一個不存在的地點層級 → 訊息會把真實的層級列出來
  • 把 B 操作的欄位放進 A 操作 → 訊息會說那個欄位屬於誰
  • 猜錯一份指南的 slug → 回覆會附上完整的指南清單
  • intent 太長 → 訊息會說它會變成 commit 的名字,所以要一行

所以規則很簡單:把錯誤訊息讀完,照它說的做。失敗一次的成本是一次來回,猜第二次的成本可能是作者的資料。

這道閘沒有做的事

  • 沒有把檔案變成唯讀。 作者在 app 裡照樣隨便改,這只擋外部 AI 的整檔寫入。
  • 沒有限制讀取。 五種結構化檔全部讀得到,免費帳號也讀得到。
  • 沒有擋新建。 create_file 對這五種副檔名可以用,只是內容會被忽略、伺服器產一份空骨架。
  • 沒有擋審查。 從 MCP 進來的改動沒有虛線卡那一層,但它們是 commit——版本歷史全部看得到、退得回。

刪除跟寫入是同一條規則

刪掉一份 .map 跟改一份 .map 吃同一個判準:都屬於訂閱方案。一條規則好記,而且擋住一個真實的荒謬——免費帳號的 AI 刪得掉一個它建不出來、也改不動的檔。

舊的劇本工作室書

如果你手上還有一本舊的劇本工作室書,它走的是另一套:按路徑判斷,可寫的只有 .script_studio/planning/ 這棵樹,series.json、*.character、*.scene、*.storyline、*.note、*.location 透過 MCP 全部唯讀,.script_studio/planning/.initialized 這個標記檔也是。

那棵 planning 樹是給 AI 放草稿的地方:大綱、研究筆記、提案。想改場景本身,就把提案寫在那裡,作者在 app 裡採納。單一本書的精確規則讀 slima://books/{book_token}/schema 資源,見用 schema resource 查精確權限。

相關

到 Slima 裡試試

打開 app,用你自己的書做一次。免費開始,不用信用卡。

打開 Slima
這篇有幫助嗎?