@apitoll/mcp-server 0.1.0-beta.4

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.
@@ -0,0 +1,72 @@
1
+ import { PaidMCPServer } from './server';
2
+ /**
3
+ * Create an Express router for the MCP server
4
+ * Handles both JSON-RPC and REST-style requests
5
+ */
6
+ export declare function toExpressRouter(server: PaidMCPServer): (req: {
7
+ path: string;
8
+ method: string;
9
+ headers: Record<string, string | undefined>;
10
+ body?: {
11
+ method?: string;
12
+ params?: {
13
+ name?: string;
14
+ arguments?: Record<string, unknown>;
15
+ };
16
+ name?: string;
17
+ arguments?: Record<string, unknown>;
18
+ };
19
+ }, res: {
20
+ json: (data: unknown) => void;
21
+ status: (code: number) => {
22
+ json: (data: unknown) => void;
23
+ };
24
+ setHeader: (name: string, value: string) => void;
25
+ }, next: () => void) => Promise<void>;
26
+ /**
27
+ * Create Hono routes for the MCP server
28
+ */
29
+ export declare function toHonoApp(server: PaidMCPServer): {
30
+ listTools: () => {
31
+ tools: {
32
+ 'x-402'?: {
33
+ price: number;
34
+ currency: string;
35
+ chains: ("base" | "solana")[];
36
+ payTo: string;
37
+ } | undefined;
38
+ name: string;
39
+ description: string;
40
+ inputSchema: object;
41
+ }[];
42
+ };
43
+ callTool: (toolName: string, args: Record<string, unknown>, paymentHeader?: string) => Promise<import("./types").MCPToolResponse>;
44
+ getPaymentInfo: (toolName: string) => {
45
+ price: number;
46
+ currency: string;
47
+ chains: ("base" | "solana")[];
48
+ payTo: string;
49
+ requirements: import("./types").PaymentRequirement[];
50
+ } | null;
51
+ handleRpc: (method: string, params: {
52
+ name?: string;
53
+ arguments?: Record<string, unknown>;
54
+ }, paymentHeader?: string) => Promise<import("./types").MCPToolResponse | {
55
+ tools: {
56
+ 'x-402'?: {
57
+ price: number;
58
+ currency: string;
59
+ chains: ("base" | "solana")[];
60
+ payTo: string;
61
+ } | undefined;
62
+ name: string;
63
+ description: string;
64
+ inputSchema: object;
65
+ }[];
66
+ }>;
67
+ };
68
+ /**
69
+ * Run the MCP server over stdio (for Claude Desktop integration)
70
+ */
71
+ export declare function runStdio(server: PaidMCPServer): void;
72
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAIxC;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,IAErC,KAAK;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CAAE,EAAE,KAAK;IAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,CAAC;IAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,EAAE,MAAM,MAAM,IAAI,mBAuF3Z;AAID;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa;;;;;;;;;;;;;;yBAU/B,MAAM,QACV,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,kBACb,MAAM;+BAMG,MAAM;;;;;;;wBAMvB,MAAM,UACN;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,kBAC9C,MAAM;;;;;;;;;;;;;EAiB3B;AAID;;GAEG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,aAAa,QAqD7C"}
@@ -0,0 +1,151 @@
1
+ // Express Adapter
2
+ /**
3
+ * Create an Express router for the MCP server
4
+ * Handles both JSON-RPC and REST-style requests
5
+ */
6
+ export function toExpressRouter(server) {
7
+ // Return a middleware function that handles MCP requests
8
+ return async (req, res, next) => {
9
+ const path = req.path;
10
+ // Handle tools/list
11
+ if (path === '/tools' && req.method === 'GET') {
12
+ return res.json({ tools: server.getToolDefinitions() });
13
+ }
14
+ // Handle tool call (REST style)
15
+ if (path.startsWith('/tools/') && req.method === 'POST') {
16
+ const toolName = path.replace('/tools/', '');
17
+ const paymentHeader = req.headers['x-payment'];
18
+ const result = await server.handleToolCall(toolName, req.body || {}, paymentHeader);
19
+ // Check if payment is required
20
+ if (result._meta?.paymentRequired) {
21
+ res.setHeader('X-Payment-Required', JSON.stringify(result._meta.paymentRequired));
22
+ return res.status(402).json(result);
23
+ }
24
+ return res.json(result);
25
+ }
26
+ // Handle JSON-RPC style
27
+ if (path === '/rpc' && req.method === 'POST') {
28
+ const method = req.body?.method;
29
+ const params = req.body?.params;
30
+ if (method === 'tools/list') {
31
+ return res.json({
32
+ jsonrpc: '2.0',
33
+ result: { tools: server.getToolDefinitions() },
34
+ });
35
+ }
36
+ if (method === 'tools/call' && params?.name) {
37
+ const paymentHeader = req.headers['x-payment'];
38
+ const result = await server.handleToolCall(params.name, params.arguments || {}, paymentHeader);
39
+ if (result._meta?.paymentRequired) {
40
+ res.setHeader('X-Payment-Required', JSON.stringify(result._meta.paymentRequired));
41
+ return res.status(402).json({
42
+ jsonrpc: '2.0',
43
+ error: {
44
+ code: 402,
45
+ message: 'Payment required',
46
+ data: result._meta.paymentRequired,
47
+ },
48
+ });
49
+ }
50
+ return res.json({
51
+ jsonrpc: '2.0',
52
+ result,
53
+ });
54
+ }
55
+ }
56
+ // Handle tool payment info
57
+ if (path.startsWith('/tools/') && path.endsWith('/payment') && req.method === 'GET') {
58
+ const toolName = path.replace('/tools/', '').replace('/payment', '');
59
+ const paymentInfo = server.getToolPaymentInfo(toolName);
60
+ if (!paymentInfo) {
61
+ return res.status(404).json({ error: 'Tool not found or is free' });
62
+ }
63
+ return res.json(paymentInfo);
64
+ }
65
+ next();
66
+ };
67
+ }
68
+ // Hono Adapter
69
+ /**
70
+ * Create Hono routes for the MCP server
71
+ */
72
+ export function toHonoApp(server) {
73
+ // Return an object with route handlers
74
+ return {
75
+ // GET /tools - List all tools
76
+ listTools: () => {
77
+ return { tools: server.getToolDefinitions() };
78
+ },
79
+ // POST /tools/:name - Call a tool
80
+ callTool: async (toolName, args, paymentHeader) => {
81
+ return server.handleToolCall(toolName, args, paymentHeader);
82
+ },
83
+ // GET /tools/:name/payment - Get payment info
84
+ getPaymentInfo: (toolName) => {
85
+ return server.getToolPaymentInfo(toolName);
86
+ },
87
+ // POST /rpc - JSON-RPC endpoint
88
+ handleRpc: async (method, params, paymentHeader) => {
89
+ if (method === 'tools/list') {
90
+ return { tools: server.getToolDefinitions() };
91
+ }
92
+ if (method === 'tools/call' && params.name) {
93
+ return server.handleToolCall(params.name, params.arguments || {}, paymentHeader);
94
+ }
95
+ throw new Error(`Unknown method: ${method}`);
96
+ },
97
+ };
98
+ }
99
+ // Stdio Adapter (for Claude Desktop)
100
+ /**
101
+ * Run the MCP server over stdio (for Claude Desktop integration)
102
+ */
103
+ export function runStdio(server) {
104
+ const readline = require('readline');
105
+ const rl = readline.createInterface({
106
+ input: process.stdin,
107
+ output: process.stdout,
108
+ terminal: false,
109
+ });
110
+ rl.on('line', async (line) => {
111
+ try {
112
+ const request = JSON.parse(line);
113
+ const { id, method, params } = request;
114
+ let result;
115
+ if (method === 'initialize') {
116
+ result = {
117
+ protocolVersion: '2024-11-05',
118
+ capabilities: { tools: {} },
119
+ serverInfo: { name: 'apitoll-mcp', version: '0.1.0' },
120
+ };
121
+ }
122
+ else if (method === 'tools/list') {
123
+ result = { tools: server.getToolDefinitions() };
124
+ }
125
+ else if (method === 'tools/call') {
126
+ // For stdio, payment header comes in params._payment
127
+ const paymentHeader = params._payment;
128
+ delete params._payment;
129
+ result = await server.handleToolCall(params.name, params.arguments || {}, paymentHeader);
130
+ }
131
+ else {
132
+ result = { error: `Unknown method: ${method}` };
133
+ }
134
+ const response = JSON.stringify({ jsonrpc: '2.0', id, result });
135
+ process.stdout.write(response + '\n');
136
+ }
137
+ catch (error) {
138
+ const errorResponse = JSON.stringify({
139
+ jsonrpc: '2.0',
140
+ error: {
141
+ code: -32700,
142
+ message: error instanceof Error ? error.message : 'Parse error',
143
+ },
144
+ });
145
+ process.stdout.write(errorResponse + '\n');
146
+ }
147
+ });
148
+ // Log to stderr so it doesn't interfere with stdio protocol
149
+ console.error('MCP server running on stdio');
150
+ }
151
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { PaidMCPServer, createPaidMCPServer } from './server';
2
+ export type { PaidMCPServerConfig, ToolDefinition, PaidToolConfig, PaymentRequirement, MCPToolRequest, MCPToolResponse, SupportedChain, } from './types';
3
+ export { buildPaymentRequirements, verifyPayment, createPaymentRequiredResponse, } from './payment';
4
+ export { toExpressRouter, toHonoApp, runStdio } from './adapters';
5
+ export { CHAIN_CONFIG } from './types';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAG7D,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,SAAS,CAAA;AAGhB,OAAO,EACL,wBAAwB,EACxB,aAAa,EACb,6BAA6B,GAC9B,MAAM,WAAW,CAAA;AAGlB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAGjE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ // Core server
2
+ export { PaidMCPServer, createPaidMCPServer } from './server';
3
+ // Payment utilities
4
+ export { buildPaymentRequirements, verifyPayment, createPaymentRequiredResponse, } from './payment';
5
+ // Framework adapters
6
+ export { toExpressRouter, toHonoApp, runStdio } from './adapters';
7
+ // Chain constants
8
+ export { CHAIN_CONFIG } from './types';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAa7D,oBAAoB;AACpB,OAAO,EACL,wBAAwB,EACxB,aAAa,EACb,6BAA6B,GAC9B,MAAM,WAAW,CAAA;AAElB,qBAAqB;AACrB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAEjE,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { PaymentRequirement, VerificationResult, PaidToolConfig, SupportedChain } from './types';
2
+ export declare function buildPaymentRequirements(toolName: string, config: PaidToolConfig, walletAddress: string, chains?: SupportedChain[]): PaymentRequirement[];
3
+ export declare function verifyPayment(paymentHeader: string, requirements: PaymentRequirement[], facilitatorUrl?: string): Promise<VerificationResult>;
4
+ export declare function createPaymentRequiredResponse(requirements: PaymentRequirement[]): {
5
+ content: Array<{
6
+ type: 'text';
7
+ text: string;
8
+ }>;
9
+ isError: boolean;
10
+ _meta: {
11
+ paymentRequired: PaymentRequirement[];
12
+ };
13
+ };
14
+ export declare function createPaymentReceipt(result: VerificationResult, amount: number, chain: string): {
15
+ txHash: string;
16
+ amount: number;
17
+ chain: string;
18
+ settledAt?: string;
19
+ };
20
+ //# sourceMappingURL=payment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment.d.ts","sourceRoot":"","sources":["../src/payment.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAElB,kBAAkB,EAClB,cAAc,EAEd,cAAc,EACf,MAAM,SAAS,CAAA;AAIhB,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EACtB,aAAa,EAAE,MAAM,EACrB,MAAM,GAAE,cAAc,EAAa,GAClC,kBAAkB,EAAE,CAkBtB;AAID,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,kBAAkB,EAAE,EAClC,cAAc,GAAE,MAAuC,GACtD,OAAO,CAAC,kBAAkB,CAAC,CAyC7B;AAoBD,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,kBAAkB,EAAE,GACjC;IACD,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9C,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE;QAAE,eAAe,EAAE,kBAAkB,EAAE,CAAA;KAAE,CAAA;CACjD,CAaA;AAID,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAOvE"}
@@ -0,0 +1,98 @@
1
+ import { CHAIN_CONFIG, } from './types';
2
+ // Payment Requirement Builder
3
+ export function buildPaymentRequirements(toolName, config, walletAddress, chains = ['base']) {
4
+ // Convert USD to USDC smallest unit (6 decimals)
5
+ const amountInSmallestUnit = Math.round(config.price * 1_000_000).toString();
6
+ return chains.map((chain) => {
7
+ const chainConfig = CHAIN_CONFIG[chain];
8
+ return {
9
+ scheme: 'exact',
10
+ network: chainConfig.network,
11
+ maxAmountRequired: amountInSmallestUnit,
12
+ resource: `mcp://tool/${toolName}`,
13
+ description: config.description || `Payment for ${toolName} tool`,
14
+ mimeType: 'application/json',
15
+ payTo: walletAddress,
16
+ maxTimeoutSeconds: 60,
17
+ asset: chainConfig.asset,
18
+ };
19
+ });
20
+ }
21
+ // Payment Verification
22
+ export async function verifyPayment(paymentHeader, requirements, facilitatorUrl = 'https://x402.org/facilitator') {
23
+ try {
24
+ // Parse the X-PAYMENT header
25
+ const payment = parsePaymentHeader(paymentHeader);
26
+ if (!payment) {
27
+ return { valid: false, error: 'Invalid payment header format' };
28
+ }
29
+ // Call facilitator to verify
30
+ const response = await fetch(`${facilitatorUrl}/verify`, {
31
+ method: 'POST',
32
+ headers: { 'Content-Type': 'application/json' },
33
+ body: JSON.stringify({
34
+ payload: payment.payload,
35
+ signature: payment.signature,
36
+ requirements,
37
+ }),
38
+ });
39
+ if (!response.ok) {
40
+ const error = await response.text();
41
+ return { valid: false, error: `Facilitator error: ${error}` };
42
+ }
43
+ const result = await response.json();
44
+ if (result.valid) {
45
+ return {
46
+ valid: true,
47
+ txHash: result.txHash || '',
48
+ settledAt: result.settledAt ? new Date(result.settledAt) : new Date(),
49
+ };
50
+ }
51
+ return { valid: false, error: result.error || 'Payment verification failed' };
52
+ }
53
+ catch (error) {
54
+ return {
55
+ valid: false,
56
+ error: error instanceof Error ? error.message : 'Unknown verification error',
57
+ };
58
+ }
59
+ }
60
+ function parsePaymentHeader(header) {
61
+ try {
62
+ // Header format: base64(JSON({ payload, signature }))
63
+ const decoded = Buffer.from(header, 'base64').toString('utf-8');
64
+ const parsed = JSON.parse(decoded);
65
+ if (parsed.payload && parsed.signature) {
66
+ return parsed;
67
+ }
68
+ return null;
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ // Payment Error Response
75
+ export function createPaymentRequiredResponse(requirements) {
76
+ return {
77
+ content: [
78
+ {
79
+ type: 'text',
80
+ text: `Payment required. Amount: $${(parseInt(requirements[0].maxAmountRequired) / 1_000_000).toFixed(4)} USDC`,
81
+ },
82
+ ],
83
+ isError: true,
84
+ _meta: {
85
+ paymentRequired: requirements,
86
+ },
87
+ };
88
+ }
89
+ // Payment Receipt
90
+ export function createPaymentReceipt(result, amount, chain) {
91
+ return {
92
+ txHash: result.txHash || '',
93
+ amount,
94
+ chain,
95
+ settledAt: result.settledAt?.toISOString(),
96
+ };
97
+ }
98
+ //# sourceMappingURL=payment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment.js","sourceRoot":"","sources":["../src/payment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { z } from 'zod';
2
+ import { PaidMCPServerConfig, PaidToolConfig, MCPToolResponse } from './types';
3
+ export declare class PaidMCPServer {
4
+ private tools;
5
+ private config;
6
+ constructor(config: PaidMCPServerConfig);
7
+ /**
8
+ * Register a free tool (no payment required)
9
+ */
10
+ tool<T extends z.ZodType>(name: string, description: string, inputSchema: T, handler: (input: z.infer<T>) => Promise<string | object>): this;
11
+ /**
12
+ * Register a paid tool
13
+ */
14
+ paidTool<T extends z.ZodType>(name: string, description: string, inputSchema: T, payment: PaidToolConfig, handler: (input: z.infer<T>) => Promise<string | object>): this;
15
+ /**
16
+ * Handle a tool call request
17
+ */
18
+ handleToolCall(toolName: string, args: Record<string, unknown>, paymentHeader?: string): Promise<MCPToolResponse>;
19
+ /**
20
+ * Get all tool definitions for MCP tools/list
21
+ */
22
+ getToolDefinitions(): {
23
+ 'x-402'?: {
24
+ price: number;
25
+ currency: string;
26
+ chains: ("base" | "solana")[];
27
+ payTo: string;
28
+ } | undefined;
29
+ name: string;
30
+ description: string;
31
+ inputSchema: object;
32
+ }[];
33
+ /**
34
+ * Get payment info for a tool
35
+ */
36
+ getToolPaymentInfo(toolName: string): {
37
+ price: number;
38
+ currency: string;
39
+ chains: ("base" | "solana")[];
40
+ payTo: string;
41
+ requirements: import("./types").PaymentRequirement[];
42
+ } | null;
43
+ /**
44
+ * Register all paid tools with the Discovery API
45
+ */
46
+ registerWithDiscovery(baseUrl: string): Promise<void>;
47
+ private zodToJsonSchema;
48
+ private zodTypeToJsonSchema;
49
+ }
50
+ export declare function createPaidMCPServer(config: PaidMCPServerConfig): PaidMCPServer;
51
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EACL,mBAAmB,EAEnB,cAAc,EACd,eAAe,EAEhB,MAAM,SAAS,CAAA;AAUhB,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAiE;IAC9E,OAAO,CAAC,MAAM,CAA+B;gBAEjC,MAAM,EAAE,mBAAmB;IAcvC;;OAEG;IACH,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EACtB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,CAAC,EACd,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,GACvD,IAAI;IAUP;;OAEG;IACH,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAC1B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,CAAC,EACd,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,GACvD,IAAI;IAgBP;;OAEG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,eAAe,CAAC;IA0H3B;;OAEG;IACH,kBAAkB;;;;;;;;;;;IAiBlB;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM;;;;;;;IAoBnC;;OAEG;IACG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C3D,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,mBAAmB;CAe5B;AAID,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAE9E"}
package/dist/server.js ADDED
@@ -0,0 +1,267 @@
1
+ import { z } from 'zod';
2
+ import { buildPaymentRequirements, verifyPayment, createPaymentRequiredResponse, createPaymentReceipt, } from './payment';
3
+ // Paid MCP Server
4
+ export class PaidMCPServer {
5
+ tools = new Map();
6
+ config;
7
+ constructor(config) {
8
+ this.config = {
9
+ walletAddress: config.walletAddress,
10
+ defaultChain: config.defaultChain || 'base',
11
+ facilitatorUrl: config.facilitatorUrl || 'https://x402.org/facilitator',
12
+ discoveryUrl: config.discoveryUrl || '',
13
+ sellerId: config.sellerId || '',
14
+ onPayment: config.onPayment || (() => { }),
15
+ onPaymentError: config.onPaymentError || (() => { }),
16
+ };
17
+ }
18
+ // Tool Registration
19
+ /**
20
+ * Register a free tool (no payment required)
21
+ */
22
+ tool(name, description, inputSchema, handler) {
23
+ this.tools.set(name, {
24
+ name,
25
+ description,
26
+ inputSchema,
27
+ handler,
28
+ });
29
+ return this;
30
+ }
31
+ /**
32
+ * Register a paid tool
33
+ */
34
+ paidTool(name, description, inputSchema, payment, handler) {
35
+ this.tools.set(name, {
36
+ name,
37
+ description,
38
+ inputSchema,
39
+ payment: {
40
+ ...payment,
41
+ chains: payment.chains || [this.config.defaultChain],
42
+ },
43
+ handler,
44
+ });
45
+ return this;
46
+ }
47
+ // Tool Execution
48
+ /**
49
+ * Handle a tool call request
50
+ */
51
+ async handleToolCall(toolName, args, paymentHeader) {
52
+ const tool = this.tools.get(toolName);
53
+ if (!tool) {
54
+ return {
55
+ content: [{ type: 'text', text: `Tool "${toolName}" not found` }],
56
+ isError: true,
57
+ };
58
+ }
59
+ // Validate input
60
+ const parseResult = tool.inputSchema.safeParse(args);
61
+ if (!parseResult.success) {
62
+ return {
63
+ content: [
64
+ {
65
+ type: 'text',
66
+ text: `Invalid input: ${parseResult.error.message}`,
67
+ },
68
+ ],
69
+ isError: true,
70
+ };
71
+ }
72
+ // Check if payment is required
73
+ if (tool.payment) {
74
+ const requirements = buildPaymentRequirements(toolName, tool.payment, this.config.walletAddress, tool.payment.chains);
75
+ // No payment header - return 402 equivalent
76
+ if (!paymentHeader) {
77
+ return createPaymentRequiredResponse(requirements);
78
+ }
79
+ // Verify payment
80
+ const verification = await verifyPayment(paymentHeader, requirements, this.config.facilitatorUrl);
81
+ if (!verification.valid) {
82
+ this.config.onPaymentError(toolName, new Error(verification.error));
83
+ return {
84
+ content: [
85
+ {
86
+ type: 'text',
87
+ text: `Payment failed: ${verification.error}`,
88
+ },
89
+ ],
90
+ isError: true,
91
+ };
92
+ }
93
+ // Payment successful - execute tool
94
+ try {
95
+ const result = await tool.handler(parseResult.data);
96
+ this.config.onPayment(toolName, tool.payment.price, verification.txHash || '');
97
+ return {
98
+ content: [
99
+ {
100
+ type: 'text',
101
+ text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
102
+ },
103
+ ],
104
+ _meta: {
105
+ paymentReceipt: createPaymentReceipt({ ...verification, txHash: verification.txHash || '0x0' }, tool.payment.price, tool.payment.chains?.[0] || this.config.defaultChain),
106
+ },
107
+ };
108
+ }
109
+ catch (error) {
110
+ return {
111
+ content: [
112
+ {
113
+ type: 'text',
114
+ text: `Tool error: ${error instanceof Error ? error.message : 'Unknown error'}`,
115
+ },
116
+ ],
117
+ isError: true,
118
+ };
119
+ }
120
+ }
121
+ // Free tool - just execute
122
+ try {
123
+ const result = await tool.handler(parseResult.data);
124
+ return {
125
+ content: [
126
+ {
127
+ type: 'text',
128
+ text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
129
+ },
130
+ ],
131
+ };
132
+ }
133
+ catch (error) {
134
+ return {
135
+ content: [
136
+ {
137
+ type: 'text',
138
+ text: `Tool error: ${error instanceof Error ? error.message : 'Unknown error'}`,
139
+ },
140
+ ],
141
+ isError: true,
142
+ };
143
+ }
144
+ }
145
+ // Tool Listing (for MCP protocol)
146
+ /**
147
+ * Get all tool definitions for MCP tools/list
148
+ */
149
+ getToolDefinitions() {
150
+ return Array.from(this.tools.values()).map((tool) => ({
151
+ name: tool.name,
152
+ description: tool.description,
153
+ inputSchema: this.zodToJsonSchema(tool.inputSchema),
154
+ // x402 extension
155
+ ...(tool.payment && {
156
+ 'x-402': {
157
+ price: tool.payment.price,
158
+ currency: 'USDC',
159
+ chains: tool.payment.chains || [this.config.defaultChain],
160
+ payTo: this.config.walletAddress,
161
+ },
162
+ }),
163
+ }));
164
+ }
165
+ /**
166
+ * Get payment info for a tool
167
+ */
168
+ getToolPaymentInfo(toolName) {
169
+ const tool = this.tools.get(toolName);
170
+ if (!tool?.payment)
171
+ return null;
172
+ return {
173
+ price: tool.payment.price,
174
+ currency: 'USDC',
175
+ chains: tool.payment.chains || [this.config.defaultChain],
176
+ payTo: this.config.walletAddress,
177
+ requirements: buildPaymentRequirements(toolName, tool.payment, this.config.walletAddress, tool.payment.chains),
178
+ };
179
+ }
180
+ // Discovery Registration
181
+ /**
182
+ * Register all paid tools with the Discovery API
183
+ */
184
+ async registerWithDiscovery(baseUrl) {
185
+ if (!this.config.discoveryUrl || !this.config.sellerId) {
186
+ console.warn('Discovery URL or Seller ID not configured');
187
+ return;
188
+ }
189
+ for (const [name, tool] of this.tools) {
190
+ if (!tool.payment)
191
+ continue;
192
+ try {
193
+ const response = await fetch(`${this.config.discoveryUrl}/seller/tools`, {
194
+ method: 'POST',
195
+ headers: {
196
+ 'Content-Type': 'application/json',
197
+ 'X-Seller-ID': this.config.sellerId,
198
+ },
199
+ body: JSON.stringify({
200
+ name: tool.name,
201
+ slug: tool.name.toLowerCase().replace(/\s+/g, '-'),
202
+ description: tool.description,
203
+ baseUrl,
204
+ method: 'POST',
205
+ path: `/tools/${name}`,
206
+ price: tool.payment.price,
207
+ chains: tool.payment.chains || [this.config.defaultChain],
208
+ category: tool.payment.category || 'other',
209
+ tags: tool.payment.tags || [],
210
+ inputSchema: this.zodToJsonSchema(tool.inputSchema),
211
+ }),
212
+ });
213
+ if (!response.ok) {
214
+ console.error(`Failed to register tool ${name}:`, await response.text());
215
+ }
216
+ }
217
+ catch (error) {
218
+ console.error(`Error registering tool ${name}:`, error);
219
+ }
220
+ }
221
+ }
222
+ // Helpers
223
+ zodToJsonSchema(schema) {
224
+ // Basic zod to JSON schema conversion
225
+ // In production, use zod-to-json-schema package
226
+ if (schema instanceof z.ZodObject) {
227
+ const shape = schema.shape;
228
+ const properties = {};
229
+ const required = [];
230
+ for (const [key, value] of Object.entries(shape)) {
231
+ properties[key] = this.zodTypeToJsonSchema(value);
232
+ if (!(value instanceof z.ZodOptional)) {
233
+ required.push(key);
234
+ }
235
+ }
236
+ return {
237
+ type: 'object',
238
+ properties,
239
+ required: required.length > 0 ? required : undefined,
240
+ };
241
+ }
242
+ return { type: 'object', properties: {} };
243
+ }
244
+ zodTypeToJsonSchema(type) {
245
+ if (type instanceof z.ZodString)
246
+ return { type: 'string' };
247
+ if (type instanceof z.ZodNumber)
248
+ return { type: 'number' };
249
+ if (type instanceof z.ZodBoolean)
250
+ return { type: 'boolean' };
251
+ if (type instanceof z.ZodArray) {
252
+ return { type: 'array', items: this.zodTypeToJsonSchema(type.element) };
253
+ }
254
+ if (type instanceof z.ZodOptional) {
255
+ return this.zodTypeToJsonSchema(type.unwrap());
256
+ }
257
+ if (type instanceof z.ZodEnum) {
258
+ return { type: 'string', enum: type.options };
259
+ }
260
+ return { type: 'string' };
261
+ }
262
+ }
263
+ // Factory Function
264
+ export function createPaidMCPServer(config) {
265
+ return new PaidMCPServer(config);
266
+ }
267
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import { z } from 'zod';
2
+ export interface PaidToolConfig {
3
+ /** Price in USD (e.g., 0.005 = $0.005) */
4
+ price: number;
5
+ /** Supported chains */
6
+ chains?: ('base' | 'solana')[];
7
+ /** Tool description for discovery */
8
+ description?: string;
9
+ /** Category for discovery registry */
10
+ category?: string;
11
+ /** Tags for search */
12
+ tags?: string[];
13
+ }
14
+ export interface ToolDefinition {
15
+ name: string;
16
+ description: string;
17
+ inputSchema: z.ZodType<unknown>;
18
+ /** Payment config - if not provided, tool is free */
19
+ payment?: PaidToolConfig;
20
+ }
21
+ export interface PaymentRequirement {
22
+ scheme: 'exact';
23
+ network: string;
24
+ maxAmountRequired: string;
25
+ resource: string;
26
+ description: string;
27
+ mimeType: string;
28
+ payTo: string;
29
+ maxTimeoutSeconds: number;
30
+ asset: string;
31
+ extra?: Record<string, unknown>;
32
+ }
33
+ export interface PaymentHeader {
34
+ payload: string;
35
+ signature: string;
36
+ }
37
+ export interface VerificationResult {
38
+ valid: boolean;
39
+ txHash?: string;
40
+ settledAt?: Date;
41
+ error?: string;
42
+ }
43
+ export interface PaidMCPServerConfig {
44
+ /** Your wallet address to receive payments */
45
+ walletAddress: string;
46
+ /** Default chain if not specified per-tool */
47
+ defaultChain?: 'base' | 'solana';
48
+ /** Facilitator URL (default: Coinbase CDP) */
49
+ facilitatorUrl?: string;
50
+ /** Discovery API URL for auto-registration */
51
+ discoveryUrl?: string;
52
+ /** Seller ID for discovery registration */
53
+ sellerId?: string;
54
+ /** Callback when payment is received */
55
+ onPayment?: (toolName: string, amount: number, txHash: string) => void;
56
+ /** Callback when payment fails */
57
+ onPaymentError?: (toolName: string, error: Error) => void;
58
+ }
59
+ export interface MCPToolRequest {
60
+ method: 'tools/call';
61
+ params: {
62
+ name: string;
63
+ arguments: Record<string, unknown>;
64
+ };
65
+ }
66
+ export interface MCPToolResponse {
67
+ content: Array<{
68
+ type: 'text' | 'image' | 'resource';
69
+ text?: string;
70
+ data?: string;
71
+ mimeType?: string;
72
+ }>;
73
+ isError?: boolean;
74
+ _meta?: {
75
+ paymentRequired?: PaymentRequirement[];
76
+ paymentReceipt?: {
77
+ txHash: string;
78
+ amount: number;
79
+ chain: string;
80
+ };
81
+ };
82
+ }
83
+ export declare const CHAIN_CONFIG: {
84
+ readonly base: {
85
+ readonly network: "eip155:8453";
86
+ readonly asset: "eip155:8453/erc20:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
87
+ readonly facilitator: "https://x402.org/facilitator";
88
+ };
89
+ readonly solana: {
90
+ readonly network: "solana:mainnet";
91
+ readonly asset: "solana:mainnet/spl:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
92
+ readonly facilitator: "https://x402.org/facilitator";
93
+ };
94
+ };
95
+ export type SupportedChain = keyof typeof CHAIN_CONFIG;
96
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,14 @@
1
+ // Chain Constants
2
+ export const CHAIN_CONFIG = {
3
+ base: {
4
+ network: 'eip155:8453',
5
+ asset: 'eip155:8453/erc20:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', // USDC on Base
6
+ facilitator: 'https://x402.org/facilitator',
7
+ },
8
+ solana: {
9
+ network: 'solana:mainnet',
10
+ asset: 'solana:mainnet/spl:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v', // USDC on Solana
11
+ facilitator: 'https://x402.org/facilitator',
12
+ },
13
+ };
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAmGA,kBAAkB;AAElB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE;QACJ,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,8DAA8D,EAAE,eAAe;QACtF,WAAW,EAAE,8BAA8B;KAC5C;IACD,MAAM,EAAE;QACN,OAAO,EAAE,gBAAgB;QACzB,KAAK,EAAE,iEAAiE,EAAE,iBAAiB;QAC3F,WAAW,EAAE,8BAA8B;KAC5C;CACO,CAAA"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@apitoll/mcp-server",
3
+ "version": "0.1.0-beta.4",
4
+ "description": "Monetize MCP tools with x402 payments",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "module": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "files": ["dist", "README.md", "LICENSE"],
11
+ "sideEffects": false,
12
+ "engines": {
13
+ "node": ">=18"
14
+ },
15
+ "homepage": "https://apitoll.com",
16
+ "bugs": "https://github.com/TasnidChain/APITOLL/issues",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/TasnidChain/APITOLL",
20
+ "directory": "packages/mcp-server"
21
+ },
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "exports": {
26
+ ".": {
27
+ "import": "./dist/index.js",
28
+ "require": "./dist/index.js",
29
+ "types": "./dist/index.d.ts"
30
+ }
31
+ },
32
+ "scripts": {
33
+ "build": "tsc",
34
+ "dev": "tsc --watch",
35
+ "test": "vitest"
36
+ },
37
+ "keywords": [
38
+ "mcp",
39
+ "x402",
40
+ "payments",
41
+ "ai-tools",
42
+ "monetization"
43
+ ],
44
+ "dependencies": {
45
+ "@modelcontextprotocol/sdk": "^1.0.0",
46
+ "@apitoll/shared": "0.1.0-beta.4",
47
+ "zod": "^3.22.0"
48
+ },
49
+ "peerDependencies": {
50
+ "@modelcontextprotocol/sdk": ">=1.0.0"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^20",
54
+ "typescript": "^5"
55
+ }
56
+ }