@zktx.io/sui-mcp 0.6.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +94 -52
  2. package/dist/adapters/adapterPromptSurfaces.js +1 -1
  3. package/dist/core/activity/localDataService.js +8 -21
  4. package/dist/core/activity/localDataValidation.js +22 -46
  5. package/dist/core/activity/sqliteAccountStore.js +46 -0
  6. package/dist/core/activity/sqliteActivityStore.js +65 -147
  7. package/dist/core/activity/sqliteActivityStoreSchema.js +42 -26
  8. package/dist/core/activity/transactionActivityService.js +2 -2
  9. package/dist/core/preferences/preferencesStore.js +2 -2
  10. package/dist/core/preferences/sqlitePreferencesRepository.js +10 -0
  11. package/dist/core/read/deepbookReadHelpers.js +1 -1
  12. package/dist/core/read/readResponseGuidance.js +6 -6
  13. package/dist/core/session/cardResult.js +41 -0
  14. package/dist/core/session/cardSession.js +1 -1
  15. package/dist/core/session/cardSessionStore.js +51 -19
  16. package/dist/core/session/chainAccounts.js +120 -0
  17. package/dist/core/session/sessionStore.js +4 -8
  18. package/dist/core/session/settingsFileProtocol.js +1 -1
  19. package/dist/core/session/settingsFileStore.js +3 -30
  20. package/dist/core/session/settingsOperation.js +27 -19
  21. package/dist/core/session/settingsWorkflow.js +161 -87
  22. package/dist/core/session/sqliteCardStore.js +34 -14
  23. package/dist/core/session/sqliteSessionStore.js +5 -5
  24. package/dist/core/session/sqliteSettingsWorkflowStore.js +135 -41
  25. package/dist/core/session/sqliteTransactionRequest.js +18 -0
  26. package/dist/core/session/sqliteWalletConnectionOperation.js +13 -0
  27. package/dist/core/session/sqliteWalletWorkflowStore.js +569 -333
  28. package/dist/core/session/status.js +2 -2
  29. package/dist/core/session/wait.js +6 -11
  30. package/dist/core/session/walletConnection.js +71 -46
  31. package/dist/core/session/walletConnectionOperations.js +24 -0
  32. package/dist/core/session/walletRuntime.js +7 -13
  33. package/dist/core/session/walletWorkflow.js +248 -99
  34. package/dist/core/session/workflowState.js +104 -38
  35. package/dist/core/session/workflowView.js +92 -101
  36. package/dist/mcp/activeAccountResponse.js +3 -0
  37. package/dist/mcp/prompts.js +10 -4
  38. package/dist/mcp/resources.js +1 -1
  39. package/dist/mcp/responseGuidance.js +7 -9
  40. package/dist/mcp/server.js +2 -2
  41. package/dist/mcp/serverInfo.js +21 -19
  42. package/dist/mcp/toolErrors.js +5 -3
  43. package/dist/mcp/toolNames.js +47 -46
  44. package/dist/mcp/tools/action/prepareSuiActionReview.js +13 -20
  45. package/dist/mcp/tools/read/deepbookReadTools.js +1 -1
  46. package/dist/mcp/tools/read/index.js +2 -2
  47. package/dist/mcp/tools/read/readToolHelpers.js +9 -7
  48. package/dist/mcp/tools/read/serverStatusTools.js +4 -5
  49. package/dist/mcp/tools/read/transactionActivityTools.js +3 -3
  50. package/dist/mcp/tools/session/executionResultTools.js +2 -2
  51. package/dist/mcp/tools/session/shared.js +2 -2
  52. package/dist/mcp/tools/session/statusTools.js +12 -10
  53. package/dist/mcp/tools/session/walletConnectionTools.js +29 -17
  54. package/dist/mcp/tools/settings/index.js +7 -4
  55. package/dist/mcp-app/account.html +7 -7
  56. package/dist/mcp-app/chart.html +3 -3
  57. package/dist/mcp-app/connect.html +13 -13
  58. package/dist/mcp-app/disconnect.html +3637 -0
  59. package/dist/mcp-app/disconnect.notices.txt +1480 -0
  60. package/dist/mcp-app/receipt.html +393 -393
  61. package/dist/mcp-app/review.html +459 -459
  62. package/dist/mcp-app/settings.html +7 -7
  63. package/dist/mcp-ui/contracts.js +3 -1
  64. package/dist/mcp-ui/tools.js +4 -4
  65. package/dist/runtime/application.js +3 -3
  66. package/dist/runtime/config.js +3 -6
  67. package/dist/runtime/localSettingsService.js +11 -8
  68. package/dist/runtime/shared/control.js +2 -2
  69. package/dist/runtime/smokeMainnetRead.js +23 -22
  70. package/dist/runtime/smokeReview.js +7 -7
  71. package/dist/runtime/start.js +1 -1
  72. package/dist/runtime/walletConnectTransport.js +16 -16
  73. package/dist/runtime/walletSdkChildRuntime.js +29 -12
  74. package/dist/runtime/walletSdkIpc.js +5 -4
  75. package/dist/runtime/walletSdkProcess.js +24 -8
  76. package/docs/AGENT_BEHAVIOR.md +149 -120
  77. package/docs/LOCAL_DB_ARCHITECTURE.md +103 -75
  78. package/docs/MCP_SETUP.md +365 -382
  79. package/docs/MCP_TOOLS.md +387 -271
  80. package/docs/SDK_API.md +23 -11
  81. package/docs/SIGNABLE_ADAPTER_CONTRACT.md +6 -6
  82. package/docs/TRANSACTION_ACTIVITY_LOG.md +11 -7
  83. package/docs/UTILITY_INDEX.md +66 -64
  84. package/docs/WALLET_CONNECTION.md +162 -166
  85. package/package.json +1 -1
  86. package/protocols/deepbook-margin.md +1 -1
  87. package/protocols/deepbook-v3.md +2 -2
package/docs/MCP_TOOLS.md CHANGED
@@ -6,7 +6,7 @@ This document is the MCP API reference. It owns tool contracts, response fields,
6
6
 
7
7
  It does not own installation steps or user-question playbooks. Installation and client setup live in `docs/MCP_SETUP.md`. User-question flows and response wording live in `docs/AGENT_BEHAVIOR.md`.
8
8
 
9
- Tool names use dot prefixes and avoid arbitrary shell, arbitrary Move calls, and private-key handling.
9
+ Tool names use `domain_verb_object`. A name does not grant authority; input schemas, card visibility and scoped permission checks define the allowed effects. Tools do not expose arbitrary shell commands, arbitrary Move calls or private-key handling.
10
10
 
11
11
  The local stdio gateway forwards each request through authenticated internal
12
12
  HTTP. A request body must fit within 4 MiB, including the entire MCP JSON-RPC
@@ -37,38 +37,38 @@ not grant input permission; a saved card is read through its bound resource.
37
37
 
38
38
  | Tool | Status | Purpose |
39
39
  | --- | --- | --- |
40
- | `read.get_server_status` | Implemented | Returns package, version, evidence policy, network, runtime, `implementedToolsCount`, resources, prompts, and tool implementation status. |
41
- | `read.list_supported_protocols` | Implemented | Lists current mainnet protocol surfaces and support levels. |
42
- | `read.list_deepbook_pools` | Implemented | Lists DeepBook mainnet pools from pinned `@mysten/deepbook-v3` constants. |
43
- | `read.list_deepbook_tokens` | Implemented | Lists DeepBook mainnet tokens from pinned `@mysten/deepbook-v3` constants. |
44
- | `read.inspect_deepbook_orderbook` | Implemented | Uses pinned DeepBook SDK read methods over Sui gRPC simulation reads with an internal sender placeholder; `ticks` is capped at 50. |
45
- | `read.get_deepbook_mid_price` | Implemented | Returns a DeepBook pool mid price snapshot from pinned SDK simulation reads. |
46
- | `read.get_deepbook_usdc_price_history` | Implemented | Returns DeepBookV3 official Indexer USDC candle evidence for a requested official interval. |
47
- | `read.get_deepbook_usdc_price_at_time` | Implemented | Returns the DeepBookV3 official Indexer USDC candle for or nearest to one target UTC time. |
48
- | `read.quote_deepbook_action` | Implemented | Quotes raw integer DeepBook quantities through pinned SDK transaction builders and raw `u64` simulation return values with an internal sender placeholder. |
49
- | `read.quote_deepbook_display_amount` | Implemented | Converts an explicit display source amount through pinned DeepBook token units, then returns scoped display quote facts plus raw quote evidence. |
50
- | `read.summarize_deepbook_account_inventory` | Implemented | Summarizes active-account DeepBook BalanceManager inventory through pinned SDK simulation reads. |
51
- | `read.summarize_wallet_assets` | Implemented | Reads coin balances for an explicit address or the active account through Sui gRPC `client.core.listBalances`; accepts `cursor` for pagination. |
52
- | `read.classify_wallet_assets` | Implemented | Classifies coin balances for an explicit address or the active account by balanceStatus and coin-balance roles; accepts `cursor` for pagination. |
53
- | `read.list_settlement_asset_groups` | Implemented | Lists supported settlement asset groups derived from pinned mainnet SDK registries. |
54
- | `read.summarize_settlement_asset_group_parity` | Implemented | Summarizes direct DeepBook mid-price parity across a supported settlement asset group against a declared measurement reference. |
55
- | `read.preview_intent_evidence` | Implemented | Builds current wallet and DeepBook evidence for a natural-language settlement intent; not transaction building or signing. |
56
- | `read.list_review_activity` | Implemented | Lists local Sui MCP review evidence for one account. |
57
- | `read.summarize_review_funnel` | Implemented | Summarizes local review lifecycle counts, status distribution, and review timing. |
58
- | `read.get_review_session_detail` | Implemented | Returns stored local evidence for one Sui MCP review session. |
59
- | `read.inspect_sui_transaction` | Implemented | Looks up one Sui transaction digest and stores normalized facts only when the transaction sender or a returned balance-change owner matches a known local wallet. |
60
- | `read.scan_sui_account_activity` | Implemented | Runs a bounded GraphQL activity scan for a known or explicit Sui account. |
61
- | `read.summarize_sui_activity_scan` | Implemented | Runs a bounded Sui activity scan and returns requested-account facts plus deterministic normalized-fact analysis without full details. |
62
- | `read.scan_sui_function_activity` | Implemented | Runs a bounded GraphQL scan for transactions the account sent that called one full `package::module::function`. |
63
- | `read.summarize_sui_function_activity_scan` | Implemented | Runs the sent-function activity scan and returns requested-account facts plus deterministic normalized-fact analysis without full details. |
64
- | `read.summarize_sui_account_activity` | Implemented | Summarizes stored normalized Sui activity facts from local SQLite. |
65
- | `read.get_account_asset_timeline` | Implemented | Builds stored local account asset net-flow bars from normalized activity facts and optional DeepBook USDC token-denominated candle references. Not held balances or complete wallet history. |
40
+ | `read_get_server_status` | Implemented | Returns package, version, evidence policy, network, runtime, `implementedToolsCount`, resources, prompts, and tool implementation status. |
41
+ | `read_list_supported_protocols` | Implemented | Lists current mainnet protocol surfaces and support levels. |
42
+ | `read_list_deepbook_pools` | Implemented | Lists DeepBook mainnet pools from pinned `@mysten/deepbook-v3` constants. |
43
+ | `read_list_deepbook_tokens` | Implemented | Lists DeepBook mainnet tokens from pinned `@mysten/deepbook-v3` constants. |
44
+ | `read_inspect_deepbook_orderbook` | Implemented | Uses pinned DeepBook SDK read methods over Sui gRPC simulation reads with an internal sender placeholder; `ticks` is capped at 50. |
45
+ | `read_get_deepbook_mid_price` | Implemented | Returns a DeepBook pool mid price snapshot from pinned SDK simulation reads. |
46
+ | `read_get_deepbook_usdc_price_history` | Implemented | Returns DeepBookV3 official Indexer USDC candle evidence for a requested official interval. |
47
+ | `read_get_deepbook_usdc_price_at_time` | Implemented | Returns the DeepBookV3 official Indexer USDC candle for or nearest to one target UTC time. |
48
+ | `read_quote_deepbook_action` | Implemented | Quotes raw integer DeepBook quantities through pinned SDK transaction builders and raw `u64` simulation return values with an internal sender placeholder. |
49
+ | `read_quote_deepbook_display_amount` | Implemented | Converts an explicit display source amount through pinned DeepBook token units, then returns scoped display quote facts plus raw quote evidence. |
50
+ | `read_summarize_deepbook_account_inventory` | Implemented | Summarizes active-account DeepBook BalanceManager inventory through pinned SDK simulation reads. |
51
+ | `read_summarize_wallet_assets` | Implemented | Reads coin balances for an explicit address or the active account through Sui gRPC `client.core.listBalances`; accepts `cursor` for pagination. |
52
+ | `read_classify_wallet_assets` | Implemented | Classifies coin balances for an explicit address or the active account by balanceStatus and coin-balance roles; accepts `cursor` for pagination. |
53
+ | `read_list_settlement_asset_groups` | Implemented | Lists supported settlement asset groups derived from pinned mainnet SDK registries. |
54
+ | `read_summarize_settlement_asset_group_parity` | Implemented | Summarizes direct DeepBook mid-price parity across a supported settlement asset group against a declared measurement reference. |
55
+ | `read_preview_intent_evidence` | Implemented | Builds current wallet and DeepBook evidence for a natural-language settlement intent; not transaction building or signing. |
56
+ | `read_list_review_activity` | Implemented | Lists local Sui MCP review evidence for one account. |
57
+ | `read_summarize_review_funnel` | Implemented | Summarizes local review lifecycle counts, status distribution, and review timing. |
58
+ | `read_get_review_session_detail` | Implemented | Returns stored local evidence for one Sui MCP review session. |
59
+ | `read_inspect_sui_transaction` | Implemented | Looks up one Sui transaction digest and stores normalized facts only when the transaction sender or a returned balance-change owner matches a known local wallet. |
60
+ | `read_scan_sui_account_activity` | Implemented | Runs a bounded GraphQL activity scan for a known or explicit Sui account. |
61
+ | `read_summarize_sui_activity_scan` | Implemented | Runs a bounded Sui activity scan and returns requested-account facts plus deterministic normalized-fact analysis without full details. |
62
+ | `read_scan_sui_function_activity` | Implemented | Runs a bounded GraphQL scan for transactions the account sent that called one full `package::module::function`. |
63
+ | `read_summarize_sui_function_activity_scan` | Implemented | Runs the sent-function activity scan and returns requested-account facts plus deterministic normalized-fact analysis without full details. |
64
+ | `read_summarize_sui_account_activity` | Implemented | Summarizes stored normalized Sui activity facts from local SQLite. |
65
+ | `read_get_account_asset_timeline` | Implemented | Builds stored local account asset net-flow bars from normalized activity facts and optional DeepBook USDC token-denominated candle references. Not held balances or complete wallet history. |
66
66
 
