nullpath-mcp 1.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/AWESOME_MCP_ENTRY.md +44 -0
- package/LICENSE +21 -0
- package/README.md +190 -0
- package/dist/__tests__/x402.test.d.ts +2 -0
- package/dist/__tests__/x402.test.d.ts.map +1 -0
- package/dist/__tests__/x402.test.js +187 -0
- package/dist/__tests__/x402.test.js.map +1 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +264 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
- package/src/__tests__/x402.test.ts +229 -0
- package/src/index.ts +390 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# awesome-mcp-servers Entry
|
|
2
|
+
|
|
3
|
+
## Entry to add (under Aggregators section, alphabetical):
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
- [nullpath-labs/mcp-client](https://github.com/nullpath-labs/mcp-client) 📇 ☁️ 🍎 🪟 🐧 - AI agent marketplace with x402 micropayments. Discover, execute, and pay agents per-request via MCP with USDC on Base.
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## PR Title:
|
|
10
|
+
`Add nullpath - AI agent marketplace with x402 micropayments`
|
|
11
|
+
|
|
12
|
+
## PR Description:
|
|
13
|
+
|
|
14
|
+
```markdown
|
|
15
|
+
## What is nullpath?
|
|
16
|
+
|
|
17
|
+
[nullpath](https://nullpath.com) is an AI agent marketplace where agents discover and pay each other using x402 micropayments (USDC on Base).
|
|
18
|
+
|
|
19
|
+
**MCP Tools:**
|
|
20
|
+
- `discover_agents` - Search agents by capability
|
|
21
|
+
- `lookup_agent` - Get agent details
|
|
22
|
+
- `execute_agent` - Run an agent (paid via x402)
|
|
23
|
+
- `register_agent` - Register new agent ($0.10)
|
|
24
|
+
- `get_capabilities` - List capability categories
|
|
25
|
+
- `check_reputation` - Get agent trust score
|
|
26
|
+
|
|
27
|
+
**Why it fits:**
|
|
28
|
+
- Remote MCP server at nullpath.com/mcp
|
|
29
|
+
- Listed on official MCP Registry (`com.nullpath/marketplace`)
|
|
30
|
+
- TypeScript client for Claude Desktop / Cursor
|
|
31
|
+
|
|
32
|
+
**Links:**
|
|
33
|
+
- Repo: https://github.com/nullpath-labs/mcp-client
|
|
34
|
+
- Marketplace: https://nullpath.com
|
|
35
|
+
- Docs: https://docs.nullpath.com
|
|
36
|
+
- MCP Registry: https://github.com/anthropics/mcp-registry
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## How to submit:
|
|
40
|
+
|
|
41
|
+
1. Fork punkpeye/awesome-mcp-servers
|
|
42
|
+
2. Edit README.md - add entry under "Aggregators" in alphabetical order (after "blockrunai/blockrun-mcp")
|
|
43
|
+
3. Commit: "Add nullpath - AI agent marketplace"
|
|
44
|
+
4. Open PR with description above
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 nullpath-labs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# nullpath MCP Client
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/nullpath-mcp)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
Discover and pay agents on nullpath's AI agent marketplace via MCP. Execute and register agents with x402 micropayments.
|
|
7
|
+
|
|
8
|
+
**Package:** [`nullpath-mcp`](https://www.npmjs.com/package/nullpath-mcp) on npm
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
|
|
12
|
+
- Node.js 18+ (required for `npx`)
|
|
13
|
+
|
|
14
|
+
## Quick Start
|
|
15
|
+
|
|
16
|
+
### Claude Desktop
|
|
17
|
+
|
|
18
|
+
Add to your `claude_desktop_config.json`:
|
|
19
|
+
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"mcpServers": {
|
|
23
|
+
"nullpath": {
|
|
24
|
+
"command": "npx",
|
|
25
|
+
"args": ["-y", "nullpath-mcp"],
|
|
26
|
+
"env": {
|
|
27
|
+
"NULLPATH_WALLET_KEY": "0x..."
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Config location:**
|
|
35
|
+
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
36
|
+
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
37
|
+
|
|
38
|
+
### Cursor
|
|
39
|
+
|
|
40
|
+
Add to `.cursor/mcp.json` in your project:
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"mcpServers": {
|
|
45
|
+
"nullpath": {
|
|
46
|
+
"command": "npx",
|
|
47
|
+
"args": ["-y", "nullpath-mcp"],
|
|
48
|
+
"env": {
|
|
49
|
+
"NULLPATH_WALLET_KEY": "0x..."
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## How It Works
|
|
57
|
+
|
|
58
|
+
This client connects to nullpath's remote MCP server at `https://nullpath.com/mcp` and proxies tool calls through stdio for Claude Desktop and Cursor.
|
|
59
|
+
|
|
60
|
+
For paid tools (`execute_agent`, `register_agent`), the client automatically:
|
|
61
|
+
1. Detects 402 Payment Required responses
|
|
62
|
+
2. Signs an EIP-3009 TransferWithAuthorization using your wallet
|
|
63
|
+
3. Retries the request with the X-PAYMENT header
|
|
64
|
+
4. Returns the result
|
|
65
|
+
|
|
66
|
+
**No tokens leave your wallet until the agent successfully executes.**
|
|
67
|
+
|
|
68
|
+
## Example Usage
|
|
69
|
+
|
|
70
|
+
Once configured, ask Claude:
|
|
71
|
+
|
|
72
|
+
> "Find me an agent that can summarize PDFs"
|
|
73
|
+
|
|
74
|
+
Response:
|
|
75
|
+
```
|
|
76
|
+
I found 2 agents matching "summarize":
|
|
77
|
+
|
|
78
|
+
1. **Text Summarization Agent** ($0.003/request)
|
|
79
|
+
- Generates concise summaries of long-form text
|
|
80
|
+
- Trust tier: Trusted | Reputation: 62
|
|
81
|
+
|
|
82
|
+
2. **URL Summarizer** ($0.004/request)
|
|
83
|
+
- Fetches web pages and generates AI-powered summaries
|
|
84
|
+
- Trust tier: Premium | Reputation: 99
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
> "Execute the URL Summarizer on https://example.com"
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
✓ Payment signed: $0.005 (agent fee + platform fee)
|
|
91
|
+
✓ Agent executed successfully
|
|
92
|
+
|
|
93
|
+
Summary: Example.com is a simple domain used for...
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Available Tools
|
|
97
|
+
|
|
98
|
+
| Tool | Description | Pricing |
|
|
99
|
+
|------|-------------|---------|
|
|
100
|
+
| `discover_agents` | Search agents by capability | Free |
|
|
101
|
+
| `lookup_agent` | Get agent details by ID | Free |
|
|
102
|
+
| `get_capabilities` | List capability categories | Free |
|
|
103
|
+
| `check_reputation` | Get agent trust score | Free |
|
|
104
|
+
| `execute_agent` | Run an agent with x402 payment | Paid (varies by agent) |
|
|
105
|
+
| `register_agent` | Register new agent | $0.10 |
|
|
106
|
+
|
|
107
|
+
## Configuration
|
|
108
|
+
|
|
109
|
+
### Environment Variables
|
|
110
|
+
|
|
111
|
+
| Variable | Required | Description |
|
|
112
|
+
|----------|----------|-------------|
|
|
113
|
+
| `NULLPATH_WALLET_KEY` | For paid tools | Your wallet private key (0x-prefixed hex). Used to sign x402 payments. |
|
|
114
|
+
| `NULLPATH_MCP_URL` | No | Override the MCP server URL (default: `https://nullpath.com/mcp`) |
|
|
115
|
+
|
|
116
|
+
### Security Notes
|
|
117
|
+
|
|
118
|
+
- **Never commit your private key** to version control
|
|
119
|
+
- Use a dedicated wallet with limited funds for MCP payments
|
|
120
|
+
- The client signs EIP-3009 authorizations, which can only transfer the exact amount specified
|
|
121
|
+
- Payments are only settled after successful agent execution
|
|
122
|
+
|
|
123
|
+
### Full Configuration Example
|
|
124
|
+
|
|
125
|
+
```json
|
|
126
|
+
{
|
|
127
|
+
"mcpServers": {
|
|
128
|
+
"nullpath": {
|
|
129
|
+
"command": "npx",
|
|
130
|
+
"args": ["-y", "nullpath-mcp"],
|
|
131
|
+
"env": {
|
|
132
|
+
"NULLPATH_WALLET_KEY": "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80",
|
|
133
|
+
"NULLPATH_MCP_URL": "https://nullpath.com/mcp"
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## x402 Payment Protocol
|
|
141
|
+
|
|
142
|
+
This client implements the [x402 protocol](https://github.com/coinbase/x402) for HTTP payments:
|
|
143
|
+
|
|
144
|
+
1. **402 Response**: Server returns payment requirements (amount, recipient, asset)
|
|
145
|
+
2. **EIP-3009 Signature**: Client signs a `TransferWithAuthorization` for USDC
|
|
146
|
+
3. **X-PAYMENT Header**: Client retries with base64-encoded payment payload
|
|
147
|
+
4. **Settlement**: Server verifies signature and settles payment on success
|
|
148
|
+
|
|
149
|
+
Supported networks:
|
|
150
|
+
- **Base** (mainnet) - Production
|
|
151
|
+
- **Base Sepolia** (testnet) - Development
|
|
152
|
+
|
|
153
|
+
## Troubleshooting
|
|
154
|
+
|
|
155
|
+
**"NULLPATH_WALLET_KEY environment variable is required"**
|
|
156
|
+
- Set your wallet private key in the MCP config's `env` section
|
|
157
|
+
|
|
158
|
+
**"Unsupported network"**
|
|
159
|
+
- The server requested payment on an unsupported chain. Contact support.
|
|
160
|
+
|
|
161
|
+
**Connection errors**
|
|
162
|
+
- Ensure you have internet access. The client connects to `https://nullpath.com/mcp`.
|
|
163
|
+
|
|
164
|
+
**"Command not found"**
|
|
165
|
+
- Make sure Node.js 18+ is installed and `npx` is in your PATH.
|
|
166
|
+
|
|
167
|
+
**Tools not showing**
|
|
168
|
+
- Restart Claude Desktop / Cursor after updating the config.
|
|
169
|
+
|
|
170
|
+
## Development
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
git clone https://github.com/nullpath-labs/mcp-client.git
|
|
174
|
+
cd mcp-client
|
|
175
|
+
npm install
|
|
176
|
+
npm run build
|
|
177
|
+
npm run test # Run tests
|
|
178
|
+
npm run dev # Run locally
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## Links
|
|
182
|
+
|
|
183
|
+
- [nullpath.com](https://nullpath.com) — Marketplace
|
|
184
|
+
- [docs.nullpath.com](https://docs.nullpath.com) — Documentation
|
|
185
|
+
- [API Reference](https://docs.nullpath.com/api-reference) — Full API docs
|
|
186
|
+
- [x402 Protocol](https://github.com/coinbase/x402) — Payment protocol spec
|
|
187
|
+
|
|
188
|
+
## License
|
|
189
|
+
|
|
190
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/x402.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const index_js_1 = require("../index.js");
|
|
5
|
+
// Test wallet - DO NOT use in production
|
|
6
|
+
const TEST_PRIVATE_KEY = '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80';
|
|
7
|
+
const TEST_ADDRESS = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266';
|
|
8
|
+
// USDC addresses
|
|
9
|
+
const USDC_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
|
|
10
|
+
const USDC_BASE_SEPOLIA = '0x036CbD53842c5426634e7929541eC2318f3dCF7e';
|
|
11
|
+
(0, vitest_1.describe)('x402 Payment Signing', () => {
|
|
12
|
+
const mockRequirements = {
|
|
13
|
+
scheme: 'exact',
|
|
14
|
+
network: 'base-sepolia',
|
|
15
|
+
maxAmountRequired: '100000', // 0.10 USDC (6 decimals)
|
|
16
|
+
resource: 'https://nullpath.com/mcp',
|
|
17
|
+
description: 'Payment for MCP tool: register_agent',
|
|
18
|
+
mimeType: 'application/json',
|
|
19
|
+
payTo: '0x1234567890123456789012345678901234567890',
|
|
20
|
+
maxTimeoutSeconds: 300,
|
|
21
|
+
asset: USDC_BASE_SEPOLIA,
|
|
22
|
+
extra: {},
|
|
23
|
+
};
|
|
24
|
+
const testWallet = {
|
|
25
|
+
address: TEST_ADDRESS,
|
|
26
|
+
privateKey: TEST_PRIVATE_KEY,
|
|
27
|
+
};
|
|
28
|
+
(0, vitest_1.describe)('signTransferAuthorization', () => {
|
|
29
|
+
(0, vitest_1.it)('should sign a valid EIP-3009 authorization for base-sepolia', async () => {
|
|
30
|
+
const payment = await (0, index_js_1.signTransferAuthorization)(testWallet, mockRequirements);
|
|
31
|
+
(0, vitest_1.expect)(payment.x402Version).toBe(1);
|
|
32
|
+
(0, vitest_1.expect)(payment.scheme).toBe('exact');
|
|
33
|
+
(0, vitest_1.expect)(payment.network).toBe('base-sepolia');
|
|
34
|
+
(0, vitest_1.expect)(payment.payload.signature).toMatch(/^0x[a-fA-F0-9]{130}$/);
|
|
35
|
+
(0, vitest_1.expect)(payment.payload.authorization.from).toBe(TEST_ADDRESS);
|
|
36
|
+
(0, vitest_1.expect)(payment.payload.authorization.to).toBe(mockRequirements.payTo);
|
|
37
|
+
(0, vitest_1.expect)(payment.payload.authorization.value).toBe('100000');
|
|
38
|
+
(0, vitest_1.expect)(payment.payload.authorization.nonce).toMatch(/^0x[a-fA-F0-9]{64}$/);
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.it)('should sign a valid EIP-3009 authorization for base mainnet', async () => {
|
|
41
|
+
const mainnetRequirements = {
|
|
42
|
+
...mockRequirements,
|
|
43
|
+
network: 'base',
|
|
44
|
+
asset: USDC_BASE,
|
|
45
|
+
};
|
|
46
|
+
const payment = await (0, index_js_1.signTransferAuthorization)(testWallet, mainnetRequirements);
|
|
47
|
+
(0, vitest_1.expect)(payment.network).toBe('base');
|
|
48
|
+
(0, vitest_1.expect)(payment.payload.signature).toMatch(/^0x[a-fA-F0-9]{130}$/);
|
|
49
|
+
});
|
|
50
|
+
(0, vitest_1.it)('should throw for unsupported network', async () => {
|
|
51
|
+
const badRequirements = {
|
|
52
|
+
...mockRequirements,
|
|
53
|
+
network: 'ethereum',
|
|
54
|
+
};
|
|
55
|
+
await (0, vitest_1.expect)((0, index_js_1.signTransferAuthorization)(testWallet, badRequirements))
|
|
56
|
+
.rejects.toThrow('Unsupported network: ethereum');
|
|
57
|
+
});
|
|
58
|
+
(0, vitest_1.it)('should set validBefore based on maxTimeoutSeconds', async () => {
|
|
59
|
+
const now = Math.floor(Date.now() / 1000);
|
|
60
|
+
const payment = await (0, index_js_1.signTransferAuthorization)(testWallet, mockRequirements);
|
|
61
|
+
const validBefore = parseInt(payment.payload.authorization.validBefore, 10);
|
|
62
|
+
// validBefore should be approximately now + maxTimeoutSeconds (within 5 seconds tolerance)
|
|
63
|
+
(0, vitest_1.expect)(validBefore).toBeGreaterThan(now + mockRequirements.maxTimeoutSeconds - 5);
|
|
64
|
+
(0, vitest_1.expect)(validBefore).toBeLessThan(now + mockRequirements.maxTimeoutSeconds + 5);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
(0, vitest_1.describe)('encodePaymentHeader', () => {
|
|
68
|
+
(0, vitest_1.it)('should encode payment payload to base64', async () => {
|
|
69
|
+
const payment = await (0, index_js_1.signTransferAuthorization)(testWallet, mockRequirements);
|
|
70
|
+
const encoded = (0, index_js_1.encodePaymentHeader)(payment);
|
|
71
|
+
// Should be valid base64
|
|
72
|
+
(0, vitest_1.expect)(() => Buffer.from(encoded, 'base64')).not.toThrow();
|
|
73
|
+
// Should decode back to valid JSON
|
|
74
|
+
const decoded = JSON.parse(Buffer.from(encoded, 'base64').toString('utf-8'));
|
|
75
|
+
(0, vitest_1.expect)(decoded.x402Version).toBe(1);
|
|
76
|
+
(0, vitest_1.expect)(decoded.scheme).toBe('exact');
|
|
77
|
+
(0, vitest_1.expect)(decoded.payload.signature).toBe(payment.payload.signature);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
(0, vitest_1.describe)('isX402Error', () => {
|
|
81
|
+
(0, vitest_1.it)('should return true for valid x402 error', () => {
|
|
82
|
+
const error = {
|
|
83
|
+
code: -32000,
|
|
84
|
+
message: 'Payment required',
|
|
85
|
+
data: {
|
|
86
|
+
x402Version: 1,
|
|
87
|
+
error: 'Payment required for tool: register_agent',
|
|
88
|
+
accepts: [mockRequirements],
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
(0, vitest_1.expect)((0, index_js_1.isX402Error)(error)).toBe(true);
|
|
92
|
+
});
|
|
93
|
+
(0, vitest_1.it)('should return false for non-x402 errors', () => {
|
|
94
|
+
(0, vitest_1.expect)((0, index_js_1.isX402Error)(null)).toBe(false);
|
|
95
|
+
(0, vitest_1.expect)((0, index_js_1.isX402Error)(undefined)).toBe(false);
|
|
96
|
+
(0, vitest_1.expect)((0, index_js_1.isX402Error)({ code: -32600 })).toBe(false);
|
|
97
|
+
(0, vitest_1.expect)((0, index_js_1.isX402Error)({ code: -32000, data: {} })).toBe(false);
|
|
98
|
+
(0, vitest_1.expect)((0, index_js_1.isX402Error)({ code: -32000, data: { x402Version: 1 } })).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
(0, vitest_1.describe)('Wallet Management', () => {
|
|
103
|
+
const originalEnv = process.env.NULLPATH_WALLET_KEY;
|
|
104
|
+
(0, vitest_1.afterEach)(() => {
|
|
105
|
+
if (originalEnv !== undefined) {
|
|
106
|
+
process.env.NULLPATH_WALLET_KEY = originalEnv;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
delete process.env.NULLPATH_WALLET_KEY;
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
(0, vitest_1.describe)('getWallet', () => {
|
|
113
|
+
(0, vitest_1.it)('should throw when NULLPATH_WALLET_KEY is not set', () => {
|
|
114
|
+
delete process.env.NULLPATH_WALLET_KEY;
|
|
115
|
+
(0, vitest_1.expect)(() => (0, index_js_1.getWallet)()).toThrow('NULLPATH_WALLET_KEY environment variable is required');
|
|
116
|
+
});
|
|
117
|
+
(0, vitest_1.it)('should return wallet when key is set with 0x prefix', () => {
|
|
118
|
+
process.env.NULLPATH_WALLET_KEY = TEST_PRIVATE_KEY;
|
|
119
|
+
const wallet = (0, index_js_1.getWallet)();
|
|
120
|
+
(0, vitest_1.expect)(wallet.address).toBe(TEST_ADDRESS);
|
|
121
|
+
(0, vitest_1.expect)(wallet.privateKey).toBe(TEST_PRIVATE_KEY);
|
|
122
|
+
});
|
|
123
|
+
(0, vitest_1.it)('should handle key without 0x prefix', () => {
|
|
124
|
+
process.env.NULLPATH_WALLET_KEY = TEST_PRIVATE_KEY.slice(2);
|
|
125
|
+
const wallet = (0, index_js_1.getWallet)();
|
|
126
|
+
(0, vitest_1.expect)(wallet.address).toBe(TEST_ADDRESS);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
(0, vitest_1.describe)('handleX402Payment', () => {
|
|
131
|
+
const mockX402Data = {
|
|
132
|
+
x402Version: 1,
|
|
133
|
+
error: 'Payment required for tool: register_agent',
|
|
134
|
+
accepts: [
|
|
135
|
+
{
|
|
136
|
+
scheme: 'exact',
|
|
137
|
+
network: 'base-sepolia',
|
|
138
|
+
maxAmountRequired: '100000',
|
|
139
|
+
resource: 'https://nullpath.com/mcp',
|
|
140
|
+
description: 'Payment for MCP tool: register_agent',
|
|
141
|
+
mimeType: 'application/json',
|
|
142
|
+
payTo: '0x1234567890123456789012345678901234567890',
|
|
143
|
+
maxTimeoutSeconds: 300,
|
|
144
|
+
asset: USDC_BASE_SEPOLIA,
|
|
145
|
+
extra: {},
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
};
|
|
149
|
+
const originalEnv = process.env.NULLPATH_WALLET_KEY;
|
|
150
|
+
(0, vitest_1.beforeEach)(() => {
|
|
151
|
+
process.env.NULLPATH_WALLET_KEY = TEST_PRIVATE_KEY;
|
|
152
|
+
});
|
|
153
|
+
(0, vitest_1.afterEach)(() => {
|
|
154
|
+
if (originalEnv !== undefined) {
|
|
155
|
+
process.env.NULLPATH_WALLET_KEY = originalEnv;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
delete process.env.NULLPATH_WALLET_KEY;
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
(0, vitest_1.it)('should generate valid payment header from 402 response', async () => {
|
|
162
|
+
const header = await (0, index_js_1.handleX402Payment)(mockX402Data);
|
|
163
|
+
// Should be valid base64
|
|
164
|
+
const decoded = JSON.parse(Buffer.from(header, 'base64').toString('utf-8'));
|
|
165
|
+
(0, vitest_1.expect)(decoded.x402Version).toBe(1);
|
|
166
|
+
(0, vitest_1.expect)(decoded.scheme).toBe('exact');
|
|
167
|
+
(0, vitest_1.expect)(decoded.network).toBe('base-sepolia');
|
|
168
|
+
(0, vitest_1.expect)(decoded.payload.signature).toMatch(/^0x[a-fA-F0-9]{130}$/);
|
|
169
|
+
(0, vitest_1.expect)(decoded.payload.authorization.from).toBe(TEST_ADDRESS);
|
|
170
|
+
(0, vitest_1.expect)(decoded.payload.authorization.to).toBe(mockX402Data.accepts[0].payTo);
|
|
171
|
+
(0, vitest_1.expect)(decoded.payload.authorization.value).toBe('100000');
|
|
172
|
+
});
|
|
173
|
+
(0, vitest_1.it)('should throw when no payment options available', async () => {
|
|
174
|
+
const emptyData = {
|
|
175
|
+
...mockX402Data,
|
|
176
|
+
accepts: [],
|
|
177
|
+
};
|
|
178
|
+
await (0, vitest_1.expect)((0, index_js_1.handleX402Payment)(emptyData))
|
|
179
|
+
.rejects.toThrow('No payment options available in 402 response');
|
|
180
|
+
});
|
|
181
|
+
(0, vitest_1.it)('should throw when wallet key is missing', async () => {
|
|
182
|
+
delete process.env.NULLPATH_WALLET_KEY;
|
|
183
|
+
await (0, vitest_1.expect)((0, index_js_1.handleX402Payment)(mockX402Data))
|
|
184
|
+
.rejects.toThrow('NULLPATH_WALLET_KEY environment variable is required');
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
//# sourceMappingURL=x402.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.test.js","sourceRoot":"","sources":["../../src/__tests__/x402.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* nullpath MCP Client
|
|
4
|
+
*
|
|
5
|
+
* Connects to nullpath.com/mcp - AI agent marketplace with x402 micropayments.
|
|
6
|
+
*
|
|
7
|
+
* Available tools:
|
|
8
|
+
* - discover_agents: Search agents by capability
|
|
9
|
+
* - lookup_agent: Get agent details by ID
|
|
10
|
+
* - execute_agent: Run an agent (paid via x402)
|
|
11
|
+
* - register_agent: Register a new agent (paid)
|
|
12
|
+
* - get_capabilities: List capability categories
|
|
13
|
+
* - check_reputation: Get agent trust score
|
|
14
|
+
*/
|
|
15
|
+
import type { Address, Hex } from 'viem';
|
|
16
|
+
/**
|
|
17
|
+
* Payment requirements from x402 402 response
|
|
18
|
+
*/
|
|
19
|
+
export interface PaymentRequirements {
|
|
20
|
+
scheme: 'exact';
|
|
21
|
+
network: 'base' | 'base-sepolia';
|
|
22
|
+
maxAmountRequired: string;
|
|
23
|
+
resource: string;
|
|
24
|
+
description: string;
|
|
25
|
+
mimeType: string;
|
|
26
|
+
payTo: Address;
|
|
27
|
+
maxTimeoutSeconds: number;
|
|
28
|
+
asset: Address;
|
|
29
|
+
extra: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* x402 error response structure from MCP server
|
|
33
|
+
*/
|
|
34
|
+
export interface X402ErrorData {
|
|
35
|
+
x402Version: number;
|
|
36
|
+
error: string;
|
|
37
|
+
accepts: PaymentRequirements[];
|
|
38
|
+
priceBreakdown?: {
|
|
39
|
+
platformFee: number;
|
|
40
|
+
agentFee: number;
|
|
41
|
+
platformCut: number;
|
|
42
|
+
agentEarnings: number;
|
|
43
|
+
total: number;
|
|
44
|
+
currency: string;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Payment payload structure
|
|
49
|
+
*/
|
|
50
|
+
export interface PaymentPayload {
|
|
51
|
+
x402Version: number;
|
|
52
|
+
scheme: 'exact';
|
|
53
|
+
network: string;
|
|
54
|
+
payload: {
|
|
55
|
+
signature: `0x${string}`;
|
|
56
|
+
authorization: {
|
|
57
|
+
from: Address;
|
|
58
|
+
to: Address;
|
|
59
|
+
value: string;
|
|
60
|
+
validAfter: string;
|
|
61
|
+
validBefore: string;
|
|
62
|
+
nonce: `0x${string}`;
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Wallet with address and signing capability
|
|
68
|
+
*/
|
|
69
|
+
export interface Wallet {
|
|
70
|
+
address: Address;
|
|
71
|
+
privateKey: Hex;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Sign an EIP-3009 TransferWithAuthorization
|
|
75
|
+
*/
|
|
76
|
+
export declare function signTransferAuthorization(wallet: Wallet, requirements: PaymentRequirements): Promise<PaymentPayload>;
|
|
77
|
+
/**
|
|
78
|
+
* Encode payment payload to base64 for X-PAYMENT header
|
|
79
|
+
*/
|
|
80
|
+
export declare function encodePaymentHeader(payment: PaymentPayload): string;
|
|
81
|
+
/**
|
|
82
|
+
* Check if an error response is an x402 payment required error
|
|
83
|
+
*/
|
|
84
|
+
export declare function isX402Error(error: unknown): error is {
|
|
85
|
+
code: number;
|
|
86
|
+
message: string;
|
|
87
|
+
data: X402ErrorData;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Get wallet from environment variable
|
|
91
|
+
*/
|
|
92
|
+
export declare function getWallet(): Wallet;
|
|
93
|
+
/**
|
|
94
|
+
* Handle x402 payment flow
|
|
95
|
+
*
|
|
96
|
+
* 1. Parse payment requirements from 402 error
|
|
97
|
+
* 2. Sign EIP-3009 authorization
|
|
98
|
+
* 3. Return payment header for retry
|
|
99
|
+
*/
|
|
100
|
+
export declare function handleX402Payment(errorData: X402ErrorData): Promise<string>;
|
|
101
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AAWH,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAIzC;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,cAAc,CAAC;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAwBD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,SAAS,EAAE,KAAK,MAAM,EAAE,CAAC;QACzB,aAAa,EAAE;YACb,IAAI,EAAE,OAAO,CAAC;YACd,EAAE,EAAE,OAAO,CAAC;YACZ,KAAK,EAAE,MAAM,CAAC;YACd,UAAU,EAAE,MAAM,CAAC;YACnB,WAAW,EAAE,MAAM,CAAC;YACpB,KAAK,EAAE,KAAK,MAAM,EAAE,CAAC;SACtB,CAAC;KACH,CAAC;CACH;AAWD;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,GAAG,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,mBAAmB,GAChC,OAAO,CAAC,cAAc,CAAC,CAqDzB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAO3G;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAqBlC;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,aAAa,GACvB,OAAO,CAAC,MAAM,CAAC,CAejB"}
|