@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.
- package/dist/adapters.d.ts +72 -0
- package/dist/adapters.d.ts.map +1 -0
- package/dist/adapters.js +151 -0
- package/dist/adapters.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/payment.d.ts +20 -0
- package/dist/payment.d.ts.map +1 -0
- package/dist/payment.js +98 -0
- package/dist/payment.js.map +1 -0
- package/dist/server.d.ts +51 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +267 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/package.json +56 -0
|
@@ -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"}
|
package/dist/adapters.js
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|
package/dist/payment.js
ADDED
|
@@ -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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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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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"}
|
package/dist/types.d.ts
ADDED
|
@@ -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
|
+
}
|