@zktx.io/sui-mcp 0.5.0 → 0.6.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 +6 -6
  2. package/dist/adapters/deepbook/deepbookTransactionMaterialProducer.js +3 -3
  3. package/dist/core/activity/localDataService.js +71 -52
  4. package/dist/core/activity/localDataValidation.js +1 -3
  5. package/dist/core/activity/sqliteActivityStore.js +24 -16
  6. package/dist/core/activity/sqliteActivityStoreSchema.js +83 -12
  7. package/dist/core/preferences/sqlitePreferencesRepository.js +5 -3
  8. package/dist/core/session/cardSession.js +1 -1
  9. package/dist/core/session/cardSessionStore.js +53 -3
  10. package/dist/core/session/sessionStore.js +0 -17
  11. package/dist/core/session/settingsFileIdentity.js +11 -0
  12. package/dist/core/session/settingsFileProtocol.js +25 -0
  13. package/dist/core/session/settingsFileStore.js +346 -0
  14. package/dist/core/session/settingsInputError.js +34 -0
  15. package/dist/core/session/settingsOperation.js +224 -0
  16. package/dist/core/session/settingsPreparationSql.js +15 -0
  17. package/dist/core/session/settingsWorkflow.js +1219 -0
  18. package/dist/core/session/sqliteSessionStore.js +0 -40
  19. package/dist/core/session/sqliteSettingsWorkflowStore.js +463 -0
  20. package/dist/core/session/sqliteWalletWorkflowStore.js +164 -41
  21. package/dist/core/session/status.js +2 -2
  22. package/dist/core/session/walletConnection.js +27 -8
  23. package/dist/core/session/walletWorkflow.js +73 -15
  24. package/dist/core/session/workflowState.js +16 -8
  25. package/dist/core/session/workflowView.js +18 -2
  26. package/dist/mcp/responseGuidance.js +10 -5
  27. package/dist/mcp/serverInfo.js +3 -4
  28. package/dist/mcp/toolNames.js +2 -2
  29. package/dist/mcp/tools/account/index.js +1 -19
  30. package/dist/mcp/tools/read/readToolHelpers.js +5 -4
  31. package/dist/mcp/tools/session/executionResultTools.js +2 -2
  32. package/dist/mcp/tools/session/shared.js +1 -0
  33. package/dist/mcp/tools/session/statusTools.js +4 -3
  34. package/dist/mcp/tools/settings/index.js +8 -28
  35. package/dist/mcp-app/account.html +14 -14
  36. package/dist/mcp-app/account.notices.txt +1 -1
  37. package/dist/mcp-app/chart.html +9 -9
  38. package/dist/mcp-app/chart.notices.txt +1 -1
  39. package/dist/mcp-app/connect.html +14 -14
  40. package/dist/mcp-app/connect.notices.txt +1 -1
  41. package/dist/mcp-app/receipt.html +1298 -1463
  42. package/dist/mcp-app/receipt.notices.txt +226 -1204
  43. package/dist/mcp-app/review.html +1298 -1463
  44. package/dist/mcp-app/review.notices.txt +226 -1204
  45. package/dist/mcp-app/settings.html +3133 -0
  46. package/dist/mcp-app/settings.notices.txt +973 -0
  47. package/dist/mcp-ui/contracts.js +8 -2
  48. package/dist/mcp-ui/readCards.js +1 -1
  49. package/dist/mcp-ui/tools.js +33 -2
  50. package/dist/review-server/server.js +5 -51
  51. package/dist/runtime/application.js +41 -14
  52. package/dist/runtime/localSettingsService.js +26 -2
  53. package/dist/runtime/shared/authenticatedFetch.js +6 -2
  54. package/dist/runtime/shared/control.js +5 -6
  55. package/dist/runtime/shared/http.js +14 -0
  56. package/dist/runtime/shared/mcpHttp.js +9 -4
  57. package/dist/runtime/shared/server.js +1 -1
  58. package/dist/runtime/smokeMainnetRead.js +0 -1
  59. package/dist/runtime/walletConnectStorage.js +2 -4
  60. package/dist/runtime/walletSdkChildRuntime.js +2 -1
  61. package/dist/runtime/walletSdkIpc.js +2 -1
  62. package/dist/runtime/walletSdkProcess.js +3 -2
  63. package/docs/AGENT_BEHAVIOR.md +44 -10
  64. package/docs/AGENT_DEVELOPMENT_POLICY.md +16 -12
  65. package/docs/FRONTEND_POLICY.md +105 -28
  66. package/docs/LOCAL_DB_ARCHITECTURE.md +143 -20
  67. package/docs/MCP_SETUP.md +99 -39
  68. package/docs/MCP_TOOLS.md +273 -24
  69. package/docs/SDK_API.md +51 -10
  70. package/docs/UTILITY_INDEX.md +9 -6
  71. package/docs/WALLET_CONNECTION.md +30 -9
  72. package/package.json +13 -7
  73. package/dist/core/activity/schemaVersion.js +0 -2
  74. package/dist/core/session/keyedRecordStore.js +0 -18
  75. package/dist/core/session/settingsSession.js +0 -1
  76. package/dist/core/session/settingsSessions.js +0 -45
  77. package/dist/review-app/brand-dark.svg +0 -1
  78. package/dist/review-app/brand-light.svg +0 -1
  79. package/dist/review-app/favicon.svg +0 -1
  80. package/dist/review-app/settings.css +0 -1
  81. package/dist/review-app/settings.js +0 -1
  82. package/dist/review-app/ui.css +0 -809
  83. package/dist/review-server/assets.js +0 -48
  84. package/dist/review-server/html.js +0 -45
  85. package/dist/review-server/http.js +0 -47
  86. package/dist/review-server/middleware/reviewToken.js +0 -7
  87. package/dist/review-server/settingsApi.js +0 -158
