@aibtc/mcp-server 1.71.0 → 1.72.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 (122) 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.js +118 -42
  5. package/dist/tools/arxiv-research.tools.d.ts +1 -1
  6. package/dist/tools/arxiv-research.tools.js +6 -6
  7. package/dist/tools/at-stake-legion.tools.d.ts +1 -1
  8. package/dist/tools/at-stake-legion.tools.js +14 -14
  9. package/dist/tools/at-stake.tools.d.ts +1 -1
  10. package/dist/tools/at-stake.tools.js +17 -17
  11. package/dist/tools/bitcoin.tools.d.ts +1 -1
  12. package/dist/tools/bitcoin.tools.js +12 -12
  13. package/dist/tools/bitflow.tools.d.ts +1 -1
  14. package/dist/tools/bitflow.tools.js +21 -21
  15. package/dist/tools/bns.tools.d.ts +1 -1
  16. package/dist/tools/bns.tools.js +18 -18
  17. package/dist/tools/bounty-hint.d.ts +1 -1
  18. package/dist/tools/bounty-scanner.tools.d.ts +1 -1
  19. package/dist/tools/bounty-scanner.tools.js +20 -20
  20. package/dist/tools/child-inscription.tools.d.ts +1 -1
  21. package/dist/tools/child-inscription.tools.js +6 -6
  22. package/dist/tools/competition.tools.d.ts +1 -1
  23. package/dist/tools/competition.tools.js +4 -4
  24. package/dist/tools/contract.tools.d.ts +1 -1
  25. package/dist/tools/contract.tools.js +8 -8
  26. package/dist/tools/credentials.tools.d.ts +1 -1
  27. package/dist/tools/credentials.tools.js +8 -8
  28. package/dist/tools/defi.tools.d.ts +1 -1
  29. package/dist/tools/defi.tools.js +21 -21
  30. package/dist/tools/dual-stacking.tools.d.ts +1 -1
  31. package/dist/tools/dual-stacking.tools.js +7 -7
  32. package/dist/tools/earning.tools.d.ts +1 -1
  33. package/dist/tools/earning.tools.js +2 -2
  34. package/dist/tools/endpoint.tools.d.ts +1 -1
  35. package/dist/tools/endpoint.tools.js +14 -13
  36. package/dist/tools/identity.tools.d.ts +1 -1
  37. package/dist/tools/identity.tools.js +19 -19
  38. package/dist/tools/inbox-x402.tools.d.ts +1 -1
  39. package/dist/tools/inbox-x402.tools.js +2 -2
  40. package/dist/tools/inbox.tools.d.ts +1 -1
  41. package/dist/tools/inbox.tools.js +2 -2
  42. package/dist/tools/index.d.ts +6 -3
  43. package/dist/tools/index.js +69 -58
  44. package/dist/tools/inference-marketplace.tools.d.ts +1 -1
  45. package/dist/tools/inference-marketplace.tools.js +10 -10
  46. package/dist/tools/jingswap.tools.d.ts +1 -1
  47. package/dist/tools/jingswap.tools.js +30 -30
  48. package/dist/tools/legion.tools.d.ts +1 -1
  49. package/dist/tools/legion.tools.js +20 -20
  50. package/dist/tools/lightning.tools.d.ts +1 -1
  51. package/dist/tools/lightning.tools.js +14 -14
  52. package/dist/tools/mempool.tools.d.ts +1 -1
  53. package/dist/tools/mempool.tools.js +5 -5
  54. package/dist/tools/news.tools.d.ts +1 -1
  55. package/dist/tools/news.tools.js +2 -1
  56. package/dist/tools/nft.tools.d.ts +1 -1
  57. package/dist/tools/nft.tools.js +12 -12
  58. package/dist/tools/nonce.tools.d.ts +1 -1
  59. package/dist/tools/nonce.tools.js +8 -8
  60. package/dist/tools/nostr.tools.d.ts +1 -1
  61. package/dist/tools/nostr.tools.js +12 -12
  62. package/dist/tools/openrouter.tools.d.ts +1 -1
  63. package/dist/tools/openrouter.tools.js +4 -4
  64. package/dist/tools/ordinals-marketplace.tools.d.ts +1 -1
  65. package/dist/tools/ordinals-marketplace.tools.js +10 -10
  66. package/dist/tools/ordinals-p2p.tools.d.ts +1 -1
  67. package/dist/tools/ordinals-p2p.tools.js +18 -18
  68. package/dist/tools/ordinals.tools.d.ts +1 -1
  69. package/dist/tools/ordinals.tools.js +8 -8
  70. package/dist/tools/pillar-direct.tools.d.ts +1 -1
  71. package/dist/tools/pillar-direct.tools.js +36 -36
  72. package/dist/tools/pillar.tools.d.ts +1 -1
  73. package/dist/tools/pillar.tools.js +28 -26
  74. package/dist/tools/profiles.d.ts +51 -0
  75. package/dist/tools/profiles.js +111 -0
  76. package/dist/tools/psbt.tools.d.ts +1 -1
  77. package/dist/tools/psbt.tools.js +8 -8
  78. package/dist/tools/query.tools.d.ts +1 -1
  79. package/dist/tools/query.tools.js +12 -12
  80. package/dist/tools/relay-diagnostic.tools.d.ts +1 -1
  81. package/dist/tools/relay-diagnostic.tools.js +3 -3
  82. package/dist/tools/reputation.tools.d.ts +1 -1
  83. package/dist/tools/reputation.tools.js +22 -22
  84. package/dist/tools/runes.tools.d.ts +1 -1
  85. package/dist/tools/runes.tools.js +18 -18
  86. package/dist/tools/sbtc.tools.d.ts +1 -1
  87. package/dist/tools/sbtc.tools.js +12 -12
  88. package/dist/tools/scaffold.tools.d.ts +1 -1
  89. package/dist/tools/scaffold.tools.js +4 -4
  90. package/dist/tools/settings.tools.d.ts +1 -1
  91. package/dist/tools/settings.tools.js +9 -9
  92. package/dist/tools/signing.tools.d.ts +1 -1
  93. package/dist/tools/signing.tools.js +20 -20
  94. package/dist/tools/souldinals.tools.d.ts +1 -1
  95. package/dist/tools/souldinals.tools.js +10 -10
  96. package/dist/tools/stacking-lottery.tools.d.ts +1 -1
  97. package/dist/tools/stacking-lottery.tools.js +11 -11
  98. package/dist/tools/stacking.tools.d.ts +1 -1
  99. package/dist/tools/stacking.tools.js +13 -13
  100. package/dist/tools/stacks-market.tools.d.ts +1 -1
  101. package/dist/tools/stacks-market.tools.js +22 -22
  102. package/dist/tools/styx.tools.d.ts +1 -1
  103. package/dist/tools/styx.tools.js +11 -11
  104. package/dist/tools/taproot-multisig.tools.d.ts +1 -1
  105. package/dist/tools/taproot-multisig.tools.js +5 -5
  106. package/dist/tools/tenero.tools.d.ts +1 -1
  107. package/dist/tools/tenero.tools.js +22 -22
  108. package/dist/tools/tokens.tools.d.ts +1 -1
  109. package/dist/tools/tokens.tools.js +10 -10
  110. package/dist/tools/transfer.tools.d.ts +1 -1
  111. package/dist/tools/transfer.tools.js +4 -4
  112. package/dist/tools/wallet-management.tools.d.ts +1 -1
  113. package/dist/tools/wallet-management.tools.js +16 -16
  114. package/dist/tools/wallet.tools.d.ts +1 -1
  115. package/dist/tools/wallet.tools.js +2 -2
  116. package/dist/tools/yield-dashboard.tools.d.ts +1 -1
  117. package/dist/tools/yield-dashboard.tools.js +5 -5
  118. package/dist/tools/yield-hunter.tools.d.ts +1 -1
  119. package/dist/tools/yield-hunter.tools.js +6 -6
  120. package/dist/utils/fee.js +1 -1
  121. package/package.json +4 -3
  122. package/skill/SKILL.md +1 -1