67
67
  Read-only tools split by address requirement.
68
68
 
69
69
  Address-free reads do not need wallet connection. Examples include DeepBook pool lists, orderbook snapshots, mid price, and quote facts.
70
70
 
71
- Current asset reads need either an explicit public Sui address supplied by the user or a selected account with a usable current wallet connection. Stored activity and transaction-result reads retain their own read-context rules.
71
+ Current asset reads need either an explicit public Sui address supplied by the user or the saved Sui read address with a usable current wallet connection. Stored activity and transaction-result reads retain their own read-context rules.
72
72
 
73
73
  An explicit public-address read does not prove ownership, create active account context, or authorize active-account-only tools.
74
74
 
@@ -112,15 +112,15 @@ Token list entries are keyed by SDK symbol and include the pool keys that refere
112
112
 
113
113
  Token entries include `decimals` derived only from pinned `mainnetCoins.scalar` when every scalar is a power of ten. If that invariant fails, the token registry tool fails closed instead of guessing.
114
114
 
115
- `read.get_deepbook_mid_price` returns `priceDirection: "quote_per_base"`, so a `SUI_USDC` result is USDC per SUI.
115
+ `read_get_deepbook_mid_price` returns `priceDirection: "quote_per_base"`, so a `SUI_USDC` result is USDC per SUI.
116
116
 
117
117
  The price is the pinned SDK `midPrice` result with `source.precision: "deepbook_v3_to_fixed_9_js_number"`.
118
118
 
119
119
  The response includes `priceSemantics` and `userAnswerUse.cannotAnswer` for unsupported conclusions. It is a DeepBook pool snapshot, not a global market price, fiat USD cash-out estimate, external market-price conversion, USDC/USD peg assumption, quote-vs-mid slippage calculation, effective quote price, price-impact calculation, venue comparison, best-route claim, route recommendation, transaction-building input, signing data, signing readiness, P&L, or cost basis.
120
120
 
121
- If the SDK returns a non-positive or non-finite mid price, both `read.get_deepbook_mid_price` and `read.inspect_deepbook_orderbook` fail closed with `quote_unavailable`.
121
+ If the SDK returns a non-positive or non-finite mid price, both `read_get_deepbook_mid_price` and `read_inspect_deepbook_orderbook` fail closed with `quote_unavailable`.
122
122
 
123
- `read.get_deepbook_usdc_price_history` returns DeepBookV3 official Indexer USDC candle evidence for a requested official interval.
123
+ `read_get_deepbook_usdc_price_history` returns DeepBookV3 official Indexer USDC candle evidence for a requested official interval.
124
124
 
125
125
  Inputs require `start` and `end` as canonical ISO 8601 UTC timestamps and exactly one selector: `poolName`, `assetSymbol`, or `coinType`. Optional `interval` accepts only official Indexer interval values and defaults to `15m`.
126
126
 
@@ -148,7 +148,7 @@ USDC in this tool is the token-denominated quote asset for the returned official
148
148
 
149
149
  This output is not a live quote, execution price, historical mid price, global market price, fiat USD cash-out estimate, external market-price conversion, USDC/USD peg assumption, route recommendation, best route, transaction-building input, signing data, signing readiness, P&L, tax evidence, cost basis, user-account transaction history, or user-account balance history.
150
150
 
151
- `read.get_deepbook_usdc_price_at_time` uses the same official Indexer candle source and selector rules, but accepts one `targetTime` instead of a range. Optional `interval` defaults to `15m`. Optional `maxDistanceMinutes` limits how far from the target time the tool may select a candle.
151
+ `read_get_deepbook_usdc_price_at_time` uses the same official Indexer candle source and selector rules, but accepts one `targetTime` instead of a range. Optional `interval` defaults to `15m`. Optional `maxDistanceMinutes` limits how far from the target time the tool may select a candle.
152
152
 
153
153
  Successful at-time responses return:
154
154
 
@@ -162,21 +162,21 @@ Successful at-time responses return:
162
162
 
163
163
  `status: "no_price_in_search_window"` means no official Indexer candle was available inside the bounded search window. The tool does not synthesize a price, interpolate, carry forward a previous candle outside the search window, or perform an on-demand chain-history scan.
164
164
 
165
- Internal read cards are opened with `ui.open_account`, `ui.open_receipt`, and `ui.open_chart`. They require a client that provides MCP Apps. A client without that UI receives `ui_unavailable`; ordinary MCP read tools remain available.
165
+ Internal read cards are opened with `ui_open_account`, `ui_open_receipt`, and `ui_open_chart`. They require a client that provides MCP Apps. A client without that UI receives `ui_unavailable`; ordinary MCP read tools remain available.
166
166
 
167
167
  | Tool | Input and result |
168
168
  | --- | --- |
169
- | `ui.open_account` | Optional explicit Sui address; otherwise use the selected read account only when its wallet connection is currently usable. Missing input returns `input_required` with no card or source query. Shows name, address, coin totals, Display NFTs, other-object count, fetched time and enumeration limits; no address form. |
170
- | `ui.open_receipt` | A transaction digest is required for a query. Omission returns `input_required` with no card or source query. The result view shows execution outcome, balance changes, net gas, sender, digest and fetched time; no hash form. No wallet or active account is needed. Normalized receipt evidence and private display metadata remain available under their existing boundaries. |
171
- | `ui.open_chart` | Optional `poolName`, official Indexer interval, UTC `startTimeMs`/`endTimeMs`, and candle `limit`. Shows one selected USDC pool as candlesticks and volume. Range shortcuts fill these query fields. The initial time axis uses the saved request boundaries, with price-free whitespace at boundaries without candles; omitted boundaries use the returned data. |
169
+ | `ui_open_account` | Optional explicit Sui address; otherwise use the saved Sui read address only when its wallet connection is currently usable. Missing input returns `input_required` with no card or source query. Shows name, address, coin totals, Display NFTs, other-object count, fetched time and enumeration limits; no address form. |
170
+ | `ui_open_receipt` | A transaction digest is required for a query. Omission returns `input_required` with no card or source query. The result view shows execution outcome, balance changes, net gas, sender, digest and fetched time; no hash form. No wallet or active account is needed. Normalized receipt evidence and private display metadata remain available under their existing boundaries. |
171
+ | `ui_open_chart` | Optional `poolName`, official Indexer interval, UTC `startTimeMs`/`endTimeMs`, and candle `limit`. Shows one selected USDC pool as candlesticks and volume. Range shortcuts fill these query fields. The initial time axis uses the saved request boundaries, with price-free whitespace at boundaries without candles; omitted boundaries use the returned data. |
172
172
 
173
173
  A missing Account/Receipt target returns `data: { kind, status: "input_required", field, message }`, with no permission, card ID, saved resource or query. A host-rendered view shows the message without input controls or polling. Other errors remain errors.
174
174
 
175
- A successful card-creating response contains a `cardId`, `kind`, `state`, `revision`, timestamps, original `input`, and available `data`. `inputRemainingMs` is computed by the backend; `pollAfterMs` controls sequential observation of a running read. Card `ready` permits a read selection, not signing or payment readiness. An initial supplied input uses the same admission path as a form submission. DB states are `ready`, `running`, and `closed`, with terminal reasons `completed`, `expired`, `failed`, or `server_restarted`.
175
+ A successful card-creating response contains a `cardId`, `kind`, `state`, `revision`, timestamps, original `input`, and available `data`. `inputRemainingMs` is computed by the backend; `pollAfterMs` controls sequential observation of a running read. Card `ready` permits a read selection, not signing or payment readiness. An initial supplied input uses the same admission path as a form submission. DB states are `ready`, `running`, and `closed`, with terminal reasons `completed`, `expired`, `failed`, `server_restarted`, or `cancelled`.
176
176
 
177
177
  When Chart pool choices cannot be prepared, the backend creates a `closed`/`failed` card with a readable error. No selection is admitted and no candles are requested. Reading that card again returns the stored failure; retrying the source requires an explicit request for a new card. A database access or write failure is a tool error, not a successfully stored failure card.
178
178
 
179
- `ui.read_card` and `ui.submit_card` are app-only operations. Permission travels in UI metadata and is absent from model content and public saved resources. Input submission carries card ID, permission, expected revision and typed input. There is no first-view ownership or open/close operation. Recreated frames and chat returns read the same DB record. Identical duplicate input returns the stored request; conflicting input returns `card_conflict` and the authenticated current snapshot in error details. Invalid input returns `invalid_card_input` without consuming a valid selection. Invalid permission exposes neither current state nor private display data.
179
+ `ui_read_card` and `ui_submit_card` are app-only operations. Permission travels in UI metadata and is absent from model content and public saved resources. Input submission carries card ID, permission, expected revision and typed input. There is no first-view ownership or open/close operation. Recreated frames and chat returns read the same DB record. Identical duplicate input returns the stored request; conflicting input returns `card_conflict` and the authenticated current snapshot in error details. Invalid input returns `invalid_card_input` without consuming a valid selection. Invalid permission exposes neither current state nor private display data.
180
180
 
181
181
  Receipt model results retain input kinds/indices/object references and identify input values and PTB as UI-only details. Receipt and completed Review show the executed transaction graph above their result summary when bound private metadata is available. Technical records are in one Details slide. Missing metadata leaves the saved result available without inventing a graph. The typed `sui-mcp/receipt-display` metadata binds display data to the same card ID, transaction digest and revision. It carries individual on-chain Pure input values and the graph derived from those inputs; never a serialized transaction, signature or wallet credential. Public saved resources contain only the model projection. A missing UI detail payload means unavailable display data, not that a transaction had no inputs.
182
182
 
@@ -210,8 +210,8 @@ current instruction or proof that a cancellation succeeded.
210
210
  A failed Request delivery never triggers a repeated signature request. Same-card
211
211
  reads still follow the existing expiry hints; a confirmed unadmitted stale review
212
212
  may prepare new conditions, which require a new Request click. Failed initial
213
- preparation can be retried for the displayed current wallet/account after another
214
- state check. A delayed action response does not clear an intervening read failure:
213
+ preparation can be retried for the Review's original wallet/account after another
214
+ state check, while that exact connection remains usable. A delayed action response does not clear an intervening read failure:
215
215
  the card retains explicit state-read recovery until a current read succeeds.
216
216
 
217
217
  Overlapping successful responses for the same card may arrive out of order.
@@ -219,7 +219,7 @@ A lower revision does not replace displayed facts or create a read error, and
219
219
  required observations continue from the retained current state. Equal revisions
220
220
  are validated rather than discarded. Actual error responses remain failures.
221
221
 