package/docs/MCP_SETUP.md CHANGED
@@ -6,7 +6,7 @@ It does not define tool field contracts or response wording. Use `docs/MCP_TOOLS
6
6
 
7
7
  The README keeps only the short entry path; client-specific setup, restart behavior, and troubleshooting live here.
8
8
 
9
- These instructions target `@zktx.io/sui-mcp@0.5.0`. Package installation requires
9
+ These instructions target `@zktx.io/sui-mcp@0.6.0`. Package installation requires
10
10
  that exact version to be published; use the developer checkout instructions when
11
11
  it is not available. A repository rename or local build does not publish the
12
12
  package. Changing client settings or rebuilding files does not replace an
@@ -24,6 +24,11 @@ the package identity when switching installations.
24
24
  - stdio: standard input/output, the local transport used by MCP clients to talk to this server.
25
25
  - `@zktx.io`: the npm package scope. `zktx-mcp` is the GitHub organization. Sui MCP is the product; `sui-mcp` is the MCP server name and executable command.
26
26
 
27
+ Each MCP request, including its envelope and metadata, must fit within the
28
+ internal transport's 4 MiB request-body limit. Card messages have a separate
29
+ 64 KiB budget; Restore uploads keep their 16 MiB file limit by sending smaller
30
+ messages. See [MCP Tools](MCP_TOOLS.md) for request and error semantics.
31
+
27
32
  ## Requirements
28
33
 
29
34
  - Node.js 22+. Node 22 or 24 LTS is recommended.
@@ -34,12 +39,12 @@ the package identity when switching installations.
34
39
 
35
40
  No Sui endpoint setup is required for the default path. The runtime creates a local SQLite database automatically, stores default Sui mainnet gRPC and GraphQL endpoints there on first start, and uses those endpoints for read-only mainnet tools.
36
41
 
37
- If you want a custom Sui gRPC or GraphQL provider, or local data controls, configure them after the MCP server is connected by asking your AI client to create a local settings session:
42
+ If you want a custom Sui gRPC or GraphQL provider, or local data controls, configure them after the MCP server is connected by asking your AI client to create a Settings card:
38
43
 
39
44
  - "Show my Sui MCP local settings."
40
- - "Open my Sui MCP local settings page."
45
+ - "Open my Sui MCP Settings card."
41
46
 
42
- Open the returned settings URL in the same machine's system browser. Custom endpoint changes apply after the MCP server restarts. Advanced temporary environment overrides are documented in [Advanced Runtime Settings](#advanced-runtime-settings).
47
+ The tool opens an internal card; use its scoped controls in the chat app. No external URL is returned. Custom endpoint changes apply after the MCP server restarts. Advanced temporary environment overrides are documented in [Advanced Runtime Settings](#advanced-runtime-settings).
43
48
 
44
49
  DeepBook orderbook, raw-quantity quote, and display-amount quote reads use an internal mainnet SDK simulation sender placeholder.
45
50
 
@@ -51,6 +56,10 @@ Reads that require a connected default account use `session.create_wallet_connec
51
56
 
52
57
  ## Developer Checkout Setup
53
58
 
59
+ Use Node.js 22.12 or newer within 22.x, or Node.js 24 or newer, for source builds
60
+ and tests. These ranges satisfy Vite, Rolldown and Vitest together. The installed
61
+ package's runtime requirement remains Node.js 22 or newer.
62
+
54
63
  Use this path when you download the repository from GitHub and want to test the local build:
55
64
 
56
65
  ```bash
@@ -121,7 +130,7 @@ per-client configuration below, which give the exact `command` and `args`.
121
130
 
122
131
  The npm package for this release is `@zktx.io/sui-mcp`. The commands below
123
132
  require the requested version to be published; confirm it with
124
- `npm view @zktx.io/sui-mcp@0.5.0 version` before switching. Both installation
133
+ `npm view @zktx.io/sui-mcp@0.6.0 version` before switching. Both installation
125
134
  methods start the same `sui-mcp` stdio MCP server. Use a local checkout when
126
135
  working on a version that has not been published.
127
136
 
@@ -143,9 +152,12 @@ then restart the client:
143
152
 
144
153
  ```bash
145
154
  npx -y @zktx.io/sui-mcp
146
- # wait until it logs "review server started", then stop it with Ctrl-C
155
+ # after the server binds or a healthy peer is confirmed, stop it with Ctrl-C
147
156
  ```
148
157
 
158
+ The startup log reports either an owned shared server or an authenticated healthy
159
+ peer. A bootstrap failure instead reports its stage and reason on stderr.
160
+
149
161
  ### Install once (global, fastest startup, pinned version)
150
162
 
151
163
  ```bash
