@stelis/say-ur-intent 0.0.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.
- package/LICENSE +21 -0
- package/README.md +425 -0
- package/docs/AGENT_BEHAVIOR.md +462 -0
- package/docs/AGENT_DEVELOPMENT_POLICY.md +740 -0
- package/docs/FRONTEND_POLICY.md +234 -0
- package/docs/LOCAL_DB_ARCHITECTURE.md +85 -0
- package/docs/MCP_SETUP.md +496 -0
- package/docs/MCP_TOOLS.md +893 -0
- package/docs/SDK_API.md +116 -0
- package/docs/SIGNABLE_ADAPTER_CONTRACT.md +358 -0
- package/docs/TRANSACTION_ACTIVITY_LOG.md +182 -0
- package/docs/UTILITY_INDEX.md +180 -0
- package/docs/WALLET_IDENTITY.md +194 -0
- package/docs/golden-scenarios/BEHAVIOR_MATRIX.md +169 -0
- package/docs/golden-scenarios/INTENT_EVIDENCE_GOLDEN_ANSWERS.md +161 -0
- package/docs/golden-scenarios/INTENT_EVIDENCE_MATRIX.md +254 -0
- package/package.json +73 -0
- package/protocols/deepbook-margin.md +15 -0
- package/protocols/deepbook-v3.md +24 -0
|
@@ -0,0 +1,893 @@
|
|
|
1
|
+
# MCP Tools
|
|
2
|
+
|
|
3
|
+
Say Ur Intent tools are grouped by authority.
|
|
4
|
+
|
|
5
|
+
This document is the MCP API reference. It owns tool contracts, response fields, statuses, follow-up fields, and output boundaries.
|
|
6
|
+
|
|
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
|
+
|
|
9
|
+
Tool names use dot prefixes and avoid arbitrary shell, arbitrary Move calls, and private-key handling.
|
|
10
|
+
|
|
11
|
+
## Read-Only Tools
|
|
12
|
+
|
|
13
|
+
| Tool | Status | Purpose |
|
|
14
|
+
| --- | --- | --- |
|
|
15
|
+
| `read.get_server_status` | Implemented | Returns package, version, evidence policy, network, runtime, `implementedToolsCount`, resources, prompts, and tool implementation status. |
|
|
16
|
+
| `read.list_supported_protocols` | Implemented | Lists current mainnet protocol surfaces and support levels. |
|
|
17
|
+
| `read.list_deepbook_pools` | Implemented | Lists DeepBook mainnet pools from pinned `@mysten/deepbook-v3` constants. |
|
|
18
|
+
| `read.list_deepbook_tokens` | Implemented | Lists DeepBook mainnet tokens from pinned `@mysten/deepbook-v3` constants. |
|
|
19
|
+
| `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. |
|
|
20
|
+
| `read.get_deepbook_mid_price` | Implemented | Returns a DeepBook pool mid price snapshot from pinned SDK simulation reads. |
|
|
21
|
+
| `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. |
|
|
22
|
+
| `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. |
|
|
23
|
+
| `read.list_flowx_pools` | Implemented | Lists pinned FlowX CLMM mainnet pools for supported pairs from the chain-verified pinned registry. |
|
|
24
|
+
| `read.quote_flowx_swap` | Implemented | Returns an indicative FlowX route quote for an explicit display source amount; the router-selected pool is reported as evidence and validated against the pinned registry. |
|
|
25
|
+
| `read.summarize_deepbook_account_inventory` | Implemented | Summarizes active-account DeepBook BalanceManager inventory through pinned SDK simulation reads. |
|
|
26
|
+
| `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. |
|
|
27
|
+
| `read.classify_wallet_assets` | Implemented | Classifies coin balances for an explicit address or the active account by spendability and coin-balance roles; accepts `cursor` for pagination. |
|
|
28
|
+
| `read.list_settlement_asset_groups` | Implemented | Lists supported settlement asset groups derived from pinned mainnet SDK registries. |
|
|
29
|
+
| `read.summarize_settlement_asset_group_parity` | Implemented | Summarizes direct DeepBook mid-price parity across a supported settlement asset group against a declared measurement reference. |
|
|
30
|
+
| `read.preview_intent_evidence` | Implemented | Builds current wallet and DeepBook evidence for a natural-language settlement intent; not transaction building or signing. |
|
|
31
|
+
| `read.list_review_activity` | Implemented | Lists local Say Ur Intent review evidence for one account. |
|
|
32
|
+
| `read.summarize_review_funnel` | Implemented | Summarizes local review lifecycle counts, status distribution, and review timing. |
|
|
33
|
+
| `read.get_review_session_detail` | Implemented | Returns stored local evidence for one Say Ur Intent review session. |
|
|
34
|
+
| `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. |
|
|
35
|
+
| `read.scan_sui_account_activity` | Implemented | Runs a bounded GraphQL activity scan for a known or explicit Sui account. |
|
|
36
|
+
| `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. |
|
|
37
|
+
| `read.scan_sui_function_activity` | Implemented | Runs a bounded GraphQL scan for transactions the account sent that called one full `package::module::function`. |
|
|
38
|
+
| `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. |
|
|
39
|
+
| `read.summarize_sui_account_activity` | Implemented | Summarizes stored normalized Sui activity facts from local SQLite. |
|
|
40
|
+
|
|
41
|
+
Read-only tools split by address requirement.
|
|
42
|
+
|
|
43
|
+
Address-free reads do not need wallet identity. Examples include DeepBook pool lists, orderbook snapshots, mid price, and quote facts.
|
|
44
|
+
|
|
45
|
+
Address-scoped reads need either an explicit public Sui address supplied by the user or active account context from wallet identity.
|
|
46
|
+
|
|
47
|
+
An explicit public-address read does not prove ownership, create active account context, or authorize active-account-only tools.
|
|
48
|
+
|
|
49
|
+
Live read results include `fetchedAt` as an ISO 8601 UTC string. `fetchedAt` is a timestamp, not a freshness verdict.
|
|
50
|
+
|
|
51
|
+
## API Response Guidance
|
|
52
|
+
|
|
53
|
+
High-risk read, review, wallet identity, and execution-status responses include `userAnswerUse` when the response needs answer guidance.
|
|
54
|
+
|
|
55
|
+
USD-denominated settlement-asset responses also include `answerSourceStatus`.
|
|
56
|
+
This object repeats the current package version, evidence policy version, network, implemented tool count, and required tool availability for that response.
|
|
57
|
+
If `answerSourceStatus.canUseThisResponseForUserAnswer` is `false`, do not answer the user's USD-denominated question from that response.
|
|
58
|
+
|
|
59
|
+
Use these fields before relying on prose in this document:
|
|
60
|
+
|
|
61
|
+
- `userAnswerUse.canAnswer`: question categories this one response can support.
|
|
62
|
+
- `userAnswerUse.cannotAnswer`: conclusions this one response does not support.
|
|
63
|
+
- `userAnswerUse.answerFields`: fields to use in the user-facing answer.
|
|
64
|
+
- `userAnswerUse.preconditionFields`: fields to check before using answer fields.
|
|
65
|
+
- `userAnswerUse.conclusionRuleFields`: fields that limit what the final conclusion may claim.
|
|
66
|
+
- `userAnswerUse.diagnosticOnlyFields`: fields for source, troubleshooting, pagination, or limitation context.
|
|
67
|
+
- `userAnswerUse.followUp.tool`: exact next tool when the current response is not enough.
|
|
68
|
+
- `userAnswerUse.followUp.inputFields`: current-response fields to pass into the follow-up tool, when the response provides them.
|
|
69
|
+
- `userAnswerUse.followUp.answerFields`: fields to use in the follow-up response.
|
|
70
|
+
- `answerSourceStatus.requiredTools`: tools the current response depends on for this answer class.
|
|
71
|
+
- `answerSourceStatus.canUseThisResponseForUserAnswer`: whether the current server build exposes those required tools.
|
|
72
|
+
|
|
73
|
+
`quantitySemantics`, raw evidence, source fields, and protocol facts remain in the response. `userAnswerUse` does not replace them; it tells the client which returned fields belong in the answer.
|
|
74
|
+
|
|
75
|
+
DeepBook raw quote inputs use raw integer quantities as expected by the pinned SDK.
|
|
76
|
+
|
|
77
|
+
DeepBook display quote inputs are source-side display amounts. They are converted to raw integers only through pinned DeepBook token units.
|
|
78
|
+
|
|
79
|
+
DeepBook read outputs include `source.simulation: "client.core.simulateTransaction"` because the pinned SDK uses transaction simulation for these read queries.
|
|
80
|
+
|
|
81
|
+
DeepBook pool and token lists are static pinned SDK registries.
|
|
82
|
+
|
|
83
|
+
They are not live liquidity, live token discovery, or a complete list of Sui tokens.
|
|
84
|
+
|
|
85
|
+
Token list entries are keyed by SDK symbol and include the pool keys that reference that token in `mainnetPools`.
|
|
86
|
+
|
|
87
|
+
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.
|
|
88
|
+
|
|
89
|
+
`read.get_deepbook_mid_price` returns `priceDirection: "quote_per_base"`, so a `SUI_USDC` result is USDC per SUI.
|
|
90
|
+
|
|
91
|
+
The price is the pinned SDK `midPrice` result with `source.precision: "deepbook_v3_to_fixed_9_js_number"`.
|
|
92
|
+
|
|
93
|
+
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.
|
|
94
|
+
|
|
95
|
+
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`.
|
|
96
|
+
|
|
97
|
+
`read.quote_deepbook_action` and `read.quote_deepbook_display_amount` use the pinned DeepBook transaction builder quote functions.
|
|
98
|
+
|
|
99
|
+
Input kinds:
|
|
100
|
+
|
|
101
|
+
- `read.quote_deepbook_action`: `quantitySemantics.inputAmountKind: "raw_u64"`.
|
|
102
|
+
- `read.quote_deepbook_display_amount`: `inputAmountKind: "display_source_amount_converted_to_raw_u64"`.
|
|
103
|
+
|
|
104
|
+
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.
|
|
105
|
+
|
|
106
|
+
`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.
|
|
107
|
+
|
|
108
|
+
`requiredPaymentAnswerTool: "read.preview_intent_evidence"` and `requiredPaymentAnswerField: "responseSummary"` identify the tool and field to use for payment amount and shortfall answers.
|
|
109
|
+
|
|
110
|
+
The same response-local rule is also exposed as `userAnswerUse.followUp.tool: "read.preview_intent_evidence"` and `userAnswerUse.followUp.answerFields: ["responseSummary"]`.
|
|
111
|
+
|
|
112
|
+
Raw quote source:
|
|
113
|
+
|
|
114
|
+
- `rawQuote.sourceMoveFunction` is `pool::get_quote_quantity_out` for `base_to_quote`.
|
|
115
|
+
- `rawQuote.sourceMoveFunction` is `pool::get_base_quantity_out` for `quote_to_base`.
|
|
116
|
+
- Both entrypoints delegate to `rawQuote.returnValueSourceMoveFunction: "pool::get_quantity_out"`.
|
|
117
|
+
- The official Move source defines return values in this order: `base_quantity_out`, `quote_quantity_out`, `deep_quantity_required`.
|
|
118
|
+
|
|
119
|
+
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.
|
|
120
|
+
|
|
121
|
+
`read.quote_deepbook_display_amount` accepts `amountDisplay` as the source coin input amount for the requested `direction`.
|
|
122
|
+
|
|
123
|
+
It does not accept output target amounts or inverse quote requests.
|
|
124
|
+
|
|
125
|
+
The tool:
|
|
126
|
+
|
|
127
|
+
- resolves the input coin from the pinned DeepBook pool;
|
|
128
|
+
- derives decimals from pinned `mainnetCoins.scalar` through the shared scalar invariant;
|
|
129
|
+
- converts to a positive raw input amount that fits the SDK `u64` quote input;
|
|
130
|
+
- reuses the raw DeepBook quote path.
|
|
131
|
+
|
|
132
|
+
The exact converted input is returned as `inputAmount.raw`.
|
|
133
|
+
|
|
134
|
+
The public `quote` contains exact decimal display strings for `baseOut`, `quoteOut`, and `deepRequired`. They are derived from raw `u64` return values through pinned DeepBook scalars.
|
|
135
|
+
|
|
136
|
+
Returned `quantitySemantics.kind: "deepbook_quote_display_amount"` means those display fields are presentation quote facts only.
|
|
137
|
+
|
|
138
|
+
They are not raw output amounts, min-out values, liquidity verdicts, route recommendations, venue comparisons, best-route claims, effective prices, price-impact calculations, mid-price slippage calculations, funding sources, fiat USD cash-out estimates, external market-price conversions, external market lookups, USDC/USD peg assumptions, P&L, cost basis, transaction-building inputs, signing data, or signing readiness.
|
|
139
|
+
|
|
140
|
+
This quote is not a settlement asset choice.
|
|
141
|
+
|
|
142
|
+
### FlowX read tools
|
|
143
|
+
|
|
144
|
+
`read.list_flowx_pools` lists the pinned FlowX CLMM mainnet pool registry: every pool for each supported pair, one per fee tier, without ranking. The pins were read from Sui mainnet directly (package introspection, the shared `PoolRegistry` object, and its dynamic fields) and `scripts/generate-flowx-registry.ts` re-verifies them against the chain; verification failure stops the generator instead of rewriting pins. The list is static known metadata, not live liquidity, a pool ranking, or route advice.
|
|
145
|
+
|
|
146
|
+
`read.quote_flowx_swap` accepts `sourceSymbol`, `targetSymbol`, and `amountDisplay`, converts the display amount through pinned decimals, and requests a quote from the FlowX aggregator quoter restricted to FlowX CLMM single-hop routes.
|
|
147
|
+
|
|
148
|
+
The route is chosen by the FlowX router, not by this server. The response reports that choice as evidence: `routeEvidence.routeChosenBy: "flowx_router_not_this_server"` and `routeEvidence.pools` name the router-selected pool.
|
|
149
|
+
|
|
150
|
+
Every quote fails closed unless all of the following hold:
|
|
151
|
+
|
|
152
|
+
- every route hop source is FlowX CLMM;
|
|
153
|
+
- the route is single-hop;
|
|
154
|
+
- the selected pool is present in the pinned registry with the same fee rate;
|
|
155
|
+
- the route direction agrees with the pinned pair orientation;
|
|
156
|
+
- the echoed input amount equals the requested raw amount;
|
|
157
|
+
- the protocol config carried by the quoter response matches the pinned package and object ids (`protocolConfigPinMatch: true`).
|
|
158
|
+
|
|
159
|
+
`source.chainVerified: false` and `quantitySemantics.chainVerified: false` state that this quote comes from the FlowX quoter API over HTTPS, not from a chain read. `amountOut.indicative: true` marks the output as an indicative estimate. Signable FlowX review, when it ships, re-verifies any quote through review-time simulation before a transaction can be reviewed.
|
|
160
|
+
|
|
161
|
+
The same payment-answer blocks as the DeepBook quotes apply: `canUseForPaymentAnswer: false`, `doNotCombineWithPaymentAnswer: true`, and `read.preview_intent_evidence` `responseSummary` stays the only payment-coverage answer source.
|
|
162
|
+
|
|
163
|
+
`read.summarize_deepbook_account_inventory` uses active account context to discover DeepBook BalanceManager addresses.
|
|
164
|
+
|
|
165
|
+
With both `poolKey` and `managerAddress`, it checks pool account existence and returns display-like account inventory:
|
|
166
|
+
|
|
167
|
+
- selected account ledger balances;
|
|
168
|
+
- locked balances;
|
|
169
|
+
- capped open order IDs.
|
|
170
|
+
|
|
171
|
+
Detailed inventory fields are answer evidence only when the same response has `detailStatus: "available"` and `userAnswerUse.canAnswer` includes `deepbook_pool_account_inventory_when_pool_and_manager_are_supplied`.
|
|
172
|
+
|
|
173
|
+
When `detailStatus` is `manager_discovery_only`, `pool_key_required`, `manager_address_required`, `manager_address_not_discovered_for_active_account`, or `account_not_found`, use `detailStatus`, `managerAddresses`, `requested`, and `accountExists` when present. Those responses do not provide detailed inventory values such as `accountSummary`, `lockedBalances`, `openOrderIds`, or `openOrderCount`.
|
|
174
|
+
|
|
175
|
+
`accountSummary.*Balances` are BalanceManager ledger and rebate balances. `lockedBalances` are balances tied to open orders in the pool.
|
|
176
|
+
|
|
177
|
+
The response includes `openOrderCount` and `openOrderIdsTruncated` because returned `openOrderIds` are capped.
|
|
178
|
+
|
|
179
|
+
The tool uses `managerAddress` as the public input and registers it as an ephemeral pinned-SDK BalanceManager key internally.
|
|
180
|
+
|
|
181
|
+
Returned `quantitySemantics.kind: "deepbook_display_number"` means these `number` fields are presentation inventory facts only.
|
|
182
|
+
|
|
183
|
+
They are not raw balances, route liquidity, funding sources, withdrawal readiness, transaction-building inputs, signing data, or signing readiness.
|
|
184
|
+
|
|
185
|
+
`read.summarize_wallet_assets` accepts an optional `account` input for public-address coin balance snapshots.
|
|
186
|
+
|
|
187
|
+
When `account` is omitted, it uses the active account read context and returns `active_account_not_set` if no active account is set.
|
|
188
|
+
|
|
189
|
+
An explicit `account` read does not prove ownership, store the address as a known wallet, or create active account context.
|
|
190
|
+
|
|
191
|
+
The response includes `quantitySemantics.kind: "sui_wallet_balance_snapshot"`.
|
|
192
|
+
|
|
193
|
+
It marks transaction history, transaction receipt proof, transaction balance deltas, acquisition source, object provenance, fiat cash-out, P&L, and cost basis as not available.
|
|
194
|
+
|
|
195
|
+
Current balances can confirm only a current coin-balance snapshot. They cannot prove that a specific digest delivered that amount or that a still-held coin came from a specific transaction.
|
|
196
|
+
|
|
197
|
+
Raw balance fields remain the pinned Sui SDK integer strings from `client.core.listBalances`.
|
|
198
|
+
|
|
199
|
+
Each balance also includes `unit`; when verified decimals are available it includes `display.amount` as presentation-only decimal text.
|
|
200
|
+
|
|
201
|
+
Display conversion uses `client.core.getCoinMetadata` and a 24 hour local metadata cache keyed by normalized coin type plus verified mainnet chain identifier.
|
|
202
|
+
|
|
203
|
+
If local metadata cache read or write fails, wallet unit reads fail with `metadata_cache_unavailable` instead of guessing or treating the unit as unavailable.
|
|
204
|
+
|
|
205
|
+
If Sui metadata is unavailable, DeepBook-registered tokens can use pinned scalar fallback.
|
|
206
|
+
|
|
207
|
+
If no verified decimals exist, `unit.status` is `unavailable` and clients must not infer decimals from the token symbol.
|
|
208
|
+
|
|
209
|
+
`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`.
|
|
210
|
+
|
|
211
|
+
It wraps each coin balance in `classification.assetClass: "coin_balance"`, `classification.spendability`, and role labels such as `gas_candidate` or `deepbook_registered`.
|
|
212
|
+
|
|
213
|
+
It also returns `uninspectedAssetClasses` for staked or locked assets, DeepBook BalanceManager or open orders, LP or vault positions, and NFT or object assets.
|
|
214
|
+
|
|
215
|
+
These entries are explicit classifier-uninspected boundaries. They are not zero-balance claims and not spendable asset facts.
|
|
216
|
+
|
|
217
|
+
DeepBook account inventory is separate from coin-balance classification.
|
|
218
|
+
|
|
219
|
+
Inventory reporting for native staked SUI, locked or vesting assets, NFTs, generic objects, LP positions, or vault positions would not by itself make those assets funding sources.
|
|
220
|
+
|
|
221
|
+
It also would not make them route liquidity, payment readiness, portfolio completeness, transaction-building inputs, signing data, or signing readiness.
|
|
222
|
+
|
|
223
|
+
The classifier does not create funding plans, choose routes, create review sessions, return transaction bytes, or produce signing material.
|
|
224
|
+
|
|
225
|
+
`read.list_settlement_asset_groups` returns the supported natural-language settlement asset groups.
|
|
226
|
+
|
|
227
|
+
In this release, `SUI_USD_SETTLEMENT_ASSETS` maps aliases such as dollar, dollars, USD, USD-like, stablecoin, stablecoins, and Korean dollar-word wording.
|
|
228
|
+
|
|
229
|
+
The included USD-denominated assets must exist in the pinned `@mysten/deepbook-v3` mainnet token registry and be referenced by pinned DeepBook pools.
|
|
230
|
+
|
|
231
|
+
The asset group output includes included assets, excluded assets, source authority, and limitations.
|
|
232
|
+
|
|
233
|
+
This is static SDK registry evidence, not live liquidity, fiat USD support, payment execution, route recommendation, or signing readiness.
|
|
234
|
+
|
|
235
|
+
`read.summarize_settlement_asset_group_parity` returns internal parity evidence for a supported settlement asset group.
|
|
236
|
+
|
|
237
|
+
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`.
|
|
238
|
+
|
|
239
|
+
The response includes:
|
|
240
|
+
|
|
241
|
+
- each inspected group asset;
|
|
242
|
+
- direct DeepBook pool evidence when available;
|
|
243
|
+
- `parityPrice` as reference asset per group asset;
|
|
244
|
+
- `responseSummary` with minimum, maximum, mean, and median;
|
|
245
|
+
- `referenceAssetRole: "measurement_reference_not_settlement_choice"`.
|
|
246
|
+
|
|
247
|
+
Use `responseSummary` for questions about internal USD-denominated parity, highest/lowest stablecoin-like asset, or max/min/mean parity evidence.
|
|
248
|
+
|
|
249
|
+
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.
|
|
250
|
+
|
|
251
|
+
`read.preview_intent_evidence` accepts natural-language settlement evidence intents.
|
|
252
|
+
|
|
253
|
+
Use it this way:
|
|
254
|
+
|
|
255
|
+
- Coverage question: `intentKind: "cover_payment_like_amount"`, `denomination: "dollar"`, and `requiredDisplayAmount: "1000"`.
|
|
256
|
+
- AssetGroup-total question: `intentKind: "summarize_settlement_asset_group_balance"` and `denomination: "dollar"` without a target amount.
|
|
257
|
+
- Account scope: explicit public `account` or active account context.
|
|
258
|
+
|
|
259
|
+
For settlement-asset-only coverage, shortfall, and balance-total answers, use `responseSummary`.
|
|
260
|
+
|
|
261
|
+
The response also exposes `userAnswerUse.answerFields` with the response-specific answer path.
|
|
262
|
+
|
|
263
|
+
`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 `answerSourceStatus.canUseThisResponseForUserAnswer` 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.
|
|
264
|
+
|
|
265
|
+
`responseSummary` exposes:
|
|
266
|
+
|
|
267
|
+
- `questionKind`;
|
|
268
|
+
- `conclusionKind`;
|
|
269
|
+
- `answerCompleteness`;
|
|
270
|
+
- `doNotCallQuoteToolsForThisQuestion`;
|
|
271
|
+
- `coverageBasis: "settlement_asset_wallet_balance_only"`;
|
|
272
|
+
- `assetGroupId`;
|
|
273
|
+
- current, required, and shortfall display amounts;
|
|
274
|
+
- `amountsUsedForAnswer`;
|
|
275
|
+
- `separateQuoteOutputs`;
|
|
276
|
+
- `requiredUserChoices`;
|
|
277
|
+
- `doNotUseForConclusion`;
|
|
278
|
+
- `excludedFromConclusion`.
|
|
279
|
+
|
|
280
|
+
For payment coverage and shortfall conclusions, use only fields named by `responseSummary.amountsUsedForAnswer`. Treat fields named by `responseSummary.doNotUseForConclusion` or `responseSummary.excludedFromConclusion`, including separate quote results and assets outside the settlement asset group, as non-conclusion context.
|
|
281
|
+
|
|
282
|
+
Selected-target evidence is available only when `targetAssetSymbol` is paired with one of these sources:
|
|
283
|
+
|
|
284
|
+
- `targetAssetSelectionSource: "user_explicit"`;
|
|
285
|
+
- `targetAssetSelectionSource: "prior_user_explicit_context"`.
|
|
286
|
+
|
|
287
|
+
`targetAssetSymbol` without `targetAssetSelectionSource` is invalid.
|
|
288
|
+
|
|
289
|
+
Clients must not set a selection source for an agent-inferred target.
|
|
290
|
+
|
|
291
|
+
When the response returns `responseEvidence.mode: "selected_target_context"`, answer from the fields listed in `userAnswerUse.answerFields`, including `responseSummary`, `selectedTarget`, `candidateConversions`, and `requiredUserChoices`. Do not treat `responseSummary` alone as the complete selected-target answer.
|
|
292
|
+
|
|
293
|
+
Direct pool quote evidence for a selected target is supported only when the same response returns `responseEvidence.supportedResponseClaims` with `direct_pool_quote_evidence` and `userAnswerUse.canAnswer` with `direct_pool_quote_evidence_for_user_selected_target`. If those entries are absent, use the selected-target shortfall and required-user-choice fields only; do not claim quote evidence is available from that response.
|
|
294
|
+
|
|
295
|
+
`acceptedSourceAssetSymbols` can include only assets inside the same supported settlement asset group. Separate quote tool results for SUI, WAL, RWA, or other non-group assets do not count as payment coverage or shortfall evidence.
|
|
296
|
+
|
|
297
|
+
This tool does not silently choose USDC, USDT, or any settlement token for the user. It uses selected-target evidence only when the response has explicit selection provenance. It does not rank venues, choose routes, evaluate gas reserve, create review sessions, return transaction bytes, produce signing material, estimate fiat USD cash-out, or compute P&L.
|
|
298
|
+
|
|
299
|
+
Gas reserve remains outside the current evidence boundary. If any older fixture or utility output contains `gas_reserve_not_evaluated`, treat it only as an explicit non-evaluation marker, not as gas readiness or a policy result.
|
|
300
|
+
|
|
301
|
+
Review activity tools read only local Say Ur Intent review evidence.
|
|
302
|
+
|
|
303
|
+
They are not complete wallet transaction history, gas history, P&L, or external wallet activity.
|
|
304
|
+
|
|
305
|
+
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.
|
|
306
|
+
|
|
307
|
+
Successful review activity responses include `dataScope`, `accountSource`, `lowSampleWarning`, and `lowSampleThreshold`.
|
|
308
|
+
|
|
309
|
+
The current `lowSampleThreshold` is 5 local records, from `REVIEW_ACTIVITY_LOW_SAMPLE_THRESHOLD`.
|
|
310
|
+
|
|
311
|
+
When `lowSampleWarning` is true, treat counts as sparse local evidence and avoid drawing behavior patterns.
|
|
312
|
+
|
|
313
|
+
For `read.list_review_activity`, `dataScope.recordCount` is the full matching local review count.
|
|
314
|
+
|
|
315
|
+
The returned `activities` array can be shorter when `truncated.activities: true`.
|
|
316
|
+
|
|
317
|
+
`accountSource` reports how the read scope was selected; it is not proof of wallet ownership.
|
|
318
|
+
|
|
319
|
+
MCP error responses intentionally omit `structuredContent`; clients should read the JSON error payload from `content[0].text`.
|
|
320
|
+
|
|
321
|
+
`read.get_review_session_detail` transition rows include `isNoOp`.
|
|
322
|
+
|
|
323
|
+
A no-op transition is an observed lifecycle call whose stored status did not change, such as a repeated open or reconnect event.
|
|
324
|
+
|
|
325
|
+
`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.
|
|
326
|
+
|
|
327
|
+
Funnel summaries count distinct reviews and do not treat repeated no-op rows as additional completed steps.
|
|
328
|
+
|
|
329
|
+
Sui activity tools are user-requested read surfaces, not a background indexer.
|
|
330
|
+
|
|
331
|
+
Summary activity tools omit full transaction details by design. Digest-level detail is exposed by `read.inspect_sui_transaction`.
|
|
332
|
+
|
|
333
|
+
Tool roles:
|
|
334
|
+
|
|
335
|
+
- `read.inspect_sui_transaction` performs a single digest lookup.
|
|
336
|
+
- `read.scan_sui_account_activity` requests up to 100 account transactions for `affected` or `sent` relationship.
|
|
337
|
+
- `read.summarize_sui_activity_scan` reuses the live scan path and adds deterministic `analysis` without returning full `details`.
|
|
338
|
+
- `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`.
|
|
339
|
+
- `read.summarize_sui_account_activity` reads only local SQLite stored facts.
|
|
340
|
+
|
|
341
|
+
This is a bounded provider page, not complete wallet history.
|
|
342
|
+
|
|
343
|
+
Affected activity means the account appeared in returned transaction effects; it does not mean the account sent the transaction.
|
|
344
|
+
|
|
345
|
+
Live account scans use the pinned GraphQL `last`/`before` connection direction for recent-to-older pagination. Returned rows are ordered newest-first by returned checkpoint and timestamp facts.
|
|
346
|
+
|
|
347
|
+
Live scan and live-summary responses return `requestedAccountTransactionFacts`. This flattened requested-account row array pairs each digest with account-scoped fields and `requestedAccountEffect`. The response also returns `transactionDetailAvailability`, which counts returned `transactions` rows with and without source details. It includes `transactions[].transactionContext` in `userAnswerUse.answerFields` only when `transactionDetailAvailability.allReturnedTransactionsHaveDetails: true`.
|
|
348
|
+
|
|
349
|
+
`transactionContext` intentionally excludes transaction-wide balance-change aggregates.
|
|
350
|
+
|
|
351
|
+
Live scan and live-summary responses return `requestedAccountTransactionFacts` as an account-scoped row surface with `requestedAccountEffect`. When `transactionContext` is present, it omits transaction-wide balance-change aggregates.
|
|
352
|
+
|
|
353
|
+
Function activity boundaries:
|
|
354
|
+
|
|
355
|
+
- The filter uses only the verified `function + sentAddress` GraphQL combination.
|
|
356
|
+
- The `function` input must be exactly `package::module::function`.
|
|
357
|
+
- Package-only, `package::module`, generic, and type-argument suffix forms are unsupported.
|
|
358
|
+
- Function scans do not include recipient-only activity, affected-address-only activity, affected-object-only activity, global function history, or complete dApp history.
|
|
359
|
+
- Empty function activity results mean no matching rows were returned in the bounded page; they do not prove no matching activity exists.
|
|
360
|
+
- The internal `accepted_empty` classifier result is not user-facing tool output.
|
|
361
|
+
|
|
362
|
+
Stored summary boundaries:
|
|
363
|
+
|
|
364
|
+
- Stored summaries aggregate local account-level facts from digest lookups, account scans, or sent-function scans.
|
|
365
|
+
- Scan kind is internal provenance.
|
|
366
|
+
- Stored summary input does not accept `kind`, `function`, or function-history filters.
|
|
367
|
+
- Legacy `summary` is the backward-compatible shallow count block.
|
|
368
|
+
- `analysis.overview.transactionCount` mirrors the stored count.
|
|
369
|
+
- `analysis.overview.analyzedTransactionCount` reports how many returned rows fed the richer aggregations.
|
|
370
|
+
- `transactionDetailAvailability` counts returned stored rows with `details`. `userAnswerUse.answerFields` includes `transactions[].compact` and `transactions[].details` only when `transactionDetailAvailability.allReturnedTransactionsHaveDetails: true`.
|
|
371
|
+
|
|
372
|
+
Coverage and pagination boundaries:
|
|
373
|
+
|
|
374
|
+
- `orderingVerified: false` means the provider page was not monotonic by returned checkpoint or timestamp facts.
|
|
375
|
+
- Treat unverified ordering as unproven coverage.
|
|
376
|
+
- Checkpoint bounds are inclusive user bounds translated to the pinned GraphQL API's exclusive checkpoint filters.
|
|
377
|
+
- Timestamp bounds are page filters and coverage signals, not GraphQL provider filters.
|
|
378
|
+
- Continue with `continuationCursor` until `windowComplete` proves coverage or the provider cannot continue.
|
|
379
|
+
- Provider retention and rate-limit behavior are endpoint/operator properties, not Say Ur Intent guarantees.
|
|
380
|
+
- Empty pages, bounded pages, and stored local summaries are not complete wallet or dApp history.
|
|
381
|
+
|
|
382
|
+
Local persistence boundaries:
|
|
383
|
+
|
|
384
|
+
- The default account is the active account.
|
|
385
|
+
- An explicit account is allowed as a read filter.
|
|
386
|
+
- The local DB stores only normalized facts for transactions tied to a known account by returned sender or balance-change owner facts.
|
|
387
|
+
- Function activity scans store only sender-matching rows for known accounts.
|
|
388
|
+
- Provider-returned account scan rows that cannot prove the local relation can appear in the current response but are counted as skipped for storage.
|
|
389
|
+
- Function activity scans drop any provider row whose sender does not match the requested account before it reaches the tool `transactions` response.
|
|
390
|
+
- When a known-account scan is stored, dropped function rows are counted as skipped and are not stored as transaction facts.
|
|
391
|
+
|
|
392
|
+
Detail boundaries:
|
|
393
|
+
|
|
394
|
+
- Inspect responses can include live provider detail fields for the current response, including account addresses returned by GraphQL.
|
|
395
|
+
- Live scan, live-summary, function-scan, and function-summary rows expose `transactionContext` for transaction-level calls, objects, events, gas, errors, truncation, and protocol labels only when source details are present.
|
|
396
|
+
- Inspect and stored-summary rows can include `compact` when details are available.
|
|
397
|
+
- `userAnswerUse.answerFields` omits `transactionContext`, `compact`, `details`, and requested-account effect fields that are absent from the current response.
|
|
398
|
+
- For array paths such as `transactions[].transactionContext`, `transactions[].compact`, and `transactions[].details`, `userAnswerUse.answerFields` lists the path only when every returned `transactions` row has that field. If only some rows have details, use `transactionDetailAvailability` and inspect the specific rows or follow-up digest lookup instead.
|
|
399
|
+
- Compact balance changes can aggregate repeated ownerless raw changes with `count`.
|
|
400
|
+
- Compact balance changes are transaction-level facts, not requested-wallet balance evidence.
|
|
401
|
+
- `analysis.coinFlows` is a transaction/page aggregate, not wallet-specific evidence.
|
|
402
|
+
|
|
403
|
+
For wallet/account-specific balance answers, use requested-account fields:
|
|
404
|
+
|
|
405
|
+
- `requestedAccountTransactionFacts`;
|
|
406
|
+
- `requestedAccount.coinFlows`;
|
|
407
|
+
- `transactions[].requestedAccountEffect`.
|
|
408
|
+
|
|
409
|
+
These fields are raw integer facts scoped to the requested account.
|
|
410
|
+
|
|
411
|
+
Row-level `requestedAccountEffect.scope` is `requested_account`.
|
|
412
|
+
|
|
413
|
+
These requested-account fields summarize the requested account's evidence for that transaction:
|
|
414
|
+
|
|
415
|
+
- `requestedAccountEffect.role`;
|
|
416
|
+
- `requestedAccountEffect.balanceChangeEvidence`;
|
|
417
|
+
- `requestedAccountEffect.accountBalanceChangeAbsenceProven`;
|
|
418
|
+
- `requestedAccountEffect.accountBalanceChangeInferencePolicy`;
|
|
419
|
+
- `requestedAccountEffect.coinFlows`;
|
|
420
|
+
- `requestedAccountEffect.limitations`.
|
|
421
|
+
|
|
422
|
+
`requestedAccountEffect.limitations` is part of the requested-account evidence boundary.
|
|
423
|
+
|
|
424
|
+
Incomplete balance evidence means unknown, not zero:
|
|
425
|
+
|
|
426
|
+
- `accountBalanceChangeEvidence: "incomplete_account_balance_changes"` is not zero-balance evidence.
|
|
427
|
+
- `accountBalanceChangeEvidence: "account_balance_changes_unavailable"` is not zero-balance evidence.
|
|
428
|
+
- `accountBalanceChangeInferencePolicy: "do_not_infer_from_transaction_context"` means transaction-level context, compact counts, or visible recipient patterns must not be used to infer the requested account's amount.
|
|
429
|
+
- Only `accountBalanceChangeAbsenceProven: true` supports saying no requested-account balance change was returned.
|
|
430
|
+
- `no_account_balance_changes_returned` is complete evidence only when requested-account balance-change evidence is complete.
|
|
431
|
+
- If `requestedAccount.balanceChangeCompleteness` or a row-level `requestedAccountEffect.balanceChangeCompleteness` is `truncated` or `unavailable`, the account-specific balance-change evidence is incomplete.
|
|
432
|
+
|
|
433
|
+
`analysis` aggregates only normalized facts:
|
|
434
|
+
|
|
435
|
+
- raw integer coin flows;
|
|
436
|
+
- gas totals;
|
|
437
|
+
- Move call targets;
|
|
438
|
+
- object and event counts;
|
|
439
|
+
- failure details;
|
|
440
|
+
- protocol counts keyed by `protocolMatches[].protocolId`.
|
|
441
|
+
|
|
442
|
+
`protocolMatches` are derived from package, module, function, event, object, or shared-object evidence already present in normalized details.
|
|
443
|
+
|
|
444
|
+
Package-derived evidence can include `mvrName` and `packageSource` when a verified MVR current package resolution was used.
|
|
445
|
+
|
|
446
|
+
Protocol matches and analysis are not a supported-protocol list, wallet position inventory, P&L, route recommendation, transaction-building input, signing data, or signing readiness.
|
|
447
|
+
|
|
448
|
+
Stored summaries return sanitized normalized details and omit non-known party account addresses.
|
|
449
|
+
|
|
450
|
+
Stored transaction details can include capped Move call targets, raw coin balance changes, object changes, event summaries, gas cost facts, execution error facts, and truncation flags when GraphQL returns them.
|
|
451
|
+
|
|
452
|
+
Balance quantities use signed raw integer strings from returned `*Raw` fields, including:
|
|
453
|
+
|
|
454
|
+
- `details.balanceChanges[].amountRaw`;
|
|
455
|
+
- `requestedAccount.coinFlows[].*Raw`;
|
|
456
|
+
- `requestedAccountTransactionFacts[].accountBalanceChanges[].amountRaw`;
|
|
457
|
+
- `requestedAccountTransactionFacts[].requestedAccountEffect.balanceChanges[].amountRaw`;
|
|
458
|
+
- `transactions[].requestedAccountEffect.balanceChanges[].amountRaw`;
|
|
459
|
+
- `transactions[].requestedAccountEffect.coinFlows[].*Raw`.
|
|
460
|
+
|
|
461
|
+
`requestedAccountTransactionFacts[].requestedAccountEffect.balanceChanges[].amountRaw` is one of the requested-account raw amount fields.
|
|
462
|
+
|
|
463
|
+
There is no `details.balanceChanges[].amount` field.
|
|
464
|
+
|
|
465
|
+
`requestedAccountTransactionFacts[].accountBalanceChangeAbsenceProven` is a boolean absence-proof flag, not an amount.
|
|
466
|
+
|
|
467
|
+
Gas raw values use MIST in fields such as:
|
|
468
|
+
|
|
469
|
+
- `details.gas.netGasCostRaw`;
|
|
470
|
+
- `requestedAccountTransactionFacts[].transactionContext.gasNetCostRaw`;
|
|
471
|
+
- `analysis.gas.netGasCostRaw`.
|
|
472
|
+
|
|
473
|
+
When `gasCost` or `analysis.gas.netGasCost` is present, its `display` field is the SUI display conversion using `@mysten/sui MIST_PER_SUI`.
|
|
474
|
+
|
|
475
|
+
Summary rows can include `lastScanIncompleteReason`. When it is present, treat the row as stored evidence from an incomplete or unverified scan before using it as behavioral evidence.
|
|
476
|
+
|
|
477
|
+
Unknown explicit accounts, unrelated digest lookups, rows outside the requested window, rows that fail sender checks, rows that fail local storage-relation checks, and dropped function rows are not stored as transaction facts.
|
|
478
|
+
|
|
479
|
+
The tools do not store raw GraphQL payloads, transaction bytes, signatures, BCS payloads, non-known party account addresses, P&L, route recommendations, or signing material.
|
|
480
|
+
|
|
481
|
+
do not treat `transaction.status: "unknown"` as a not-found signal.
|
|
482
|
+
|
|
483
|
+
Protocol matches are transaction activity labels only.
|
|
484
|
+
|
|
485
|
+
Transaction activity responses include `quantitySemantics`.
|
|
486
|
+
|
|
487
|
+
They also include `userAnswerUse`. For account-specific activity answers, start with `userAnswerUse.answerFields`; it points to requested-account fields before transaction-level context.
|
|
488
|
+
|
|
489
|
+
It marks balance `amountRaw`, `increaseRaw`, `decreaseRaw`, and `netRaw` fields as raw integer facts.
|
|
490
|
+
|
|
491
|
+
It also exposes `displayConversionRequires` and `display_conversion_without_verified_decimals` boundaries for token display conversion.
|
|
492
|
+
|
|
493
|
+
Do not convert raw token amounts into display units unless the response includes verified decimals or a display amount for that asset.
|
|
494
|
+
|
|
495
|
+
Gas is the one built-in exception. `gasCost.display` and `analysis.gas.netGasCost.display`, when present, are returned SUI display facts from the pinned Sui MIST conversion.
|
|
496
|
+
|
|
497
|
+
If only raw token facts are available, answer token amounts in raw units.
|
|
498
|
+
|
|
499
|
+
For function scans, the GraphQL `sentAddress` filter is expected to return only sender-matching rows for the requested account.
|
|
500
|
+
|
|
501
|
+
The local sender check is defensive. A non-conforming provider row is dropped from the tool response before storage selection.
|
|
502
|
+
|
|
503
|
+
For a stored known-account scan, the dropped row contributes only to skipped counts. It is not treated as valid function history.
|
|
504
|
+
|
|
505
|
+
`read.scan_sui_account_activity` and `read.scan_sui_function_activity` return pagination and coverage fields:
|
|
506
|
+
|
|
507
|
+
- `hasMore`;
|
|
508
|
+
- `continuationCursor`;
|
|
509
|
+
- `windowComplete`;
|
|
510
|
+
- `orderingVerified`;
|
|
511
|
+
- optional `incompleteReason`.
|
|
512
|
+
|
|
513
|
+
`windowComplete: null` means the user asked for the latest N results without a lower bound.
|
|
514
|
+
|
|
515
|
+
`windowComplete: true` means the requested lower checkpoint or timestamp was reached, or the provider reported no more matching transactions.
|
|
516
|
+
|
|
517
|
+
`windowComplete: false` means coverage could not be proven.
|
|
518
|
+
|
|
519
|
+
Provider cursors are opaque and best-effort. Cursor rejection returns a safe error and does not create a complete-history claim.
|
|
520
|
+
|
|
521
|
+
Tool source comparison:
|
|
522
|
+
|
|
523
|
+
- `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.
|
|
524
|
+
- Those live rows include requested-account fields, transaction context, and `detailLookup` references but no full `details`.
|
|
525
|
+
- The summary tools also return deterministic `analysis`.
|
|
526
|
+
- `read.inspect_sui_transaction` is the full normalized detail path for a specific digest.
|
|
527
|
+
- `read.summarize_sui_account_activity` reads only stored normalized facts from local SQLite.
|
|
528
|
+
|
|
529
|
+
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.
|
|
530
|
+
|
|
531
|
+
## Action Tools
|
|
532
|
+
|
|
533
|
+
| Tool | Status | Purpose |
|
|
534
|
+
| --- | --- | --- |
|
|
535
|
+
| `action.prepare_sui_action_review` | Blocked signing | Creates a local review session and review URL for a supported action proposal. Account-bound DeepBook review 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, and review-time simulation evidence. The tool does not return transaction bytes. |
|
|
536
|
+
| `action.prepare_external_proposal_review` | Non-signable review | Creates a local review session and review URL from an untrusted structured external proposal. It does not return transaction bytes. |
|
|
537
|
+
|
|
538
|
+
`action.prepare_sui_action_review` is account-bound: a swap review computes
|
|
539
|
+
its evidence (balances, transaction material, digest, simulation) for a
|
|
540
|
+
specific sender, so the tool requires an active wallet account. Connect first
|
|
541
|
+
with `session.create_wallet_identity`; with no active account the tool returns
|
|
542
|
+
`active_account_not_set` with `details.action: "connect_wallet_identity"`
|
|
543
|
+
instead of creating a proposal that can never be computed or signed. The
|
|
544
|
+
review page reads that account from the server as the single source of truth
|
|
545
|
+
and never connects a wallet itself.
|
|
546
|
+
|
|
547
|
+
`action.prepare_sui_action_review` accepts a protocol-neutral swap `intent`
|
|
548
|
+
(`type: "swap"`, `from.symbol`, `from.amount`, `to.symbol`,
|
|
549
|
+
`maxSlippageBps`, optional `protocol`). The optional `protocol` field carries
|
|
550
|
+
the protocol slug from the adapter registry (the same slug vocabulary as the
|
|
551
|
+
prompt surfaces). With a single registered protocol for the action it may be
|
|
552
|
+
omitted; once several protocols support the same action the tool returns
|
|
553
|
+
`input_invalid` with `reason: "protocol_choice_required"` and
|
|
554
|
+
`availableProtocols`, and the caller must ask the user and retry with
|
|
555
|
+
`intent.protocol` set - the server never picks a venue silently. An unknown
|
|
556
|
+
slug returns `reason: "unknown_protocol"` with the available slugs.
|
|
557
|
+
|
|
558
|
+
`action.prepare_external_proposal_review` accepts `proposal` with `type:
|
|
559
|
+
"payment"` or `type: "sui_action"`.
|
|
560
|
+
|
|
561
|
+
Common required fields are `id`, `source`, `network: "sui:mainnet"`,
|
|
562
|
+
`createdAt`, and `purpose`. `expiresAt`, `assumptions`, and
|
|
563
|
+
`requiredUserChoices` are optional.
|
|
564
|
+
|
|
565
|
+
Payment proposals include `payment.amount`, `payment.recipient`, and optional
|
|
566
|
+
`payment.target`.
|
|
567
|
+
|
|
568
|
+
Sui action proposals include `action.actionKind`, `action.target`, optional
|
|
569
|
+
`action.recipient`, and optional `action.assetFlow` entries.
|
|
570
|
+
|
|
571
|
+
Proposal amount fields use `amountDisplay` and `amountKind:
|
|
572
|
+
"display_proposal"`. `amountDisplay` must be positive decimal display text such
|
|
573
|
+
as `100`, `100.25`, or `0.5`. Signs, commas, exponent notation, unit labels,
|
|
574
|
+
prose, and zero values are rejected. These fields are display proposal facts
|
|
575
|
+
only. They are not raw amounts or minimum outputs. They are not
|
|
576
|
+
transaction-building inputs. They are not signing data or signing readiness.
|
|
577
|
+
|
|
578
|
+
The external proposal schema is strict. Fields outside the contract, including
|
|
579
|
+
executable material such as transaction bytes, serialized transactions, signing
|
|
580
|
+
requests, private-key material, signatures, seeds, mnemonics, or a
|
|
581
|
+
route-selected plan, are rejected rather than stored as review authority.
|
|
582
|
+
Allowed text fields are also length-bounded and rejected when they contain
|
|
583
|
+
executable-material terms, private-key terms, signing-request terms,
|
|
584
|
+
route-selected-plan terms, recognized Sui private-key strings, valid English
|
|
585
|
+
BIP39 mnemonic phrases, long encoded payloads, or raw secret-like hex/base64
|
|
586
|
+
payloads in fields that are not Sui identifier fields.
|
|
587
|
+
|
|
588
|
+
Successful responses return `plans[].reviewModel`.
|
|
589
|
+
|
|
590
|
+
Use these `reviewModel` fields for the proposal review answer:
|
|
591
|
+
|
|
592
|
+
- `proposedAction`: what the external proposal asks to do;
|
|
593
|
+
- `assetFlow`: outgoing, expected incoming, and fee display proposal facts;
|
|
594
|
+
- `recipients` and `targets`: recipient or action target facts supplied by the
|
|
595
|
+
proposal;
|
|
596
|
+
- `evidenceUsed`: local schema and proposal facts used for the review;
|
|
597
|
+
- `missingEvidence`: wallet, recipient, target, simulation, or adapter evidence
|
|
598
|
+
not yet verified;
|
|
599
|
+
- `requiredUserChoices`: choices that remain with the user;
|
|
600
|
+
- `unsupportedClaims`: conclusions the review does not support;
|
|
601
|
+
- `freshness`: timestamp status for the proposal;
|
|
602
|
+
- `blockingChecks`: checks that keep the review blocked or warning-only;
|
|
603
|
+
- `nonSignableReason`: why the review has no sign action.
|
|
604
|
+
|
|
605
|
+
Account-bound review computation for external proposals returns `blocked` with
|
|
606
|
+
`blockedReason: "proposal_review_only"`. This means the local review layer
|
|
607
|
+
recorded the proposal facts but did not build, regenerate, simulate, or verify
|
|
608
|
+
transaction material.
|
|
609
|
+
|
|
610
|
+
When every review evidence stage completes, the account-bound DeepBook swap
|
|
611
|
+
review reaches `ready_for_wallet_review` and the local review page offers a
|
|
612
|
+
digest-gated byte handoff, user-controlled wallet signing, and execution-receipt
|
|
613
|
+
recording.
|
|
614
|
+
|
|
615
|
+
The MCP layer never signs, executes, or returns transaction bytes; the
|
|
616
|
+
digest-verified bytes stay in the local review-server session and reach the
|
|
617
|
+
user's wallet only on the page.
|
|
618
|
+
|
|
619
|
+
After the wallet account is bound to a review session, the review page and `session.get_review_status` may show scoped DeepBook display-amount quote evidence and review-state checks for:
|
|
620
|
+
|
|
621
|
+
- resolved direct pool;
|
|
622
|
+
- raw quote evidence;
|
|
623
|
+
- quote freshness;
|
|
624
|
+
- derived raw min-out policy;
|
|
625
|
+
- DEEP fee raw evidence;
|
|
626
|
+
- local unsigned transaction material build when that stage completes;
|
|
627
|
+
- an internal Sui transaction digest commitment bound to the stored local material when that stage completes;
|
|
628
|
+
- object ownership evidence derived from stored local material and Sui owner/type reads when that stage completes.
|
|
629
|
+
- human-readable review facts derived from the material-bound quote policy,
|
|
630
|
+
object ownership evidence, and internal digest binding when that stage
|
|
631
|
+
completes.
|
|
632
|
+
- review-time simulation evidence derived from simulating the stored local
|
|
633
|
+
unsigned transaction material with validation checks enabled when that stage
|
|
634
|
+
completes.
|
|
635
|
+
|
|
636
|
+
When those account-bound review stages run, `reviewState.adapterLifecycle` may
|
|
637
|
+
list `stageCatalogId`, `completedStages`, and `missingStages` for the DeepBook
|
|
638
|
+
adapter lifecycle. `stageCatalogId` identifies the adapter-owned stage catalog;
|
|
639
|
+
it is not a core lifecycle enum shared by every protocol adapter.
|
|
640
|
+
Completed stages are review progress only. If
|
|
641
|
+
`transaction_material_build_or_verify` is completed, it means the local review
|
|
642
|
+
server built unsigned transaction material and kept the bytes internal. If
|
|
643
|
+
`digest_commitment` is completed, it means the server internally derived a Sui
|
|
644
|
+
transaction digest from that stored material; the digest value and transaction
|
|
645
|
+
bytes are not MCP or review-app outputs. Missing stages explain why the review
|
|
646
|
+
remains blocked. This lifecycle covers review evidence producer stages through
|
|
647
|
+
review-time simulation. Wallet handoff, wallet signing, and execution receipts
|
|
648
|
+
are not adapter lifecycle stages; they happen after the lifecycle completes,
|
|
649
|
+
through the digest-gated handoff and user-controlled signing on the local
|
|
650
|
+
review page.
|
|
651
|
+
Public producer projections are tied to those stage states:
|
|
652
|
+
`reviewState.humanReadableReview` is valid only after `human_readable_review`
|
|
653
|
+
is completed and not listed as missing, and `reviewState.simulation` is valid
|
|
654
|
+
only after `review_time_simulation` is completed and not listed as missing.
|
|
655
|
+
|
|
656
|
+
When `reviewState.humanReadableReview` is present, it is displayable review
|
|
657
|
+
evidence projected from previously verified review artifacts. Its `kind`
|
|
658
|
+
currently identifies the first swap review projection. Its `assetFlow` raw
|
|
659
|
+
amounts, coin types, decimals, minimum output, and fee facts come from the
|
|
660
|
+
material-bound quote policy evidence. Its target pool and direction come from
|
|
661
|
+
the same quote source. Its object-ownership evidence reference comes from
|
|
662
|
+
stored transaction material and Sui owner/type reads. Use it to explain the
|
|
663
|
+
current local review facts only. Do not use it as transaction bytes, public transaction digest values, signing data, signing readiness, route quality, wallet handoff, or execution readiness. Any display amount in this field is
|
|
664
|
+
presentation context only and is not a signing or simulation input.
|
|
665
|
+
|
|
666
|
+
When `reviewState.simulation` is present, it is a public summary projected from
|
|
667
|
+
private review-time simulation evidence for the stored local transaction
|
|
668
|
+
material. It may include provider, enabled checks, success, raw Sui gas cost
|
|
669
|
+
summary components, balance changes, and object changes. It
|
|
670
|
+
does not expose transaction bytes or the internal transaction digest. It is not
|
|
671
|
+
wallet handoff, not signing data, not signing readiness, not execution
|
|
672
|
+
readiness, and not proof that a wallet has signed or submitted anything.
|
|
673
|
+
|
|
674
|
+
If the lifecycle runs through review-time simulation and every required
|
|
675
|
+
evidence artifact passes contract assembly, account-bound review returns
|
|
676
|
+
`ready_for_wallet_review` and records the schema-validated contract in
|
|
677
|
+
`reviewState.walletReviewAdapterContract`.
|
|
678
|
+
The contract carries the transaction commitment hash only; it is not
|
|
679
|
+
transaction bytes, not signing data, not signing readiness, and not
|
|
680
|
+
execution readiness.
|
|
681
|
+
If contract assembly declines, the review returns `blocked` with
|
|
682
|
+
`blockedReason: "wallet_review_contract_emit_missing"` and a failed
|
|
683
|
+
`deepbook_wallet_review_contract_emit_missing` check naming the concrete
|
|
684
|
+
reason. In both states, `reviewState.adapterLifecycle.missingStages` is empty
|
|
685
|
+
and the human-readable review plus simulation public summaries are present as
|
|
686
|
+
pre-signing review evidence. The contract-carrying state is
|
|
687
|
+
`ready_for_wallet_review`; the local review page can request the byte handoff,
|
|
688
|
+
which is refused unless the recomputed digest of the stored bytes equals the
|
|
689
|
+
reviewed commitment. Wallet signature requests and execution remain
|
|
690
|
+
unavailable in both states. The
|
|
691
|
+
`producer_stage_missing` reason applies only when
|
|
692
|
+
`reviewState.adapterLifecycle.missingStages` lists at least one missing review
|
|
693
|
+
evidence producer stage, and public projections for missing stages must not be
|
|
694
|
+
present.
|
|
695
|
+
If transaction material cannot be built, the review fails closed with a concrete
|
|
696
|
+
blocked or refresh reason. The fallback
|
|
697
|
+
`adapter_not_implemented` state still applies when no review evidence source is
|
|
698
|
+
available.
|
|
699
|
+
|
|
700
|
+
Those checks and lifecycle stages are pre-signing review evidence only. They do not expose transaction bytes, signing data, signing readiness, route recommendations, funding readiness, or a wallet-review-ready state.
|
|
701
|
+
|
|
702
|
+
Do not describe those checks as wallet readiness, signing readiness, route quality, or execution safety. Mention local transaction material only when `transaction_material_build_or_verify` is completed, and state that bytes remain internal. Mention digest commitment only when `digest_commitment` is completed, and state that it is an internal binding to stored material, not a public signing artifact.
|
|
703
|
+
|
|
704
|
+
In the current release, prepared review plans label `assetFlowPreview` entries with `amountKind: "display_intent"`.
|
|
705
|
+
|
|
706
|
+
Nested `assetFlowPreview.amount` strings remain display-intent text and are not raw signable quantities.
|
|
707
|
+
|
|
708
|
+
These amounts are explanation/display context only, including unresolved placeholders such as `amount: "unknown", approx: true`.
|
|
709
|
+
|
|
710
|
+
They are not minimum outputs, simulation results, or transaction-building inputs.
|
|
711
|
+
|
|
712
|
+
DeepBook transaction material build uses the derived raw quote policy in the
|
|
713
|
+
account-bound review layer, not `assetFlowPreview.amount` display strings.
|
|
714
|
+
|
|
715
|
+
Any adapter that returns a signable review contract must keep a separate
|
|
716
|
+
contract before any wallet handoff exists. The source-level contract is
|
|
717
|
+
`src/core/action/signableAdapterContract.ts`; the explanatory contract document
|
|
718
|
+
is `docs/SIGNABLE_ADAPTER_CONTRACT.md`.
|
|
719
|
+
|
|
720
|
+
That contract requires input provenance, source-of-truth records, typed evidence
|
|
721
|
+
claims for each safety-critical fact, raw integer amounts with verified
|
|
722
|
+
decimals, gas from review-time simulation, expiry checked at review time,
|
|
723
|
+
slippage or min-out policy when quote evidence is used, object ownership
|
|
724
|
+
evidence, simulation evidence, and the same human-readable review field concepts
|
|
725
|
+
exposed by `plans[].reviewModel`.
|
|
726
|
+
|
|
727
|
+
Payload fields in that contract must reference typed evidence claims.
|
|
728
|
+
The claims must resolve to source-of-truth records through the
|
|
729
|
+
`SAFETY_CRITICAL_FACT_MATRIX`; source id presence alone is not enough.
|
|
730
|
+
|
|
731
|
+
The contract also defines `PtbVisualizationArtifact`. A PTB visualization
|
|
732
|
+
artifact may expose Mermaid `flowchart` text, diagnostics, `generatedAt`,
|
|
733
|
+
`source`, and unsupported-use fields. It must report
|
|
734
|
+
`executableMaterial.included: false`.
|
|
735
|
+
|
|
736
|
+
PTB visualization is explanatory evidence only. It is not transaction-building
|
|
737
|
+
authority or wallet authorization. It is not signing data, not signing
|
|
738
|
+
readiness, not payment execution readiness, not route recommendation, and not a
|
|
739
|
+
replacement for review-time simulation.
|
|
740
|
+
|
|
741
|
+
The review layer renders the artifact when an account-bound review emits the
|
|
742
|
+
wallet review contract and the pinned renderer succeeds. The artifact is
|
|
743
|
+
returned as `reviewState.ptbVisualization` next to
|
|
744
|
+
`reviewState.walletReviewAdapterContract`. A renderer failure adds a warning
|
|
745
|
+
`deepbook_ptb_visualization_unavailable` check instead and does not invalidate
|
|
746
|
+
the emitted contract. PTB visualization is not a transaction builder,
|
|
747
|
+
not wallet handoff, and not a signing data source.
|
|
748
|
+
It is not a signing readiness signal. Review-state checks are pre-signing review evidence; wallet signing happens afterward on the local review page under the user's control.
|
|
749
|
+
|
|
750
|
+
## Session Tools
|
|
751
|
+
|
|
752
|
+
| Tool | Status | Purpose |
|
|
753
|
+
| --- | --- | --- |
|
|
754
|
+
| `session.create_wallet_identity` | Implemented | Creates a local wallet identity session and wallet URL for the same machine's system browser. |
|
|
755
|
+
| `session.get_wallet_identity` | Implemented | Polls a wallet identity session status; use `account.get_active_account` to confirm current active account context. |
|
|
756
|
+
| `session.wait_wallet_identity` | Implemented | Waits briefly for a wallet identity session to reach a terminal status. |
|
|
757
|
+
| `session.get_interaction_status` | Implemented | Reads active account context and pending in-memory wallet or review interactions. |
|
|
758
|
+
| `session.get_review_status` | Implemented | Reads internal and public review status for a `reviewSessionId`. |
|
|
759
|
+
| `session.get_execution_result` | Implemented | Reads public execution polling status and any recorded result for a `reviewSessionId`. |
|
|
760
|
+
| `session.wait_execution_result` | Implemented | Waits briefly for execution polling status to reach a wait-stopping status. |
|
|
761
|
+
|
|
762
|
+
Wallet identity URLs include a short-lived fragment token and are scoped to the local loopback review server.
|
|
763
|
+
|
|
764
|
+
Open them in the same machine's system browser, not in an MCP client sidebar or webview.
|
|
765
|
+
|
|
766
|
+
Wallet identity polling uses a 5 second interval because it waits on user wallet interaction. Execution polling remains separate.
|
|
767
|
+
|
|
768
|
+
Wait tools keep pending state in memory only. They return `timed_out` when the user has not finished yet and do not provide push notifications.
|
|
769
|
+
|
|
770
|
+
If the host forwards cancellation, wait tools return `request_aborted`. A local MCP server restart interrupts pending waits.
|
|
771
|
+
|
|
772
|
+
`session.get_interaction_status` returns active account context plus the latest five pending wallet and review interactions by `lastActivityAt`, with `limit` and `truncated` fields for each list.
|
|
773
|
+
|
|
774
|
+
For review interactions, pending means the review session is not in a final execution status. `pendingReviewSessions.items[].statusCategory` may be `non_terminal`, `awaiting_chain_result`, or `user_action_required`. Final statuses `success`, `failure`, and `expired` are excluded from `pendingReviewSessions`.
|
|
775
|
+
|
|
776
|
+
`session.get_review_status` returns both `pollingStatus` and `statusCategory` for the requested review session, so a client can distinguish final results from statuses that still require user or review-flow action.
|
|
777
|
+
|
|
778
|
+
For execution waits, use `statusCategory` and the execution `pollingHint` fields instead of treating every wait stop as a final result.
|
|
779
|
+
|
|
780
|
+
`pollingHint.waitStoppingStatuses` lists statuses where wait tools may stop returning `timed_out`.
|
|
781
|
+
|
|
782
|
+
`pollingHint.finalStatuses` lists final result statuses: `success`, `failure`, and `expired`.
|
|
783
|
+
|
|
784
|
+
`pollingHint.userActionRequiredStatuses` lists statuses that require user or review-flow action: `refresh_required` and `blocked`.
|
|
785
|
+
|
|
786
|
+
For execution waits, `signed_pending_result` is categorized as `awaiting_chain_result`.
|
|
787
|
+
|
|
788
|
+
That means signing has already happened and the wait is observing the chain result.
|
|
789
|
+
|
|
790
|
+
`blocked` and `refresh_required` are wait-stopping statuses, but they are not final success or failure.
|
|
791
|
+
|
|
792
|
+
Execution result transitions are owned by the local review-server browser flow. MCP wait tools observe those transitions and do not produce signing results.
|
|
793
|
+
|
|
794
|
+
Session status and wait tools may lazily mark expired local sessions while reading, so session lifecycle tools are annotated `readOnlyHint: false`.
|
|
795
|
+
|
|
796
|
+
`read.summarize_wallet_assets` and `read.classify_wallet_assets` may populate the local positive coin metadata cache while reading balances, so they are also annotated `readOnlyHint: false`.
|
|
797
|
+
|
|
798
|
+
These tools still do not execute transactions, sign, create custody, or produce signing material.
|
|
799
|
+
|
|
800
|
+
Wallet identity, interaction status, review status, and execution polling responses expose `userAnswerUse` when the response needs user-answer guidance. For those responses, use status and polling fields only for local read-context or review-flow state. Do not turn them into login, wallet authorization, execution guarantees, signing data, or signing readiness.
|
|
801
|
+
|
|
802
|
+
The following remain read-only product evidence tools:
|
|
803
|
+
|
|
804
|
+
- `read.preview_intent_evidence`;
|
|
805
|
+
- `read.list_settlement_asset_groups`;
|
|
806
|
+
- `read.quote_deepbook_display_amount`;
|
|
807
|
+
- `read.summarize_deepbook_account_inventory`;
|
|
808
|
+
- `account.get_active_account`.
|
|
809
|
+
|
|
810
|
+
They only expose current read evidence, active account context, static SDK registry metadata, or pinned SDK simulation facts. Any metadata-cache population is implementation-local and does not expand product authority.
|
|
811
|
+
|
|
812
|
+
## Account Tools
|
|
813
|
+
|
|
814
|
+
| Tool | Status | Purpose |
|
|
815
|
+
| --- | --- | --- |
|
|
816
|
+
| `account.get_active_account` | Implemented | Reads the active wallet-account read context. |
|
|
817
|
+
| `account.clear_active_account` | Implemented | Clears the active wallet-account read context. |
|
|
818
|
+
|
|
819
|
+
## Settings Tools
|
|
820
|
+
|
|
821
|
+
| Tool | Status | Purpose |
|
|
822
|
+
| --- | --- | --- |
|
|
823
|
+
| `settings.create_local_settings_session` | Implemented | Creates a same-machine local settings page session. |
|
|
824
|
+
| `settings.get_local_settings` | Implemented | Reads local Say Ur Intent settings, including effective Sui gRPC and GraphQL endpoint sources. |
|
|
825
|
+
|
|
826
|
+
Settings MCP tools are session-gateway/read tools, not direct mutators.
|
|
827
|
+
|
|
828
|
+
The settings page can change local settings after settings-token validation:
|
|
829
|
+
|
|
830
|
+
- stored Sui gRPC or GraphQL endpoint;
|
|
831
|
+
- default endpoint restoration;
|
|
832
|
+
- active account read context clearing;
|
|
833
|
+
- logical local data reset;
|
|
834
|
+
- local data export;
|
|
835
|
+
- replace-only local data import.
|
|
836
|
+
|
|
837
|
+
These actions do not sign, execute, create custody, or produce signing material.
|
|
838
|
+
|
|
839
|
+
Endpoint changes apply after MCP server restart.
|
|
840
|
+
|
|
841
|
+
Custom providers can affect read data quality, so use trusted mainnet providers.
|
|
842
|
+
|
|
843
|
+
## Resources
|
|
844
|
+
|
|
845
|
+
| URI | Purpose |
|
|
846
|
+
| --- | --- |
|
|
847
|
+
| `sayurintent://docs/readme` | Public entry document: product purpose, current release boundary, setup path, and documentation map. |
|
|
848
|
+
| `sayurintent://docs/mcp-setup` | Setup guide: installation, MCP client connection, first-use flow, settings, and troubleshooting. |
|
|
849
|
+
| `sayurintent://docs/mcp-tools` | API reference: tool contracts, response fields, statuses, follow-up fields, and output boundaries. |
|
|
850
|
+
| `sayurintent://docs/wallet-identity` | Wallet identity reference: active-account read context and same-machine capture boundaries. |
|
|
851
|
+
| `sayurintent://docs/agent-behavior` | Answer playbook: user-question flows, tool selection, and response wording boundaries. |
|
|
852
|
+
| `sayurintent://protocols/deepbook-v3` | Protocol reference only; use MCP tool responses and `read.list_supported_protocols` for current support. |
|
|
853
|
+
| `sayurintent://protocols/deepbook-margin` | Protocol reference only; no margin MCP read tools or signable actions are exposed in this release. |
|
|
854
|
+
|
|
855
|
+
Only allowlisted mainnet protocol references are exposed as MCP resources.
|
|
856
|
+
|
|
857
|
+
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.
|
|
858
|
+
|
|
859
|
+
MCP resources are runtime-facing references that connected AI clients can read.
|
|
860
|
+
|
|
861
|
+
They are different from contributor-only documents such as `AGENTS.md`, `docs/AGENT_DEVELOPMENT_POLICY.md`, implementation architecture notes, utility indexes, and ignored local planning notes.
|
|
862
|
+
|
|
863
|
+
If an answer behavior must affect AI clients, it belongs in server instructions, an MCP resource, an MCP prompt, schemas, or returned evidence fields, with tests.
|
|
864
|
+
|
|
865
|
+
Do not rely on contributor-only documents as the runtime source of agent behavior.
|
|
866
|
+
|
|
867
|
+
## Prompts
|
|
868
|
+
|
|
869
|
+
| Prompt | Purpose |
|
|
870
|
+
| --- | --- |
|
|
871
|
+
| `inspect-supported-sui-actions` | Guides a user through checking server status and supported mainnet surfaces. |
|
|
872
|
+
| `prepare-reviewable-sui-action` | Guides a user through the review-session flow without claiming unsupported signing support. |
|
|
873
|
+
| `swap-deep` | Prepares a reviewable DeepBook swap from a one-line intent argument (any language), e.g. `10 sui to usdc`. |
|
|
874
|
+
| `swap-flowx` | Prepares a reviewable FlowX CLMM swap from a one-line intent argument (any language), e.g. `10 sui to usdc`. |
|
|
875
|
+
| `swap` | Bare-action prompt, always registered. With one protocol it routes straight there; with several it takes an optional `protocol` argument (completion suggests the slugs) and instructs the model to list the options and ask the user - never to pick a venue silently. |
|
|
876
|
+
|
|
877
|
+
Adapter prompt surfaces are declared per adapter in
|
|
878
|
+
`src/adapters/adapterPromptSurfaces.ts` and validated against
|
|
879
|
+
`adapterPromptSurfaceSchema`. Names are action-first
|
|
880
|
+
(`<action>-<protocolSlug>`, e.g. `swap-deep`), so autocomplete groups by what
|
|
881
|
+
the user wants to do; the bare action prompt stays registered as protocols
|
|
882
|
+
are added, and once several protocols share an action it asks the user to
|
|
883
|
+
choose (optional `protocol` argument with completion), so it never silently
|
|
884
|
+
picks a venue. Each surface takes exactly one
|
|
885
|
+
free-text `intent` argument so MCP clients can pass the whole request in one
|
|
886
|
+
line; the model parses the intent, the server never does. Platform boundary
|
|
887
|
+
language (no signing data, no transaction bytes, local-review-only signing) is
|
|
888
|
+
appended at registration time and cannot be weakened by an adapter. Prompts
|
|
889
|
+
are standard MCP `prompts/list` entries, so any MCP client that surfaces
|
|
890
|
+
prompts (Claude Desktop, Claude Code, and others) exposes them without extra
|
|
891
|
+
configuration.
|
|
892
|
+
|
|
893
|
+
Prompts are explicit runtime-facing workflows. Tool descriptions remain concise, literal, and instruction-free; do not move behavioral policy into tool descriptions.
|