@aibtc/mcp-server 1.71.0 → 1.72.1
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 +36 -3
- package/dist/bridge/index.js +2 -2
- package/dist/config/networks.js +4 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +118 -43
- package/dist/tools/arxiv-research.tools.d.ts +1 -1
- package/dist/tools/arxiv-research.tools.js +6 -6
- package/dist/tools/at-stake-legion.tools.d.ts +1 -1
- package/dist/tools/at-stake-legion.tools.js +14 -14
- package/dist/tools/at-stake.tools.d.ts +1 -1
- package/dist/tools/at-stake.tools.js +17 -17
- package/dist/tools/bitcoin.tools.d.ts +1 -1
- package/dist/tools/bitcoin.tools.js +12 -12
- package/dist/tools/bitflow.tools.d.ts +1 -1
- package/dist/tools/bitflow.tools.js +21 -21
- package/dist/tools/bns.tools.d.ts +1 -1
- package/dist/tools/bns.tools.js +18 -18
- package/dist/tools/bounty-hint.d.ts +1 -1
- package/dist/tools/bounty-scanner.tools.d.ts +1 -1
- package/dist/tools/bounty-scanner.tools.js +20 -20
- package/dist/tools/child-inscription.tools.d.ts +1 -1
- package/dist/tools/child-inscription.tools.js +6 -6
- package/dist/tools/competition.tools.d.ts +1 -1
- package/dist/tools/competition.tools.js +4 -4
- package/dist/tools/contract.tools.d.ts +1 -1
- package/dist/tools/contract.tools.js +8 -8
- package/dist/tools/credentials.tools.d.ts +1 -1
- package/dist/tools/credentials.tools.js +8 -8
- package/dist/tools/defi.tools.d.ts +1 -1
- package/dist/tools/defi.tools.js +21 -21
- package/dist/tools/dual-stacking.tools.d.ts +1 -1
- package/dist/tools/dual-stacking.tools.js +7 -7
- package/dist/tools/earning.tools.d.ts +1 -1
- package/dist/tools/earning.tools.js +2 -2
- package/dist/tools/endpoint.tools.d.ts +1 -1
- package/dist/tools/endpoint.tools.js +14 -13
- package/dist/tools/identity.tools.d.ts +1 -1
- package/dist/tools/identity.tools.js +19 -19
- package/dist/tools/inbox-x402.tools.d.ts +1 -1
- package/dist/tools/inbox-x402.tools.js +2 -2
- package/dist/tools/inbox.tools.d.ts +1 -1
- package/dist/tools/inbox.tools.js +2 -2
- package/dist/tools/index.d.ts +6 -3
- package/dist/tools/index.js +69 -58
- package/dist/tools/inference-marketplace.tools.d.ts +1 -1
- package/dist/tools/inference-marketplace.tools.js +10 -10
- package/dist/tools/jingswap.tools.d.ts +1 -1
- package/dist/tools/jingswap.tools.js +30 -30
- package/dist/tools/legion.tools.d.ts +1 -1
- package/dist/tools/legion.tools.js +20 -20
- package/dist/tools/lightning.tools.d.ts +1 -1
- package/dist/tools/lightning.tools.js +14 -14
- package/dist/tools/mempool.tools.d.ts +1 -1
- package/dist/tools/mempool.tools.js +5 -5
- package/dist/tools/news.tools.d.ts +1 -1
- package/dist/tools/news.tools.js +2 -1
- package/dist/tools/nft.tools.d.ts +1 -1
- package/dist/tools/nft.tools.js +12 -12
- package/dist/tools/nonce.tools.d.ts +1 -1
- package/dist/tools/nonce.tools.js +8 -8
- package/dist/tools/nostr.tools.d.ts +1 -1
- package/dist/tools/nostr.tools.js +12 -12
- package/dist/tools/openrouter.tools.d.ts +1 -1
- package/dist/tools/openrouter.tools.js +4 -4
- package/dist/tools/ordinals-marketplace.tools.d.ts +1 -1
- package/dist/tools/ordinals-marketplace.tools.js +10 -10
- package/dist/tools/ordinals-p2p.tools.d.ts +1 -1
- package/dist/tools/ordinals-p2p.tools.js +18 -18
- package/dist/tools/ordinals.tools.d.ts +1 -1
- package/dist/tools/ordinals.tools.js +8 -8
- package/dist/tools/pillar-direct.tools.d.ts +1 -1
- package/dist/tools/pillar-direct.tools.js +36 -36
- package/dist/tools/pillar.tools.d.ts +1 -1
- package/dist/tools/pillar.tools.js +28 -26
- package/dist/tools/profiles.d.ts +51 -0
- package/dist/tools/profiles.js +111 -0
- package/dist/tools/psbt.tools.d.ts +1 -1
- package/dist/tools/psbt.tools.js +8 -8
- package/dist/tools/query.tools.d.ts +1 -1
- package/dist/tools/query.tools.js +12 -12
- package/dist/tools/relay-diagnostic.tools.d.ts +1 -1
- package/dist/tools/relay-diagnostic.tools.js +3 -3
- package/dist/tools/reputation.tools.d.ts +1 -1
- package/dist/tools/reputation.tools.js +22 -22
- package/dist/tools/runes.tools.d.ts +1 -1
- package/dist/tools/runes.tools.js +18 -18
- package/dist/tools/sbtc.tools.d.ts +1 -1
- package/dist/tools/sbtc.tools.js +12 -12
- package/dist/tools/scaffold.tools.d.ts +1 -1
- package/dist/tools/scaffold.tools.js +4 -4
- package/dist/tools/settings.tools.d.ts +1 -1
- package/dist/tools/settings.tools.js +9 -9
- package/dist/tools/signing.tools.d.ts +1 -1
- package/dist/tools/signing.tools.js +20 -20
- package/dist/tools/souldinals.tools.d.ts +1 -1
- package/dist/tools/souldinals.tools.js +10 -10
- package/dist/tools/stacking-lottery.tools.d.ts +1 -1
- package/dist/tools/stacking-lottery.tools.js +11 -11
- package/dist/tools/stacking.tools.d.ts +1 -1
- package/dist/tools/stacking.tools.js +13 -13
- package/dist/tools/stacks-market.tools.d.ts +1 -1
- package/dist/tools/stacks-market.tools.js +22 -22
- package/dist/tools/styx.tools.d.ts +1 -1
- package/dist/tools/styx.tools.js +11 -11
- package/dist/tools/taproot-multisig.tools.d.ts +1 -1
- package/dist/tools/taproot-multisig.tools.js +5 -5
- package/dist/tools/tenero.tools.d.ts +1 -1
- package/dist/tools/tenero.tools.js +22 -22
- package/dist/tools/tokens.tools.d.ts +1 -1
- package/dist/tools/tokens.tools.js +10 -10
- package/dist/tools/transfer.tools.d.ts +1 -1
- package/dist/tools/transfer.tools.js +4 -4
- package/dist/tools/wallet-management.tools.d.ts +1 -1
- package/dist/tools/wallet-management.tools.js +16 -16
- package/dist/tools/wallet.tools.d.ts +1 -1
- package/dist/tools/wallet.tools.js +2 -2
- package/dist/tools/yield-dashboard.tools.d.ts +1 -1
- package/dist/tools/yield-dashboard.tools.js +5 -5
- package/dist/tools/yield-hunter.tools.d.ts +1 -1
- package/dist/tools/yield-hunter.tools.js +6 -6
- package/dist/utils/fee.js +1 -1
- package/package.json +7 -6
- package/skill/SKILL.md +1 -1
|
@@ -85,7 +85,7 @@ export function registerStacksMarketTools(server) {
|
|
|
85
85
|
Returns a paginated list of markets with optional filtering by status, category, or featured flag.
|
|
86
86
|
|
|
87
87
|
Note: Stacks Market is only available on mainnet.`,
|
|
88
|
-
inputSchema: {
|
|
88
|
+
inputSchema: z.object({
|
|
89
89
|
limit: z
|
|
90
90
|
.number()
|
|
91
91
|
.optional()
|
|
@@ -103,7 +103,7 @@ Note: Stacks Market is only available on mainnet.`,
|
|
|
103
103
|
.boolean()
|
|
104
104
|
.optional()
|
|
105
105
|
.describe("When true, return only featured markets"),
|
|
106
|
-
},
|
|
106
|
+
}),
|
|
107
107
|
}, async ({ limit, status, category, featured }) => {
|
|
108
108
|
try {
|
|
109
109
|
if (NETWORK !== "mainnet") {
|
|
@@ -137,14 +137,14 @@ Note: Stacks Market is only available on mainnet.`,
|
|
|
137
137
|
Searches across market titles and descriptions.
|
|
138
138
|
|
|
139
139
|
Note: Stacks Market is only available on mainnet.`,
|
|
140
|
-
inputSchema: {
|
|
140
|
+
inputSchema: z.object({
|
|
141
141
|
query: z.string().describe("Search keyword or phrase"),
|
|
142
142
|
limit: z
|
|
143
143
|
.number()
|
|
144
144
|
.optional()
|
|
145
145
|
.default(20)
|
|
146
146
|
.describe("Maximum number of results to return (default 20)"),
|
|
147
|
-
},
|
|
147
|
+
}),
|
|
148
148
|
}, async ({ query, limit }) => {
|
|
149
149
|
try {
|
|
150
150
|
if (NETWORK !== "mainnet") {
|
|
@@ -172,11 +172,11 @@ Note: Stacks Market is only available on mainnet.`,
|
|
|
172
172
|
Market IDs are epoch millisecond timestamps (uint) visible in market URLs.
|
|
173
173
|
|
|
174
174
|
Note: Stacks Market is only available on mainnet.`,
|
|
175
|
-
inputSchema: {
|
|
175
|
+
inputSchema: z.object({
|
|
176
176
|
market_id: z
|
|
177
177
|
.string()
|
|
178
178
|
.describe("Market ID (epoch ms timestamp, e.g. '1710000000000')"),
|
|
179
|
-
},
|
|
179
|
+
}),
|
|
180
180
|
}, async ({ market_id }) => {
|
|
181
181
|
try {
|
|
182
182
|
if (NETWORK !== "mainnet") {
|
|
@@ -202,7 +202,7 @@ Returns the cost in micro-STX to buy the requested number of shares.
|
|
|
202
202
|
Side: 0 = YES, 1 = NO.
|
|
203
203
|
|
|
204
204
|
Note: Stacks Market is only available on mainnet.`,
|
|
205
|
-
inputSchema: {
|
|
205
|
+
inputSchema: z.object({
|
|
206
206
|
market_id: z
|
|
207
207
|
.string()
|
|
208
208
|
.describe("Market ID (epoch ms timestamp)"),
|
|
@@ -214,7 +214,7 @@ Note: Stacks Market is only available on mainnet.`,
|
|
|
214
214
|
.min(0)
|
|
215
215
|
.max(1)
|
|
216
216
|
.describe("0 = YES shares, 1 = NO shares"),
|
|
217
|
-
},
|
|
217
|
+
}),
|
|
218
218
|
}, async ({ market_id, shares, side }) => {
|
|
219
219
|
try {
|
|
220
220
|
if (NETWORK !== "mainnet") {
|
|
@@ -252,7 +252,7 @@ Returns the proceeds in micro-STX for selling the requested number of shares.
|
|
|
252
252
|
Side: 0 = YES, 1 = NO.
|
|
253
253
|
|
|
254
254
|
Note: Stacks Market is only available on mainnet.`,
|
|
255
|
-
inputSchema: {
|
|
255
|
+
inputSchema: z.object({
|
|
256
256
|
market_id: z
|
|
257
257
|
.string()
|
|
258
258
|
.describe("Market ID (epoch ms timestamp)"),
|
|
@@ -264,7 +264,7 @@ Note: Stacks Market is only available on mainnet.`,
|
|
|
264
264
|
.min(0)
|
|
265
265
|
.max(1)
|
|
266
266
|
.describe("0 = YES shares, 1 = NO shares"),
|
|
267
|
-
},
|
|
267
|
+
}),
|
|
268
268
|
}, async ({ market_id, shares, side }) => {
|
|
269
269
|
try {
|
|
270
270
|
if (NETWORK !== "mainnet") {
|
|
@@ -302,7 +302,7 @@ Uses the buy-yes-auto function with slippage protection via a max-cost cap.
|
|
|
302
302
|
The transaction will fail if the cost exceeds max_cost_ustx.
|
|
303
303
|
|
|
304
304
|
Requires an unlocked wallet. Only available on mainnet.`,
|
|
305
|
-
inputSchema: {
|
|
305
|
+
inputSchema: z.object({
|
|
306
306
|
market_id: z
|
|
307
307
|
.string()
|
|
308
308
|
.describe("Market ID (epoch ms timestamp)"),
|
|
@@ -315,7 +315,7 @@ Requires an unlocked wallet. Only available on mainnet.`,
|
|
|
315
315
|
max_cost_ustx: z
|
|
316
316
|
.string()
|
|
317
317
|
.describe("Maximum cost in micro-STX you are willing to pay (slippage protection)"),
|
|
318
|
-
},
|
|
318
|
+
}),
|
|
319
319
|
}, async ({ market_id, shares, target_cap_ustx, max_cost_ustx }) => {
|
|
320
320
|
try {
|
|
321
321
|
if (NETWORK !== "mainnet") {
|
|
@@ -362,7 +362,7 @@ Uses the buy-no-auto function with slippage protection via a max-cost cap.
|
|
|
362
362
|
The transaction will fail if the cost exceeds max_cost_ustx.
|
|
363
363
|
|
|
364
364
|
Requires an unlocked wallet. Only available on mainnet.`,
|
|
365
|
-
inputSchema: {
|
|
365
|
+
inputSchema: z.object({
|
|
366
366
|
market_id: z
|
|
367
367
|
.string()
|
|
368
368
|
.describe("Market ID (epoch ms timestamp)"),
|
|
@@ -375,7 +375,7 @@ Requires an unlocked wallet. Only available on mainnet.`,
|
|
|
375
375
|
max_cost_ustx: z
|
|
376
376
|
.string()
|
|
377
377
|
.describe("Maximum cost in micro-STX you are willing to pay (slippage protection)"),
|
|
378
|
-
},
|
|
378
|
+
}),
|
|
379
379
|
}, async ({ market_id, shares, target_cap_ustx, max_cost_ustx }) => {
|
|
380
380
|
try {
|
|
381
381
|
if (NETWORK !== "mainnet") {
|
|
@@ -422,7 +422,7 @@ Uses the sell-yes-auto function with a minimum proceeds guard.
|
|
|
422
422
|
The transaction will fail if proceeds fall below min_proceeds_ustx.
|
|
423
423
|
|
|
424
424
|
Requires an unlocked wallet. Only available on mainnet.`,
|
|
425
|
-
inputSchema: {
|
|
425
|
+
inputSchema: z.object({
|
|
426
426
|
market_id: z
|
|
427
427
|
.string()
|
|
428
428
|
.describe("Market ID (epoch ms timestamp)"),
|
|
@@ -432,7 +432,7 @@ Requires an unlocked wallet. Only available on mainnet.`,
|
|
|
432
432
|
min_proceeds_ustx: z
|
|
433
433
|
.string()
|
|
434
434
|
.describe("Minimum acceptable proceeds in micro-STX (slippage protection)"),
|
|
435
|
-
},
|
|
435
|
+
}),
|
|
436
436
|
}, async ({ market_id, shares, min_proceeds_ustx }) => {
|
|
437
437
|
try {
|
|
438
438
|
if (NETWORK !== "mainnet") {
|
|
@@ -478,7 +478,7 @@ Uses the sell-no-auto function with a minimum proceeds guard.
|
|
|
478
478
|
The transaction will fail if proceeds fall below min_proceeds_ustx.
|
|
479
479
|
|
|
480
480
|
Requires an unlocked wallet. Only available on mainnet.`,
|
|
481
|
-
inputSchema: {
|
|
481
|
+
inputSchema: z.object({
|
|
482
482
|
market_id: z
|
|
483
483
|
.string()
|
|
484
484
|
.describe("Market ID (epoch ms timestamp)"),
|
|
@@ -488,7 +488,7 @@ Requires an unlocked wallet. Only available on mainnet.`,
|
|
|
488
488
|
min_proceeds_ustx: z
|
|
489
489
|
.string()
|
|
490
490
|
.describe("Minimum acceptable proceeds in micro-STX (slippage protection)"),
|
|
491
|
-
},
|
|
491
|
+
}),
|
|
492
492
|
}, async ({ market_id, shares, min_proceeds_ustx }) => {
|
|
493
493
|
try {
|
|
494
494
|
if (NETWORK !== "mainnet") {
|
|
@@ -533,11 +533,11 @@ Requires an unlocked wallet. Only available on mainnet.`,
|
|
|
533
533
|
Call this after the market has been resolved to claim STX for the winning side shares you hold.
|
|
534
534
|
|
|
535
535
|
Requires an unlocked wallet. Only available on mainnet.`,
|
|
536
|
-
inputSchema: {
|
|
536
|
+
inputSchema: z.object({
|
|
537
537
|
market_id: z
|
|
538
538
|
.string()
|
|
539
539
|
.describe("Market ID (epoch ms timestamp) of the resolved market"),
|
|
540
|
-
},
|
|
540
|
+
}),
|
|
541
541
|
}, async ({ market_id }) => {
|
|
542
542
|
try {
|
|
543
543
|
if (NETWORK !== "mainnet") {
|
|
@@ -577,7 +577,7 @@ If no address is provided, uses the currently configured wallet address.
|
|
|
577
577
|
No wallet required when an address is explicitly supplied.
|
|
578
578
|
|
|
579
579
|
Note: Stacks Market is only available on mainnet.`,
|
|
580
|
-
inputSchema: {
|
|
580
|
+
inputSchema: z.object({
|
|
581
581
|
market_id: z
|
|
582
582
|
.string()
|
|
583
583
|
.describe("Market ID (epoch ms timestamp)"),
|
|
@@ -585,7 +585,7 @@ Note: Stacks Market is only available on mainnet.`,
|
|
|
585
585
|
.string()
|
|
586
586
|
.optional()
|
|
587
587
|
.describe("Stacks address to check position for. Uses configured wallet if not provided."),
|
|
588
|
-
},
|
|
588
|
+
}),
|
|
589
589
|
}, async ({ market_id, address }) => {
|
|
590
590
|
try {
|
|
591
591
|
if (NETWORK !== "mainnet") {
|
|
@@ -15,6 +15,6 @@
|
|
|
15
15
|
* - styx_status: Deposit status by ID or txid
|
|
16
16
|
* - styx_history: Deposit history for a Stacks address
|
|
17
17
|
*/
|
|
18
|
-
import { McpServer } from "@modelcontextprotocol/
|
|
18
|
+
import { McpServer } from "@modelcontextprotocol/server";
|
|
19
19
|
export declare function registerStyxTools(server: McpServer): void;
|
|
20
20
|
//# sourceMappingURL=styx.tools.d.ts.map
|
package/dist/tools/styx.tools.js
CHANGED
|
@@ -33,12 +33,12 @@ export function registerStyxTools(server) {
|
|
|
33
33
|
server.registerTool("styx_pool_status", {
|
|
34
34
|
description: "Get current Styx pool liquidity and status. " +
|
|
35
35
|
"Shows realAvailable and estimatedAvailable BTC in the pool.",
|
|
36
|
-
inputSchema: {
|
|
36
|
+
inputSchema: z.object({
|
|
37
37
|
pool: z
|
|
38
38
|
.string()
|
|
39
39
|
.optional()
|
|
40
40
|
.describe('Pool ID: "main" (300k sat max) or "aibtc" (1M sat max). Defaults to "main".'),
|
|
41
|
-
},
|
|
41
|
+
}),
|
|
42
42
|
}, async ({ pool = "main" }) => {
|
|
43
43
|
try {
|
|
44
44
|
const status = await styxSDK.getPoolStatus(pool);
|
|
@@ -62,7 +62,7 @@ export function registerStyxTools(server) {
|
|
|
62
62
|
description: "List all available Styx pools with their configurations. " +
|
|
63
63
|
"Pools: main (up to 300k sats, sbtc/usda/pepe), aibtc (up to 1M sats, sbtc/aibtc). " +
|
|
64
64
|
"Minimum deposit: 10,000 sats for both pools.",
|
|
65
|
-
inputSchema: {},
|
|
65
|
+
inputSchema: z.object({}),
|
|
66
66
|
}, async () => {
|
|
67
67
|
try {
|
|
68
68
|
const pools = await styxSDK.getAvailablePools();
|
|
@@ -77,7 +77,7 @@ export function registerStyxTools(server) {
|
|
|
77
77
|
// ---------------------------------------------------------------------------
|
|
78
78
|
server.registerTool("styx_fees", {
|
|
79
79
|
description: "Get current Bitcoin network fee estimates (sat/vB) from Styx: low, medium, high.",
|
|
80
|
-
inputSchema: {},
|
|
80
|
+
inputSchema: z.object({}),
|
|
81
81
|
}, async () => {
|
|
82
82
|
try {
|
|
83
83
|
const fees = await styxSDK.getFeeEstimates();
|
|
@@ -92,7 +92,7 @@ export function registerStyxTools(server) {
|
|
|
92
92
|
// ---------------------------------------------------------------------------
|
|
93
93
|
server.registerTool("styx_price", {
|
|
94
94
|
description: "Get current BTC price in USD from Styx.",
|
|
95
|
-
inputSchema: {},
|
|
95
|
+
inputSchema: z.object({}),
|
|
96
96
|
}, async () => {
|
|
97
97
|
try {
|
|
98
98
|
const price = await styxSDK.getBTCPrice();
|
|
@@ -112,7 +112,7 @@ export function registerStyxTools(server) {
|
|
|
112
112
|
"Requires an unlocked wallet with sufficient BTC balance. " +
|
|
113
113
|
"On mainnet, ordinal UTXOs are automatically filtered out to protect inscriptions. " +
|
|
114
114
|
"Minimum deposit: 10,000 sats. Pool limits: main=300k sats, aibtc=1M sats.",
|
|
115
|
-
inputSchema: {
|
|
115
|
+
inputSchema: z.object({
|
|
116
116
|
amount: z
|
|
117
117
|
.coerce
|
|
118
118
|
.number()
|
|
@@ -136,7 +136,7 @@ export function registerStyxTools(server) {
|
|
|
136
136
|
.enum(["low", "medium", "high"])
|
|
137
137
|
.optional()
|
|
138
138
|
.describe('Fee priority: "low", "medium", or "high". Defaults to "medium".'),
|
|
139
|
-
},
|
|
139
|
+
}),
|
|
140
140
|
}, async ({ amount, stxReceiver, btcSender, pool = "main", fee = "medium" }) => {
|
|
141
141
|
let depositId;
|
|
142
142
|
let broadcastTxid;
|
|
@@ -313,10 +313,10 @@ export function registerStyxTools(server) {
|
|
|
313
313
|
// ---------------------------------------------------------------------------
|
|
314
314
|
server.registerTool("styx_status", {
|
|
315
315
|
description: "Check the status of a Styx BTC→sBTC deposit by deposit ID or Bitcoin transaction ID.",
|
|
316
|
-
inputSchema: {
|
|
316
|
+
inputSchema: z.object({
|
|
317
317
|
id: z.string().optional().describe("Styx deposit ID"),
|
|
318
318
|
txid: z.string().optional().describe("Bitcoin transaction ID"),
|
|
319
|
-
},
|
|
319
|
+
}),
|
|
320
320
|
}, async ({ id, txid }) => {
|
|
321
321
|
try {
|
|
322
322
|
if (!id && !txid) {
|
|
@@ -356,12 +356,12 @@ export function registerStyxTools(server) {
|
|
|
356
356
|
server.registerTool("styx_history", {
|
|
357
357
|
description: "Get BTC→sBTC deposit history for a Stacks address via Styx. " +
|
|
358
358
|
"Uses the active wallet's Stacks address if no address is provided.",
|
|
359
|
-
inputSchema: {
|
|
359
|
+
inputSchema: z.object({
|
|
360
360
|
address: z
|
|
361
361
|
.string()
|
|
362
362
|
.optional()
|
|
363
363
|
.describe("Stacks address to query. Uses active wallet if omitted."),
|
|
364
|
-
},
|
|
364
|
+
}),
|
|
365
365
|
}, async ({ address }) => {
|
|
366
366
|
try {
|
|
367
367
|
let resolvedAddress = address;
|
|
@@ -12,6 +12,6 @@
|
|
|
12
12
|
* - taproot_multisig_guide: Return a step-by-step guide for M-of-N Taproot multisig
|
|
13
13
|
* coordination using OP_CHECKSIGADD (BIP-341/342). Read-only.
|
|
14
14
|
*/
|
|
15
|
-
import { McpServer } from "@modelcontextprotocol/
|
|
15
|
+
import { McpServer } from "@modelcontextprotocol/server";
|
|
16
16
|
export declare function registerTaprootMultisigTools(server: McpServer): void;
|
|
17
17
|
//# sourceMappingURL=taproot-multisig.tools.d.ts.map
|
|
@@ -25,7 +25,7 @@ export function registerTaprootMultisigTools(server) {
|
|
|
25
25
|
"BIP-86 derivation path m/86'/0'/0'/0/0. " +
|
|
26
26
|
"Share this pubkey with co-signers to construct a Taproot multisig script tree. " +
|
|
27
27
|
"Requires the wallet to be unlocked (use wallet_unlock first).",
|
|
28
|
-
inputSchema: {},
|
|
28
|
+
inputSchema: z.object({}),
|
|
29
29
|
}, async () => {
|
|
30
30
|
try {
|
|
31
31
|
const walletManager = getWalletManager();
|
|
@@ -56,7 +56,7 @@ export function registerTaprootMultisigTools(server) {
|
|
|
56
56
|
description: "Verify a Schnorr co-signature against a BIP-341 sighash. " +
|
|
57
57
|
"Use this to confirm that a co-signer's signature is valid before combining and broadcasting. " +
|
|
58
58
|
"Read-only — no wallet unlock required.",
|
|
59
|
-
inputSchema: {
|
|
59
|
+
inputSchema: z.object({
|
|
60
60
|
sighash: z
|
|
61
61
|
.string()
|
|
62
62
|
.length(64)
|
|
@@ -74,7 +74,7 @@ export function registerTaprootMultisigTools(server) {
|
|
|
74
74
|
.regex(/^[0-9a-fA-F]+$/, "must be valid hex")
|
|
75
75
|
.describe("Signer's x-only public key as 32-byte hex string (64 hex chars). " +
|
|
76
76
|
"Obtain via taproot_get_pubkey from each co-signer."),
|
|
77
|
-
},
|
|
77
|
+
}),
|
|
78
78
|
}, async ({ sighash, signature, pubkey }) => {
|
|
79
79
|
try {
|
|
80
80
|
const sighashBytes = Buffer.from(sighash, "hex");
|
|
@@ -110,7 +110,7 @@ export function registerTaprootMultisigTools(server) {
|
|
|
110
110
|
server.registerTool("taproot_multisig_guide", {
|
|
111
111
|
description: "Return a step-by-step guide for M-of-N Taproot multisig coordination between agents " +
|
|
112
112
|
"using OP_CHECKSIGADD (BIP-341/342). Read-only — no wallet needed.",
|
|
113
|
-
inputSchema: {
|
|
113
|
+
inputSchema: z.object({
|
|
114
114
|
m: z
|
|
115
115
|
.number()
|
|
116
116
|
.int()
|
|
@@ -127,7 +127,7 @@ export function registerTaprootMultisigTools(server) {
|
|
|
127
127
|
.optional()
|
|
128
128
|
.default(3)
|
|
129
129
|
.describe("Total number of co-signers (default: 3)."),
|
|
130
|
-
},
|
|
130
|
+
}),
|
|
131
131
|
}, async ({ m, n }) => {
|
|
132
132
|
if (m > n) {
|
|
133
133
|
return createErrorResponse(new Error(`Invalid parameters: m (${m}) cannot exceed n (${n}).`));
|
|
@@ -17,6 +17,6 @@
|
|
|
17
17
|
* - tenero_holder_stats — Token holder distribution and concentration stats
|
|
18
18
|
* - tenero_search — Search tokens, pools, and wallets by name or address
|
|
19
19
|
*/
|
|
20
|
-
import { McpServer } from "@modelcontextprotocol/
|
|
20
|
+
import { McpServer } from "@modelcontextprotocol/server";
|
|
21
21
|
export declare function registerTeneroTools(server: McpServer): void;
|
|
22
22
|
//# sourceMappingURL=tenero.tools.d.ts.map
|
|
@@ -25,7 +25,7 @@ export function registerTeneroTools(server) {
|
|
|
25
25
|
server.registerTool("tenero_token_info", {
|
|
26
26
|
description: "Get token details including metadata, current price, market cap, and 24h volume. " +
|
|
27
27
|
"Powered by the Tenero API (api.tenero.io). No authentication required.",
|
|
28
|
-
inputSchema: {
|
|
28
|
+
inputSchema: z.object({
|
|
29
29
|
contractId: z
|
|
30
30
|
.string()
|
|
31
31
|
.describe("Token contract address in format PRINCIPAL.contract-name " +
|
|
@@ -35,7 +35,7 @@ export function registerTeneroTools(server) {
|
|
|
35
35
|
.optional()
|
|
36
36
|
.default("stacks")
|
|
37
37
|
.describe("Chain to query: stacks, spark, or sportsfun (default: stacks)"),
|
|
38
|
-
},
|
|
38
|
+
}),
|
|
39
39
|
}, async ({ contractId, chain }) => {
|
|
40
40
|
try {
|
|
41
41
|
const data = await getTokenInfo(contractId, chain);
|
|
@@ -50,7 +50,7 @@ export function registerTeneroTools(server) {
|
|
|
50
50
|
description: "Get token market summary including price history, 24h volume, and pool liquidity. " +
|
|
51
51
|
"Returns weighted price across all pools trading this token. " +
|
|
52
52
|
"Powered by the Tenero API (api.tenero.io). No authentication required.",
|
|
53
|
-
inputSchema: {
|
|
53
|
+
inputSchema: z.object({
|
|
54
54
|
contractId: z
|
|
55
55
|
.string()
|
|
56
56
|
.describe("Token contract address in format PRINCIPAL.contract-name " +
|
|
@@ -60,7 +60,7 @@ export function registerTeneroTools(server) {
|
|
|
60
60
|
.optional()
|
|
61
61
|
.default("stacks")
|
|
62
62
|
.describe("Chain to query: stacks, spark, or sportsfun (default: stacks)"),
|
|
63
|
-
},
|
|
63
|
+
}),
|
|
64
64
|
}, async ({ contractId, chain }) => {
|
|
65
65
|
try {
|
|
66
66
|
const data = await getMarketSummary(contractId, chain);
|
|
@@ -76,13 +76,13 @@ export function registerTeneroTools(server) {
|
|
|
76
76
|
"buy/sell netflow, unique traders, and active pools. " +
|
|
77
77
|
"Returns a time series of daily stats for recent periods. " +
|
|
78
78
|
"Powered by the Tenero API (api.tenero.io). No authentication required.",
|
|
79
|
-
inputSchema: {
|
|
79
|
+
inputSchema: z.object({
|
|
80
80
|
chain: z
|
|
81
81
|
.string()
|
|
82
82
|
.optional()
|
|
83
83
|
.default("stacks")
|
|
84
84
|
.describe("Chain to query: stacks, spark, or sportsfun (default: stacks)"),
|
|
85
|
-
},
|
|
85
|
+
}),
|
|
86
86
|
}, async ({ chain }) => {
|
|
87
87
|
try {
|
|
88
88
|
const data = await getMarketStats(chain);
|
|
@@ -97,7 +97,7 @@ export function registerTeneroTools(server) {
|
|
|
97
97
|
description: "List top gaining tokens by 24h price change percentage on the Stacks ecosystem. " +
|
|
98
98
|
"Useful for spotting momentum and trending assets. " +
|
|
99
99
|
"Powered by the Tenero API (api.tenero.io). No authentication required.",
|
|
100
|
-
inputSchema: {
|
|
100
|
+
inputSchema: z.object({
|
|
101
101
|
limit: z
|
|
102
102
|
.number()
|
|
103
103
|
.int()
|
|
@@ -111,7 +111,7 @@ export function registerTeneroTools(server) {
|
|
|
111
111
|
.optional()
|
|
112
112
|
.default("stacks")
|
|
113
113
|
.describe("Chain to query: stacks, spark, or sportsfun (default: stacks)"),
|
|
114
|
-
},
|
|
114
|
+
}),
|
|
115
115
|
}, async ({ limit, chain }) => {
|
|
116
116
|
try {
|
|
117
117
|
const data = await getTopGainers(limit, chain);
|
|
@@ -126,7 +126,7 @@ export function registerTeneroTools(server) {
|
|
|
126
126
|
description: "List top losing tokens by 24h price change percentage on the Stacks ecosystem. " +
|
|
127
127
|
"Useful for identifying underperforming assets or potential reversal candidates. " +
|
|
128
128
|
"Powered by the Tenero API (api.tenero.io). No authentication required.",
|
|
129
|
-
inputSchema: {
|
|
129
|
+
inputSchema: z.object({
|
|
130
130
|
limit: z
|
|
131
131
|
.number()
|
|
132
132
|
.int()
|
|
@@ -140,7 +140,7 @@ export function registerTeneroTools(server) {
|
|
|
140
140
|
.optional()
|
|
141
141
|
.default("stacks")
|
|
142
142
|
.describe("Chain to query: stacks, spark, or sportsfun (default: stacks)"),
|
|
143
|
-
},
|
|
143
|
+
}),
|
|
144
144
|
}, async ({ limit, chain }) => {
|
|
145
145
|
try {
|
|
146
146
|
const data = await getTopLosers(limit, chain);
|
|
@@ -155,7 +155,7 @@ export function registerTeneroTools(server) {
|
|
|
155
155
|
description: "List trending DEX liquidity pools by volume over the last hour. " +
|
|
156
156
|
"Includes pool platform, token pair, volume, and liquidity details. " +
|
|
157
157
|
"Powered by the Tenero API (api.tenero.io). No authentication required.",
|
|
158
|
-
inputSchema: {
|
|
158
|
+
inputSchema: z.object({
|
|
159
159
|
limit: z
|
|
160
160
|
.number()
|
|
161
161
|
.int()
|
|
@@ -169,7 +169,7 @@ export function registerTeneroTools(server) {
|
|
|
169
169
|
.optional()
|
|
170
170
|
.default("stacks")
|
|
171
171
|
.describe("Chain to query: stacks, spark, or sportsfun (default: stacks)"),
|
|
172
|
-
},
|
|
172
|
+
}),
|
|
173
173
|
}, async ({ limit, chain }) => {
|
|
174
174
|
try {
|
|
175
175
|
const data = await getTrendingPools(limit, chain);
|
|
@@ -184,7 +184,7 @@ export function registerTeneroTools(server) {
|
|
|
184
184
|
description: "Get trade history for a Stacks wallet address. " +
|
|
185
185
|
"Returns recent buy/sell events with token, pool, and USD value details. " +
|
|
186
186
|
"Powered by the Tenero API (api.tenero.io). No authentication required.",
|
|
187
|
-
inputSchema: {
|
|
187
|
+
inputSchema: z.object({
|
|
188
188
|
address: z
|
|
189
189
|
.string()
|
|
190
190
|
.describe("Stacks wallet address (SP... or SM...)"),
|
|
@@ -201,7 +201,7 @@ export function registerTeneroTools(server) {
|
|
|
201
201
|
.optional()
|
|
202
202
|
.default("stacks")
|
|
203
203
|
.describe("Chain to query: stacks, spark, or sportsfun (default: stacks)"),
|
|
204
|
-
},
|
|
204
|
+
}),
|
|
205
205
|
}, async ({ address, limit, chain }) => {
|
|
206
206
|
try {
|
|
207
207
|
const data = await getWalletTrades(address, limit, chain);
|
|
@@ -216,7 +216,7 @@ export function registerTeneroTools(server) {
|
|
|
216
216
|
description: "Get token holdings with current USD value for a Stacks wallet address. " +
|
|
217
217
|
"Shows portfolio composition including token balances and estimated values. " +
|
|
218
218
|
"Powered by the Tenero API (api.tenero.io). No authentication required.",
|
|
219
|
-
inputSchema: {
|
|
219
|
+
inputSchema: z.object({
|
|
220
220
|
address: z
|
|
221
221
|
.string()
|
|
222
222
|
.describe("Stacks wallet address (SP... or SM...)"),
|
|
@@ -225,7 +225,7 @@ export function registerTeneroTools(server) {
|
|
|
225
225
|
.optional()
|
|
226
226
|
.default("stacks")
|
|
227
227
|
.describe("Chain to query: stacks, spark, or sportsfun (default: stacks)"),
|
|
228
|
-
},
|
|
228
|
+
}),
|
|
229
229
|
}, async ({ address, chain }) => {
|
|
230
230
|
try {
|
|
231
231
|
const data = await getWalletHoldings(address, chain);
|
|
@@ -240,7 +240,7 @@ export function registerTeneroTools(server) {
|
|
|
240
240
|
description: "Get recent large/whale trades above threshold value on the Stacks ecosystem. " +
|
|
241
241
|
"Useful for tracking smart money and large market movements. " +
|
|
242
242
|
"Powered by the Tenero API (api.tenero.io). No authentication required.",
|
|
243
|
-
inputSchema: {
|
|
243
|
+
inputSchema: z.object({
|
|
244
244
|
limit: z
|
|
245
245
|
.number()
|
|
246
246
|
.int()
|
|
@@ -254,7 +254,7 @@ export function registerTeneroTools(server) {
|
|
|
254
254
|
.optional()
|
|
255
255
|
.default("stacks")
|
|
256
256
|
.describe("Chain to query: stacks, spark, or sportsfun (default: stacks)"),
|
|
257
|
-
},
|
|
257
|
+
}),
|
|
258
258
|
}, async ({ limit, chain }) => {
|
|
259
259
|
try {
|
|
260
260
|
const data = await getWhaleTrades(limit, chain);
|
|
@@ -269,7 +269,7 @@ export function registerTeneroTools(server) {
|
|
|
269
269
|
description: "Get token holder distribution and concentration statistics. " +
|
|
270
270
|
"Shows total holders, top holder percentages, and Gini coefficient. " +
|
|
271
271
|
"Powered by the Tenero API (api.tenero.io). No authentication required.",
|
|
272
|
-
inputSchema: {
|
|
272
|
+
inputSchema: z.object({
|
|
273
273
|
contractId: z
|
|
274
274
|
.string()
|
|
275
275
|
.describe("Token contract address in format PRINCIPAL.contract-name " +
|
|
@@ -279,7 +279,7 @@ export function registerTeneroTools(server) {
|
|
|
279
279
|
.optional()
|
|
280
280
|
.default("stacks")
|
|
281
281
|
.describe("Chain to query: stacks, spark, or sportsfun (default: stacks)"),
|
|
282
|
-
},
|
|
282
|
+
}),
|
|
283
283
|
}, async ({ contractId, chain }) => {
|
|
284
284
|
try {
|
|
285
285
|
const data = await getHolderStats(contractId, chain);
|
|
@@ -294,7 +294,7 @@ export function registerTeneroTools(server) {
|
|
|
294
294
|
description: "Search tokens, pools, and wallets by name, symbol, or contract address. " +
|
|
295
295
|
"Returns matching tokens with metadata and pricing information. " +
|
|
296
296
|
"Powered by the Tenero API (api.tenero.io). No authentication required.",
|
|
297
|
-
inputSchema: {
|
|
297
|
+
inputSchema: z.object({
|
|
298
298
|
query: z
|
|
299
299
|
.string()
|
|
300
300
|
.min(1)
|
|
@@ -304,7 +304,7 @@ export function registerTeneroTools(server) {
|
|
|
304
304
|
.optional()
|
|
305
305
|
.default("stacks")
|
|
306
306
|
.describe("Chain to query: stacks, spark, or sportsfun (default: stacks)"),
|
|
307
|
-
},
|
|
307
|
+
}),
|
|
308
308
|
}, async ({ query, chain }) => {
|
|
309
309
|
try {
|
|
310
310
|
const data = await searchTokens(query, chain);
|
|
@@ -10,13 +10,13 @@ export function registerTokenTools(server) {
|
|
|
10
10
|
|
|
11
11
|
Supports well-known tokens by symbol: sBTC, USDCx, ALEX, DIKO
|
|
12
12
|
Or use the full contract ID: address.contract-name`,
|
|
13
|
-
inputSchema: {
|
|
13
|
+
inputSchema: z.object({
|
|
14
14
|
token: z.string().describe("Token symbol (e.g., 'USDCx', 'sBTC') or contract ID"),
|
|
15
15
|
address: z
|
|
16
16
|
.string()
|
|
17
17
|
.optional()
|
|
18
18
|
.describe("Wallet address to check. Uses configured wallet if not provided."),
|
|
19
|
-
},
|
|
19
|
+
}),
|
|
20
20
|
}, async ({ token, address }) => {
|
|
21
21
|
try {
|
|
22
22
|
const tokensService = getTokensService(NETWORK);
|
|
@@ -47,7 +47,7 @@ Or use the full contract ID: address.contract-name`,
|
|
|
47
47
|
|
|
48
48
|
Supports well-known tokens by symbol: sBTC, USDCx, ALEX, DIKO
|
|
49
49
|
Or use the full contract ID.`,
|
|
50
|
-
inputSchema: {
|
|
50
|
+
inputSchema: z.object({
|
|
51
51
|
token: z.string().describe("Token symbol (e.g., 'USDCx') or contract ID"),
|
|
52
52
|
recipient: z.string().describe("The recipient's Stacks address"),
|
|
53
53
|
amount: z.string().describe("Amount in smallest unit (depends on token decimals)"),
|
|
@@ -56,7 +56,7 @@ Or use the full contract ID.`,
|
|
|
56
56
|
.string()
|
|
57
57
|
.optional()
|
|
58
58
|
.describe("Optional fee: 'low' | 'medium' | 'high' preset or micro-STX amount. If omitted, auto-estimated."),
|
|
59
|
-
},
|
|
59
|
+
}),
|
|
60
60
|
}, async ({ token, recipient, amount, memo, fee }) => {
|
|
61
61
|
try {
|
|
62
62
|
const tokensService = getTokensService(NETWORK);
|
|
@@ -82,9 +82,9 @@ Or use the full contract ID.`,
|
|
|
82
82
|
// Get token info
|
|
83
83
|
server.registerTool("get_token_info", {
|
|
84
84
|
description: "Get metadata for a SIP-010 token (name, symbol, decimals, supply).",
|
|
85
|
-
inputSchema: {
|
|
85
|
+
inputSchema: z.object({
|
|
86
86
|
token: z.string().describe("Token symbol or contract ID"),
|
|
87
|
-
},
|
|
87
|
+
}),
|
|
88
88
|
}, async ({ token }) => {
|
|
89
89
|
try {
|
|
90
90
|
const tokensService = getTokensService(NETWORK);
|
|
@@ -107,12 +107,12 @@ Or use the full contract ID.`,
|
|
|
107
107
|
// List user tokens
|
|
108
108
|
server.registerTool("list_user_tokens", {
|
|
109
109
|
description: "List all fungible tokens owned by an address.",
|
|
110
|
-
inputSchema: {
|
|
110
|
+
inputSchema: z.object({
|
|
111
111
|
address: z
|
|
112
112
|
.string()
|
|
113
113
|
.optional()
|
|
114
114
|
.describe("Wallet address to check. Uses configured wallet if not provided."),
|
|
115
|
-
},
|
|
115
|
+
}),
|
|
116
116
|
}, async ({ address }) => {
|
|
117
117
|
try {
|
|
118
118
|
const tokensService = getTokensService(NETWORK);
|
|
@@ -135,11 +135,11 @@ Or use the full contract ID.`,
|
|
|
135
135
|
// Get token holders
|
|
136
136
|
server.registerTool("get_token_holders", {
|
|
137
137
|
description: "Get the top holders of a SIP-010 token.",
|
|
138
|
-
inputSchema: {
|
|
138
|
+
inputSchema: z.object({
|
|
139
139
|
token: z.string().describe("Token symbol or contract ID"),
|
|
140
140
|
limit: z.number().optional().default(20).describe("Maximum number of holders to return"),
|
|
141
141
|
offset: z.number().optional().default(0).describe("Offset for pagination"),
|
|
142
|
-
},
|
|
142
|
+
}),
|
|
143
143
|
}, async ({ token, limit, offset }) => {
|
|
144
144
|
try {
|
|
145
145
|
const tokensService = getTokensService(NETWORK);
|
|
@@ -12,7 +12,7 @@ export function registerTransferTools(server) {
|
|
|
12
12
|
|
|
13
13
|
Example: To send 2 STX, use amount "2000000" (micro-STX).
|
|
14
14
|
1 STX = 1,000,000 micro-STX`,
|
|
15
|
-
inputSchema: {
|
|
15
|
+
inputSchema: z.object({
|
|
16
16
|
recipient: z.string().describe("The recipient's Stacks address (starts with SP or ST)"),
|
|
17
17
|
amount: z
|
|
18
18
|
.string()
|
|
@@ -23,7 +23,7 @@ Example: To send 2 STX, use amount "2000000" (micro-STX).
|
|
|
23
23
|
.optional()
|
|
24
24
|
.describe("Optional fee: 'low' | 'medium' | 'high' preset or micro-STX amount. Clamped to 3,000 uSTX max for STX transfers. If omitted, medium-priority fee is auto-resolved. Ignored when sponsored=true."),
|
|
25
25
|
sponsored: sponsoredSchema,
|
|
26
|
-
},
|
|
26
|
+
}),
|
|
27
27
|
}, async ({ recipient, amount, memo, fee, sponsored }) => {
|
|
28
28
|
try {
|
|
29
29
|
const account = await getAccount();
|
|
@@ -57,9 +57,9 @@ Example: To send 2 STX, use amount "2000000" (micro-STX).
|
|
|
57
57
|
// Broadcast pre-signed transaction
|
|
58
58
|
server.registerTool("broadcast_transaction", {
|
|
59
59
|
description: "Broadcast a pre-signed Stacks transaction to the network.",
|
|
60
|
-
inputSchema: {
|
|
60
|
+
inputSchema: z.object({
|
|
61
61
|
signedTx: z.string().describe("The signed transaction as a hex string"),
|
|
62
|
-
},
|
|
62
|
+
}),
|
|
63
63
|
}, async ({ signedTx }) => {
|
|
64
64
|
try {
|
|
65
65
|
const result = await broadcastSignedTransaction(signedTx, NETWORK);
|