mpp32-mcp-server 1.0.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 +141 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +575 -0
- package/dist/index.js.map +1 -0
- package/package.json +78 -0
package/README.md
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# mpp32-mcp-server
|
|
2
|
+
|
|
3
|
+
**MCP server for [MPP32](https://mpp32.org) — the Universal Payment Proxy for Machine-Payable APIs.**
|
|
4
|
+
|
|
5
|
+
Give your AI agent access to a growing ecosystem of paid APIs with automatic payment handling. One integration, five payment protocols, real-time data.
|
|
6
|
+
|
|
7
|
+
## What This Does
|
|
8
|
+
|
|
9
|
+
This MCP server connects AI agents (Claude, GPT, etc.) to the MPP32 ecosystem — a universal proxy where agents can discover and pay for APIs using any of 5 payment protocols:
|
|
10
|
+
|
|
11
|
+
| Protocol | Payment Method | Network |
|
|
12
|
+
|----------|---------------|---------|
|
|
13
|
+
| **Tempo** | pathUSD micropayments | Ethereum L2 |
|
|
14
|
+
| **x402** | USDC | Solana Mainnet |
|
|
15
|
+
| **ACP** | Checkout sessions | Multi-chain |
|
|
16
|
+
| **AP2** | W3C Verifiable Credentials | Chain-agnostic |
|
|
17
|
+
| **AGTP** | Signed agent identity | Chain-agnostic |
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
### Claude Desktop / Claude Code
|
|
22
|
+
|
|
23
|
+
Add to your MCP configuration:
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"mcpServers": {
|
|
28
|
+
"mpp32": {
|
|
29
|
+
"command": "npx",
|
|
30
|
+
"args": ["mpp32-mcp-server"],
|
|
31
|
+
"env": {
|
|
32
|
+
"MPP32_SOLANA_PRIVATE_KEY": "your-solana-private-key"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Other MCP Clients
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
npx mpp32-mcp-server
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Tools
|
|
46
|
+
|
|
47
|
+
### `list_mpp32_services`
|
|
48
|
+
|
|
49
|
+
Browse all machine-payable APIs in the MPP32 ecosystem. Filter by category. Returns service names, descriptions, pricing, and proxy URLs.
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
Categories: ai-inference, token-scanner, price-oracle, web-search,
|
|
53
|
+
trading-signal, defi-analytics, wallet-intelligence, and 30+ more
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### `get_solana_token_intelligence`
|
|
57
|
+
|
|
58
|
+
Get comprehensive Solana token analysis powered by DexScreener, Jupiter, and CoinGecko:
|
|
59
|
+
|
|
60
|
+
- **Alpha Score** (0-100) — trading viability assessment
|
|
61
|
+
- **Rug Risk Score** — liquidity, age, holder distribution analysis
|
|
62
|
+
- **Whale Activity** — volume-to-liquidity ratio tracking
|
|
63
|
+
- **Smart Money Signals** — real-time pattern detection
|
|
64
|
+
- **24h Pump Probability** — statistical price movement prediction
|
|
65
|
+
- **Projected ROI** — low/high scenario modeling
|
|
66
|
+
- **Full Market Data** — price, volume, liquidity, market cap
|
|
67
|
+
|
|
68
|
+
**Price:** $0.008 per query. M32 token holders get up to 40% discount.
|
|
69
|
+
|
|
70
|
+
### `call_mpp32_endpoint`
|
|
71
|
+
|
|
72
|
+
Call any registered API through the MPP32 proxy with automatic payment handling. The tool:
|
|
73
|
+
|
|
74
|
+
1. Discovers the service and its price
|
|
75
|
+
2. Sends the initial request
|
|
76
|
+
3. Receives the HTTP 402 payment challenge
|
|
77
|
+
4. Completes payment via Tempo or x402
|
|
78
|
+
5. Retries with payment receipt
|
|
79
|
+
6. Returns the response
|
|
80
|
+
|
|
81
|
+
No manual payment logic needed.
|
|
82
|
+
|
|
83
|
+
## Configuration
|
|
84
|
+
|
|
85
|
+
| Environment Variable | Required | Description |
|
|
86
|
+
|---------------------|----------|-------------|
|
|
87
|
+
| `MPP32_SOLANA_PRIVATE_KEY` | One of these | Solana private key for x402 (USDC) payments |
|
|
88
|
+
| `MPP32_PRIVATE_KEY` | One of these | EVM private key for Tempo (pathUSD) payments |
|
|
89
|
+
| `MPP32_API_URL` | No | Custom API URL (default: `https://mpp32.org`) |
|
|
90
|
+
|
|
91
|
+
Provide at least one payment key. Both can be set for maximum protocol compatibility.
|
|
92
|
+
|
|
93
|
+
## How Payments Work
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
Agent calls tool
|
|
97
|
+
|
|
|
98
|
+
v
|
|
99
|
+
MCP server hits MPP32 proxy
|
|
100
|
+
|
|
|
101
|
+
v
|
|
102
|
+
Receives HTTP 402 + payment challenge headers
|
|
103
|
+
|
|
|
104
|
+
v
|
|
105
|
+
Signs payment with your private key
|
|
106
|
+
|
|
|
107
|
+
v
|
|
108
|
+
Retries request with payment receipt
|
|
109
|
+
|
|
|
110
|
+
v
|
|
111
|
+
Gets response data --> returns to agent
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
All payments are micropayments ($0.001 - $1.00 per call). Settlement is instant on Solana (USDC) or Tempo L2 (pathUSD).
|
|
115
|
+
|
|
116
|
+
## Discovery Endpoints
|
|
117
|
+
|
|
118
|
+
MPP32 exposes standard discovery formats for agent-to-agent interoperability:
|
|
119
|
+
|
|
120
|
+
| Format | URL |
|
|
121
|
+
|--------|-----|
|
|
122
|
+
| OpenAPI 3.1 | `https://mpp32.org/openapi.json` |
|
|
123
|
+
| A2A Agent Card | `https://mpp32.org/.well-known/agent.json` |
|
|
124
|
+
| MCP Config | `https://mpp32.org/api/mcp-config` |
|
|
125
|
+
| Service Directory | `https://mpp32.org/api/submissions` |
|
|
126
|
+
|
|
127
|
+
## For API Providers
|
|
128
|
+
|
|
129
|
+
Want your API listed on MPP32? Register at [mpp32.org/build](https://mpp32.org/build). You provide the endpoint — MPP32 handles payment protocol translation, verification, and settlement across all 5 protocols.
|
|
130
|
+
|
|
131
|
+
## Links
|
|
132
|
+
|
|
133
|
+
- **Website:** [mpp32.org](https://mpp32.org)
|
|
134
|
+
- **Documentation:** [mpp32.org/docs](https://mpp32.org/docs)
|
|
135
|
+
- **API Explorer:** [mpp32.org/playground](https://mpp32.org/playground)
|
|
136
|
+
- **Ecosystem:** [mpp32.org/ecosystem](https://mpp32.org/ecosystem)
|
|
137
|
+
- **GitHub:** [github.com/MPP32/MPP32](https://github.com/MPP32/MPP32)
|
|
138
|
+
|
|
139
|
+
## License
|
|
140
|
+
|
|
141
|
+
MIT
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
const API_URL = process.env.MPP32_API_URL?.replace(/\/$/, "") || "https://mpp32.org";
|
|
6
|
+
const PRIVATE_KEY = process.env.MPP32_PRIVATE_KEY;
|
|
7
|
+
const SOLANA_PRIVATE_KEY = process.env.MPP32_SOLANA_PRIVATE_KEY;
|
|
8
|
+
const server = new McpServer({
|
|
9
|
+
name: "mpp32",
|
|
10
|
+
version: "1.0.0",
|
|
11
|
+
});
|
|
12
|
+
// ── Tool 1: list_mpp32_services ──
|
|
13
|
+
server.tool("list_mpp32_services", "Browse the MPP32 ecosystem of machine-payable APIs. Returns all available services with their names, descriptions, categories, prices, and proxy URLs. Optionally filter by category.", {
|
|
14
|
+
category: z
|
|
15
|
+
.string()
|
|
16
|
+
.optional()
|
|
17
|
+
.describe("Filter by category slug (e.g. 'ai-inference', 'token-scanner', 'price-oracle', 'web-search'). Omit to list all services."),
|
|
18
|
+
}, async ({ category }) => {
|
|
19
|
+
try {
|
|
20
|
+
const url = new URL("/api/submissions", API_URL);
|
|
21
|
+
const res = await fetch(url.toString());
|
|
22
|
+
if (!res.ok) {
|
|
23
|
+
return {
|
|
24
|
+
content: [
|
|
25
|
+
{
|
|
26
|
+
type: "text",
|
|
27
|
+
text: `Error fetching services: HTTP ${res.status} ${res.statusText}`,
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const json = (await res.json());
|
|
33
|
+
let services = json.data;
|
|
34
|
+
if (category) {
|
|
35
|
+
services = services.filter((s) => s.category.toLowerCase() === category.toLowerCase());
|
|
36
|
+
}
|
|
37
|
+
if (services.length === 0) {
|
|
38
|
+
const msg = category
|
|
39
|
+
? `No services found in category "${category}". Try listing all services to see available categories.`
|
|
40
|
+
: "No services are currently listed in the MPP32 ecosystem.";
|
|
41
|
+
return { content: [{ type: "text", text: msg }] };
|
|
42
|
+
}
|
|
43
|
+
const lines = services.map((s) => {
|
|
44
|
+
const price = s.pricePerQuery
|
|
45
|
+
? `$${s.pricePerQuery} USD (pathUSD or USDC)`
|
|
46
|
+
: "Free";
|
|
47
|
+
return [
|
|
48
|
+
`## ${s.name}`,
|
|
49
|
+
`- **Slug:** \`${s.slug}\``,
|
|
50
|
+
`- **Category:** ${s.category}`,
|
|
51
|
+
`- **Price:** ${price} per query`,
|
|
52
|
+
`- **Description:** ${s.shortDescription}`,
|
|
53
|
+
`- **Proxy URL:** \`${API_URL}/api/proxy/${s.slug}\``,
|
|
54
|
+
`- **Queries served:** ${s.queryCount.toLocaleString()}`,
|
|
55
|
+
s.creatorName ? `- **Creator:** ${s.creatorName}` : null,
|
|
56
|
+
]
|
|
57
|
+
.filter(Boolean)
|
|
58
|
+
.join("\n");
|
|
59
|
+
});
|
|
60
|
+
const header = `# MPP32 Ecosystem — ${services.length} service${services.length !== 1 ? "s" : ""}${category ? ` in "${category}"` : ""}\n\nTo call any service, use the \`call_mpp32_endpoint\` tool with the service slug.\n`;
|
|
61
|
+
return {
|
|
62
|
+
content: [{ type: "text", text: header + "\n" + lines.join("\n\n") }],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
return {
|
|
67
|
+
content: [
|
|
68
|
+
{
|
|
69
|
+
type: "text",
|
|
70
|
+
text: `Failed to fetch MPP32 services: ${err instanceof Error ? err.message : String(err)}`,
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// ── Tool 2: call_mpp32_endpoint ──
|
|
77
|
+
server.tool("call_mpp32_endpoint", "Call a machine-payable API endpoint on MPP32. Handles the full HTTP 402 payment flow automatically via Tempo (pathUSD) or x402 (USDC on Solana). Requires MPP32_PRIVATE_KEY (Tempo) or MPP32_SOLANA_PRIVATE_KEY (x402) environment variable.", {
|
|
78
|
+
slug: z
|
|
79
|
+
.string()
|
|
80
|
+
.describe("The service slug to call (e.g. 'solana-token-intelligence'). Use list_mpp32_services to discover available slugs."),
|
|
81
|
+
method: z
|
|
82
|
+
.enum(["GET", "POST", "PUT", "DELETE"])
|
|
83
|
+
.default("GET")
|
|
84
|
+
.describe("HTTP method for the request"),
|
|
85
|
+
body: z
|
|
86
|
+
.string()
|
|
87
|
+
.optional()
|
|
88
|
+
.describe("JSON request body (for POST/PUT requests)"),
|
|
89
|
+
query: z
|
|
90
|
+
.record(z.string())
|
|
91
|
+
.optional()
|
|
92
|
+
.describe("URL query parameters as key-value pairs"),
|
|
93
|
+
}, async ({ slug, method, body, query }) => {
|
|
94
|
+
if (!PRIVATE_KEY && !SOLANA_PRIVATE_KEY) {
|
|
95
|
+
return {
|
|
96
|
+
content: [
|
|
97
|
+
{
|
|
98
|
+
type: "text",
|
|
99
|
+
text: [
|
|
100
|
+
"**No payment key configured.**",
|
|
101
|
+
"",
|
|
102
|
+
"To make paid API calls, set at least one payment key in your MCP server configuration:",
|
|
103
|
+
"",
|
|
104
|
+
"```json",
|
|
105
|
+
'{',
|
|
106
|
+
' "mcpServers": {',
|
|
107
|
+
' "mpp32": {',
|
|
108
|
+
' "command": "npx",',
|
|
109
|
+
' "args": ["mpp32-mcp-server"],',
|
|
110
|
+
' "env": {',
|
|
111
|
+
' "MPP32_PRIVATE_KEY": "your-evm-private-key (for Tempo/pathUSD)",',
|
|
112
|
+
' "MPP32_SOLANA_PRIVATE_KEY": "your-solana-private-key (for x402/USDC)"',
|
|
113
|
+
" }",
|
|
114
|
+
" }",
|
|
115
|
+
" }",
|
|
116
|
+
"}",
|
|
117
|
+
"```",
|
|
118
|
+
"",
|
|
119
|
+
"Provide either key — or both for maximum compatibility.",
|
|
120
|
+
"- **MPP32_PRIVATE_KEY**: EVM key for a wallet funded with pathUSD on Tempo.",
|
|
121
|
+
"- **MPP32_SOLANA_PRIVATE_KEY**: Solana key for a wallet funded with USDC.",
|
|
122
|
+
].join("\n"),
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
// First, get service info to confirm it exists and show the price
|
|
129
|
+
const infoUrl = new URL(`/api/proxy/${encodeURIComponent(slug)}/info`, API_URL);
|
|
130
|
+
const infoRes = await fetch(infoUrl.toString());
|
|
131
|
+
if (!infoRes.ok) {
|
|
132
|
+
if (infoRes.status === 404) {
|
|
133
|
+
return {
|
|
134
|
+
content: [
|
|
135
|
+
{
|
|
136
|
+
type: "text",
|
|
137
|
+
text: `Service "${slug}" not found. Use list_mpp32_services to see available services.`,
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
content: [
|
|
144
|
+
{
|
|
145
|
+
type: "text",
|
|
146
|
+
text: `Error checking service: HTTP ${infoRes.status}`,
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const info = (await infoRes.json());
|
|
152
|
+
const price = info.data.pricePerQuery ?? 0.001;
|
|
153
|
+
// Build the proxy request URL
|
|
154
|
+
const proxyUrl = new URL(`/api/proxy/${encodeURIComponent(slug)}`, API_URL);
|
|
155
|
+
if (query) {
|
|
156
|
+
for (const [key, value] of Object.entries(query)) {
|
|
157
|
+
proxyUrl.searchParams.set(key, value);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Step 1: Initial request to get the 402 payment challenge
|
|
161
|
+
const headers = {
|
|
162
|
+
Accept: "application/json",
|
|
163
|
+
};
|
|
164
|
+
if (body) {
|
|
165
|
+
headers["Content-Type"] = "application/json";
|
|
166
|
+
}
|
|
167
|
+
const challengeRes = await fetch(proxyUrl.toString(), {
|
|
168
|
+
method,
|
|
169
|
+
headers,
|
|
170
|
+
body: method !== "GET" ? body : undefined,
|
|
171
|
+
});
|
|
172
|
+
// If we get a non-402 response, the endpoint might not require payment
|
|
173
|
+
if (challengeRes.status !== 402) {
|
|
174
|
+
const responseText = await challengeRes.text();
|
|
175
|
+
let formatted;
|
|
176
|
+
try {
|
|
177
|
+
formatted = JSON.stringify(JSON.parse(responseText), null, 2);
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
formatted = responseText;
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
content: [
|
|
184
|
+
{
|
|
185
|
+
type: "text",
|
|
186
|
+
text: `**${info.data.name}** responded with HTTP ${challengeRes.status}:\n\n\`\`\`json\n${formatted}\n\`\`\``,
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
// Step 2: Parse the 402 challenge — detect available protocols
|
|
192
|
+
const wwwAuth = challengeRes.headers.get("www-authenticate");
|
|
193
|
+
const paymentRequiredHeader = challengeRes.headers.get("payment-required");
|
|
194
|
+
if (!wwwAuth && !paymentRequiredHeader) {
|
|
195
|
+
return {
|
|
196
|
+
content: [
|
|
197
|
+
{
|
|
198
|
+
type: "text",
|
|
199
|
+
text: "Received 402 but no payment challenge headers. The payment protocol may have changed.",
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
// Step 3: Choose protocol and complete payment
|
|
205
|
+
let paymentAuthHeader;
|
|
206
|
+
let paymentAuthKey;
|
|
207
|
+
let usedProtocol;
|
|
208
|
+
// Prefer x402 if Solana key is available and server supports it
|
|
209
|
+
if (paymentRequiredHeader && SOLANA_PRIVATE_KEY) {
|
|
210
|
+
try {
|
|
211
|
+
const x402Token = await completeX402Payment(paymentRequiredHeader, SOLANA_PRIVATE_KEY);
|
|
212
|
+
paymentAuthHeader = x402Token;
|
|
213
|
+
paymentAuthKey = "X-Payment";
|
|
214
|
+
usedProtocol = "USDC (x402)";
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
// Fall back to Tempo if x402 fails and Tempo key is available
|
|
218
|
+
if (wwwAuth && PRIVATE_KEY) {
|
|
219
|
+
const challengeParams = parseWwwAuthenticate(wwwAuth);
|
|
220
|
+
if (!challengeParams.scheme) {
|
|
221
|
+
return { content: [{ type: "text", text: `x402 payment failed and could not parse Tempo challenge.` }] };
|
|
222
|
+
}
|
|
223
|
+
paymentAuthHeader = await completeTempoPayment(challengeParams.params, PRIVATE_KEY);
|
|
224
|
+
paymentAuthKey = "Authorization";
|
|
225
|
+
paymentAuthHeader = `Payment ${paymentAuthHeader}`;
|
|
226
|
+
usedProtocol = "pathUSD (Tempo)";
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
return {
|
|
230
|
+
content: [
|
|
231
|
+
{
|
|
232
|
+
type: "text",
|
|
233
|
+
text: [
|
|
234
|
+
`**x402 payment failed** for ${info.data.name} ($${price}):`,
|
|
235
|
+
"",
|
|
236
|
+
err instanceof Error ? err.message : String(err),
|
|
237
|
+
"",
|
|
238
|
+
"Ensure your Solana wallet has sufficient USDC balance.",
|
|
239
|
+
].join("\n"),
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else if (wwwAuth && PRIVATE_KEY) {
|
|
247
|
+
const challengeParams = parseWwwAuthenticate(wwwAuth);
|
|
248
|
+
if (!challengeParams.scheme || !challengeParams.params) {
|
|
249
|
+
return { content: [{ type: "text", text: `Could not parse payment challenge. WWW-Authenticate: ${wwwAuth}` }] };
|
|
250
|
+
}
|
|
251
|
+
try {
|
|
252
|
+
const token = await completeTempoPayment(challengeParams.params, PRIVATE_KEY);
|
|
253
|
+
paymentAuthHeader = `Payment ${token}`;
|
|
254
|
+
paymentAuthKey = "Authorization";
|
|
255
|
+
usedProtocol = "pathUSD (Tempo)";
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
return {
|
|
259
|
+
content: [
|
|
260
|
+
{
|
|
261
|
+
type: "text",
|
|
262
|
+
text: [
|
|
263
|
+
`**Tempo payment failed** for ${info.data.name} ($${price}):`,
|
|
264
|
+
"",
|
|
265
|
+
err instanceof Error ? err.message : String(err),
|
|
266
|
+
"",
|
|
267
|
+
"Ensure your wallet has sufficient pathUSD balance on Tempo.",
|
|
268
|
+
].join("\n"),
|
|
269
|
+
},
|
|
270
|
+
],
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
const available = [wwwAuth ? "Tempo (pathUSD)" : null, paymentRequiredHeader ? "x402 (USDC)" : null].filter(Boolean).join(", ");
|
|
276
|
+
const configured = [PRIVATE_KEY ? "Tempo" : null, SOLANA_PRIVATE_KEY ? "x402" : null].filter(Boolean).join(", ");
|
|
277
|
+
return {
|
|
278
|
+
content: [
|
|
279
|
+
{
|
|
280
|
+
type: "text",
|
|
281
|
+
text: `No compatible payment method. Server offers: ${available}. You have keys for: ${configured || "none"}.`,
|
|
282
|
+
},
|
|
283
|
+
],
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
// Step 4: Retry with payment receipt
|
|
287
|
+
const authedRes = await fetch(proxyUrl.toString(), {
|
|
288
|
+
method,
|
|
289
|
+
headers: {
|
|
290
|
+
...headers,
|
|
291
|
+
[paymentAuthKey]: paymentAuthHeader,
|
|
292
|
+
},
|
|
293
|
+
body: method !== "GET" ? body : undefined,
|
|
294
|
+
});
|
|
295
|
+
const responseText = await authedRes.text();
|
|
296
|
+
let formatted;
|
|
297
|
+
try {
|
|
298
|
+
formatted = JSON.stringify(JSON.parse(responseText), null, 2);
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
formatted = responseText;
|
|
302
|
+
}
|
|
303
|
+
return {
|
|
304
|
+
content: [
|
|
305
|
+
{
|
|
306
|
+
type: "text",
|
|
307
|
+
text: [
|
|
308
|
+
`**${info.data.name}** — HTTP ${authedRes.status} (paid $${price} via ${usedProtocol})`,
|
|
309
|
+
"",
|
|
310
|
+
"```json",
|
|
311
|
+
formatted,
|
|
312
|
+
"```",
|
|
313
|
+
].join("\n"),
|
|
314
|
+
},
|
|
315
|
+
],
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
catch (err) {
|
|
319
|
+
return {
|
|
320
|
+
content: [
|
|
321
|
+
{
|
|
322
|
+
type: "text",
|
|
323
|
+
text: `Request failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
324
|
+
},
|
|
325
|
+
],
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
});
|
|
329
|
+
// ── Tool 3: get_solana_token_intelligence ──
|
|
330
|
+
server.tool("get_solana_token_intelligence", "Get comprehensive Solana token intelligence including alpha score (0-100), rug risk assessment, whale activity tracking, smart money signals, 24h pump probability, projected ROI ranges, and real-time market data from DexScreener, Jupiter, and CoinGecko. Accepts any token address or ticker symbol. M32 token holders receive up to 40% discount.", {
|
|
331
|
+
token: z
|
|
332
|
+
.string()
|
|
333
|
+
.describe("Solana token mint address or ticker symbol (e.g. SOL, BONK, JUP, or full base58 address)"),
|
|
334
|
+
walletAddress: z
|
|
335
|
+
.string()
|
|
336
|
+
.optional()
|
|
337
|
+
.describe("Optional Solana wallet address for M32 token holder discount verification"),
|
|
338
|
+
}, async ({ token, walletAddress }) => {
|
|
339
|
+
try {
|
|
340
|
+
const headers = {
|
|
341
|
+
"Content-Type": "application/json",
|
|
342
|
+
};
|
|
343
|
+
if (walletAddress) {
|
|
344
|
+
headers["X-Wallet-Address"] = walletAddress;
|
|
345
|
+
}
|
|
346
|
+
// First request to get the 402 challenge
|
|
347
|
+
const challengeRes = await fetch(`${API_URL}/api/intelligence`, {
|
|
348
|
+
method: "POST",
|
|
349
|
+
headers,
|
|
350
|
+
body: JSON.stringify({ token }),
|
|
351
|
+
});
|
|
352
|
+
if (challengeRes.status !== 402) {
|
|
353
|
+
const text = await challengeRes.text();
|
|
354
|
+
let formatted;
|
|
355
|
+
try {
|
|
356
|
+
formatted = JSON.stringify(JSON.parse(text), null, 2);
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
formatted = text;
|
|
360
|
+
}
|
|
361
|
+
if (challengeRes.ok) {
|
|
362
|
+
return {
|
|
363
|
+
content: [
|
|
364
|
+
{
|
|
365
|
+
type: "text",
|
|
366
|
+
text: `**Solana Token Intelligence** for \`${token}\`:\n\n\`\`\`json\n${formatted}\n\`\`\``,
|
|
367
|
+
},
|
|
368
|
+
],
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
return {
|
|
372
|
+
content: [
|
|
373
|
+
{
|
|
374
|
+
type: "text",
|
|
375
|
+
text: `Error: HTTP ${challengeRes.status}\n\n${formatted}`,
|
|
376
|
+
},
|
|
377
|
+
],
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
// Handle payment
|
|
381
|
+
const wwwAuth = challengeRes.headers.get("www-authenticate");
|
|
382
|
+
const paymentRequired = challengeRes.headers.get("payment-required");
|
|
383
|
+
if (!PRIVATE_KEY && !SOLANA_PRIVATE_KEY) {
|
|
384
|
+
return {
|
|
385
|
+
content: [
|
|
386
|
+
{
|
|
387
|
+
type: "text",
|
|
388
|
+
text: "Payment required ($0.008 per query). Set MPP32_PRIVATE_KEY or MPP32_SOLANA_PRIVATE_KEY in your MCP config to enable automatic payments.",
|
|
389
|
+
},
|
|
390
|
+
],
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
let paymentHeaders = {};
|
|
394
|
+
if (paymentRequired && SOLANA_PRIVATE_KEY) {
|
|
395
|
+
try {
|
|
396
|
+
const x402Token = await completeX402Payment(paymentRequired, SOLANA_PRIVATE_KEY);
|
|
397
|
+
paymentHeaders["X-Payment"] = x402Token;
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
if (wwwAuth && PRIVATE_KEY) {
|
|
401
|
+
const challenge = parseWwwAuthenticate(wwwAuth);
|
|
402
|
+
const tempoToken = await completeTempoPayment(challenge.params, PRIVATE_KEY);
|
|
403
|
+
paymentHeaders["Authorization"] = `Payment ${tempoToken}`;
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
return {
|
|
407
|
+
content: [{ type: "text", text: "Payment failed. Check your wallet balance." }],
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
else if (wwwAuth && PRIVATE_KEY) {
|
|
413
|
+
const challenge = parseWwwAuthenticate(wwwAuth);
|
|
414
|
+
const tempoToken = await completeTempoPayment(challenge.params, PRIVATE_KEY);
|
|
415
|
+
paymentHeaders["Authorization"] = `Payment ${tempoToken}`;
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
return {
|
|
419
|
+
content: [{ type: "text", text: "No compatible payment key configured for available protocols." }],
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
const paidRes = await fetch(`${API_URL}/api/intelligence`, {
|
|
423
|
+
method: "POST",
|
|
424
|
+
headers: { ...headers, ...paymentHeaders },
|
|
425
|
+
body: JSON.stringify({ token }),
|
|
426
|
+
});
|
|
427
|
+
const text = await paidRes.text();
|
|
428
|
+
let formatted;
|
|
429
|
+
try {
|
|
430
|
+
formatted = JSON.stringify(JSON.parse(text), null, 2);
|
|
431
|
+
}
|
|
432
|
+
catch {
|
|
433
|
+
formatted = text;
|
|
434
|
+
}
|
|
435
|
+
const discount = paidRes.headers.get("X-M32-Discount");
|
|
436
|
+
const discountNote = discount && discount !== "0" ? ` (${discount}% M32 holder discount applied)` : "";
|
|
437
|
+
return {
|
|
438
|
+
content: [
|
|
439
|
+
{
|
|
440
|
+
type: "text",
|
|
441
|
+
text: `**Solana Token Intelligence** for \`${token}\`${discountNote}:\n\n\`\`\`json\n${formatted}\n\`\`\``,
|
|
442
|
+
},
|
|
443
|
+
],
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
catch (err) {
|
|
447
|
+
return {
|
|
448
|
+
content: [
|
|
449
|
+
{
|
|
450
|
+
type: "text",
|
|
451
|
+
text: `Failed to get token intelligence: ${err instanceof Error ? err.message : String(err)}`,
|
|
452
|
+
},
|
|
453
|
+
],
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
function parseWwwAuthenticate(header) {
|
|
458
|
+
const match = header.match(/^(\w+)\s+(.+)$/);
|
|
459
|
+
if (!match)
|
|
460
|
+
return { scheme: null, params: {} };
|
|
461
|
+
const scheme = match[1];
|
|
462
|
+
const rest = match[2];
|
|
463
|
+
const params = {};
|
|
464
|
+
const paramRegex = /(\w+)=(?:"([^"]*)"|([\w.+/=-]+))/g;
|
|
465
|
+
let m;
|
|
466
|
+
while ((m = paramRegex.exec(rest)) !== null) {
|
|
467
|
+
params[m[1]] = m[2] ?? m[3];
|
|
468
|
+
}
|
|
469
|
+
return { scheme, params };
|
|
470
|
+
}
|
|
471
|
+
async function completeTempoPayment(challengeParams, privateKey) {
|
|
472
|
+
// The Tempo payment flow:
|
|
473
|
+
// 1. Parse amount, currency, recipient, nonce from challenge
|
|
474
|
+
// 2. Sign a payment authorization with the private key
|
|
475
|
+
// 3. Return the signed token for the Authorization header
|
|
476
|
+
// Dynamic import — mppx and viem are optional peer dependencies
|
|
477
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
478
|
+
let mppxClient;
|
|
479
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
480
|
+
let viemAccounts;
|
|
481
|
+
try {
|
|
482
|
+
const mppxPkg = "mppx/client";
|
|
483
|
+
const viemPkg = "viem/accounts";
|
|
484
|
+
mppxClient = await import(mppxPkg);
|
|
485
|
+
viemAccounts = await import(viemPkg);
|
|
486
|
+
}
|
|
487
|
+
catch {
|
|
488
|
+
throw new Error("Payment client not available. Install mppx and viem as peer dependencies:\n npm install mppx viem");
|
|
489
|
+
}
|
|
490
|
+
try {
|
|
491
|
+
const account = viemAccounts.privateKeyToAccount(privateKey.startsWith("0x") ? privateKey : `0x${privateKey}`);
|
|
492
|
+
const client = mppxClient.Mppx.create({
|
|
493
|
+
methods: [mppxClient.tempo({ account })],
|
|
494
|
+
});
|
|
495
|
+
const token = await client.pay(challengeParams);
|
|
496
|
+
return token;
|
|
497
|
+
}
|
|
498
|
+
catch (payErr) {
|
|
499
|
+
throw new Error(`Payment failed: ${payErr instanceof Error ? payErr.message : String(payErr)}`);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
async function completeX402Payment(paymentRequiredHeader, solanaPrivateKey) {
|
|
503
|
+
let requirements;
|
|
504
|
+
try {
|
|
505
|
+
requirements = JSON.parse(Buffer.from(paymentRequiredHeader, "base64").toString("utf-8"));
|
|
506
|
+
}
|
|
507
|
+
catch {
|
|
508
|
+
throw new Error("Could not decode Payment-Required header");
|
|
509
|
+
}
|
|
510
|
+
// Build x402 payment payload with the Solana key
|
|
511
|
+
// Dynamic import for optional dependency
|
|
512
|
+
let solanaWeb3;
|
|
513
|
+
try {
|
|
514
|
+
const pkg = "@solana/web3.js";
|
|
515
|
+
solanaWeb3 = await import(pkg);
|
|
516
|
+
}
|
|
517
|
+
catch {
|
|
518
|
+
throw new Error("x402 payment requires @solana/web3.js:\n npm install @solana/web3.js");
|
|
519
|
+
}
|
|
520
|
+
let keypair;
|
|
521
|
+
try {
|
|
522
|
+
if (solanaPrivateKey.startsWith("[")) {
|
|
523
|
+
keypair = solanaWeb3.Keypair.fromSecretKey(new Uint8Array(JSON.parse(solanaPrivateKey)));
|
|
524
|
+
}
|
|
525
|
+
else if (/^[0-9a-fA-F]+$/.test(solanaPrivateKey)) {
|
|
526
|
+
keypair = solanaWeb3.Keypair.fromSecretKey(new Uint8Array(Buffer.from(solanaPrivateKey, "hex")));
|
|
527
|
+
}
|
|
528
|
+
else {
|
|
529
|
+
const bs58Pkg = "bs58";
|
|
530
|
+
const bs58 = await import(bs58Pkg);
|
|
531
|
+
keypair = solanaWeb3.Keypair.fromSecretKey(bs58.default.decode(solanaPrivateKey));
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
catch (err) {
|
|
535
|
+
throw new Error(`Could not decode Solana private key: ${err instanceof Error ? err.message : String(err)}`);
|
|
536
|
+
}
|
|
537
|
+
const payload = {
|
|
538
|
+
x402Version: 1,
|
|
539
|
+
scheme: requirements.scheme ?? "exact",
|
|
540
|
+
network: requirements.network ?? "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
|
|
541
|
+
payload: {
|
|
542
|
+
signature: "",
|
|
543
|
+
from: keypair.publicKey.toBase58(),
|
|
544
|
+
amount: requirements.maxAmountRequired,
|
|
545
|
+
asset: requirements.asset,
|
|
546
|
+
payTo: requirements.payTo,
|
|
547
|
+
nonce: Date.now().toString(),
|
|
548
|
+
},
|
|
549
|
+
};
|
|
550
|
+
const message = JSON.stringify(payload.payload);
|
|
551
|
+
const messageBytes = new TextEncoder().encode(message);
|
|
552
|
+
let tweetnacl;
|
|
553
|
+
try {
|
|
554
|
+
const pkg = "tweetnacl";
|
|
555
|
+
tweetnacl = await import(pkg);
|
|
556
|
+
}
|
|
557
|
+
catch {
|
|
558
|
+
throw new Error("x402 signing requires tweetnacl:\n npm install tweetnacl");
|
|
559
|
+
}
|
|
560
|
+
const naclSign = tweetnacl.default?.sign ?? tweetnacl.sign;
|
|
561
|
+
const signed = naclSign.detached(messageBytes, keypair.secretKey);
|
|
562
|
+
payload.payload.signature = Buffer.from(signed).toString("base64");
|
|
563
|
+
return Buffer.from(JSON.stringify(payload)).toString("base64");
|
|
564
|
+
}
|
|
565
|
+
// ── Start ──
|
|
566
|
+
async function main() {
|
|
567
|
+
const transport = new StdioServerTransport();
|
|
568
|
+
await server.connect(transport);
|
|
569
|
+
console.error("MPP32 MCP server running on stdio");
|
|
570
|
+
}
|
|
571
|
+
main().catch((err) => {
|
|
572
|
+
console.error("Fatal:", err);
|
|
573
|
+
process.exit(1);
|
|
574
|
+
});
|
|
575
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mpp32-mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for MPP32 — Universal Payment Proxy for Machine-Payable APIs. Lets AI agents discover, pay for, and call APIs across 5 payment protocols.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"mpp32-mcp-server": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"start": "node dist/index.js",
|
|
17
|
+
"dev": "tsc --watch",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"mcp",
|
|
22
|
+
"mcp-server",
|
|
23
|
+
"model-context-protocol",
|
|
24
|
+
"mpp",
|
|
25
|
+
"mpp32",
|
|
26
|
+
"machine-payments",
|
|
27
|
+
"ai-agents",
|
|
28
|
+
"agent-payments",
|
|
29
|
+
"micropayments",
|
|
30
|
+
"solana",
|
|
31
|
+
"usdc",
|
|
32
|
+
"x402",
|
|
33
|
+
"tempo",
|
|
34
|
+
"acp",
|
|
35
|
+
"agent-commerce",
|
|
36
|
+
"claude",
|
|
37
|
+
"openai",
|
|
38
|
+
"llm",
|
|
39
|
+
"autonomous-agents",
|
|
40
|
+
"crypto",
|
|
41
|
+
"defi",
|
|
42
|
+
"token-intelligence",
|
|
43
|
+
"api-marketplace"
|
|
44
|
+
],
|
|
45
|
+
"license": "MIT",
|
|
46
|
+
"author": "MPP32 <admin@mpp32.org> (https://mpp32.org)",
|
|
47
|
+
"homepage": "https://mpp32.org",
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "https://github.com/MPP32/MPP32"
|
|
51
|
+
},
|
|
52
|
+
"bugs": {
|
|
53
|
+
"url": "https://github.com/MPP32/MPP32/issues"
|
|
54
|
+
},
|
|
55
|
+
"engines": {
|
|
56
|
+
"node": ">=18.0.0"
|
|
57
|
+
},
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
60
|
+
"zod": "^3.23.0"
|
|
61
|
+
},
|
|
62
|
+
"peerDependencies": {
|
|
63
|
+
"mppx": ">=0.4.0",
|
|
64
|
+
"viem": ">=2.0.0"
|
|
65
|
+
},
|
|
66
|
+
"peerDependenciesMeta": {
|
|
67
|
+
"mppx": {
|
|
68
|
+
"optional": true
|
|
69
|
+
},
|
|
70
|
+
"viem": {
|
|
71
|
+
"optional": true
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"@types/node": "^22.0.0",
|
|
76
|
+
"typescript": "^5.7.0"
|
|
77
|
+
}
|
|
78
|
+
}
|