@@ -178,8 +190,30 @@ command, for example `"command": "cmd", "args": ["/c", "npx", "-y", "@zktx.io/su
178
190
 
179
191
  ## Switching the Installed Package
180
192
 
181
- Use these steps when selecting a different package installation. Confirm the
182
- requested version is available before changing your client configuration.
193
+ ### Updating an Existing Sui MCP Installation
194
+
195
+ Confirm that the requested package version is available before changing every
196
+ participating client's configuration. This release requires a new empty data
197
+ directory when replacing a 0.5.x installation. Preserve the previous data,
198
+ backups and private WalletConnect store; they are not converted or imported.
199
+ Configure endpoints and read context as needed and connect through a new card.
200
+ Use the same new data directory and review port in every participating client.
201
+ Fully quit the participating apps, update
202
+ the installed package or configured version, then reopen them and check
203
+ `read.get_server_status` in each client. The package name, version and server
204
+ name must match the intended installation. Updating the package does not
205
+ replace a backend that is already running.
206
+
207
+ A compatible update that retains the current database structure can use existing
208
+ data. Incompatible databases and backups are rejected without migration;
209
+ see [Local Database Architecture](LOCAL_DB_ARCHITECTURE.md#current-format-and-backups).
210
+ Do not reset data or resend a transaction as an update step. Coordinate a safe
211
+ restart if a transaction request is still in progress.
212
+
213
+ ### Switching from a Different Package
214
+
215
+ Use these steps when selecting Sui MCP instead of a different package.
216
+ Confirm the requested version is available before changing your client configuration.
183
217
  Sui MCP starts with a new database and private WalletConnect store in its own
184
218
  data directory. It does not discover, read, import or convert a previous
185
219
  package's database or backup. Existing connections, saved cards, transaction
@@ -189,13 +223,13 @@ are unaffected and must never be resubmitted as an installation step.
189
223
 
190
224
  Fully quit every app using the service and wait for its shared backend to exit
191
225
  before starting the new package. A client using a different service identity,
192
- API version or data directory is refused while that backend owns the port.
226
+ package version or data directory is refused while that backend owns the port.
193
227
  If a transaction request is in progress, inspect its state and coordinate a safe
194
228
  restart first. A previous wallet pairing can remain in the wallet app; remove
195
229
  an unwanted pairing there rather than assuming new local storage disconnected it.
196
230
 
197
231
  Replace the old registration instead of adding a second one. Use exactly
198
- `sui-mcp` for the registration name and select `@zktx.io/sui-mcp@0.5.0` in its
232
+ `sui-mcp` for the registration name and select `@zktx.io/sui-mcp@0.6.0` in its
199
233
  command arguments. Do not append an environment label, version or numeric
200
234
  suffix. Remove obsolete runtime environment overrides. If you set
201
235
  `SUI_MCP_DATA_DIR`, choose a new empty directory; never point it at another
@@ -435,7 +469,7 @@ After the MCP server is connected:
435
469
  - `read.summarize_sui_function_activity_scan` for sent transactions that called one full function target.
436
470
  If the selected tool accepts `account` and the user supplied a Sui address, pass it instead of starting wallet connection. DeepBook account inventory has no explicit address input.
437
471
  8. For local review evidence, use `read.list_review_activity`, `read.summarize_review_funnel`, or `read.get_review_session_detail`.
438
- 9. For local endpoint settings or local data controls, ask your AI client to call `settings.create_local_settings_session`, then open the returned settings URL in the same machine's system browser. Setting changes apply after restart.
472
+ 9. For local endpoint settings or local data controls, ask your AI client to call `settings.create_local_settings_session`, then use the internal card controls. Setting changes apply after restart.
439
473
 
440
474
  ## Wallet Connection Boundary
441
475
 
@@ -459,14 +493,20 @@ connections are saved, the Connect card lists them for target-specific
459
493
  Disconnect confirmation. Account use and signing remain blocked until the
460
494
  conflict is resolved. No connection is silently chosen or remotely removed.
461
495
 
462
- There is no Restart wallet service button in Connect or Settings. If the
463
- connection service is unavailable or a disconnection remains unresponsive,
464
- fully quit all apps using Sui MCP and reopen them. Closing only a window
465
- or a client that does not own the shared backend is insufficient. Another open
466
- client may take ownership. Verify that the old backend and SDK child exited
467
- and that the new service becomes available; editing a config file is not a
468
- runtime restart. A process that survives app exit needs separate diagnosis,
469
- not a claim that recovery succeeded.
496
+ Connection service restart belongs to Settings, not Connect. If an operation
497
+ is unresponsive or the service is unavailable, ask to open Settings and use
498
+ Troubleshooting. Inspect the affected run/requests and confirm Restart
499
+ connection service. The backend waits for its old SDK child to exit and a new
500
+ run to become ready; it does not restart the parent or another app. If startup
501
+ itself remains pending, open a new Settings card for another explicit restart;
502
+ the prior pending startup is recorded as superseded. A known failure stays a
503
+ failure. No read, timeout or reopened frame initiates another restart.
504
+
505
+ If Settings or the parent service cannot be reached, fully quit all apps using
506
+ Sui MCP, then reopen them. Closing a peer or window can leave the owner alive.
507
+ Use this full app restart also for stored endpoint/configuration changes or an
508
+ installation update. A process surviving app exit needs diagnosis; editing a
509
+ config file is not evidence of a runtime restart.
470
510
 
471
511
  Restarting does not cancel a transaction on Sui or confirm remote disconnection.
472
512
  Check retained connections in your wallet app. Saved results and the known
@@ -474,10 +514,11 @@ digests of submitted transactions remain available after restart. An
474
514
  unsubmitted approval needs a fresh review and explicit wallet approval; nothing
475
515
  is resent automatically. Normal initialization is not a failure warning.
476
516
 
477
- The shared backend uses internal API version 7. All clients sharing a data
478
- folder must use a compatible installation. Fully quit the old clients before
517
+ All clients sharing a data folder must use the same package release. Private
518
+ parent/child and peer authentication bind that package identity; there is no
519
+ separate internal API or database version counter. Fully quit the old clients before
479
520
  starting the same updated installation; an incompatible owner is refused.
480
- Product schema 9 and private SDK format 1 are retained.
521
+ The runtime checks the current product and private SDK storage structures directly; neither has a separate numeric version.
481
522
 
482
523
  Review requires an explicit card action and individual wallet approval. The
483
524
  backend uses Sui sign-only requests, verifies returned bytes/digest/signer and
@@ -493,7 +534,7 @@ A card accepts one read selection. Moving between chats or recreating its frame
493
534
 
494
535
  ## Local data format
495
536
 
496
- Start this runtime with an empty `SUI_MCP_DATA_DIR` or a database already in its current format. A mismatched existing database is refused before writes. There is no older DB or backup migration. The current database and public backup use schema 9; a development checkout replacing schema 8 needs a new empty data folder, preserving the previous folder. Older local records, known/active accounts and stored endpoints are not inherited; set the needed account context and endpoints again. Existing files are left in place, and environment overrides keep their existing precedence. See [Local DB Architecture](LOCAL_DB_ARCHITECTURE.md) for the current format, backup scope and card-result retention. Card results do not expire with the input period and can increase DB size. Reset/import removes them along with the affected local data; it is not a card-only space cleanup operation.
537
+ Start this runtime with an empty `SUI_MCP_DATA_DIR` or a database already in its current format. A mismatched existing database is refused before writes. There is no older DB or backup migration. A checkout with different table, constraint or field definitions needs a new empty data folder, preserving the previous folder. Databases and backups do not carry a separate numeric schema version. Older local records, known/active accounts and stored endpoints are not inherited; set the needed account context and endpoints again. Existing files are left in place, and environment overrides keep their existing precedence. See [Local DB Architecture](LOCAL_DB_ARCHITECTURE.md) for the current format, backup scope and card-result retention. Card results do not expire with the input period and can increase DB size. Reset/import removes them along with the affected local data; it is not a card-only space cleanup operation.
497
538
 
498
539
  ## Local Settings
499
540
 
@@ -502,21 +543,40 @@ Beginner setup uses the built-in Sui mainnet gRPC and GraphQL endpoints. You do
502
543
  To inspect settings or change stored endpoints, ask your AI client:
503
544
 
504
545
  - "Show my Sui MCP local settings."
505
- - "Open my Sui MCP local settings page."
506
-
507
- The settings page lets the user:
508
-
509
- - save custom Sui gRPC and GraphQL endpoints;
510
- - restore the default Sui gRPC and GraphQL URLs;
511
- - clear active account read context;
512
- - reset logical local data;
513
- - export local data;
514
- - import replace-only local data.
546
+ - "Open my Sui MCP Settings card."
547
+
548
+ Settings groups Address for viewing assets, Local records, Troubleshooting and
549
+ Advanced settings. Each card lets you make one change and keeps its result:
550
+
551
+ - view or clear the default address used when checking assets;
552
+ - back up records saved on this computer;
553
+ - restore a Sui MCP backup, replacing the current local records and settings;
554
+ - delete local records and saved settings;
555
+ - check or restart the wallet connection service;
556
+ - select a custom Sui network address or return to a built-in default.
557
+
558
+ Local records include saved addresses, reviews, transaction and activity records,
559
+ and Sui network settings. Restoring them does not reconnect your wallet or restore
560
+ wallet approvals. Transactions on Sui are not cancelled by a restore or reset.
561
+ Internal request IDs and file hashes appear in Details. Advanced settings names
562
+ the Sui node connection as gRPC and the activity-data connection as GraphQL.
563
+ Network addresses set in the app launch configuration take priority over values
564
+ saved in Settings; remove the relevant launch setting before restarting to use
565
+ the saved value.
515
566
 
516
567
  Settings validation rules:
517
568
 
518
- - Import preview validates the backup shape without contacting the imported endpoint.
519
- - Import accepts only the current backup format and schema identifier. Required settings and activity fields must be present; missing fields are not filled from defaults.
569
+ - Choose a backup file no larger than 16 MiB. The card shows file transfer and Checking backup while Sui MCP checks it automatically, then shows Restore available or Cannot restore with the reason. A file still being received is not a failed backup. These initial checks do not contact network addresses from the backup.
570
+ - Restore local records is your final confirmation. Sui MCP then checks the backup's network addresses before changing any data. Back from the confirmation clears that preparation and keeps a valid complete file. Returning from an input page to a section and using Resume preserves the selection and file. A change to local records requires a fresh check. Check backup again checks that same file when needed; Change backup file lets you choose another. Choosing or checking a file never restores it automatically.
571
+ - If Sui MCP rejects the backup's format or mainnet network settings, use Change backup file. Back and Check backup again cannot clear that rejection. If a network service is temporarily unreachable, you can check the backup again and make a new restore confirmation; network access is still checked before any records change.
572
+ - If another Settings operation or an unsettled wallet request temporarily blocks the change, Check status reads the same card again without repeating its action.
573
+ - Restoring or resetting can delete records whose transaction results were not confirmed and cannot cancel a transaction on Sui. It remains blocked while a wallet/transaction response is pending or the initial transaction-result waiting period has not ended, including after automatic result checks are stopped.
574
+ - Choose Download backup in Local records once. Sui MCP prepares and checks the backup internally, then asks the app to save it. There is no separate Create backup step. For supported downloads, the app controls the destination and Sui MCP keeps no permanent extra copy; Suggested file name is not a confirmed save path.
575
+ - If the download function explicitly reports that it is unsupported, the same backup is saved in `<SUI_MCP_DATA_DIR>/backups/` instead. Backup saved shows its actual Folder and File name. This file remains after restarting or replacing local data; temporary cleanup does not delete it. This choice depends on the function response, not the app name. Other errors do not silently change the destination.
576
+ - If an earlier attempt may already have saved a copy, Save a local copy asks for that decision explicitly. Retry save is available only after a confirmed local save failure with no published file. While saving or checking an uncertain result, Check status checks the same request without creating another file.
577
+ - An accepted download request does not prove that the file was saved. If delivery fails or cannot be confirmed, Retry download sends the same snapshot while its thirty-minute transfer period remains open. An unconfirmed earlier request may already have saved a copy. Cancel download stops further transfer and cleans the temporary snapshot; it does not close a save dialog or delete a saved file. Reopening a card never starts another download automatically.
578
+ - The thirty-minute transfer period starts when the snapshot is ready and is not extended by reads or retries. App acknowledgment, cancellation, expiry, server restart or local-data replacement ends private retention. A local save admitted before the deadline finishes its file work and records the result before cleanup; a restart can verify an already published file but never create a missing one. If temporary cleanup cannot be confirmed, Check status checks that same request without creating or downloading another backup. Existing saved local backup files are left intact. A backup larger than the 16 MiB restore limit is identified as such and is not silently truncated.
579
+ - Import accepts only the current backup format and required field structure. Required settings and activity fields must be present; missing fields are not filled from defaults.
520
580
  - Current-format backups can contain `function_scan` provenance. Unsupported formats and scan-kind values are rejected rather than partially imported.
521
581
  - Endpoint chain-identifier verification runs only when the user confirms the replace-only import.
522
582
  - A custom gRPC endpoint must be an `http` or `https` URL with an explicit port and no credentials, path, query string, or fragment.
@@ -540,7 +600,7 @@ Use this only when you need a one-run override or need to recover from a stored
540
600
 
541
601
  After the MCP server starts with the override:
542
602
 
543
- 1. Open the local settings page.
603
+ 1. Open the Settings card.
544
604
  2. Restore the default endpoint or save a new endpoint.
545
605
  3. Remove the environment override.
546
606
  4. Restart the client.
@@ -577,7 +637,7 @@ The port is not a browser-wallet authorization origin.
577
637
  `npm run release:check` checks synchronized release metadata, typechecks, tests,
578
638
  builds, and verifies the actual npm tarball and bundled licenses. It installs the
579
639
  tarball in a temporary directory and runs that installed binary to check MCP
580
- initialization, tools, document/card resources, the local Settings page and
640
+ initialization, tools, document/card resources, the internal Settings card and
581
641
  assets, and the isolated SDK child. It confirms that Connect rejects restart
582
642
  input, manage does not pair merely by opening, and the SDK keeps its exclusive
583
643
  storage lease until shutdown. Runtime startup requires reachable Sui mainnet endpoints; a startup
@@ -696,7 +756,7 @@ cannot erase an earlier fatal or signal exit. SDK service unavailability is a
696
756
  separate condition and does not by itself shut down the parent read service.
697
757
 
698
758
  - Do not set `SUI_RPC_URL`; this runtime intentionally uses Sui gRPC and rejects Sui JSON-RPC config.
699
- - If a stored custom endpoint fails, temporarily start with `SUI_GRPC_URL`, open the local settings page, restore the default Sui gRPC URL or save a new endpoint, remove the override, and restart.
759
+ - If a stored custom endpoint fails, temporarily start with `SUI_GRPC_URL`, open the Settings card, restore the default Sui gRPC URL or save a new endpoint, remove the override, and restart.
700
760
  - If an environment override is present, confirm it has scheme, host, and explicit port only.
701
761
  - If the startup chain identifier guard fails, use a Sui mainnet gRPC endpoint. If a Sui activity tool fails its GraphQL chain identifier guard, use a Sui mainnet GraphQL endpoint.
702
762
 
@@ -716,7 +776,7 @@ If the user supplied a specific Sui address for `read.summarize_wallet_assets` o
716
776
 
717
777
  A 404 means the requested package or version could not be retrieved from the
718
778
  selected registry. Confirm the exact name and version, for example with
719
- `npm view @zktx.io/sui-mcp@0.5.0 version --registry=https://registry.npmjs.org`.
779
+ `npm view @zktx.io/sui-mcp@0.6.0 version --registry=https://registry.npmjs.org`.
720
780
  A new version may not have been published or become visible yet; a mistyped name
