@aibtc/mcp-server 1.0.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 (178) hide show
  1. package/README.md +340 -0
  2. package/dist/api.d.ts +9 -0
  3. package/dist/api.d.ts.map +1 -0
  4. package/dist/api.js +79 -0
  5. package/dist/api.js.map +1 -0
  6. package/dist/config/contracts.d.ts +169 -0
  7. package/dist/config/contracts.d.ts.map +1 -0
  8. package/dist/config/contracts.js +250 -0
  9. package/dist/config/contracts.js.map +1 -0
  10. package/dist/config/index.d.ts +3 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +3 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/config/networks.d.ts +11 -0
  15. package/dist/config/networks.d.ts.map +1 -0
  16. package/dist/config/networks.js +21 -0
  17. package/dist/config/networks.js.map +1 -0
  18. package/dist/endpoints/index.d.ts +2 -0
  19. package/dist/endpoints/index.d.ts.map +1 -0
  20. package/dist/endpoints/index.js +2 -0
  21. package/dist/endpoints/index.js.map +1 -0
  22. package/dist/endpoints/registry.d.ts +38 -0
  23. package/dist/endpoints/registry.d.ts.map +1 -0
  24. package/dist/endpoints/registry.js +935 -0
  25. package/dist/endpoints/registry.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +79 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/services/bitflow.service.d.ts +159 -0
  31. package/dist/services/bitflow.service.d.ts.map +1 -0
  32. package/dist/services/bitflow.service.js +325 -0
  33. package/dist/services/bitflow.service.js.map +1 -0
  34. package/dist/services/bns.service.d.ts +87 -0
  35. package/dist/services/bns.service.d.ts.map +1 -0
  36. package/dist/services/bns.service.js +312 -0
  37. package/dist/services/bns.service.js.map +1 -0
  38. package/dist/services/defi.service.d.ts +146 -0
  39. package/dist/services/defi.service.d.ts.map +1 -0
  40. package/dist/services/defi.service.js +461 -0
  41. package/dist/services/defi.service.js.map +1 -0
  42. package/dist/services/hiro-api.d.ts +438 -0
  43. package/dist/services/hiro-api.d.ts.map +1 -0
  44. package/dist/services/hiro-api.js +376 -0
  45. package/dist/services/hiro-api.js.map +1 -0
  46. package/dist/services/nft.service.d.ts +70 -0
  47. package/dist/services/nft.service.d.ts.map +1 -0
  48. package/dist/services/nft.service.js +148 -0
  49. package/dist/services/nft.service.js.map +1 -0
  50. package/dist/services/sbtc.service.d.ts +44 -0
  51. package/dist/services/sbtc.service.d.ts.map +1 -0
  52. package/dist/services/sbtc.service.js +100 -0
  53. package/dist/services/sbtc.service.js.map +1 -0
  54. package/dist/services/scaffold.service.d.ts +41 -0
  55. package/dist/services/scaffold.service.d.ts.map +1 -0
  56. package/dist/services/scaffold.service.js +1055 -0
  57. package/dist/services/scaffold.service.js.map +1 -0
  58. package/dist/services/stacking.service.d.ts +58 -0
  59. package/dist/services/stacking.service.d.ts.map +1 -0
  60. package/dist/services/stacking.service.js +153 -0
  61. package/dist/services/stacking.service.js.map +1 -0
  62. package/dist/services/tokens.service.d.ts +62 -0
  63. package/dist/services/tokens.service.d.ts.map +1 -0
  64. package/dist/services/tokens.service.js +119 -0
  65. package/dist/services/tokens.service.js.map +1 -0
  66. package/dist/services/wallet-manager.d.ts +107 -0
  67. package/dist/services/wallet-manager.d.ts.map +1 -0
  68. package/dist/services/wallet-manager.js +389 -0
  69. package/dist/services/wallet-manager.js.map +1 -0
  70. package/dist/services/x402.service.d.ts +26 -0
  71. package/dist/services/x402.service.d.ts.map +1 -0
  72. package/dist/services/x402.service.js +125 -0
  73. package/dist/services/x402.service.js.map +1 -0
  74. package/dist/tools/bitflow.tools.d.ts +3 -0
  75. package/dist/tools/bitflow.tools.d.ts.map +1 -0
  76. package/dist/tools/bitflow.tools.js +501 -0
  77. package/dist/tools/bitflow.tools.js.map +1 -0
  78. package/dist/tools/bns.tools.d.ts +3 -0
  79. package/dist/tools/bns.tools.d.ts.map +1 -0
  80. package/dist/tools/bns.tools.js +164 -0
  81. package/dist/tools/bns.tools.js.map +1 -0
  82. package/dist/tools/contract.tools.d.ts +3 -0
  83. package/dist/tools/contract.tools.d.ts.map +1 -0
  84. package/dist/tools/contract.tools.js +126 -0
  85. package/dist/tools/contract.tools.js.map +1 -0
  86. package/dist/tools/defi.tools.d.ts +3 -0
  87. package/dist/tools/defi.tools.d.ts.map +1 -0
  88. package/dist/tools/defi.tools.js +425 -0
  89. package/dist/tools/defi.tools.js.map +1 -0
  90. package/dist/tools/endpoint.tools.d.ts +3 -0
  91. package/dist/tools/endpoint.tools.d.ts.map +1 -0
  92. package/dist/tools/endpoint.tools.js +157 -0
  93. package/dist/tools/endpoint.tools.js.map +1 -0
  94. package/dist/tools/index.d.ts +6 -0
  95. package/dist/tools/index.d.ts.map +1 -0
  96. package/dist/tools/index.js +52 -0
  97. package/dist/tools/index.js.map +1 -0
  98. package/dist/tools/nft.tools.d.ts +3 -0
  99. package/dist/tools/nft.tools.d.ts.map +1 -0
  100. package/dist/tools/nft.tools.js +154 -0
  101. package/dist/tools/nft.tools.js.map +1 -0
  102. package/dist/tools/openrouter.tools.d.ts +3 -0
  103. package/dist/tools/openrouter.tools.d.ts.map +1 -0
  104. package/dist/tools/openrouter.tools.js +664 -0
  105. package/dist/tools/openrouter.tools.js.map +1 -0
  106. package/dist/tools/query.tools.d.ts +3 -0
  107. package/dist/tools/query.tools.d.ts.map +1 -0
  108. package/dist/tools/query.tools.js +209 -0
  109. package/dist/tools/query.tools.js.map +1 -0
  110. package/dist/tools/sbtc.tools.d.ts +3 -0
  111. package/dist/tools/sbtc.tools.d.ts.map +1 -0
  112. package/dist/tools/sbtc.tools.js +103 -0
  113. package/dist/tools/sbtc.tools.js.map +1 -0
  114. package/dist/tools/scaffold.tools.d.ts +3 -0
  115. package/dist/tools/scaffold.tools.d.ts.map +1 -0
  116. package/dist/tools/scaffold.tools.js +216 -0
  117. package/dist/tools/scaffold.tools.js.map +1 -0
  118. package/dist/tools/stacking.tools.d.ts +3 -0
  119. package/dist/tools/stacking.tools.d.ts.map +1 -0
  120. package/dist/tools/stacking.tools.js +112 -0
  121. package/dist/tools/stacking.tools.js.map +1 -0
  122. package/dist/tools/tokens.tools.d.ts +3 -0
  123. package/dist/tools/tokens.tools.d.ts.map +1 -0
  124. package/dist/tools/tokens.tools.js +154 -0
  125. package/dist/tools/tokens.tools.js.map +1 -0
  126. package/dist/tools/transfer.tools.d.ts +3 -0
  127. package/dist/tools/transfer.tools.d.ts.map +1 -0
  128. package/dist/tools/transfer.tools.js +62 -0
  129. package/dist/tools/transfer.tools.js.map +1 -0
  130. package/dist/tools/wallet-management.tools.d.ts +6 -0
  131. package/dist/tools/wallet-management.tools.d.ts.map +1 -0
  132. package/dist/tools/wallet-management.tools.js +390 -0
  133. package/dist/tools/wallet-management.tools.js.map +1 -0
  134. package/dist/tools/wallet.tools.d.ts +3 -0
  135. package/dist/tools/wallet.tools.d.ts.map +1 -0
  136. package/dist/tools/wallet.tools.js +105 -0
  137. package/dist/tools/wallet.tools.js.map +1 -0
  138. package/dist/transactions/builder.d.ts +56 -0
  139. package/dist/transactions/builder.d.ts.map +1 -0
  140. package/dist/transactions/builder.js +134 -0
  141. package/dist/transactions/builder.js.map +1 -0
  142. package/dist/transactions/clarity-values.d.ts +67 -0
  143. package/dist/transactions/clarity-values.d.ts.map +1 -0
  144. package/dist/transactions/clarity-values.js +169 -0
  145. package/dist/transactions/clarity-values.js.map +1 -0
  146. package/dist/transactions/post-conditions.d.ts +27 -0
  147. package/dist/transactions/post-conditions.d.ts.map +1 -0
  148. package/dist/transactions/post-conditions.js +101 -0
  149. package/dist/transactions/post-conditions.js.map +1 -0
  150. package/dist/utils/encryption.d.ts +33 -0
  151. package/dist/utils/encryption.d.ts.map +1 -0
  152. package/dist/utils/encryption.js +110 -0
  153. package/dist/utils/encryption.js.map +1 -0
  154. package/dist/utils/errors.d.ts +84 -0
  155. package/dist/utils/errors.d.ts.map +1 -0
  156. package/dist/utils/errors.js +132 -0
  157. package/dist/utils/errors.js.map +1 -0
  158. package/dist/utils/formatting.d.ts +51 -0
  159. package/dist/utils/formatting.d.ts.map +1 -0
  160. package/dist/utils/formatting.js +114 -0
  161. package/dist/utils/formatting.js.map +1 -0
  162. package/dist/utils/index.d.ts +6 -0
  163. package/dist/utils/index.d.ts.map +1 -0
  164. package/dist/utils/index.js +6 -0
  165. package/dist/utils/index.js.map +1 -0
  166. package/dist/utils/storage.d.ts +90 -0
  167. package/dist/utils/storage.d.ts.map +1 -0
  168. package/dist/utils/storage.js +196 -0
  169. package/dist/utils/storage.js.map +1 -0
  170. package/dist/utils/validation.d.ts +67 -0
  171. package/dist/utils/validation.d.ts.map +1 -0
  172. package/dist/utils/validation.js +74 -0
  173. package/dist/utils/validation.js.map +1 -0
  174. package/dist/wallet.d.ts +86 -0
  175. package/dist/wallet.d.ts.map +1 -0
  176. package/dist/wallet.js +279 -0
  177. package/dist/wallet.js.map +1 -0
  178. package/package.json +58 -0
