@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.
Files changed (123) hide show
  1. package/README.md +36 -3
  2. package/dist/bridge/index.js +2 -2
  3. package/dist/config/networks.js +4 -1
  4. package/dist/index.d.ts +1 -1
  5. package/dist/index.js +118 -43
  6. package/dist/tools/arxiv-research.tools.d.ts +1 -1
  7. package/dist/tools/arxiv-research.tools.js +6 -6
  8. package/dist/tools/at-stake-legion.tools.d.ts +1 -1
  9. package/dist/tools/at-stake-legion.tools.js +14 -14
  10. package/dist/tools/at-stake.tools.d.ts +1 -1
  11. package/dist/tools/at-stake.tools.js +17 -17
  12. package/dist/tools/bitcoin.tools.d.ts +1 -1
  13. package/dist/tools/bitcoin.tools.js +12 -12
  14. package/dist/tools/bitflow.tools.d.ts +1 -1
  15. package/dist/tools/bitflow.tools.js +21 -21
  16. package/dist/tools/bns.tools.d.ts +1 -1
  17. package/dist/tools/bns.tools.js +18 -18
  18. package/dist/tools/bounty-hint.d.ts +1 -1
  19. package/dist/tools/bounty-scanner.tools.d.ts +1 -1
  20. package/dist/tools/bounty-scanner.tools.js +20 -20
  21. package/dist/tools/child-inscription.tools.d.ts +1 -1
  22. package/dist/tools/child-inscription.tools.js +6 -6
  23. package/dist/tools/competition.tools.d.ts +1 -1
  24. package/dist/tools/competition.tools.js +4 -4
  25. package/dist/tools/contract.tools.d.ts +1 -1
  26. package/dist/tools/contract.tools.js +8 -8
  27. package/dist/tools/credentials.tools.d.ts +1 -1
  28. package/dist/tools/credentials.tools.js +8 -8
  29. package/dist/tools/defi.tools.d.ts +1 -1
  30. package/dist/tools/defi.tools.js +21 -21
  31. package/dist/tools/dual-stacking.tools.d.ts +1 -1
  32. package/dist/tools/dual-stacking.tools.js +7 -7
  33. package/dist/tools/earning.tools.d.ts +1 -1
  34. package/dist/tools/earning.tools.js +2 -2
  35. package/dist/tools/endpoint.tools.d.ts +1 -1
  36. package/dist/tools/endpoint.tools.js +14 -13
  37. package/dist/tools/identity.tools.d.ts +1 -1
  38. package/dist/tools/identity.tools.js +19 -19
  39. package/dist/tools/inbox-x402.tools.d.ts +1 -1
  40. package/dist/tools/inbox-x402.tools.js +2 -2
  41. package/dist/tools/inbox.tools.d.ts +1 -1
  42. package/dist/tools/inbox.tools.js +2 -2
  43. package/dist/tools/index.d.ts +6 -3
  44. package/dist/tools/index.js +69 -58
  45. package/dist/tools/inference-marketplace.tools.d.ts +1 -1
  46. package/dist/tools/inference-marketplace.tools.js +10 -10
  47. package/dist/tools/jingswap.tools.d.ts +1 -1
  48. package/dist/tools/jingswap.tools.js +30 -30
  49. package/dist/tools/legion.tools.d.ts +1 -1
  50. package/dist/tools/legion.tools.js +20 -20
  51. package/dist/tools/lightning.tools.d.ts +1 -1
  52. package/dist/tools/lightning.tools.js +14 -14
  53. package/dist/tools/mempool.tools.d.ts +1 -1
  54. package/dist/tools/mempool.tools.js +5 -5
  55. package/dist/tools/news.tools.d.ts +1 -1
  56. package/dist/tools/news.tools.js +2 -1
  57. package/dist/tools/nft.tools.d.ts +1 -1
  58. package/dist/tools/nft.tools.js +12 -12
  59. package/dist/tools/nonce.tools.d.ts +1 -1
  60. package/dist/tools/nonce.tools.js +8 -8
  61. package/dist/tools/nostr.tools.d.ts +1 -1
  62. package/dist/tools/nostr.tools.js +12 -12
  63. package/dist/tools/openrouter.tools.d.ts +1 -1
  64. package/dist/tools/openrouter.tools.js +4 -4
  65. package/dist/tools/ordinals-marketplace.tools.d.ts +1 -1
  66. package/dist/tools/ordinals-marketplace.tools.js +10 -10
  67. package/dist/tools/ordinals-p2p.tools.d.ts +1 -1
  68. package/dist/tools/ordinals-p2p.tools.js +18 -18
  69. package/dist/tools/ordinals.tools.d.ts +1 -1
  70. package/dist/tools/ordinals.tools.js +8 -8
  71. package/dist/tools/pillar-direct.tools.d.ts +1 -1
  72. package/dist/tools/pillar-direct.tools.js +36 -36
  73. package/dist/tools/pillar.tools.d.ts +1 -1
  74. package/dist/tools/pillar.tools.js +28 -26
  75. package/dist/tools/profiles.d.ts +51 -0
  76. package/dist/tools/profiles.js +111 -0
  77. package/dist/tools/psbt.tools.d.ts +1 -1
  78. package/dist/tools/psbt.tools.js +8 -8
  79. package/dist/tools/query.tools.d.ts +1 -1
  80. package/dist/tools/query.tools.js +12 -12
  81. package/dist/tools/relay-diagnostic.tools.d.ts +1 -1
  82. package/dist/tools/relay-diagnostic.tools.js +3 -3
  83. package/dist/tools/reputation.tools.d.ts +1 -1
  84. package/dist/tools/reputation.tools.js +22 -22
  85. package/dist/tools/runes.tools.d.ts +1 -1
  86. package/dist/tools/runes.tools.js +18 -18
  87. package/dist/tools/sbtc.tools.d.ts +1 -1
  88. package/dist/tools/sbtc.tools.js +12 -12
  89. package/dist/tools/scaffold.tools.d.ts +1 -1
  90. package/dist/tools/scaffold.tools.js +4 -4
  91. package/dist/tools/settings.tools.d.ts +1 -1
  92. package/dist/tools/settings.tools.js +9 -9
  93. package/dist/tools/signing.tools.d.ts +1 -1
  94. package/dist/tools/signing.tools.js +20 -20
  95. package/dist/tools/souldinals.tools.d.ts +1 -1
  96. package/dist/tools/souldinals.tools.js +10 -10
  97. package/dist/tools/stacking-lottery.tools.d.ts +1 -1
  98. package/dist/tools/stacking-lottery.tools.js +11 -11
  99. package/dist/tools/stacking.tools.d.ts +1 -1
  100. package/dist/tools/stacking.tools.js +13 -13
  101. package/dist/tools/stacks-market.tools.d.ts +1 -1
  102. package/dist/tools/stacks-market.tools.js +22 -22
  103. package/dist/tools/styx.tools.d.ts +1 -1
  104. package/dist/tools/styx.tools.js +11 -11
  105. package/dist/tools/taproot-multisig.tools.d.ts +1 -1
  106. package/dist/tools/taproot-multisig.tools.js +5 -5
  107. package/dist/tools/tenero.tools.d.ts +1 -1
  108. package/dist/tools/tenero.tools.js +22 -22
  109. package/dist/tools/tokens.tools.d.ts +1 -1
  110. package/dist/tools/tokens.tools.js +10 -10
  111. package/dist/tools/transfer.tools.d.ts +1 -1
  112. package/dist/tools/transfer.tools.js +4 -4
  113. package/dist/tools/wallet-management.tools.d.ts +1 -1
  114. package/dist/tools/wallet-management.tools.js +16 -16
  115. package/dist/tools/wallet.tools.d.ts +1 -1
  116. package/dist/tools/wallet.tools.js +2 -2
  117. package/dist/tools/yield-dashboard.tools.d.ts +1 -1
  118. package/dist/tools/yield-dashboard.tools.js +5 -5
  119. package/dist/tools/yield-hunter.tools.d.ts +1 -1
  120. package/dist/tools/yield-hunter.tools.js +6 -6
  121. package/dist/utils/fee.js +1 -1
  122. package/package.json +7 -6
  123. 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/sdk/server/mcp.js";
18
+ import { McpServer } from "@modelcontextprotocol/server";
19
19
  export declare function registerStyxTools(server: McpServer): void;
20
20
  //# sourceMappingURL=styx.tools.d.ts.map
@@ -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/sdk/server/mcp.js";
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/sdk/server/mcp.js";
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);
@@ -1,3 +1,3 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
1
+ import { McpServer } from "@modelcontextprotocol/server";
2
2
  export declare function registerTokenTools(server: McpServer): void;
3
3
  //# sourceMappingURL=tokens.tools.d.ts.map
@@ -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);
@@ -1,3 +1,3 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
1
+ import { McpServer } from "@modelcontextprotocol/server";
2
2
  export declare function registerTransferTools(server: McpServer): void;
3
3
  //# sourceMappingURL=transfer.tools.d.ts.map
@@ -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);
@@ -1,4 +1,4 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
1
+ import { McpServer } from "@modelcontextprotocol/server";
2
2
  /**
3
3
  * Register wallet management tools
4
4
  */