@openclawcash/mcp-server 0.1.3 → 0.1.4
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/openclawcash-mcp.mjs +672 -6
- package/package.json +1 -1
package/openclawcash-mcp.mjs
CHANGED
|
@@ -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.
|
|
10
|
+
const SERVER_VERSION = "0.1.6";
|
|
11
11
|
const PROTOCOL_VERSION = "2024-11-05";
|
|
12
12
|
const DEFAULT_BASE_URL = "https://openclawcash.com";
|
|
13
13
|
|
|
@@ -178,7 +178,7 @@ const supportedTokensArgsSchema = walletSelectorBaseSchema
|
|
|
178
178
|
|
|
179
179
|
const createWalletArgsSchema = z.object({
|
|
180
180
|
label: z.string().min(1),
|
|
181
|
-
network: z.enum(["sepolia", "mainnet", "solana-devnet", "solana-testnet", "solana-mainnet"]).optional(),
|
|
181
|
+
network: z.enum(["sepolia", "mainnet", "polygon-mainnet", "solana-devnet", "solana-testnet", "solana-mainnet"]).optional(),
|
|
182
182
|
exportPassphrase: z.string().trim().min(12),
|
|
183
183
|
exportPassphraseStorageType: z.enum(["env", "secret_manager", "vault", "other"]),
|
|
184
184
|
exportPassphraseStorageRef: z.string().trim().min(3),
|
|
@@ -187,10 +187,154 @@ const createWalletArgsSchema = z.object({
|
|
|
187
187
|
|
|
188
188
|
const importWalletArgsSchema = z.object({
|
|
189
189
|
label: z.string().min(1),
|
|
190
|
-
network: z.enum(["mainnet", "solana-mainnet"]),
|
|
190
|
+
network: z.enum(["mainnet", "polygon-mainnet", "solana-mainnet"]),
|
|
191
191
|
privateKey: z.string().min(1),
|
|
192
192
|
});
|
|
193
193
|
|
|
194
|
+
const userTagSetArgsSchema = z.object({
|
|
195
|
+
userTag: z
|
|
196
|
+
.string()
|
|
197
|
+
.trim()
|
|
198
|
+
.toLowerCase()
|
|
199
|
+
.min(3)
|
|
200
|
+
.max(64)
|
|
201
|
+
.regex(/^[a-z0-9][a-z0-9._-]{2,63}$/),
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
const polymarketLimitArgsSchema = z
|
|
205
|
+
.object({
|
|
206
|
+
walletId: z.union([z.number().int().positive(), z.string().min(1)]).optional(),
|
|
207
|
+
walletAddress: z.string().min(1).optional(),
|
|
208
|
+
tokenId: z.string().min(1),
|
|
209
|
+
side: z.enum(["BUY", "SELL"]),
|
|
210
|
+
price: z.number().positive(),
|
|
211
|
+
size: z.number().positive(),
|
|
212
|
+
})
|
|
213
|
+
.refine((data) => [data.walletId, data.walletAddress].filter((v) => v !== undefined).length === 1, {
|
|
214
|
+
message: "Provide exactly one of walletId or walletAddress.",
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
const polymarketMarketArgsSchema = z
|
|
218
|
+
.object({
|
|
219
|
+
walletId: z.union([z.number().int().positive(), z.string().min(1)]).optional(),
|
|
220
|
+
walletAddress: z.string().min(1).optional(),
|
|
221
|
+
tokenId: z.string().min(1),
|
|
222
|
+
side: z.enum(["BUY", "SELL"]),
|
|
223
|
+
amount: z.number().positive(),
|
|
224
|
+
orderType: z.enum(["FAK", "FOK", "GTC"]).optional(),
|
|
225
|
+
worstPrice: z.number().min(0).max(1).optional(),
|
|
226
|
+
})
|
|
227
|
+
.refine((data) => [data.walletId, data.walletAddress].filter((v) => v !== undefined).length === 1, {
|
|
228
|
+
message: "Provide exactly one of walletId or walletAddress.",
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
const polymarketReadArgsSchema = z
|
|
232
|
+
.object({
|
|
233
|
+
walletId: z.union([z.number().int().positive(), z.string().min(1)]).optional(),
|
|
234
|
+
walletAddress: z.string().min(1).optional(),
|
|
235
|
+
status: z.string().min(1).optional(),
|
|
236
|
+
limit: z.number().int().positive().max(200).optional(),
|
|
237
|
+
cursor: z.string().min(1).optional(),
|
|
238
|
+
})
|
|
239
|
+
.refine((data) => [data.walletId, data.walletAddress].filter((v) => v !== undefined).length === 1, {
|
|
240
|
+
message: "Provide exactly one of walletId or walletAddress.",
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
const polymarketCancelArgsSchema = z
|
|
244
|
+
.object({
|
|
245
|
+
walletId: z.union([z.number().int().positive(), z.string().min(1)]).optional(),
|
|
246
|
+
walletAddress: z.string().min(1).optional(),
|
|
247
|
+
orderId: z.string().min(1),
|
|
248
|
+
})
|
|
249
|
+
.refine((data) => [data.walletId, data.walletAddress].filter((v) => v !== undefined).length === 1, {
|
|
250
|
+
message: "Provide exactly one of walletId or walletAddress.",
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
const checkoutEscrowIdArgsSchema = z.object({
|
|
254
|
+
id: z.string().min(1),
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
const checkoutPayreqIdArgsSchema = z.object({
|
|
258
|
+
id: z.string().min(1),
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
const checkoutWalletSelectorArgsSchema = z
|
|
262
|
+
.object({
|
|
263
|
+
id: z.string().min(1),
|
|
264
|
+
walletId: z.union([z.number().int().positive(), z.string().min(1)]).optional(),
|
|
265
|
+
walletAddress: z.string().min(1).optional(),
|
|
266
|
+
})
|
|
267
|
+
.refine((data) => [data.walletId, data.walletAddress].filter((v) => v !== undefined).length === 1, {
|
|
268
|
+
message: "Provide exactly one of walletId or walletAddress.",
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
const checkoutCreatePayreqArgsSchema = z
|
|
272
|
+
.object({
|
|
273
|
+
walletId: z.union([z.number().int().positive(), z.string().min(1)]).optional(),
|
|
274
|
+
walletAddress: z.string().min(1).optional(),
|
|
275
|
+
amount: z.string().min(1),
|
|
276
|
+
expiresInSeconds: z.number().int().positive().optional(),
|
|
277
|
+
autoReleaseSeconds: z.number().int().positive().optional(),
|
|
278
|
+
disputeWindowSeconds: z.number().int().positive().optional(),
|
|
279
|
+
metadata: z.record(z.unknown()).optional(),
|
|
280
|
+
})
|
|
281
|
+
.refine((data) => [data.walletId, data.walletAddress].filter((v) => v !== undefined).length === 1, {
|
|
282
|
+
message: "Provide exactly one of walletId or walletAddress.",
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
const checkoutFundingConfirmArgsSchema = z.object({
|
|
286
|
+
id: z.string().min(1),
|
|
287
|
+
txHash: z.string().min(1),
|
|
288
|
+
minConfirmations: z.number().int().positive().optional(),
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
const checkoutAcceptArgsSchema = z.object({
|
|
292
|
+
id: z.string().min(1),
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
const checkoutProofArgsSchema = z.object({
|
|
296
|
+
id: z.string().min(1),
|
|
297
|
+
proofHash: z.string().trim().min(1).max(128),
|
|
298
|
+
proofUrl: z.string().url().optional(),
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
const checkoutDisputeArgsSchema = z.object({
|
|
302
|
+
id: z.string().min(1),
|
|
303
|
+
reasonCode: z.string().trim().min(3).max(64),
|
|
304
|
+
details: z.record(z.unknown()).optional(),
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
const checkoutSwapAndPayArgsSchema = z
|
|
308
|
+
.object({
|
|
309
|
+
id: z.string().min(1),
|
|
310
|
+
walletId: z.union([z.number().int().positive(), z.string().min(1)]).optional(),
|
|
311
|
+
walletAddress: z.string().min(1).optional(),
|
|
312
|
+
confirm: z.boolean().optional(),
|
|
313
|
+
slippage: z.number().positive().max(5).optional(),
|
|
314
|
+
})
|
|
315
|
+
.refine((data) => [data.walletId, data.walletAddress].filter((v) => v !== undefined).length === 1, {
|
|
316
|
+
message: "Provide exactly one of walletId or walletAddress.",
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
const checkoutWebhookCreateArgsSchema = z.object({
|
|
320
|
+
url: z.string().url(),
|
|
321
|
+
eventTypes: z.array(z.string().min(1)).optional(),
|
|
322
|
+
enabled: z.boolean().optional(),
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
const checkoutWebhookUpdateArgsSchema = z.object({
|
|
326
|
+
id: z.union([z.number().int().positive(), z.string().min(1)]),
|
|
327
|
+
url: z.string().url().optional(),
|
|
328
|
+
eventTypes: z.array(z.string().min(1)).optional(),
|
|
329
|
+
enabled: z.boolean().optional(),
|
|
330
|
+
}).refine((data) => data.url !== undefined || data.eventTypes !== undefined || data.enabled !== undefined, {
|
|
331
|
+
message: "Provide at least one of url, eventTypes, or enabled.",
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
const checkoutWebhookDeleteArgsSchema = z.object({
|
|
335
|
+
id: z.union([z.number().int().positive(), z.string().min(1)]),
|
|
336
|
+
});
|
|
337
|
+
|
|
194
338
|
function queryString(params) {
|
|
195
339
|
const search = new URLSearchParams();
|
|
196
340
|
for (const [key, value] of Object.entries(params)) {
|
|
@@ -232,6 +376,9 @@ async function callAgentApi({ method, pathName, query, body, requireAuth = true
|
|
|
232
376
|
if (requireAuth) {
|
|
233
377
|
headers["X-Agent-Key"] = requireAgentKey();
|
|
234
378
|
}
|
|
379
|
+
if (["POST", "PATCH", "DELETE"].includes(String(method || "").toUpperCase())) {
|
|
380
|
+
headers["Idempotency-Key"] = `mcp-${Date.now()}-${Math.random().toString(16).slice(2)}`;
|
|
381
|
+
}
|
|
235
382
|
|
|
236
383
|
const url = `${getBaseUrl()}${pathName}${queryString(query || {})}`;
|
|
237
384
|
const response = await fetch(url, {
|
|
@@ -488,7 +635,7 @@ const tools = [
|
|
|
488
635
|
label: { type: "string" },
|
|
489
636
|
network: {
|
|
490
637
|
type: "string",
|
|
491
|
-
enum: ["sepolia", "mainnet", "solana-devnet", "solana-testnet", "solana-mainnet"],
|
|
638
|
+
enum: ["sepolia", "mainnet", "polygon-mainnet", "solana-devnet", "solana-testnet", "solana-mainnet"],
|
|
492
639
|
},
|
|
493
640
|
exportPassphrase: { type: "string", minLength: 12 },
|
|
494
641
|
exportPassphraseStorageType: { type: "string", enum: ["env", "secret_manager", "vault", "other"] },
|
|
@@ -524,12 +671,12 @@ const tools = [
|
|
|
524
671
|
},
|
|
525
672
|
{
|
|
526
673
|
name: "wallet_import",
|
|
527
|
-
description: withWriteSafety("Import a mainnet or Solana mainnet wallet under the configured agent key."),
|
|
674
|
+
description: withWriteSafety("Import a mainnet, polygon-mainnet, or Solana mainnet wallet under the configured agent key."),
|
|
528
675
|
inputSchema: {
|
|
529
676
|
type: "object",
|
|
530
677
|
properties: {
|
|
531
678
|
label: { type: "string" },
|
|
532
|
-
network: { type: "string", enum: ["mainnet", "solana-mainnet"] },
|
|
679
|
+
network: { type: "string", enum: ["mainnet", "polygon-mainnet", "solana-mainnet"] },
|
|
533
680
|
privateKey: { type: "string" },
|
|
534
681
|
},
|
|
535
682
|
required: ["label", "network", "privateKey"],
|
|
@@ -543,6 +690,524 @@ const tools = [
|
|
|
543
690
|
body: args,
|
|
544
691
|
}),
|
|
545
692
|
},
|
|
693
|
+
{
|
|
694
|
+
name: "user_tag_get",
|
|
695
|
+
description: "Read global checkout user tag for the API key owner.",
|
|
696
|
+
inputSchema: {
|
|
697
|
+
type: "object",
|
|
698
|
+
properties: {},
|
|
699
|
+
additionalProperties: false,
|
|
700
|
+
},
|
|
701
|
+
parse: (args) => z.object({}).parse(args ?? {}),
|
|
702
|
+
execute: async () =>
|
|
703
|
+
callAgentApi({
|
|
704
|
+
method: "GET",
|
|
705
|
+
pathName: "/api/agent/user-tag",
|
|
706
|
+
}),
|
|
707
|
+
},
|
|
708
|
+
{
|
|
709
|
+
name: "user_tag_set",
|
|
710
|
+
description: withWriteSafety("Set global checkout user tag once (immutable after set)."),
|
|
711
|
+
inputSchema: {
|
|
712
|
+
type: "object",
|
|
713
|
+
properties: {
|
|
714
|
+
userTag: { type: "string" },
|
|
715
|
+
},
|
|
716
|
+
required: ["userTag"],
|
|
717
|
+
additionalProperties: false,
|
|
718
|
+
},
|
|
719
|
+
parse: (args) => userTagSetArgsSchema.parse(args ?? {}),
|
|
720
|
+
execute: async (args) =>
|
|
721
|
+
callAgentApi({
|
|
722
|
+
method: "PUT",
|
|
723
|
+
pathName: "/api/agent/user-tag",
|
|
724
|
+
body: args,
|
|
725
|
+
}),
|
|
726
|
+
},
|
|
727
|
+
{
|
|
728
|
+
name: "checkout_payreq_create",
|
|
729
|
+
description: withWriteSafety("Create a checkout pay request and escrow."),
|
|
730
|
+
inputSchema: {
|
|
731
|
+
type: "object",
|
|
732
|
+
properties: {
|
|
733
|
+
walletId: { oneOf: [{ type: "integer" }, { type: "string" }] },
|
|
734
|
+
walletAddress: { type: "string" },
|
|
735
|
+
amount: { type: "string" },
|
|
736
|
+
expiresInSeconds: { type: "integer" },
|
|
737
|
+
autoReleaseSeconds: { type: "integer" },
|
|
738
|
+
disputeWindowSeconds: { type: "integer" },
|
|
739
|
+
metadata: { type: "object", additionalProperties: true },
|
|
740
|
+
},
|
|
741
|
+
required: ["amount"],
|
|
742
|
+
additionalProperties: false,
|
|
743
|
+
},
|
|
744
|
+
parse: (args) => checkoutCreatePayreqArgsSchema.parse(args ?? {}),
|
|
745
|
+
execute: async (args) =>
|
|
746
|
+
callAgentApi({
|
|
747
|
+
method: "POST",
|
|
748
|
+
pathName: "/api/agent/checkout/payreq",
|
|
749
|
+
body: args,
|
|
750
|
+
}),
|
|
751
|
+
},
|
|
752
|
+
{
|
|
753
|
+
name: "checkout_payreq_get",
|
|
754
|
+
description: "Get checkout pay request details by id.",
|
|
755
|
+
inputSchema: {
|
|
756
|
+
type: "object",
|
|
757
|
+
properties: { id: { type: "string" } },
|
|
758
|
+
required: ["id"],
|
|
759
|
+
additionalProperties: false,
|
|
760
|
+
},
|
|
761
|
+
parse: (args) => checkoutPayreqIdArgsSchema.parse(args ?? {}),
|
|
762
|
+
execute: async (args) =>
|
|
763
|
+
callAgentApi({
|
|
764
|
+
method: "GET",
|
|
765
|
+
pathName: `/api/agent/checkout/payreq/${encodeURIComponent(args.id)}`,
|
|
766
|
+
}),
|
|
767
|
+
},
|
|
768
|
+
{
|
|
769
|
+
name: "checkout_escrow_get",
|
|
770
|
+
description: "Get checkout escrow details by escrow id.",
|
|
771
|
+
inputSchema: {
|
|
772
|
+
type: "object",
|
|
773
|
+
properties: { id: { type: "string" } },
|
|
774
|
+
required: ["id"],
|
|
775
|
+
additionalProperties: false,
|
|
776
|
+
},
|
|
777
|
+
parse: (args) => checkoutEscrowIdArgsSchema.parse(args ?? {}),
|
|
778
|
+
execute: async (args) =>
|
|
779
|
+
callAgentApi({
|
|
780
|
+
method: "GET",
|
|
781
|
+
pathName: `/api/agent/checkout/escrows/${encodeURIComponent(args.id)}`,
|
|
782
|
+
}),
|
|
783
|
+
},
|
|
784
|
+
{
|
|
785
|
+
name: "checkout_funding_confirm",
|
|
786
|
+
description: withWriteSafety("Confirm checkout escrow funding transaction."),
|
|
787
|
+
inputSchema: {
|
|
788
|
+
type: "object",
|
|
789
|
+
properties: {
|
|
790
|
+
id: { type: "string" },
|
|
791
|
+
txHash: { type: "string" },
|
|
792
|
+
minConfirmations: { type: "integer" },
|
|
793
|
+
},
|
|
794
|
+
required: ["id", "txHash"],
|
|
795
|
+
additionalProperties: false,
|
|
796
|
+
},
|
|
797
|
+
parse: (args) => checkoutFundingConfirmArgsSchema.parse(args ?? {}),
|
|
798
|
+
execute: async (args) => {
|
|
799
|
+
const { id, ...body } = args;
|
|
800
|
+
return callAgentApi({
|
|
801
|
+
method: "POST",
|
|
802
|
+
pathName: `/api/agent/checkout/escrows/${encodeURIComponent(id)}/funding-confirm`,
|
|
803
|
+
body,
|
|
804
|
+
});
|
|
805
|
+
},
|
|
806
|
+
},
|
|
807
|
+
{
|
|
808
|
+
name: "checkout_accept",
|
|
809
|
+
description: withWriteSafety("Accept escrow as buyer."),
|
|
810
|
+
inputSchema: {
|
|
811
|
+
type: "object",
|
|
812
|
+
properties: {
|
|
813
|
+
id: { type: "string" },
|
|
814
|
+
},
|
|
815
|
+
required: ["id"],
|
|
816
|
+
additionalProperties: false,
|
|
817
|
+
},
|
|
818
|
+
parse: (args) => checkoutAcceptArgsSchema.parse(args ?? {}),
|
|
819
|
+
execute: async (args) => {
|
|
820
|
+
const { id, ...body } = args;
|
|
821
|
+
return callAgentApi({
|
|
822
|
+
method: "POST",
|
|
823
|
+
pathName: `/api/agent/checkout/escrows/${encodeURIComponent(id)}/accept`,
|
|
824
|
+
body,
|
|
825
|
+
});
|
|
826
|
+
},
|
|
827
|
+
},
|
|
828
|
+
{
|
|
829
|
+
name: "checkout_proof_submit",
|
|
830
|
+
description: withWriteSafety("Submit checkout proof."),
|
|
831
|
+
inputSchema: {
|
|
832
|
+
type: "object",
|
|
833
|
+
properties: {
|
|
834
|
+
id: { type: "string" },
|
|
835
|
+
proofHash: { type: "string" },
|
|
836
|
+
proofUrl: { type: "string" },
|
|
837
|
+
},
|
|
838
|
+
required: ["id", "proofHash"],
|
|
839
|
+
additionalProperties: false,
|
|
840
|
+
},
|
|
841
|
+
parse: (args) => checkoutProofArgsSchema.parse(args ?? {}),
|
|
842
|
+
execute: async (args) => {
|
|
843
|
+
const { id, ...body } = args;
|
|
844
|
+
return callAgentApi({
|
|
845
|
+
method: "POST",
|
|
846
|
+
pathName: `/api/agent/checkout/escrows/${encodeURIComponent(id)}/proof`,
|
|
847
|
+
body,
|
|
848
|
+
});
|
|
849
|
+
},
|
|
850
|
+
},
|
|
851
|
+
{
|
|
852
|
+
name: "checkout_dispute_open",
|
|
853
|
+
description: withWriteSafety("Open checkout dispute."),
|
|
854
|
+
inputSchema: {
|
|
855
|
+
type: "object",
|
|
856
|
+
properties: {
|
|
857
|
+
id: { type: "string" },
|
|
858
|
+
reasonCode: { type: "string" },
|
|
859
|
+
details: { type: "object", additionalProperties: true },
|
|
860
|
+
},
|
|
861
|
+
required: ["id", "reasonCode"],
|
|
862
|
+
additionalProperties: false,
|
|
863
|
+
},
|
|
864
|
+
parse: (args) => checkoutDisputeArgsSchema.parse(args ?? {}),
|
|
865
|
+
execute: async (args) => {
|
|
866
|
+
const { id, ...body } = args;
|
|
867
|
+
return callAgentApi({
|
|
868
|
+
method: "POST",
|
|
869
|
+
pathName: `/api/agent/checkout/escrows/${encodeURIComponent(id)}/dispute`,
|
|
870
|
+
body,
|
|
871
|
+
});
|
|
872
|
+
},
|
|
873
|
+
},
|
|
874
|
+
{
|
|
875
|
+
name: "checkout_quick_pay",
|
|
876
|
+
description: withWriteSafety("Directly fund checkout escrow from buyer wallet."),
|
|
877
|
+
inputSchema: {
|
|
878
|
+
type: "object",
|
|
879
|
+
properties: {
|
|
880
|
+
id: { type: "string" },
|
|
881
|
+
walletId: { oneOf: [{ type: "integer" }, { type: "string" }] },
|
|
882
|
+
walletAddress: { type: "string" },
|
|
883
|
+
},
|
|
884
|
+
required: ["id"],
|
|
885
|
+
additionalProperties: false,
|
|
886
|
+
},
|
|
887
|
+
parse: (args) => checkoutWalletSelectorArgsSchema.parse(args ?? {}),
|
|
888
|
+
execute: async (args) => {
|
|
889
|
+
const { id, ...body } = args;
|
|
890
|
+
return callAgentApi({
|
|
891
|
+
method: "POST",
|
|
892
|
+
pathName: `/api/agent/checkout/escrows/${encodeURIComponent(id)}/quick-pay`,
|
|
893
|
+
body,
|
|
894
|
+
});
|
|
895
|
+
},
|
|
896
|
+
},
|
|
897
|
+
{
|
|
898
|
+
name: "checkout_swap_and_pay",
|
|
899
|
+
description: withWriteSafety("Swap source asset and fund checkout escrow."),
|
|
900
|
+
inputSchema: {
|
|
901
|
+
type: "object",
|
|
902
|
+
properties: {
|
|
903
|
+
id: { type: "string" },
|
|
904
|
+
walletId: { oneOf: [{ type: "integer" }, { type: "string" }] },
|
|
905
|
+
walletAddress: { type: "string" },
|
|
906
|
+
confirm: { type: "boolean" },
|
|
907
|
+
slippage: { type: "number" },
|
|
908
|
+
},
|
|
909
|
+
required: ["id"],
|
|
910
|
+
additionalProperties: false,
|
|
911
|
+
},
|
|
912
|
+
parse: (args) => checkoutSwapAndPayArgsSchema.parse(args ?? {}),
|
|
913
|
+
execute: async (args) => {
|
|
914
|
+
const { id, ...body } = args;
|
|
915
|
+
return callAgentApi({
|
|
916
|
+
method: "POST",
|
|
917
|
+
pathName: `/api/agent/checkout/escrows/${encodeURIComponent(id)}/swap-and-pay`,
|
|
918
|
+
body,
|
|
919
|
+
});
|
|
920
|
+
},
|
|
921
|
+
},
|
|
922
|
+
{
|
|
923
|
+
name: "checkout_release",
|
|
924
|
+
description: withWriteSafety("Release checkout escrow to seller."),
|
|
925
|
+
inputSchema: {
|
|
926
|
+
type: "object",
|
|
927
|
+
properties: {
|
|
928
|
+
id: { type: "string" },
|
|
929
|
+
force: { type: "boolean" },
|
|
930
|
+
},
|
|
931
|
+
required: ["id"],
|
|
932
|
+
additionalProperties: false,
|
|
933
|
+
},
|
|
934
|
+
parse: (args) => checkoutEscrowIdArgsSchema.extend({ force: z.boolean().optional() }).parse(args ?? {}),
|
|
935
|
+
execute: async (args) => {
|
|
936
|
+
const { id, ...body } = args;
|
|
937
|
+
return callAgentApi({
|
|
938
|
+
method: "POST",
|
|
939
|
+
pathName: `/api/agent/checkout/escrows/${encodeURIComponent(id)}/release`,
|
|
940
|
+
body,
|
|
941
|
+
});
|
|
942
|
+
},
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
name: "checkout_refund",
|
|
946
|
+
description: withWriteSafety("Refund checkout escrow to buyer."),
|
|
947
|
+
inputSchema: {
|
|
948
|
+
type: "object",
|
|
949
|
+
properties: {
|
|
950
|
+
id: { type: "string" },
|
|
951
|
+
force: { type: "boolean" },
|
|
952
|
+
},
|
|
953
|
+
required: ["id"],
|
|
954
|
+
additionalProperties: false,
|
|
955
|
+
},
|
|
956
|
+
parse: (args) => checkoutEscrowIdArgsSchema.extend({ force: z.boolean().optional() }).parse(args ?? {}),
|
|
957
|
+
execute: async (args) => {
|
|
958
|
+
const { id, ...body } = args;
|
|
959
|
+
return callAgentApi({
|
|
960
|
+
method: "POST",
|
|
961
|
+
pathName: `/api/agent/checkout/escrows/${encodeURIComponent(id)}/refund`,
|
|
962
|
+
body,
|
|
963
|
+
});
|
|
964
|
+
},
|
|
965
|
+
},
|
|
966
|
+
{
|
|
967
|
+
name: "checkout_cancel",
|
|
968
|
+
description: withWriteSafety("Cancel checkout escrow."),
|
|
969
|
+
inputSchema: {
|
|
970
|
+
type: "object",
|
|
971
|
+
properties: {
|
|
972
|
+
id: { type: "string" },
|
|
973
|
+
},
|
|
974
|
+
required: ["id"],
|
|
975
|
+
additionalProperties: false,
|
|
976
|
+
},
|
|
977
|
+
parse: (args) => checkoutEscrowIdArgsSchema.parse(args ?? {}),
|
|
978
|
+
execute: async (args) =>
|
|
979
|
+
callAgentApi({
|
|
980
|
+
method: "POST",
|
|
981
|
+
pathName: `/api/agent/checkout/escrows/${encodeURIComponent(args.id)}/cancel`,
|
|
982
|
+
body: {},
|
|
983
|
+
}),
|
|
984
|
+
},
|
|
985
|
+
{
|
|
986
|
+
name: "checkout_webhooks_list",
|
|
987
|
+
description: "List checkout webhook subscriptions.",
|
|
988
|
+
inputSchema: { type: "object", properties: {}, additionalProperties: false },
|
|
989
|
+
parse: (args) => z.object({}).parse(args ?? {}),
|
|
990
|
+
execute: async () =>
|
|
991
|
+
callAgentApi({
|
|
992
|
+
method: "GET",
|
|
993
|
+
pathName: "/api/agent/checkout/webhooks",
|
|
994
|
+
}),
|
|
995
|
+
},
|
|
996
|
+
{
|
|
997
|
+
name: "checkout_webhook_create",
|
|
998
|
+
description: withWriteSafety("Create checkout webhook subscription."),
|
|
999
|
+
inputSchema: {
|
|
1000
|
+
type: "object",
|
|
1001
|
+
properties: {
|
|
1002
|
+
url: { type: "string" },
|
|
1003
|
+
eventTypes: { type: "array", items: { type: "string" } },
|
|
1004
|
+
enabled: { type: "boolean" },
|
|
1005
|
+
},
|
|
1006
|
+
required: ["url"],
|
|
1007
|
+
additionalProperties: false,
|
|
1008
|
+
},
|
|
1009
|
+
parse: (args) => checkoutWebhookCreateArgsSchema.parse(args ?? {}),
|
|
1010
|
+
execute: async (args) =>
|
|
1011
|
+
callAgentApi({
|
|
1012
|
+
method: "POST",
|
|
1013
|
+
pathName: "/api/agent/checkout/webhooks",
|
|
1014
|
+
body: args,
|
|
1015
|
+
}),
|
|
1016
|
+
},
|
|
1017
|
+
{
|
|
1018
|
+
name: "checkout_webhook_update",
|
|
1019
|
+
description: withWriteSafety("Update checkout webhook subscription."),
|
|
1020
|
+
inputSchema: {
|
|
1021
|
+
type: "object",
|
|
1022
|
+
properties: {
|
|
1023
|
+
id: { oneOf: [{ type: "integer" }, { type: "string" }] },
|
|
1024
|
+
url: { type: "string" },
|
|
1025
|
+
eventTypes: { type: "array", items: { type: "string" } },
|
|
1026
|
+
enabled: { type: "boolean" },
|
|
1027
|
+
},
|
|
1028
|
+
required: ["id"],
|
|
1029
|
+
additionalProperties: false,
|
|
1030
|
+
},
|
|
1031
|
+
parse: (args) => checkoutWebhookUpdateArgsSchema.parse(args ?? {}),
|
|
1032
|
+
execute: async (args) => {
|
|
1033
|
+
const { id, ...body } = args;
|
|
1034
|
+
return callAgentApi({
|
|
1035
|
+
method: "PATCH",
|
|
1036
|
+
pathName: `/api/agent/checkout/webhooks/${encodeURIComponent(String(id))}`,
|
|
1037
|
+
body,
|
|
1038
|
+
});
|
|
1039
|
+
},
|
|
1040
|
+
},
|
|
1041
|
+
{
|
|
1042
|
+
name: "checkout_webhook_delete",
|
|
1043
|
+
description: withWriteSafety("Delete checkout webhook subscription."),
|
|
1044
|
+
inputSchema: {
|
|
1045
|
+
type: "object",
|
|
1046
|
+
properties: {
|
|
1047
|
+
id: { oneOf: [{ type: "integer" }, { type: "string" }] },
|
|
1048
|
+
},
|
|
1049
|
+
required: ["id"],
|
|
1050
|
+
additionalProperties: false,
|
|
1051
|
+
},
|
|
1052
|
+
parse: (args) => checkoutWebhookDeleteArgsSchema.parse(args ?? {}),
|
|
1053
|
+
execute: async (args) =>
|
|
1054
|
+
callAgentApi({
|
|
1055
|
+
method: "DELETE",
|
|
1056
|
+
pathName: `/api/agent/checkout/webhooks/${encodeURIComponent(String(args.id))}`,
|
|
1057
|
+
}),
|
|
1058
|
+
},
|
|
1059
|
+
{
|
|
1060
|
+
name: "polymarket_order_limit",
|
|
1061
|
+
description: withWriteSafety("Place a Polymarket limit order from a configured polygon-mainnet wallet."),
|
|
1062
|
+
inputSchema: {
|
|
1063
|
+
type: "object",
|
|
1064
|
+
properties: {
|
|
1065
|
+
walletId: { oneOf: [{ type: "integer" }, { type: "string" }] },
|
|
1066
|
+
walletAddress: { type: "string" },
|
|
1067
|
+
tokenId: { type: "string" },
|
|
1068
|
+
side: { type: "string", enum: ["BUY", "SELL"] },
|
|
1069
|
+
price: { type: "number" },
|
|
1070
|
+
size: { type: "number" },
|
|
1071
|
+
},
|
|
1072
|
+
required: ["tokenId", "side", "price", "size"],
|
|
1073
|
+
additionalProperties: false,
|
|
1074
|
+
},
|
|
1075
|
+
parse: (args) => polymarketLimitArgsSchema.parse(args ?? {}),
|
|
1076
|
+
execute: async (args) =>
|
|
1077
|
+
callAgentApi({
|
|
1078
|
+
method: "POST",
|
|
1079
|
+
pathName: "/api/agent/venues/polymarket/orders/limit",
|
|
1080
|
+
body: args,
|
|
1081
|
+
}),
|
|
1082
|
+
},
|
|
1083
|
+
{
|
|
1084
|
+
name: "polymarket_order_market",
|
|
1085
|
+
description: withWriteSafety("Place a Polymarket market order from a configured polygon-mainnet wallet."),
|
|
1086
|
+
inputSchema: {
|
|
1087
|
+
type: "object",
|
|
1088
|
+
properties: {
|
|
1089
|
+
walletId: { oneOf: [{ type: "integer" }, { type: "string" }] },
|
|
1090
|
+
walletAddress: { type: "string" },
|
|
1091
|
+
tokenId: { type: "string" },
|
|
1092
|
+
side: { type: "string", enum: ["BUY", "SELL"] },
|
|
1093
|
+
amount: { type: "number" },
|
|
1094
|
+
orderType: { type: "string", enum: ["FAK", "FOK", "GTC"] },
|
|
1095
|
+
worstPrice: { type: "number" },
|
|
1096
|
+
},
|
|
1097
|
+
required: ["tokenId", "side", "amount"],
|
|
1098
|
+
additionalProperties: false,
|
|
1099
|
+
},
|
|
1100
|
+
parse: (args) => polymarketMarketArgsSchema.parse(args ?? {}),
|
|
1101
|
+
execute: async (args) =>
|
|
1102
|
+
callAgentApi({
|
|
1103
|
+
method: "POST",
|
|
1104
|
+
pathName: "/api/agent/venues/polymarket/orders/market",
|
|
1105
|
+
body: args,
|
|
1106
|
+
}),
|
|
1107
|
+
},
|
|
1108
|
+
{
|
|
1109
|
+
name: "polymarket_account",
|
|
1110
|
+
description: "Read Polymarket account summary for a configured polygon-mainnet wallet.",
|
|
1111
|
+
inputSchema: {
|
|
1112
|
+
type: "object",
|
|
1113
|
+
properties: {
|
|
1114
|
+
walletId: { oneOf: [{ type: "integer" }, { type: "string" }] },
|
|
1115
|
+
walletAddress: { type: "string" },
|
|
1116
|
+
},
|
|
1117
|
+
additionalProperties: false,
|
|
1118
|
+
},
|
|
1119
|
+
parse: (args) => polymarketReadArgsSchema.parse(args ?? {}),
|
|
1120
|
+
execute: async (args) =>
|
|
1121
|
+
callAgentApi({
|
|
1122
|
+
method: "GET",
|
|
1123
|
+
pathName: "/api/agent/venues/polymarket/account",
|
|
1124
|
+
query: args,
|
|
1125
|
+
}),
|
|
1126
|
+
},
|
|
1127
|
+
{
|
|
1128
|
+
name: "polymarket_orders",
|
|
1129
|
+
description: "List Polymarket open orders for a configured polygon-mainnet wallet.",
|
|
1130
|
+
inputSchema: {
|
|
1131
|
+
type: "object",
|
|
1132
|
+
properties: {
|
|
1133
|
+
walletId: { oneOf: [{ type: "integer" }, { type: "string" }] },
|
|
1134
|
+
walletAddress: { type: "string" },
|
|
1135
|
+
status: { type: "string" },
|
|
1136
|
+
limit: { type: "integer" },
|
|
1137
|
+
cursor: { type: "string" },
|
|
1138
|
+
},
|
|
1139
|
+
additionalProperties: false,
|
|
1140
|
+
},
|
|
1141
|
+
parse: (args) => polymarketReadArgsSchema.parse(args ?? {}),
|
|
1142
|
+
execute: async (args) =>
|
|
1143
|
+
callAgentApi({
|
|
1144
|
+
method: "GET",
|
|
1145
|
+
pathName: "/api/agent/venues/polymarket/orders",
|
|
1146
|
+
query: args,
|
|
1147
|
+
}),
|
|
1148
|
+
},
|
|
1149
|
+
{
|
|
1150
|
+
name: "polymarket_cancel_order",
|
|
1151
|
+
description: withWriteSafety("Cancel a Polymarket order for a configured polygon-mainnet wallet."),
|
|
1152
|
+
inputSchema: {
|
|
1153
|
+
type: "object",
|
|
1154
|
+
properties: {
|
|
1155
|
+
walletId: { oneOf: [{ type: "integer" }, { type: "string" }] },
|
|
1156
|
+
walletAddress: { type: "string" },
|
|
1157
|
+
orderId: { type: "string" },
|
|
1158
|
+
},
|
|
1159
|
+
required: ["orderId"],
|
|
1160
|
+
additionalProperties: false,
|
|
1161
|
+
},
|
|
1162
|
+
parse: (args) => polymarketCancelArgsSchema.parse(args ?? {}),
|
|
1163
|
+
execute: async (args) =>
|
|
1164
|
+
callAgentApi({
|
|
1165
|
+
method: "POST",
|
|
1166
|
+
pathName: "/api/agent/venues/polymarket/orders/cancel",
|
|
1167
|
+
body: args,
|
|
1168
|
+
}),
|
|
1169
|
+
},
|
|
1170
|
+
{
|
|
1171
|
+
name: "polymarket_activity",
|
|
1172
|
+
description: "List Polymarket trade activity for a configured polygon-mainnet wallet.",
|
|
1173
|
+
inputSchema: {
|
|
1174
|
+
type: "object",
|
|
1175
|
+
properties: {
|
|
1176
|
+
walletId: { oneOf: [{ type: "integer" }, { type: "string" }] },
|
|
1177
|
+
walletAddress: { type: "string" },
|
|
1178
|
+
limit: { type: "integer" },
|
|
1179
|
+
cursor: { type: "string" },
|
|
1180
|
+
},
|
|
1181
|
+
additionalProperties: false,
|
|
1182
|
+
},
|
|
1183
|
+
parse: (args) => polymarketReadArgsSchema.parse(args ?? {}),
|
|
1184
|
+
execute: async (args) =>
|
|
1185
|
+
callAgentApi({
|
|
1186
|
+
method: "GET",
|
|
1187
|
+
pathName: "/api/agent/venues/polymarket/activity",
|
|
1188
|
+
query: args,
|
|
1189
|
+
}),
|
|
1190
|
+
},
|
|
1191
|
+
{
|
|
1192
|
+
name: "polymarket_positions",
|
|
1193
|
+
description: "List Polymarket open positions (open-market filtered) for a configured polygon-mainnet wallet, including position PnL fields.",
|
|
1194
|
+
inputSchema: {
|
|
1195
|
+
type: "object",
|
|
1196
|
+
properties: {
|
|
1197
|
+
walletId: { oneOf: [{ type: "integer" }, { type: "string" }] },
|
|
1198
|
+
walletAddress: { type: "string" },
|
|
1199
|
+
limit: { type: "integer" },
|
|
1200
|
+
},
|
|
1201
|
+
additionalProperties: false,
|
|
1202
|
+
},
|
|
1203
|
+
parse: (args) => polymarketReadArgsSchema.parse(args ?? {}),
|
|
1204
|
+
execute: async (args) =>
|
|
1205
|
+
callAgentApi({
|
|
1206
|
+
method: "GET",
|
|
1207
|
+
pathName: "/api/agent/venues/polymarket/positions",
|
|
1208
|
+
query: args,
|
|
1209
|
+
}),
|
|
1210
|
+
},
|
|
546
1211
|
];
|
|
547
1212
|
|
|
548
1213
|
const resources = [
|
|
@@ -571,6 +1236,7 @@ const resources = [
|
|
|
571
1236
|
"3. Use `wallet_get` or `balances_get` before write actions.",
|
|
572
1237
|
"4. For writes, establish approval mode once per session.",
|
|
573
1238
|
"5. Use `swap_quote` before `swap_execute`.",
|
|
1239
|
+
"6. For Polymarket: ask your human to complete setup in dashboard (/venues/polymarket), then place/cancel orders and inspect account/activity/positions via polymarket tools.",
|
|
574
1240
|
].join("\n"),
|
|
575
1241
|
},
|
|
576
1242
|
];
|
package/package.json
CHANGED