@cmdoss/suipay-mcp 0.2.2-dev.0 → 0.2.2

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/README.md CHANGED
@@ -15,9 +15,7 @@ claude mcp add --scope user suipay -- npx -y @cmdoss/suipay-mcp@0.2.2
15
15
  ```
16
16
 
17
17
  No wallet secret belongs in this command or MCP config. There is no
18
- Sign-In With Sui (SIWS) step. To reuse an existing delegate seed locally,
19
- set `SUIPAY_MCP_KEY` (64-hex or `suiprivkey1…`) in the MCP env — never in
20
- the browser.
18
+ Sign-In With Sui (SIWS) step.
21
19
 
22
20
  ## First connection
23
21
 
@@ -28,11 +26,8 @@ First connection is a spend-account grant plus an agent-held delegate key.
28
26
  2. Persist that delegate key locally at `~/.suipay/credentials.json`
29
27
  (mode `0600`). The process that holds this key is the only process
30
28
  that can settle.
31
- 3. Point MCP at a gateway. Default is Railway **suipay-dev**. Pass
32
- `suipay_login({ target: "local" })` or start the binary with `--local`
33
- for the laptop stack. Env/CLI fill the process default until a
34
- credential is bound; after login, stored `gatewayUrl` wins. Rebind
35
- with `suipay_login({ target })`.
29
+ 3. Point MCP at the gateway (`SUIPAY_GATEWAY_URL`) and the same network
30
+ the grant was created on.
36
31
  4. Call `pay`. The tool prepares unsigned `spend_account` settlement
37
32
  bytes. If this process holds the grant's key it verifies and settles;
38
33
  otherwise it returns the signing request.
@@ -41,20 +36,16 @@ The agent generates or is handed the delegate key. The key never enters
41
36
  a browser URL, a SuiPay backend, logs, or a callback payload. Only the
42
37
  public address leaves the local process. `suipay_login` mints or reuses
43
38
  the local version-2 key at `~/.suipay/credentials.json` (mode `0600`) and
44
- returns `{SUIPAY_CONSOLE_URL}/connect/agent?port=&delegateAddress=&connectState=&gateway=`
45
- immediately. The owner signs in the browser; the loopback callback persists
46
- key + gateway URL. Subsequent sessions reuse the file unless the grant is
47
- missing, expired, or revoked.
39
+ opens `{SUIPAY_CONSOLE_URL}/connect/agent?delegateAddress=0x…`.
48
40
 
49
41
  ## Tools
50
42
 
51
43
  | Tool | Purpose |
52
44
  | --- | --- |
53
- | `discover` | Search live gateway resources. After login: `name`, `path`, `url`, `targetHash`, catalog price, and `affordable` (can this session cover one call — not authorization). `pay({ url })` still settles |
45
+ | `discover` | Search live managed-gateway resources |
54
46
  | `pay` | Fetch resource, prepare `spend_account` settlement, settle when this process holds the grant key |
55
47
  | `receipts` | List settlement receipts, optionally by challenge ID |
56
- | `access_context` | Report current session / delegate / policy state (no secret material) |
57
- | `suipay_login` | Mint or reuse the local delegate key and return a clickable console URL (does not wait for the wallet). Default target is Railway suipay-dev; pass `target: "local"` for the laptop stack |
48
+ | `suipay_login` | Mint or reuse the local delegate key and open the console with the public address only |
58
49
  | `suipay_logout` | Remove local credentials |
59
50
 
60
51
  All tools remain visible before a grant is bound. `pay` and `receipts`
@@ -62,57 +53,13 @@ return instruction to run `suipay_login` and bind a spend-account grant
62
53
  when no local credentials exist. Hosted `/mcp` never holds a spendable
63
54
  key.
64
55
 
65
- ## Use from an agent
66
-
67
- Install once (above). After that, paying is a prompt — paste it into Claude
68
- (or any MCP host that has `suipay`). Do not write SDK code.
69
-
70
- ```
71
- Pay this SuiPay resource with the suipay MCP `pay` tool. Do not write SDK code.
72
-
73
- url: https://gateway.example/v1/image/generate
74
- method: POST
75
- json: {"prompt":"a cat"}
76
- maxAmount: 50000
77
- ```
78
-
79
- `pay` uses SDK `createPayer` internally. A delivered image is returned as an MCP
80
- image block, not as a base64 wall in the JSON summary.
81
-
82
- ## Targets
83
-
84
- Default is Railway **suipay-dev**. `--local` / `target: "local"` is laptop-only.
85
-
86
- | Target | Console | Gateway | How |
87
- | --- | --- | --- | --- |
88
- | `dev` (default) | `https://suipay-dev.up.railway.app` | `https://gateway-dev-ba84.up.railway.app` | no flag, or `--dev` |
89
- | `local` | `http://localhost:3000` | `http://127.0.0.1:4340` | `--local` / `-local`, or `suipay_login({ target: "local" })` |
90
-
91
- ```bash
92
- # Railway suipay-dev (default)
93
- npx @cmdoss/suipay-mcp@0.2.2
94
-
95
- # Laptop stack
96
- npx @cmdoss/suipay-mcp@0.2.2 --local
97
- ```
98
-
99
- `SUIPAY_MCP_TARGET=local|dev` selects the same preset. Explicit
100
- `SUIPAY_GATEWAY_URL` / `SUIPAY_CONSOLE_URL` fill the process default when no
101
- credential is bound yet. After a successful login, `credentials.json`
102
- `gatewayUrl` is the bound gateway: `pay` / `discover` / `suipay_login` without
103
- `target` stay on that binding so a leftover env cannot silently retarget spend.
104
- Rebind with `suipay_login({ target: "dev" | "local" })` (same key, new consent
105
- if that stack has no live grant).
106
-
107
56
  ## Client environment
108
57
 
109
58
  ```bash
110
- # Optional. Unset = Railway suipay-dev. --local uses localhost:3000 / 127.0.0.1:4340.
111
59
  SUIPAY_GATEWAY_URL=https://gateway.example
112
60
  SUIPAY_CONSOLE_URL=https://console.example
113
61
  SUIPAY_RPC_URL=https://your-testnet-rpc.example
114
62
  SUIPAY_NETWORK=testnet
115
- SUIPAY_MCP_TARGET=dev
116
63
  ```
117
64
 
118
65
  Optional:
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  main
4
- } from "../chunk-K6WM4Z7H.js";
5
- import "../chunk-NVTYOOMY.js";
4
+ } from "../chunk-EM7PKWVL.js";
5
+ import "../chunk-26NKQ37M.js";
6
+ import "../chunk-A3JIIDYT.js";
6
7
 
7
8
  // src/bin/suipay.ts
8
9
  main().catch((err) => {