222
- An unconfirmed Cancel review, wallet disconnection, account selection or stop
222
+ An unconfirmed Cancel review, wallet disconnection or stop
223
223
  request retains its error and pauses new automatic preparation/pairing in that
224
224
  View. State reads still report already admitted work. Existing permitted actions
225
225
  can be retried explicitly. An unconfirmed Cancel review followed by expired
@@ -231,12 +231,12 @@ pause does not claim that the backend or other frames stopped; new frames use
231
231
  the actual saved state.
232
232
 
233
233
  Connect eligibility and its SQLite admission use the same current-owner
234
- connection set. An unexpired connected wallet, pending approval or pending disconnection
234
+ connection and SDK observation. An unexpired connected wallet, pending approval or pending disconnection
235
235
  removes `connect` from `allowedActions` and prevents a second pairing even when
236
236
  different cards race with current revisions. The losing card gets the existing
237
- conflict response and its own snapshot, without another card's private QR or
238
- permission. Later availability requires an explicit Retry for that failed
239
- attempt; a saved-state read does not repeat it.
237
+ fixed no-request result, without another card's private QR or permission. It ends
238
+ without pairing; later availability requires a new prompted Connect card. A saved
239
+ result read cannot reopen it.
240
240
 
241
241
  Failed attempts whose exact target or command authority has ended are shown as
242
242
  earlier attempts, without a command retry or a saved-read button solely for that
@@ -244,12 +244,14 @@ old failure. The current stored result remains authoritative; natural completion
244
244
  is not proof that an earlier stop was accepted. This includes failed automatic
245
245
  connection/preparation and an unadmitted Request when its card or review expires.
246
246
  Card action expiry does not end an already admitted request or result lookup.
247
- For unadmitted disconnection or account selection, the exact target in
248
- `connections` can establish that the earlier attempt has ended even while the
249
- card input remains available. An account returning later does not revive that
250
- attempt or clear its local automatic pause; the user can make a new selection.
251
- If an unknown result needs another lookup after the card's action period, request
252
- `session.open_review_management` with the same `reviewSessionId` and `attemptId`.
247
+ For an unadmitted disconnection, compare the attempted connection ID with the
248
+ current `connection` and confirmed SDK facts. A replacement connection cannot
249
+ be the target of that earlier attempt. Missing or unavailable observations alone
250
+ do not establish termination. A later state change does not revive the attempt
251
+ or clear its local automatic pause. A dedicated Disconnect card remains limited
252
+ to its original connection; a new purpose card is required for an operation on the current connection.
253
+ Once a result card has ended, request another lookup when needed through
254
+ `session_open_review_management` with the same `reviewSessionId` and `attemptId`.
253
255
  It adds no signing authority and does not repeat the transaction.
254
256
 
255
257
  A confirmation that joins an older in-flight read retains its obligation. After
@@ -258,25 +260,25 @@ an actual read failure instead requires explicit recovery. A valid current read
258
260
  also clears an identified card's earlier opening-projection error. Neither path
259
261
  repairs malformed permissions or changes the card's target.
260
262
 
261
- Review displays one current wallet candidate without a dropdown. Its current authenticated View executes the backend-projected `automaticAction` to prepare or renew stale verified conditions. Multiple valid connections block preparation and signing until the user resolves them with targeted Disconnect actions. A failed computation requires explicit retry. `review_evidence_stale` distinguishes invalidated verified material from a failed quote/computation. Only Request wallet approval authorizes a signature request for the displayed revision. Result cards show the correct PTB, actual chain facts and one Details slide; Review keeps earlier estimates in its Reviewed conditions section.
263
+ Review displays its exact account and wallet connection without a dropdown. Its current authenticated View executes the backend-projected `automaticAction` to prepare or renew stale verified conditions. A new Review uses the one current fixed Sui account and connection. Its public input has no account/connection selector. Disconnecting requires a new Review for the replacement connection. A failed computation requires explicit retry. `review_evidence_stale` distinguishes invalidated verified material from a failed quote/computation. Only Request wallet approval authorizes a signature request for the displayed revision. Result cards show the correct PTB, actual chain facts and one Details slide; Review keeps earlier estimates in its Reviewed conditions section.
262
264
 
263
265
  Cards provide no clipboard actions or copy buttons. Their text remains readable and selectable. Chart values remain USDC-denominated source candles, not fiat USD, peg guarantees, route advice, portfolio valuation or P&L. Cards do not fetch chain/Indexer endpoints directly or poll completed results.
264
266
 
265
267
 
266
- `read.quote_deepbook_action` and `read.quote_deepbook_display_amount` use the pinned DeepBook transaction builder quote functions.
268
+ `read_quote_deepbook_action` and `read_quote_deepbook_display_amount` use the pinned DeepBook transaction builder quote functions.
267
269
 
268
270
  Input kinds:
269
271
 
270
- - `read.quote_deepbook_action`: `quantitySemantics.inputAmountKind: "raw_u64"`.
271
- - `read.quote_deepbook_display_amount`: `inputAmountKind: "display_source_amount_converted_to_raw_u64"`.
272
+ - `read_quote_deepbook_action`: `quantitySemantics.inputAmountKind: "raw_u64"`.
273
+ - `read_quote_deepbook_display_amount`: `inputAmountKind: "display_source_amount_converted_to_raw_u64"`.
272
274
 
273
275
  Quote responses include `quantitySemantics` before the public quote values. The same response also includes `userAnswerUse.cannotAnswer` for unsupported conclusions such as payment coverage, shortfall contribution, route-dependent payment support, fiat USD cash-out, external market conversion or lookup, USDC/USD peg assumptions, P&L, cost basis, price impact, mid-price slippage, venue comparison, and route recommendation.
274
276
 
275
277
  `canUseForPaymentAnswer: false`, `canUseForShortfallAnswer: false`, `doNotCombineWithPaymentAnswer: true`, and `paymentAnswerUseBlockedReason` mean quote output is a price estimate only. Do not add it to the payment amount, coverage status, or shortfall amount in a user answer.
276
278
 
277
- `requiredPaymentAnswerTool: "read.preview_intent_evidence"` and `requiredPaymentAnswerField: "responseSummary"` identify the tool and field to use for payment amount and shortfall answers.
279
+ `requiredPaymentAnswerTool: "read_preview_intent_evidence"` and `requiredPaymentAnswerField: "responseSummary"` identify the tool and field to use for payment amount and shortfall answers.
278
280
 
279
- The same response-local rule is also exposed as `userAnswerUse.followUp.tool: "read.preview_intent_evidence"` and `userAnswerUse.followUp.answerFields: ["responseSummary"]`.
281
+ The same response-local rule is also exposed as `userAnswerUse.followUp.tool: "read_preview_intent_evidence"` and `userAnswerUse.followUp.answerFields: ["responseSummary"]`.
280
282
 
281
283
  Raw quote source:
282
284
 
@@ -287,7 +289,7 @@ Raw quote source:
287
289
 
288
290
  Returned raw fields are quote evidence only. They are not final min-out values, effective prices, price-impact calculations, venue comparisons, best-route claims, transaction-building inputs, signing data, or signing readiness.
289
291
 
290
- `read.quote_deepbook_display_amount` accepts `amountDisplay` as the source coin input amount for the requested `direction`.
292
+ `read_quote_deepbook_display_amount` accepts `amountDisplay` as the source coin input amount for the requested `direction`.
291
293
 
292
294
  It does not accept output target amounts or inverse quote requests.
293
295
 
@@ -310,7 +312,7 @@ This quote is not a settlement asset choice.
310
312
 
311
313
  ### DeepBook account inventory
312
314
 
313
- `read.summarize_deepbook_account_inventory` uses the selected account only when its current wallet connection is usable, to discover DeepBook BalanceManager addresses. It has no explicit public-address input. Without a usable default, a missing selection returns `active_account_not_set`, and a stored but ineligible selection returns `input_invalid`; both carry `details.reason: "connected_account_required"` and `details.followUp` naming `session.get_interaction_status` and its connection/availability/pending/default-account fields. These responses do not request an address. Unavailable wallet operations return `wallet_unavailable` with the existing safe reason and recovery message.
315
+ `read_summarize_deepbook_account_inventory` uses the saved Sui read address only when its current wallet connection is usable, to discover DeepBook BalanceManager addresses. It has no explicit public-address input. A missing or cleared read address returns `active_account_not_set`; a stored but ineligible address returns `input_invalid`. Both carry `details.reason: "connected_account_required"` and `details.followUp` naming `session_get_interaction_status` and its wallet availability, current connection, pending operations and `assetReadAccount`. A cleared read address is reported separately from disconnection and cannot be bypassed with a typed address. These responses do not request an address. Unavailable wallet operations return `wallet_unavailable` with the existing safe reason and recovery message.
314
316
 
315
317
  With both `poolKey` and `managerAddress`, it checks pool account existence and returns display-like account inventory:
316
318
 
@@ -332,9 +334,9 @@ Returned `quantitySemantics.kind: "deepbook_display_number"` means these `number
332
334
 
333
335
  They are not raw balances, route liquidity, funding sources, withdrawal readiness, transaction-building inputs, signing data, or signing readiness.
334
336
 
335
- `read.summarize_wallet_assets` accepts an optional `account` input for public-address coin balance snapshots.
337
+ `read_summarize_wallet_assets` accepts an optional `account` input for public-address coin balance snapshots.
336
338
 
337
- When `account` is omitted, it uses the same connection-qualified default as `session.get_interaction_status.assetReadAccount`. No stored selection returns `active_account_not_set` with `details.action: "provide_account"`; a stored but ineligible selection returns `input_invalid` with `details.reason: "address_required"`. Both request an explicit address. SDK unavailability is not reported as absence of a stored account.
339
+ When `account` is omitted, it uses the same connection-qualified read address as `session_get_interaction_status.assetReadAccount`. A missing or cleared read address returns `active_account_not_set` with `details.action: "provide_account"`; a stored but ineligible address returns `input_invalid` with `details.reason: "address_required"`. Both request an explicit address. SDK unavailability is not reported as absence of a stored account.
338
340
 
339
341
  An explicit `account` read does not prove ownership, store the address as a known wallet, or create active account context.
340
342
 
@@ -356,7 +358,7 @@ If Sui metadata is unavailable, DeepBook-registered tokens can use pinned scalar
356
358
 
357
359
  If no verified decimals exist, `unit.status` is `unavailable` and clients must not infer decimals from the token symbol.
358
360
 
359
- `read.classify_wallet_assets` reuses the same explicit-address or active-account balance, unit, display, metadata cache behavior, and wallet snapshot quantity semantics as `read.summarize_wallet_assets`.
361
+ `read_classify_wallet_assets` reuses the same explicit-address or active-account balance, unit, display, metadata cache behavior, and wallet snapshot quantity semantics as `read_summarize_wallet_assets`.
360
362
 
361
363
  It wraps each coin balance in `classification.assetClass: "coin_balance"`, `classification.balanceStatus`, and role labels such as `gas_candidate` or `deepbook_registered`.
362
364
 
@@ -372,7 +374,7 @@ It also would not make them route liquidity, payment readiness, portfolio comple
372
374
 
373
375
  The classifier does not create funding plans, choose routes, create review sessions, return transaction bytes, or produce signing material.
374
376
 
375
- `read.list_settlement_asset_groups` returns the supported natural-language settlement asset groups.
377
+ `read_list_settlement_asset_groups` returns the supported natural-language settlement asset groups.
376
378
 
377
379
  In this release, `SUI_USD_SETTLEMENT_ASSETS` maps aliases such as dollar, dollars, USD, USD-like, stablecoin, stablecoins, and Korean dollar-word wording.
378
380
 
@@ -382,7 +384,7 @@ The asset group output includes included assets, excluded assets, source authori
382
384
 
383
385
  This is static SDK registry evidence, not live liquidity, fiat USD support, payment execution, route recommendation, or signing readiness.
384
386
 
385
- `read.summarize_settlement_asset_group_parity` returns internal parity evidence for a supported settlement asset group.
387
+ `read_summarize_settlement_asset_group_parity` returns internal parity evidence for a supported settlement asset group.
386
388
 
387
389
  In this release it measures USD-denominated group assets against a declared reference asset. The default reference is USDC, but only as `measurement_reference_not_settlement_choice`.
388
390
 
@@ -398,19 +400,19 @@ Use `responseSummary` for questions about internal USD-denominated parity, highe
398
400
 
399
401
  This tool is not settlement-token choice, fiat USD cash-out, external market lookup, USDC/USD peg assumption, payment readiness, best route, route recommendation, transaction building, signing readiness, P&L, or cost basis.
400
402
 
401
- `read.preview_intent_evidence` accepts natural-language settlement evidence intents.
403
+ `read_preview_intent_evidence` accepts natural-language settlement evidence intents.
402
404
 
403
405
  Use it this way:
404
406
 
405
407
  - Coverage question: `intentKind: "cover_payment_like_amount"`, `denomination: "dollar"`, and `requiredDisplayAmount: "1000"`.
406
408
  - AssetGroup-total question: `intentKind: "summarize_settlement_asset_group_balance"` and `denomination: "dollar"` without a target amount.
407
- - Account scope: explicit public `account` or a selected account with a usable current wallet connection.
409
+ - Account scope: explicit public `account` or the saved Sui read address with a usable current wallet connection.
408
410
 
409
411
  For settlement-asset-only coverage, shortfall, and balance-total answers, use `responseSummary`.
410
412
 
411
413
  The response also exposes `userAnswerUse.answerFields` with the response-specific answer path.
412
414
 
413
- `responseSummary.answerCompleteness.answerCompleteFor` names the answer class. `responseSummary.answerCompleteness.requiredAnswerFields` names the fields required for that class. Do not call quote tools for the same question when `responseSummary.doNotCallQuoteToolsForThisQuestion` is `true`. If `toolAvailability.requiredToolsAvailable` is also `true`, answer from `responseSummary` and do not call `read.classify_wallet_assets`, `read.summarize_wallet_assets`, or quote tools to look for other source tokens for that same coverage, balance-total, or shortfall question. If quote tools were already called, do not use quote output for the payment amount, coverage status, or shortfall.
415
+ `responseSummary.answerCompleteness.answerCompleteFor` names the answer class. `responseSummary.answerCompleteness.requiredAnswerFields` names the fields required for that class. Do not call quote tools for the same question when `responseSummary.doNotCallQuoteToolsForThisQuestion` is `true`. If `toolAvailability.requiredToolsAvailable` is also `true`, answer from `responseSummary` and do not call `read_classify_wallet_assets`, `read_summarize_wallet_assets`, or quote tools to look for other source tokens for that same coverage, balance-total, or shortfall question. If quote tools were already called, do not use quote output for the payment amount, coverage status, or shortfall.
414
416
 
415
417
  `responseSummary` exposes:
416
418
 
@@ -452,7 +454,7 @@ Review activity tools read only local Sui MCP review evidence.
452
454
 
453
455
  They are not complete wallet transaction history, gas history, P&L, or external wallet activity.
454
456
 
455
- The optional `account` input is a read filter and does not change the active account context. If `account` is omitted, the tools use the active account context.
457
+ The optional `account` input is a read filter and does not change the saved read address. If `account` is omitted, the tools use stored read context without requiring a live wallet. If that context is absent or cleared, they return `active_account_not_set` with `details.action: "provide_account"`. Supply an explicit Sui address for the read; this error does not establish that the wallet is disconnected.
456
458
 
457
459
  Successful review activity responses include `dataScope`, `accountSource`, `lowSampleWarning`, and `lowSampleThreshold`.
458
460
 
@@ -460,7 +462,7 @@ The current `lowSampleThreshold` is 5 local records, from `REVIEW_ACTIVITY_LOW_S
460
462
 
