@aibtc/mcp-server 1.36.0 → 1.37.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 (50) hide show
  1. package/dist/services/defi.service.d.ts.map +1 -1
  2. package/dist/services/defi.service.js +4 -17
  3. package/dist/services/defi.service.js.map +1 -1
  4. package/dist/services/wallet-manager.d.ts.map +1 -1
  5. package/dist/services/wallet-manager.js +7 -0
  6. package/dist/services/wallet-manager.js.map +1 -1
  7. package/dist/tools/contract.tools.d.ts.map +1 -1
  8. package/dist/tools/contract.tools.js +3 -2
  9. package/dist/tools/contract.tools.js.map +1 -1
  10. package/dist/tools/index.d.ts.map +1 -1
  11. package/dist/tools/index.js +15 -0
  12. package/dist/tools/index.js.map +1 -1
  13. package/dist/tools/jingswap.tools.d.ts +3 -0
  14. package/dist/tools/jingswap.tools.d.ts.map +1 -0
  15. package/dist/tools/jingswap.tools.js +471 -0
  16. package/dist/tools/jingswap.tools.js.map +1 -0
  17. package/dist/tools/nostr.tools.d.ts +3 -0
  18. package/dist/tools/nostr.tools.d.ts.map +1 -0
  19. package/dist/tools/nostr.tools.js +409 -0
  20. package/dist/tools/nostr.tools.js.map +1 -0
  21. package/dist/tools/ordinals-p2p.tools.d.ts +21 -0
  22. package/dist/tools/ordinals-p2p.tools.d.ts.map +1 -0
  23. package/dist/tools/ordinals-p2p.tools.js +621 -0
  24. package/dist/tools/ordinals-p2p.tools.js.map +1 -0
  25. package/dist/tools/relay-diagnostic.tools.d.ts.map +1 -1
  26. package/dist/tools/relay-diagnostic.tools.js +27 -4
  27. package/dist/tools/relay-diagnostic.tools.js.map +1 -1
  28. package/dist/tools/skill-mappings.d.ts.map +1 -1
  29. package/dist/tools/skill-mappings.js +13 -1
  30. package/dist/tools/skill-mappings.js.map +1 -1
  31. package/dist/tools/stacks-market.tools.d.ts +22 -0
  32. package/dist/tools/stacks-market.tools.d.ts.map +1 -0
  33. package/dist/tools/stacks-market.tools.js +630 -0
  34. package/dist/tools/stacks-market.tools.js.map +1 -0
  35. package/dist/tools/taproot-multisig.tools.d.ts +17 -0
  36. package/dist/tools/taproot-multisig.tools.d.ts.map +1 -0
  37. package/dist/tools/taproot-multisig.tools.js +236 -0
  38. package/dist/tools/taproot-multisig.tools.js.map +1 -0
  39. package/dist/tools/transfer.tools.js +1 -1
  40. package/dist/tools/transfer.tools.js.map +1 -1
  41. package/dist/transactions/builder.d.ts +35 -1
  42. package/dist/transactions/builder.d.ts.map +1 -1
  43. package/dist/transactions/builder.js +153 -4
  44. package/dist/transactions/builder.js.map +1 -1
  45. package/dist/utils/fee.d.ts +15 -0
  46. package/dist/utils/fee.d.ts.map +1 -1
  47. package/dist/utils/fee.js +36 -4
  48. package/dist/utils/fee.js.map +1 -1
  49. package/package.json +4 -1
  50. package/skill/SKILL.md +1 -1
