@scriptmasterlabs/mcp-x402 2.0.2 → 2.1.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 (323) hide show
  1. package/.well-known/x402.json +37 -0
  2. package/LICENSE +57 -21
  3. package/README.md +262 -304
  4. package/dist/index.d.ts +12 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +9 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/mcp-wrapper.d.ts +71 -0
  9. package/dist/mcp-wrapper.d.ts.map +1 -0
  10. package/dist/mcp-wrapper.js +104 -0
  11. package/dist/mcp-wrapper.js.map +1 -0
  12. package/dist/x402-middleware.d.ts +76 -0
  13. package/dist/x402-middleware.d.ts.map +1 -0
  14. package/dist/x402-middleware.js +113 -0
  15. package/dist/x402-middleware.js.map +1 -0
  16. package/dist/xrpl-facilitator.d.ts +77 -0
  17. package/dist/xrpl-facilitator.d.ts.map +1 -0
  18. package/dist/xrpl-facilitator.js +156 -0
  19. package/dist/xrpl-facilitator.js.map +1 -0
  20. package/llms.txt +108 -70
  21. package/package.json +65 -78
  22. package/schema.jsonld +97 -0
  23. package/.env.example +0 -35
  24. package/.github/workflows/ci.yml +0 -59
  25. package/.github/workflows/keepalive.yml +0 -31
  26. package/.well-known/agentcard.json +0 -34
  27. package/CONTRIBUTING.md +0 -76
  28. package/Dockerfile +0 -19
  29. package/agents.json +0 -67
  30. package/dist/lib/chains/base.d.ts +0 -10
  31. package/dist/lib/chains/base.d.ts.map +0 -1
  32. package/dist/lib/chains/base.js +0 -73
  33. package/dist/lib/chains/base.js.map +0 -1
  34. package/dist/lib/chains/solana.d.ts +0 -10
  35. package/dist/lib/chains/solana.d.ts.map +0 -1
  36. package/dist/lib/chains/solana.js +0 -49
  37. package/dist/lib/chains/solana.js.map +0 -1
  38. package/dist/lib/chains/xrpl.d.ts +0 -10
  39. package/dist/lib/chains/xrpl.d.ts.map +0 -1
  40. package/dist/lib/chains/xrpl.js +0 -55
  41. package/dist/lib/chains/xrpl.js.map +0 -1
  42. package/dist/lib/credit/bureau.d.ts +0 -10
  43. package/dist/lib/credit/bureau.d.ts.map +0 -1
  44. package/dist/lib/credit/bureau.js +0 -58
  45. package/dist/lib/credit/bureau.js.map +0 -1
  46. package/dist/lib/sml-api/agentcard.d.ts +0 -17
  47. package/dist/lib/sml-api/agentcard.d.ts.map +0 -1
  48. package/dist/lib/sml-api/agentcard.js +0 -30
  49. package/dist/lib/sml-api/agentcard.js.map +0 -1
  50. package/dist/lib/sml-api/backtest.d.ts +0 -22
  51. package/dist/lib/sml-api/backtest.d.ts.map +0 -1
  52. package/dist/lib/sml-api/backtest.js +0 -28
  53. package/dist/lib/sml-api/backtest.js.map +0 -1
  54. package/dist/lib/sml-api/brokers.d.ts +0 -40
  55. package/dist/lib/sml-api/brokers.d.ts.map +0 -1
  56. package/dist/lib/sml-api/brokers.js +0 -128
  57. package/dist/lib/sml-api/brokers.js.map +0 -1
  58. package/dist/lib/sml-api/copytrader.d.ts +0 -11
  59. package/dist/lib/sml-api/copytrader.d.ts.map +0 -1
  60. package/dist/lib/sml-api/copytrader.js +0 -30
  61. package/dist/lib/sml-api/copytrader.js.map +0 -1
  62. package/dist/lib/sml-api/crawl.d.ts +0 -20
  63. package/dist/lib/sml-api/crawl.d.ts.map +0 -1
  64. package/dist/lib/sml-api/crawl.js +0 -32
  65. package/dist/lib/sml-api/crawl.js.map +0 -1
  66. package/dist/lib/sml-api/echo.d.ts +0 -10
  67. package/dist/lib/sml-api/echo.d.ts.map +0 -1
  68. package/dist/lib/sml-api/echo.js +0 -23
  69. package/dist/lib/sml-api/echo.js.map +0 -1
  70. package/dist/lib/sml-api/forge.d.ts +0 -11
  71. package/dist/lib/sml-api/forge.d.ts.map +0 -1
  72. package/dist/lib/sml-api/forge.js +0 -29
  73. package/dist/lib/sml-api/forge.js.map +0 -1
  74. package/dist/lib/sml-api/ftd.d.ts +0 -18
  75. package/dist/lib/sml-api/ftd.d.ts.map +0 -1
  76. package/dist/lib/sml-api/ftd.js +0 -43
  77. package/dist/lib/sml-api/ftd.js.map +0 -1
  78. package/dist/lib/sml-api/ghost.d.ts +0 -13
  79. package/dist/lib/sml-api/ghost.d.ts.map +0 -1
  80. package/dist/lib/sml-api/ghost.js +0 -29
  81. package/dist/lib/sml-api/ghost.js.map +0 -1
  82. package/dist/lib/sml-api/launchpad.d.ts +0 -20
  83. package/dist/lib/sml-api/launchpad.d.ts.map +0 -1
  84. package/dist/lib/sml-api/launchpad.js +0 -31
  85. package/dist/lib/sml-api/launchpad.js.map +0 -1
  86. package/dist/lib/sml-api/leviathan.d.ts +0 -22
  87. package/dist/lib/sml-api/leviathan.d.ts.map +0 -1
  88. package/dist/lib/sml-api/leviathan.js +0 -33
  89. package/dist/lib/sml-api/leviathan.js.map +0 -1
  90. package/dist/lib/sml-api/nexus.d.ts +0 -18
  91. package/dist/lib/sml-api/nexus.d.ts.map +0 -1
  92. package/dist/lib/sml-api/nexus.js +0 -40
  93. package/dist/lib/sml-api/nexus.js.map +0 -1
  94. package/dist/lib/sml-api/proof402.d.ts +0 -6
  95. package/dist/lib/sml-api/proof402.d.ts.map +0 -1
  96. package/dist/lib/sml-api/proof402.js +0 -30
  97. package/dist/lib/sml-api/proof402.js.map +0 -1
  98. package/dist/lib/sml-api/rails.d.ts +0 -12
  99. package/dist/lib/sml-api/rails.d.ts.map +0 -1
  100. package/dist/lib/sml-api/rails.js +0 -29
  101. package/dist/lib/sml-api/rails.js.map +0 -1
  102. package/dist/lib/sml-api/shadow.d.ts +0 -15
  103. package/dist/lib/sml-api/shadow.d.ts.map +0 -1
  104. package/dist/lib/sml-api/shadow.js +0 -27
  105. package/dist/lib/sml-api/shadow.js.map +0 -1
  106. package/dist/lib/sml-api/squeezeos.d.ts +0 -21
  107. package/dist/lib/sml-api/squeezeos.d.ts.map +0 -1
  108. package/dist/lib/sml-api/squeezeos.js +0 -97
  109. package/dist/lib/sml-api/squeezeos.js.map +0 -1
  110. package/dist/lib/sml-api/xdeo.d.ts +0 -13
  111. package/dist/lib/sml-api/xdeo.d.ts.map +0 -1
  112. package/dist/lib/sml-api/xdeo.js +0 -34
  113. package/dist/lib/sml-api/xdeo.js.map +0 -1
  114. package/dist/lib/sml-api/xmit.d.ts +0 -13
  115. package/dist/lib/sml-api/xmit.d.ts.map +0 -1
  116. package/dist/lib/sml-api/xmit.js +0 -34
  117. package/dist/lib/sml-api/xmit.js.map +0 -1
  118. package/dist/server/health.d.ts +0 -16
  119. package/dist/server/health.d.ts.map +0 -1
  120. package/dist/server/health.js +0 -39
  121. package/dist/server/health.js.map +0 -1
  122. package/dist/server/index.d.ts +0 -3
  123. package/dist/server/index.d.ts.map +0 -1
  124. package/dist/server/index.js +0 -199
  125. package/dist/server/index.js.map +0 -1
  126. package/dist/server/payments/ap2.d.ts +0 -17
  127. package/dist/server/payments/ap2.d.ts.map +0 -1
  128. package/dist/server/payments/ap2.js +0 -77
  129. package/dist/server/payments/ap2.js.map +0 -1
  130. package/dist/server/payments/receipt.d.ts +0 -28
  131. package/dist/server/payments/receipt.d.ts.map +0 -1
  132. package/dist/server/payments/receipt.js +0 -60
  133. package/dist/server/payments/receipt.js.map +0 -1
  134. package/dist/server/payments/router.d.ts +0 -23
  135. package/dist/server/payments/router.d.ts.map +0 -1
  136. package/dist/server/payments/router.js +0 -69
  137. package/dist/server/payments/router.js.map +0 -1
  138. package/dist/server/payments/wallet.d.ts +0 -18
  139. package/dist/server/payments/wallet.d.ts.map +0 -1
  140. package/dist/server/payments/wallet.js +0 -107
  141. package/dist/server/payments/wallet.js.map +0 -1
  142. package/dist/server/payments/x402.d.ts +0 -29
  143. package/dist/server/payments/x402.d.ts.map +0 -1
  144. package/dist/server/payments/x402.js +0 -138
  145. package/dist/server/payments/x402.js.map +0 -1
  146. package/dist/server/registry/catalog.d.ts +0 -12
  147. package/dist/server/registry/catalog.d.ts.map +0 -1
  148. package/dist/server/registry/catalog.js +0 -55
  149. package/dist/server/registry/catalog.js.map +0 -1
  150. package/dist/server/registry/discovery.d.ts +0 -16
  151. package/dist/server/registry/discovery.d.ts.map +0 -1
  152. package/dist/server/registry/discovery.js +0 -33
  153. package/dist/server/registry/discovery.js.map +0 -1
  154. package/dist/server/registry/pricing.d.ts +0 -10
  155. package/dist/server/registry/pricing.d.ts.map +0 -1
  156. package/dist/server/registry/pricing.js +0 -123
  157. package/dist/server/registry/pricing.js.map +0 -1
  158. package/dist/server/security/acl.d.ts +0 -28
  159. package/dist/server/security/acl.d.ts.map +0 -1
  160. package/dist/server/security/acl.js +0 -36
  161. package/dist/server/security/acl.js.map +0 -1
  162. package/dist/server/security/audit.d.ts +0 -15
  163. package/dist/server/security/audit.d.ts.map +0 -1
  164. package/dist/server/security/audit.js +0 -77
  165. package/dist/server/security/audit.js.map +0 -1
  166. package/dist/server/security/rate-limit.d.ts +0 -12
  167. package/dist/server/security/rate-limit.d.ts.map +0 -1
  168. package/dist/server/security/rate-limit.js +0 -72
  169. package/dist/server/security/rate-limit.js.map +0 -1
  170. package/dist/server/security/sandbox.d.ts +0 -7
  171. package/dist/server/security/sandbox.d.ts.map +0 -1
  172. package/dist/server/security/sandbox.js +0 -42
  173. package/dist/server/security/sandbox.js.map +0 -1
  174. package/dist/server/tools/agentcard.d.ts +0 -3
  175. package/dist/server/tools/agentcard.d.ts.map +0 -1
  176. package/dist/server/tools/agentcard.js +0 -118
  177. package/dist/server/tools/agentcard.js.map +0 -1
  178. package/dist/server/tools/backtest.d.ts +0 -3
  179. package/dist/server/tools/backtest.d.ts.map +0 -1
  180. package/dist/server/tools/backtest.js +0 -112
  181. package/dist/server/tools/backtest.js.map +0 -1
  182. package/dist/server/tools/brokers.d.ts +0 -3
  183. package/dist/server/tools/brokers.d.ts.map +0 -1
  184. package/dist/server/tools/brokers.js +0 -223
  185. package/dist/server/tools/brokers.js.map +0 -1
  186. package/dist/server/tools/copytrader.d.ts +0 -3
  187. package/dist/server/tools/copytrader.d.ts.map +0 -1
  188. package/dist/server/tools/copytrader.js +0 -90
  189. package/dist/server/tools/copytrader.js.map +0 -1
  190. package/dist/server/tools/crawl.d.ts +0 -3
  191. package/dist/server/tools/crawl.d.ts.map +0 -1
  192. package/dist/server/tools/crawl.js +0 -60
  193. package/dist/server/tools/crawl.js.map +0 -1
  194. package/dist/server/tools/discovery.d.ts +0 -3
  195. package/dist/server/tools/discovery.d.ts.map +0 -1
  196. package/dist/server/tools/discovery.js +0 -188
  197. package/dist/server/tools/discovery.js.map +0 -1
  198. package/dist/server/tools/echo.d.ts +0 -3
  199. package/dist/server/tools/echo.d.ts.map +0 -1
  200. package/dist/server/tools/echo.js +0 -48
  201. package/dist/server/tools/echo.js.map +0 -1
  202. package/dist/server/tools/forge.d.ts +0 -3
  203. package/dist/server/tools/forge.d.ts.map +0 -1
  204. package/dist/server/tools/forge.js +0 -77
  205. package/dist/server/tools/forge.js.map +0 -1
  206. package/dist/server/tools/ftd.d.ts +0 -3
  207. package/dist/server/tools/ftd.d.ts.map +0 -1
  208. package/dist/server/tools/ftd.js +0 -70
  209. package/dist/server/tools/ftd.js.map +0 -1
  210. package/dist/server/tools/ghost.d.ts +0 -3
  211. package/dist/server/tools/ghost.d.ts.map +0 -1
  212. package/dist/server/tools/ghost.js +0 -83
  213. package/dist/server/tools/ghost.js.map +0 -1
  214. package/dist/server/tools/index.d.ts +0 -3
  215. package/dist/server/tools/index.d.ts.map +0 -1
  216. package/dist/server/tools/index.js +0 -44
  217. package/dist/server/tools/index.js.map +0 -1
  218. package/dist/server/tools/launchpad.d.ts +0 -3
  219. package/dist/server/tools/launchpad.d.ts.map +0 -1
  220. package/dist/server/tools/launchpad.js +0 -151
  221. package/dist/server/tools/launchpad.js.map +0 -1
  222. package/dist/server/tools/leviathan.d.ts +0 -3
  223. package/dist/server/tools/leviathan.d.ts.map +0 -1
  224. package/dist/server/tools/leviathan.js +0 -73
  225. package/dist/server/tools/leviathan.js.map +0 -1
  226. package/dist/server/tools/nexus.d.ts +0 -3
  227. package/dist/server/tools/nexus.d.ts.map +0 -1
  228. package/dist/server/tools/nexus.js +0 -65
  229. package/dist/server/tools/nexus.js.map +0 -1
  230. package/dist/server/tools/proof402.d.ts +0 -3
  231. package/dist/server/tools/proof402.d.ts.map +0 -1
  232. package/dist/server/tools/proof402.js +0 -74
  233. package/dist/server/tools/proof402.js.map +0 -1
  234. package/dist/server/tools/rails.d.ts +0 -3
  235. package/dist/server/tools/rails.d.ts.map +0 -1
  236. package/dist/server/tools/rails.js +0 -82
  237. package/dist/server/tools/rails.js.map +0 -1
  238. package/dist/server/tools/shadow.d.ts +0 -3
  239. package/dist/server/tools/shadow.d.ts.map +0 -1
  240. package/dist/server/tools/shadow.js +0 -114
  241. package/dist/server/tools/shadow.js.map +0 -1
  242. package/dist/server/tools/squeezeos.d.ts +0 -3
  243. package/dist/server/tools/squeezeos.d.ts.map +0 -1
  244. package/dist/server/tools/squeezeos.js +0 -231
  245. package/dist/server/tools/squeezeos.js.map +0 -1
  246. package/dist/server/tools/xdeo.d.ts +0 -3
  247. package/dist/server/tools/xdeo.d.ts.map +0 -1
  248. package/dist/server/tools/xdeo.js +0 -58
  249. package/dist/server/tools/xdeo.js.map +0 -1
  250. package/dist/server/tools/xmit.d.ts +0 -3
  251. package/dist/server/tools/xmit.d.ts.map +0 -1
  252. package/dist/server/tools/xmit.js +0 -59
  253. package/dist/server/tools/xmit.js.map +0 -1
  254. package/docker-compose.yml +0 -50
  255. package/mcp-publisher.exe +0 -0
  256. package/render.yaml +0 -39
  257. package/sdk/mcp-x402-sdk/package.json +0 -18
  258. package/sdk/mcp-x402-sdk/src/index.ts +0 -118
  259. package/sdk/mcp-x402-sdk/tsconfig.json +0 -14
  260. package/server.json +0 -48
  261. package/services/backtest_service.py +0 -176
  262. package/src/lib/chains/base.ts +0 -77
  263. package/src/lib/chains/solana.ts +0 -59
  264. package/src/lib/chains/xrpl.ts +0 -63
  265. package/src/lib/credit/bureau.ts +0 -65
  266. package/src/lib/sml-api/agentcard.ts +0 -40
  267. package/src/lib/sml-api/backtest.ts +0 -47
  268. package/src/lib/sml-api/brokers.ts +0 -160
  269. package/src/lib/sml-api/copytrader.ts +0 -33
  270. package/src/lib/sml-api/crawl.ts +0 -44
  271. package/src/lib/sml-api/echo.ts +0 -28
  272. package/src/lib/sml-api/forge.ts +0 -33
  273. package/src/lib/sml-api/ftd.ts +0 -53
  274. package/src/lib/sml-api/ghost.ts +0 -35
  275. package/src/lib/sml-api/launchpad.ts +0 -43
  276. package/src/lib/sml-api/leviathan.ts +0 -49
  277. package/src/lib/sml-api/nexus.ts +0 -50
  278. package/src/lib/sml-api/proof402.ts +0 -27
  279. package/src/lib/sml-api/rails.ts +0 -34
  280. package/src/lib/sml-api/shadow.ts +0 -35
  281. package/src/lib/sml-api/squeezeos.ts +0 -95
  282. package/src/lib/sml-api/xdeo.ts +0 -40
  283. package/src/lib/sml-api/xmit.ts +0 -40
  284. package/src/server/health.ts +0 -52
  285. package/src/server/index.ts +0 -213
  286. package/src/server/payments/ap2.ts +0 -101
  287. package/src/server/payments/receipt.ts +0 -85
  288. package/src/server/payments/router.ts +0 -110
  289. package/src/server/payments/wallet.ts +0 -123
  290. package/src/server/payments/x402.ts +0 -177
  291. package/src/server/registry/catalog.ts +0 -61
  292. package/src/server/registry/discovery.ts +0 -39
  293. package/src/server/registry/pricing.ts +0 -133
  294. package/src/server/security/acl.ts +0 -42
  295. package/src/server/security/audit.ts +0 -94
  296. package/src/server/security/rate-limit.ts +0 -84
  297. package/src/server/security/sandbox.ts +0 -40
  298. package/src/server/tools/agentcard.ts +0 -134
  299. package/src/server/tools/backtest.ts +0 -119
  300. package/src/server/tools/brokers.ts +0 -250
  301. package/src/server/tools/copytrader.ts +0 -104
  302. package/src/server/tools/crawl.ts +0 -70
  303. package/src/server/tools/discovery.ts +0 -202
  304. package/src/server/tools/echo.ts +0 -58
  305. package/src/server/tools/forge.ts +0 -87
  306. package/src/server/tools/ftd.ts +0 -88
  307. package/src/server/tools/ghost.ts +0 -93
  308. package/src/server/tools/index.ts +0 -42
  309. package/src/server/tools/launchpad.ts +0 -173
  310. package/src/server/tools/leviathan.ts +0 -81
  311. package/src/server/tools/nexus.ts +0 -76
  312. package/src/server/tools/proof402.ts +0 -87
  313. package/src/server/tools/rails.ts +0 -92
  314. package/src/server/tools/shadow.ts +0 -128
  315. package/src/server/tools/squeezeos.ts +0 -312
  316. package/src/server/tools/xdeo.ts +0 -67
  317. package/src/server/tools/xmit.ts +0 -68
  318. package/tests/integration/e2e.test.ts +0 -51
  319. package/tests/unit/payments.test.ts +0 -49
  320. package/tests/unit/security.test.ts +0 -92
  321. package/tests/unit/tools.test.ts +0 -42
  322. package/tsconfig.json +0 -21
  323. package/vitest.config.ts +0 -20
