@openclawcash/mcp-server 0.1.15 → 0.1.20

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 (2) hide show
  1. package/openclawcash-mcp.mjs +156 -20
  2. package/package.json +2 -2
@@ -7,7 +7,7 @@ import { fileURLToPath } from "node:url";
7
7
  import { z } from "zod";
8
8
 
9
9
  const SERVER_NAME = "openclawcash";
10
- const SERVER_VERSION = "0.1.16";
10
+ const SERVER_VERSION = "0.1.20";
11
11
  const PROTOCOL_VERSION = "2024-11-05";
12
12
  const DEFAULT_BASE_URL = "https://openclawcash.com";
13
13
 
@@ -104,6 +104,11 @@ const walletsListArgsSchema = z.object({
104
104
  });
105
105
  const skillLatestArgsSchema = z.object({}).strict();
106
106
 
107
+ const tokenlistArgsSchema = z.object({
108
+ chainId: z.number().int().positive().optional(),
109
+ extended: z.boolean().optional(),
110
+ }).strict();
111
+
107
112
  const balancesArgsSchema = z
108
113
  .object({
109
114
  walletId: z.union([z.number().int().positive(), z.string().min(1)]).optional(),
@@ -119,6 +124,7 @@ const balancesArgsSchema = z
119
124
  const transferArgsSchema = walletSelectorBaseSchema
120
125
  .extend({
121
126
  to: z.string().min(1),
127
+ network: z.string().min(1).optional(),
122
128
  amountDisplay: z.string().min(1).optional(),
123
129
  valueBaseUnits: z.string().min(1).optional(),
124
130
  amount: z.string().min(1).optional(),
@@ -165,6 +171,7 @@ const swapExecuteArgsSchema = z
165
171
  amountIn: z.string().min(1),
166
172
  slippage: z.number().positive().optional(),
167
173
  chain: z.enum(["evm", "solana"]).optional(),
174
+ network: z.string().min(1).optional(),
168
175
  })
169
176
  .refine((data) => [data.walletId, data.walletAddress].filter((value) => value !== undefined).length === 1, {
170
177
  message: "Provide exactly one of walletId or walletAddress.",
@@ -178,11 +185,40 @@ const approveArgsSchema = z
178
185
  spender: z.string().min(1),
179
186
  amount: z.string().min(1),
180
187
  chain: z.enum(["evm", "solana"]).optional(),
188
+ network: z.string().min(1).optional(),
189
+ })
190
+ .refine((data) => [data.walletId, data.walletAddress].filter((value) => value !== undefined).length === 1, {
191
+ message: "Provide exactly one of walletId or walletAddress.",
192
+ });
193
+
194
+ const bridgeQuoteArgsSchema = z
195
+ .object({
196
+ walletId: z.union([z.number().int().positive(), z.string().min(1)]).optional(),
197
+ walletAddress: z.string().min(1).optional(),
198
+ fromNetwork: z.string().min(1),
199
+ fromToken: z.string().min(1),
200
+ toNetwork: z.string().min(1),
201
+ toToken: z.string().min(1),
202
+ toAddress: z.string().min(1).optional(),
203
+ amountIn: z.string().min(1),
204
+ slippagePercent: z.number().min(0).max(50).optional(),
205
+ })
206
+ .refine((data) => [data.walletId, data.walletAddress].filter((value) => value !== undefined).length === 1, {
207
+ message: "Provide exactly one of walletId or walletAddress.",
208
+ });
209
+
210
+ const bridgeExecuteArgsSchema = z
211
+ .object({
212
+ walletId: z.union([z.number().int().positive(), z.string().min(1)]).optional(),
213
+ walletAddress: z.string().min(1).optional(),
214
+ quoteId: z.string().min(1),
181
215
  })
182
216
  .refine((data) => [data.walletId, data.walletAddress].filter((value) => value !== undefined).length === 1, {
183
217
  message: "Provide exactly one of walletId or walletAddress.",
184
218
  });
185
219
 
220
+ const bridgeStatusArgsSchema = z.object({ bridgeTxId: z.string().min(1) });
221
+
186
222
  const supportedTokensArgsSchema = walletSelectorBaseSchema
187
223
  .extend({
188
224
  network: z.string().min(1).optional(),
@@ -193,7 +229,7 @@ const supportedTokensArgsSchema = walletSelectorBaseSchema
193
229
 
194
230
  const createWalletArgsSchema = z.object({
195
231
  label: z.string().min(1),
196
- network: z.enum(["sepolia", "mainnet", "polygon-mainnet", "solana-devnet", "solana-testnet", "solana-mainnet"]).optional(),
232
+ network: z.enum(["sepolia", "mainnet", "polygon-mainnet", "base-mainnet", "solana-devnet", "solana-testnet", "solana-mainnet"]).optional(),
197
233
  exportPassphrase: z.string().trim().min(12),
198
234
  exportPassphraseStorageType: z.enum(["env", "secret_manager", "vault", "other"]),
199
235
  exportPassphraseStorageRef: z.string().trim().min(3),
@@ -202,7 +238,7 @@ const createWalletArgsSchema = z.object({
202
238
 
203
239
  const importWalletArgsSchema = z.object({
204
240
  label: z.string().min(1),
205
- network: z.enum(["mainnet", "polygon-mainnet", "solana-mainnet"]),
241
+ network: z.enum(["mainnet", "polygon-mainnet", "base-mainnet", "solana-mainnet"]),
206
242
  privateKey: z.string().min(1),
207
243
  });
208
244
 
@@ -507,6 +543,31 @@ const tools = [
507
543
  requireAuth: false,
508
544
  }),
509
545
  },
546
+ {
547
+ name: "tokenlist_get",
548
+ description:
549
+ "Fetch the public OpenClawCash Token Lists v1 document covering every supported chain (Mainnet, Polygon, Base, Sepolia, Solana mainnet). Default merges curated + Uniswap (EVM) + Jupiter (Solana). Pass extended=false for curated-only, or chainId=<num> to scope to one chain (1=Mainnet, 137=Polygon, 8453=Base, 11155111=Sepolia, 101=Solana). No API key required.",
550
+ inputSchema: {
551
+ type: "object",
552
+ properties: {
553
+ chainId: { type: "integer", description: "EIP-155 chain id (EVM) or Solana Labs convention (101=mainnet, 102=testnet, 103=devnet). Omit for all chains." },
554
+ extended: { type: "boolean", description: "Default true: merge Uniswap + Jupiter community lists. Set false for curated-only.", default: true },
555
+ },
556
+ additionalProperties: false,
557
+ },
558
+ parse: (args) => tokenlistArgsSchema.parse(args ?? {}),
559
+ execute: async (args) => {
560
+ const query = {};
561
+ if (typeof args.chainId === "number") query.chainId = String(args.chainId);
562
+ if (args.extended === false) query.extended = "false";
563
+ return callAgentApi({
564
+ method: "GET",
565
+ pathName: "/api/public/tokenlist",
566
+ query: Object.keys(query).length > 0 ? query : undefined,
567
+ requireAuth: false,
568
+ });
569
+ },
570
+ },
510
571
  {
511
572
  name: "wallets_list",
512
573
  description: "List managed wallets accessible to the configured OpenClawCash agent key.",
@@ -548,7 +609,7 @@ const tools = [
548
609
  },
549
610
  {
550
611
  name: "transactions_list",
551
- description: "List merged transaction history for one managed wallet.",
612
+ description: "List merged transaction history for one managed wallet. EVM wallets accept optional `network` to scope to a single EVM chain (e.g. \"base-mainnet\") or `\"all\"` to merge activity across every supported EVM chain into one history. Solana wallets stay scoped to their cluster.",
552
613
  inputSchema: {
553
614
  type: "object",
554
615
  properties: {
@@ -556,6 +617,7 @@ const tools = [
556
617
  walletLabel: { type: "string", description: selectorDescription() },
557
618
  walletAddress: { type: "string", description: selectorDescription() },
558
619
  chain: { type: "string", enum: ["evm", "solana"] },
620
+ network: { type: "string", description: "Optional EVM network override: a known EVM network id (mainnet, polygon-mainnet, base-mainnet, sepolia) or the literal \"all\" to merge across the bucket. Omit to use the wallet's default chain." },
559
621
  },
560
622
  additionalProperties: false,
561
623
  },
@@ -614,7 +676,7 @@ const tools = [
614
676
  {
615
677
  name: "transfer_send",
616
678
  description: withWriteSafety(
617
- "Send a native asset or token transfer from a managed wallet. Do not use for checkout escrow funding; use checkout_quick_pay or checkout_swap_and_pay.",
679
+ "Send a native asset or token transfer from a managed wallet. EVM wallets accept optional `network` (e.g. \"base-mainnet\") to operate on a non-default EVM chain. Do not use for checkout escrow funding; use checkout_quick_pay or checkout_swap_and_pay.",
618
680
  ),
619
681
  inputSchema: {
620
682
  type: "object",
@@ -623,6 +685,7 @@ const tools = [
623
685
  walletLabel: { type: "string" },
624
686
  walletAddress: { type: "string" },
625
687
  chain: { type: "string", enum: ["evm", "solana"] },
688
+ network: { type: "string", description: "Optional EVM network override (mainnet, polygon-mainnet, base-mainnet, sepolia). Omit to use the wallet's default chain." },
626
689
  to: { type: "string" },
627
690
  amountDisplay: { type: "string", description: "Human-readable decimal amount (preferred)." },
628
691
  valueBaseUnits: { type: "string", description: "Base-units integer amount (preferred)." },
@@ -698,7 +761,7 @@ const tools = [
698
761
  },
699
762
  {
700
763
  name: "swap_execute",
701
- description: withWriteSafety("Execute a swap through OpenClawCash."),
764
+ description: withWriteSafety("Execute a swap through OpenClawCash. EVM wallets accept optional `network` to operate on a non-default EVM chain (mainnet, polygon-mainnet, base-mainnet, sepolia)."),
702
765
  inputSchema: {
703
766
  type: "object",
704
767
  properties: {
@@ -709,6 +772,7 @@ const tools = [
709
772
  amountIn: { type: "string" },
710
773
  slippage: { type: "number" },
711
774
  chain: { type: "string", enum: ["evm", "solana"] },
775
+ network: { type: "string", description: "Optional EVM network override; omit to use the wallet's default chain." },
712
776
  },
713
777
  required: ["tokenIn", "tokenOut", "amountIn"],
714
778
  additionalProperties: false,
@@ -723,7 +787,7 @@ const tools = [
723
787
  },
724
788
  {
725
789
  name: "approve_token",
726
- description: withWriteSafety("Approve ERC-20 token spending for a managed wallet."),
790
+ description: withWriteSafety("Approve ERC-20 token spending for a managed wallet. Optional `network` lets EVM wallets approve on a non-default EVM chain (mainnet, polygon-mainnet, base-mainnet, sepolia)."),
727
791
  inputSchema: {
728
792
  type: "object",
729
793
  properties: {
@@ -733,6 +797,7 @@ const tools = [
733
797
  spender: { type: "string" },
734
798
  amount: { type: "string" },
735
799
  chain: { type: "string", enum: ["evm", "solana"] },
800
+ network: { type: "string", description: "Optional EVM network override; omit to use the wallet's default chain." },
736
801
  },
737
802
  required: ["tokenAddress", "spender", "amount"],
738
803
  additionalProperties: false,
@@ -745,6 +810,77 @@ const tools = [
745
810
  body: args,
746
811
  }),
747
812
  },
813
+ {
814
+ name: "bridge_quote",
815
+ description:
816
+ "Quote a cross-chain bridge transfer. The aggregator (LiFi) picks the underlying bridge automatically and returns provider+bridgeName so you know which bridge was selected. EVM-EVM is fully supported; Solana source-side execute is gated to a follow-up. Quote TTL ~60s; pass the returned quoteId to bridge_execute.",
817
+ inputSchema: {
818
+ type: "object",
819
+ properties: {
820
+ walletId: { oneOf: [{ type: "integer" }, { type: "string" }] },
821
+ walletAddress: { type: "string" },
822
+ fromNetwork: { type: "string", description: "Source network. EVM-home wallets bucket-route across mainnet, polygon-mainnet, base-mainnet, sepolia." },
823
+ fromToken: { type: "string", description: "Source token symbol or contract address. Use 'native' for the chain's native gas token." },
824
+ toNetwork: { type: "string" },
825
+ toToken: { type: "string" },
826
+ toAddress: { type: "string", description: "Optional destination address. Defaults to the source wallet address." },
827
+ amountIn: { type: "string", description: "Source amount in base units (digits only)." },
828
+ slippagePercent: { type: "number", minimum: 0, maximum: 50 },
829
+ },
830
+ required: ["fromNetwork", "fromToken", "toNetwork", "toToken", "amountIn"],
831
+ additionalProperties: false,
832
+ },
833
+ parse: (args) => bridgeQuoteArgsSchema.parse(args ?? {}),
834
+ execute: async (args) =>
835
+ callAgentApi({
836
+ method: "POST",
837
+ pathName: "/api/agent/bridge/quote",
838
+ body: args,
839
+ }),
840
+ },
841
+ {
842
+ name: "bridge_execute",
843
+ description: withWriteSafety(
844
+ "Execute a previously quoted cross-chain bridge. Server signs the source-side transaction with the wallet's key, submits to chain, and collects the platform fee. Idempotency is automatic. Returns sourceTxHash; use bridge_status to track destination delivery.",
845
+ ),
846
+ inputSchema: {
847
+ type: "object",
848
+ properties: {
849
+ walletId: { oneOf: [{ type: "integer" }, { type: "string" }] },
850
+ walletAddress: { type: "string" },
851
+ quoteId: { type: "string", description: "Quote identifier returned from bridge_quote." },
852
+ },
853
+ required: ["quoteId"],
854
+ additionalProperties: false,
855
+ },
856
+ parse: (args) => bridgeExecuteArgsSchema.parse(args ?? {}),
857
+ execute: async (args) =>
858
+ callAgentApi({
859
+ method: "POST",
860
+ pathName: "/api/agent/bridge/execute",
861
+ body: args,
862
+ }),
863
+ },
864
+ {
865
+ name: "bridge_status",
866
+ description:
867
+ "Look up the status of a bridge transfer. Returns the current state (submitted | source_confirmed | destination_confirmed | completed | failed) and, when available, the destination chain tx hash and amount received.",
868
+ inputSchema: {
869
+ type: "object",
870
+ properties: {
871
+ bridgeTxId: { type: "string", description: "The bridgeTxId returned from bridge_execute (typically the source chain tx hash)." },
872
+ },
873
+ required: ["bridgeTxId"],
874
+ additionalProperties: false,
875
+ },
876
+ parse: (args) => bridgeStatusArgsSchema.parse(args ?? {}),
877
+ execute: async (args) =>
878
+ callAgentApi({
879
+ method: "GET",
880
+ pathName: "/api/agent/bridge/status",
881
+ query: { bridgeTxId: args.bridgeTxId },
882
+ }),
883
+ },
748
884
  {
749
885
  name: "wallet_create",
750
886
  description: withWriteSafety("Create a new managed wallet under the configured agent key."),
@@ -754,7 +890,7 @@ const tools = [
754
890
  label: { type: "string" },
755
891
  network: {
756
892
  type: "string",
757
- enum: ["sepolia", "mainnet", "polygon-mainnet", "solana-devnet", "solana-testnet", "solana-mainnet"],
893
+ enum: ["sepolia", "mainnet", "polygon-mainnet", "base-mainnet", "solana-devnet", "solana-testnet", "solana-mainnet"],
758
894
  },
759
895
  exportPassphrase: { type: "string", minLength: 12 },
760
896
  exportPassphraseStorageType: { type: "string", enum: ["env", "secret_manager", "vault", "other"] },
@@ -790,12 +926,12 @@ const tools = [
790
926
  },
791
927
  {
792
928
  name: "wallet_import",
793
- description: withWriteSafety("Import a mainnet, polygon-mainnet, or Solana mainnet wallet under the configured agent key."),
929
+ description: withWriteSafety("Import a mainnet, polygon-mainnet, base-mainnet, or Solana mainnet wallet under the configured agent key. EVM wallets work across all EVM chains regardless of which one is chosen here as the home network."),
794
930
  inputSchema: {
795
931
  type: "object",
796
932
  properties: {
797
933
  label: { type: "string" },
798
- network: { type: "string", enum: ["mainnet", "polygon-mainnet", "solana-mainnet"] },
934
+ network: { type: "string", enum: ["mainnet", "polygon-mainnet", "base-mainnet", "solana-mainnet"] },
799
935
  privateKey: { type: "string" },
800
936
  },
801
937
  required: ["label", "network", "privateKey"],
@@ -1290,7 +1426,7 @@ const tools = [
1290
1426
  },
1291
1427
  {
1292
1428
  name: "polymarket_order_limit",
1293
- description: withWriteSafety("Place a Polymarket limit order from a configured polygon-mainnet wallet. Use this for explicit target-price orders; for close-position intent, prefer market SELL unless a limit price is explicitly requested."),
1429
+ description: withWriteSafety("Place a Polymarket limit order from a configured Polymarket-linked EVM wallet. Use this for explicit target-price orders; for close-position intent, prefer market SELL unless a limit price is explicitly requested."),
1294
1430
  inputSchema: {
1295
1431
  type: "object",
1296
1432
  properties: {
@@ -1314,7 +1450,7 @@ const tools = [
1314
1450
  },
1315
1451
  {
1316
1452
  name: "polymarket_order_market",
1317
- description: withWriteSafety("Place a Polymarket market order from a configured polygon-mainnet wallet. For close-position intent on open markets, default to side=SELL (SELL amount is shares); use limit SELL only for explicit target-price requests."),
1453
+ description: withWriteSafety("Place a Polymarket market order from a configured Polymarket-linked EVM wallet. For close-position intent on open markets, default to side=SELL (SELL amount is shares); use limit SELL only for explicit target-price requests."),
1318
1454
  inputSchema: {
1319
1455
  type: "object",
1320
1456
  properties: {
@@ -1339,7 +1475,7 @@ const tools = [
1339
1475
  },
1340
1476
  {
1341
1477
  name: "polymarket_account",
1342
- description: "Read Polymarket account summary for a configured polygon-mainnet wallet.",
1478
+ description: "Read Polymarket account summary for a configured Polymarket-linked EVM wallet.",
1343
1479
  inputSchema: {
1344
1480
  type: "object",
1345
1481
  properties: {
@@ -1358,7 +1494,7 @@ const tools = [
1358
1494
  },
1359
1495
  {
1360
1496
  name: "polymarket_orders",
1361
- description: "List Polymarket open orders for a configured polygon-mainnet wallet.",
1497
+ description: "List Polymarket open orders for a configured Polymarket-linked EVM wallet.",
1362
1498
  inputSchema: {
1363
1499
  type: "object",
1364
1500
  properties: {
@@ -1380,7 +1516,7 @@ const tools = [
1380
1516
  },
1381
1517
  {
1382
1518
  name: "polymarket_cancel_order",
1383
- description: withWriteSafety("Cancel a Polymarket order for a configured polygon-mainnet wallet."),
1519
+ description: withWriteSafety("Cancel a Polymarket order for a configured Polymarket-linked EVM wallet."),
1384
1520
  inputSchema: {
1385
1521
  type: "object",
1386
1522
  properties: {
@@ -1401,7 +1537,7 @@ const tools = [
1401
1537
  },
1402
1538
  {
1403
1539
  name: "polymarket_clear_integration",
1404
- description: withWriteSafety("Clear Polymarket integration for a configured polygon-mainnet wallet."),
1540
+ description: withWriteSafety("Clear Polymarket integration for a configured Polymarket-linked EVM wallet."),
1405
1541
  inputSchema: {
1406
1542
  type: "object",
1407
1543
  properties: {
@@ -1420,7 +1556,7 @@ const tools = [
1420
1556
  },
1421
1557
  {
1422
1558
  name: "polymarket_activity",
1423
- description: "List Polymarket trade activity for a configured polygon-mainnet wallet.",
1559
+ description: "List Polymarket trade activity for a configured Polymarket-linked EVM wallet.",
1424
1560
  inputSchema: {
1425
1561
  type: "object",
1426
1562
  properties: {
@@ -1441,7 +1577,7 @@ const tools = [
1441
1577
  },
1442
1578
  {
1443
1579
  name: "polymarket_positions",
1444
- description: "List Polymarket open positions (open-market filtered) for a configured polygon-mainnet wallet, including position PnL fields.",
1580
+ description: "List Polymarket open positions (open-market filtered) for a configured Polymarket-linked EVM wallet, including position PnL fields.",
1445
1581
  inputSchema: {
1446
1582
  type: "object",
1447
1583
  properties: {
@@ -1461,7 +1597,7 @@ const tools = [
1461
1597
  },
1462
1598
  {
1463
1599
  name: "polymarket_redeemable",
1464
- description: "List currently redeemable Polymarket positions and tokenIds for a configured polygon-mainnet wallet.",
1600
+ description: "List currently redeemable Polymarket positions and tokenIds for a configured Polymarket-linked EVM wallet.",
1465
1601
  inputSchema: {
1466
1602
  type: "object",
1467
1603
  properties: {
@@ -1481,7 +1617,7 @@ const tools = [
1481
1617
  },
1482
1618
  {
1483
1619
  name: "polymarket_redeem",
1484
- description: withWriteSafety("Redeem Polymarket position(s) for a configured polygon-mainnet wallet. The server picks the signing path from the wallet config: signatureType 0 redeems directly on-chain (small POL gas required); 1 / 2 redeems through Polymarket's gasless relayer. Run polymarket_redeemable first to pick a tokenId for single redeem. Omit tokenId to redeem all currently redeemable positions. All-mode is chunked; loop while hasMoreRedeemable=true. Response includes signingPath ('direct' | 'gasless') and signatureType."),
1620
+ description: withWriteSafety("Redeem Polymarket position(s) for a configured Polymarket-linked EVM wallet. The server picks the signing path from the wallet config: signatureType 0 redeems directly on-chain (small POL gas required); 1 / 2 redeems through Polymarket's gasless relayer. Run polymarket_redeemable first to pick a tokenId for single redeem. Omit tokenId to redeem all currently redeemable positions. All-mode is chunked; loop while hasMoreRedeemable=true. Response includes signingPath ('direct' | 'gasless') and signatureType."),
1485
1621
  inputSchema: {
1486
1622
  type: "object",
1487
1623
  properties: {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@openclawcash/mcp-server",
3
- "version": "0.1.15",
4
- "description": "OpenClawCash MCP server for managed agent wallets, balances, transfers, swaps, approvals, Get Paid checkout escrow flows, and Polymarket market resolution/order tools.",
3
+ "version": "0.1.20",
4
+ "description": "OpenClawCash MCP server for managed agent wallets, balances, transfers, swaps, approvals, cross-chain bridges, Get Paid checkout escrow flows, and Polymarket market resolution/order tools.",
5
5
  "type": "module",
6
6
  "license": "Proprietary",
7
7
  "homepage": "https://openclawcash.com/mcp",