461
463
  When `lowSampleWarning` is true, treat counts as sparse local evidence and avoid drawing behavior patterns.
462
464
 
463
- For `read.list_review_activity`, `dataScope.recordCount` is the full matching local review count.
465
+ For `read_list_review_activity`, `dataScope.recordCount` is the full matching local review count.
464
466
 
465
467
  The returned `activities` array can be shorter when `truncated.activities: true`.
466
468
 
@@ -468,25 +470,25 @@ The returned `activities` array can be shorter when `truncated.activities: true`
468
470
 
469
471
  MCP error responses intentionally omit `structuredContent`; clients should read the JSON error payload from `content[0].text`.
470
472
 
471
- `read.get_review_session_detail` transition rows include `isNoOp`.
473
+ `read_get_review_session_detail` transition rows include `isNoOp`.
472
474
 
473
475
  A no-op transition is an observed lifecycle call whose stored status did not change, such as a repeated open or reconnect event.
474
476
 
475
- `read.get_review_session_detail.userAnswerUse.answerFields` lists `execution` only when the response includes an `execution` object. If `execution` is absent and `userAnswerUse.cannotAnswer` includes `stored_review_execution_result_without_execution_field`, the response cannot answer a stored execution-result question.
477
+ `read_get_review_session_detail.userAnswerUse.answerFields` lists `execution` only when the response includes an `execution` object. If `execution` is absent and `userAnswerUse.cannotAnswer` includes `stored_review_execution_result_without_execution_field`, the response cannot answer a stored execution-result question.
476
478
 
477
479
  Funnel summaries count distinct reviews and do not treat repeated no-op rows as additional completed steps.
478
480
 
479
481
  Sui activity tools are user-requested read surfaces, not a background indexer.
480
482
 
481
- Summary activity tools omit full transaction details by design. Digest-level detail is exposed by `read.inspect_sui_transaction`.
483
+ Summary activity tools omit full transaction details by design. Digest-level detail is exposed by `read_inspect_sui_transaction`.
482
484
 
483
485
  Tool roles:
484
486
 
485
- - `read.inspect_sui_transaction` performs a single digest lookup.
486
- - `read.scan_sui_account_activity` requests up to 100 account transactions for `affected` or `sent` relationship.
487
- - `read.summarize_sui_activity_scan` reuses the live scan path and adds deterministic `analysis` without returning full `details`.
488
- - `read.scan_sui_function_activity` and `read.summarize_sui_function_activity_scan` return transactions the selected account sent that called one full `package::module::function`.
489
- - `read.summarize_sui_account_activity` reads only local SQLite stored facts.
487
+ - `read_inspect_sui_transaction` performs a single digest lookup.
488
+ - `read_scan_sui_account_activity` requests up to 100 account transactions for `affected` or `sent` relationship.
489
+ - `read_summarize_sui_activity_scan` reuses the live scan path and adds deterministic `analysis` without returning full `details`.
490
+ - `read_scan_sui_function_activity` and `read_summarize_sui_function_activity_scan` return transactions the selected account sent that called one full `package::module::function`.
491
+ - `read_summarize_sui_account_activity` reads only local SQLite stored facts.
490
492
 
491
493
  This is a bounded provider page, not complete wallet history.
492
494
 
@@ -512,7 +514,7 @@ Stored summary boundaries:
512
514
  - Stored summaries aggregate local account-level facts from digest lookups, account scans, or sent-function scans.
513
515
  - Scan kind is internal provenance.
514
516
  - Stored summary input does not accept `kind`, `function`, or function-history filters.
515
- - Legacy `summary` is the backward-compatible shallow count block.
517
+ - `summary` contains the stored transaction counts.
516
518
  - `analysis.overview.transactionCount` mirrors the stored count.
517
519
  - `analysis.overview.analyzedTransactionCount` reports how many returned rows fed the richer aggregations.
518
520
  - `transactionDetailAvailability` counts returned stored rows with `details`. `userAnswerUse.answerFields` includes `transactions[].compact` and `transactions[].details` only when `transactionDetailAvailability.allReturnedTransactionsHaveDetails: true`.
@@ -529,8 +531,9 @@ Coverage and pagination boundaries:
529
531
 
530
532
  Local persistence boundaries:
531
533
 
532
- - The default account is the active account.
533
- - An explicit account is allowed as a read filter.
534
+ - An omitted account uses the saved read address without a live-wallet requirement.
535
+ - A missing or cleared address returns `active_account_not_set` with `details.action: "provide_account"`; it does not establish wallet disconnection.
536
+ - An explicit account is allowed as a read filter and does not restore implicit context.
534
537
  - The local DB stores only normalized facts for transactions tied to a known account by returned sender or balance-change owner facts.
535
538
  - Function activity scans store only sender-matching rows for known accounts.
536
539
  - Provider-returned account scan rows that cannot prove the local relation can appear in the current response but are counted as skipped for storage.
@@ -653,7 +656,7 @@ The local sender check is defensive. A non-conforming provider row is dropped fr
653
656
 
654
657
  For a stored known-account scan, the dropped row contributes only to skipped counts. It is not treated as valid function history.
655
658
 
656
- `read.scan_sui_account_activity` and `read.scan_sui_function_activity` return pagination and coverage fields:
659
+ `read_scan_sui_account_activity` and `read_scan_sui_function_activity` return pagination and coverage fields:
657
660
 
658
661
  - `hasMore`;
659
662
  - `continuationCursor`;
@@ -671,22 +674,22 @@ Provider cursors are opaque and best-effort. Cursor rejection returns a safe err
671
674
 
672
675
  Tool source comparison:
673
676
 
674
- - `read.scan_sui_account_activity`, `read.scan_sui_function_activity`, `read.summarize_sui_activity_scan`, and `read.summarize_sui_function_activity_scan` return live GraphQL row facts.
677
+ - `read_scan_sui_account_activity`, `read_scan_sui_function_activity`, `read_summarize_sui_activity_scan`, and `read_summarize_sui_function_activity_scan` return live GraphQL row facts.
675
678
  - Those live rows include requested-account fields, transaction context, and `detailLookup` references but no full `details`.
676
679
  - The summary tools also return deterministic `analysis`.
677
- - `read.inspect_sui_transaction` is the full normalized detail path for a specific digest.
678
- - `read.summarize_sui_account_activity` reads only stored normalized facts from local SQLite.
679
- - `read.get_account_asset_timeline` reads only stored normalized facts from local SQLite, then can attach DeepBookV3 official Indexer USDC candle references for supported USDC-quoted assets.
680
+ - `read_inspect_sui_transaction` is the full normalized detail path for a specific digest.
681
+ - `read_summarize_sui_account_activity` reads only stored normalized facts from local SQLite.
682
+ - `read_get_account_asset_timeline` reads only stored normalized facts from local SQLite, then can attach DeepBookV3 official Indexer USDC candle references for supported USDC-quoted assets.
680
683
 
681
- If stored or summary details are missing or capped, use the digest metadata with `read.inspect_sui_transaction` instead of inferring missing calls, balances, objects, events, gas, or errors.
684
+ If stored or summary details are missing or capped, use the digest metadata with `read_inspect_sui_transaction` instead of inferring missing calls, balances, objects, events, gas, or errors.
682
685
 
683
686
  ### Stored Account Asset Timeline
684
687
 
685
- `read.get_account_asset_timeline` returns a stored local account asset-flow timeline for one account and UTC range.
688
+ `read_get_account_asset_timeline` returns a stored local account asset-flow timeline for one account and UTC range.
686
689
 
687
690
  Inputs:
688
691
 
689
- - `account` is optional. If omitted, the tool uses active account context. Supplying an explicit public account does not create active account context or prove ownership.
692
+ - `account` is optional. If omitted, the tool uses saved Sui read context with `accountSource: "active_account_context"`, without requiring a live wallet. Missing or cleared context returns `active_account_not_set` with `details.action: "provide_account"`; supply an explicit Sui address for this read. That error does not establish wallet disconnection. Supplying an explicit public account does not create saved read context or prove ownership.
690
693
  - `start` and `end` are ISO 8601 UTC timestamps. The requested range is half-open: `start` is included and `end` is excluded.
691
694
  - `interval` is optional and uses the same official Indexer interval values as DeepBook USDC price tools. Omitted `interval` uses `15m`.
692
695
 
@@ -694,7 +697,7 @@ Output fields:
694
697
 
695
698
  - `coverage` describes whether stored scan rows prove the requested range is complete, partial, or absent.
696
699
  - `status: "account_not_known"` means the explicit account is not a known local wallet in the local activity store. In that status the tool does not return `scanNeeded`.
697
- - `scanNeeded`, when present, names `read.scan_sui_account_activity` as the bounded scan tool that can gather local evidence for a known account.
700
+ - `scanNeeded`, when present, names `read_scan_sui_account_activity` as the bounded scan tool that can gather local evidence for a known account.
698
701
  - `netFlowBars` are observed account-scoped raw token balance-change bars from stored normalized activity rows.
699
702
  - `balanceStatus` is currently `unavailable_no_balance_anchor`, and `balanceBars` is empty. Do not present net-flow bars as held balances.
700
703
  - `sourceTransactions` reports how many stored rows were read, returned, truncated, and detail-covered.
@@ -708,19 +711,22 @@ This tool does not run scans, start a background indexer, create a price cache,
708
711
 
709
712
  | Tool | Status | Purpose |
710
713
  | --- | --- | --- |