721
781
  or an alternate/private registry can also explain the response. Check the
722
782
  publication result and registry configuration before retrying. Do not assume
package/docs/MCP_TOOLS.md CHANGED
@@ -8,6 +8,16 @@ It does not own installation steps or user-question playbooks. Installation and
8
8
 
9
9
  Tool names use dot prefixes and avoid arbitrary shell, arbitrary Move calls, and private-key handling.
10
10
 
11
+ The local stdio gateway forwards each request through authenticated internal
12
+ HTTP. A request body must fit within 4 MiB, including the entire MCP JSON-RPC
13
+ envelope and metadata. An oversized request is rejected before tool or card
14
+ dispatch; this is an input-size error, not an unsupported function, wallet
15
+ rejection or unconfirmed file delivery. Reduce the request before calling again.
16
+ Card calls also have a 64 KiB envelope budget. Ordinary MCP calls do not inherit
17
+ that smaller card limit. Restore files may contain up to 16 MiB and are sent in
18
+ separate messages within the card budget; the 4 MiB request limit is not a
19
+ backup-file limit.
20
+
11
21
  ## Read-Only Tools
12
22
 
13
23
  | Tool | Status | Purpose |
@@ -155,7 +165,7 @@ When Chart pool choices cannot be prepared, the backend creates a `closed`/`fail
155
165
 
156
166
  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.
157
167
 
158
- Backend expiry ends unsubmitted input. A server restart invalidates unfinished cards; stored completed results remain readable. Reset/import removes cards and their permissions with the data change. Completed input does not reopen, while still-valid unsubmitted input is unaffected by chat navigation. A lost submit response is resolved by reading the same card, without another source request.
168
+ Backend expiry ends unsubmitted input. A server restart invalidates unfinished cards; stored completed results remain readable. Reset/import atomically removes other cards/permissions with the data change and preserves the applying Settings card/result as read-only. Completed input does not reopen, while still-valid unsubmitted input is unaffected by chat navigation. A lost submit response is resolved by reading the same card, without another source request.
159
169
 
160
170
  When a Host replays a historical card without its private input permission, the
161
171
  View reads `suimcp://cards/{cardId}` to restore the same card's current saved
