跳至內容

通用類型

跨通道共用、適用於代理主機協定每個通道的橫切型別定義 — 基本別名、操作信封、基礎指令形狀、跨通道 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 格式。

欄位類型必要說明
resourcestringREQUIRED. 受保護資源的資源識別碼,一個使用 https 配置且不含片段元件的 URL(例如 "https://api.github.com")。
resource_namestringOPTIONAL. 受保護資源的人類可讀名稱。
authorization_serversstring[]OPTIONAL. OAuth 授權伺服器識別碼 URL 的 JSON 陣列。
jwks_uristringOPTIONAL. 受保護資源的 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_documentationstringOPTIONAL. 資源之人類可讀文件的 URL。
resource_policy_uristringOPTIONAL. 資源之資料使用政策的 URL。
resource_tos_uristringOPTIONAL. 資源之服務條款的 URL。
requiredbooleanAHP 擴充功能。此資源是否需要驗證。

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

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

ConfigPropertySchema

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

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

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

欄位類型必要說明
type'string' | 'number' | 'boolean' | 'array' | 'object'JSON Schema:屬性類型
titlestringJSON Schema:屬性的人類可讀標籤
descriptionstringJSON Schema:描述/工具提示
defaultunknownJSON Schema:預設值
enumJsonPrimitive[]JSON Schema:允許的值。可為任一 JSON 類型的基本值。
enumLabelsstring[]顯示擴充功能:每個列舉值的人類可讀標籤(平行陣列)
enumDescriptionsstring[]顯示擴充功能:每個列舉值的描述(平行陣列)
readOnlybooleanJSON Schema:當 true 時,屬性會顯示但使用者無法修改
itemsConfigPropertySchemaJSON Schema:陣列項目的結構描述(當 type'array' 時使用)
propertiesRecord<string, ConfigPropertySchema>JSON Schema:物件屬性的屬性描述器(當 type'object' 時使用)
requiredstring[]JSON Schema:必要屬性 id 的清單(當 type'object' 時使用)
additionalPropertiesConfigPropertySchemaJSON 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)、重新命名/移動 (beforeafteruri 不同),以及編輯(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

已訂閱資源狀態的某個時間點快照,由 initializereconnectsubscribe 回傳。

欄位類型說明
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。

指令

跨通道指令與通知。通道專屬指令(createSessionlistSessionscreateTerminalinvokeChangesetOperation 等)記錄於對應的通道頁面。

JSON Schema: commands.schema.json

initialize

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

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

參數:

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

伺服器會選取一個項目,並以 InitializeResult.protocolVersion 回傳。 若伺服器無法使用提供的任何版本,它 MUST 回傳錯誤碼 -32005UnsupportedProtocolVersion)。
clientIdstring唯一的用戶端識別碼
clientInfoImplementation選用的用戶端實作識別(名稱與版本)。僅供參考 — 關於其可用與不可用的方式, 請參見 {@link Implementation}。有別於 {@link InitializeParams.clientId | clientId}, 後者是每個連線用於重新連線的不透明識別碼,而非人類可讀的實作名稱。
initialSubscriptionsURI[]握手期間要訂閱的 URI
localestringIETF 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編碼為字串的內容
encodingContentEncodingdata 的編碼方式
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編碼為字串的內容
encodingContentEncodingdata 的編碼方式
contentTypestring內容類型(例如 "text/plain""image/png"
createOnlyboolean若為 true,當檔案已存在時伺服器 MUST 失敗,而非覆寫它。適用於安全地 建立新檔案。
modeResourceWriteModedata 在目標檔案中的放置方式。省略時預設為 '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* 指令(例如 resourceReadresourceWrite)來執行該操作。接收端 MAY 隨時撤銷存取權,只需 在後續操作中回傳 PermissionDenied

readwrite 或兩者 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 的 statrealpath

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。當 followSymlinksfalse 或該 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.resourceToolCallAuthRequiredState.auth.resource 動態發現(後兩者僅在對應的 MCP 伺服器或工具呼叫實際挑戰驗證時才會浮現)。 伺服器 MUST 接受其透過這三種機制之一所自行宣佈的任何 resource 值。

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

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

參數:

欄位類型必要說明
channel'ahp-root://'
resourcestring受保護資源識別碼。MUST 符合伺服器已宣佈的 resource 值 — 透過 AgentInfo.protectedResources 中的 ProtectedResourceMetadata,或是透過 即時的 McpServerAuthRequiredState.resourceToolCallAuthRequiredState.auth.resource
tokenstring從資源的授權伺服器取得的
scopesstring[]令牌所授予的 OAuth 範圍(已知時)。讓伺服器能判斷某個特定挑戰 — 例如即時 McpServerAuthRequiredStateToolCallAuthRequiredState.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 訊息形狀,以及驅動判別聯集包裝器的具型別登錄檔(AhpRequestAhpResponseAhpClientNotificationAhpServerNotificationAhpNotificationProtocolMessage)。

JsonRpcRequest

JSON-RPC 請求:同時具有 methodid

欄位類型必要說明
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 應用錯誤,且希望 datacode 縮窄時,此型別相當實用。

欄位類型說明
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})
  • 帶有 resulterror + 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 授權發布。