@@ -0,0 +1,630 @@
1
+ /**
2
+ * Stacks Market prediction market tools
3
+ *
4
+ * MCP tools for prediction market trading on stacksmarket.app via the
5
+ * market-factory-v18-bias contract.
6
+ *
7
+ * Tools:
8
+ * - stacks_market_list — List markets with optional filters
9
+ * - stacks_market_search — Keyword search across market titles/descriptions
10
+ * - stacks_market_get — Full details for a specific market
11
+ * - stacks_market_quote_buy — LMSR price quote for buying YES/NO shares
12
+ * - stacks_market_quote_sell — LMSR price quote for selling YES/NO shares
13
+ * - stacks_market_buy_yes — Buy YES shares with slippage protection
14
+ * - stacks_market_buy_no — Buy NO shares with slippage protection
15
+ * - stacks_market_sell_yes — Sell YES shares with minimum proceeds guard
16
+ * - stacks_market_sell_no — Sell NO shares with minimum proceeds guard
17
+ * - stacks_market_redeem — Redeem winning shares after market resolution
18
+ * - stacks_market_get_position — Check YES/NO share balances for any address
19
+ */
20
+ import { z } from "zod";
21
+ import { NETWORK, getExplorerTxUrl } from "../config/networks.js";
22
+ import { createJsonResponse, createErrorResponse } from "../utils/index.js";
23
+ import { getAccount, getWalletAddress } from "../services/x402.service.js";
24
+ import { callContract } from "../transactions/builder.js";
25
+ import { uintCV, principalCV, PostConditionMode, deserializeCV, cvToJSON, } from "@stacks/transactions";
26
+ import { getHiroApi } from "../services/hiro-api.js";
27
+ // ---------------------------------------------------------------------------
28
+ // Constants
29
+ // ---------------------------------------------------------------------------
30
+ const STACKS_MARKET_API = "https://api.stacksmarket.app";
31
+ const MARKET_CONTRACT_ADDRESS = "SP3N5CN0PE7YRRP29X7K9XG22BT861BRS5BN8HFFA";
32
+ const MARKET_CONTRACT_NAME = "market-factory-v18-bias";
33
+ const MARKET_CONTRACT_ID = `${MARKET_CONTRACT_ADDRESS}.${MARKET_CONTRACT_NAME}`;
34
+ // ---------------------------------------------------------------------------
35
+ // Helpers
36
+ // ---------------------------------------------------------------------------
37
+ async function fetchMarketApi(path, params) {
38
+ const url = new URL(`${STACKS_MARKET_API}${path}`);
39
+ if (params) {
40
+ for (const [key, value] of Object.entries(params)) {
41
+ url.searchParams.set(key, value);
42
+ }
43
+ }
44
+ const response = await fetch(url.toString());
45
+ if (!response.ok) {
46
+ throw new Error(`Stacks Market API error (${response.status}): ${await response.text()}`);
47
+ }
48
+ return response.json();
49
+ }
50
+ async function callReadOnly(functionName, args) {
51
+ const hiro = getHiroApi(NETWORK);
52
+ const result = await hiro.callReadOnlyFunction(MARKET_CONTRACT_ID, functionName, args, MARKET_CONTRACT_ADDRESS);
53
+ if (!result.okay) {
54
+ throw new Error(`Read-only call ${functionName} failed: ${result.cause ?? "unknown error"}`);
55
+ }
56
+ if (!result.result) {
57
+ return null;
58
+ }
59
+ const hex = result.result.startsWith("0x")
60
+ ? result.result.slice(2)
61
+ : result.result;
62
+ const cv = deserializeCV(Buffer.from(hex, "hex"));
63
+ return cvToJSON(cv);
64
+ }
65
+ function parseUintResult(val) {
66
+ if (val === null || val === undefined)
67
+ return 0;
68
+ if (typeof val === "object" &&
69
+ val !== null &&
70
+ "value" in val) {
71
+ return Number(val.value);
72
+ }
73
+ return Number(val);
74
+ }
75
+ // ---------------------------------------------------------------------------
76
+ // Tool registration
77
+ // ---------------------------------------------------------------------------
78
+ export function registerStacksMarketTools(server) {
79
+ // ==========================================================================
80
+ // stacks_market_list
81
+ // ==========================================================================
82
+ server.registerTool("stacks_market_list", {
83
+ description: `List prediction markets on stacksmarket.app.
84
+
85
+ Returns a paginated list of markets with optional filtering by status, category, or featured flag.
86
+
87
+ Note: Stacks Market is only available on mainnet.`,
88
+ inputSchema: {
89
+ limit: z
90
+ .number()
91
+ .optional()
92
+ .default(20)
93
+ .describe("Maximum number of markets to return (default 20)"),
94
+ status: z
95
+ .string()
96
+ .optional()
97
+ .describe("Filter by market status: 'open', 'closed', 'resolved', or 'all'"),
98
+ category: z
99
+ .string()
100
+ .optional()
101
+ .describe("Filter by category (e.g. 'crypto', 'sports', 'politics')"),
102
+ featured: z
103
+ .boolean()
104
+ .optional()
105
+ .describe("When true, return only featured markets"),
106
+ },
107
+ }, async ({ limit, status, category, featured }) => {
108
+ try {
109
+ if (NETWORK !== "mainnet") {
110
+ return createJsonResponse({
111
+ error: "Stacks Market is only available on mainnet",
112
+ network: NETWORK,
113
+ });
114
+ }
115
+ const params = {
116
+ limit: String(limit ?? 20),
117
+ };
118
+ if (status)
119
+ params.status = status;
120
+ if (category)
121
+ params.category = category;
122
+ if (featured !== undefined)
123
+ params.featured = String(featured);
124
+ const data = await fetchMarketApi("/api/polls", params);
125
+ return createJsonResponse({ network: NETWORK, markets: data });
126
+ }
127
+ catch (error) {
128
+ return createErrorResponse(error);
129
+ }
130
+ });
131
+ // ==========================================================================
132
+ // stacks_market_search
133
+ // ==========================================================================
134
+ server.registerTool("stacks_market_search", {
135
+ description: `Search prediction markets by keyword on stacksmarket.app.
136
+
137
+ Searches across market titles and descriptions.
138
+
139
+ Note: Stacks Market is only available on mainnet.`,
140
+ inputSchema: {
141
+ query: z.string().describe("Search keyword or phrase"),
142
+ limit: z
143
+ .number()
144
+ .optional()
145
+ .default(20)
146
+ .describe("Maximum number of results to return (default 20)"),
147
+ },
148
+ }, async ({ query, limit }) => {
149
+ try {
150
+ if (NETWORK !== "mainnet") {
151
+ return createJsonResponse({
152
+ error: "Stacks Market is only available on mainnet",
153
+ network: NETWORK,
154
+ });
155
+ }
156
+ const data = await fetchMarketApi("/api/polls/search", {
157
+ query,
158
+ limit: String(limit ?? 20),
159
+ });
160
+ return createJsonResponse({ network: NETWORK, results: data });
161
+ }
162
+ catch (error) {
163
+ return createErrorResponse(error);
164
+ }
165
+ });
166
+ // ==========================================================================
167
+ // stacks_market_get
168
+ // ==========================================================================
169
+ server.registerTool("stacks_market_get", {
170
+ description: `Get full details for a specific prediction market on stacksmarket.app.
171
+
172
+ Market IDs are epoch millisecond timestamps (uint) visible in market URLs.
173
+
174
+ Note: Stacks Market is only available on mainnet.`,
175
+ inputSchema: {
176
+ market_id: z
177
+ .string()
178
+ .describe("Market ID (epoch ms timestamp, e.g. '1710000000000')"),
179
+ },
180
+ }, async ({ market_id }) => {
181
+ try {
182
+ if (NETWORK !== "mainnet") {
183
+ return createJsonResponse({
184
+ error: "Stacks Market is only available on mainnet",
185
+ network: NETWORK,
186
+ });
187
+ }
188
+ const data = await fetchMarketApi(`/api/polls/${market_id}`);
189
+ return createJsonResponse({ network: NETWORK, market: data });
190
+ }
191
+ catch (error) {
192
+ return createErrorResponse(error);
193
+ }
194
+ });
195
+ // ==========================================================================
196
+ // stacks_market_quote_buy
197
+ // ==========================================================================
198
+ server.registerTool("stacks_market_quote_buy", {
199
+ description: `Get an LMSR buy price quote for YES or NO shares on a Stacks Market prediction market.
200
+
201
+ Returns the cost in micro-STX to buy the requested number of shares.
202
+ Side: 0 = YES, 1 = NO.
203
+
204
+ Note: Stacks Market is only available on mainnet.`,
205
+ inputSchema: {
206
+ market_id: z
207
+ .string()
208
+ .describe("Market ID (epoch ms timestamp)"),
209
+ shares: z
210
+ .string()
211
+ .describe("Number of shares to price (integer, smallest unit)"),
212
+ side: z
213
+ .number()
214
+ .min(0)
215
+ .max(1)
216
+ .describe("0 = YES shares, 1 = NO shares"),
217
+ },
218
+ }, async ({ market_id, shares, side }) => {
219
+ try {
220
+ if (NETWORK !== "mainnet") {
221
+ return createJsonResponse({
222
+ error: "Stacks Market is only available on mainnet",
223
+ network: NETWORK,
224
+ });
225
+ }
226
+ const result = await callReadOnly("get-buy-price", [
227
+ uintCV(BigInt(market_id)),
228
+ uintCV(BigInt(shares)),
229
+ uintCV(BigInt(side)),
230
+ ]);
231
+ const cost = parseUintResult(result);
232
+ return createJsonResponse({
233
+ network: NETWORK,
234
+ market_id,
235
+ shares,
236
+ side: side === 0 ? "YES" : "NO",
237
+ cost_ustx: cost,
238
+ cost_stx: cost / 1_000_000,
239
+ });
240
+ }
241
+ catch (error) {
242
+ return createErrorResponse(error);
243
+ }
244
+ });
245
+ // ==========================================================================
246
+ // stacks_market_quote_sell
247
+ // ==========================================================================
248
+ server.registerTool("stacks_market_quote_sell", {
249
+ description: `Get an LMSR sell price quote for YES or NO shares on a Stacks Market prediction market.
250
+
251
+ Returns the proceeds in micro-STX for selling the requested number of shares.
252
+ Side: 0 = YES, 1 = NO.
253
+
254
+ Note: Stacks Market is only available on mainnet.`,
255
+ inputSchema: {
256
+ market_id: z
257
+ .string()
258
+ .describe("Market ID (epoch ms timestamp)"),
259
+ shares: z
260
+ .string()
261
+ .describe("Number of shares to price (integer, smallest unit)"),
262
+ side: z
263
+ .number()
264
+ .min(0)
265
+ .max(1)
266
+ .describe("0 = YES shares, 1 = NO shares"),
267
+ },
268
+ }, async ({ market_id, shares, side }) => {
269
+ try {
270
+ if (NETWORK !== "mainnet") {
271
+ return createJsonResponse({
272
+ error: "Stacks Market is only available on mainnet",
273
+ network: NETWORK,
274
+ });
275
+ }
276
+ const result = await callReadOnly("get-sell-price", [
277
+ uintCV(BigInt(market_id)),
278
+ uintCV(BigInt(shares)),
279
+ uintCV(BigInt(side)),
280
+ ]);
281
+ const proceeds = parseUintResult(result);
282
+ return createJsonResponse({
283
+ network: NETWORK,
284
+ market_id,
285
+ shares,
286
+ side: side === 0 ? "YES" : "NO",
287
+ proceeds_ustx: proceeds,
288
+ proceeds_stx: proceeds / 1_000_000,
289
+ });
290
+ }
291
+ catch (error) {
292
+ return createErrorResponse(error);
293
+ }
294
+ });
295
+ // ==========================================================================
296
+ // stacks_market_buy_yes
297
+ // ==========================================================================
298
+ server.registerTool("stacks_market_buy_yes", {
299
+ description: `Buy YES shares in a Stacks Market prediction market.
300
+
301
+ Uses the buy-yes-auto function with slippage protection via a max-cost cap.
302
+ The transaction will fail if the cost exceeds max_cost_ustx.
303
+
304
+ Requires an unlocked wallet. Only available on mainnet.`,
305
+ inputSchema: {
306
+ market_id: z
307
+ .string()
308
+ .describe("Market ID (epoch ms timestamp)"),
309
+ shares: z
310
+ .string()
311
+ .describe("Number of YES shares to buy (integer, smallest unit)"),
312
+ target_cap_ustx: z
313
+ .string()
314
+ .describe("Target liquidity cap in micro-STX (use current market cap from stacks_market_get)"),
315
+ max_cost_ustx: z
316
+ .string()
317
+ .describe("Maximum cost in micro-STX you are willing to pay (slippage protection)"),
318
+ },
319
+ }, async ({ market_id, shares, target_cap_ustx, max_cost_ustx }) => {
320
+ try {
321
+ if (NETWORK !== "mainnet") {
322
+ return createJsonResponse({
323
+ error: "Stacks Market is only available on mainnet",
324
+ network: NETWORK,
325
+ });
326
+ }
327
+ const account = await getAccount();
328
+ const result = await callContract(account, {
329
+ contractAddress: MARKET_CONTRACT_ADDRESS,
330
+ contractName: MARKET_CONTRACT_NAME,
331
+ functionName: "buy-yes-auto",
332
+ functionArgs: [
333
+ uintCV(BigInt(market_id)),
334
+ uintCV(BigInt(shares)),
335
+ uintCV(BigInt(target_cap_ustx)),
336
+ uintCV(BigInt(max_cost_ustx)),
337
+ ],
338
+ postConditionMode: PostConditionMode.Allow,
339
+ });
340
+ return createJsonResponse({
341
+ success: true,
342
+ txid: result.txid,
343
+ action: "buy-yes",
344
+ market_id,
345
+ shares,
346
+ max_cost_ustx,
347
+ network: NETWORK,
348
+ explorerUrl: getExplorerTxUrl(result.txid, NETWORK),
349
+ });
350
+ }
351
+ catch (error) {
352
+ return createErrorResponse(error);
353
+ }
354
+ });
355
+ // ==========================================================================
356
+ // stacks_market_buy_no
357
+ // ==========================================================================
358
+ server.registerTool("stacks_market_buy_no", {
359
+ description: `Buy NO shares in a Stacks Market prediction market.
360
+
361
+ Uses the buy-no-auto function with slippage protection via a max-cost cap.
362
+ The transaction will fail if the cost exceeds max_cost_ustx.
363
+
364
+ Requires an unlocked wallet. Only available on mainnet.`,
365
+ inputSchema: {
366
+ market_id: z
367
+ .string()
368
+ .describe("Market ID (epoch ms timestamp)"),
369
+ shares: z
370
+ .string()
371
+ .describe("Number of NO shares to buy (integer, smallest unit)"),
372
+ target_cap_ustx: z
373
+ .string()
374
+ .describe("Target liquidity cap in micro-STX (use current market cap from stacks_market_get)"),
375
+ max_cost_ustx: z
376
+ .string()
377
+ .describe("Maximum cost in micro-STX you are willing to pay (slippage protection)"),
378
+ },
379
+ }, async ({ market_id, shares, target_cap_ustx, max_cost_ustx }) => {
380
+ try {
381
+ if (NETWORK !== "mainnet") {
382
+ return createJsonResponse({
383
+ error: "Stacks Market is only available on mainnet",
384
+ network: NETWORK,
385
+ });
386
+ }
387
+ const account = await getAccount();
388
+ const result = await callContract(account, {
389
+ contractAddress: MARKET_CONTRACT_ADDRESS,
390
+ contractName: MARKET_CONTRACT_NAME,
391
+ functionName: "buy-no-auto",
392
+ functionArgs: [
393
+ uintCV(BigInt(market_id)),
394
+ uintCV(BigInt(shares)),
395
+ uintCV(BigInt(target_cap_ustx)),
396
+ uintCV(BigInt(max_cost_ustx)),
397
+ ],
398
+ postConditionMode: PostConditionMode.Allow,
399
+ });
400
+ return createJsonResponse({
401
+ success: true,
402
+ txid: result.txid,
403
+ action: "buy-no",
404
+ market_id,
405
+ shares,
406
+ max_cost_ustx,
407
+ network: NETWORK,
408
+ explorerUrl: getExplorerTxUrl(result.txid, NETWORK),
409
+ });
410
+ }
411
+ catch (error) {
412
+ return createErrorResponse(error);
413
+ }
414
+ });
415
+ // ==========================================================================
416
+ // stacks_market_sell_yes
417
+ // ==========================================================================
418
+ server.registerTool("stacks_market_sell_yes", {
419
+ description: `Sell YES shares in a Stacks Market prediction market.
420
+
421
+ Uses the sell-yes-auto function with a minimum proceeds guard.
422
+ The transaction will fail if proceeds fall below min_proceeds_ustx.
423
+
424
+ Requires an unlocked wallet. Only available on mainnet.`,
425
+ inputSchema: {
426
+ market_id: z
427
+ .string()
428
+ .describe("Market ID (epoch ms timestamp)"),
429
+ shares: z
430
+ .string()
431
+ .describe("Number of YES shares to sell (integer, smallest unit)"),
432
+ min_proceeds_ustx: z
433
+ .string()
434
+ .describe("Minimum acceptable proceeds in micro-STX (slippage protection)"),
435
+ },
436
+ }, async ({ market_id, shares, min_proceeds_ustx }) => {
437
+ try {
438
+ if (NETWORK !== "mainnet") {
439
+ return createJsonResponse({
440
+ error: "Stacks Market is only available on mainnet",
441
+ network: NETWORK,
442
+ });
443
+ }
444
+ const account = await getAccount();
445
+ const result = await callContract(account, {
446
+ contractAddress: MARKET_CONTRACT_ADDRESS,
447
+ contractName: MARKET_CONTRACT_NAME,
448
+ functionName: "sell-yes-auto",
449
+ functionArgs: [
450
+ uintCV(BigInt(market_id)),
451
+ uintCV(BigInt(shares)),
452
+ uintCV(BigInt(min_proceeds_ustx)),
453
+ ],
454
+ postConditionMode: PostConditionMode.Allow,
455
+ });
456
+ return createJsonResponse({
457
+ success: true,
458
+ txid: result.txid,
459
+ action: "sell-yes",
460
+ market_id,
461
+ shares,
462
+ min_proceeds_ustx,
463
+ network: NETWORK,
464
+ explorerUrl: getExplorerTxUrl(result.txid, NETWORK),
465
+ });
466
+ }
467
+ catch (error) {
468
+ return createErrorResponse(error);
469
+ }
470
+ });
471
+ // ==========================================================================
472
+ // stacks_market_sell_no
473
+ // ==========================================================================
474
+ server.registerTool("stacks_market_sell_no", {
475
+ description: `Sell NO shares in a Stacks Market prediction market.
476
+
477
+ Uses the sell-no-auto function with a minimum proceeds guard.
478
+ The transaction will fail if proceeds fall below min_proceeds_ustx.
479
+
480
+ Requires an unlocked wallet. Only available on mainnet.`,
481
+ inputSchema: {
482
+ market_id: z
483
+ .string()
484
+ .describe("Market ID (epoch ms timestamp)"),
485
+ shares: z
486
+ .string()
487
+ .describe("Number of NO shares to sell (integer, smallest unit)"),
488
+ min_proceeds_ustx: z
489
+ .string()
490
+ .describe("Minimum acceptable proceeds in micro-STX (slippage protection)"),
491
+ },
492
+ }, async ({ market_id, shares, min_proceeds_ustx }) => {
493
+ try {
494
+ if (NETWORK !== "mainnet") {
495
+ return createJsonResponse({
496
+ error: "Stacks Market is only available on mainnet",
497
+ network: NETWORK,
498
+ });
499
+ }
500
+ const account = await getAccount();
501
+ const result = await callContract(account, {
502
+ contractAddress: MARKET_CONTRACT_ADDRESS,
503
+ contractName: MARKET_CONTRACT_NAME,
504
+ functionName: "sell-no-auto",
505
+ functionArgs: [
506
+ uintCV(BigInt(market_id)),
507
+ uintCV(BigInt(shares)),
508
+ uintCV(BigInt(min_proceeds_ustx)),
509
+ ],
510
+ postConditionMode: PostConditionMode.Allow,
511
+ });
512
+ return createJsonResponse({
513
+ success: true,
514
+ txid: result.txid,
515
+ action: "sell-no",
516
+ market_id,
517
+ shares,
518
+ min_proceeds_ustx,
519
+ network: NETWORK,
520
+ explorerUrl: getExplorerTxUrl(result.txid, NETWORK),
521
+ });
522
+ }
523
+ catch (error) {
524
+ return createErrorResponse(error);
525
+ }
526
+ });
527
+ // ==========================================================================
528
+ // stacks_market_redeem
529
+ // ==========================================================================
530
+ server.registerTool("stacks_market_redeem", {
531
+ description: `Redeem winning shares after a Stacks Market prediction market is resolved.
532
+
533
+ Call this after the market has been resolved to claim STX for the winning side shares you hold.
534
+
535
+ Requires an unlocked wallet. Only available on mainnet.`,
536
+ inputSchema: {
537
+ market_id: z
538
+ .string()
539
+ .describe("Market ID (epoch ms timestamp) of the resolved market"),
540
+ },
541
+ }, async ({ market_id }) => {
542
+ try {
543
+ if (NETWORK !== "mainnet") {
544
+ return createJsonResponse({
545
+ error: "Stacks Market is only available on mainnet",
546
+ network: NETWORK,
547
+ });
548
+ }
549
+ const account = await getAccount();
550
+ const result = await callContract(account, {
551
+ contractAddress: MARKET_CONTRACT_ADDRESS,
552
+ contractName: MARKET_CONTRACT_NAME,
553
+ functionName: "redeem",
554
+ functionArgs: [uintCV(BigInt(market_id))],
555
+ postConditionMode: PostConditionMode.Allow,
556
+ });
557
+ return createJsonResponse({
558
+ success: true,
559
+ txid: result.txid,
560
+ action: "redeem",
561
+ market_id,
562
+ network: NETWORK,
563
+ explorerUrl: getExplorerTxUrl(result.txid, NETWORK),
564
+ });
565
+ }
566
+ catch (error) {
567
+ return createErrorResponse(error);
568
+ }
569
+ });
570
+ // ==========================================================================
571
+ // stacks_market_get_position
572
+ // ==========================================================================
573
+ server.registerTool("stacks_market_get_position", {
574
+ description: `Check YES and NO share balances for an address in a Stacks Market prediction market.
575
+
576
+ If no address is provided, uses the currently configured wallet address.
577
+ No wallet required when an address is explicitly supplied.
578
+
579
+ Note: Stacks Market is only available on mainnet.`,
580
+ inputSchema: {
581
+ market_id: z
582
+ .string()
583
+ .describe("Market ID (epoch ms timestamp)"),
584
+ address: z
585
+ .string()
586
+ .optional()
587
+ .describe("Stacks address to check position for. Uses configured wallet if not provided."),
588
+ },
589
+ }, async ({ market_id, address }) => {
590
+ try {
591
+ if (NETWORK !== "mainnet") {
592
+ return createJsonResponse({
593
+ error: "Stacks Market is only available on mainnet",
594
+ network: NETWORK,
595
+ });
596
+ }
597
+ const walletAddress = address || (await getWalletAddress());
598
+ const hiro = getHiroApi(NETWORK);
599
+ const [yesRes, noRes] = await Promise.all([
600
+ hiro.callReadOnlyFunction(MARKET_CONTRACT_ID, "get-yes-balance", [uintCV(BigInt(market_id)), principalCV(walletAddress)], MARKET_CONTRACT_ADDRESS),
601
+ hiro.callReadOnlyFunction(MARKET_CONTRACT_ID, "get-no-balance", [uintCV(BigInt(market_id)), principalCV(walletAddress)], MARKET_CONTRACT_ADDRESS),
602
+ ]);
603
+ if (!yesRes.okay) {
604
+ throw new Error(`Failed to fetch YES balance for market ${market_id}: ${yesRes.cause ?? "unknown error"}`);
605
+ }
606
+ if (!noRes.okay) {
607
+ throw new Error(`Failed to fetch NO balance for market ${market_id}: ${noRes.cause ?? "unknown error"}`);
608
+ }
609
+ const yesBalance = yesRes.result
610
+ ? parseUintResult(cvToJSON(deserializeCV(Buffer.from(yesRes.result.startsWith("0x") ? yesRes.result.slice(2) : yesRes.result, "hex"))))
611
+ : 0;
612
+ const noBalance = noRes.result
613
+ ? parseUintResult(cvToJSON(deserializeCV(Buffer.from(noRes.result.startsWith("0x") ? noRes.result.slice(2) : noRes.result, "hex"))))
614
+ : 0;
615
+ return createJsonResponse({
616
+ network: NETWORK,
617
+ market_id,
618
+ address: walletAddress,
619
+ position: {
620
+ yes_shares: yesBalance,
621
+ no_shares: noBalance,
622
+ },
623
+ });
624
+ }
625
+ catch (error) {
626
+ return createErrorResponse(error);
627
+ }
628
+ });
629
+ }
630
+ //# sourceMappingURL=stacks-market.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stacks-market.tools.js","sourceRoot":"","sources":["../../src/tools/stacks-market.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Taproot Multisig Tools
3
+ *
4
+ * MCP tools for Taproot M-of-N multisig coordination between agents.
5
+ *
6
+ * - taproot_get_pubkey: Derive the x-only Taproot public key from the active wallet
7
+ * (BIP-86 path m/86'/0'/0'/0/0). Requires wallet unlock.
8
+ *
9
+ * - taproot_verify_cosig: Verify a Schnorr signature against a BIP-341 sighash.
10
+ * Read-only — no wallet needed.
11
+ *
12
+ * - taproot_multisig_guide: Return a step-by-step guide for M-of-N Taproot multisig
13
+ * coordination using OP_CHECKSIGADD (BIP-341/342). Read-only.
14
+ */
15
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
16
+ export declare function registerTaprootMultisigTools(server: McpServer): void;
17
+ //# sourceMappingURL=taproot-multisig.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taproot-multisig.tools.d.ts","sourceRoot":"","sources":["../../src/tools/taproot-multisig.tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoQpE"}