# Roots 回調不是立刻給清單,而是等伺服器來要?官方七步拆給你看 這是 Anthropic Academy《Model Context Protoco… · @swordBluesy · TwKit
@swordBluesy
# Roots 回調不是立刻給清單,而是等伺服器來要?官方七步拆給你看 這是 Anthropic Academy《Model Context Protocol: Advanced Topics》第 7 課的實作教學,標題直譯是《Roots walkthrough(根目錄授權實操)》。先把結論放在前面,因為它反常識: **客戶端不是一上來就把 Roots 清單塞給伺服器——而是等伺服器未來某時請求時,才執行回調、把清單交出去。授權是「要的時候才給」,不是「一開始全給」。** 先說清詞。**Roots(根目錄)**,是使用者授權伺服器可以訪問的本地檔案與資料夾。**Root 物件(Root object)**,是按 MCP 規範描述一個授權目錄的物件,它的 URI 以 file:// 開頭。**ListRootsResult(列目錄結果)**,是回調返回給伺服器的東西,裡面裝著授權目錄清單。**list_roots(列出授權目錄)**,是伺服器觸發回調、拿到清單的操作。 一個真實例子:使用者說「讀 todos.txt」。伺服器不知道這個檔案在哪,於是調 `ctx.session.list_roots()`,發消息回客戶端,觸發列 Roots 回調,拿到授權目錄後再去找檔案——或者伺服器也可以定義一個列出 Roots 的工具,或者直接把 Roots 注入提示詞,讓模型自己去解析檔名。 他們還點名了一種「眼熟的舊路線」:以為授權清單要在連線一建立就全交出去,交完就沒事了。官方的拆台很直接:**回調是被動觸發的**,伺服器不問,客戶端就不給;伺服器問了,回調才執行、才返回清單。 先把話說全:不是定義了 Roots 就等於授權生效了。滿足下面任何一條缺失,授權就斷在半路: - 路徑沒有轉成 file:// 開頭的 Root 物件; - 回調寫了,卻沒有傳進 ClientSession; - 授權函式沒有貫穿所有訪問檔案的工具。 ## 一、Roots 實操的三種翻車方式 - **清單交錯了時機**:以為一連線就該給清單,結果伺服器請求時回調根本沒準備好。 - **路徑格式不對**:使用者給的是普通路徑,沒有轉成 file:// 開頭的 Root 物件,規範對不上。 - **檢查只做一半**:授權函式只在主工具裡用,邊角工具沒檢查,邊界照樣破洞。 ## 二、替代方案:七步把 Roots 接通 第一步,定義 Roots:理想情況由使用者指定可訪問的檔案與資料夾;示例程式接受命令列參數作為允許路徑列表,傳給 MCPClient。第二步,建立 Root 物件:按 MCP 規範每個 Root 的 URI 以 file:// 開頭,把使用者給的路徑列表轉成 Root 物件。第三步,Roots 回調:客戶端不是立刻把清單給伺服器,而是伺服器未來某時請求時才執行回調,回調返回 ListRootsResult,傳進 ClientSession。第四步,使用 Roots:伺服器在兩種場景用 Roots——工具要訪問檔案或資料夾時;語言模型需要把檔名解析成完整路徑時,可定義列出 Roots 的工具或直接注入提示詞。第五步,訪問 Roots:調 `ctx.session.list_roots()`,發消息回客戶端觸發列 Roots 回調。第六步,授權訪問:SDK 不限制工具讀什麼,必須自己檢查。第七步,授權函式如 `is_path_allowed` 要在所有訪問檔案的工具裡貫穿使用。七步做的是同一件事:**定義、轉格式、等請求、給清單、用清單、做檢查**。 ## 三、目標形態:要的時候才給,給了就要檢查 理想狀態是授權清單平時安靜待著,伺服器需要時一問就給,給完之後每個工具操作前都過檢查。使用者只說檔名,模型能解析路徑,工具能讀檔案,越界能報錯,四件事同時成立,才算 Roots 真的通了。 ## 四、遷移三步走:從全給改成按需給 ### 第一步:先把路徑轉成 Root 物件 使用者給的路徑列表,一律轉成 file:// 開頭的 Root 物件,格式先對,再談授權。 ### 第二步:把回調傳進連線,等伺服器來問 回調返回 ListRootsResult,傳進 ClientSession,然後就等著——不要主動推送清單。 ### 第三步:把檢查函式貫穿所有工具 授權函式要在所有訪問檔案的工具裡用,漏一個,邊界就破一個洞。 ## 五、團隊怎麼共建同一套授權習慣 Roots 實操最大的坑不是技術,是時機與檢查各做各的:有的客戶端主動推清單,有的工具不檢查。團隊要先約好三條:回調一律按需觸發,不准主動推送;路徑轉格式寫成共用程式碼,不要每個客戶端各轉各的;新工具上線前先驗越界會不會報錯,驗過才上線。 ## 六、官方工具包之外還要記得的事 這課是互動實操課,步驟文字之外沒有給出編輯器裡的完整程式碼——本篇只按課內步驟寫,不補編程式碼細節。它把邊界講得很清楚:Roots 回調的被動觸發,是理解整個機制的關鍵;主動推清單的寫法,看起來省事,實際上走偏了規範。 ## 結尾:原則比架構重要 授權不是給得多,而是給得對。**原則比架構重要——要的時候才給、給了就要檢查,授權清單不是越多越好,是越準越好。** 可重複的動作規則是:下次接 Roots,先對三個點打勾——路徑轉成 Root 物件了嗎、回調傳進連線了嗎、檢查貫穿所有工具了嗎——三個勾都打上,才算接通。 原文連結:https://anthropic.skilljar.com/model-context-protocol-advanced-topics 原文:Anthropic Academy(由 S1哥 編譯) ## S1哥觀點 這課最狠的地方,是它把一堆人的「授權就是一次給清」幻想一刀砍掉:過去大家以為清單越早給、給得越全越好,現在官方說,回調是等伺服器來問才執行的。真正貴的從來不是多寫幾行回調程式碼,是你按主動推送寫了一整套,上線才發現走偏了規範。 我站這一邊:授權要按需,不要按量。一個一上來就把全部清單推出去的客戶端,比一句「我不知道」更危險——前者讓你帶著「已經授權」的錯覺上線,後者至少讓你停下來。 所以問一句:你現在的 Roots 接法裡,有幾處是主動推清單、而不是等伺服器來問的?評論區報個數,敢不敢說實話。
曝光 103 · 评论 1 · 点赞 0 · 书签 0
查看原帖