@@ -1071,7 +1081,8 @@ Each disconnection uses the same scoped UI permission, current run and revision,
1071
1081
  atomic admission and saved result as an ordinary single-connection disconnect.
1072
1082
  No first/newest/default wallet is silently selected. When one valid connection
1073
1083
  remains and no connection operation is pending, normal account use can resume;
1074
- with none, pairing is available. A failed disconnect does not prove remote removal.
1084
+ with no recorded or SDK-present connection and no pending operation, pairing is
1085
+ available. A failed disconnect does not prove remote removal.
1075
1086
  A failed or stopped product connection is not restored merely because its SDK
1076
1087
  session remains saved.
1077
1088
 
@@ -1093,6 +1104,19 @@ the stored default's source connection ID to match this connection and its
1093
1104
  address to remain approved. Matching the address in a different connection is
1094
1105
  insufficient. A source-less stored selection requires explicit Use address.
1095
1106
 
1107
+ `manageableConnectionIds` identifies exact recorded targets for a new scoped
1108
+ Disconnect, separately from account use. It includes nonpending connected records
1109
+ (including expired ones) and known terminal records whose current SDK session
1110
+ remains present. `connectionReconciliationRequired: true` identifies a present SDK
1111
+ session without a journal target after normal registration/cleanup ends. It
1112
+ blocks pairing, account use, preparation and signing while preserving SDK
1113
+ availability and saved outcomes. Remove the retained connection in the wallet
1114
+ app, then confirm absence through a complete current service observation.
1115
+ Settings/Troubleshooting can explicitly restart the service to inspect it again;
1116
+ restart alone does not remove or approve that connection. No private topic or synthetic target ID
1117
+ is exposed. Both fields also appear in interaction status; review status includes
1118
+ the reconciliation flag when current eligibility is needed.
1119
+
1096
1120
  These fields are emitted together for current wallet eligibility. Independent
1097
1121
  historical or completed-result reads may omit them; omission does not establish
1098
1122
  current eligibility. Recorded `connections` and `activeAccount` remain facts,
@@ -1116,7 +1140,10 @@ errors still fail the read without deleting the stored execution result.
1116
1140
 
1117
1141
  Connect does not accept `restart_wallet_service`; that input returns
1118
1142
  `invalid_card_input` without consuming the card or changing the SDK run.
