跳至內容

通用類型 ​

跨通道共用、適用於代理主機協定每個通道的橫切型別定義 — 基本別名、操作信封、基礎指令形狀、跨通道 auth/required 通知,以及 JSON-RPC 線路類型。

JSON Schema: state.schema.json

狀態類型 ​

URI ​

URI 字串(例如 ahp-root://、ahp-session:/<uuid> 或 ahp-chat:/<uuid>)。

string

StringOrMarkdown ​

可選擇以 Markdown 呈現的字串。

  • 純 string 會原樣呈現(不進行 Markdown 處理)。
  • 帶有 { markdown: string } 的物件會以 Markdown 格式呈現。

string | { markdown: string }

JsonPrimitive ​

基本 JSON 值:字串、數字、布林值或 null。

string | number | boolean | null

Icon ​

可選擇指定大小的圖示,可在使用者介面中顯示。

欄位類型必要說明
srcURI是指向圖示資源的標準 URI。可以是 HTTP/HTTPS URL,或是帶有 Base64 編碼影像資料的 data: URI。

消費者 SHOULD 採取步驟,確保提供圖示的 URL 來自與用戶端/伺服器相同的網域或受信任的網域。

消費者 SHOULD 在使用 SVG 時採取適當的防護措施,因為 SVG 可能包含可執行的 JavaScript。
contentTypestring否選用的 MIME 類型覆寫值,用於來源 MIME 類型缺失或為通用型別時。 例如:"image/png"、"image/jpeg" 或 "image/svg+xml"。
sizesstring[]否選用的字串陣列,指定圖示可使用的尺寸。 每個字串應為 WxH 格式(例如 "48x48"、"96x96"),或可縮放格式(如 SVG)使用 "any"。

若未提供,用戶端應假設該圖示可用於任何尺寸。
theme'light' | 'dark'否選用的指定值,說明此圖示所設計的主題。"light" 表示圖示設計用於淺色背景, "dark" 表示圖示設計用於深色背景。

若未提供,用戶端應假設該圖示可用於任何主題。

ProtectedResourceMetadata ​

使用 RFC 9728(OAuth 2.0 受保護資源中繼資料)語意,描述受保護資源的驗證需求。

欄位名稱使用 snake_case,以符合 RFC 9728 的 JSON 格式。

欄位類型必要說明
resourcestring是REQUIRED. 受保護資源的資源識別碼,一個使用 https 配置且不含片段元件的 URL(例如 "https://api.github.com")。
resource_namestring否OPTIONAL. 受保護資源的人類可讀名稱。
authorization_serversstring[]否OPTIONAL. OAuth 授權伺服器識別碼 URL 的 JSON 陣列。
jwks_uristring否OPTIONAL. 受保護資源的 JWK Set 文件之 URL。
scopes_supportedstring[]否RECOMMENDED. 用於授權請求的 OAuth 2.0 範圍值之 JSON 陣列。
bearer_methods_supportedstring[]否OPTIONAL. 受支援之 Bearer Token 呈現方法的 JSON 陣列。
resource_signing_alg_values_supportedstring[]否OPTIONAL. 受支援之 JWS 簽章演算法的 JSON 陣列。
resource_encryption_alg_values_supportedstring[]否OPTIONAL. 受支援之 JWE 加密演算法(alg)的 JSON 陣列。
resource_encryption_enc_values_supportedstring[]否OPTIONAL. 受支援之 JWE 加密演算法(enc)的 JSON 陣列。
resource_documentationstring否OPTIONAL. 資源之人類可讀文件的 URL。
resource_policy_uristring否OPTIONAL. 資源之資料使用政策的 URL。
resource_tos_uristring否OPTIONAL. 資源之服務條款的 URL。
requiredboolean否AHP 擴充功能。此資源是否需要驗證。

- true(預設) — 沒有有效的令牌就無法使用代理程式。 若用戶端在未驗證的情況下嘗試使用代理程式,伺服器 SHOULD 回傳 AuthRequired(-32007)。 - false — 代理程式無須驗證即可運作,但當提供令牌時 MAY 提供增強的能力。

用戶端 SHOULD 將缺失的欄位視同 true。

ConfigPropertySchema ​

相容於 JSON Schema 的屬性描述器,附帶顯示擴充功能。

標準 JSON Schema 欄位(type、title、description、default、 enum)讓驗證器能處理該結構描述。顯示擴充功能(enumLabels、 enumDescriptions)為平行的陣列,為每個 enum 值提供 UI 中繼資料。

這是通用基底類型。關於工作階段專屬的擴充功能,請參見 {@link SessionConfigPropertySchema}。

欄位類型必要說明
type'string' | 'number' | 'boolean' | 'array' | 'object'是JSON Schema:屬性類型
titlestring是JSON Schema:屬性的人類可讀標籤
descriptionstring否JSON Schema:描述/工具提示
defaultunknown否JSON Schema:預設值
enumJsonPrimitive[]否JSON Schema:允許的值。可為任一 JSON 類型的基本值。
enumLabelsstring[]否顯示擴充功能:每個列舉值的人類可讀標籤(平行陣列)
enumDescriptionsstring[]否顯示擴充功能:每個列舉值的描述(平行陣列)
readOnlyboolean否JSON Schema:當 true 時,屬性會顯示但使用者無法修改
itemsConfigPropertySchema否JSON Schema:陣列項目的結構描述(當 type 為 'array' 時使用)
propertiesRecord<string, ConfigPropertySchema>否JSON Schema:物件屬性的屬性描述器(當 type 為 'object' 時使用)
requiredstring[]否JSON Schema:必要屬性 id 的清單(當 type 為 'object' 時使用)
additionalPropertiesConfigPropertySchema否JSON Schema:未列於 properties 中之額外屬性的結構描述(當 type 為 'object' 時使用)。

ConfigSchema ​

描述可用設定屬性的 JSON Schema 物件。

這是通用基底類型。關於工作階段專屬的用法,請參見 {@link SessionConfigSchema}。

欄位類型必要說明
type'object'是JSON Schema:永遠為 'object'
propertiesRecord<string, ConfigPropertySchema>是JSON Schema:以屬性 id 為索引鍵的屬性描述器
requiredstring[]否JSON Schema:必要屬性 id 的清單

TextPosition ​

文字文件中以零為基底的某個位置。

欄位類型說明
linenumber以零為基底的行號。
characternumber該行內以零為基底的字元偏移量。

TextRange ​

文字文件中的一個範圍。

欄位類型說明
startTextPosition範圍的起始位置。
endTextPosition範圍的結束位置。

TextSelection ​

文字資源中的一個選取範圍。

這僅對文字資源有意義。二進位資源仍可使用資源或內嵌資源附件,但不應使用此 文字選取欄位。

欄位類型說明
rangeTextRange選取範圍所涵蓋的範圍。

ContentRef ​

對儲存於狀態樹外之大型內容的參照。

欄位類型必要說明
uriURI是內容 URI
sizeHintnumber否以位元組為單位的近似大小
contentTypestring否內容 MIME 類型
noncestring否內容 nonce

FileEdit ​

描述檔案修改的先後狀態與差異中繼資料。

支援建立(僅 after)、刪除(僅 before)、重新命名/移動 (before 與 after 中 uri 不同),以及編輯(uri 相同、內容不同)。

欄位類型必要說明
before
{
  uri: URI;
  content: ContentRef;
}
否編輯前的檔案狀態。檔案建立或就地檔案編輯時不存在。
after
{
  uri: URI;
  content: ContentRef;
}
否編輯後的檔案狀態。檔案刪除時不存在。
diff
{
  added?: number;
  removed?: number;
}
否選用的差異顯示中繼資料

UsageInfo ​

欄位類型必要說明
inputTokensnumber否已消耗的輸入令牌
outputTokensnumber否已產生的輸出令牌
modelstring否使用的模型
cacheReadTokensnumber否從快取讀取的令牌
_metaRecord<string, unknown>否此用量報告的額外提供者專屬中繼資料。 用戶端 MAY 在此尋找已知的選用索引鍵,以提供增強的 UI。

ErrorInfo ​

欄位類型必要說明
errorTypestring是錯誤類型識別碼
messagestring是人類可讀的錯誤訊息
stackstring否堆疊追蹤
_metaRecord<string, unknown>否此錯誤的額外提供者專屬中繼資料。 用戶端 MAY 在此尋找已知的選用索引鍵,以提供增強的 UI (例如用於更豐富、本地化訊息的結構化聊天擷取錯誤)。

Snapshot ​

已訂閱資源狀態的某個時間點快照,由 initialize、reconnect 與 subscribe 回傳。

欄位類型說明
resourceURI已訂閱的通道 URI(例如 ahp-root://、ahp-session:/&lt;uuid&gt; 或 ahp-chat:/&lt;uuid&gt;)
stateRootState | SessionState | TerminalState | ChangesetState | ResourceWatchState | AnnotationsState | ChatState資源的目前狀態
fromSeqnumber取此快照時的 serverSeq。後續操作將具有 serverSeq &gt; fromSeq。

操作信封 ​

每個會變動狀態的訊息都包裝在 ActionEnvelope 中,並依其 channel 欄位路由。操作酬載的完整判別聯集為 StateAction;個別操作變體記錄於各通道頁面。

ActionType ​

所有狀態操作的判別欄位值。

成員值
RootAgentsChanged'root/agentsChanged'
RootActiveSessionsChanged'root/activeSessionsChanged'
SessionReady'session/ready'
SessionCreationFailed'session/creationFailed'
SessionChatAdded'session/chatAdded'
SessionChatRemoved'session/chatRemoved'
SessionChatUpdated'session/chatUpdated'
SessionDefaultChatChanged'session/defaultChatChanged'
ChatTurnStarted'chat/turnStarted'
ChatDelta'chat/delta'
ChatResponsePart'chat/responsePart'
ChatToolCallStart'chat/toolCallStart'
ChatToolCallDelta'chat/toolCallDelta'
ChatToolCallReady'chat/toolCallReady'
ChatToolCallConfirmed'chat/toolCallConfirmed'
ChatToolCallComplete'chat/toolCallComplete'
ChatToolCallResultConfirmed'chat/toolCallResultConfirmed'
ChatToolCallContentChanged'chat/toolCallContentChanged'
ChatToolCallAuthRequired'chat/toolCallAuthRequired'
ChatToolCallAuthResolved'chat/toolCallAuthResolved'
ChatTurnComplete'chat/turnComplete'
ChatTurnCancelled'chat/turnCancelled'
ChatError'chat/error'
ChatActivityChanged'chat/activityChanged'
ChatWorkingDirectorySet'chat/workingDirectorySet'
ChatWorkingDirectoryRemoved'chat/workingDirectoryRemoved'
SessionTitleChanged'session/titleChanged'
ChatUsage'chat/usage'
ChatReasoning'chat/reasoning'
SessionServerToolsChanged'session/serverToolsChanged'
SessionActiveClientSet'session/activeClientSet'
SessionActiveClientRemoved'session/activeClientRemoved'
SessionWorkingDirectorySet'session/workingDirectorySet'
SessionWorkingDirectoryRemoved'session/workingDirectoryRemoved'
SessionInputNeededSet'session/inputNeededSet'
SessionInputNeededRemoved'session/inputNeededRemoved'
ChatPendingMessageSet'chat/pendingMessageSet'
ChatPendingMessageRemoved'chat/pendingMessageRemoved'
ChatQueuedMessagesReordered'chat/queuedMessagesReordered'
ChatDraftChanged'chat/draftChanged'
ChatInputRequested'chat/inputRequested'
ChatInputAnswerChanged'chat/inputAnswerChanged'
ChatInputCompleted'chat/inputCompleted'
SessionCustomizationsChanged'session/customizationsChanged'
SessionCustomizationToggled'session/customizationToggled'
SessionCustomizationUpdated'session/customizationUpdated'
SessionCustomizationRemoved'session/customizationRemoved'
SessionMcpServerStateChanged'session/mcpServerStateChanged'
SessionMcpServerStartRequested'session/mcpServerStartRequested'
SessionMcpServerStopRequested'session/mcpServerStopRequested'
ChatTruncated'chat/truncated'
ChatTurnsLoaded'chat/turnsLoaded'
SessionIsReadChanged'session/isReadChanged'
SessionIsArchivedChanged'session/isArchivedChanged'
SessionActivityChanged'session/activityChanged'
SessionChangesetsChanged'session/changesetsChanged'
SessionConfigChanged'session/configChanged'
SessionMetaChanged'session/metaChanged'
ChangesetStatusChanged'changeset/statusChanged'
ChangesetFileSet'changeset/fileSet'
ChangesetFileRemoved'changeset/fileRemoved'
ChangesetFilesReviewChanged'changeset/filesReviewChanged'
ChangesetContentChanged'changeset/contentChanged'
ChangesetOperationsChanged'changeset/operationsChanged'
ChangesetOperationStatusChanged'changeset/operationStatusChanged'
ChangesetCleared'changeset/cleared'
AnnotationsSet'annotations/set'
AnnotationsUpdated'annotations/updated'
AnnotationsRemoved'annotations/removed'
AnnotationsEntrySet'annotations/entrySet'
AnnotationsEntryRemoved'annotations/entryRemoved'
RootTerminalsChanged'root/terminalsChanged'
RootConfigChanged'root/configChanged'
TerminalData'terminal/data'
TerminalInput'terminal/input'
TerminalResized'terminal/resized'
TerminalClaimed'terminal/claimed'
TerminalTitleChanged'terminal/titleChanged'
TerminalCwdChanged'terminal/cwdChanged'
TerminalExited'terminal/exited'
TerminalCleared'terminal/cleared'
TerminalCommandDetectionAvailable'terminal/commandDetectionAvailable'
TerminalCommandExecuted'terminal/commandExecuted'
TerminalCommandFinished'terminal/commandFinished'
ResourceWatchChanged'resourceWatch/changed'

ActionOrigin ​

識別最初分派該操作的用戶端。

欄位類型說明
clientIdstring
clientSeqnumber

ActionEnvelope ​

每個操作都包裝在 ActionEnvelope 中。

此信封識別該操作所屬的通道(例如根操作使用 ahp-root://、工作階段操作 使用工作階段 URI、終端機操作使用終端機 URI)。個別操作的有效負載只帶有 該操作本身固有的欄位;通道來自信封,這使得任何可訂閱的資源都能統一地 路由其操作。

欄位類型必要說明
channelURI是此操作所屬的通道 URI。
actionStateAction是
serverSeqnumber是
originActionOrigin | undefined是
rejectionReasonstring否

StateAction ​

所有狀態操作的判別聯集。

RootAgentsChangedAction | RootActiveSessionsChangedAction | RootTerminalsChangedAction | RootConfigChangedAction | SessionReadyAction | SessionCreationFailedAction | SessionChatAddedAction | SessionChatRemovedAction | SessionChatUpdatedAction | SessionDefaultChatChangedAction | SessionTitleChangedAction | SessionServerToolsChangedAction | SessionActiveClientSetAction | SessionActiveClientRemovedAction | SessionWorkingDirectorySetAction | SessionWorkingDirectoryRemovedAction | SessionInputNeededSetAction | SessionInputNeededRemovedAction | SessionCustomizationsChangedAction | SessionCustomizationToggledAction | SessionCustomizationUpdatedAction | SessionCustomizationRemovedAction | SessionMcpServerStateChangedAction | SessionMcpServerStartRequestedAction | SessionMcpServerStopRequestedAction | SessionIsReadChangedAction | SessionIsArchivedChangedAction | SessionActivityChangedAction | SessionChangesetsChangedAction | SessionConfigChangedAction | SessionMetaChangedAction | ChatTurnStartedAction | ChatDeltaAction | ChatResponsePartAction | ChatToolCallStartAction | ChatToolCallDeltaAction | ChatToolCallReadyAction | ChatToolCallConfirmedAction | ChatToolCallCompleteAction | ChatToolCallResultConfirmedAction | ChatToolCallContentChangedAction | ChatToolCallAuthRequiredAction | ChatToolCallAuthResolvedAction | ChatTurnCompleteAction | ChatTurnCancelledAction | ChatErrorAction | ChatActivityChangedAction | ChatWorkingDirectorySetAction | ChatWorkingDirectoryRemovedAction | ChatUsageAction | ChatReasoningAction | ChatPendingMessageSetAction | ChatPendingMessageRemovedAction | ChatQueuedMessagesReorderedAction | ChatDraftChangedAction | ChatInputRequestedAction | ChatInputAnswerChangedAction | ChatInputCompletedAction | ChatTruncatedAction | ChatTurnsLoadedAction | ChangesetStatusChangedAction | ChangesetFileSetAction | ChangesetFileRemovedAction | ChangesetFilesReviewChangedAction | ChangesetContentChangedAction | ChangesetOperationsChangedAction | ChangesetOperationStatusChangedAction | ChangesetClearedAction | AnnotationsSetAction | AnnotationsUpdatedAction | AnnotationsRemovedAction | AnnotationsEntrySetAction | AnnotationsEntryRemovedAction | TerminalDataAction | TerminalInputAction | TerminalResizedAction | TerminalClaimedAction | TerminalTitleChangedAction | TerminalCwdChangedAction | TerminalExitedAction | TerminalClearedAction | TerminalCommandDetectionAvailableAction | TerminalCommandExecutedAction | TerminalCommandFinishedAction | ResourceWatchChangedAction

基礎參數 ​

每個指令的 params 物件都會擴充 BaseParams,確保頂層一定帶有 channel: URI。

BaseParams ​

每個指令的 params 所擴充的基底形狀。

channel 識別該指令所針對的通道,與每個協定通知上的 channel 欄位互相對應。 對於操作特定通道(工作階段、終端機或變更集)的指令,channel 為該通道的 URI。 對於連線層級而非通道範圍的指令(例如 {@link InitializeParams | initialize}、 {@link PingParams | ping}、{@link ListSessionsParams | listSessions}、 resource* 檔案系統指令,以及 {@link AuthenticateParams | authenticate}), 其 params 類型會將 channel 縮窄為字面根 URI 'ahp-root://'。

此不變性讓實作能藉由檢查 params.channel 來路由每個傳入訊息 — 無論是請求、回應或通知 — 而無需知道各 method 的 params 形狀。

欄位類型說明
channelURI此指令所針對的通道 URI。

指令 ​

跨通道指令與通知。通道專屬指令(createSession、listSessions、createTerminal、invokeChangesetOperation 等)記錄於對應的通道頁面。

JSON Schema: commands.schema.json

initialize ​

建立新連線並協商協定版本。 這 MUST 是用戶端傳送的第一個訊息。

屬性值
方向用戶端 → 伺服器
類型請求

參數:

欄位類型必要說明
channel'ahp-root://'是
protocolVersionsstring[]是用戶端願意使用的協定版本,依最偏好到最不偏好排序。每個項目為一個 SemVer MAJOR.MINOR.PATCH 字串(例如 "0.1.0")。

伺服器會選取一個項目,並以 InitializeResult.protocolVersion 回傳。 若伺服器無法使用提供的任何版本,它 MUST 回傳錯誤碼 -32005 (UnsupportedProtocolVersion)。
clientIdstring是唯一的用戶端識別碼
clientInfoImplementation否選用的用戶端實作識別(名稱與版本)。僅供參考 — 關於其可用與不可用的方式, 請參見 {@link Implementation}。有別於 {@link InitializeParams.clientId | clientId}, 後者是每個連線用於重新連線的不透明識別碼,而非人類可讀的實作名稱。
initialSubscriptionsURI[]否握手期間要訂閱的 URI
localestring否IETF BCP 47 語言標籤,指出用戶端的偏好地區設定(例如 "en-US"、"ja")。 伺服器 SHOULD 使用此值來本地化面向使用者的字串,例如確認選項標籤。
capabilitiesClientCapabilities否選用的用戶端能力宣告。

伺服器 SHOULD 僅宣佈其對應用戶端能力在此處已設定的功能。缺少代表 「未宣告」— 伺服器 MUST 假設用戶端不支援該功能。

結果:

欄位類型必要說明
protocolVersionstring是伺服器選取的協定版本。MUST 是 InitializeParams.protocolVersions 中的其中 一個項目。格式為 SemVer MAJOR.MINOR.PATCH 字串 (例如 "0.1.0")。
serverSeqnumber是目前的伺服器序號
serverInfoImplementation否選用的伺服器實作識別(名稱與版本)。僅供參考 — 關於其可用與不可用的方式, 請參見 {@link Implementation}。相對於 {@link InitializeResult.protocolVersion | protocolVersion} 識別已協商的協定, serverInfo 則識別其背後的主機軟體。
snapshotsSnapshot[]是每個 initialSubscriptions URI 的快照
defaultDirectoryURI否建議用於遠端檔案系統瀏覽的預設目錄
completionTriggerCharactersstring[]否在 {@link Message} 輸入中輸入時,SHOULD 讓用戶端發出帶有 {@link CompletionItemKind.UserMessage} 之 completions 請求的字元。 通常包含如 '@' 或 '/' 等字元。
terminalCommandPrefixstring否主機在使用者 {@link Message.text} 開頭識別的前綴,作為將剩餘部分當作終端機 指令執行的速記。目前標準化的慣例為 "!";缺少代表主機不支援指令前綴。
telemetryTelemetryCapabilities否主機發出的 OTLP 遙測通道(若有)。每個已填入的欄位若非字面的 ahp-otlp: 通道 URI,即為用戶端在訂閱前展開的 RFC 6570 URI 範本(目前只有 logs 通道定義了範本變數 {level},供訂閱端進行嚴重性篩選)。用戶端 MAY 忽略 其無法處理的訊號。

詳見 生命週期。


ping ​

驗證 AHP 連線是否仍存活,並避免被閒置逾時的中介者(代理伺服器、負載平衡器等) 關閉。

無論用戶端是否已完成 initialize 或持有任何訂閱,伺服器都 MUST 回應。Ping 在 任一方向都不帶有效負載;回應本身即為訊號。

屬性值
方向用戶端 → 伺服器
類型請求

參數:

欄位類型說明
channel'ahp-root://'

結果: 成功時為 null。


reconnect ​

重新建立已中斷的連線。伺服器會重播遺漏的操作或提供新的快照。

屬性值
方向用戶端 → 伺服器
類型請求

參數:

欄位類型說明
channel'ahp-root://'
clientIdstring原始連線的用戶端識別碼
lastSeenServerSeqnumber用戶端收到的最後一個 serverSeq
subscriptionsURI[]用戶端已訂閱的 URI

結果(重播): 當伺服器可從請求的序列重播時:

欄位類型說明
typeReconnectResultType.Replay判別欄位
actionsActionEnvelope[]自 lastSeenServerSeq 以來遺漏的操作信封
missingURI[]ReconnectParams.subscriptions 中伺服器無法恢復的 URI。這包括已不存在的資源 (例如已處置的工作階段或終端機),以及用戶端不再獲許觀察的資源。用戶端 SHOULD 將這些從其本地訂閱集合中捨棄。

結果(快照): 當間距超過重播緩衝區時:

欄位類型說明
typeReconnectResultType.Snapshot判別欄位
snapshotsSnapshot[]每個訂閱的新快照

詳見 生命週期。


subscribe ​

訂閱以 URI 識別的通道。

通道 MAY 帶有相關聯的狀態(例如根、工作階段、終端機),或是無狀態的 (純粹用於串流資料的發佈/訂閱)。對於帶有狀態的通道,結果會包含快照; 對於無狀態的通道則省略 snapshot。

屬性值
方向用戶端 → 伺服器
類型請求

參數:

欄位類型必要說明
deliverySubscriptionDeliveryOptions否此訂閱的選用傳遞偏好。

伺服器 MAY 使用這些偏好來緩衝並合併高頻率的更新,同時保留相同的縮減狀態。 省略此欄位則採用伺服器的預設傳遞行為。
viewSubscribeView否針對回傳快照的選用用戶端請求形狀。

不理解所請求 view 的伺服器會忽略它並回傳其預設快照。用戶端 MUST 容忍收到 比請求更多的狀態。

結果:

欄位類型必要說明
snapshotSnapshot否已訂閱通道狀態的快照(無狀態的通道會省略)

詳見 訂閱。


unsubscribe ​

停止接收某個通道的更新。

屬性值
方向用戶端 → 伺服器
類型通知

參數:

欄位類型說明
channelURI要取消訂閱的通道 URI

詳見 訂閱。


dispatchAction ​

射後即忘的操作分派(預寫入)。用戶端將操作樂觀地套用到本地狀態,而伺服器一旦 接受就會以 {@link ActionEnvelope} 回傳它們。

用戶端 → 伺服器的 method 名為 dispatchAction;伺服器的回覆會透過 伺服器 → 用戶端的 action 通知抵達(params:{@link ActionEnvelope})。

屬性值
方向用戶端 → 伺服器
類型通知

參數:

欄位類型說明
channelURI此操作所針對的通道 URI
clientSeqnumber用戶端序號
actionStateAction要分派的操作

詳見 操作。


resourceRead ​

依 URI 讀取資源的內容。

內容參照以參照而非內嵌的方式儲存大型資料(影像、冗長的工具輸出),藉此讓狀態 樹保持小巧。

二進位內容(影像等)MUST 使用 base64 編碼。文字內容 MAY 使用 utf-8 編碼。

如同所有 resource* method,resourceRead 是對稱的,MAY 在任一方向傳送。 主機用它來從用戶端發佈的 URI(例如 virtual://my-client/... 外掛)擷取內容; 用戶端用它來讀取主機端的檔案。無論由哪一端發起,接收端都透過相同的 權限/resourceRequest 流程來強制執行存取。

屬性值
方向用戶端 ↔ 伺服器
類型請求

參數:

欄位類型必要說明
channel'ahp-root://'是
uristring是來自 ContentRef 的內容 URI
encodingContentEncoding否回傳資料的偏好編碼(預設:由伺服器選擇)

結果:

欄位類型必要說明
datastring是編碼為字串的內容
encodingContentEncoding是data 的編碼方式
contentTypestring否內容類型(例如 "image/png"、"text/plain")

範例:

jsonc
// Client → Server
{ "jsonrpc": "2.0", "id": 10, "method": "resourceRead",
  "params": { "uri": "ahp-session:/<uuid>/content/img-1" } }

// Server → Client
{ "jsonrpc": "2.0", "id": 10, "result": {
  "data": "iVBORw0KGgo...",
  "encoding": "base64",
  "contentType": "image/png"
}}

resourceWrite ​

將內容寫入伺服器檔案系統上的檔案。

二進位內容(影像等)MUST 使用 base64 編碼。文字內容 MAY 使用 utf-8 編碼。

若檔案不存在,會予以建立。若檔案已存在,對現有位元組的影響取決於 {@link ResourceWriteParams.mode}:truncate(預設)從所選偏移量開始覆寫、 append 保留所有現有位元組並在以 EOF 為基準的位置加入 data,而 insert 保留所有現有位元組並在以檔案開頭為基準的偏移量處拼接 data。

如同所有 resource* method,resourceWrite 是對稱的,MAY 在任一方向傳送。

屬性值
方向用戶端 ↔ 伺服器
類型請求

參數:

欄位類型必要說明
channel'ahp-root://'是
uriURI是伺服器檔案系統上的目標檔案 URI
datastring是編碼為字串的內容
encodingContentEncoding是data 的編碼方式
contentTypestring否內容類型(例如 "text/plain"、"image/png")
createOnlyboolean否若為 true,當檔案已存在時伺服器 MUST 失敗,而非覆寫它。適用於安全地 建立新檔案。
modeResourceWriteMode否data 在目標檔案中的放置方式。省略時預設為 'truncate'(完整覆寫)。 關於各模式的意義及其對 {@link position} 的解讀,請參見 {@link ResourceWriteMode}。
positionnumber否依 {@link mode} 解讀的位元組偏移量。預設為 0。 - truncate:從檔案開頭起算,要在寫入前截斷的偏移量。 - append:從 EOF 往回起算,要插入 data 的位元組數。 - insert:從檔案開頭起算,要拼接 data 的偏移量。
ifMatchstring否先前由 {@link ResourceResolveResult.etag} 回傳的樂觀並行令牌。設定後,若目前 的 etag 不相符,伺服器 MUST 以 Conflict 失敗 — 以防止 resourceResolve 與後續 resourceWrite 之間的更新遺失。

結果:

(空物件)

範例:

jsonc
// Client → Server
{ "jsonrpc": "2.0", "id": 11, "method": "resourceWrite",
  "params": { "uri": "file:///workspace/hello.txt", "data": "SGVsbG8=",
             "encoding": "base64", "contentType": "text/plain" } }

// Server → Client
{ "jsonrpc": "2.0", "id": 11, "result": {} }

resourceList ​

列出伺服器檔案系統上某個檔案 URI 的目錄項目。

這是為了遠端資料夾挑選器及類似的 UI 而設計,這類 UI 需要讓使用者瀏覽伺服器 的本地檔案系統。

伺服器 MUST 僅在目標存在且為目錄時回傳成功。若目標不存在、不是目錄或無法 存取,伺服器 MUST 回傳 JSON-RPC 錯誤。

如同所有 resource* method,resourceList 是對稱的,MAY 在任一方向傳送。

屬性值
方向用戶端 ↔ 伺服器
類型請求

參數:

欄位類型說明
channel'ahp-root://'
uriURI伺服器檔案系統上的目錄 URI

結果:

欄位類型說明
entriesDirectoryEntry[]直接包含在所請求目錄中的項目

resourceCopy ​

將資源從某個 URI 複製到另一個 URI(位於伺服器的檔案系統)。

若目的地已存在,除非設定了 failIfExists,否則會被覆寫。

如同所有 resource* method,resourceCopy 是對稱的,MAY 在任一方向傳送。

屬性值
方向用戶端 ↔ 伺服器
類型請求

參數:

欄位類型必要說明
channel'ahp-root://'是
sourceURI是要從中複製的來源 URI
destinationURI是要複製到的目的地 URI
failIfExistsboolean否若為 true,當目的地已存在時伺服器 MUST 失敗,而非覆寫它。

結果:

(空物件)


resourceDelete ​

刪除伺服器檔案系統上位於某個 URI 的資源。

如同所有 resource* method,resourceDelete 是對稱的,MAY 在任一方向傳送。

屬性值
方向用戶端 ↔ 伺服器
類型請求

參數:

欄位類型必要說明
channel'ahp-root://'是
uriURI是要刪除的資源 URI
recursiveboolean否若為 true 且目標為目錄,則遞迴刪除它及其所有內容。若為 false(預設), 刪除非空目錄時 MUST 失敗。

結果:

(空物件)


resourceRequest ​

請求存取接收端檔案系統上某個資源的權限。

resourceRequest 是對稱的,MAY 在任一方向傳送:用戶端要求伺服器授予對伺服器端 資源的存取權,或伺服器要求用戶端授予對用戶端端資源的存取權。接收端決定要允許、 拒絕,還是針對所請求的存取提示使用者。

若接收端拒絕存取,它 MUST 以 PermissionDenied(-32009) 回應。錯誤資料 MAY 包含一個 ResourceRequestParams 值,描述呼叫端需要被授予哪些存取權該操作才會 成功;請參見 types/errors.ts 中的 PermissionDeniedErrorData。

在 resourceRequest 成功後,呼叫端 MAY 使用對應的 resource* 指令(例如 resourceRead、resourceWrite)來執行該操作。接收端 MAY 隨時撤銷存取權,只需 在後續操作中回傳 PermissionDenied。

read、write 或兩者 SHOULD 至少有一個設為 true。兩個旗標皆未設定的請求, 接收端會視為 read: true。

屬性值
方向用戶端 ↔ 伺服器
類型請求

參數:

欄位類型必要說明
channel'ahp-root://'是
uriURI是所請求的資源 URI。通常是接收端檔案系統上的 file: URI,但任何由接收端仲介 存取的 URI 配置皆可。
readboolean否呼叫端是否需要對該資源的讀取權。
writeboolean否呼叫端是否需要對該資源的寫入權。

結果:

(空物件)


resourceMove ​

將資源從某個 URI 移動(重新命名)到另一個 URI(位於伺服器的檔案系統)。

若目的地已存在,除非設定了 failIfExists,否則會被覆寫。

如同所有 resource* method,resourceMove 是對稱的,MAY 在任一方向傳送。

屬性值
方向用戶端 ↔ 伺服器
類型請求

參數:

欄位類型必要說明
channel'ahp-root://'是
sourceURI是要從中移動的來源 URI
destinationURI是要移動到的目的地 URI
failIfExistsboolean否若為 true,當目的地已存在時伺服器 MUST 失敗,而非覆寫它。

結果:

(空物件)


resourceResolve ​

解析資源 — 結合 POSIX 的 stat 與 realpath。

resourceResolve 回傳資源的中繼資料,以及符號連結解析後的標準 URI。請以此 取代任何 resourceExists 的權宜措施:缺少的資源 MUST 以 NotFound JSON-RPC 錯誤呈現,而非帶有哨兵值的成功回應。真正需要布林檢查的呼叫端應嘗試 resourceResolve,並將 NotFound 視為「不存在」。

如同所有 resource* method,resourceResolve 是對稱的,MAY 在任一方向傳送。

屬性值
方向用戶端 ↔ 伺服器
類型請求

參數:

欄位類型必要說明
channel'ahp-root://'是
uriURI是要解析的 URI
followSymlinksboolean否當為 true(預設)時,跟隨符號連結並回報連結目標的中繼資料 — 並將結果中的 uri 設為標準(realpath)URI。當為 false 時,對連結本身執行 stat (lstat 語意)並回報 type: 'symlink'。

結果:

欄位類型必要說明
uriURI是符號連結解析後的標準 URI。當 followSymlinks 為 false 或該 URI 未穿越 符號連結時,等於所請求的 URI。
typeResourceType是資源種類。
sizenumber否以位元組為單位的大小。當提供者無法廉價地計算時,對目錄省略。
mtimestring否上次修改時間,採 ISO 8601 格式(已知時)。
ctimestring否建立時間,採 ISO 8601 格式(已知時)。
contentTypestring否嗅探得到的 MIME 類型(已知時,例如 "text/plain"、"image/png")。
etagstring否不透明的各提供者版本令牌。出現時,請將其作為 {@link ResourceWriteParams.ifMatch} 傳入後續的 resourceWrite,以偵測並行的修改。

範例:

jsonc
// Client → Server
{ "jsonrpc": "2.0", "id": 20, "method": "resourceResolve",
  "params": { "channel": "ahp-root://", "uri": "file:///workspace/hello.txt" } }

// Server → Client
{ "jsonrpc": "2.0", "id": 20, "result": {
  "uri": "file:///workspace/hello.txt",
  "type": "file",
  "size": 5,
  "mtime": "2026-01-15T12:34:56.789Z",
  "etag": "W/\"5-abc123\""
}}

resourceMkdir ​

以 mkdir -p 語意在伺服器的檔案系統上建立目錄。

伺服器 MUST 建立任何缺少的父目錄。建立已存在的目錄為無操作的成功。若 uri 已存在但不是目錄,伺服器 MUST 以 AlreadyExists 失敗。

如同所有 resource* method,resourceMkdir 是對稱的,MAY 在任一方向傳送。

屬性值
方向用戶端 ↔ 伺服器
類型請求

參數:

欄位類型說明
channel'ahp-root://'
uriURI要建立的目錄 URI(視需要建立父目錄)。

結果:

(空物件)


authenticate ​

為受保護資源推送 ******。resource 欄位 MUST 符合用戶端從伺服器發現的受保護 資源識別碼 — 無論是靜態宣告於 AgentInfo.protectedResources,或是從即時的 McpServerAuthRequiredState.resource 或 ToolCallAuthRequiredState.auth.resource 動態發現(後兩者僅在對應的 MCP 伺服器或工具呼叫實際挑戰驗證時才會浮現)。 伺服器 MUST 接受其透過這三種機制之一所自行宣佈的任何 resource 值。

令牌使用 RFC 6750 (****** 使用)語意傳遞。用戶端從資源中繼資料所列的授權伺服器取得令牌, 並透過此指令將其推送給伺服器。

屬性值
方向用戶端 → 伺服器
類型請求

參數:

欄位類型必要說明
channel'ahp-root://'是
resourcestring是受保護資源識別碼。MUST 符合伺服器已宣佈的 resource 值 — 透過 AgentInfo.protectedResources 中的 ProtectedResourceMetadata,或是透過 即時的 McpServerAuthRequiredState.resource/ToolCallAuthRequiredState.auth.resource。
tokenstring是從資源的授權伺服器取得的
scopesstring[]否令牌所授予的 OAuth 範圍(已知時)。讓伺服器能判斷某個特定挑戰 — 例如即時 McpServerAuthRequiredState 或 ToolCallAuthRequiredState.auth 上的 requiredScopes — 是否已滿足,而無需解碼(不透明、伺服器專屬的)令牌本身。 當用戶端未將已授予的範圍與令牌分開追蹤時省略。

結果:

(空物件)

詳見 驗證。

範例:

jsonc
// Client → Server
{ "jsonrpc": "2.0", "id": 3, "method": "authenticate",
  "params": { "channel": "ahp-root://", "resource": "https://api.github.com", "token": "gho_xxxx" } }

// Server → Client (success)
{ "jsonrpc": "2.0", "id": 3, "result": {} }

// Server → Client (failure — invalid token)
{ "jsonrpc": "2.0", "id": 3, "error": { "code": -32007, "message": "Invalid token" } }

通知 ​

通知是短暫的廣播,不屬於狀態樹的一部分。它們不會被 reducer 處理,也不會在重新連線時重播。每個通知都帶有頂層 channel: URI,用來識別其所屬的訂閱。

JSON Schema: notifications.schema.json

auth/required ​

當受保護資源需要(重新)驗證時,由伺服器發送。

此通知 MAY 與任何通道關聯 — 例如在根通道上公告的代理程式,或是某個 工作階段專屬資源。channel 欄位識別此驗證需求所屬的訂閱;resource 欄位則帶有受 OAuth 保護的資源識別碼(依 RFC 9728)。

用戶端應取得新的令牌,並透過 authenticate 指令推送它。

屬性值
方向伺服器 → 用戶端
類型通知

參數:

欄位類型必要說明
channelURI是此通知所屬的通道 URI
resourcestring是需要驗證的受保護資源識別碼
reasonAuthRequiredReason否要求驗證的原因

範例:

json
{
  "jsonrpc": "2.0",
  "method": "auth/required",
  "params": {
    "channel": "ahp-root://",
    "resource": "https://api.github.com",
    "reason": "expired"
  }
}

JSON-RPC 線路類型 ​

基礎 JSON-RPC 訊息形狀,以及驅動判別聯集包裝器的具型別登錄檔(AhpRequest、AhpResponse、AhpClientNotification、AhpServerNotification、AhpNotification、ProtocolMessage)。

JsonRpcRequest ​

JSON-RPC 請求:同時具有 method 與 id。

欄位類型必要說明
jsonrpc'2.0'是
idnumber是
methodstring是
paramsunknown否

JsonRpcSuccessResponse ​

JSON-RPC 成功回應。

欄位類型說明
jsonrpc'2.0'
idnumber
resultunknown

JsonRpcErrorResponse ​

JSON-RPC 錯誤回應。

欄位類型說明
jsonrpc'2.0'
idnumber
error
{
  readonly code: number;
  readonly message: string;
  readonly data?: unknown;
}

JsonRpcNotification ​

JSON-RPC 通知:具有 method 但沒有 id。

欄位類型必要說明
jsonrpc'2.0'是
methodstring是
paramsunknown否

AhpErrorResponse ​

一個型別化的 JSON-RPC 錯誤回應,其錯誤物件為完整型別化的 {@link AhpError}。當呼叫端知道該回應是 AHP 應用錯誤,且希望 data 依 code 縮窄時,此型別相當實用。

欄位類型說明
jsonrpc'2.0'
idnumber
errorAhpError

登錄檔 ​

判別聯集包裝器是以這些登錄檔介面參數化。每個屬性都是一個 JSON-RPC 方法名稱;每個值都是一個 { params; result? } 型別字面值。

CommandMap ​

將每個指令 method 名稱對應到其 params 與 result 類型的登錄。

CommandMap 涵蓋由用戶端傳送給伺服器的 method。也可能由伺服器發起的 method 會重複出現在 {@link ServerCommandMap} 中;兩份對應中的項目保持一致。

ts
export interface CommandMap {
  'initialize': { params: InitializeParams; result: InitializeResult };
  'ping': { params: PingParams; result: null };
  'reconnect': { params: ReconnectParams; result: ReconnectResult };
  'subscribe': { params: SubscribeParams; result: SubscribeResult };
  'createSession': { params: CreateSessionParams; result: null };
  'disposeSession': { params: DisposeSessionParams; result: null };
  'createChat': { params: CreateChatParams; result: null };
  'disposeChat': { params: DisposeChatParams; result: null };
  'createTerminal': { params: CreateTerminalParams; result: null };
  'disposeTerminal': { params: DisposeTerminalParams; result: null };
  'createResourceWatch': { params: CreateResourceWatchParams; result: CreateResourceWatchResult };
  'listSessions': { params: ListSessionsParams; result: ListSessionsResult };
  'resourceRead': { params: ResourceReadParams; result: ResourceReadResult };
  'resourceWrite': { params: ResourceWriteParams; result: ResourceWriteResult };
  'resourceList': { params: ResourceListParams; result: ResourceListResult };
  'resourceCopy': { params: ResourceCopyParams; result: ResourceCopyResult };
  'resourceDelete': { params: ResourceDeleteParams; result: ResourceDeleteResult };
  'resourceMove': { params: ResourceMoveParams; result: ResourceMoveResult };
  'resourceResolve': { params: ResourceResolveParams; result: ResourceResolveResult };
  'resourceMkdir': { params: ResourceMkdirParams; result: ResourceMkdirResult };
  'resourceRequest': { params: ResourceRequestParams; result: ResourceRequestResult };
  'fetchTurns': { params: FetchTurnsParams; result: FetchTurnsResult };
  'authenticate': { params: AuthenticateParams; result: AuthenticateResult };
  'resolveSessionConfig': { params: ResolveSessionConfigParams; result: ResolveSessionConfigResult };
  'sessionConfigCompletions': { params: SessionConfigCompletionsParams; result: SessionConfigCompletionsResult };
  'completions': { params: CompletionsParams; result: CompletionsResult };
  'invokeChangesetOperation': { params: InvokeChangesetOperationParams; result: InvokeChangesetOperationResult };
}

ServerCommandMap ​

將每個伺服器 → 用戶端請求 method 對應到其 params 與 result 類型的登錄。

resource* 家族是對稱的:每個出現在 {@link CommandMap} 中的 method 也會 以相同的 params/result 形狀出現在此處,而無論由哪一端發起,接收端都會決定 要允許、拒絕或針對所請求的操作提示使用者。主機使用反向方向來讀取用戶端發佈的 URI(例如 virtual://my-client/... 外掛),並驅動各工作階段的檔案系統提供者, 而用戶端無需重新實作線路結構描述。

ts
export interface ServerCommandMap {
  'resourceRead': { params: ResourceReadParams; result: ResourceReadResult };
  'resourceWrite': { params: ResourceWriteParams; result: ResourceWriteResult };
  'resourceList': { params: ResourceListParams; result: ResourceListResult };
  'resourceCopy': { params: ResourceCopyParams; result: ResourceCopyResult };
  'resourceDelete': { params: ResourceDeleteParams; result: ResourceDeleteResult };
  'resourceMove': { params: ResourceMoveParams; result: ResourceMoveResult };
  'resourceResolve': { params: ResourceResolveParams; result: ResourceResolveResult };
  'resourceMkdir': { params: ResourceMkdirParams; result: ResourceMkdirResult };
  'resourceRequest': { params: ResourceRequestParams; result: ResourceRequestResult };
  'createResourceWatch': { params: CreateResourceWatchParams; result: CreateResourceWatchResult };
}

ClientNotificationMap ​

將每個用戶端 → 伺服器通知 method 對應到其 params 類型的登錄。

每個通知的 params MUST 帶有頂層的 channel: URI,以便伺服器能將訊息路由到 正確的訂閱。關於標準的「基底」形狀,請參見 {@link UnsubscribeParams}。

ts
export interface ClientNotificationMap {
  'unsubscribe': { params: UnsubscribeParams };
  'dispatchAction': { params: DispatchActionParams };
}

ServerNotificationMap ​

將每個伺服器 → 用戶端通知 method 對應到其 params 類型的登錄。

每個通知的 params MUST 帶有頂層的 channel: URI,以便用戶端能將訊息分派到 正確的訂閱。

ts
export interface ServerNotificationMap {
  'action': { params: ActionEnvelope };
  'root/sessionAdded': { params: SessionAddedParams };
  'root/sessionRemoved': { params: SessionRemovedParams };
  'root/sessionSummaryChanged': { params: SessionSummaryChangedParams };
  'root/progress': { params: ProgressParams };
  'auth/required': { params: AuthRequiredParams };
  'otlp/exportLogs': { params: OtlpExportLogsParams };
  'otlp/exportTraces': { params: OtlpExportTracesParams };
  'otlp/exportMetrics': { params: OtlpExportMetricsParams };
}

具型別包裝器 ​

AhpRequest ​

針對特定 AHP 指令的完整型別化 JSON-RPC 請求。

當作為聯集使用時(預設泛型),對 method 縮窄即可得到型別化的 params:

ts
function handle(req: AhpRequest) {
  if (req.method === 'fetchTurns') {
    req.params.session; // typed as URI
  }
}

預設為用戶端 → 伺服器請求({@link CommandMap})。請使用 {@link AhpServerRequest} 來處理伺服器 → 用戶端請求。

M extends unknown ? { readonly jsonrpc: '2.0'; readonly id: number; readonly method: M; readonly params: CommandMap[M]['params']; } : never

AhpServerRequest ​

由伺服器發起的完整型別化 JSON-RPC 請求。形狀與 {@link AhpRequest} 相同, 但以 {@link ServerCommandMap} 參數化。

M extends unknown ? { readonly jsonrpc: '2.0'; readonly id: number; readonly method: M; readonly params: ServerCommandMap[M]['params']; } : never

AhpSuccessResponse ​

針對特定 AHP 指令的完整型別化 JSON-RPC 成功回應。

由於 JSON-RPC 回應不帶有 method,當您從關聯的請求得知 method 時, 請搭配明確的泛型參數使用此型別:

ts
const result: AhpSuccessResponse<'listSessions'> = ...;
result.result.items; // typed as SessionSummary[]

M extends unknown ? { readonly jsonrpc: '2.0'; readonly id: number; readonly result: CommandMap[M]['result']; } : never

AhpResponse ​

型別化的 JSON-RPC 回應(帶有已知 result 類型的成功回應,或錯誤回應)。

AhpSuccessResponse<M> | JsonRpcErrorResponse

AhpServerSuccessResponse ​

針對伺服器 → 用戶端請求({@link ServerCommandMap})的完整型別化 JSON-RPC 成功回應。

M extends unknown ? { readonly jsonrpc: '2.0'; readonly id: number; readonly result: ServerCommandMap[M]['result']; } : never

AhpServerResponse ​

針對伺服器 → 用戶端請求的型別化 JSON-RPC 回應。

AhpServerSuccessResponse<M> | JsonRpcErrorResponse

AhpClientNotification ​

用戶端 → 伺服器通知。

M extends unknown ? { readonly jsonrpc: '2.0'; readonly method: M; readonly params: ClientNotificationMap[M]['params']; } : never

AhpServerNotification ​

伺服器 → 用戶端通知。

M extends unknown ? { readonly jsonrpc: '2.0'; readonly method: M; readonly params: ServerNotificationMap[M]['params']; } : never

AhpNotification ​

完整型別化的 JSON-RPC 通知 — 任一方向皆可。

用戶端 → 伺服器的 dispatchAction method 與伺服器 → 用戶端的 action method 是登錄中兩個不同的項目;其 params 具有不相關的形狀 ({@link DispatchActionParams} 與 {@link ActionEnvelope})。

AhpClientNotification | AhpServerNotification

ProtocolMessage ​

所有 AHP 協定訊息的判別聯集。

使用標準 JSON-RPC 結構來縮窄:

  • 帶有 method + id → 請求({@link AhpRequest} 或 {@link AhpServerRequest})
  • 帶有 method、無 id → 通知({@link AhpNotification})
  • 帶有 result 或 error + id → 回應({@link AhpResponse})

接著對 method 縮窄以取得完整型別化的 params:

ts
function dispatch(msg: ProtocolMessage) {
  if ('method' in msg && 'id' in msg) {
    // msg is AhpRequest | AhpServerRequest
    if (msg.method === 'fetchTurns') {
      msg.params.session; // URI
    }
  }
}

AhpRequest | AhpServerRequest | AhpSuccessResponse | AhpServerSuccessResponse | JsonRpcErrorResponse | AhpNotification

以 MIT 授權發布。