@@ -1,76 +0,0 @@
1
- import { z } from 'zod';
2
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { executeX402Payment } from '../payments/x402.js';
4
- import { RateLimiter } from '../security/rate-limit.js';
5
- import { Sandbox } from '../security/sandbox.js';
6
- import { AuditLogger } from '../security/audit.js';
7
- import { NexusClient } from '../../lib/sml-api/nexus.js';
8
-
9
- const InputSchema = z.object({
10
- capability: z.string().min(1).max(200),
11
- max_budget: z.string().regex(/^\d+(\.\d+)?$/),
12
- chain_preference: z.enum(['base', 'xrpl', 'solana']).optional(),
13
- action: z.enum(['query', 'hire']).default('query'),
14
- agent_id: z.string().optional(),
15
- wallet_address: z.string().optional(),
16
- });
17
-
18
- const COMMISSION_RATE = 0.05;
19
-
20
- export function registerNexus(server: McpServer): void {
21
- server.tool(
22
- 'nexus_agent_hire',
23
- {
24
- capability: z.string().describe('Capability or skill to search for (e.g. "options flow analysis").'),
25
- max_budget: z.string().describe('Max budget in USDC for hire (e.g. "1.00").'),
26
- chain_preference: z.enum(['base', 'xrpl', 'solana']).describe('Preferred payment chain.'),
27
- action: z.enum(['query', 'hire']).describe('"query" is free. "hire" charges 5% commission on agent fee.'),
28
- agent_id: z.string().describe('Agent ID to hire (required for action=hire).'),
29
- wallet_address: z.string().describe('Agent wallet for payment.'),
30
- },
31
- async (rawArgs) => {
32
- const args = Sandbox.validate(InputSchema, rawArgs);
33
- const audit = AuditLogger.getInstance();
34
-
35
- if (!RateLimiter.getInstance().checkTool('nexus_agent_hire')) {
36
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded' }) }], isError: true };
37
- }
38
-
39
- const client = NexusClient.getInstance();
40
-
41
- // Free query tier
42
- if (args.action === 'query') {
43
- const results = await client.queryAgents({ capability: args.capability, maxBudget: args.max_budget });
44
- audit.info('nexus_query_success', { capability: args.capability });
45
- return { content: [{ type: 'text', text: JSON.stringify({ data: results, tier: 'free' }) }] };
46
- }
47
-
48
- // Hire — commission-based payment
49
- if (!args.agent_id) {
50
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'agent_id_required', message: 'Specify agent_id to hire.' }) }], isError: true };
51
- }
52
-
53
- const agentFee = parseFloat(args.max_budget);
54
- const commission = (agentFee * COMMISSION_RATE).toFixed(4);
55
-
56
- let payment;
57
- try {
58
- payment = await executeX402Payment({
59
- price: commission,
60
- currency: 'USDC',
61
- toolName: 'nexus_agent_hire',
62
- walletAddress: args.wallet_address,
63
- });
64
- } catch (err) {
65
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
66
- }
67
-
68
- const hireResult = await client.hireAgent({ agentId: args.agent_id, budget: args.max_budget, chainPreference: args.chain_preference });
69
-
70
- audit.info('nexus_hire_success', { agentId: args.agent_id, commission, receiptId: payment.receiptId });
71
- return {
72
- content: [{ type: 'text', text: JSON.stringify({ data: hireResult, commission: `${commission} USDC (5%)`, _meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain } }) }],
73
- };
74
- },
75
- );
76
- }
@@ -1,87 +0,0 @@
1
- import { z } from 'zod';
2
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { RateLimiter } from '../security/rate-limit.js';
4
- import { Sandbox } from '../security/sandbox.js';
5
- import { AuditLogger } from '../security/audit.js';
6
- import { Proof402API } from '../../lib/sml-api/proof402.js';
7
-
8
- const InvoiceSchema = z.object({
9
- endpoint_id: z.string().uuid(),
10
- });
11
-
12
- const VerifySchema = z.object({
13
- tx_hash: z.string().min(10),
14
- endpoint_id: z.string().uuid(),
15
- });
16
-
17
- const CreditSchema = z.object({
18
- wallet_address: z.string().min(10),
19
- });
20
-
21
- export function registerProof402(server: McpServer): void {
22
- const audit = AuditLogger.getInstance();
23
-
24
- // ── FREE: proof_invoice ────────────────────────────────────────────────────
25
- server.tool(
26
- 'proof_invoice',
27
- {
28
- endpoint_id: z.string().describe('UUID of the premium endpoint to get a payment invoice for.'),
29
- },
30
- async (rawArgs) => {
31
- const { endpoint_id } = Sandbox.validate(InvoiceSchema, rawArgs);
32
- if (!RateLimiter.getInstance().checkTool('proof_invoice')) {
33
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
34
- }
35
- try {
36
- const data = await Proof402API.invoice(endpoint_id);
37
- audit.info('proof_invoice', { endpoint_id });
38
- return { content: [{ type: 'text', text: JSON.stringify(data) }] };
39
- } catch (err) {
40
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
41
- }
42
- },
43
- );
44
-
45
- // ── FREE: proof_verify ─────────────────────────────────────────────────────
46
- server.tool(
47
- 'proof_verify',
48
- {
49
- tx_hash: z.string().describe('XRPL transaction hash to verify.'),
50
- endpoint_id: z.string().describe('UUID of the endpoint the payment was for.'),
51
- },
52
- async (rawArgs) => {
53
- const args = Sandbox.validate(VerifySchema, rawArgs);
54
- if (!RateLimiter.getInstance().checkTool('proof_verify')) {
55
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
56
- }
57
- try {
58
- const data = await Proof402API.verify(args.tx_hash, args.endpoint_id);
59
- audit.info('proof_verify', { tx_hash: args.tx_hash });
60
- return { content: [{ type: 'text', text: JSON.stringify(data) }] };
61
- } catch (err) {
62
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
63
- }
64
- },
65
- );
66
-
67
- // ── FREE: proof_credit_score ───────────────────────────────────────────────
68
- server.tool(
69
- 'proof_credit_score',
70
- {
71
- wallet_address: z.string().describe('Agent wallet address to look up credit score for (300-850 scale).'),
72
- },
73
- async (rawArgs) => {
74
- const { wallet_address } = Sandbox.validate(CreditSchema, rawArgs);
75
- if (!RateLimiter.getInstance().checkTool('proof_credit_score')) {
76
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
77
- }
78
- try {
79
- const data = await Proof402API.creditScore(wallet_address);
80
- audit.info('proof_credit_score', { wallet_address });
81
- return { content: [{ type: 'text', text: JSON.stringify(data) }] };
82
- } catch (err) {
83
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
84
- }
85
- },
86
- );
87
- }
@@ -1,92 +0,0 @@
1
- import { z } from 'zod';
2
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { executeX402Payment } from '../payments/x402.js';
4
- import { RateLimiter } from '../security/rate-limit.js';
5
- import { Sandbox } from '../security/sandbox.js';
6
- import { AuditLogger } from '../security/audit.js';
7
- import { PriceRegistry } from '../registry/pricing.js';
8
- import { RailsAPI } from '../../lib/sml-api/rails.js';
9
-
10
- const TransferSchema = z.object({
11
- from_address: z.string().min(10),
12
- to_address: z.string().min(10),
13
- amount: z.string().min(1),
14
- currency: z.enum(['RLUSD', 'XRP']),
15
- memo: z.string().max(256).optional(),
16
- wallet_address: z.string().optional(),
17
- });
18
-
19
- export function registerRails(server: McpServer): void {
20
- const audit = AuditLogger.getInstance();
21
-
22
- // ── FREE: rails_status ────────────────────────────────────────────────────
23
- server.tool(
24
- 'rails_status',
25
- {},
26
- async () => {
27
- try {
28
- const data = await RailsAPI.status();
29
- return { content: [{ type: 'text', text: JSON.stringify(data) }] };
30
- } catch (err) {
31
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
32
- }
33
- },
34
- );
35
-
36
- // ── PAID: rails_transfer (0.01 USDC) ──────────────────────────────────────
37
- server.tool(
38
- 'rails_transfer',
39
- {
40
- from_address: z.string().describe('Sender XRPL address.'),
41
- to_address: z.string().describe('Recipient XRPL or Xahau address.'),
42
- amount: z.string().describe('Amount to transfer (as string to preserve precision).'),
43
- currency: z.enum(['RLUSD', 'XRP']).describe('Token to transfer.'),
44
- memo: z.string().describe('Optional transfer memo (max 256 chars).'),
45
- wallet_address: z.string().describe('Agent wallet for x402 payment.'),
46
- },
47
- async (rawArgs) => {
48
- const args = Sandbox.validate(TransferSchema, rawArgs);
49
-
50
- if (!RateLimiter.getInstance().checkTool('rails_transfer')) {
51
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
52
- }
53
-
54
- await PriceRegistry.getInstance().seedDefaults();
55
- const price = await PriceRegistry.getInstance().getPrice('rails_transfer');
56
- if (!price) {
57
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable' }) }], isError: true };
58
- }
59
-
60
- let payment;
61
- try {
62
- payment = await executeX402Payment({ price, currency: 'USDC', toolName: 'rails_transfer', walletAddress: args.wallet_address });
63
- } catch (err) {
64
- audit.warn('rails_transfer_payment_fail', { error: String(err) });
65
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
66
- }
67
-
68
- try {
69
- const data = await RailsAPI.transfer({
70
- fromAddress: args.from_address,
71
- toAddress: args.to_address,
72
- amount: args.amount,
73
- currency: args.currency,
74
- memo: args.memo,
75
- });
76
- audit.info('rails_transfer_success', { receiptId: payment.receiptId });
77
- return {
78
- content: [{
79
- type: 'text',
80
- text: JSON.stringify({
81
- data,
82
- _meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain, amount_paid: `${payment.amountPaid} ${payment.currency}`, timestamp: payment.timestamp },
83
- }),
84
- }],
85
- };
86
- } catch (err) {
87
- audit.error('rails_transfer_api_fail', { error: String(err) });
88
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
89
- }
90
- },
91
- );
92
- }
@@ -1,128 +0,0 @@
1
- import { z } from 'zod';
2
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { executeX402Payment } from '../payments/x402.js';
4
- import { RateLimiter } from '../security/rate-limit.js';
5
- import { Sandbox } from '../security/sandbox.js';
6
- import { AuditLogger } from '../security/audit.js';
7
- import { PriceRegistry } from '../registry/pricing.js';
8
- import { ShadowDeskAPI } from '../../lib/sml-api/shadow.js';
9
-
10
- const QuerySchema = z.object({
11
- query: z.string().min(1).max(2048),
12
- context: z.string().max(1024).optional(),
13
- wallet_address: z.string().optional(),
14
- });
15
-
16
- const IngestSchema = z.object({
17
- source: z.string().min(1).max(256),
18
- payload: z.record(z.unknown()),
19
- wallet_address: z.string().optional(),
20
- });
21
-
22
- export function registerShadow(server: McpServer): void {
23
- const audit = AuditLogger.getInstance();
24
-
25
- // ── PAID: shadow_query (0.02 USDC) ────────────────────────────────────────
26
- server.tool(
27
- 'shadow_query',
28
- {
29
- query: z.string().describe('Natural language query for signal intelligence (max 2048 chars).'),
30
- context: z.string().describe('Optional context to refine the query (max 1024 chars).'),
31
- wallet_address: z.string().describe('Agent wallet for x402 payment.'),
32
- },
33
- async (rawArgs) => {
34
- const args = Sandbox.validate(QuerySchema, rawArgs);
35
-
36
- if (!RateLimiter.getInstance().checkTool('shadow_query')) {
37
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
38
- }
39
-
40
- await PriceRegistry.getInstance().seedDefaults();
41
- const price = await PriceRegistry.getInstance().getPrice('shadow_query');
42
- if (!price) {
43
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable' }) }], isError: true };
44
- }
45
-
46
- let payment;
47
- try {
48
- payment = await executeX402Payment({ price, currency: 'USDC', toolName: 'shadow_query', walletAddress: args.wallet_address });
49
- } catch (err) {
50
- audit.warn('shadow_query_payment_fail', { error: String(err) });
51
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
52
- }
53
-
54
- try {
55
- const data = await ShadowDeskAPI.query({
56
- query: args.query,
57
- context: args.context,
58
- walletAddress: args.wallet_address ?? payment.walletAddress ?? 'anonymous',
59
- });
60
- audit.info('shadow_query_success', { receiptId: payment.receiptId });
61
- return {
62
- content: [{
63
- type: 'text',
64
- text: JSON.stringify({
65
- data,
66
- _meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain, amount_paid: `${payment.amountPaid} ${payment.currency}`, timestamp: payment.timestamp },
67
- }),
68
- }],
69
- };
70
- } catch (err) {
71
- audit.error('shadow_query_api_fail', { error: String(err) });
72
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
73
- }
74
- },
75
- );
76
-
77
- // ── PAID: shadow_ingest (0.01 USDC) ───────────────────────────────────────
78
- server.tool(
79
- 'shadow_ingest',
80
- {
81
- source: z.string().describe('Source identifier for the data being ingested (e.g. "discord", "twitter", "on-chain").'),
82
- payload: z.record(z.unknown()).describe('Signal data payload as a JSON object.'),
83
- wallet_address: z.string().describe('Agent wallet for x402 payment.'),
84
- },
85
- async (rawArgs) => {
86
- const args = Sandbox.validate(IngestSchema, rawArgs);
87
-
88
- if (!RateLimiter.getInstance().checkTool('shadow_ingest')) {
89
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
90
- }
91
-
92
- await PriceRegistry.getInstance().seedDefaults();
93
- const price = await PriceRegistry.getInstance().getPrice('shadow_ingest');
94
- if (!price) {
95
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable' }) }], isError: true };
96
- }
97
-
98
- let payment;
99
- try {
100
- payment = await executeX402Payment({ price, currency: 'USDC', toolName: 'shadow_ingest', walletAddress: args.wallet_address });
101
- } catch (err) {
102
- audit.warn('shadow_ingest_payment_fail', { error: String(err) });
103
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
104
- }
105
-
106
- try {
107
- const data = await ShadowDeskAPI.ingest({
108
- source: args.source,
109
- payload: args.payload,
110
- walletAddress: args.wallet_address ?? payment.walletAddress ?? 'anonymous',
111
- });
112
- audit.info('shadow_ingest_success', { source: args.source, receiptId: payment.receiptId });
113
- return {
114
- content: [{
115
- type: 'text',
116
- text: JSON.stringify({
117
- data,
118
- _meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain, amount_paid: `${payment.amountPaid} ${payment.currency}`, timestamp: payment.timestamp },
119
- }),
120
- }],
121
- };
122
- } catch (err) {
123
- audit.error('shadow_ingest_api_fail', { error: String(err) });
124
- return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
125
- }
126
- },
127
- );
128
- }