1119
- There is no model-facing or Settings replacement command. Operational app
1143
+ Ordinary MCP tools cannot replace the connection service. A user may prepare
1144
+ and confirm its restart in the internal Settings card's Troubleshooting controls.
1145
+ This restores service availability, not an interrupted wallet approval or
1146
+ disconnect result. Operational app
1120
1147
  restart is described in [MCP Setup](MCP_SETUP.md#wallet-connection-boundary).
1121
1148
 
1122
1149
  A historical `runtimeRecovery` result retains its prior/next run IDs,
@@ -1209,38 +1236,260 @@ facts actually exist.
1209
1236
  | Tool | Status | Purpose |
1210
1237
  | --- | --- | --- |
1211
1238
  | `account.get_active_account` | Implemented | Reads the active wallet-account read context. |
1212
- | `account.clear_active_account` | Implemented | Clears the active wallet-account read context. |
1239
+
1240
+ The user clears the default read address through a confirmed Settings card action. Ordinary MCP calls do not clear it.
1213
1241
 
1214
1242
  ## Settings Tools
1215
1243
 
1216
1244
  | Tool | Status | Purpose |
1217
1245
  | --- | --- | --- |
1218
- | `settings.create_local_settings_session` | Implemented | Creates a same-machine local settings page session. |
1219
- | `settings.get_local_settings` | Implemented | Reads local Sui MCP settings, including effective Sui gRPC and GraphQL endpoint sources. |
1220
-
1221
- Settings MCP tools are session-gateway/read tools, not direct mutators.
1222
-
1223
- The settings page can change local settings after settings-token validation:
1224
-
1225
- - stored Sui gRPC or GraphQL endpoint;
1226
- - default endpoint restoration;
1227
- - active account read context clearing;
1228
- - logical local data reset;
1229
- - local data export;
1230
- - replace-only local data import.
1231
-
1232
- These actions do not sign, execute, create custody, or produce signing material.
1233
-
1234
- Endpoint changes apply after MCP server restart.
1235
-
1236
- Custom providers can affect read data quality, so use trusted mainnet providers.
1246
+ | `settings.create_local_settings_session` | Implemented | Opens one internal Settings card with an unsubmitted draft. |
1247
+ | `settings.get_local_settings` | Implemented | Reads stored/effective Sui gRPC and GraphQL endpoints, sources and pending restart information. |
1248
+
1249
+ The gateway name is preserved. Its result is a `kind: "settings"` card snapshot
1250
+ and a public saved-result link. Card permission is only in `sui-mcp/card` UI
1251
+ metadata. There is no `settingsUrl`, `openTarget`, external page, HTTP mutation
1252
+ API or compatibility alias. A client without internal cards receives
1253
+ `ui_unavailable`; ordinary model calls never apply a Settings change.
1254
+
1255
+ Settings groups Address for viewing assets, Local records, Troubleshooting and Advanced
1256
+ settings. Confirmed changes are `clear_read_address`, `set_endpoint`,
1257
+ `restore_endpoint` (gRPC or GraphQL), `import_local_data`, `reset_local_data`
1258
+ and `restart_wallet_service`. Their preparation and confirmation use app-only
1259
+ `ui.act_card` with card permission, revision, operation identity and the exact
1260
+ preparation identity. Choosing or checking data does not apply it, contact a
1261
+ wallet or restart the SDK. Duplicate confirmation returns the same admitted
1262
+ result; MCP JSON-RPC request IDs do not authorize another operation.
1263
+
1264
+ Download backup uses one `settings_download_backup` action with `operationId`
1265
+ and an `attemptId` UUID, admitted atomically through the same scoped card input.
1266
+ It creates a `download_backup` operation and one immutable snapshot. It requires
1267
+ no separate selection, preparation or confirmation action. The same admitted
1268
+ start returns the same request; a different start cannot replace it. New
1269
+ `export_local_data` selection/preparation/confirmation is not accepted.
1270
+
1271
+ The card uses plain-language display labels without changing wire fields or
1272
+ enums. Wallet-service `available`, `initializing`, `recovering` and `unavailable`
1273
+ display as Ready, Starting, Restarting and Unavailable; Ready describes the
1274
+ service, not a connected or approved wallet. Endpoint sources display as App
1275
+ launch settings, Saved in Sui MCP and Built-in default. Internal connection and
1276
+ transaction-request IDs remain in Details; wallet identity and restart impact
1277
+ remain beside the confirmation. Known validation errors explain the cause and
1278
+ next action without requiring knowledge of upload chunks or backend admission.
1279
+
1280
+ Completing an import upload automatically checks its integrity, current-format
1281
+ contents and local replacement conditions. `data.restoreCheck.status` is
1282
+ `no_file`, `receiving`, `checking`, `check_required`, `can_restore` or
1283
+ `cannot_restore`. Receiving describes an unsealed transfer; a complete sealed
1284
+ file needing a new local check is `check_required`, not a validation failure.
1285
+ A blocked check carries
1286
+ its `reason` and user-readable `message`; it does not end the operation or
1287
+ misclassify a storage/service failure as an invalid file. `can_restore` describes
1288
+ the current preparation, not authority, completed replacement or guaranteed
1289
+ success. The exact UI permission, preparation identity and final admission are
1290
+ still required. Imported endpoint verification runs after final confirmation,
1291
+ before any data replacement. Reads never start a new check or application.
1292
+
1293
+ Known invalid backup contents or a definite imported URL/mainnet rejection remain
1294
+ bound to the selected file ID, hash, length and operation epoch. `settings_back` or a
1295
+ local-data revision change discards current confirmation without clearing that
1296
+ file rejection. `settings_prepare` cannot erase it or make the same file ready;
1297
+ the user must explicitly change the file selection. A new selection can use the
1298
+ same original bytes and receives a new file identity. Timeout or unreachable
1299
+ endpoint failures permit an explicit local recheck and a new final confirmation;
1300
+ that recheck does not call imported endpoints. The server derives recheck actions
1301
+ from the same decision used by the handler; the View does not choose its own
1302
+ failure-recovery policy.
1303
+
1304
+ `file.sealed` records complete, integrity-checked transfer; it does not by itself
1305
+ establish a supported backup or permission to restore it. `settings_back` and user-data
1306
+ changes invalidate preparation while preserving a reusable complete file.
1307
+ The explicit `settings_prepare` action rechecks such a file; normal file
1308
+ selection requires no separate Preview action. A failed check preserves its
1309
+ current file/operation identity and correction path. Owner replacement ends old
1310
+ input; a new card must receive a new explicit file selection.
1311
+
1312
+ A download's `result.completionScope: "backup_snapshot"` identifies the immutable
1313
+ preparation result, not a saved user file. `data.download` separately carries
1314
+ `availability` (`preparing`, `available`, `ended`), `currentAttemptId`, an optional
1315
+ `hostReport` (`acknowledged`, `not_completed`, `unconfirmed`, `unsupported`), `previousUnconfirmed`,
1316
+ `expiresAt`, `remainingMs`, `endReason` and `allowedFileActions`. End reasons are
1317
+ `acknowledged`, `cancelled`, `expired`, `server_restarted`, `data_replaced`,
1318
+ `source_unavailable`, `stored_locally` or `local_save_failed`. Replacement revokes the old card rather than preserving
1319
+ its input. The transfer period is thirty minutes from physical readiness;
1320
+ reads/retries never extend it or reopen the original business-input deadline.
1321
+ Raw per-attempt preparation is not copied into public `preparation`.
1322
+
1323
+ `data.download.localSave`, when present, separates `needs_consent`, `saving`,
1324
+ `saved` and `failed`. It may include `currentSaveAttemptId`, `savedAt` and a
1325
+ failure reason (`not_published`, `target_conflict`, `source_unavailable` or
1326
+ `interrupted`). Uncertain physical results remain `saving`; they do not grant
1327
+ another save. `previousUnconfirmed` includes an earlier attempt whose delivery
1328
+ absence was not established, including an unreported or not-completed request.
1329
+
1330
+ A verified local `saved` result provides `data.backupLocation.directory` and
1331
+ `filename` for `<SUI_MCP_DATA_DIR>/backups/<operationId>.json`. Snapshot preparation
1332
+ and Host acknowledgment do not provide that local success. A recorded
1333
+ `export_local_data` result can also identify its existing file. These fields
1334
+ never identify the destination chosen by a Host download dialog. Existing user
1335
+ files are never deleted by private snapshot cleanup. Private publication
1336
+ identities and source inode/device facts are not public projection fields.
1337
+
1338
+ Current `data.facts` uses the same connection selection and qualification rules
1339
+ as interaction status, through a fact reader that does not settle another
1340
+ request's deadlines or callback writes. General counts describe stored records;
1341
+ reset/import preparation and confirmation independently settle deadlines and
1342
+ check the current deletion impact. Creating a Settings card or checking its own
1343
+ permission, expiry, result or cleanup retains that operation's required writes.
1344
+ `connectionReconciliationRequired: true` is separate from SDK availability and
1345
+ requires a published available run with confirmed unrecorded presence:
1346
+ remove the unrecorded connection in the wallet app, then confirm absence.
1347
+ Settings overview and Troubleshooting show that action; a service restart only
1348
+ re-inspects retained sessions and does not approve or remove them.
1349
+ An initializing/state_sync memory snapshot does not establish that diagnosis.
1350
+ The ordinary interaction response exposes its removal-and-confirmed-absence
1351
+ meaning in `userAnswerUse.canAnswer` only when the diagnostic flag is present;
1352
+ the corresponding precondition and answer fields reference the same flag.
1353
+ Neither service availability nor an absent flag establishes account authority
1354
+ or proves that no SDK session exists.
1355
+
1356
+ `data.phase` is `draft`, `uploading`, `sealed`, `prepared`, `executing`,
1357
+ `stopping`, `starting` or `terminal`. `allowedActions` lists permitted business input;
1358
+ `observe` permits reading the existing operation only. Known file-I/O and final-slot
1359
+ conditions affect the offered actions; final admission rechecks them atomically.
1360
+ Local section navigation and Resume do not call `settings_back` or change stored
1361
+ preparation. Check status reads the same card when a change is temporarily
1362
+ unavailable and never repeats a business action or Host download. After a
1363
+ successful read, an already received but unrecorded download report can be
1364
+ recorded idempotently without resending bytes. Public fields include
1365
+ `operationId`, `draft`, preparation identity/impact, file ID/name/length/hash,
1366
+ `priorRunId`, `nextRunId`, supersession links and a recorded result. Results use
1367
+ `completed`, `failed`, `interrupted` or `superseded`. Completion describes that
1368
+ local operation, not a transaction's chain outcome. Optional
1369
+ `temporaryFileCleanup` separately reports `pending`, `failed` or `complete`;
1370
+ reading/checking it never repeats data replacement, backup creation, Host delivery or SDK
1371
+ replacement. Terminal business input remains closed; only the separate scoped
1372
+ file continuations in `data.download.allowedFileActions` may remain available. Public fields contain no raw file, transaction bytes, signatures,
1373
+ SDK credentials or card permission.
1374
+
1375
+ A user-data writer invalidates its affected prepared confirmation atomically.
1376
+ A still-valid sealed import file remains available for a new backup check after
1377
+ `settings_back` or invalidation; an old revision/preparation cannot apply it. Explicitly
1378
+ choosing a different file invalidates the old upload. Upload, preparation and
1379
+ input permission have separate lifetimes. Known validation rejection returns
1380
+ safe input-error text and the actual current snapshot. Wrong permission returns
1381
+ no snapshot or domain explanation; storage/I/O failures are not input errors
1382
+ or success.
1383
+
1384
+ Backup uploads accept at most 16 MiB before Base64/JSON wrapping. Chunk offsets,
1385
+ reservations, canonical Base64, full length and SHA-256 are verified. The entire
1386
+ internal MCP JSON-RPC message remains within 65,536 UTF-8 bytes; oversized upload
1387
+ rejection can report a smaller raw chunk limit before any write. The backup check validates
1388
+ strict current backup shape/references without endpoint contact. Confirmation
1389
+ verifies imported endpoints report Sui mainnet and rechecks current data and
1390
+ unsettled wallet/transaction work before atomic replacement.
1391
+ The prepared import includes `currentReadAddress` and `incomingReadAddress`
1392
+ (`null` when unset), the corresponding change and current/incoming record counts.
1393
+ Both preparation and final admission settle request deadlines before capturing
1394
+ or comparing that decision basis. A newly unknown outcome requires a new backup check.
1395
+ Reset/import revoke other live permissions and preserve only their own read-only card/result.
1396
+ Their confirmation warns that replacement can remove unconfirmed transaction
1397
+ records even when the checked count is zero; actual nonzero deletion counts stay
1398
+ visible. Outstanding wallet/transaction responses and an unfinished initial
1399
+ result-checking window block replacement, including after the user stops
1400
+ automatic result checks. Stopping those checks does not shorten that window.
1401
+ They cannot cancel a transaction on Sui or disconnect a remote wallet session.
1402
+ The private connection-service journal is preserved; it is not imported from
1403
+ the public backup and cannot restore old permissions or signing authority.
1404
+ Reset clears the default address. A restored default requires its exact current
1405
+ connection ID and approved address. Outstanding connection SDK callbacks block
1406
+ replacement along with unsettled transaction work.
1407
+
1408
+ Endpoint preparation records the gRPC/GraphQL kind, current stored/effective
1409
+ value and source, and exact proposed stored value. Only final confirmation checks
1410
+ mainnet and stores that target. Its result captures `effectiveValueAtSave` and
1411
+ `effectiveSourceAtSave`, rather than claiming to describe a later server run.
1412
+ An environment override continues to take precedence after restart while it
1413
+ remains set; storing an endpoint does not modify that environment.
1414
+
1415
+ Download creates and verifies one private snapshot with an exclusive generated
1416
+ file identity. Supported Host delivery does not publish a second permanent backup. Response or result
1417
+ storage failure never regenerates that snapshot. `ui.read_settings_file` is
1418
+ app-only and binds card/permission, operation, file, offset, verified hash/length
1419
+ and the current `attemptId` for a private download. Its ordinary content carries
1420
+ range metadata; Base64 bytes appear only in `sui-mcp/settings-file` UI metadata.
1421
+ The View checks the complete hash before standard Host delivery.
1422
+
1423
+ File continuations also use app-only `ui.act_card`:
1424
+
1425
+ - `settings_retry_download`: `operationId`, `fileId`, `previousAttemptId` and a
1426
+ new `attemptId`; atomically advances one attempt on the same live snapshot.
1427
+ - `settings_report_download`: `operationId`, `fileId`, `attemptId` and `status`
1428
+ (`acknowledged`, `not_completed`, `unconfirmed`, `unsupported`); the same report is idempotent,
1429
+ and conflicting reports for one attempt are rejected. A late older report
1430
+ cannot change the current attempt or end its retention. `unsupported` requires
1431
+ exactly `failure: {method: "ui/download-file", code: -32601}`; other statuses
1432
+ must omit `failure`. Only the actual download call's method-not-found result
1433
+ supplies that report. It is atomically admitted with the same snapshot's local
1434
+ publication intent when no earlier delivery is possible. A busy shared slot
1435
+ rejects that admission atomically; the View can record the same received
1436
+ report again without another Host call. An older or ended attempt report
1437
+ never admits publication.
1438
+ - `settings_cancel_download`: `operationId`, `fileId` and `attemptId`; ends
1439
+ further delivery of that snapshot, not a Host dialog or a user-saved file.
1440
+ Cancellation is refused while a local save is in progress or its outcome is
1441
+ uncertain. After a failure recorded as `not_published`, cancellation remains
1442
+ available within the transfer period for the current authorized request.
1443
+ - `settings_store_backup`: `operationId`, `fileId`, current `attemptId`, a new
1444
+ `saveAttemptId`, required boolean `allowPossibleCopy`, and optional
1445
+ `previousSaveAttemptId`. It is available only for that snapshot's recorded
1446
+ unsupported result. Possible earlier delivery requires explicit true consent;
1447
+ otherwise false is required. Initial consent has no previous save ID. A retry
1448
+ of a confirmed no-publication failure must name the current failed save ID.
1449
+ IDs and consent are immutable per admission; duplicates do not repeat effects.
1450
+ It accepts no arbitrary path, name or bytes.
1451
+
1452
+ These actions validate current owner, epoch, credential and exact file/attempt
1453
+ identity independently of terminal business input. Retry/read requires a live
1454
+ transfer period. A late report can record a fact after that period ends but
1455
+ cannot restore the file or authority. Host acknowledgment ends retention and
1456
+ requests cleanup; it does not prove a save location or completed disk storage.
1457
+ `isError` does not distinguish cancellation, denial or failure. A lost response
1458
+ is unconfirmed and never triggers automatic retransmission. Cleanup failure is
1459
+ reported separately and is retried through Check status or owner recovery.
1460
+ Local publication closes further Host reads/retries for that snapshot. Its
1461
+ final/file-I/O reservations survive the immutable terminal snapshot result.
1462
+ New save admissions and retries require the original live period; admitted
1463
+ file work settles even if it outlives that period. A process restart verifies
1464
+ only an existing target bound to its recorded source identity/content. It never
1465
+ publishes a missing target or restores the departed card's action authority.
1466
+ A missing or changed source ends that private transfer; a new explicit request
1467
+ is required. An existing public backup is verified on the same descriptor used
1468
+ for each range and is never truncated or removed by temporary cleanup.
1469
+
1470
+ Troubleshooting recovery confirms a precise SDK run and affected unsubmitted
1471
+ requests. Admission revokes their submission authority before stopping the old
1472
+ child. The result waits for the owned child's exit, new run reservation,
1473
+ startup and complete observation. A new explicit Settings confirmation can
1474
+ supersede a startup still pending; it cannot replace stopping or erase a known
1475
+ failure. Already admitted submissions keep observing the same digest. Restart
1476
+ does not confirm an interrupted disconnect or sign/submit a new transaction.
1477
+ The confirmation identifies wallet connection records with their recorded status
1478
+ and addresses. Historical disconnected/failed records do not prove a current
1479
+ connection or approval. The complete recorded impact remains bound to admission;
1480
+ the display does not filter it into a new wallet-eligibility rule.
1481
+
1482
+ Endpoint changes require fully quitting/reopening every participating app to
1483
+ apply parent configuration. Restart connection service only replaces the SDK
1484
+ child. Installation environment overrides continue to take precedence. Custom
1485
+ providers affect read data quality; use trusted Sui mainnet providers.
1237
1486
 
1238
1487
  ## Resources
1239
1488
 
1240
1489
  Sui MCP serves the URI prefixes `suimcp://` and `ui://sui-mcp/`.
1241
1490
  The
1242
1491
  `sui-mcp/card`, `sui-mcp/receipt-display` and
1243
- `sui-mcp/wallet-display` metadata keys bind stored cards to their
1492
+ `sui-mcp/wallet-display` and `sui-mcp/settings-file` metadata keys bind stored cards to their
1244
1493
  permissions and display facts. Clients must use the returned URI/key values.
1245
1494
 
1246
1495