drain-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +177 -0
- package/dist/config.d.ts +17530 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +174 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +119 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +170 -0
- package/dist/index.js.map +1 -0
- package/dist/services/channel.d.ts +79 -0
- package/dist/services/channel.d.ts.map +1 -0
- package/dist/services/channel.js +190 -0
- package/dist/services/channel.js.map +1 -0
- package/dist/services/inference.d.ts +54 -0
- package/dist/services/inference.d.ts.map +1 -0
- package/dist/services/inference.js +81 -0
- package/dist/services/inference.js.map +1 -0
- package/dist/services/provider.d.ts +70 -0
- package/dist/services/provider.d.ts.map +1 -0
- package/dist/services/provider.js +84 -0
- package/dist/services/provider.js.map +1 -0
- package/dist/services/wallet.d.ts +48 -0
- package/dist/services/wallet.d.ts.map +1 -0
- package/dist/services/wallet.js +102 -0
- package/dist/services/wallet.js.map +1 -0
- package/dist/tools/balance.d.ts +40 -0
- package/dist/tools/balance.d.ts.map +1 -0
- package/dist/tools/balance.js +86 -0
- package/dist/tools/balance.js.map +1 -0
- package/dist/tools/channel.d.ts +67 -0
- package/dist/tools/channel.d.ts.map +1 -0
- package/dist/tools/channel.js +177 -0
- package/dist/tools/channel.js.map +1 -0
- package/dist/tools/chat.d.ts +64 -0
- package/dist/tools/chat.d.ts.map +1 -0
- package/dist/tools/chat.js +118 -0
- package/dist/tools/chat.js.map +1 -0
- package/dist/tools/providers.d.ts +54 -0
- package/dist/tools/providers.d.ts.map +1 -0
- package/dist/tools/providers.js +102 -0
- package/dist/tools/providers.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat Tool
|
|
3
|
+
*
|
|
4
|
+
* The main tool: Make AI chat requests with DRAIN payment.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Make a chat completion request
|
|
8
|
+
*/
|
|
9
|
+
export async function chat(channelService, providerService, inferenceService, args) {
|
|
10
|
+
const channelId = args.channelId;
|
|
11
|
+
// Get channel to find provider
|
|
12
|
+
const channel = await channelService.getChannel(channelId);
|
|
13
|
+
if (channel.isExpired) {
|
|
14
|
+
throw new Error('Channel has expired. Open a new channel to continue.');
|
|
15
|
+
}
|
|
16
|
+
// Find provider by address
|
|
17
|
+
const providers = await providerService.getProviders();
|
|
18
|
+
const provider = providers.find(p => p.providerAddress.toLowerCase() === channel.provider.toLowerCase());
|
|
19
|
+
if (!provider) {
|
|
20
|
+
throw new Error(`Provider ${channel.provider} not found in directory. The channel may be for an unlisted provider.`);
|
|
21
|
+
}
|
|
22
|
+
// Check model is available
|
|
23
|
+
const modelInfo = provider.models.find(m => m.id === args.model);
|
|
24
|
+
if (!modelInfo) {
|
|
25
|
+
const availableModels = provider.models.map(m => m.id).join(', ');
|
|
26
|
+
throw new Error(`Model "${args.model}" not available from this provider. Available: ${availableModels}`);
|
|
27
|
+
}
|
|
28
|
+
// Make the request
|
|
29
|
+
const response = await inferenceService.chat(provider, channelId, {
|
|
30
|
+
model: args.model,
|
|
31
|
+
messages: args.messages,
|
|
32
|
+
max_tokens: args.maxTokens,
|
|
33
|
+
temperature: args.temperature,
|
|
34
|
+
});
|
|
35
|
+
// Format response
|
|
36
|
+
const assistantMessage = response.choices[0]?.message?.content ?? '';
|
|
37
|
+
const cost = response.drain?.cost ?? 'unknown';
|
|
38
|
+
const totalSpent = response.drain?.totalSpent ?? 'unknown';
|
|
39
|
+
return `${assistantMessage}
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
*Cost: $${formatCost(cost)} USDC | Total spent: $${formatCost(totalSpent)} USDC | Tokens: ${response.usage.total_tokens}*`;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Format cost for display
|
|
46
|
+
*/
|
|
47
|
+
function formatCost(cost) {
|
|
48
|
+
const num = parseFloat(cost) / 1_000_000; // Convert from wei to USDC
|
|
49
|
+
if (isNaN(num))
|
|
50
|
+
return cost;
|
|
51
|
+
if (num < 0.0001)
|
|
52
|
+
return num.toFixed(6);
|
|
53
|
+
if (num < 0.01)
|
|
54
|
+
return num.toFixed(4);
|
|
55
|
+
return num.toFixed(4);
|
|
56
|
+
}
|
|
57
|
+
// Tool definition for MCP
|
|
58
|
+
export const chatTools = [
|
|
59
|
+
{
|
|
60
|
+
name: 'drain_chat',
|
|
61
|
+
description: `Send a chat completion request to an AI provider through DRAIN.
|
|
62
|
+
|
|
63
|
+
This is the main tool for AI inference. It:
|
|
64
|
+
1. Uses your open payment channel
|
|
65
|
+
2. Automatically signs a payment voucher
|
|
66
|
+
3. Sends the request to the provider
|
|
67
|
+
4. Returns the AI response
|
|
68
|
+
|
|
69
|
+
PREREQUISITES:
|
|
70
|
+
- You must have an open channel (use drain_open_channel first)
|
|
71
|
+
- The channel must have sufficient balance
|
|
72
|
+
- The channel must not be expired
|
|
73
|
+
|
|
74
|
+
The cost is automatically deducted from your channel balance.`,
|
|
75
|
+
inputSchema: {
|
|
76
|
+
type: 'object',
|
|
77
|
+
properties: {
|
|
78
|
+
channelId: {
|
|
79
|
+
type: 'string',
|
|
80
|
+
description: 'The payment channel ID to use (0x...)',
|
|
81
|
+
},
|
|
82
|
+
model: {
|
|
83
|
+
type: 'string',
|
|
84
|
+
description: 'Model ID to use (e.g., "gpt-4o", "gpt-4o-mini")',
|
|
85
|
+
},
|
|
86
|
+
messages: {
|
|
87
|
+
type: 'array',
|
|
88
|
+
description: 'Chat messages in OpenAI format',
|
|
89
|
+
items: {
|
|
90
|
+
type: 'object',
|
|
91
|
+
properties: {
|
|
92
|
+
role: {
|
|
93
|
+
type: 'string',
|
|
94
|
+
enum: ['system', 'user', 'assistant'],
|
|
95
|
+
description: 'Message role',
|
|
96
|
+
},
|
|
97
|
+
content: {
|
|
98
|
+
type: 'string',
|
|
99
|
+
description: 'Message content',
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
required: ['role', 'content'],
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
maxTokens: {
|
|
106
|
+
type: 'number',
|
|
107
|
+
description: 'Maximum tokens to generate (optional)',
|
|
108
|
+
},
|
|
109
|
+
temperature: {
|
|
110
|
+
type: 'number',
|
|
111
|
+
description: 'Sampling temperature 0-2 (optional)',
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
required: ['channelId', 'model', 'messages'],
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
];
|
|
118
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/tools/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider Discovery Tools
|
|
3
|
+
*
|
|
4
|
+
* Tools for discovering and inspecting DRAIN AI providers.
|
|
5
|
+
*/
|
|
6
|
+
import type { ProviderService } from '../services/provider.js';
|
|
7
|
+
/**
|
|
8
|
+
* List all available providers
|
|
9
|
+
*/
|
|
10
|
+
export declare function listProviders(providerService: ProviderService, args: {
|
|
11
|
+
onlineOnly?: boolean;
|
|
12
|
+
model?: string;
|
|
13
|
+
}): Promise<string>;
|
|
14
|
+
/**
|
|
15
|
+
* Get details for a specific provider
|
|
16
|
+
*/
|
|
17
|
+
export declare function getProvider(providerService: ProviderService, args: {
|
|
18
|
+
providerId: string;
|
|
19
|
+
}): Promise<string>;
|
|
20
|
+
export declare const providerTools: ({
|
|
21
|
+
name: string;
|
|
22
|
+
description: string;
|
|
23
|
+
inputSchema: {
|
|
24
|
+
type: string;
|
|
25
|
+
properties: {
|
|
26
|
+
onlineOnly: {
|
|
27
|
+
type: string;
|
|
28
|
+
description: string;
|
|
29
|
+
};
|
|
30
|
+
model: {
|
|
31
|
+
type: string;
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
34
|
+
providerId?: undefined;
|
|
35
|
+
};
|
|
36
|
+
required?: undefined;
|
|
37
|
+
};
|
|
38
|
+
} | {
|
|
39
|
+
name: string;
|
|
40
|
+
description: string;
|
|
41
|
+
inputSchema: {
|
|
42
|
+
type: string;
|
|
43
|
+
properties: {
|
|
44
|
+
providerId: {
|
|
45
|
+
type: string;
|
|
46
|
+
description: string;
|
|
47
|
+
};
|
|
48
|
+
onlineOnly?: undefined;
|
|
49
|
+
model?: undefined;
|
|
50
|
+
};
|
|
51
|
+
required: string[];
|
|
52
|
+
};
|
|
53
|
+
})[];
|
|
54
|
+
//# sourceMappingURL=providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/tools/providers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,yBAAyB,CAAC;AA0BzE;;GAEG;AACH,wBAAsB,aAAa,CACjC,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,eAAe,EAAE,eAAe,EAChC,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,CAQjB;AAGD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuCzB,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider Discovery Tools
|
|
3
|
+
*
|
|
4
|
+
* Tools for discovering and inspecting DRAIN AI providers.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Format provider for display
|
|
8
|
+
*/
|
|
9
|
+
function formatProvider(p) {
|
|
10
|
+
const status = p.status.online ? '🟢 ONLINE' : '🔴 OFFLINE';
|
|
11
|
+
const latency = p.status.latencyMs ? `${p.status.latencyMs}ms` : 'N/A';
|
|
12
|
+
const models = p.models.map(m => ` - ${m.name} ($${m.pricing.inputPer1kTokens}/$${m.pricing.outputPer1kTokens} per 1k tokens)`).join('\n');
|
|
13
|
+
return `
|
|
14
|
+
## ${p.name}
|
|
15
|
+
- **ID:** ${p.id}
|
|
16
|
+
- **Status:** ${status}
|
|
17
|
+
- **Latency:** ${latency}
|
|
18
|
+
- **Address:** ${p.providerAddress}
|
|
19
|
+
- **API:** ${p.apiUrl}
|
|
20
|
+
- **Chain:** ${p.chainId === 137 ? 'Polygon Mainnet' : 'Polygon Amoy'}
|
|
21
|
+
|
|
22
|
+
**Description:** ${p.description}
|
|
23
|
+
|
|
24
|
+
**Models:**
|
|
25
|
+
${models}
|
|
26
|
+
`.trim();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* List all available providers
|
|
30
|
+
*/
|
|
31
|
+
export async function listProviders(providerService, args) {
|
|
32
|
+
let providers;
|
|
33
|
+
if (args.model) {
|
|
34
|
+
providers = await providerService.findByModel(args.model);
|
|
35
|
+
}
|
|
36
|
+
else if (args.onlineOnly) {
|
|
37
|
+
providers = await providerService.getOnlineProviders();
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
providers = await providerService.getProviders();
|
|
41
|
+
}
|
|
42
|
+
if (providers.length === 0) {
|
|
43
|
+
if (args.model) {
|
|
44
|
+
return `No providers found supporting model "${args.model}".`;
|
|
45
|
+
}
|
|
46
|
+
return 'No providers available in the directory.';
|
|
47
|
+
}
|
|
48
|
+
const formatted = providers.map(formatProvider).join('\n\n---\n\n');
|
|
49
|
+
return `# DRAIN AI Providers\n\nFound ${providers.length} provider(s):\n\n${formatted}`;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get details for a specific provider
|
|
53
|
+
*/
|
|
54
|
+
export async function getProvider(providerService, args) {
|
|
55
|
+
const provider = await providerService.getProvider(args.providerId);
|
|
56
|
+
if (!provider) {
|
|
57
|
+
return `Provider "${args.providerId}" not found.`;
|
|
58
|
+
}
|
|
59
|
+
return formatProvider(provider);
|
|
60
|
+
}
|
|
61
|
+
// Tool definitions for MCP
|
|
62
|
+
export const providerTools = [
|
|
63
|
+
{
|
|
64
|
+
name: 'drain_providers',
|
|
65
|
+
description: `List available DRAIN AI providers.
|
|
66
|
+
|
|
67
|
+
These are AI services that accept DRAIN micropayments for inference.
|
|
68
|
+
Use this to discover which providers and models are available before opening a channel.
|
|
69
|
+
|
|
70
|
+
Returns: List of providers with their models, pricing, and status.`,
|
|
71
|
+
inputSchema: {
|
|
72
|
+
type: 'object',
|
|
73
|
+
properties: {
|
|
74
|
+
onlineOnly: {
|
|
75
|
+
type: 'boolean',
|
|
76
|
+
description: 'If true, only return providers that are currently online',
|
|
77
|
+
},
|
|
78
|
+
model: {
|
|
79
|
+
type: 'string',
|
|
80
|
+
description: 'Filter providers by model name (e.g., "gpt-4o", "gpt-3.5-turbo")',
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'drain_provider_info',
|
|
87
|
+
description: `Get detailed information about a specific DRAIN provider.
|
|
88
|
+
|
|
89
|
+
Returns: Provider details including all available models and their pricing.`,
|
|
90
|
+
inputSchema: {
|
|
91
|
+
type: 'object',
|
|
92
|
+
properties: {
|
|
93
|
+
providerId: {
|
|
94
|
+
type: 'string',
|
|
95
|
+
description: 'The provider ID to look up',
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
required: ['providerId'],
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/tools/providers.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "drain-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "MCP Server for DRAIN Protocol - Autonomous AI payments",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"drain-mcp": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"start": "node dist/index.js",
|
|
14
|
+
"prepublishOnly": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"mcp",
|
|
18
|
+
"drain",
|
|
19
|
+
"ai",
|
|
20
|
+
"payments",
|
|
21
|
+
"micropayments",
|
|
22
|
+
"polygon",
|
|
23
|
+
"usdc",
|
|
24
|
+
"agent"
|
|
25
|
+
],
|
|
26
|
+
"author": "",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
30
|
+
"viem": "^2.21.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^22.0.0",
|
|
34
|
+
"typescript": "^5.6.0"
|
|
35
|
+
},
|
|
36
|
+
"engines": {
|
|
37
|
+
"node": ">=18.0.0"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist",
|
|
41
|
+
"README.md"
|
|
42
|
+
]
|
|
43
|
+
}
|