@@ -0,0 +1,209 @@
1
+ import { z } from "zod";
2
+ import { getWalletAddress, NETWORK } from "../services/x402.service.js";
3
+ import { getHiroApi } from "../services/hiro-api.js";
4
+ import { getExplorerAddressUrl } from "../config/networks.js";
5
+ import { createJsonResponse, createErrorResponse } from "../utils/index.js";
6
+ export function registerQueryTools(server) {
7
+ // Get account info
8
+ server.registerTool("get_account_info", {
9
+ description: "Get detailed account information including nonce and balance.",
10
+ inputSchema: {
11
+ address: z
12
+ .string()
13
+ .optional()
14
+ .describe("Stacks address. Uses configured wallet if not provided."),
15
+ },
16
+ }, async ({ address }) => {
17
+ try {
18
+ const hiro = getHiroApi(NETWORK);
19
+ const walletAddress = address || (await getWalletAddress());
20
+ const info = await hiro.getAccountInfo(walletAddress);
21
+ return createJsonResponse({
22
+ address: walletAddress,
23
+ network: NETWORK,
24
+ nonce: info.nonce,
25
+ balance: info.balance,
26
+ explorerUrl: getExplorerAddressUrl(walletAddress, NETWORK),
27
+ });
28
+ }
29
+ catch (error) {
30
+ return createErrorResponse(error);
31
+ }
32
+ });
33
+ // Get account transactions
34
+ server.registerTool("get_account_transactions", {
35
+ description: "Get transaction history for an account.",
36
+ inputSchema: {
37
+ address: z
38
+ .string()
39
+ .optional()
40
+ .describe("Stacks address. Uses configured wallet if not provided."),
41
+ limit: z.number().optional().default(20).describe("Maximum number of results"),
42
+ offset: z.number().optional().default(0).describe("Offset for pagination"),
43
+ },
44
+ }, async ({ address, limit, offset }) => {
45
+ try {
46
+ const hiro = getHiroApi(NETWORK);
47
+ const walletAddress = address || (await getWalletAddress());
48
+ const result = await hiro.getAccountTransactions(walletAddress, { limit, offset });
49
+ return createJsonResponse({
50
+ address: walletAddress,
51
+ network: NETWORK,
52
+ total: result.total,
53
+ limit: result.limit,
54
+ offset: result.offset,
55
+ transactions: result.results.map((tx) => ({
56
+ txId: tx.tx_id,
57
+ type: tx.tx_type,
58
+ status: tx.tx_status,
59
+ sender: tx.sender_address,
60
+ blockHeight: tx.block_height,
61
+ fee: tx.fee_rate,
62
+ })),
63
+ });
64
+ }
65
+ catch (error) {
66
+ return createErrorResponse(error);
67
+ }
68
+ });
69
+ // Get block info
70
+ server.registerTool("get_block_info", {
71
+ description: "Get information about a specific block.",
72
+ inputSchema: {
73
+ heightOrHash: z.string().describe("Block height (number) or block hash"),
74
+ },
75
+ }, async ({ heightOrHash }) => {
76
+ try {
77
+ const hiro = getHiroApi(NETWORK);
78
+ const isHeight = /^\d+$/.test(heightOrHash);
79
+ const block = isHeight
80
+ ? await hiro.getBlockByHeight(parseInt(heightOrHash, 10))
81
+ : await hiro.getBlockByHash(heightOrHash);
82
+ return createJsonResponse({
83
+ network: NETWORK,
84
+ hash: block.hash,
85
+ height: block.height,
86
+ canonical: block.canonical,
87
+ burnBlockHeight: block.burn_block_height,
88
+ burnBlockTime: block.burn_block_time,
89
+ txCount: block.txs.length,
90
+ });
91
+ }
92
+ catch (error) {
93
+ return createErrorResponse(error);
94
+ }
95
+ });
96
+ // Get mempool info
97
+ server.registerTool("get_mempool_info", {
98
+ description: "Get pending transactions in the mempool.",
99
+ inputSchema: {
100
+ senderAddress: z.string().optional().describe("Filter by sender address"),
101
+ limit: z.number().optional().default(20).describe("Maximum number of results"),
102
+ offset: z.number().optional().default(0).describe("Offset for pagination"),
103
+ },
104
+ }, async ({ senderAddress, limit, offset }) => {
105
+ try {
106
+ const hiro = getHiroApi(NETWORK);
107
+ const result = await hiro.getMempoolTransactions({
108
+ sender_address: senderAddress,
109
+ limit,
110
+ offset,
111
+ });
112
+ return createJsonResponse({
113
+ network: NETWORK,
114
+ total: result.total,
115
+ transactions: result.results.map((tx) => ({
116
+ txId: tx.tx_id,
117
+ type: tx.tx_type,
118
+ sender: tx.sender_address,
119
+ fee: tx.fee_rate,
120
+ nonce: tx.nonce,
121
+ receiptTime: tx.receipt_time_iso,
122
+ })),
123
+ });
124
+ }
125
+ catch (error) {
126
+ return createErrorResponse(error);
127
+ }
128
+ });
129
+ // Get contract info
130
+ server.registerTool("get_contract_info", {
131
+ description: "Get information about a smart contract including its ABI.",
132
+ inputSchema: {
133
+ contractId: z.string().describe("Contract ID in format: address.contract-name"),
134
+ },
135
+ }, async ({ contractId }) => {
136
+ try {
137
+ const hiro = getHiroApi(NETWORK);
138
+ const info = await hiro.getContractInfo(contractId);
139
+ const iface = await hiro.getContractInterface(contractId);
140
+ return createJsonResponse({
141
+ contractId,
142
+ network: NETWORK,
143
+ txId: info.tx_id,
144
+ blockHeight: info.block_height,
145
+ functions: iface.functions.map((f) => ({
146
+ name: f.name,
147
+ access: f.access,
148
+ args: f.args,
149
+ outputs: f.outputs,
150
+ })),
151
+ variables: iface.variables,
152
+ maps: iface.maps,
153
+ fungibleTokens: iface.fungible_tokens,
154
+ nonFungibleTokens: iface.non_fungible_tokens,
155
+ });
156
+ }
157
+ catch (error) {
158
+ return createErrorResponse(error);
159
+ }
160
+ });
161
+ // Get contract events
162
+ server.registerTool("get_contract_events", {
163
+ description: "Get events emitted by a smart contract.",
164
+ inputSchema: {
165
+ contractId: z.string().describe("Contract ID in format: address.contract-name"),
166
+ limit: z.number().optional().default(20).describe("Maximum number of results"),
167
+ offset: z.number().optional().default(0).describe("Offset for pagination"),
168
+ },
169
+ }, async ({ contractId, limit, offset }) => {
170
+ try {
171
+ const hiro = getHiroApi(NETWORK);
172
+ const result = await hiro.getContractEvents(contractId, { limit, offset });
173
+ return createJsonResponse({
174
+ contractId,
175
+ network: NETWORK,
176
+ events: result.results,
177
+ });
178
+ }
179
+ catch (error) {
180
+ return createErrorResponse(error);
181
+ }
182
+ });
183
+ // Get network status
184
+ server.registerTool("get_network_status", {
185
+ description: "Get the current status of the Stacks network.",
186
+ }, async () => {
187
+ try {
188
+ const hiro = getHiroApi(NETWORK);
189
+ const status = await hiro.getNetworkStatus();
190
+ const coreInfo = await hiro.getCoreApiInfo();
191
+ return createJsonResponse({
192
+ network: NETWORK,
193
+ serverVersion: status.server_version,
194
+ status: status.status,
195
+ chainTip: status.chain_tip,
196
+ coreInfo: {
197
+ peerVersion: coreInfo.peer_version,
198
+ stacksTipHeight: coreInfo.stacks_tip_height,
199
+ burnBlockHeight: coreInfo.burn_block_height,
200
+ networkId: coreInfo.network_id,
201
+ },
202
+ });
203
+ }
204
+ catch (error) {
205
+ return createErrorResponse(error);
206
+ }
207
+ });
208
+ }
209
+ //# sourceMappingURL=query.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.tools.js","sourceRoot":"","sources":["../../src/tools/query.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerSbtcTools(server: McpServer): void;
3
+ //# sourceMappingURL=sbtc.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sbtc.tools.d.ts","sourceRoot":"","sources":["../../src/tools/sbtc.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqHzD"}
@@ -0,0 +1,103 @@
1
+ import { z } from "zod";
2
+ import { getAccount, getWalletAddress, NETWORK } from "../services/x402.service.js";
3
+ import { getSbtcService } from "../services/sbtc.service.js";
4
+ import { getExplorerTxUrl } from "../config/networks.js";
5
+ import { createJsonResponse, createErrorResponse } from "../utils/index.js";
6
+ export function registerSbtcTools(server) {
7
+ // Get sBTC balance
8
+ server.registerTool("sbtc_get_balance", {
9
+ description: "Get the sBTC balance for a wallet address.",
10
+ inputSchema: {
11
+ address: z
12
+ .string()
13
+ .optional()
14
+ .describe("Wallet address to check. Uses configured wallet if not provided."),
15
+ },
16
+ }, async ({ address }) => {
17
+ try {
18
+ const sbtcService = getSbtcService(NETWORK);
19
+ const walletAddress = address || (await getWalletAddress());
20
+ const balance = await sbtcService.getBalance(walletAddress);
21
+ return createJsonResponse({
22
+ address: walletAddress,
23
+ network: NETWORK,
24
+ balance: {
25
+ sats: balance.balanceSats,
26
+ btc: balance.balanceBtc + " sBTC",
27
+ },
28
+ });
29
+ }
30
+ catch (error) {
31
+ return createErrorResponse(error);
32
+ }
33
+ });
34
+ // Transfer sBTC
35
+ server.registerTool("sbtc_transfer", {
36
+ description: `Transfer sBTC tokens to a recipient address.
37
+
38
+ sBTC uses 8 decimals (same as Bitcoin).
39
+ Example: To send 0.001 sBTC, use amount "100000" (satoshis).`,
40
+ inputSchema: {
41
+ recipient: z.string().describe("The recipient's Stacks address"),
42
+ amount: z.string().describe("Amount in satoshis (0.00000001 sBTC). Example: '100000' for 0.001 sBTC"),
43
+ memo: z.string().optional().describe("Optional memo message"),
44
+ },
45
+ }, async ({ recipient, amount, memo }) => {
46
+ try {
47
+ const sbtcService = getSbtcService(NETWORK);
48
+ const account = await getAccount();
49
+ const result = await sbtcService.transfer(account, recipient, BigInt(amount), memo);
50
+ const btcAmount = (BigInt(amount) / BigInt(100_000_000)).toString();
51
+ return createJsonResponse({
52
+ success: true,
53
+ txid: result.txid,
54
+ from: account.address,
55
+ recipient,
56
+ amount: btcAmount + " sBTC",
57
+ amountSats: amount,
58
+ network: NETWORK,
59
+ explorerUrl: getExplorerTxUrl(result.txid, NETWORK),
60
+ });
61
+ }
62
+ catch (error) {
63
+ return createErrorResponse(error);
64
+ }
65
+ });
66
+ // Get sBTC deposit info
67
+ server.registerTool("sbtc_get_deposit_info", {
68
+ description: "Get information about how to deposit BTC to receive sBTC.",
69
+ }, async () => {
70
+ try {
71
+ const sbtcService = getSbtcService(NETWORK);
72
+ const depositInfo = await sbtcService.getDepositInfo();
73
+ return createJsonResponse({
74
+ network: NETWORK,
75
+ ...depositInfo,
76
+ });
77
+ }
78
+ catch (error) {
79
+ return createErrorResponse(error);
80
+ }
81
+ });
82
+ // Get sBTC peg info
83
+ server.registerTool("sbtc_get_peg_info", {
84
+ description: "Get sBTC peg information including total supply and peg ratio.",
85
+ }, async () => {
86
+ try {
87
+ const sbtcService = getSbtcService(NETWORK);
88
+ const pegInfo = await sbtcService.getPegInfo();
89
+ return createJsonResponse({
90
+ network: NETWORK,
91
+ totalSupply: {
92
+ sats: pegInfo.totalSupplySats,
93
+ btc: pegInfo.totalSupplyBtc + " sBTC",
94
+ },
95
+ pegRatio: pegInfo.pegRatio,
96
+ });
97
+ }
98
+ catch (error) {
99
+ return createErrorResponse(error);
100
+ }
101
+ });
102
+ }
103
+ //# sourceMappingURL=sbtc.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sbtc.tools.js","sourceRoot":"","sources":["../../src/tools/sbtc.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerScaffoldTools(server: McpServer): void;
3
+ //# sourceMappingURL=scaffold.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.tools.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0O7D"}
@@ -0,0 +1,216 @@
1
+ import { z } from "zod";
2
+ import { scaffoldProject, scaffoldAIProject, } from "../services/scaffold.service.js";
3
+ import { createJsonResponse, createErrorResponse } from "../utils/index.js";
4
+ export function registerScaffoldTools(server) {
5
+ server.registerTool("scaffold_x402_endpoint", {
6
+ description: `Generate a complete Cloudflare Worker project with x402 payment integration.
7
+
8
+ Creates a ready-to-deploy Hono.js application that accepts payments in STX, sBTC, or USDCx.
9
+
10
+ ## Output Files
11
+
12
+ - src/index.ts - Hono app with x402-protected endpoints
13
+ - src/x402-middleware.ts - Payment verification middleware
14
+ - wrangler.jsonc - Cloudflare Worker configuration
15
+ - package.json - Dependencies and scripts
16
+ - tsconfig.json - TypeScript configuration
17
+ - .env.example - Environment variable template
18
+ - .gitignore - Standard ignores
19
+ - README.md - Documentation
20
+
21
+ ## After Generation
22
+
23
+ 1. cd into the project directory
24
+ 2. Run: npm install
25
+ 3. Copy .env.example to .env and add Cloudflare credentials
26
+ 4. Set recipient address as secret: wrangler secret put RECIPIENT_ADDRESS
27
+ 5. Run: npm run dev (local development)
28
+ 6. Run: npm run deploy (deploy to Cloudflare)
29
+
30
+ ## Payment Flow
31
+
32
+ The generated endpoints implement the x402 payment protocol:
33
+ 1. Client requests endpoint without payment → receives 402 with payment requirements
34
+ 2. Client signs transaction (does NOT broadcast)
35
+ 3. Client retries with X-PAYMENT header containing signed tx
36
+ 4. Server settles payment via facilitator and returns response`,
37
+ inputSchema: {
38
+ outputDir: z.string().describe("Absolute path to output directory (must exist)"),
39
+ projectName: z
40
+ .string()
41
+ .regex(/^[a-z][a-z0-9-]*$/, "Project name must be lowercase with hyphens only")
42
+ .describe("Project name (lowercase, hyphens allowed, e.g., 'my-x402-api')"),
43
+ endpoints: z
44
+ .array(z.object({
45
+ path: z
46
+ .string()
47
+ .startsWith("/")
48
+ .describe("Endpoint path (e.g., '/api/premium')"),
49
+ method: z.enum(["GET", "POST"]).describe("HTTP method"),
50
+ description: z.string().describe("Endpoint description for documentation"),
51
+ amount: z
52
+ .string()
53
+ .regex(/^\d+(\.\d+)?$/, "Amount must be a positive number")
54
+ .describe("Payment amount (e.g., '0.001' STX or '0.0001' sBTC)"),
55
+ tokenType: z.enum(["STX", "sBTC", "USDCx"]).describe("Payment token type"),
56
+ }))
57
+ .min(1)
58
+ .describe("Array of endpoint configurations"),
59
+ recipientAddress: z
60
+ .string()
61
+ .regex(/^S[PT][A-Z0-9]+$/, "Must be a valid Stacks address")
62
+ .describe("Stacks address to receive payments"),
63
+ network: z
64
+ .enum(["mainnet", "testnet"])
65
+ .optional()
66
+ .default("testnet")
67
+ .describe("Network for payments (default: testnet)"),
68
+ facilitatorUrl: z
69
+ .string()
70
+ .url()
71
+ .optional()
72
+ .describe("Custom facilitator URL (default: https://facilitator.x402stacks.xyz)"),
73
+ },
74
+ }, async ({ outputDir, projectName, endpoints, recipientAddress, network, facilitatorUrl }) => {
75
+ try {
76
+ const result = await scaffoldProject({
77
+ outputDir,
78
+ projectName,
79
+ endpoints: endpoints,
80
+ recipientAddress,
81
+ network: network || "testnet",
82
+ facilitatorUrl: facilitatorUrl || "https://facilitator.x402stacks.xyz",
83
+ });
84
+ return createJsonResponse({
85
+ success: true,
86
+ message: `Project scaffolded successfully at ${result.projectPath}`,
87
+ projectPath: result.projectPath,
88
+ filesCreated: result.filesCreated,
89
+ nextSteps: result.nextSteps,
90
+ endpoints: endpoints.map((ep) => ({
91
+ path: ep.path,
92
+ method: ep.method,
93
+ cost: `${ep.amount} ${ep.tokenType}`,
94
+ })),
95
+ });
96
+ }
97
+ catch (error) {
98
+ return createErrorResponse(error);
99
+ }
100
+ });
101
+ // AI-powered x402 endpoint scaffolding with OpenRouter
102
+ server.registerTool("scaffold_x402_ai_endpoint", {
103
+ description: `Generate a complete Cloudflare Worker project with x402 payment + OpenRouter AI integration.
104
+
105
+ Creates a ready-to-deploy Hono.js application that:
106
+ - Accepts payments in STX, sBTC, or USDCx
107
+ - Calls OpenRouter AI models (Claude, GPT-4, Llama, etc.)
108
+ - Returns AI-generated responses after payment
109
+
110
+ ## AI Types
111
+
112
+ - **chat**: General chat/Q&A endpoint
113
+ - **completion**: Text completion/continuation
114
+ - **summarize**: Summarize provided text
115
+ - **translate**: Translate text to target language
116
+ - **custom**: Custom system prompt
117
+
118
+ ## Output Files
119
+
120
+ - src/index.ts - Hono app with x402-protected AI endpoints
121
+ - src/x402-middleware.ts - Payment verification middleware
122
+ - src/openrouter.ts - OpenRouter API client
123
+ - wrangler.jsonc - Cloudflare Worker configuration
124
+ - package.json, tsconfig.json, .env.example, README.md
125
+
126
+ ## After Generation
127
+
128
+ 1. cd into the project directory
129
+ 2. npm install
130
+ 3. Set secrets: wrangler secret put RECIPIENT_ADDRESS
131
+ 4. Set secrets: wrangler secret put OPENROUTER_API_KEY
132
+ 5. For local dev: create .dev.vars with both secrets
133
+ 6. npm run dev`,
134
+ inputSchema: {
135
+ outputDir: z.string().describe("Absolute path to output directory (must exist)"),
136
+ projectName: z
137
+ .string()
138
+ .regex(/^[a-z][a-z0-9-]*$/, "Project name must be lowercase with hyphens only")
139
+ .describe("Project name (lowercase, hyphens allowed, e.g., 'my-ai-api')"),
140
+ endpoints: z
141
+ .array(z.object({
142
+ path: z
143
+ .string()
144
+ .startsWith("/")
145
+ .describe("Endpoint path (e.g., '/api/chat')"),
146
+ description: z.string().describe("Endpoint description for documentation"),
147
+ amount: z
148
+ .string()
149
+ .regex(/^\d+(\.\d+)?$/, "Amount must be a positive number")
150
+ .describe("Payment amount (e.g., '0.01' STX)"),
151
+ tokenType: z.enum(["STX", "sBTC", "USDCx"]).describe("Payment token type"),
152
+ aiType: z
153
+ .enum(["chat", "completion", "summarize", "translate", "custom"])
154
+ .describe("Type of AI operation"),
155
+ model: z
156
+ .string()
157
+ .optional()
158
+ .describe("OpenRouter model (e.g., 'anthropic/claude-3-haiku')"),
159
+ systemPrompt: z
160
+ .string()
161
+ .optional()
162
+ .describe("Custom system prompt (for 'custom' aiType or to override default)"),
163
+ }))
164
+ .min(1)
165
+ .describe("Array of AI endpoint configurations"),
166
+ recipientAddress: z
167
+ .string()
168
+ .regex(/^S[PT][A-Z0-9]+$/, "Must be a valid Stacks address")
169
+ .describe("Stacks address to receive payments"),
170
+ network: z
171
+ .enum(["mainnet", "testnet"])
172
+ .optional()
173
+ .default("testnet")
174
+ .describe("Network for payments (default: testnet)"),
175
+ facilitatorUrl: z
176
+ .string()
177
+ .url()
178
+ .optional()
179
+ .describe("Custom facilitator URL (default: https://facilitator.x402stacks.xyz)"),
180
+ defaultModel: z
181
+ .string()
182
+ .optional()
183
+ .default("anthropic/claude-3-haiku")
184
+ .describe("Default OpenRouter model for all endpoints (default: anthropic/claude-3-haiku)"),
185
+ },
186
+ }, async ({ outputDir, projectName, endpoints, recipientAddress, network, facilitatorUrl, defaultModel, }) => {
187
+ try {
188
+ const result = await scaffoldAIProject({
189
+ outputDir,
190
+ projectName,
191
+ endpoints: endpoints,
192
+ recipientAddress,
193
+ network: network || "testnet",
194
+ facilitatorUrl: facilitatorUrl || "https://facilitator.x402stacks.xyz",
195
+ defaultModel: defaultModel || "anthropic/claude-3-haiku",
196
+ });
197
+ return createJsonResponse({
198
+ success: true,
199
+ message: `AI project scaffolded successfully at ${result.projectPath}`,
200
+ projectPath: result.projectPath,
201
+ filesCreated: result.filesCreated,
202
+ nextSteps: result.nextSteps,
203
+ endpoints: endpoints.map((ep) => ({
204
+ path: ep.path,
205
+ aiType: ep.aiType,
206
+ model: ep.model || defaultModel || "anthropic/claude-3-haiku",
207
+ cost: `${ep.amount} ${ep.tokenType}`,
208
+ })),
209
+ });
210
+ }
211
+ catch (error) {
212
+ return createErrorResponse(error);
213
+ }
214
+ });
215
+ }
216
+ //# sourceMappingURL=scaffold.tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.tools.js","sourceRoot":"","sources":["../../src/tools/scaffold.tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerStackingTools(server: McpServer): void;
3
+ //# sourceMappingURL=stacking.tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stacking.tools.d.ts","sourceRoot":"","sources":["../../src/tools/stacking.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuI7D"}