寫入被拒:怎麼處理
最後更新 2026 年 9 月 9 日 · 閱讀約 8 分鐘
一句話:這篇教你分辨寫入被拒的幾種原因,以及每一種各自的下一步。
先看錯誤碼,不要重送
寫入被拒有幾種完全不同的成因,而它們的下一步互不相通。錯誤碼就是用來分辨的:
| 錯誤碼 | 狀態 | 意思 | 下一步 |
|---|---|---|---|
AI_READONLY_FILE_TYPE |
403 | 這個型別不能整檔寫 | 結構化檔:改用訊息裡指名的 update_*。.character / .json 這類:沒有替代路徑 |
SUBSCRIPTION_REQUIRED |
403 | 這個能力屬於訂閱方案 | 讀取不受限制——讀完用文字描述你建議的改動 |
INVALID_PATH |
400 | 舊的劇本工作室書,寫到規劃資料夾以外 | 改寫到 .script_studio/planning/ 底下 |
FOLDER_NOT_EMPTY |
422 | 要刪的資料夾裡還有東西 | 確定的話帶 recursive: true 再送一次 |
拿同一組參數再送一次,在這四種情況裡沒有一種會變成功。
一 · 結構化檔:訊息會指名該用哪一支工具
對 .map、.beats、.timeline、.script、.geomap 用 write_file、edit_file 或 append_to_file,會拿到這樣的回覆:
.map files are structured documents — a generic write would corrupt them.
Use POST /api/v1/books/:book_token/mcp/files/structured (the MCP client
exposes it as update_relationship_map): it takes one field-level operation at
a time, so the parts of the document you were never shown cannot be dropped.
If update_relationship_map is not in your tool list, your Slima MCP client is
older than this server — ask the author to update the Slima MCP package.
A missing tool always means an out-of-date client; nothing about this account
ever hides a tool from you.
兩件事寫在裡面:該用哪一支工具,以及那支工具不在清單上時該怎麼辦。後者很重要——0.2.0 沒有那些工具,而伺服器又不接整檔寫入,所以舊 client 是兩條路都不通。升級的做法見 slima-mcp 版本怎麼運作。
.character、.location、.json、.yaml 拿到的是同一個碼、但沒有替代路徑那一句:讀完,用文字說出你建議怎麼改。
二 · 訂閱閘:讀從來不受限
方案沒有解鎖結構化寫入時,回的是 SUBSCRIPTION_REQUIRED,訊息長這樣:
Writing .map files is part of Slima's subscription plans. Reading them is not
restricted — read the file and describe the change you recommend, and the
author can make it in the app or subscribe to let you make it directly.
(Credits bought as a one-off pack cover AI usage inside the Slima app;
structured file writing goes with a plan.)
三個重點:
- 讀完全不受影響。 免費帳號的 AI 讀得到每一份
.map、.timeline,只是不能改。 - 判準是方案,不是「有沒有付過錢」。 一次性的點數包買的是 app 內的 AI 用量,不解鎖結構化寫入。
- 刪除跟寫入吃同一條規則。 免費方案刪不掉一份
.map——它建不出來、改不動,也刪不掉。
這時候最有用的回應不是重試,是把檔案讀出來、講清楚你建議改什麼,讓作者自己在 app 裡動手。
三 · 舊的劇本工作室書:INVALID_PATH
如果這本書是舊的劇本工作室書,規則完全是另一套,按路徑判斷:可寫的只有 .script_studio/planning/ 這棵樹,series.json、*.character、*.location、*.scene、*.storyline、*.note 與 .script_studio/planning/.initialized 透過 MCP 全部唯讀。
.script_studio/planning/scene-3-1-revision.md ← 可以寫
Episodes/03/scene-1.scene ← 400 INVALID_PATH
作法是把提案寫進 planning 那棵樹,作者在 app 裡採納。動手之前想先知道規則,讀 slima://books/{book_token}/schema 這個資源,或直接呼叫 get_book——它對這種書會自己印出寫入限制。
四 · 最容易漏掉的一種:成功了,但檔案是空的
create_file 對五種結構化副檔名不會被拒。它會成功,然後伺服器寫進去的是一份空骨架,你送的內容被丟掉了(回覆會明講)。
這不是失敗,所以很容易被當成「建好了」。正確的流程是兩步:先 create_file 建空的,再用 update_* 一批一批填。
不是型別問題的兩種
- 書在垃圾桶裡:被丟進垃圾桶的書不能寫。先還原。
- 這本書是別人分享給你的:權限不到可寫的層級就只能讀。
不要繞過拒絕
Slima 的 MCP 錯誤是設計成讀完就能修好的:不存在的 id 會連真實的 id 一起回、不存在的地點層級會連真實的清單一起回、欄位放錯操作會告訴你它屬於誰。繞路的成本落在作者身上,讀訊息的成本落在你身上,而後者便宜得多。
相關
- Docs:結構化檔案的保護
- Docs:結構化編輯工具
- Docs:slima-mcp 版本怎麼運作
- Docs:MCP 對每種檔案能做什麼
- Docs:MCP 連不上:401 / Authorization header
打開 app,用你自己的書做一次。免費開始,不用信用卡。