@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.
- package/.well-known/x402.json +37 -0
- package/LICENSE +57 -21
- package/README.md +262 -304
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-wrapper.d.ts +71 -0
- package/dist/mcp-wrapper.d.ts.map +1 -0
- package/dist/mcp-wrapper.js +104 -0
- package/dist/mcp-wrapper.js.map +1 -0
- package/dist/x402-middleware.d.ts +76 -0
- package/dist/x402-middleware.d.ts.map +1 -0
- package/dist/x402-middleware.js +113 -0
- package/dist/x402-middleware.js.map +1 -0
- package/dist/xrpl-facilitator.d.ts +77 -0
- package/dist/xrpl-facilitator.d.ts.map +1 -0
- package/dist/xrpl-facilitator.js +156 -0
- package/dist/xrpl-facilitator.js.map +1 -0
- package/llms.txt +108 -70
- package/package.json +65 -78
- package/schema.jsonld +97 -0
- package/.env.example +0 -35
- package/.github/workflows/ci.yml +0 -59
- package/.github/workflows/keepalive.yml +0 -31
- package/.well-known/agentcard.json +0 -34
- package/CONTRIBUTING.md +0 -76
- package/Dockerfile +0 -19
- package/agents.json +0 -67
- package/dist/lib/chains/base.d.ts +0 -10
- package/dist/lib/chains/base.d.ts.map +0 -1
- package/dist/lib/chains/base.js +0 -73
- package/dist/lib/chains/base.js.map +0 -1
- package/dist/lib/chains/solana.d.ts +0 -10
- package/dist/lib/chains/solana.d.ts.map +0 -1
- package/dist/lib/chains/solana.js +0 -49
- package/dist/lib/chains/solana.js.map +0 -1
- package/dist/lib/chains/xrpl.d.ts +0 -10
- package/dist/lib/chains/xrpl.d.ts.map +0 -1
- package/dist/lib/chains/xrpl.js +0 -55
- package/dist/lib/chains/xrpl.js.map +0 -1
- package/dist/lib/credit/bureau.d.ts +0 -10
- package/dist/lib/credit/bureau.d.ts.map +0 -1
- package/dist/lib/credit/bureau.js +0 -58
- package/dist/lib/credit/bureau.js.map +0 -1
- package/dist/lib/sml-api/agentcard.d.ts +0 -17
- package/dist/lib/sml-api/agentcard.d.ts.map +0 -1
- package/dist/lib/sml-api/agentcard.js +0 -30
- package/dist/lib/sml-api/agentcard.js.map +0 -1
- package/dist/lib/sml-api/backtest.d.ts +0 -22
- package/dist/lib/sml-api/backtest.d.ts.map +0 -1
- package/dist/lib/sml-api/backtest.js +0 -28
- package/dist/lib/sml-api/backtest.js.map +0 -1
- package/dist/lib/sml-api/brokers.d.ts +0 -40
- package/dist/lib/sml-api/brokers.d.ts.map +0 -1
- package/dist/lib/sml-api/brokers.js +0 -128
- package/dist/lib/sml-api/brokers.js.map +0 -1
- package/dist/lib/sml-api/copytrader.d.ts +0 -11
- package/dist/lib/sml-api/copytrader.d.ts.map +0 -1
- package/dist/lib/sml-api/copytrader.js +0 -30
- package/dist/lib/sml-api/copytrader.js.map +0 -1
- package/dist/lib/sml-api/crawl.d.ts +0 -20
- package/dist/lib/sml-api/crawl.d.ts.map +0 -1
- package/dist/lib/sml-api/crawl.js +0 -32
- package/dist/lib/sml-api/crawl.js.map +0 -1
- package/dist/lib/sml-api/echo.d.ts +0 -10
- package/dist/lib/sml-api/echo.d.ts.map +0 -1
- package/dist/lib/sml-api/echo.js +0 -23
- package/dist/lib/sml-api/echo.js.map +0 -1
- package/dist/lib/sml-api/forge.d.ts +0 -11
- package/dist/lib/sml-api/forge.d.ts.map +0 -1
- package/dist/lib/sml-api/forge.js +0 -29
- package/dist/lib/sml-api/forge.js.map +0 -1
- package/dist/lib/sml-api/ftd.d.ts +0 -18
- package/dist/lib/sml-api/ftd.d.ts.map +0 -1
- package/dist/lib/sml-api/ftd.js +0 -43
- package/dist/lib/sml-api/ftd.js.map +0 -1
- package/dist/lib/sml-api/ghost.d.ts +0 -13
- package/dist/lib/sml-api/ghost.d.ts.map +0 -1
- package/dist/lib/sml-api/ghost.js +0 -29
- package/dist/lib/sml-api/ghost.js.map +0 -1
- package/dist/lib/sml-api/launchpad.d.ts +0 -20
- package/dist/lib/sml-api/launchpad.d.ts.map +0 -1
- package/dist/lib/sml-api/launchpad.js +0 -31
- package/dist/lib/sml-api/launchpad.js.map +0 -1
- package/dist/lib/sml-api/leviathan.d.ts +0 -22
- package/dist/lib/sml-api/leviathan.d.ts.map +0 -1
- package/dist/lib/sml-api/leviathan.js +0 -33
- package/dist/lib/sml-api/leviathan.js.map +0 -1
- package/dist/lib/sml-api/nexus.d.ts +0 -18
- package/dist/lib/sml-api/nexus.d.ts.map +0 -1
- package/dist/lib/sml-api/nexus.js +0 -40
- package/dist/lib/sml-api/nexus.js.map +0 -1
- package/dist/lib/sml-api/proof402.d.ts +0 -6
- package/dist/lib/sml-api/proof402.d.ts.map +0 -1
- package/dist/lib/sml-api/proof402.js +0 -30
- package/dist/lib/sml-api/proof402.js.map +0 -1
- package/dist/lib/sml-api/rails.d.ts +0 -12
- package/dist/lib/sml-api/rails.d.ts.map +0 -1
- package/dist/lib/sml-api/rails.js +0 -29
- package/dist/lib/sml-api/rails.js.map +0 -1
- package/dist/lib/sml-api/shadow.d.ts +0 -15
- package/dist/lib/sml-api/shadow.d.ts.map +0 -1
- package/dist/lib/sml-api/shadow.js +0 -27
- package/dist/lib/sml-api/shadow.js.map +0 -1
- package/dist/lib/sml-api/squeezeos.d.ts +0 -21
- package/dist/lib/sml-api/squeezeos.d.ts.map +0 -1
- package/dist/lib/sml-api/squeezeos.js +0 -97
- package/dist/lib/sml-api/squeezeos.js.map +0 -1
- package/dist/lib/sml-api/xdeo.d.ts +0 -13
- package/dist/lib/sml-api/xdeo.d.ts.map +0 -1
- package/dist/lib/sml-api/xdeo.js +0 -34
- package/dist/lib/sml-api/xdeo.js.map +0 -1
- package/dist/lib/sml-api/xmit.d.ts +0 -13
- package/dist/lib/sml-api/xmit.d.ts.map +0 -1
- package/dist/lib/sml-api/xmit.js +0 -34
- package/dist/lib/sml-api/xmit.js.map +0 -1
- package/dist/server/health.d.ts +0 -16
- package/dist/server/health.d.ts.map +0 -1
- package/dist/server/health.js +0 -39
- package/dist/server/health.js.map +0 -1
- package/dist/server/index.d.ts +0 -3
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js +0 -199
- package/dist/server/index.js.map +0 -1
- package/dist/server/payments/ap2.d.ts +0 -17
- package/dist/server/payments/ap2.d.ts.map +0 -1
- package/dist/server/payments/ap2.js +0 -77
- package/dist/server/payments/ap2.js.map +0 -1
- package/dist/server/payments/receipt.d.ts +0 -28
- package/dist/server/payments/receipt.d.ts.map +0 -1
- package/dist/server/payments/receipt.js +0 -60
- package/dist/server/payments/receipt.js.map +0 -1
- package/dist/server/payments/router.d.ts +0 -23
- package/dist/server/payments/router.d.ts.map +0 -1
- package/dist/server/payments/router.js +0 -69
- package/dist/server/payments/router.js.map +0 -1
- package/dist/server/payments/wallet.d.ts +0 -18
- package/dist/server/payments/wallet.d.ts.map +0 -1
- package/dist/server/payments/wallet.js +0 -107
- package/dist/server/payments/wallet.js.map +0 -1
- package/dist/server/payments/x402.d.ts +0 -29
- package/dist/server/payments/x402.d.ts.map +0 -1
- package/dist/server/payments/x402.js +0 -138
- package/dist/server/payments/x402.js.map +0 -1
- package/dist/server/registry/catalog.d.ts +0 -12
- package/dist/server/registry/catalog.d.ts.map +0 -1
- package/dist/server/registry/catalog.js +0 -55
- package/dist/server/registry/catalog.js.map +0 -1
- package/dist/server/registry/discovery.d.ts +0 -16
- package/dist/server/registry/discovery.d.ts.map +0 -1
- package/dist/server/registry/discovery.js +0 -33
- package/dist/server/registry/discovery.js.map +0 -1
- package/dist/server/registry/pricing.d.ts +0 -10
- package/dist/server/registry/pricing.d.ts.map +0 -1
- package/dist/server/registry/pricing.js +0 -123
- package/dist/server/registry/pricing.js.map +0 -1
- package/dist/server/security/acl.d.ts +0 -28
- package/dist/server/security/acl.d.ts.map +0 -1
- package/dist/server/security/acl.js +0 -36
- package/dist/server/security/acl.js.map +0 -1
- package/dist/server/security/audit.d.ts +0 -15
- package/dist/server/security/audit.d.ts.map +0 -1
- package/dist/server/security/audit.js +0 -77
- package/dist/server/security/audit.js.map +0 -1
- package/dist/server/security/rate-limit.d.ts +0 -12
- package/dist/server/security/rate-limit.d.ts.map +0 -1
- package/dist/server/security/rate-limit.js +0 -72
- package/dist/server/security/rate-limit.js.map +0 -1
- package/dist/server/security/sandbox.d.ts +0 -7
- package/dist/server/security/sandbox.d.ts.map +0 -1
- package/dist/server/security/sandbox.js +0 -42
- package/dist/server/security/sandbox.js.map +0 -1
- package/dist/server/tools/agentcard.d.ts +0 -3
- package/dist/server/tools/agentcard.d.ts.map +0 -1
- package/dist/server/tools/agentcard.js +0 -118
- package/dist/server/tools/agentcard.js.map +0 -1
- package/dist/server/tools/backtest.d.ts +0 -3
- package/dist/server/tools/backtest.d.ts.map +0 -1
- package/dist/server/tools/backtest.js +0 -112
- package/dist/server/tools/backtest.js.map +0 -1
- package/dist/server/tools/brokers.d.ts +0 -3
- package/dist/server/tools/brokers.d.ts.map +0 -1
- package/dist/server/tools/brokers.js +0 -223
- package/dist/server/tools/brokers.js.map +0 -1
- package/dist/server/tools/copytrader.d.ts +0 -3
- package/dist/server/tools/copytrader.d.ts.map +0 -1
- package/dist/server/tools/copytrader.js +0 -90
- package/dist/server/tools/copytrader.js.map +0 -1
- package/dist/server/tools/crawl.d.ts +0 -3
- package/dist/server/tools/crawl.d.ts.map +0 -1
- package/dist/server/tools/crawl.js +0 -60
- package/dist/server/tools/crawl.js.map +0 -1
- package/dist/server/tools/discovery.d.ts +0 -3
- package/dist/server/tools/discovery.d.ts.map +0 -1
- package/dist/server/tools/discovery.js +0 -188
- package/dist/server/tools/discovery.js.map +0 -1
- package/dist/server/tools/echo.d.ts +0 -3
- package/dist/server/tools/echo.d.ts.map +0 -1
- package/dist/server/tools/echo.js +0 -48
- package/dist/server/tools/echo.js.map +0 -1
- package/dist/server/tools/forge.d.ts +0 -3
- package/dist/server/tools/forge.d.ts.map +0 -1
- package/dist/server/tools/forge.js +0 -77
- package/dist/server/tools/forge.js.map +0 -1
- package/dist/server/tools/ftd.d.ts +0 -3
- package/dist/server/tools/ftd.d.ts.map +0 -1
- package/dist/server/tools/ftd.js +0 -70
- package/dist/server/tools/ftd.js.map +0 -1
- package/dist/server/tools/ghost.d.ts +0 -3
- package/dist/server/tools/ghost.d.ts.map +0 -1
- package/dist/server/tools/ghost.js +0 -83
- package/dist/server/tools/ghost.js.map +0 -1
- package/dist/server/tools/index.d.ts +0 -3
- package/dist/server/tools/index.d.ts.map +0 -1
- package/dist/server/tools/index.js +0 -44
- package/dist/server/tools/index.js.map +0 -1
- package/dist/server/tools/launchpad.d.ts +0 -3
- package/dist/server/tools/launchpad.d.ts.map +0 -1
- package/dist/server/tools/launchpad.js +0 -151
- package/dist/server/tools/launchpad.js.map +0 -1
- package/dist/server/tools/leviathan.d.ts +0 -3
- package/dist/server/tools/leviathan.d.ts.map +0 -1
- package/dist/server/tools/leviathan.js +0 -73
- package/dist/server/tools/leviathan.js.map +0 -1
- package/dist/server/tools/nexus.d.ts +0 -3
- package/dist/server/tools/nexus.d.ts.map +0 -1
- package/dist/server/tools/nexus.js +0 -65
- package/dist/server/tools/nexus.js.map +0 -1
- package/dist/server/tools/proof402.d.ts +0 -3
- package/dist/server/tools/proof402.d.ts.map +0 -1
- package/dist/server/tools/proof402.js +0 -74
- package/dist/server/tools/proof402.js.map +0 -1
- package/dist/server/tools/rails.d.ts +0 -3
- package/dist/server/tools/rails.d.ts.map +0 -1
- package/dist/server/tools/rails.js +0 -82
- package/dist/server/tools/rails.js.map +0 -1
- package/dist/server/tools/shadow.d.ts +0 -3
- package/dist/server/tools/shadow.d.ts.map +0 -1
- package/dist/server/tools/shadow.js +0 -114
- package/dist/server/tools/shadow.js.map +0 -1
- package/dist/server/tools/squeezeos.d.ts +0 -3
- package/dist/server/tools/squeezeos.d.ts.map +0 -1
- package/dist/server/tools/squeezeos.js +0 -231
- package/dist/server/tools/squeezeos.js.map +0 -1
- package/dist/server/tools/xdeo.d.ts +0 -3
- package/dist/server/tools/xdeo.d.ts.map +0 -1
- package/dist/server/tools/xdeo.js +0 -58
- package/dist/server/tools/xdeo.js.map +0 -1
- package/dist/server/tools/xmit.d.ts +0 -3
- package/dist/server/tools/xmit.d.ts.map +0 -1
- package/dist/server/tools/xmit.js +0 -59
- package/dist/server/tools/xmit.js.map +0 -1
- package/docker-compose.yml +0 -50
- package/mcp-publisher.exe +0 -0
- package/render.yaml +0 -39
- package/sdk/mcp-x402-sdk/package.json +0 -18
- package/sdk/mcp-x402-sdk/src/index.ts +0 -118
- package/sdk/mcp-x402-sdk/tsconfig.json +0 -14
- package/server.json +0 -48
- package/services/backtest_service.py +0 -176
- package/src/lib/chains/base.ts +0 -77
- package/src/lib/chains/solana.ts +0 -59
- package/src/lib/chains/xrpl.ts +0 -63
- package/src/lib/credit/bureau.ts +0 -65
- package/src/lib/sml-api/agentcard.ts +0 -40
- package/src/lib/sml-api/backtest.ts +0 -47
- package/src/lib/sml-api/brokers.ts +0 -160
- package/src/lib/sml-api/copytrader.ts +0 -33
- package/src/lib/sml-api/crawl.ts +0 -44
- package/src/lib/sml-api/echo.ts +0 -28
- package/src/lib/sml-api/forge.ts +0 -33
- package/src/lib/sml-api/ftd.ts +0 -53
- package/src/lib/sml-api/ghost.ts +0 -35
- package/src/lib/sml-api/launchpad.ts +0 -43
- package/src/lib/sml-api/leviathan.ts +0 -49
- package/src/lib/sml-api/nexus.ts +0 -50
- package/src/lib/sml-api/proof402.ts +0 -27
- package/src/lib/sml-api/rails.ts +0 -34
- package/src/lib/sml-api/shadow.ts +0 -35
- package/src/lib/sml-api/squeezeos.ts +0 -95
- package/src/lib/sml-api/xdeo.ts +0 -40
- package/src/lib/sml-api/xmit.ts +0 -40
- package/src/server/health.ts +0 -52
- package/src/server/index.ts +0 -213
- package/src/server/payments/ap2.ts +0 -101
- package/src/server/payments/receipt.ts +0 -85
- package/src/server/payments/router.ts +0 -110
- package/src/server/payments/wallet.ts +0 -123
- package/src/server/payments/x402.ts +0 -177
- package/src/server/registry/catalog.ts +0 -61
- package/src/server/registry/discovery.ts +0 -39
- package/src/server/registry/pricing.ts +0 -133
- package/src/server/security/acl.ts +0 -42
- package/src/server/security/audit.ts +0 -94
- package/src/server/security/rate-limit.ts +0 -84
- package/src/server/security/sandbox.ts +0 -40
- package/src/server/tools/agentcard.ts +0 -134
- package/src/server/tools/backtest.ts +0 -119
- package/src/server/tools/brokers.ts +0 -250
- package/src/server/tools/copytrader.ts +0 -104
- package/src/server/tools/crawl.ts +0 -70
- package/src/server/tools/discovery.ts +0 -202
- package/src/server/tools/echo.ts +0 -58
- package/src/server/tools/forge.ts +0 -87
- package/src/server/tools/ftd.ts +0 -88
- package/src/server/tools/ghost.ts +0 -93
- package/src/server/tools/index.ts +0 -42
- package/src/server/tools/launchpad.ts +0 -173
- package/src/server/tools/leviathan.ts +0 -81
- package/src/server/tools/nexus.ts +0 -76
- package/src/server/tools/proof402.ts +0 -87
- package/src/server/tools/rails.ts +0 -92
- package/src/server/tools/shadow.ts +0 -128
- package/src/server/tools/squeezeos.ts +0 -312
- package/src/server/tools/xdeo.ts +0 -67
- package/src/server/tools/xmit.ts +0 -68
- package/tests/integration/e2e.test.ts +0 -51
- package/tests/unit/payments.test.ts +0 -49
- package/tests/unit/security.test.ts +0 -92
- package/tests/unit/tools.test.ts +0 -42
- package/tsconfig.json +0 -21
- package/vitest.config.ts +0 -20
|
@@ -1,250 +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 { TradierAPI, RobinhoodAPI } from '../../lib/sml-api/brokers.js';
|
|
9
|
-
|
|
10
|
-
// ── Schemas ────────────────────────────────────────────────────────────────
|
|
11
|
-
|
|
12
|
-
const TradierQuoteSchema = z.object({
|
|
13
|
-
symbols: z.string().min(1).max(200),
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
const TradierOrderSchema = z.object({
|
|
17
|
-
account_id: z.string().min(1),
|
|
18
|
-
symbol: z.string().min(1).max(10).toUpperCase(),
|
|
19
|
-
side: z.enum(['buy', 'sell']),
|
|
20
|
-
quantity: z.number().int().min(1).max(10000),
|
|
21
|
-
type: z.enum(['market', 'limit', 'stop', 'stop_limit']),
|
|
22
|
-
duration: z.enum(['day', 'gtc', 'pre', 'post']),
|
|
23
|
-
price: z.number().positive().optional(),
|
|
24
|
-
stop: z.number().positive().optional(),
|
|
25
|
-
wallet_address: z.string().optional(),
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
const RobinhoodQuoteSchema = z.object({
|
|
29
|
-
symbol: z.string().min(1).max(10).toUpperCase(),
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
const RobinhoodOrderSchema = z.object({
|
|
33
|
-
symbol: z.string().min(1).max(10).toUpperCase(),
|
|
34
|
-
side: z.enum(['buy', 'sell']),
|
|
35
|
-
quantity: z.number().int().min(1).max(10000),
|
|
36
|
-
type: z.enum(['market', 'limit']),
|
|
37
|
-
time_in_force: z.enum(['gfd', 'gtc', 'ioc', 'opg']),
|
|
38
|
-
price: z.number().positive().optional(),
|
|
39
|
-
wallet_address: z.string().optional(),
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
const AccountSchema = z.object({
|
|
43
|
-
account_id: z.string().min(1),
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
// ── Registration ───────────────────────────────────────────────────────────
|
|
47
|
-
|
|
48
|
-
export function registerBrokers(server: McpServer): void {
|
|
49
|
-
const audit = AuditLogger.getInstance();
|
|
50
|
-
|
|
51
|
-
// ── tradier_quote — FREE ─────────────────────────────────────────────────
|
|
52
|
-
server.tool(
|
|
53
|
-
'tradier_quote',
|
|
54
|
-
{
|
|
55
|
-
symbols: z.string().describe('Comma-separated ticker symbols (e.g. "NVDA,SPY,AAPL")'),
|
|
56
|
-
},
|
|
57
|
-
async (rawArgs) => {
|
|
58
|
-
const args = Sandbox.validate(TradierQuoteSchema, rawArgs);
|
|
59
|
-
if (!RateLimiter.getInstance().checkTool('tradier_quote')) {
|
|
60
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded' }) }], isError: true };
|
|
61
|
-
}
|
|
62
|
-
try {
|
|
63
|
-
const data = await TradierAPI.quote({ symbols: args.symbols });
|
|
64
|
-
audit.info('tradier_quote_success', { symbols: args.symbols });
|
|
65
|
-
return { content: [{ type: 'text', text: JSON.stringify(data) }] };
|
|
66
|
-
} catch (err) {
|
|
67
|
-
audit.warn('tradier_quote_fail', { error: String(err) });
|
|
68
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
// ── tradier_order — $0.01 x402 ──────────────────────────────────────────
|
|
74
|
-
server.tool(
|
|
75
|
-
'tradier_order',
|
|
76
|
-
{
|
|
77
|
-
account_id: z.string().describe('Tradier brokerage account ID'),
|
|
78
|
-
symbol: z.string().describe('Ticker symbol (e.g. NVDA)'),
|
|
79
|
-
side: z.string().describe('"buy" or "sell"'),
|
|
80
|
-
quantity: z.number().describe('Number of shares (integer)'),
|
|
81
|
-
type: z.string().describe('"market" | "limit" | "stop" | "stop_limit"'),
|
|
82
|
-
duration: z.string().describe('"day" | "gtc" | "pre" | "post"'),
|
|
83
|
-
price: z.number().describe('Limit price (required for limit/stop_limit orders)'),
|
|
84
|
-
stop: z.number().describe('Stop price (required for stop/stop_limit orders)'),
|
|
85
|
-
wallet_address: z.string().describe('Agent wallet for x402 payment (AP2 required)'),
|
|
86
|
-
},
|
|
87
|
-
async (rawArgs) => {
|
|
88
|
-
const args = Sandbox.validate(TradierOrderSchema, rawArgs);
|
|
89
|
-
if (!RateLimiter.getInstance().checkTool('tradier_order')) {
|
|
90
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded' }) }], isError: true };
|
|
91
|
-
}
|
|
92
|
-
await PriceRegistry.getInstance().seedDefaults();
|
|
93
|
-
const price = await PriceRegistry.getInstance().getPrice('tradier_order');
|
|
94
|
-
if (!price) {
|
|
95
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable' }) }], isError: true };
|
|
96
|
-
}
|
|
97
|
-
let payment;
|
|
98
|
-
try {
|
|
99
|
-
payment = await executeX402Payment({ price, currency: 'USDC', toolName: 'tradier_order', walletAddress: args.wallet_address });
|
|
100
|
-
} catch (err) {
|
|
101
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
|
|
102
|
-
}
|
|
103
|
-
try {
|
|
104
|
-
const result = await TradierAPI.order({
|
|
105
|
-
account_id: args.account_id,
|
|
106
|
-
symbol: args.symbol,
|
|
107
|
-
side: args.side,
|
|
108
|
-
quantity: args.quantity,
|
|
109
|
-
type: args.type,
|
|
110
|
-
duration: args.duration,
|
|
111
|
-
price: args.price,
|
|
112
|
-
stop: args.stop,
|
|
113
|
-
});
|
|
114
|
-
audit.info('tradier_order_success', { symbol: args.symbol, side: args.side, quantity: args.quantity });
|
|
115
|
-
return {
|
|
116
|
-
content: [{
|
|
117
|
-
type: 'text',
|
|
118
|
-
text: JSON.stringify({
|
|
119
|
-
...(result as object),
|
|
120
|
-
_meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain, amount_paid: `${payment.amountPaid} ${payment.currency}` },
|
|
121
|
-
}),
|
|
122
|
-
}],
|
|
123
|
-
};
|
|
124
|
-
} catch (err) {
|
|
125
|
-
audit.warn('tradier_order_fail', { error: String(err) });
|
|
126
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
|
|
127
|
-
}
|
|
128
|
-
},
|
|
129
|
-
);
|
|
130
|
-
|
|
131
|
-
// ── tradier_positions — FREE ─────────────────────────────────────────────
|
|
132
|
-
server.tool(
|
|
133
|
-
'tradier_positions',
|
|
134
|
-
{
|
|
135
|
-
account_id: z.string().describe('Tradier brokerage account ID'),
|
|
136
|
-
},
|
|
137
|
-
async (rawArgs) => {
|
|
138
|
-
const args = Sandbox.validate(AccountSchema, rawArgs);
|
|
139
|
-
if (!RateLimiter.getInstance().checkTool('tradier_positions')) {
|
|
140
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded' }) }], isError: true };
|
|
141
|
-
}
|
|
142
|
-
try {
|
|
143
|
-
const [positions, balances] = await Promise.all([
|
|
144
|
-
TradierAPI.positions(args.account_id),
|
|
145
|
-
TradierAPI.balances(args.account_id),
|
|
146
|
-
]);
|
|
147
|
-
return { content: [{ type: 'text', text: JSON.stringify({ positions, balances }) }] };
|
|
148
|
-
} catch (err) {
|
|
149
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
// ── robinhood_quote — FREE ───────────────────────────────────────────────
|
|
155
|
-
server.tool(
|
|
156
|
-
'robinhood_quote',
|
|
157
|
-
{
|
|
158
|
-
symbol: z.string().describe('Ticker symbol (e.g. NVDA)'),
|
|
159
|
-
},
|
|
160
|
-
async (rawArgs) => {
|
|
161
|
-
const args = Sandbox.validate(RobinhoodQuoteSchema, rawArgs);
|
|
162
|
-
if (!RateLimiter.getInstance().checkTool('robinhood_quote')) {
|
|
163
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded' }) }], isError: true };
|
|
164
|
-
}
|
|
165
|
-
try {
|
|
166
|
-
const data = await RobinhoodAPI.quote(args.symbol);
|
|
167
|
-
audit.info('robinhood_quote_success', { symbol: args.symbol });
|
|
168
|
-
return { content: [{ type: 'text', text: JSON.stringify(data) }] };
|
|
169
|
-
} catch (err) {
|
|
170
|
-
audit.warn('robinhood_quote_fail', { error: String(err) });
|
|
171
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
|
|
172
|
-
}
|
|
173
|
-
},
|
|
174
|
-
);
|
|
175
|
-
|
|
176
|
-
// ── robinhood_order — $0.01 x402 ────────────────────────────────────────
|
|
177
|
-
server.tool(
|
|
178
|
-
'robinhood_order',
|
|
179
|
-
{
|
|
180
|
-
symbol: z.string().describe('Ticker symbol (e.g. NVDA)'),
|
|
181
|
-
side: z.string().describe('"buy" or "sell"'),
|
|
182
|
-
quantity: z.number().describe('Number of shares (integer)'),
|
|
183
|
-
type: z.string().describe('"market" or "limit"'),
|
|
184
|
-
time_in_force: z.string().describe('"gfd" (good for day) | "gtc" | "ioc" | "opg"'),
|
|
185
|
-
price: z.number().describe('Limit price (required for limit orders)'),
|
|
186
|
-
wallet_address: z.string().describe('Agent wallet for x402 payment (AP2 required)'),
|
|
187
|
-
},
|
|
188
|
-
async (rawArgs) => {
|
|
189
|
-
const args = Sandbox.validate(RobinhoodOrderSchema, rawArgs);
|
|
190
|
-
if (!RateLimiter.getInstance().checkTool('robinhood_order')) {
|
|
191
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded' }) }], isError: true };
|
|
192
|
-
}
|
|
193
|
-
await PriceRegistry.getInstance().seedDefaults();
|
|
194
|
-
const price = await PriceRegistry.getInstance().getPrice('robinhood_order');
|
|
195
|
-
if (!price) {
|
|
196
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable' }) }], isError: true };
|
|
197
|
-
}
|
|
198
|
-
let payment;
|
|
199
|
-
try {
|
|
200
|
-
payment = await executeX402Payment({ price, currency: 'USDC', toolName: 'robinhood_order', walletAddress: args.wallet_address });
|
|
201
|
-
} catch (err) {
|
|
202
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
|
|
203
|
-
}
|
|
204
|
-
try {
|
|
205
|
-
const result = await RobinhoodAPI.order({
|
|
206
|
-
symbol: args.symbol,
|
|
207
|
-
side: args.side,
|
|
208
|
-
quantity: args.quantity,
|
|
209
|
-
type: args.type,
|
|
210
|
-
time_in_force: args.time_in_force,
|
|
211
|
-
price: args.price,
|
|
212
|
-
});
|
|
213
|
-
audit.info('robinhood_order_success', { symbol: args.symbol, side: args.side, quantity: args.quantity });
|
|
214
|
-
return {
|
|
215
|
-
content: [{
|
|
216
|
-
type: 'text',
|
|
217
|
-
text: JSON.stringify({
|
|
218
|
-
...(result as object),
|
|
219
|
-
_meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain, amount_paid: `${payment.amountPaid} ${payment.currency}` },
|
|
220
|
-
}),
|
|
221
|
-
}],
|
|
222
|
-
};
|
|
223
|
-
} catch (err) {
|
|
224
|
-
audit.warn('robinhood_order_fail', { error: String(err) });
|
|
225
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
|
|
226
|
-
}
|
|
227
|
-
},
|
|
228
|
-
);
|
|
229
|
-
|
|
230
|
-
// ── robinhood_portfolio — FREE ───────────────────────────────────────────
|
|
231
|
-
server.tool(
|
|
232
|
-
'robinhood_portfolio',
|
|
233
|
-
{},
|
|
234
|
-
async () => {
|
|
235
|
-
if (!RateLimiter.getInstance().checkTool('robinhood_portfolio')) {
|
|
236
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded' }) }], isError: true };
|
|
237
|
-
}
|
|
238
|
-
try {
|
|
239
|
-
const [portfolio, positions, orders] = await Promise.all([
|
|
240
|
-
RobinhoodAPI.portfolio(),
|
|
241
|
-
RobinhoodAPI.positions(),
|
|
242
|
-
RobinhoodAPI.orderHistory(),
|
|
243
|
-
]);
|
|
244
|
-
return { content: [{ type: 'text', text: JSON.stringify({ portfolio, positions, recent_orders: orders }) }] };
|
|
245
|
-
} catch (err) {
|
|
246
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: String(err) }) }], isError: true };
|
|
247
|
-
}
|
|
248
|
-
},
|
|
249
|
-
);
|
|
250
|
-
}
|
|
@@ -1,104 +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 { CopyTraderAPI } from '../../lib/sml-api/copytrader.js';
|
|
9
|
-
|
|
10
|
-
const SubscribeSchema = z.object({
|
|
11
|
-
whale_address: z.string().min(10),
|
|
12
|
-
subscriber_address: z.string().min(10),
|
|
13
|
-
max_copy_amount_xrp: z.number().positive(),
|
|
14
|
-
wallet_address: z.string().optional(),
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
export function registerCopyTrader(server: McpServer): void {
|
|
18
|
-
const audit = AuditLogger.getInstance();
|
|
19
|
-
|
|
20
|
-
// ── FREE: copytrader_status ────────────────────────────────────────────────
|
|
21
|
-
server.tool(
|
|
22
|
-
'copytrader_status',
|
|
23
|
-
{},
|
|
24
|
-
async () => {
|
|
25
|
-
try {
|
|
26
|
-
const data = await CopyTraderAPI.status();
|
|
27
|
-
return { content: [{ type: 'text', text: JSON.stringify(data) }] };
|
|
28
|
-
} catch (err) {
|
|
29
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
|
|
30
|
-
}
|
|
31
|
-
},
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
// ── FREE: copytrader_whales ────────────────────────────────────────────────
|
|
35
|
-
server.tool(
|
|
36
|
-
'copytrader_whales',
|
|
37
|
-
{},
|
|
38
|
-
async () => {
|
|
39
|
-
if (!RateLimiter.getInstance().checkTool('copytrader_whales')) {
|
|
40
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
|
|
41
|
-
}
|
|
42
|
-
try {
|
|
43
|
-
const data = await CopyTraderAPI.whales();
|
|
44
|
-
audit.info('copytrader_whales', {});
|
|
45
|
-
return { content: [{ type: 'text', text: JSON.stringify(data) }] };
|
|
46
|
-
} catch (err) {
|
|
47
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
// ── PAID: copytrader_subscribe (0.05 USDC) ────────────────────────────────
|
|
53
|
-
server.tool(
|
|
54
|
-
'copytrader_subscribe',
|
|
55
|
-
{
|
|
56
|
-
whale_address: z.string().describe('XRPL address of the whale to copy.'),
|
|
57
|
-
subscriber_address: z.string().describe('Your XRPL address that will mirror trades.'),
|
|
58
|
-
max_copy_amount_xrp: z.number().describe('Maximum XRP to allocate per copied trade.'),
|
|
59
|
-
wallet_address: z.string().describe('Agent wallet for x402 payment.'),
|
|
60
|
-
},
|
|
61
|
-
async (rawArgs) => {
|
|
62
|
-
const args = Sandbox.validate(SubscribeSchema, rawArgs);
|
|
63
|
-
|
|
64
|
-
if (!RateLimiter.getInstance().checkTool('copytrader_subscribe')) {
|
|
65
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded', retry_after: 60 }) }], isError: true };
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
await PriceRegistry.getInstance().seedDefaults();
|
|
69
|
-
const price = await PriceRegistry.getInstance().getPrice('copytrader_subscribe');
|
|
70
|
-
if (!price) {
|
|
71
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable' }) }], isError: true };
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
let payment;
|
|
75
|
-
try {
|
|
76
|
-
payment = await executeX402Payment({ price, currency: 'USDC', toolName: 'copytrader_subscribe', walletAddress: args.wallet_address });
|
|
77
|
-
} catch (err) {
|
|
78
|
-
audit.warn('copytrader_subscribe_payment_fail', { error: String(err) });
|
|
79
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
try {
|
|
83
|
-
const data = await CopyTraderAPI.subscribe({
|
|
84
|
-
whaleAddress: args.whale_address,
|
|
85
|
-
subscriberAddress: args.subscriber_address,
|
|
86
|
-
maxCopyAmountXrp: args.max_copy_amount_xrp,
|
|
87
|
-
});
|
|
88
|
-
audit.info('copytrader_subscribe_success', { receiptId: payment.receiptId });
|
|
89
|
-
return {
|
|
90
|
-
content: [{
|
|
91
|
-
type: 'text',
|
|
92
|
-
text: JSON.stringify({
|
|
93
|
-
data,
|
|
94
|
-
_meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain, amount_paid: `${payment.amountPaid} ${payment.currency}`, timestamp: payment.timestamp },
|
|
95
|
-
}),
|
|
96
|
-
}],
|
|
97
|
-
};
|
|
98
|
-
} catch (err) {
|
|
99
|
-
audit.error('copytrader_subscribe_api_fail', { error: String(err) });
|
|
100
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'api_error', message: String(err) }) }], isError: true };
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
);
|
|
104
|
-
}
|
|
@@ -1,70 +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 { CrawlClient } from '../../lib/sml-api/crawl.js';
|
|
8
|
-
import { PriceRegistry } from '../registry/pricing.js';
|
|
9
|
-
|
|
10
|
-
const InputSchema = z.object({
|
|
11
|
-
url: z.string().url(),
|
|
12
|
-
extract: z.enum(['text', 'links', 'tables', 'structured', 'all']).default('text'),
|
|
13
|
-
wallet_address: z.string().optional(),
|
|
14
|
-
user_agent: z.string().optional(),
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
export function registerCrawl(server: McpServer): void {
|
|
18
|
-
server.tool(
|
|
19
|
-
'crawl_paid_fetch',
|
|
20
|
-
{
|
|
21
|
-
url: z.string().describe('URL to fetch and parse. Must be http or https.'),
|
|
22
|
-
extract: z.enum(['text', 'links', 'tables', 'structured', 'all']).describe('What to extract. Default: text.'),
|
|
23
|
-
wallet_address: z.string().describe('Agent wallet for payment. Humans bypass automatically.'),
|
|
24
|
-
user_agent: z.string().describe('Custom user-agent string.'),
|
|
25
|
-
},
|
|
26
|
-
async (rawArgs) => {
|
|
27
|
-
const args = Sandbox.validate(InputSchema, rawArgs);
|
|
28
|
-
const audit = AuditLogger.getInstance();
|
|
29
|
-
|
|
30
|
-
// Validate URL safety
|
|
31
|
-
Sandbox.validateUrl(args.url);
|
|
32
|
-
|
|
33
|
-
if (!RateLimiter.getInstance().checkTool('crawl_paid_fetch')) {
|
|
34
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'rate_limit_exceeded' }) }], isError: true };
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
await PriceRegistry.getInstance().seedDefaults();
|
|
38
|
-
const price = await PriceRegistry.getInstance().getPrice('crawl_paid_fetch');
|
|
39
|
-
if (!price) {
|
|
40
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'price_unavailable' }) }], isError: true };
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
let payment;
|
|
44
|
-
try {
|
|
45
|
-
payment = await executeX402Payment({
|
|
46
|
-
price,
|
|
47
|
-
currency: 'USDC',
|
|
48
|
-
toolName: 'crawl_paid_fetch',
|
|
49
|
-
walletAddress: args.wallet_address,
|
|
50
|
-
});
|
|
51
|
-
} catch (err) {
|
|
52
|
-
return { content: [{ type: 'text', text: JSON.stringify({ error: 'payment_failed', message: String(err) }) }], isError: true };
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const client = CrawlClient.getInstance();
|
|
56
|
-
const data = await client.fetch({ url: args.url, extract: args.extract ?? 'text', userAgent: args.user_agent });
|
|
57
|
-
|
|
58
|
-
// Sanitize response to prevent prompt injection
|
|
59
|
-
const safeContent = typeof data.content === 'string'
|
|
60
|
-
? Sandbox.sanitizeApiResponse(data.content)
|
|
61
|
-
: data.content;
|
|
62
|
-
|
|
63
|
-
audit.info('crawl_success', { receiptId: payment.receiptId });
|
|
64
|
-
|
|
65
|
-
return {
|
|
66
|
-
content: [{ type: 'text', text: JSON.stringify({ data: { ...data, content: safeContent }, _meta: { receipt_id: payment.receiptId, tx_hash: payment.txHash, chain: payment.chain, amount_paid: `${payment.amountPaid} ${payment.currency}` } }) }],
|
|
67
|
-
};
|
|
68
|
-
},
|
|
69
|
-
);
|
|
70
|
-
}
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { AuditLogger } from '../security/audit.js';
|
|
3
|
-
|
|
4
|
-
const CATALOG = {
|
|
5
|
-
version: '2.0.0',
|
|
6
|
-
description: 'ScriptMasterLabs unified MCP gateway — the Amazon for agentic payrails. One endpoint, every SML product, autonomous x402 payments.',
|
|
7
|
-
quickstart: 'Call sml_discover first (free). Call sml_status to check backend health. Then call any tool — free tools need no payment, paid tools auto-collect via x402.',
|
|
8
|
-
payment: {
|
|
9
|
-
protocol: 'x402',
|
|
10
|
-
chains: ['base (USDC — preferred, <3s)', 'xrpl (RLUSD)', 'solana (USDC — fallback)'],
|
|
11
|
-
daily_cap_usd: 50,
|
|
12
|
-
auto_approve_under_usd: 1.00,
|
|
13
|
-
min_credit_score: 300,
|
|
14
|
-
credit_bureau: 'https://four02proof.onrender.com/v1/score',
|
|
15
|
-
price_cache_seconds: 60,
|
|
16
|
-
},
|
|
17
|
-
products: [
|
|
18
|
-
{
|
|
19
|
-
product: 'SqueezeOS',
|
|
20
|
-
description: 'Institutional-grade equity intelligence — squeeze scanner, options flow, multi-engine AI council verdicts',
|
|
21
|
-
backend: 'https://squeezeos-api.onrender.com',
|
|
22
|
-
tools: [
|
|
23
|
-
{ name: 'squeezeos_preview', type: 'FREE', description: 'Signal bias preview for any ticker (15-min cache)' },
|
|
24
|
-
{ name: 'squeezeos_history', type: 'FREE', description: 'Recent signal history — up to 200 events per symbol' },
|
|
25
|
-
{ name: 'squeezeos_oracle', type: 'FREE', description: 'Oracle directive — aggregated signal across all engines' },
|
|
26
|
-
{ name: 'squeezeos_ftd', type: 'FREE', description: 'SEC FTD (Failure to Deliver) registry for threshold securities' },
|
|
27
|
-
{ name: 'squeezeos_status', type: 'FREE', description: 'SqueezeOS system health and uptime' },
|
|
28
|
-
{ name: 'squeezeos_demo', type: 'FREE', description: 'Free IWM council verdict sample (5-min cache)' },
|
|
29
|
-
{ name: 'squeezeos_marketplace_browse', type: 'FREE', description: 'Browse peer signal marketplace — listings and metadata' },
|
|
30
|
-
{ name: 'squeezeos_futures_leaderboard',type: 'FREE', description: 'Top signal prediction market performers' },
|
|
31
|
-
{ name: 'squeezeos_council', type: 'PAID', price_usdc: '0.10', description: 'Multi-engine AI council verdict for any symbol — highest confidence signal' },
|
|
32
|
-
{ name: 'squeezeos_scan', type: 'PAID', price_usdc: '0.05', description: 'Full $1–$50 squeeze candidate scanner — ranked by squeeze score' },
|
|
33
|
-
{ name: 'squeezeos_options', type: 'PAID', price_usdc: '0.05', description: 'Institutional options flow analysis — dark pool, sweep detection' },
|
|
34
|
-
{ name: 'squeezeos_iwm', type: 'PAID', price_usdc: '0.03', description: 'IWM 0DTE contract scorer — real-time Greeks and probability' },
|
|
35
|
-
{ name: 'squeezeos_marketplace_read', type: 'PAID', price_usdc: '0.02', description: 'Full signal thesis from peer marketplace — complete analysis' },
|
|
36
|
-
],
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
product: 'Ghost Layer',
|
|
40
|
-
description: 'Ephemeral dual-chain XRPL+Base toll routing gateway for autonomous agents',
|
|
41
|
-
backend: 'https://ghost-layer.onrender.com',
|
|
42
|
-
tools: [
|
|
43
|
-
{ name: 'ghost_status', type: 'FREE', description: 'Ghost Layer service health and active routes' },
|
|
44
|
-
{ name: 'ghost_route', type: 'PAID', price_usdc: '0.01', description: 'Route transaction through dual-chain XRPL+Base gateway with toll collection' },
|
|
45
|
-
],
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
product: '402Proof',
|
|
49
|
-
description: 'x402 payment firewall — invoice gen, XRPL tx verification, Agent Credit Bureau (score 300–850)',
|
|
50
|
-
backend: 'https://four02proof.onrender.com',
|
|
51
|
-
tools: [
|
|
52
|
-
{ name: 'proof_invoice', type: 'FREE', description: 'Generate x402 payment invoice for any SML endpoint — returns amount, chain, wallet' },
|
|
53
|
-
{ name: 'proof_verify', type: 'FREE', description: 'Verify XRPL or Base payment tx_hash — returns receipt and confirmation' },
|
|
54
|
-
{ name: 'proof_credit_score', type: 'FREE', description: 'Get agent credit score (300–850) and payment history by wallet address' },
|
|
55
|
-
],
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
product: 'RLUSD Rails',
|
|
59
|
-
description: 'RLUSD/XRP remittance rails on XRPL and Xahau networks',
|
|
60
|
-
backend: 'https://sml-rails.onrender.com',
|
|
61
|
-
tools: [
|
|
62
|
-
{ name: 'rails_status', type: 'FREE', description: 'RLUSD Rails service health and network status' },
|
|
63
|
-
{ name: 'rails_transfer', type: 'PAID', price_usdc: '0.01', description: 'Initiate RLUSD or XRP transfer via SML Rails — returns tx_hash' },
|
|
64
|
-
],
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
product: 'XRPL Copy-Trader',
|
|
68
|
-
description: 'Copy institutional whale positions on the XRP Ledger autonomously',
|
|
69
|
-
backend: 'https://sml-copytrader.onrender.com',
|
|
70
|
-
tools: [
|
|
71
|
-
{ name: 'copytrader_status', type: 'FREE', description: 'Copy-Trader service health and active subscriptions count' },
|
|
72
|
-
{ name: 'copytrader_whales', type: 'FREE', description: 'List tracked whale wallets, their recent moves, and performance metrics' },
|
|
73
|
-
{ name: 'copytrader_subscribe', type: 'PAID', price_usdc: '0.05', description: 'Subscribe to mirror a whale wallet — auto-copies all future positions' },
|
|
74
|
-
],
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
product: 'Memecoin Launchpad',
|
|
78
|
-
description: 'XRPL memecoin bonding curve launchpad — create and trade tokens',
|
|
79
|
-
backend: 'https://sml-launchpad.onrender.com',
|
|
80
|
-
tools: [
|
|
81
|
-
{ name: 'launchpad_status', type: 'FREE', description: 'Launchpad service health and total tokens launched' },
|
|
82
|
-
{ name: 'launchpad_list', type: 'FREE', description: 'Browse live memecoins on bonding curve — price, volume, holders' },
|
|
83
|
-
{ name: 'launchpad_create', type: 'PAID', price_usdc: '0.10', description: 'Create new memecoin with bonding curve — supply, price curve, metadata' },
|
|
84
|
-
{ name: 'launchpad_buy', type: 'PAID', price_usdc: '0.01', description: 'Buy tokens on memecoin bonding curve — returns executed price and tx' },
|
|
85
|
-
],
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
product: 'Shadow Desk',
|
|
89
|
-
description: 'MCP signal intelligence server with alpha-provider billing',
|
|
90
|
-
backend: 'https://shadow-desk.onrender.com',
|
|
91
|
-
tools: [
|
|
92
|
-
{ name: 'shadow_query', type: 'PAID', price_usdc: '0.02', description: 'Query signal intelligence from Shadow Desk alpha feed' },
|
|
93
|
-
{ name: 'shadow_ingest', type: 'PAID', price_usdc: '0.01', description: 'Ingest alpha signal data into Shadow Desk for distribution' },
|
|
94
|
-
],
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
product: 'Forge Gateway',
|
|
98
|
-
description: 'x402 payment protocol + BYOK LLM proxy — pay per token, any model',
|
|
99
|
-
backend: 'https://forge-gateway-a822.onrender.com',
|
|
100
|
-
tools: [
|
|
101
|
-
{ name: 'forge_status', type: 'FREE', description: 'Forge Gateway health and supported models' },
|
|
102
|
-
{ name: 'forge_llm', type: 'PAID', price_usdc: '0.02', description: 'BYOK LLM proxy — call any AI model, pay per request via x402' },
|
|
103
|
-
],
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
product: 'agentcard',
|
|
107
|
-
description: 'Ed25519 A2A agent identity cards — mint, lookup, verify agent signatures',
|
|
108
|
-
backend: 'configurable via AGENTCARD_URL env var',
|
|
109
|
-
tools: [
|
|
110
|
-
{ name: 'agentcard_lookup', type: 'FREE', description: 'Lookup agent identity card by wallet address or DID' },
|
|
111
|
-
{ name: 'agentcard_verify', type: 'FREE', description: 'Verify Ed25519 agent signature against their identity card' },
|
|
112
|
-
{ name: 'agentcard_mint', type: 'PAID', price_usdc: '0.01', description: 'Create new Ed25519 agent identity card — returns card JSON and DID' },
|
|
113
|
-
],
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
product: 'echo-forge',
|
|
117
|
-
description: 'Historical equity pattern similarity engine — ML cosine similarity on Polygon.io data',
|
|
118
|
-
backend: 'coming_soon',
|
|
119
|
-
tools: [
|
|
120
|
-
{ name: 'echo_pattern_match', type: 'PAID', price_usdc: '0.05', status: 'coming_soon', description: '[COMING SOON] Find historical equity patterns similar to current price action' },
|
|
121
|
-
],
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
product: 'Core SML Intelligence',
|
|
125
|
-
description: 'Original 6 SML tools — squeeze signals, EDGAR parsing, earnings oracle, FTD data, agent hiring, web scraping',
|
|
126
|
-
tools: [
|
|
127
|
-
{ name: 'leviathan_signal', type: 'PAID', price_usdc: '0.05', description: 'Institutional squeeze signals — proprietary multi-engine verdict for any ticker' },
|
|
128
|
-
{ name: 'xmit_edgar_decode', type: 'PAID', price_usdc: '0.02', description: 'Parse SEC DEF 14A / 13F / 13D filings — raw text never leaves SML servers' },
|
|
129
|
-
{ name: 'xdeo_earnings_estimate',type:'PAID', price_usdc: '0.02', description: 'Decentralized earnings oracle — consensus estimate across data sources' },
|
|
130
|
-
{ name: 'ftd_threshold_scan', type: 'FREE|PAID', price_usdc: '0.05', description: 'SEC Reg SHO FTD data — threshold alerts free, full scanner $0.05' },
|
|
131
|
-
{ name: 'nexus_agent_hire', type: 'FREE|PAID', price_usdc: '5% commission', description: 'Agent job marketplace — browse free, hire charges 5% of contract value' },
|
|
132
|
-
{ name: 'crawl_paid_fetch', type: 'PAID', price_usdc: '0.005', description: 'Pay-per-fetch web scraping — humans bypass free, AI agents pay $0.005/fetch' },
|
|
133
|
-
],
|
|
134
|
-
},
|
|
135
|
-
],
|
|
136
|
-
stats: {
|
|
137
|
-
total_tools: 43,
|
|
138
|
-
free_tools: 22,
|
|
139
|
-
paid_tools: 21,
|
|
140
|
-
products: 11,
|
|
141
|
-
chains_supported: 3,
|
|
142
|
-
},
|
|
143
|
-
};
|
|
144
|
-
|
|
145
|
-
const BACKENDS = [
|
|
146
|
-
{ name: 'SqueezeOS', url: 'https://squeezeos-api.onrender.com/api/status' },
|
|
147
|
-
{ name: 'Ghost Layer', url: 'https://ghost-layer.onrender.com/api/status' },
|
|
148
|
-
{ name: '402Proof', url: 'https://four02proof.onrender.com/health' },
|
|
149
|
-
{ name: 'RLUSD Rails', url: 'https://sml-rails.onrender.com/health' },
|
|
150
|
-
{ name: 'Copy-Trader', url: 'https://sml-copytrader.onrender.com/health' },
|
|
151
|
-
{ name: 'Launchpad', url: 'https://sml-launchpad.onrender.com/health' },
|
|
152
|
-
{ name: 'Shadow Desk', url: 'https://shadow-desk.onrender.com/health' },
|
|
153
|
-
{ name: 'Forge Gateway', url: 'https://forge-gateway-a822.onrender.com/health' },
|
|
154
|
-
];
|
|
155
|
-
|
|
156
|
-
export function registerDiscovery(server: McpServer): void {
|
|
157
|
-
server.tool(
|
|
158
|
-
'sml_discover',
|
|
159
|
-
'Returns the complete ScriptMasterLabs product catalog — all 43 tools, prices, and payment instructions. Call this first. FREE.',
|
|
160
|
-
{},
|
|
161
|
-
async () => {
|
|
162
|
-
AuditLogger.getInstance().info('sml_discover', {});
|
|
163
|
-
return { content: [{ type: 'text' as const, text: JSON.stringify(CATALOG, null, 2) }] };
|
|
164
|
-
},
|
|
165
|
-
);
|
|
166
|
-
|
|
167
|
-
server.tool(
|
|
168
|
-
'sml_status',
|
|
169
|
-
'Real-time health check of all 8 SML backends simultaneously. Call before making paid requests to avoid wasted payments. FREE.',
|
|
170
|
-
{},
|
|
171
|
-
async () => {
|
|
172
|
-
AuditLogger.getInstance().info('sml_status', {});
|
|
173
|
-
const results = await Promise.allSettled(
|
|
174
|
-
BACKENDS.map(async (b) => {
|
|
175
|
-
const start = Date.now();
|
|
176
|
-
try {
|
|
177
|
-
const res = await fetch(b.url, { signal: AbortSignal.timeout(5000) });
|
|
178
|
-
return { name: b.name, status: res.ok ? 'online' : 'degraded', http: res.status, latency_ms: Date.now() - start };
|
|
179
|
-
} catch (err) {
|
|
180
|
-
return { name: b.name, status: 'offline', error: String(err), latency_ms: Date.now() - start };
|
|
181
|
-
}
|
|
182
|
-
}),
|
|
183
|
-
);
|
|
184
|
-
const statuses = results.map((r) =>
|
|
185
|
-
r.status === 'fulfilled' ? r.value : { name: 'unknown', status: 'error' },
|
|
186
|
-
);
|
|
187
|
-
const online = statuses.filter((s) => s.status === 'online').length;
|
|
188
|
-
return {
|
|
189
|
-
content: [{
|
|
190
|
-
type: 'text' as const,
|
|
191
|
-
text: JSON.stringify({
|
|
192
|
-
summary: `${online}/${BACKENDS.length} backends online`,
|
|
193
|
-
all_systems_go: online === BACKENDS.length,
|
|
194
|
-
backends: statuses,
|
|
195
|
-
checked_at: new Date().toISOString(),
|
|
196
|
-
tip: online < BACKENDS.length ? 'Some backends are offline. Avoid paid calls to those products.' : 'All systems operational. Safe to make paid calls.',
|
|
197
|
-
}, null, 2),
|
|
198
|
-
}],
|
|
199
|
-
};
|
|
200
|
-
},
|
|
201
|
-
);
|
|
202
|
-
}
|