使用手冊 › 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 查精確權限。
相關
- Docs:結構化編輯工具
- Docs:MCP 對每種檔案能做什麼
- Docs:寫入被拒:怎麼處理
- Docs:用 schema resource 查精確權限
打開 app,用你自己的書做一次。免費開始,不用信用卡。