711
- | `action.prepare_sui_action_review` | Signable internal Review card | Creates a local review session and internal Review card for a supported swap action proposal. Account-bound DeepBook reviews may build local unsigned transaction material inside the review server, internally bind a Sui transaction digest to it, and derive object ownership, quote/policy, human-readable review, review-time simulation, and PTB visualization evidence. When every required evidence stage completes, an explicit Review card selection can admit backend-mediated WalletConnect approval for that exact transaction. The MCP tool does not return transaction bytes, signing data, or signing readiness. |
712
- | `action.prepare_external_proposal_review` | Non-signable review | Creates a local review session and internal Review card from an untrusted structured external proposal. It does not return transaction bytes. |
713
-
714
- `action.prepare_sui_action_review` is account-bound: a swap review computes
715
- its evidence (balances, transaction material, digest, simulation) for a
716
- specific sender, so the tool requires an active wallet account. Connect first
717
- with `session.create_wallet_connection`; with no active account the tool returns
718
- `active_account_not_set` with `details.action: "connect_wallet_connection"`
719
- instead of creating a proposal that can never be computed or signed. The
720
- Review card reads that account from the server as the single source of truth
721
- and never connects a wallet itself.
722
-
723
- `action.prepare_sui_action_review` accepts a protocol-neutral swap `intent`
714
+ | `action_start_review` | Internal swap Review card | Creates a local review session and internal Review card for a supported swap action proposal. Account-bound DeepBook reviews may build local unsigned transaction material inside the review server, internally bind a Sui transaction digest to it, and derive object ownership, quote/policy, human-readable review, review-time simulation, and PTB visualization evidence. When every required evidence stage completes, an explicit Review card selection can admit backend-mediated WalletConnect approval for that exact transaction. The MCP tool does not return transaction bytes, signing data, or signing readiness. |
715
+ | `action_create_proposal_review` | Non-signable review | Creates a local review session and internal Review card from an untrusted structured external proposal. It does not return transaction bytes. |
716
+
717
+ `action_start_review` accepts only `intent` and verifies the requested adapter
718
+ before resolving the current connection's fixed Sui address. Public `account` or
719
+ `connectionId` selectors are not accepted. No usable current target returns
720
+ `active_account_not_set` with `details.reason: "connection_required"`. An unexpected
721
+ retained SDK session returns `input_invalid` with
722
+ `details.reason: "connection_state_unconfirmed"`; inspect connection status and
723
+ remove the unwanted session in the wallet app. An unavailable service returns
724
+ `wallet_unavailable`. These errors create no empty Review or wallet effect.
725
+ The accepted account and connection are fixed in the initial card, before
726
+ preparation. Preparation, display and retry retain that same target, including
727
+ when it becomes unavailable or its saved read address is cleared.
728
+
729
+ `action_start_review` accepts a protocol-neutral swap `intent`
724
730
  (`type: "swap"`, `from.symbol`, `from.amount`, `to.symbol`,
725
731
  `maxSlippageBps`, optional `protocol`). The optional `protocol` field carries