@@ -60,9 +60,9 @@ export function registerJingswapTools(server) {
60
60
  description: "Get the current Jingswap auction cycle state including phase (deposit/buffer/settle), " +
61
61
  "blocks elapsed, cycle totals (token B + sBTC deposited), and minimum deposit requirements. " +
62
62
  "Use this to understand where the auction currently stands.",
63
- inputSchema: {
63
+ inputSchema: z.object({
64
64
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
65
- },
65
+ }),
66
66
  }, async ({ market }) => {
67
67
  try {
68
68
  const m = getMarket(market);
@@ -88,10 +88,10 @@ export function registerJingswapTools(server) {
88
88
  server.registerTool("jingswap_get_depositors", {
89
89
  description: "Get the list of token B and sBTC depositors for a specific auction cycle. " +
90
90
  "Returns arrays of Stacks addresses on each side. Max 50 depositors per side.",
91
- inputSchema: {
91
+ inputSchema: z.object({
92
92
  cycle: z.number().describe("Cycle number to query"),
93
93
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
94
- },
94
+ }),
95
95
  }, async ({ cycle, market }) => {
96
96
  try {
97
97
  const m = getMarket(market);
@@ -105,11 +105,11 @@ export function registerJingswapTools(server) {
105
105
  // ── User Deposit ─────────────────────────────────────────────
106
106
  server.registerTool("jingswap_get_user_deposit", {
107
107
  description: "Get a specific user's deposit amounts (token B and sBTC) for a given auction cycle.",
108
- inputSchema: {
108
+ inputSchema: z.object({
109
109
  cycle: z.number().describe("Cycle number"),
110
110
  address: z.string().describe("Stacks address of the depositor"),
111
111
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
112
- },
112
+ }),
113
113
  }, async ({ cycle, address, market }) => {
114
114
  try {
115
115
  const m = getMarket(market);
@@ -125,10 +125,10 @@ export function registerJingswapTools(server) {
125
125
  description: "Get settlement details for a completed auction cycle. Returns clearing price, " +
126
126
  "amounts cleared, fees, and the block height at which settlement occurred. " +
127
127
  "Returns null settlement if the cycle hasn't been settled yet.",
128
- inputSchema: {
128
+ inputSchema: z.object({
129
129
  cycle: z.number().describe("Cycle number to query"),
130
130
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
131
- },
131
+ }),
132
132
  }, async ({ cycle, market }) => {
133
133
  try {
134
134
  const m = getMarket(market);
@@ -144,9 +144,9 @@ export function registerJingswapTools(server) {
144
144
  description: "Get the full history of all auction cycles from cycle 0 to the current cycle. " +
145
145
  "Each entry includes settlement data (if settled) and cycle totals. " +
146
146
  "Useful for analyzing historical auction performance and volume.",
147
- inputSchema: {
147
+ inputSchema: z.object({
148
148
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
149
- },
149
+ }),
150
150
  }, async ({ market }) => {
151
151
  try {
152
152
  const m = getMarket(market);
@@ -161,10 +161,10 @@ export function registerJingswapTools(server) {
161
161
  server.registerTool("jingswap_get_user_activity", {
162
162
  description: "Get a user's auction activity history — deposits, cancellations, fills, and settlements. " +
163
163
  "Indexed from on-chain contract events.",
164
- inputSchema: {
164
+ inputSchema: z.object({
165
165
  address: z.string().describe("Stacks address to query"),
166
166
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
167
- },
167
+ }),
168
168
  }, async ({ address, market }) => {
169
169
  try {
170
170
  const m = getMarket(market);
@@ -197,10 +197,10 @@ export function registerJingswapTools(server) {
197
197
  server.registerTool("jingswap_deposit_stx", {
198
198
  description: "Deposit the token-B side (STX or USDCx depending on market) into the current Jingswap auction cycle. " +
199
199
  "Only works during the deposit phase. Amount is in human units (e.g. 10 for 10 STX, or 10 for 10 USDCx).",
200
- inputSchema: {
200
+ inputSchema: z.object({
201
201
  amount: z.number().positive().describe("Amount of token B to deposit (human units)"),
202
202
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
203
- },
203
+ }),
204
204
  }, async ({ amount, market }) => {
205
205
  try {
206
206
  const m = getMarket(market);
@@ -247,10 +247,10 @@ export function registerJingswapTools(server) {
247
247
  description: "Deposit sBTC into the current Jingswap auction cycle. " +
248
248
  "Only works during the deposit phase. Amount is in satoshis (e.g. 1000 for 1000 sats). " +
249
249
  "Works the same for both sbtc-stx and sbtc-usdcx markets.",
250
- inputSchema: {
250
+ inputSchema: z.object({
251
251
  amount: z.number().int().positive().describe("Amount of sBTC in satoshis"),
252
252
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
253
- },
253
+ }),
254
254
  }, async ({ amount, market }) => {
255
255
  try {
256
256
  const m = getMarket(market);
@@ -287,9 +287,9 @@ export function registerJingswapTools(server) {
287
287
  server.registerTool("jingswap_cancel_stx", {
288
288
  description: "Cancel your token-B deposit (STX or USDCx depending on market) from the current Jingswap auction cycle " +
289
289
  "and get a full refund. Only works during the deposit phase.",
290
- inputSchema: {
290
+ inputSchema: z.object({
291
291
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
292
- },
292
+ }),
293
293
  }, async ({ market }) => {
294
294
  try {
295
295
  const m = getMarket(market);
@@ -320,9 +320,9 @@ export function registerJingswapTools(server) {
320
320
  server.registerTool("jingswap_cancel_sbtc", {
321
321
  description: "Cancel your sBTC deposit from the current Jingswap auction cycle and get a full refund. " +
322
322
  "Only works during the deposit phase. Works the same for both markets.",
323
- inputSchema: {
323
+ inputSchema: z.object({
324
324
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
325
- },
325
+ }),
326
326
  }, async ({ market }) => {
327
327
  try {
328
328
  const m = getMarket(market);
@@ -355,9 +355,9 @@ export function registerJingswapTools(server) {
355
355
  "Before calling, check jingswap_get_cycle_state to verify: phase is 0 (deposit), " +
356
356
  "blocksElapsed >= 150 (DEPOSIT_MIN_BLOCKS), and both sides meet minimums. " +
357
357
  "Anyone can call this. Transitions to buffer phase.",
358
- inputSchema: {
358
+ inputSchema: z.object({
359
359
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
360
- },
360
+ }),
361
361
  }, async ({ market }) => {
362
362
  try {
363
363
  const m = getMarket(market);
@@ -394,9 +394,9 @@ export function registerJingswapTools(server) {
394
394
  "WARNING: This will almost always fail because stored prices go stale quickly. " +
395
395
  "Prefer jingswap_settle_with_refresh instead — it fetches fresh prices and is much more reliable. " +
396
396
  "Only works after deposits have been closed (buffer/settle phase).",
397
- inputSchema: {
397
+ inputSchema: z.object({
398
398
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
399
- },
399
+ }),
400
400
  }, async ({ market }) => {
401
401
  try {
402
402
  const m = getMarket(market);
@@ -446,9 +446,9 @@ export function registerJingswapTools(server) {
446
446
  "Settlement distributes funds to all depositors so post conditions are in Allow mode. " +
447
447
  "There is no guarantee settlement succeeds (e.g. if oracle update fails), but this is " +
448
448
  "the most reliable path. Only works after deposits have been closed (buffer/settle phase).",
449
- inputSchema: {
449
+ inputSchema: z.object({
450
450
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
451
- },
451
+ }),
452
452
  }, async ({ market }) => {
453
453
  try {
454
454
  const m = getMarket(market);
@@ -502,9 +502,9 @@ export function registerJingswapTools(server) {
502
502
  "(BUFFER_BLOCKS 30 + CANCEL_THRESHOLD 500). " +
503
503
  "Rolls all deposits into the next cycle — no refunds, users can withdraw " +
504
504
  "individually during the next deposit phase. This is the safety valve.",
505
- inputSchema: {
505
+ inputSchema: z.object({
506
506
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
507
- },
507
+ }),
508
508
  }, async ({ market }) => {
509
509
  try {
510
510
  const m = getMarket(market);
@@ -540,9 +540,9 @@ export function registerJingswapTools(server) {
540
540
  description: "Get current oracle and DEX prices used by the Jingswap auction. " +
541
541
  "Returns Pyth oracle prices (BTC/USD, STX/USD with confidence and freshness), " +
542
542
  "on-chain DEX prices (XYK pool with TVL, DLMM), and the derived price ratio.",
543
- inputSchema: {
543
+ inputSchema: z.object({
544
544
  market: z.string().optional().describe('Market: "sbtc-stx" (default) or "sbtc-usdcx"'),
545
- },
545
+ }),
546
546
  }, async ({ market }) => {
547
547
  try {
548
548
  const m = getMarket(market);
@@ -20,6 +20,6 @@
20
20
  *
21
21
  * Fund-moving calls sign in DENY mode with an exact post-condition.
22
22
  */
23
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
23
+ import { McpServer } from "@modelcontextprotocol/server";
24
24
  export declare function registerLegionTools(server: McpServer): void;
25
25
  //# sourceMappingURL=legion.tools.d.ts.map
@@ -152,7 +152,7 @@ export function registerLegionTools(server) {
152
152
  "No story can be proposed until the legion reaches its member threshold, so check " +
153
153
  "`membership.activated` before planning to publish.\n\n" +
154
154
  `Reads only. Runs on Stacks ${LEGION_NETWORK} regardless of this server's NETWORK.`,
155
- inputSchema: { era: eraInput },
155
+ inputSchema: z.object({ era: eraInput }),
156
156
  }, async ({ era: eraArg }) => {
157
157
  try {
158
158
  const era = resolveEra(eraArg);
@@ -262,7 +262,7 @@ export function registerLegionTools(server) {
262
262
  "Phases: `pending` (filed, voting not open yet), `voting`, `concludable`, " +
263
263
  "`passed`/`failed` (settled), `expired` (nobody concluded in time; can no longer pay).\n\n" +
264
264
  "Reads only.",
265
- inputSchema: {
265
+ inputSchema: z.object({
266
266
  phase: z
267
267
  .enum([
268
268
  "all",
@@ -284,7 +284,7 @@ export function registerLegionTools(server) {
284
284
  .optional()
285
285
  .describe("How many proposals to scan back from the newest (default 10)"),
286
286
  era: eraInput,
287
- },
287
+ }),
288
288
  }, async ({ phase = "all", limit = 10, era: eraArg }) => {
289
289
  try {
290
290
  const era = resolveEra(eraArg);
@@ -377,10 +377,10 @@ export function registerLegionTools(server) {
377
377
  "timeline, what `conclude` would decide now, and whether you have voted.\n\n" +
378
378
  "Read this before voting — the contract cannot read the inscription, so judging the " +
379
379
  "work is the voter's job.\n\nReads only.",
380
- inputSchema: {
380
+ inputSchema: z.object({
381
381
  proposalId: z.number().int().positive().describe("The proposal id"),
382
382
  era: eraInput,
383
- },
383
+ }),
384
384
  }, async ({ proposalId, era: eraArg }) => {
385
385
  try {
386
386
  const era = resolveEra(eraArg);
@@ -497,7 +497,7 @@ export function registerLegionTools(server) {
497
497
  description: "Your weight, share, weight lock, sBTC balance, and every propose precondition folded " +
498
498
  "from the contract's `propose-status` — so a blocked propose names the gate to wait on.\n\n" +
499
499
  "Requires an unlocked wallet. Signs nothing.",
500
- inputSchema: { era: eraInput },
500
+ inputSchema: z.object({ era: eraInput }),
501
501
  }, async ({ era: eraArg }) => {
502
502
  try {
503
503
  const era = resolveEra(eraArg);
@@ -571,13 +571,13 @@ export function registerLegionTools(server) {
571
571
  "Crossing the minimum weight also makes you a MEMBER, which is what unlocks proposals " +
572
572
  "for the whole legion once enough members join.\n\n" +
573
573
  "Requires an unlocked wallet.",
574
- inputSchema: {
574
+ inputSchema: z.object({
575
575
  sats: z
576
576
  .number()
577
577
  .int()
578
578
  .positive()
579
579
  .describe("Amount of sBTC to contribute, in sats"),
580
- },
580
+ }),
581
581
  }, async ({ sats }) => {
582
582
  try {
583
583
  const account = await getLegionAccount();
@@ -656,7 +656,7 @@ export function registerLegionTools(server) {
656
656
  "identity. SPENDS REAL sBTC AND IS FINAL: no refund path exists.\n\n" +
657
657
  "Metered against the wallet's `sats` spending limit before signing.\n\n" +
658
658
  "Requires an unlocked wallet.",
659
- inputSchema: {
659
+ inputSchema: z.object({
660
660
  sats: z
661
661
  .number()
662
662
  .int()
@@ -677,7 +677,7 @@ export function registerLegionTools(server) {
677
677
  .max(MAX_SPONSOR_MEMO_LENGTH)
678
678
  .optional()
679
679
  .describe(`Optional free-form note on the record (ASCII, ≤${MAX_SPONSOR_MEMO_LENGTH} chars)`),
680
- },
680
+ }),
681
681
  }, async ({ sats, name, link, memo }) => {
682
682
  try {
683
683
  assertAscii(name, "name", MAX_SPONSOR_NAME_LENGTH);
@@ -751,7 +751,7 @@ export function registerLegionTools(server) {
751
751
  "proposal per principal; the lock is never spent and releases on every outcome.\n\n" +
752
752
  "Pre-flights every precondition and refuses locally with the specific blocker.\n\n" +
753
753
  "Requires an unlocked wallet.",
754
- inputSchema: {
754
+ inputSchema: z.object({
755
755
  link: z
756
756
  .string()
757
757
  .min(1)
@@ -768,7 +768,7 @@ export function registerLegionTools(server) {
768
768
  .optional()
769
769
  .describe(`Why this piece is worth paying for (ASCII, ≤${MAX_DESCRIPTION_LENGTH} chars). ` +
770
770
  "Stored on chain but not emitted in the event — voters read it via legion_get_story."),
771
- },
771
+ }),
772
772
  }, async ({ link, title, description }) => {
773
773
  try {
774
774
  const normalizedLink = normalizeOrdinalsLink(link);
@@ -848,7 +848,7 @@ export function registerLegionTools(server) {
848
848
  "Voting no is the ONLY way to stop a piece — this legion has no veto.\n\n" +
849
849
  "Read the inscription first — legion_get_story gives you the link.\n\n" +
850
850
  "Pre-flights phase, weight and prior vote. Requires an unlocked wallet.",
851
- inputSchema: {
851
+ inputSchema: z.object({
852
852
  proposalId: z.number().int().positive().describe("The proposal id"),
853
853
  support: z
854
854
  .boolean()
@@ -859,7 +859,7 @@ export function registerLegionTools(server) {
859
859
  .max(MAX_RATIONALE_LENGTH)
860
860
  .describe(`Why you voted this way, recorded on chain (ASCII, ≤${MAX_RATIONALE_LENGTH} chars). ` +
861
861
  "Required and must be non-empty — the contract rejects a blank one (u440)."),
862
- },
862
+ }),
863
863
  }, async ({ proposalId, support, rationale }) => {
864
864
  try {
865
865
  const account = await getLegionAccount();
@@ -949,9 +949,9 @@ export function registerLegionTools(server) {
949
949
  "concluded after. Concluding late pays what concluding early would; the payout was " +
950
950
  "snapshotted at propose time.\n\n" +
951
951
  "Requires an unlocked wallet — caller pays gas, proposer gets the payout.",
952
- inputSchema: {
952
+ inputSchema: z.object({
953
953
  proposalId: z.number().int().positive().describe("The proposal id"),
954
- },
954
+ }),
955
955
  }, async ({ proposalId }) => {
956
956
  try {
957
957
  const account = await getLegionAccount();
@@ -1042,7 +1042,7 @@ export function registerLegionTools(server) {
1042
1042
  "signing. `dryRun` prices it without broadcasting.\n\n" +
1043
1043
  "Returns without waiting. After the commit confirms, call legion_inscribe_reveal.\n\n" +
1044
1044
  "Requires an unlocked managed wallet with funded UTXOs.",
1045
- inputSchema: {
1045
+ inputSchema: z.object({
1046
1046
  title: z
1047
1047
  .string()
1048
1048
  .min(1)
@@ -1076,7 +1076,7 @@ export function registerLegionTools(server) {
1076
1076
  .union([z.enum(["fast", "medium", "slow"]), z.number().positive()])
1077
1077
  .optional()
1078
1078
  .describe("Fee rate: 'fast', 'medium', 'slow', or a number in sat/vB (default: medium)"),
1079
- },
1079
+ }),
1080
1080
  }, async ({ title, body, parentInscriptionId, dryRun, confirmMainnetSpend, allowNonMainnet, feeRate }) => {
1081
1081
  try {
1082
1082
  // A testnet inscription is almost always a misconfiguration here: the
@@ -1256,7 +1256,7 @@ export function registerLegionTools(server) {
1256
1256
  "No mainnet confirmation is asked for here, unlike the commit: those sats are already " +
1257
1257
  "committed, and refusing the reveal would strand them rather than save them.\n\n" +
1258
1258
  "Requires an unlocked managed wallet.",
1259
- inputSchema: {
1259
+ inputSchema: z.object({
1260
1260
  commitTxid: z
1261
1261
  .string()
1262
1262
  .length(64)
@@ -1275,7 +1275,7 @@ export function registerLegionTools(server) {
1275
1275
  .union([z.enum(["fast", "medium", "slow"]), z.number().positive()])
1276
1276
  .optional()
1277
1277
  .describe("Fee rate for the reveal tx (default: medium)"),
1278
- },
1278
+ }),
1279
1279
  }, async ({ commitTxid, revealAmount, title, body, parentInscriptionId, feeRate }) => {
1280
1280
  try {
1281
1281
  const walletManager = getWalletManager();
@@ -6,6 +6,6 @@
6
6
  * invoices. The L402 interceptor in src/services/x402.service.ts uses the
7
7
  * same LightningProvider singleton to auto-pay invoice challenges on 402s.
8
8
  */
9
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import { McpServer } from "@modelcontextprotocol/server";
10
10
  export declare function registerLightningTools(server: McpServer): void;
11
11
  //# sourceMappingURL=lightning.tools.d.ts.map
@@ -23,13 +23,13 @@ export function registerLightningTools(server) {
23
23
  "Generates a fresh BIP39 mnemonic (shown once), encrypts it with the " +
24
24
  "provided password, and stores it at ~/.aibtc/lightning/keystore.json. " +
25
25
  "Returns the deposit address for funding the wallet from L1 BTC.",
26
- inputSchema: {
26
+ inputSchema: z.object({
27
27
  name: z.string().describe("Name for the Lightning wallet (e.g., 'main')"),
28
28
  password: z
29
29
  .string()
30
30
  .min(8)
31
31
  .describe("Password to protect the Lightning wallet (minimum 8 characters) - WARNING: sensitive value"),
32
- },
32
+ }),
33
33
  }, async ({ name, password }) => {
34
34
  try {
35
35
  const manager = getLightningManager();
@@ -56,7 +56,7 @@ export function registerLightningTools(server) {
56
56
  description: "Import an existing Lightning wallet into the embedded Spark-backed " +
57
57
  "store from a BIP39 mnemonic phrase. Encrypted locally at " +
58
58
  "~/.aibtc/lightning/keystore.json.",
59
- inputSchema: {
59
+ inputSchema: z.object({
60
60
  name: z.string().describe("Name for the Lightning wallet"),
61
61
  mnemonic: z
62
62
  .string()
@@ -65,7 +65,7 @@ export function registerLightningTools(server) {
65
65
  .string()
66
66
  .min(8)
67
67
  .describe("Password to protect the Lightning wallet (minimum 8 characters) - WARNING: sensitive value"),
68
- },
68
+ }),
69
69
  }, async ({ name, mnemonic, password }) => {
70
70
  try {
71
71
  const manager = getLightningManager();
@@ -87,9 +87,9 @@ export function registerLightningTools(server) {
87
87
  description: "Unlock the Lightning wallet for the current session. Required before " +
88
88
  "paying or creating invoices, and before the L402 interceptor can " +
89
89
  "auto-pay challenges.",
90
- inputSchema: {
90
+ inputSchema: z.object({
91
91
  password: z.string().describe("Wallet password - WARNING: sensitive value"),
92
- },
92
+ }),
93
93
  }, async ({ password }) => {
94
94
  try {
95
95
  const manager = getLightningManager();
@@ -144,7 +144,7 @@ export function registerLightningTools(server) {
144
144
  "claimed to credit the Lightning balance (separate follow-up step; " +
145
145
  "not automated in this PR). Requires the main wallet to be unlocked " +
146
146
  "AND the Lightning wallet to be unlocked (to fetch the deposit address).",
147
- inputSchema: {
147
+ inputSchema: z.object({
148
148
  amountSats: z
149
149
  .number()
150
150
  .int()
@@ -158,7 +158,7 @@ export function registerLightningTools(server) {
158
158
  .optional()
159
159
  .default("medium")
160
160
  .describe("Fee rate: 'fast' (~10 min), 'medium' (~30 min), 'slow' (~1 hr), or number in sat/vB"),
161
- },
161
+ }),
162
162
  }, async ({ amountSats, feeRate }) => {
163
163
  try {
164
164
  // Lightning wallet must be unlocked so we can fetch a deposit address.
@@ -236,7 +236,7 @@ export function registerLightningTools(server) {
236
236
  "transaction has 3 confirmations. Fetches a signed quote from the " +
237
237
  "SSP, submits the claim, and returns the credited sats + Spark " +
238
238
  "transfer id. Requires an unlocked Lightning wallet.",
239
- inputSchema: {
239
+ inputSchema: z.object({
240
240
  transactionId: z
241
241
  .string()
242
242
  .describe("Bitcoin txid of the deposit transaction"),
@@ -246,7 +246,7 @@ export function registerLightningTools(server) {
246
246
  .nonnegative()
247
247
  .optional()
248
248
  .describe("Vout index of the deposit output (default: SSP auto-detects)"),
249
- },
249
+ }),
250
250
  }, async ({ transactionId, outputIndex }) => {
251
251
  try {
252
252
  const manager = getLightningManager();
@@ -268,7 +268,7 @@ export function registerLightningTools(server) {
268
268
  server.registerTool("lightning_pay_invoice", {
269
269
  description: "Pay a BOLT-11 Lightning invoice from the embedded Lightning wallet. " +
270
270
  "Returns the payment preimage (proof of payment) and fees paid.",
271
- inputSchema: {
271
+ inputSchema: z.object({
272
272
  bolt11: z
273
273
  .string()
274
274
  .describe("BOLT-11 encoded Lightning invoice (starts with lnbc... or lntb...)"),
@@ -278,7 +278,7 @@ export function registerLightningTools(server) {
278
278
  .nonnegative()
279
279
  .optional()
280
280
  .describe("Maximum routing fee to pay in sats (provider default applies when omitted)"),
281
- },
281
+ }),
282
282
  }, async ({ bolt11, maxFeeSats }) => {
283
283
  try {
284
284
  const manager = getLightningManager();
@@ -328,7 +328,7 @@ export function registerLightningTools(server) {
328
328
  server.registerTool("lightning_create_invoice", {
329
329
  description: "Create a BOLT-11 Lightning invoice that can receive a payment into " +
330
330
  "the embedded Lightning wallet.",
331
- inputSchema: {
331
+ inputSchema: z.object({
332
332
  amountSats: z
333
333
  .number()
334
334
  .int()
@@ -338,7 +338,7 @@ export function registerLightningTools(server) {
338
338
  .string()
339
339
  .optional()
340
340
  .describe("Optional description attached to the invoice"),
341
- },
341
+ }),
342
342
  }, async ({ amountSats, memo }) => {
343
343
  try {
344
344
  const manager = getLightningManager();
@@ -8,6 +8,6 @@
8
8
  *
9
9
  * Data is fetched from the public mempool.space API (no authentication required).
10
10
  */
11
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
+ import { McpServer } from "@modelcontextprotocol/server";
12
12
  export declare function registerMempoolTools(server: McpServer): void;
13
13
  //# sourceMappingURL=mempool.tools.d.ts.map
@@ -56,7 +56,7 @@ export function registerMempoolTools(server) {
56
56
  description: "Get current Bitcoin mempool statistics including transaction count, " +
57
57
  "virtual size, total fees, and fee histogram. " +
58
58
  "Useful for monitoring network congestion and estimating confirmation times.",
59
- inputSchema: {},
59
+ inputSchema: z.object({}),
60
60
  }, async () => {
61
61
  try {
62
62
  const api = new MempoolApi(NETWORK);
@@ -79,11 +79,11 @@ export function registerMempoolTools(server) {
79
79
  description: "Get confirmation status and details for a Bitcoin transaction by txid. " +
80
80
  "Returns whether the transaction is confirmed, block height, fee, size, and I/O summary. " +
81
81
  "Works for both confirmed and unconfirmed (mempool) transactions.",
82
- inputSchema: {
82
+ inputSchema: z.object({
83
83
  txid: z
84
84
  .string()
85
85
  .describe("Bitcoin transaction ID (64 hex characters)"),
86
- },
86
+ }),
87
87
  }, async ({ txid }) => {
88
88
  try {
89
89
  const api = new MempoolApi(NETWORK);
@@ -102,9 +102,9 @@ export function registerMempoolTools(server) {
102
102
  description: "Get recent transaction history for a Bitcoin address (last 25 transactions). " +
103
103
  "Returns a summary of each transaction including confirmation status, fee, and amounts. " +
104
104
  "Useful for monitoring address activity and verifying payment receipts.",
105
- inputSchema: {
105
+ inputSchema: z.object({
106
106
  address: z.string().describe("Bitcoin address (e.g. bc1... for mainnet, tb1... for testnet)"),
107
- },
107
+ }),
108
108
  }, async ({ address }) => {
109
109
  try {
110
110
  const api = new MempoolApi(NETWORK);
@@ -6,6 +6,6 @@
6
6
  * registered so an agent that still calls one is told where the workflow moved
7
7
  * (the legion_* tools) instead of getting "unknown tool".
8
8
  */
9
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import { McpServer } from "@modelcontextprotocol/server";
10
10
  export declare function registerNewsTools(server: McpServer): void;
11
11
  //# sourceMappingURL=news.tools.d.ts.map
@@ -7,6 +7,7 @@
7
7
  * (the legion_* tools) instead of getting "unknown tool".
8
8
  */
9
9
  import { createJsonResponse } from "../utils/index.js";
10
+ import { z } from "zod";
10
11
  const MIGRATION_NOTE = "aibtc.news no longer runs an off-chain newsroom API — every endpoint returns 410 Gone. " +
11
12
  "Pieces are now inscribed to Bitcoin and published through the News Legion governance " +
12
13
  "contract (SP5Y3W3F78NKFH4HYFNDQMJC484VZWKDH35ZR2M9.aibtc-news-gov) on Stacks mainnet. " +
@@ -88,7 +89,7 @@ export function registerNewsTools(server) {
88
89
  description: `⛔ DEPRECATED — do not use. This tool used to ${was} via the aibtc.news API, which ` +
89
90
  `has been shut down (410 Gone). aibtc.news now runs on on-chain governance: use ` +
90
91
  `${useInstead.join(", ")} instead (start with legion_status).`,
91
- inputSchema: {},
92
+ inputSchema: z.object({}),
92
93
  }, async () => createJsonResponse({
93
94
  success: false,
94
95
  deprecated: true,
@@ -1,3 +1,3 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
1
+ import { McpServer } from "@modelcontextprotocol/server";
2
2
  export declare function registerNftTools(server: McpServer): void;
3
3
  //# sourceMappingURL=nft.tools.d.ts.map
@@ -7,7 +7,7 @@ export function registerNftTools(server) {
7
7
  // Get NFT holdings
8
8
  server.registerTool("get_nft_holdings", {
9
9
  description: "List all NFTs owned by an address.",
10
- inputSchema: {
10
+ inputSchema: z.object({
11
11
  address: z
12
12
  .string()
13
13
  .optional()
@@ -15,7 +15,7 @@ export function registerNftTools(server) {
15
15
  contractId: z.string().optional().describe("Filter by specific NFT collection contract"),
16
16
  limit: z.number().optional().default(20).describe("Maximum number of results"),
17
17
  offset: z.number().optional().default(0).describe("Offset for pagination"),
18
- },
18
+ }),
19
19
  }, async ({ address, contractId, limit, offset }) => {
20
20
  try {
21
21
  const nftService = getNftService(NETWORK);
@@ -38,10 +38,10 @@ export function registerNftTools(server) {
38
38
  // Get NFT metadata
39
39
  server.registerTool("get_nft_metadata", {
40
40
  description: "Get metadata for a specific NFT (SIP-016).",
41
- inputSchema: {
41
+ inputSchema: z.object({
42
42
  contractId: z.string().describe("NFT collection contract ID"),
43
43
  tokenId: z.number().describe("Token ID of the NFT"),
44
- },
44
+ }),
45
45
  }, async ({ contractId, tokenId }) => {
46
46
  try {
47
47
  const nftService = getNftService(NETWORK);
@@ -60,7 +60,7 @@ export function registerNftTools(server) {
60
60
  // Transfer NFT
61
61
  server.registerTool("transfer_nft", {
62
62
  description: "Transfer an NFT (SIP-009) to a recipient address.",
63
- inputSchema: {
63
+ inputSchema: z.object({
64
64
  contractId: z.string().describe("NFT collection contract ID"),
65
65
  tokenId: z.number().describe("Token ID of the NFT to transfer"),
66
66
  recipient: z.string().describe("The recipient's Stacks address"),
@@ -68,7 +68,7 @@ export function registerNftTools(server) {
68
68
  .string()
69
69
  .optional()
70
70
  .describe("Optional fee: 'low' | 'medium' | 'high' preset or micro-STX amount. If omitted, auto-estimated."),
71
- },
71
+ }),
72
72
  }, async ({ contractId, tokenId, recipient, fee }) => {
73
73
  try {
74
74
  const nftService = getNftService(NETWORK);
@@ -93,10 +93,10 @@ export function registerNftTools(server) {
93
93
  // Get NFT owner
94
94
  server.registerTool("get_nft_owner", {
95
95
  description: "Get the current owner of a specific NFT.",
96
- inputSchema: {
96
+ inputSchema: z.object({
97
97
  contractId: z.string().describe("NFT collection contract ID"),
98
98
  tokenId: z.number().describe("Token ID of the NFT"),
99
- },
99
+ }),
100
100
  }, async ({ contractId, tokenId }) => {
101
101
  try {
102
102
  const nftService = getNftService(NETWORK);
@@ -116,9 +116,9 @@ export function registerNftTools(server) {
116
116
  // Get collection info
117
117
  server.registerTool("get_collection_info", {
118
118
  description: "Get information about an NFT collection.",
119
- inputSchema: {
119
+ inputSchema: z.object({
120
120
  contractId: z.string().describe("NFT collection contract ID"),
121
- },
121
+ }),
122
122
  }, async ({ contractId }) => {
123
123
  try {
124
124
  const nftService = getNftService(NETWORK);
@@ -135,11 +135,11 @@ export function registerNftTools(server) {
135
135
  // Get NFT history
136
136
  server.registerTool("get_nft_history", {
137
137
  description: "Get the transfer history of NFTs in a collection.",
138
- inputSchema: {
138
+ inputSchema: z.object({
139
139
  contractId: z.string().describe("NFT collection contract ID"),
140
140
  limit: z.number().optional().default(20).describe("Maximum number of results"),
141
141
  offset: z.number().optional().default(0).describe("Offset for pagination"),
142
- },
142
+ }),
143
143
  }, async ({ contractId, limit, offset }) => {
144
144
  try {
145
145
  const nftService = getNftService(NETWORK);
@@ -6,6 +6,6 @@
6
6
  *
7
7
  * @see https://github.com/aibtcdev/aibtc-mcp-server/issues/413
8
8
  */
9
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import { McpServer } from "@modelcontextprotocol/server";
10
10
  export declare function registerNonceTools(server: McpServer): void;
11
11
  //# sourceMappingURL=nonce.tools.d.ts.map