726
732
  the protocol slug from the adapter registry (the same slug vocabulary as the
@@ -731,7 +737,7 @@ omitted; once several protocols support the same action the tool returns
731
737
  `intent.protocol` set - the server never picks a venue silently. An unknown
732
738
  slug returns `reason: "unknown_protocol"` with the available slugs.
733
739
 
734
- `action.prepare_external_proposal_review` accepts `proposal` with `type:
740
+ `action_create_proposal_review` accepts `proposal` with `type:
735
741
  "payment"` or `type: "sui_action"`.
736
742
 
737
743
  Common required fields are `id`, `source`, `network: "sui:mainnet"`,
@@ -792,7 +798,7 @@ cards display those facts; neither the model nor the card receives bytes or
792
798
  signatures. Ordinary MCP calls cannot authorize signing or submission.
793
799
 
794
800
  After the wallet account is bound to a supported swap review session, the
795
- Review card and `session.get_review_status` may show protocol-specific quote
801
+ Review card and `session_get_review_status` may show protocol-specific quote
796
802
  evidence and review-state checks for:
797
803
 
798
804
  - resolved DeepBook direct pool;
@@ -819,8 +825,9 @@ Completed stages are review progress only. If
819
825
  `transaction_material_build_or_verify` is completed, it means the local review
820
826
  server built unsigned transaction material and kept the bytes internal. If
821
827
  `digest_commitment` is completed, it means the server internally derived a Sui
822
- transaction digest from that stored material; the digest value and transaction
823
- bytes are not MCP or review-app outputs. Missing stages explain why the review
828
+ transaction digest from that stored material; the schema-validated transaction-review contract may expose its commitment
829
+ hash, while transaction bytes remain private. The hash is not signing authority
830
+ or a wallet handoff. Missing stages explain why the review
824
831
  remains blocked. This lifecycle covers review evidence producer stages through
825
832
  review-time simulation. Wallet requests, signature verification, submission and
826
833
  chain observation are platform responsibilities after review, separate from
@@ -943,28 +950,95 @@ It is not a signing readiness signal. Review-state checks are pre-signing review
943
950
 
944
951
  | Tool | Input and result |
945
952
  | --- | --- |
946
- | `session.create_wallet_connection` | Opens an internal card with `intent: connect`, `disconnect` or `manage` (default). A connect-intent View automatically starts pairing after authenticated state confirmation; manage pairs only after the user chooses Connect wallet. A disconnect-intent card opens confirmation for a unique connected target. Disconnection requires target-specific confirmation and does not revoke onchain permissions. |
947
- | `session.get_wallet_connection` | Reads one `cardId`; public response excludes pairing and permission. |
948
- | `session.wait_wallet_connection` | Waits on one `cardId`, with an optional timeout up to 55 seconds; stops when user input is needed or the admitted connection/disconnection operation ends. |
949
- | `session.open_review_management` | Opens management for exact `reviewSessionId` + `attemptId`; no refresh or signing authority. |
950
- | `session.get_interaction_status` | Stored `activeAccount`, current-owner `connections`, `assetReadAccount`, wallet availability, and bounded pending connection/review lists. `assetReadAccount` is `available` with an account only when that selected address has a usable current connection; otherwise `address_required`. Stored `activeAccount` does not prove a live connection. `address_required` reports that no implicit default is available; it does not add an address input to connected-account-only tools. When wallet availability is unavailable, connection rows are last recorded facts, not proof of presence or absence. |
951
- | `session.get_review_status` | Current preparation status, review revision, optional current request and chain execution. |
952
- | `session.get_execution_result` | Observes the current explicitly referenced attempt and may read its known digest; never submits again. |
953
- | `session.wait_execution_result` | Bounded wait on the same request, separate from its signing and chain-observation deadlines. |
954
-
955
- `pendingWalletConnections.items[].status` is `input_required`,
956
- `awaiting_approval`, or `disconnect_pending`. The last value describes an
957
- admitted, running disconnect card, not a new wallet connection state. In card
958
- workflow data, a connection's optional `pendingAction: "disconnect"` is derived
959
- from that stored card operation. Its `status` remains the last confirmed
960
- connection fact. Such a connection is unavailable for a new account selection,
961
- review or signature request. `observe` remains true while disconnection can be
962
- observed, and becomes false on completion or unavailable wallet progress.
963
- While its SDK callback remains pending, unavailable progress preserves the
964
- operation and its last recorded connection state. Repeating the same selection
965
- does not send another SDK request.
966
-
967
- `session.get_interaction_status` reconciles stored connections against current SDK sessions before reading dependent review/request facts. This can record a connection change and invalidate a review or interrupt an unsubmitted request under the existing rules. It preserves the stored account selection and submitted chain results; it does not start pairing, SDK disconnect, signing or submission.
953
+ | `session_open_wallet_connection_card` | Opens one Connect card with empty input. Authenticated View confirmation admits its one pairing. A current session or unsettled SDK work prevents another pairing. |
954
+ | `session_open_wallet_disconnection_card` | Opens one Disconnect card bound to the exact current manageable session. The user confirms removal or cancels this card. It never starts pairing or targets a replacement session. |
955
+ | `session_get_wallet_connection_card` | Reads one `cardId`, returning `{card, operation, walletAvailability, evaluatedAt}` without UI authority or QR data. `card` is the stored snapshot; `operation` is that card's exact current public journal entry or null before admission. |
956
+ | `session_wait_wallet_connection_card` | Uses `cardId` and an optional timeout up to 55 seconds. Returns the same envelope plus `waitOutcome`, when that exact operation and SDK settlement end, no operation is admitted, service is unavailable, or the bounded wait ends. It accepts no operation selector. |
957
+ | `session_open_review_management` | Opens management for exact `reviewSessionId` + `attemptId`; no refresh or signing authority. |
958
+ | `session_get_interaction_status` | Stored `activeAccount`, current `connection`, optional `pendingOperation`, `assetReadAccount`, wallet availability, and bounded pending connection/review lists. `assetReadAccount` is `available` with an account only when the saved Sui read address has a usable current connection; otherwise `address_required`. Stored `activeAccount` does not prove a live connection. `address_required` reports that no implicit default is available; it does not add an address input to connected-account-only tools. When wallet availability is unavailable, connection rows are last recorded facts, not proof of presence or absence. |
959
+ | `session_get_review_status` | Current preparation status, review revision, optional current request and chain execution. |
960
+ | `session_get_execution_result` | Observes the current explicitly referenced attempt and may read its known digest; never submits again. |
961
+ | `session_wait_execution_result` | Bounded wait on the same request, separate from its signing and chain-observation deadlines. |
962
+
963
+ `pendingWalletConnections.items[]` identifies each admitted `operationId`, its
964
+ card and connection. Status is `awaiting_approval`, `disconnect_pending` or
965
+ `cleanup_pending`. Unadmitted cards are not pending effects. These statuses
966
+ describe management work, not a new wallet connection state. Interaction status has an optional top-level `pendingOperation` describing the current connection's
967
+ outstanding operation. It contains `operationId`, `action`
968
+ (`connect` or `disconnect`), `status` (`running`, `completed`, `failed` or
969
+ `stopped`) and `settlementPending`. It is derived from that connection's existing
970
+ operation when it is running or still has pending SDK work; it is not another
971
+ operation or authorization. Connection `status` remains the last confirmed
972
+ connection fact. Pending work makes that connection unavailable for a new review
973
+ or signature request. `observe` follows the operation's remaining progress and
974
+ wallet availability. SDK settlement remains observable through get/wait independently of the immutable
975
+ terminal card result. Unavailable progress preserves the operation and its last
976
+ recorded connection state. Repeating the same selection does not send another
977
+ SDK request.
978
+
979
+ Match `pendingOperation.operationId` to the one operation fixed to that card,
980
+ rather than inferring ownership from the action name. Closed card data is a
981
+ recorded snapshot; the get/wait envelope's `operation` reports current settlement.
982
+ A running disconnect is disconnecting; a completed disconnect is disconnected
983
+ with any outstanding cleanup reported separately. It is not another connection
984
+ request, and pending cleanup does not turn completion into failure or reopen a
985
+ cancelled card.
986
+
987
+ `connection.sessionPresence` reports whether the current connection has an SDK
988
+ session: `present`, `absent`, `unusable`, or `unconfirmed`. Absence includes an
989
+ exact current-session absence observation or a settled attempt without an approved
990
+ session or recorded session reference. The latter requires confirmed current-run
991
+ ownership, no pending connection work and no unrecorded SDK session. A missing
992
+ observation for a recorded session is not absence. Unavailable service or an
993
+ unconfirmed current-run observation is `unconfirmed`, never evidence of absence.
994
+ This field does not change the saved connection status or grant input authority.
995
+ A failed or expired connection may still need explicit disconnection. Once
996
+ absence is confirmed and cleanup ends, the user can request a new Connect card.
997
+ An ended card never offers a new connection. An existing Review bound to the ended connection requires a new Review
998
+ after reconnection. A declined connection alone does not require a transaction
999
+ Review. Stored connection messages in Details are historical facts, not current
1000
+ recovery instructions.
1001
+
1002
+ Live card data is purpose-specific. Connect includes fixed `requestedChains`,
1003
+ its optional `operation` and permitted initial `automaticAction`. Disconnect
1004
+ includes its exact `connection` confirmation and optional `operation`. Review
1005
+ includes `review`, `reviewTarget`, optional exact `request`/receipt facts, and
1006
+ permitted preparation action. All expose `allowedActions`, progress, service
1007
+ availability and `nextStep` (`kind`, optional safe `message`/`reason`). This is
1008
+ advisory guidance, never authorization. Read-address overview and current
1009
+ `pendingOperation` belong to interaction status, not the live card payloads.
1010
+
1011
+ | `nextStep.kind` | Meaning |
1012
+ | --- | --- |
1013
+ | `none` | No additional business recovery step is required by this evaluation. |
1014
+ | `wait` | Service startup or existing wallet/account work must finish before continuing. |
1015
+ | `check_status` | Read the indicated existing request or session; no new wallet effect is authorized. |
1016
+ | `open_settings` | Open the named Settings section for configuration or explicit service recovery. |
1017
+ | `request_disconnect` | Ask for a new exact-target Disconnect card before changing the connection. |
1018
+ | `request_review` | Ask for a new transaction Review; the old target cannot be replaced. |
1019
+
1020
+ The backend's message identifies the applicable condition. A saved preparation
1021
+ error does not override this guidance. Reasons such as `operation_busy`,
1022
+ `connection_state_unconfirmed`, `connection_target_changed`,
1023
+ `wallet_networks_required` and `no_session_to_disconnect` describe the particular
1024
+ refusal; they grant no input or effect authority. Service `initializing` and
1025
+ `recovering` mean wait, not another restart request.
1026
+
1027
+ A closed wallet card has no operation copy. Optional `result.pendingWork` records
1028
+ `approval_response`, `session_removal` or `session_status` at closure. Normal
1029
+ success does not create a recovery obligation from callback bookkeeping.
1030
+ Exact-operation get/wait still reports current `settlementPending`, including
1031
+ failed bookkeeping writes, without changing the card or replaying effects.
1032
+ A Connect card that sends no request has no network approval result or wallet
1033
+ name copied from another connection.
1034
+
1035
+ Every Connect and Disconnect terminal snapshot is address-free from the moment
1036
+ it is recorded: no address, account, address-bearing chain states or QR payload
1037
+ is included. Its result, recorded time, wallet name and network approval statuses
1038
+ stay fixed. Current `connection.chainResults` belong to interaction status;
1039
+ stored history and transaction targets keep their exact addresses.
1040
+
1041
+ `session_get_interaction_status` reconciles stored connections against current SDK sessions before reading dependent review/request facts. This can record a connection change and invalidate a review or interrupt an unsubmitted request under the existing rules. It preserves fixed addresses, read-address suppression and submitted chain results; it does not start pairing, SDK disconnect, signing or submission.
968
1042
 
969
1043
  When a disconnect callback ended but its completion write failed, current reads
970
1044
  reconcile that stored operation without another SDK disconnect. If the SDK is
@@ -998,8 +1072,9 @@ neither a completed result nor a wait timeout. A command already committed
998
1072
  before its response fails remains recorded and is recovered by reading it.
999
1073
 
1000
1074
  Wallet startup and restoration are asynchronous dependencies of the parent
1001
- service. Connect/manage cards remain available during initialization or failure
1002
- so the user can inspect state. They do not provide service-restart input. Ordinary evidence
1075
+ service. Connect can explain service initialization or failure; Disconnect
1076
+ creation instead returns its applicable availability error without issuing a
1077
+ card. Neither card provides service-restart input. Ordinary evidence
1003
1078
  and saved-result reads do not await the SDK. The package supplies its project
1004
1079
  identifier; these failures do not ask the user for a project ID. SDK error bodies
1005
1080
  and private configuration values are not returned.
@@ -1012,19 +1087,16 @@ Review status is preparation state (`proposed`, `awaiting_wallet`,
1012
1087
  otherwise the preparation state. The `user_action_required` category and
1013
1088
  `pollingHint.userActionRequiredStatuses` identify states where the model-facing
1014
1089
  wait returns; they do not require a manual preparation click. A permitted live
1015
- card can prepare automatically, while an ambiguous selection or failed update
1016
- can require user input. Preparation is not an already pending wallet signature.
1017
-
1018
- A review's bound account is fixed; changing the active read account does not
1019
- rebind it. Preparation choices and final admission use the same account rule.
1020
- To update a review bound to A, select A again in a new Connect card. To review
1021
- for B, request a new Review. An absent or incompatible read account removes the
1022
- preparation choice without recording a preparation failure. The existing
1023
- `review.error` card text distinguishes `Current account selection` guidance from
1024
- a quoted saved review message. It does not decide permissions. Changing
1025
- read context alone does not revoke an already valid A review's signing choice.
1026
- Once a signing request consumes its card, retrying needs a new Review; a
1027
- management card only refers to its existing exact attempt.
1090
+ card can prepare automatically, while a failed update
1091
+ can require an explicit retry. Preparation is not an already pending wallet signature.
1092
+
1093
+ A Review keeps its exact account and connection. Clearing the saved read address does not change its target. Disconnecting means
1094
+ a replacement connection needs a new Review. A new target requires
1095
+ a new Review; another connection with the same address cannot take over.
1096
+ Preparation and signing still require that original binding's current grant,
1097
+ method/event scope, revision and material. Saved preparation errors remain
1098
+ separate from current eligibility. After signing admission, a management card
1099
+ only refers to its exact attempt and grants no new preparation or signature.
1028
1100
 
1029
1101
  Only `completed` has `executionResult`, with `attemptId`, review/plan IDs,
1030
1102
  `status: success | failure`, the exact digest, verified `chainReceipt` and time.
@@ -1032,7 +1104,10 @@ Only failed chain effects have `failureReason: chain_execution_failed`. Wallet
1032
1104
  rejection, local timeout, unavailable receipts and lost submission responses
1033
1105
  never fabricate a chain failure. An unknown result retains the digest for later
1034
1106
  reads. An explicit user stop after submission stops observation, not an on-chain
1035
- transaction. Wallet connection changes or a requested disconnect stop pending
1107
+ transaction. Accepted `stop_waiting` also closes that card's business input;
1108
+ a new `session_open_review_management` card may explicitly inspect the same
1109
+ attempt later. A duplicate stop on the cancelled card does not stop work started
1110
+ from a newer card. Wallet connection changes or a requested disconnect stop pending
1036
1111
  submission permission with their own recorded reason; they do not claim that the
1037
1112
  user stopped waiting or that disconnection already succeeded. After submission,
1038
1113
  those connection events preserve independent observation of the same digest,
@@ -1043,7 +1118,7 @@ The original request's stored deadlines are unchanged by a management card.
1043
1118
  A new signature requires a newly reviewed revision and explicit selection.
1044
1119
  Identical duplicate selections return the admitted attempt; no response-loss
1045
1120
  path replays a financial request. Model tools may open/read cards; only scoped
1046
- app-only `ui.act_card` performs a user selection. UI permission and pairing QR
1121
+ app-only `ui_act_card` performs a user selection. UI permission and pairing QR
1047
1122
  travel in private metadata. Bytes/signatures never reach the card or model.
1048
1123
 
1049
1124
  Connection observation uses 5 seconds and request observation 3 seconds.
@@ -1067,80 +1142,70 @@ for the last confirmed local SDK observation. Ordinary reads do not perform a
1067
1142
  fresh SDK check or prove that the wallet app is online. Implicit asset reads
1068
1143
  require an available service and a usable observation in that same run.
1069
1144
 
1070
- Wallet-dependent app inputs (`connect`, `disconnect`, `use_account`,
1071
- `prepare_review`, `request_signature`) carry the displayed `walletRunId`. A stale
1072
- run cannot be transferred to a replacement SDK. Backend commands verify the
1073
- session, account, chain, method and stored authority at their decision boundary.
1074
- `acceptedWalletRunId` identifies a card's stored wallet input, when present; it
1075
- is not new permission.
1076
-
1077
- Connect workflow data includes optional `connectionAction: "connect" | "disconnect"`
1078
- only when that action was admitted on the card. The connection's current status
1079
- is separate from the card's original operation. In particular, failed disconnect
1080
- means remote removal was not confirmed, including after local service recovery.
1081
-
1082
- `connectionConflict`, when present, is
1083
- `{ reason: "multiple_connections", connectionIds: [...] }`. It contains distinct
1084
- IDs for the multiple live, known connections that prevent selecting a usable
1085
- wallet. It appears in Connect/Review `data`, the connection wait's `card.data`,
1086
- interaction status and relevant review-status responses. Its shared schema and
1087
- backend evaluation own the meaning; the View does not count rows to grant authority.
1088
- `walletAvailability: available` only confirms the SDK dependency, not the absence
1089
- of this conflict. `connections` describes recorded targets, not signing choices.
1090
- In conflict, `assetReadAccount` is `address_required`; explicit-address reads and
1091
- saved transaction results retain their independent access rules.
1092
-
1093
- A valid Connect card can still offer exact-target `disconnect` during conflict.
1094
- `connect`, `use_account`, `prepare_review` and `request_signature` remain blocked.
1095
- Each disconnection uses the same scoped UI permission, current run and revision,
1096
- atomic admission and saved result as an ordinary single-connection disconnect.
1097
- No first/newest/default wallet is silently selected. When one valid connection
1098
- remains and no connection operation is pending, normal account use can resume;
1099
- with no recorded or SDK-present connection and no pending operation, pairing is
1100
- available. A failed disconnect does not prove remote removal.
1101
- A failed or stopped product connection is not restored merely because its SDK
1102
- session remains saved.
1103
-
1104
- `connectionConflict` is optional. Its absence alone is not proof of a usable
1105
- connection or permission, especially in a historical result that does not need
1106
- current wallet eligibility. Filling optional context never adds global cleanup
1107
- writes or SDK requests to independent saved-result reads. `allowedActions`
1108
- identifies permitted action types; it is not a list of visible buttons or model
1109
- authority. Only the exact current target, UI permission and final admission
1110
- checks allow a user action.
1111
-
1112
- Current Connect/Review `data` also publishes `usableConnectionId` and
1113
- `assetReadAccount`. The first identifies the single connection eligible for
1114
- account use at the backend's evaluation time; it is absent during conflict,
1115
- pending connection work, unavailable service, or when no unexpired connection
1116
- qualifies. It does not authorize a signature. `assetReadAccount` uses the same
1117
- `available`/`address_required` shape as interaction status. Availability requires
1118
- the stored default's source connection ID to match this connection and its
1119
- address to remain approved. Matching the address in a different connection is
1120
- insufficient. A source-less stored selection requires explicit Use address.
1121
-
1122
- `manageableConnectionIds` identifies exact recorded targets for a new scoped
1123
- Disconnect, separately from account use. It includes nonpending connected records
1124
- (including expired ones) and known terminal records whose current SDK session
1125
- remains present. `connectionReconciliationRequired: true` identifies a present SDK
1126
- session without a journal target after normal registration/cleanup ends. It
1127
- blocks pairing, account use, preparation and signing while preserving SDK
1128
- availability and saved outcomes. Remove the retained connection in the wallet
1129
- app, then confirm absence through a complete current service observation.
1130
- Settings/Troubleshooting can explicitly restart the service to inspect it again;
1131
- restart alone does not remove or approve that connection. No private topic or synthetic target ID
1132
- is exposed. Both fields also appear in interaction status; review status includes
1133
- the reconciliation flag when current eligibility is needed.
1134
-
1135
- These fields are emitted together for current wallet eligibility. Independent
1136
- historical or completed-result reads may omit them; omission does not establish
1137
- current eligibility. Recorded `connections` and `activeAccount` remain facts,
1138
- including expired records and a stored default that cannot currently be used.
1139
- Views consume the published selection instead of counting recorded rows or
1140
- using their own clock. An expired record may remain a disconnection target;
1141
- expiry alone does not confirm remote removal. Final admission checks current
1142
- backend facts again. Changing a read default never changes an existing review's
1143
- account or grants new authority to an admitted transaction.
1145
+ Wallet-dependent app inputs (`connect`, `disconnect`, `prepare_review`,
1146
+ `request_signature`) carry the displayed `walletRunId`. A stale run cannot be
1147
+ transferred to a replacement SDK. Exact account, chain, method, grant revision
1148
+ and stored request authority are rechecked at admission. `acceptedWalletRunId`
1149
+ is a stored fact, not new permission.
1150
+
1151
+ In `session_get_interaction_status`, `requestedChains` is the Settings scope for new connections. Singular `connection`
1152
+ publishes its frozen requested scope and `chainResults`: exactly one result per
1153
+ requested chain, either `bound` with an address, `not_approved`, `multiple_accounts`
1154
+ or `invalid_response`. One valid distinct address binds automatically. There is
1155
+ no account selector. Only that chain becomes unavailable on multiple/invalid data.
1156
+ Later observations cannot change those results. Current `grants`, `grantRevisions`
1157
+ and `chainStates` describe availability separately; methods remain account-local.
1158
+ Sui actions require the fixed Sui address and exact Sui method/event scope.
1159
+ Ethereum/Solana address fields do not provide financial authority.
1160
+
1161
+ Both wallet gateways accept empty input. Disconnect creation checks the current
1162
+ exact session before issuing any card or permission. No recorded session or a
1163
+ confirmed absent settled session returns `input_invalid` with reason
1164
+ `no_session_to_disconnect`; unconfirmed or unrecorded presence uses
1165
+ `connection_state_unconfirmed`, and outstanding SDK work uses `operation_busy`.
1166
+ An unavailable service returns `wallet_unavailable` with its actual cause.
1167
+ These refusals create no card, operation or wallet effect. A present or unusable
1168
+ manageable session is fixed to the new Disconnect card; admission rechecks its
1169
+ run and impact. Changing wallet, address or approved network scope requires
1170
+ confirmed disconnection and a new explicit connection.
1171
+
1172
+ Connect fixes requested networks and expected connection identity at creation.
1173
+ A confirmed change before admission closes it failed, sends no wallet request,
1174
+ and asks for a new card; restoring the earlier Settings value does not reopen it.
1175
+ Transient service initialization is not proof of such a change.
1176
+
1177
+ `reviewTarget` retains the Review's original account and connection before,
1178
+ during and after preparation, even when that target is no longer usable.
1179
+ `allowedActions` lists currently permitted app input, computed for that exact
1180
+ target. A live Review's `nextStep` names the applicable recovery action and safe
1181
+ message; the view does not infer it from another connection's status. A replacement
1182
+ connection is never substituted for the original Review target.
1183
+ The interaction-status field `assetReadAccount` independently describes the fixed Sui read address as
1184
+ `available` with `account`, or `address_required`. Reason `read_address_cleared`
1185
+ means the user cleared the saved read address in Settings; this does not change
1186
+ fixed addresses or financial targets. `account_get_active_account` reports stored
1187
+ read context, not current eligibility. Restored public accounts never restore
1188
+ wallet or card authority.
1189
+
1190
+ The status overview returns `connection: null` when no current connection is recorded.
1191
+ `canDisconnect` qualifies the current exact nonpending cleanup target, including
1192
+ terminal or older-generation records whose SDK session is present/unusable.
1193
+ Current-run confirmed absence and ended I/O permit a new explicit Connect; a
1194
+ historical failed/expired row alone is not absence evidence. Recovery can transfer
1195
+ cleanup ownership without restoring usage or old card/signing authority.
1196
+
1197
+ In interaction status, `connectionReconciliationRequired: true` means current SDK presence has no approved
1198
+ product target after pending registration/cleanup. New pairing and financial
1199
+ inputs are blocked; saved evidence remains readable. Unrecorded sessions are not
1200
+ adopted by address or ordering. Remove unwanted retained sessions in the wallet
1201
+ app, then check again. Restarting inspects but neither approves nor removes them.
1202
+ Private topics are not exposed. An already admitted transaction still uses its
1203
+ original exact grant and submission checks.
1204
+
1205
+ These are backend-evaluated facts, not View row counts or clock decisions.
1206
+ `allowedActions` is not model authority. Scoped UI permission and the exact target
1207
+ remain required at atomic admission. Reconnection cannot retarget a Review or an
1208
+ admitted transaction.
1144
1209
 
1145
1210
  Views additionally know whether their own confirmation read or command response
1146
1211
  is pending. They show neutral communication guidance without synthesizing DB
@@ -1189,7 +1254,9 @@ as uncertain without resending them. Neither event establishes cancellation or
1189
1254
  chain failure, and verified chain outcomes remain unchanged.
1190
1255
 
1191
1256
  Wallet-dependent commands rejected for dependency failure use the error kind
1192
- `wallet_unavailable`, with a safe reason and message. Invalid input and domain
1257
+ `wallet_unavailable`, with the actual safe `walletAvailability` and message.
1258
+ An unavailable service includes its recorded `reason`; initializing/recovering
1259
+ states have no failure reason, so none is invented in error details. Invalid input and domain
1193
1260
  conflicts retain their own meaning. Validated app actions can also return a
1194
1261
  current snapshot with `error.code: "wallet_unavailable"`; invalid permissions
1195
1262
  and storage failures do not receive a success snapshot. Review creation can
@@ -1210,13 +1277,13 @@ retained when a later submission-admission check fails.
1210
1277
 
1211
1278
  ### Stored review activity
1212
1279
 
1213
- `read.list_review_activity` accepts account/time/limit and independent ANDed
1280
+ `read_list_review_activity` accepts account/time/limit and independent ANDed
1214
1281
  `reviewStatus`, `requestStatus`, `executionStatus` filters. One row represents
1215
1282
  one review session and its explicit current attempt, including optional
1216
1283
  `currentAttemptId`, `reviewRevision`, `transactionDigest`, request and chain
1217
1284
  status. `dataScope.recordCount` counts the complete filtered scope before limit.
1218
1285
 
1219
- `read.summarize_review_funnel` keeps the session denominator. `reviewStatusCounts`
1286
+ `read_summarize_review_funnel` keeps the session denominator. `reviewStatusCounts`
1220
1287
  is the preparation distribution; `requestStatusCounts` is a list of
1221
1288
  `{ requestStatus, count }` entries (including zero counts); `executionStatusCounts`
1222
1289
  has success/failure counts. Status strings are data values, not secret-like JSON
@@ -1237,7 +1304,7 @@ result counts as completed and as its verified chain outcome, but does not count
1237
1304
  as `everAwaitedChainResult` unless the session actually reached that stage in an
1238
1305
  attempt. This metric is neither a submission total nor a mandatory funnel step.
1239
1306
 
1240
- `read.get_review_session_detail` returns the current `request`, full
1307
+ `read_get_review_session_detail` returns the current `request`, full
1241
1308
  `requestCount`, capped `requests`, revision-bound state snapshots and transitions
1242
1309
  with `domain` and optional attemptId. Each request may contain a verified
1243
1310
  `execution`; absent execution does not imply failure. Current request is returned
@@ -1250,29 +1317,66 @@ facts actually exist.
1250
1317
 
1251
1318
  | Tool | Status | Purpose |
1252
1319
  | --- | --- | --- |
1253
- | `account.get_active_account` | Implemented | Reads the active wallet-account read context. |
1254
-
1255
- The user clears the default read address through a confirmed Settings card action. Ordinary MCP calls do not clear it.
1320
+ | `account_get_active_account` | Implemented | Reads the active wallet-account read context. |
1321
+
1322
+ Settings provides Clear saved read address for the current Sui read context.
1323
+ The explicit app-only action `settings_clear_read_address` binds the displayed
1324
+ connection and address and records its effect atomically. It suppresses implicit
1325
+ read context for that connection across restarts, without disconnecting the wallet,
1326
+ changing fixed addresses or cancelling transaction requests. A fresh connection
1327
+ can supply its new fixed read address. Ordinary MCP calls cannot apply this effect.
1328
+ Changing from a restore upload to this effect invalidates the unused upload
1329
+ atomically with the saved result. File cleanup runs separately; a cleanup failure
1330
+ does not repeat the address-clearing effect or change its stored outcome.
1256
1331
 
1257
1332
  ## Settings Tools
1258
1333
 
1259
1334
  | Tool | Status | Purpose |
1260
1335
  | --- | --- | --- |
1261
- | `settings.create_local_settings_session` | Implemented | Opens one internal Settings card with an unsubmitted draft. |
1262
- | `settings.get_local_settings` | Implemented | Reads stored/effective Sui gRPC and GraphQL endpoints, sources and pending restart information. |
1336
+ | `settings_create_local_settings_session` | Implemented | Empty input opens Settings. `operationStatus: {operationId}` records a read-only status card. `backupDelivery: {operationId, fileId}` opens a new delivery-purpose card for the exact retained backup. These strict input forms cannot be mixed. |
1337
+ | `settings_get_local_settings` | Implemented | Reads requested wallet networks and stored/effective Sui endpoints, sources and pending restart information. |
1263
1338
 
1264
- The gateway name is preserved. Its result is a `kind: "settings"` card snapshot
1339
+ The result is a `kind: "settings"` card snapshot
1265
1340
  and a public saved-result link. Card permission is only in `sui-mcp/card` UI
1266
- metadata. There is no `settingsUrl`, `openTarget`, external page, HTTP mutation
1341
+ metadata. Every closed Settings card keeps its recorded result and has empty
1342
+ `allowedActions` and `allowedFileActions`. A fresh `operationStatus` card records
1343
+ current operation/cleanup facts once; its `createdAt` is that query's timestamp,
1344
+ and any stored operation result retains its original `recordedAt`. A current
1345
+ backup-delivery summary is recorded at the query time; do not infer a delivery
1346
+ completion time from that read timestamp. It issues no settings
1347
+ or file effect authority. A new `backupDelivery` card uses the original artifact,
1348
+ owner, epoch and expiry; creating it performs no transfer. Only its explicit Retry
1349
+ download or Save a local copy admits one attempt. A late exact Host report updates
1350
+ the domain journal only; it cannot change a closed card or initiate local saving. There is no `settingsUrl`, `openTarget`, external page, HTTP mutation
1267
1351
  API or compatibility alias. A client without internal cards receives
1268
1352
  `ui_unavailable`; ordinary model calls never apply a Settings change.
1269
1353
 
1270
- Settings groups Address for viewing assets, Local records, Troubleshooting and Advanced
1271
- settings. Confirmed changes are `clear_read_address`, `set_endpoint`,
1272
- `restore_endpoint` (gRPC or GraphQL), `import_local_data`, `reset_local_data`
1273
- and `restart_wallet_service`. Their preparation and confirmation use app-only
1274
- `ui.act_card` with card permission, revision, operation identity and the exact
1275
- preparation identity. Choosing or checking data does not apply it, contact a
1354
+ Settings groups Address for viewing assets, Wallet networks, Local records,
1355
+ Troubleshooting and Advanced settings. Address for viewing assets owns the
1356
+ `settings_clear_read_address` action described under Account Tools; clearing
1357
+ does not disconnect the wallet or change transaction targets.
1358
+
1359
+ Wallet networks uses one explicit Save networks action:
1360
+ `settings_save_wallet_networks` with `operationId`, the selected `chains`, and
1361
+ `expectedChains` containing the saved scope displayed to the user. App-only
1362
+ `ui_act_card` checks the card permission, owner, data epoch, revision and expiry,
1363
+ compares the current saved scope with `expectedChains`, and reserves, saves and
1364
+ records the exact selection in one transaction. Its `data.draft.kind` is
1365
+ `set_wallet_networks`. There is no selection/preparation/confirmation
1366
+ sequence for this setting. An identical admitted save returns its stored result;
1367
+ a conflicting selection cannot replace it. Editing checkboxes does not save,
1368
+ pair a wallet or update an existing connection. Saving a changed scope atomically
1369
+ ends unsent Connect cards with different captured networks; restoring the earlier
1370
+ setting does not reopen those cards. Already admitted wallet requests retain their
1371
+ original scope.
1372
+
1373
+ Endpoint changes (`set_endpoint`, `restore_endpoint` for gRPC or GraphQL),
1374
+ `import_local_data`, `reset_local_data` and `restart_wallet_service` retain a
1375
+ concrete impact confirmation. Selecting an endpoint change, reset or restart
1376
+ starts preparation directly; no intermediate Continue action is required.
1377
+ Selecting a backup file starts its checks. Final confirmation uses app-only
1378
+ `ui_act_card` with card permission, revision, operation identity and the exact
1379
+ preparation identity. Preparing or checking data does not apply it, contact a
1276
1380
  wallet or restart the SDK. Duplicate confirmation returns the same admitted
1277
1381
  result; MCP JSON-RPC request IDs do not authorize another operation.
1278
1382
 
@@ -1280,8 +1384,7 @@ Download backup uses one `settings_download_backup` action with `operationId`
1280
1384
  and an `attemptId` UUID, admitted atomically through the same scoped card input.
1281
1385
  It creates a `download_backup` operation and one immutable snapshot. It requires
1282
1386
  no separate selection, preparation or confirmation action. The same admitted
1283
- start returns the same request; a different start cannot replace it. New
1284
- `export_local_data` selection/preparation/confirmation is not accepted.
1387
+ start returns the same request; a different start cannot replace it.
1285
1388
 
1286
1389
  The card uses plain-language display labels without changing wire fields or
1287
1390
  enums. Wallet-service `available`, `initializing`, `recovering` and `unavailable`
@@ -1319,16 +1422,21 @@ failure-recovery policy.
1319
1422
  `file.sealed` records complete, integrity-checked transfer; it does not by itself
1320
1423
  establish a supported backup or permission to restore it. `settings_back` and user-data
1321
1424
  changes invalidate preparation while preserving a reusable complete file.
1322
- The explicit `settings_prepare` action rechecks such a file; normal file
1323
- selection requires no separate Preview action. A failed check preserves its
1425
+ The explicit `settings_prepare` action rechecks such a file; selecting a file
1426
+ starts its backup check without another action. A failed check preserves its
1324
1427
  current file/operation identity and correction path. Owner replacement ends old
1325
1428
  input; a new card must receive a new explicit file selection.
1326
1429
 
1327
- A download's `result.completionScope: "backup_snapshot"` identifies the immutable
1328
- preparation result, not a saved user file. `data.download` separately carries
1430
+ Physical snapshot readiness is intermediate: the delivery card stays running.
1431
+ Its final `result.completionScope: "backup_delivery"` records a Host report,
1432
+ verified local publication, cancellation, expiry or failure, not merely snapshot
1433
+ preparation. A Host acknowledgment is not proof that a user file was saved. `data.download` separately carries
1329
1434
  `availability` (`preparing`, `available`, `ended`), `currentAttemptId`, an optional
1330
- `hostReport` (`acknowledged`, `not_completed`, `unconfirmed`, `unsupported`), `previousUnconfirmed`,
1331
- `expiresAt`, `remainingMs`, `endReason` and `allowedFileActions`. End reasons are
1435
+ `hostReport` (`acknowledged`, `not_completed`, `unconfirmed`, `unsupported`, `not_sent`), `previousUnconfirmed`,
1436
+ `expiresAt`, `remainingMs`, `endReason` and `allowedFileActions`. `not_sent` is the
1437
+ View's report that transfer verification failed before any Host download request;
1438
+ it is not a Host rejection or non-support response. Like `unsupported`, it
1439
+ establishes no earlier Host copy for local-copy consent. End reasons are
1332
1440
  `acknowledged`, `cancelled`, `expired`, `server_restarted`, `data_replaced`,
1333
1441
  `source_unavailable`, `stored_locally` or `local_save_failed`. Replacement revokes the old card rather than preserving
1334
1442
  its input. The transfer period is thirty minutes from physical readiness;
@@ -1344,13 +1452,12 @@ absence was not established, including an unreported or not-completed request.
1344
1452
 
1345
1453
  A verified local `saved` result provides `data.backupLocation.directory` and
1346
1454
  `filename` for `<SUI_MCP_DATA_DIR>/backups/<operationId>.json`. Snapshot preparation
1347
- and Host acknowledgment do not provide that local success. A recorded
1348
- `export_local_data` result can also identify its existing file. These fields
1349
- never identify the destination chosen by a Host download dialog. Existing user
1455
+ and Host acknowledgment do not provide that local success. These fields never
1456
+ identify the destination chosen by a Host download dialog. Existing user
1350
1457
  files are never deleted by private snapshot cleanup. Private publication
1351
1458
  identities and source inode/device facts are not public projection fields.
1352
1459
 
1353
- Current `data.facts` uses the same connection selection and qualification rules
1460
+ Current `data.facts` uses the same fixed-address and connection qualification rules
1354
1461
  as interaction status, through a fact reader that does not settle another
1355
1462
  request's deadlines or callback writes. General counts describe stored records;
1356
1463
  reset/import preparation and confirmation independently settle deadlines and
@@ -1383,8 +1490,10 @@ recorded idempotently without resending bytes. Public fields include
1383
1490
  local operation, not a transaction's chain outcome. Optional
1384
1491
  `temporaryFileCleanup` separately reports `pending`, `failed` or `complete`;
1385
1492
  reading/checking it never repeats data replacement, backup creation, Host delivery or SDK
1386
- replacement. Terminal business input remains closed; only the separate scoped
1387
- file continuations in `data.download.allowedFileActions` may remain available. Public fields contain no raw file, transaction bytes, signatures,
1493
+ replacement. Terminal business input remains closed; the separate scoped
1494
+ file continuations in `data.download.allowedFileActions` are also closed. A new
1495
+ `backupDelivery` card is required for another attempt, while `operationStatus`
1496
+ reads current cleanup without granting a file effect. Public fields contain no raw file, transaction bytes, signatures,
1388
1497
  SDK credentials or card permission.
1389
1498
 
1390
1499
  A user-data writer invalidates its affected prepared confirmation atomically.
@@ -1403,8 +1512,8 @@ rejection can report a smaller raw chunk limit before any write. The backup chec
1403
1512
  strict current backup shape/references without endpoint contact. Confirmation
1404
1513
  verifies imported endpoints report Sui mainnet and rechecks current data and
1405
1514
  unsettled wallet/transaction work before atomic replacement.
1406
- The prepared import includes `currentReadAddress` and `incomingReadAddress`
1407
- (`null` when unset), the corresponding change and current/incoming record counts.
1515
+ The prepared import includes current/incoming record counts. Accounts and records
1516
+ are restored as history, never as active connection or signing authority.
1408
1517
  Both preparation and final admission settle request deadlines before capturing
1409
1518
  or comparing that decision basis. A newly unknown outcome requires a new backup check.
1410
1519
  Reset/import revoke other live permissions and preserve only their own read-only card/result.
@@ -1416,8 +1525,9 @@ automatic result checks. Stopping those checks does not shorten that window.
1416
1525
  They cannot cancel a transaction on Sui or disconnect a remote wallet session.
1417
1526
  The private connection-service journal is preserved; it is not imported from
1418
1527
  the public backup and cannot restore old permissions or signing authority.
1419
- Reset clears the default address. A restored default requires its exact current
1420
- connection ID and approved address. Outstanding connection SDK callbacks block
1528
+ Reset and restore invalidate the retained connection for financial use. Neither
1529
+ restores a live connection reference; the retained session remains a cleanup
1530
+ target until disconnected. A new explicit connection establishes new fixed addresses. Outstanding connection SDK callbacks block
1421
1531
  replacement along with unsettled transaction work.
1422
1532
 
1423
1533
  Endpoint preparation records the gRPC/GraphQL kind, current stored/effective
@@ -1429,18 +1539,19 @@ remains set; storing an endpoint does not modify that environment.
1429
1539
 
1430
1540
  Download creates and verifies one private snapshot with an exclusive generated
1431
1541
  file identity. Supported Host delivery does not publish a second permanent backup. Response or result
1432
- storage failure never regenerates that snapshot. `ui.read_settings_file` is
1542
+ storage failure never regenerates that snapshot. `ui_read_settings_file` is
1433
1543
  app-only and binds card/permission, operation, file, offset, verified hash/length
1434
1544
  and the current `attemptId` for a private download. Its ordinary content carries
1435
1545
  range metadata; Base64 bytes appear only in `sui-mcp/settings-file` UI metadata.
1436
1546
  The View checks the complete hash before standard Host delivery.
1437
1547
 
1438
- File continuations also use app-only `ui.act_card`:
1548
+ File continuations also use app-only `ui_act_card`:
1439
1549
 
1440
1550
  - `settings_retry_download`: `operationId`, `fileId`, `previousAttemptId` and a
1441
- new `attemptId`; atomically advances one attempt on the same live snapshot.
1551
+ new `attemptId`; only a new backup-delivery card may admit this attempt on the
1552
+ same retained snapshot. It consumes that card's one delivery input.
1442
1553
  - `settings_report_download`: `operationId`, `fileId`, `attemptId` and `status`
1443
- (`acknowledged`, `not_completed`, `unconfirmed`, `unsupported`); the same report is idempotent,
1554
+ (`acknowledged`, `not_completed`, `unconfirmed`, `unsupported`, `not_sent`); the same report is idempotent,
1444
1555
  and conflicting reports for one attempt are rejected. A late older report
1445
1556
  cannot change the current attempt or end its retention. `unsupported` requires
1446
1557
  exactly `failure: {method: "ui/download-file", code: -32601}`; other statuses
@@ -1453,34 +1564,39 @@ File continuations also use app-only `ui.act_card`:
1453
1564
  - `settings_cancel_download`: `operationId`, `fileId` and `attemptId`; ends
1454
1565
  further delivery of that snapshot, not a Host dialog or a user-saved file.
1455
1566
  Cancellation is refused while a local save is in progress or its outcome is
1456
- uncertain. After a failure recorded as `not_published`, cancellation remains
1457
- available within the transfer period for the current authorized request.
1567
+ uncertain. A finished failed delivery has no further cancellation or retry input;
1568
+ another attempt requires a new delivery card.
1458
1569
  - `settings_store_backup`: `operationId`, `fileId`, current `attemptId`, a new
1459
1570
  `saveAttemptId`, required boolean `allowPossibleCopy`, and optional
1460
1571
  `previousSaveAttemptId`. It is available only for that snapshot's recorded
1461
- unsupported result. Possible earlier delivery requires explicit true consent;
1572
+ unsupported result and a new delivery-purpose card. Possible earlier delivery requires explicit true consent;
1462
1573
  otherwise false is required. Initial consent has no previous save ID. A retry
1463
1574
  of a confirmed no-publication failure must name the current failed save ID.
1464
1575
  IDs and consent are immutable per admission; duplicates do not repeat effects.
1465
1576
  It accepts no arbitrary path, name or bytes.
1466
1577
 
1467
1578
  These actions validate current owner, epoch, credential and exact file/attempt
1468
- identity independently of terminal business input. Retry/read requires a live
1469
- transfer period. A late report can record a fact after that period ends but
1579
+ identity. Effect admissions and file reads require an active purpose card and the
1580
+ original live transfer period. Closed cards grant none of these effect permissions.
1581
+ Only an exact late result report may update an already-admitted attempt's journal,
1582
+ without modifying its closed card or starting publication. A late report can record a fact after that period ends but
1470
1583
  cannot restore the file or authority. Host acknowledgment ends retention and
1471
1584
  requests cleanup; it does not prove a save location or completed disk storage.
1472
1585
  `isError` does not distinguish cancellation, denial or failure. A lost response
1473
1586
  is unconfirmed and never triggers automatic retransmission. Cleanup failure is
1474
- reported separately and is retried through Check status or owner recovery.
1587
+ reported separately; a new operation-status card or owner recovery can settle
1588
+ known cleanup without repeating the original effect.
1475
1589
  Local publication closes further Host reads/retries for that snapshot. Its
1476
- final/file-I/O reservations survive the immutable terminal snapshot result.
1590
+ file-I/O reservation lasts until the actual admitted file work ends, independently
1591
+ of the immutable card result.
1477
1592
  New save admissions and retries require the original live period; admitted
1478
1593
  file work settles even if it outlives that period. A process restart verifies
1479
1594
  only an existing target bound to its recorded source identity/content. It never
1480
1595
  publishes a missing target or restores the departed card's action authority.
1481
1596
  A missing or changed source ends that private transfer; a new explicit request
1482
- is required. An existing public backup is verified on the same descriptor used
1483
- for each range and is never truncated or removed by temporary cleanup.
1597
+ is required. Private snapshot reads verify the artifact on the same descriptor
1598
+ used for each range. Temporary cleanup never truncates or removes a saved
1599
+ local backup.
1484
1600
 
1485
1601
  Troubleshooting recovery confirms a precise SDK run and affected unsubmitted
1486
1602
  requests. Admission revokes their submission authority before stopping the old
@@ -1494,8 +1610,8 @@ and addresses. Historical disconnected/failed records do not prove a current
1494
1610
  connection or approval. The complete recorded impact remains bound to admission;
1495
1611
  the display does not filter it into a new wallet-eligibility rule.
1496
1612
 
1497
- Endpoint changes require fully quitting/reopening every participating app to
1498
- apply parent configuration. Restart connection service only replaces the SDK
1613
+ Endpoint changes require stopping all participating MCP connections and waiting
1614
+ for the shared parent to exit, then reopening them to apply its configuration. Restart connection service only replaces the SDK
1499
1615
  child. Installation environment overrides continue to take precedence. Custom
1500
1616
  providers affect read data quality; use trusted Sui mainnet providers.
1501
1617
 
@@ -1515,12 +1631,12 @@ permissions and display facts. Clients must use the returned URI/key values.
1515
1631
  | `suimcp://docs/mcp-tools` | API reference: tool contracts, response fields, statuses, follow-up fields, and output boundaries. |
1516
1632
  | `suimcp://docs/wallet-connection` | Wallet connection reference: active read context, private SDK ownership and user-approved transaction requests. |
1517
1633
  | `suimcp://docs/agent-behavior` | Answer playbook: user-question flows, tool selection, and response wording boundaries. |
1518
- | `suimcp://protocols/deepbook-v3` | Protocol reference only; use MCP tool responses and `read.list_supported_protocols` for current support. |
1634
+ | `suimcp://protocols/deepbook-v3` | Protocol reference only; use MCP tool responses and `read_list_supported_protocols` for current support. |
1519
1635
  | `suimcp://protocols/deepbook-margin` | Protocol reference only; no margin MCP read tools or signable actions are exposed in this release. |
1520
1636
 
1521
1637
  Only allowlisted mainnet protocol references are exposed as MCP resources.
1522
1638
 
1523
- Protocol resources are not runtime registries, supported-protocol lists, live liquidity sources, route recommendations, or signing-readiness signals. Use `read.get_server_status`, `read.list_supported_protocols`, concrete tool schemas, and concrete tool responses for current product support.
1639
+ Protocol resources are not runtime registries, supported-protocol lists, live liquidity sources, route recommendations, or signing-readiness signals. Use `read_get_server_status`, `read_list_supported_protocols`, concrete tool schemas, and concrete tool responses for current product support.
1524
1640
 
1525
1641
  MCP resources are runtime-facing references that connected AI clients can read.
1526
1642