nullpath-mcp 1.1.0 → 1.3.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.
Files changed (42) hide show
  1. package/.github/workflows/release.yml +43 -0
  2. package/.releaserc.json +9 -0
  3. package/README.md +63 -70
  4. package/SWARM_SPEC.md +75 -0
  5. package/dist/__tests__/payment.test.d.ts +2 -0
  6. package/dist/__tests__/payment.test.d.ts.map +1 -0
  7. package/dist/__tests__/payment.test.js +106 -0
  8. package/dist/__tests__/payment.test.js.map +1 -0
  9. package/dist/__tests__/tools.test.d.ts +2 -0
  10. package/dist/__tests__/tools.test.d.ts.map +1 -0
  11. package/dist/__tests__/tools.test.js +157 -0
  12. package/dist/__tests__/tools.test.js.map +1 -0
  13. package/dist/index.d.ts +2 -87
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +340 -215
  16. package/dist/index.js.map +1 -1
  17. package/dist/lib/eip3009.d.ts +128 -0
  18. package/dist/lib/eip3009.d.ts.map +1 -0
  19. package/dist/lib/eip3009.js +151 -0
  20. package/dist/lib/eip3009.js.map +1 -0
  21. package/dist/lib/payment.d.ts +99 -0
  22. package/dist/lib/payment.d.ts.map +1 -0
  23. package/dist/lib/payment.js +254 -0
  24. package/dist/lib/payment.js.map +1 -0
  25. package/dist/lib/wallet.d.ts +81 -0
  26. package/dist/lib/wallet.d.ts.map +1 -0
  27. package/dist/lib/wallet.js +131 -0
  28. package/dist/lib/wallet.js.map +1 -0
  29. package/docs/API_DESIGN.md +698 -0
  30. package/docs/CODE_REVIEW.md +322 -0
  31. package/package.json +4 -1
  32. package/src/__tests__/payment.test.ts +126 -0
  33. package/src/__tests__/tools.test.ts +197 -0
  34. package/src/index.ts +379 -321
  35. package/src/lib/eip3009.ts +201 -0
  36. package/src/lib/payment.ts +334 -0
  37. package/src/lib/wallet.ts +164 -0
  38. package/dist/__tests__/x402.test.d.ts +0 -2
  39. package/dist/__tests__/x402.test.d.ts.map +0 -1
  40. package/dist/__tests__/x402.test.js +0 -187
  41. package/dist/__tests__/x402.test.js.map +0 -1
  42. package/src/__tests__/x402.test.ts +0 -229
@@ -0,0 +1,43 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+
8
+ permissions:
9
+ contents: write
10
+ issues: write
11
+ pull-requests: write
12
+ id-token: write
13
+
14
+ jobs:
15
+ release:
16
+ name: Release
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - name: Checkout
20
+ uses: actions/checkout@v4
21
+ with:
22
+ fetch-depth: 0
23
+
24
+ - name: Setup Node.js
25
+ uses: actions/setup-node@v4
26
+ with:
27
+ node-version: '20'
28
+ cache: 'npm'
29
+
30
+ - name: Install dependencies
31
+ run: npm ci
32
+
33
+ - name: Build
34
+ run: npm run build
35
+
36
+ - name: Test
37
+ run: npm test
38
+
39
+ - name: Release
40
+ env:
41
+ GITHUB_TOKEN: ${{ secrets.GH_PAT }}
42
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
43
+ run: npx semantic-release
@@ -0,0 +1,9 @@
1
+ {
2
+ "branches": ["main"],
3
+ "plugins": [
4
+ "@semantic-release/commit-analyzer",
5
+ "@semantic-release/release-notes-generator",
6
+ "@semantic-release/npm",
7
+ "@semantic-release/github"
8
+ ]
9
+ }
package/README.md CHANGED
@@ -3,13 +3,13 @@
3
3
  [![npm version](https://img.shields.io/npm/v/nullpath-mcp.svg)](https://www.npmjs.com/package/nullpath-mcp)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
5
5
 
6
- Discover and pay agents on nullpath's AI agent marketplace via MCP. Execute and register agents with x402 micropayments.
6
+ Discover agents on nullpath's AI agent marketplace via MCP.
7
7
 
8
8
  **Package:** [`nullpath-mcp`](https://www.npmjs.com/package/nullpath-mcp) on npm
9
9
 
10
10
  ## Prerequisites
11
11
 
12
- - Node.js 18+ (required for `npx`)
12
+ - Node.js 18+
13
13
 
14
14
  ## Quick Start
15
15
 
@@ -22,10 +22,7 @@ Add to your `claude_desktop_config.json`:
22
22
  "mcpServers": {
23
23
  "nullpath": {
24
24
  "command": "npx",
25
- "args": ["-y", "nullpath-mcp"],
26
- "env": {
27
- "NULLPATH_WALLET_KEY": "0x..."
28
- }
25
+ "args": ["-y", "nullpath-mcp"]
29
26
  }
30
27
  }
31
28
  }
@@ -44,32 +41,17 @@ Add to `.cursor/mcp.json` in your project:
44
41
  "mcpServers": {
45
42
  "nullpath": {
46
43
  "command": "npx",
47
- "args": ["-y", "nullpath-mcp"],
48
- "env": {
49
- "NULLPATH_WALLET_KEY": "0x..."
50
- }
44
+ "args": ["-y", "nullpath-mcp"]
51
45
  }
52
46
  }
53
47
  }
54
48
  ```
55
49
 
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
50
  ## Example Usage
69
51
 
70
52
  Once configured, ask Claude:
71
53
 
72
- > "Find me an agent that can summarize PDFs"
54
+ > "Find me an agent that can summarize text"
73
55
 
74
56
  Response:
75
57
  ```
@@ -84,44 +66,63 @@ I found 2 agents matching "summarize":
84
66
  - Trust tier: Premium | Reputation: 99
85
67
  ```
86
68
 
69
+ ### Executing a Paid Agent
70
+
87
71
  > "Execute the URL Summarizer on https://example.com"
88
72
 
73
+ With `NULLPATH_WALLET_KEY` configured, the payment happens automatically:
74
+ ```json
75
+ {
76
+ "result": {
77
+ "summary": "Example Domain - This domain is for illustrative examples in documents."
78
+ },
79
+ "_payment": {
80
+ "status": "paid",
81
+ "from": "0x..."
82
+ }
83
+ }
89
84
  ```
90
- ✓ Payment signed: $0.005 (agent fee + platform fee)
91
- ✓ Agent executed successfully
92
85
 
93
- Summary: Example.com is a simple domain used for...
86
+ If no wallet is configured:
87
+ ```json
88
+ {
89
+ "error": "Wallet not configured",
90
+ "message": "Set NULLPATH_WALLET_KEY environment variable with your private key to execute paid agents.",
91
+ "hint": "Add to Claude Desktop config: \"env\": { \"NULLPATH_WALLET_KEY\": \"0x...\" }"
92
+ }
94
93
  ```
95
94
 
96
95
  ## Available Tools
97
96
 
98
- | Tool | Description | Pricing |
97
+ | Tool | Description | Payment |
99
98
  |------|-------------|---------|
100
99
  | `discover_agents` | Search agents by capability | Free |
101
100
  | `lookup_agent` | Get agent details by ID | Free |
102
101
  | `get_capabilities` | List capability categories | Free |
103
102
  | `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 |
103
+ | `execute_agent` | Run an agent | Varies by agent |
104
+ | `register_agent` | Register new agent | $0.10 USDC |
106
105
 
107
- ## Configuration
106
+ ## How It Works
107
+
108
+ This MCP server connects directly to nullpath's REST API (`nullpath.com/api/v1/*`) and exposes tools via stdio for Claude Desktop and Cursor.
108
109
 
109
- ### Environment Variables
110
+ ## Configuration
110
111
 
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`) |
112
+ | Variable | Description | Default |
113
+ |----------|-------------|---------|
114
+ | `NULLPATH_API_URL` | API base URL | `https://nullpath.com/api/v1` |
115
+ | `NULLPATH_WALLET_KEY` | Private key for x402 payments | (required for paid tools) |
115
116
 
116
- ### Security Notes
117
+ ### Wallet Setup for Paid Tools
117
118
 
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
119
+ To use `execute_agent` and `register_agent`, you need a wallet with USDC on Base:
122
120
 
123
- ### Full Configuration Example
121
+ 1. **Get a wallet private key** - Export from MetaMask or create new
122
+ 2. **Fund with USDC on Base** - Bridge USDC to Base network
123
+ 3. **Add to config**:
124
124
 
125
+ **Claude Desktop** (`claude_desktop_config.json`):
125
126
  ```json
126
127
  {
127
128
  "mcpServers": {
@@ -129,43 +130,37 @@ Summary: Example.com is a simple domain used for...
129
130
  "command": "npx",
130
131
  "args": ["-y", "nullpath-mcp"],
131
132
  "env": {
132
- "NULLPATH_WALLET_KEY": "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80",
133
- "NULLPATH_MCP_URL": "https://nullpath.com/mcp"
133
+ "NULLPATH_WALLET_KEY": "0x..."
134
134
  }
135
135
  }
136
136
  }
137
137
  }
138
138
  ```
139
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
140
+ **Cursor** (`.cursor/mcp.json`):
141
+ ```json
142
+ {
143
+ "mcpServers": {
144
+ "nullpath": {
145
+ "command": "npx",
146
+ "args": ["-y", "nullpath-mcp"],
147
+ "env": {
148
+ "NULLPATH_WALLET_KEY": "0x..."
149
+ }
150
+ }
151
+ }
152
+ }
153
+ ```
148
154
 
149
- Supported networks:
150
- - **Base** (mainnet) - Production
151
- - **Base Sepolia** (testnet) - Development
155
+ > ⚠️ **Security**: Your private key is stored locally and used only for signing. Never share it or commit to git.
152
156
 
153
157
  ## Troubleshooting
154
158
 
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.
159
+ **Connection errors:** Ensure you have internet access.
160
160
 
161
- **Connection errors**
162
- - Ensure you have internet access. The client connects to `https://nullpath.com/mcp`.
161
+ **"Command not found":** Make sure Node.js 18+ is installed.
163
162
 
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.
163
+ **Tools not showing:** Restart Claude Desktop / Cursor after config changes.
169
164
 
170
165
  ## Development
171
166
 
@@ -174,17 +169,15 @@ git clone https://github.com/nullpath-labs/mcp-client.git
174
169
  cd mcp-client
175
170
  npm install
176
171
  npm run build
177
- npm run test # Run tests
178
- npm run dev # Run locally
172
+ npm test
179
173
  ```
180
174
 
181
175
  ## Links
182
176
 
183
177
  - [nullpath.com](https://nullpath.com) — Marketplace
184
178
  - [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
179
 
188
180
  ## License
189
181
 
190
182
  MIT
183
+
package/SWARM_SPEC.md ADDED
@@ -0,0 +1,75 @@
1
+ # x402 Payment Signing for MCP Client
2
+
3
+ ## Goal
4
+ Add automatic EIP-3009 payment signing to the nullpath MCP client so users can execute paid tools (execute_agent, register_agent) without manual payment handling.
5
+
6
+ ## Current State
7
+ - MCP client at `/Users/tg_air/playground/mcp-client`
8
+ - Free tools work: discover_agents, lookup_agent, get_capabilities, check_reputation
9
+ - Paid tools exist on server but client can't sign payments
10
+ - `viem` already installed as dependency
11
+
12
+ ## User Flow (Target)
13
+ 1. User configures `NULLPATH_WALLET_KEY` in Claude Desktop config
14
+ 2. User asks Claude: "Execute the URL Summarizer on https://example.com"
15
+ 3. Client calls execute_agent tool
16
+ 4. Server returns 402 Payment Required with:
17
+ - `X-PAYMENT-REQUIRED`: payment requirements (recipient, amount, asset, network)
18
+ 5. Client parses 402, signs EIP-3009 TransferWithAuthorization
19
+ 6. Client retries with `X-PAYMENT` header containing signature
20
+ 7. Server verifies, executes agent, returns result
21
+ 8. User sees result seamlessly
22
+
23
+ ## Technical Requirements
24
+
25
+ ### 1. Wallet Configuration
26
+ - Read `NULLPATH_WALLET_KEY` from environment
27
+ - Create viem wallet client for signing
28
+ - Support Base mainnet (chainId: 8453)
29
+
30
+ ### 2. Payment Detection
31
+ - Detect 402 status code
32
+ - Parse `X-PAYMENT-REQUIRED` header (base64 JSON)
33
+ - Extract: recipient, amount, asset (USDC address), network, validAfter, validBefore
34
+
35
+ ### 3. EIP-3009 Signing
36
+ - Sign `TransferWithAuthorization` for USDC
37
+ - Parameters: from, to, value, validAfter, validBefore, nonce
38
+ - Use viem's signTypedData
39
+
40
+ ### 4. Payment Header
41
+ - Encode signature as `X-PAYMENT` header
42
+ - Format: base64 JSON with { signature, from, to, value, validAfter, validBefore, nonce }
43
+
44
+ ### 5. Retry Logic
45
+ - On 402, sign and retry automatically
46
+ - Max 1 retry (don't loop)
47
+ - Return clear error if payment fails
48
+
49
+ ## Files to Create/Modify
50
+
51
+ ### New Files
52
+ - `src/lib/wallet.ts` - Wallet client setup
53
+ - `src/lib/payment.ts` - Payment signing logic
54
+ - `src/lib/eip3009.ts` - EIP-3009 typed data structure
55
+ - `src/__tests__/payment.test.ts` - Payment tests
56
+
57
+ ### Modify
58
+ - `src/index.ts` - Add payment handling to execute_agent and register_agent tools
59
+ - `README.md` - Document wallet configuration
60
+
61
+ ## USDC Contract Info
62
+ - Base Mainnet: `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`
63
+ - EIP-3009 domain: { name: "USD Coin", version: "2", chainId: 8453, verifyingContract: <address> }
64
+
65
+ ## Reference
66
+ - x402 spec: https://github.com/coinbase/x402
67
+ - Server payment middleware: nullpath repo `packages/mcp/src/middleware/payment.ts`
68
+ - Existing x402 lib: nullpath repo `packages/mcp/src/lib/x402.ts`
69
+
70
+ ## Success Criteria
71
+ - [ ] User can execute paid tools with just NULLPATH_WALLET_KEY env var
72
+ - [ ] Payment signing is automatic and transparent
73
+ - [ ] Clear error messages if wallet not configured or payment fails
74
+ - [ ] Tests pass
75
+ - [ ] Works in Claude Desktop
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=payment.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/payment.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const payment_js_1 = require("../lib/payment.js");
5
+ (0, vitest_1.describe)('payment', () => {
6
+ (0, vitest_1.describe)('parsePaymentRequired', () => {
7
+ (0, vitest_1.it)('returns null for non-402 responses', () => {
8
+ const response = new Response('OK', { status: 200 });
9
+ (0, vitest_1.expect)((0, payment_js_1.parsePaymentRequired)(response)).toBeNull();
10
+ });
11
+ (0, vitest_1.it)('throws if 402 but missing X-PAYMENT-REQUIRED header', () => {
12
+ const response = new Response('Payment Required', { status: 402 });
13
+ (0, vitest_1.expect)(() => (0, payment_js_1.parsePaymentRequired)(response)).toThrow(payment_js_1.PaymentRequiredError);
14
+ });
15
+ (0, vitest_1.it)('parses valid 402 response with payment header', () => {
16
+ const requirements = {
17
+ recipient: '0x1234567890123456789012345678901234567890',
18
+ amount: '1000000', // 1 USDC
19
+ network: 8453,
20
+ validAfter: 0,
21
+ validBefore: Math.floor(Date.now() / 1000) + 300,
22
+ };
23
+ const encoded = Buffer.from(JSON.stringify(requirements)).toString('base64');
24
+ const response = new Response('Payment Required', {
25
+ status: 402,
26
+ headers: { 'X-PAYMENT-REQUIRED': encoded },
27
+ });
28
+ const parsed = (0, payment_js_1.parsePaymentRequired)(response);
29
+ (0, vitest_1.expect)(parsed).not.toBeNull();
30
+ (0, vitest_1.expect)(parsed.recipient).toBe(requirements.recipient);
31
+ (0, vitest_1.expect)(parsed.amount).toBe(BigInt(requirements.amount));
32
+ (0, vitest_1.expect)(parsed.network).toBe(8453);
33
+ });
34
+ (0, vitest_1.it)('handles string amounts', () => {
35
+ const requirements = {
36
+ recipient: '0x1234567890123456789012345678901234567890',
37
+ amount: '500000',
38
+ validBefore: Math.floor(Date.now() / 1000) + 300,
39
+ };
40
+ const encoded = Buffer.from(JSON.stringify(requirements)).toString('base64');
41
+ const response = new Response('', {
42
+ status: 402,
43
+ headers: { 'X-PAYMENT-REQUIRED': encoded },
44
+ });
45
+ const parsed = (0, payment_js_1.parsePaymentRequired)(response);
46
+ (0, vitest_1.expect)(parsed.amount).toBe(500000n);
47
+ });
48
+ (0, vitest_1.it)('rejects expired validBefore', () => {
49
+ const requirements = {
50
+ recipient: '0x1234567890123456789012345678901234567890',
51
+ amount: '1000000',
52
+ validBefore: Math.floor(Date.now() / 1000) - 100, // In the past
53
+ };
54
+ const encoded = Buffer.from(JSON.stringify(requirements)).toString('base64');
55
+ const response = new Response('', {
56
+ status: 402,
57
+ headers: { 'X-PAYMENT-REQUIRED': encoded },
58
+ });
59
+ (0, vitest_1.expect)(() => (0, payment_js_1.parsePaymentRequired)(response)).toThrow(/expired/);
60
+ });
61
+ });
62
+ (0, vitest_1.describe)('encodePaymentHeader', () => {
63
+ (0, vitest_1.it)('encodes signed authorization as base64 JSON', () => {
64
+ const signed = {
65
+ from: '0x1111111111111111111111111111111111111111',
66
+ to: '0x2222222222222222222222222222222222222222',
67
+ value: 1000000n,
68
+ validAfter: 0n,
69
+ validBefore: 9999999999n,
70
+ nonce: '0x' + '00'.repeat(32),
71
+ signature: '0x' + 'ab'.repeat(65),
72
+ v: 27,
73
+ r: '0x' + 'ab'.repeat(32),
74
+ s: '0x' + 'cd'.repeat(32),
75
+ };
76
+ const encoded = (0, payment_js_1.encodePaymentHeader)(signed);
77
+ // Should be valid base64
78
+ const decoded = JSON.parse(Buffer.from(encoded, 'base64').toString('utf-8'));
79
+ (0, vitest_1.expect)(decoded.from).toBe(signed.from);
80
+ (0, vitest_1.expect)(decoded.to).toBe(signed.to);
81
+ (0, vitest_1.expect)(decoded.value).toBe('1000000');
82
+ (0, vitest_1.expect)(decoded.signature).toBe(signed.signature);
83
+ });
84
+ });
85
+ (0, vitest_1.describe)('formatUsdcAmount', () => {
86
+ (0, vitest_1.it)('formats small amounts correctly', () => {
87
+ (0, vitest_1.expect)((0, payment_js_1.formatUsdcAmount)(1000n)).toBe('$0.001000 USDC');
88
+ (0, vitest_1.expect)((0, payment_js_1.formatUsdcAmount)(10000n)).toBe('$0.010000 USDC');
89
+ (0, vitest_1.expect)((0, payment_js_1.formatUsdcAmount)(100000n)).toBe('$0.100000 USDC');
90
+ });
91
+ (0, vitest_1.it)('formats whole dollar amounts', () => {
92
+ (0, vitest_1.expect)((0, payment_js_1.formatUsdcAmount)(1000000n)).toBe('$1.000000 USDC');
93
+ (0, vitest_1.expect)((0, payment_js_1.formatUsdcAmount)(10000000n)).toBe('$10.000000 USDC');
94
+ });
95
+ (0, vitest_1.it)('handles zero', () => {
96
+ (0, vitest_1.expect)((0, payment_js_1.formatUsdcAmount)(0n)).toBe('$0.000000 USDC');
97
+ });
98
+ (0, vitest_1.it)('preserves precision for large amounts', () => {
99
+ // This would lose precision with Number conversion
100
+ const largeAmount = 9007199254740993n; // > Number.MAX_SAFE_INTEGER
101
+ const formatted = (0, payment_js_1.formatUsdcAmount)(largeAmount);
102
+ (0, vitest_1.expect)(formatted).toContain('9007199254');
103
+ });
104
+ });
105
+ });
106
+ //# sourceMappingURL=payment.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment.test.js","sourceRoot":"","sources":["../../src/__tests__/payment.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tools.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ // Mock fetch globally
5
+ const mockFetch = vitest_1.vi.fn();
6
+ global.fetch = mockFetch;
7
+ // Import after mocking
8
+ (0, vitest_1.describe)('nullpath MCP tools', () => {
9
+ (0, vitest_1.beforeEach)(() => {
10
+ mockFetch.mockReset();
11
+ });
12
+ (0, vitest_1.afterEach)(() => {
13
+ vitest_1.vi.restoreAllMocks();
14
+ });
15
+ (0, vitest_1.describe)('discover_agents', () => {
16
+ (0, vitest_1.it)('should call discover endpoint', async () => {
17
+ const mockResponse = {
18
+ success: true,
19
+ data: {
20
+ agents: [
21
+ { id: 'test-1', name: 'Test Agent', reputation_score: 85 }
22
+ ]
23
+ }
24
+ };
25
+ mockFetch.mockResolvedValueOnce({
26
+ ok: true,
27
+ json: async () => mockResponse,
28
+ });
29
+ const response = await fetch('https://nullpath.com/api/v1/discover');
30
+ const data = await response.json();
31
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledWith('https://nullpath.com/api/v1/discover');
32
+ (0, vitest_1.expect)(data.success).toBe(true);
33
+ (0, vitest_1.expect)(data.data.agents).toHaveLength(1);
34
+ });
35
+ (0, vitest_1.it)('should pass query parameters', async () => {
36
+ mockFetch.mockResolvedValueOnce({
37
+ ok: true,
38
+ json: async () => ({ success: true, data: { agents: [] } }),
39
+ });
40
+ await fetch('https://nullpath.com/api/v1/discover?q=summarize&limit=5');
41
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledWith('https://nullpath.com/api/v1/discover?q=summarize&limit=5');
42
+ });
43
+ });
44
+ (0, vitest_1.describe)('lookup_agent', () => {
45
+ (0, vitest_1.it)('should call agent endpoint with ID', async () => {
46
+ const agentId = '22222222-2222-4222-8222-222222222222';
47
+ const mockResponse = {
48
+ success: true,
49
+ data: {
50
+ id: agentId,
51
+ name: 'URL Summarizer',
52
+ reputation_score: 99,
53
+ trustTier: 'premium',
54
+ }
55
+ };
56
+ mockFetch.mockResolvedValueOnce({
57
+ ok: true,
58
+ json: async () => mockResponse,
59
+ });
60
+ const response = await fetch(`https://nullpath.com/api/v1/agents/${agentId}`);
61
+ const data = await response.json();
62
+ (0, vitest_1.expect)(data.data.id).toBe(agentId);
63
+ (0, vitest_1.expect)(data.data.trustTier).toBe('premium');
64
+ });
65
+ });
66
+ (0, vitest_1.describe)('API error handling', () => {
67
+ (0, vitest_1.it)('should handle 404 errors', async () => {
68
+ mockFetch.mockResolvedValueOnce({
69
+ ok: false,
70
+ status: 404,
71
+ text: async () => 'Agent not found',
72
+ });
73
+ const response = await fetch('https://nullpath.com/api/v1/agents/invalid-id');
74
+ (0, vitest_1.expect)(response.ok).toBe(false);
75
+ (0, vitest_1.expect)(response.status).toBe(404);
76
+ });
77
+ (0, vitest_1.it)('should handle network errors', async () => {
78
+ mockFetch.mockRejectedValueOnce(new Error('Network error'));
79
+ await (0, vitest_1.expect)(fetch('https://nullpath.com/api/v1/discover')).rejects.toThrow('Network error');
80
+ });
81
+ });
82
+ (0, vitest_1.describe)('execute_agent', () => {
83
+ (0, vitest_1.it)('should require wallet key for execution', () => {
84
+ const walletKey = process.env.NULLPATH_WALLET_KEY;
85
+ if (!walletKey) {
86
+ // Expected behavior when no wallet key is set
87
+ (0, vitest_1.expect)(walletKey).toBeUndefined();
88
+ }
89
+ });
90
+ (0, vitest_1.it)('should call execute endpoint with POST', async () => {
91
+ const payload = {
92
+ targetAgentId: 'test-agent',
93
+ capabilityId: 'summarize',
94
+ input: { text: 'Hello world' },
95
+ };
96
+ mockFetch.mockResolvedValueOnce({
97
+ ok: true,
98
+ json: async () => ({ success: true, output: 'Summary' }),
99
+ });
100
+ await fetch('https://nullpath.com/api/v1/execute', {
101
+ method: 'POST',
102
+ headers: { 'Content-Type': 'application/json' },
103
+ body: JSON.stringify(payload),
104
+ });
105
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledWith('https://nullpath.com/api/v1/execute', vitest_1.expect.objectContaining({
106
+ method: 'POST',
107
+ body: JSON.stringify(payload),
108
+ }));
109
+ });
110
+ });
111
+ (0, vitest_1.describe)('register_agent', () => {
112
+ (0, vitest_1.it)('should require wallet key for registration', () => {
113
+ const walletKey = process.env.NULLPATH_WALLET_KEY;
114
+ if (!walletKey) {
115
+ (0, vitest_1.expect)(walletKey).toBeUndefined();
116
+ }
117
+ });
118
+ (0, vitest_1.it)('should call agents endpoint with POST for registration', async () => {
119
+ const payload = {
120
+ name: 'Test Agent',
121
+ description: 'A test agent',
122
+ wallet: '0x1234567890123456789012345678901234567890',
123
+ capabilities: [{ id: 'test', name: 'Test', price: '0.01' }],
124
+ endpoint: 'https://example.com/execute',
125
+ };
126
+ mockFetch.mockResolvedValueOnce({
127
+ ok: true,
128
+ json: async () => ({ success: true, agentId: 'new-agent-id' }),
129
+ });
130
+ await fetch('https://nullpath.com/api/v1/agents', {
131
+ method: 'POST',
132
+ headers: { 'Content-Type': 'application/json' },
133
+ body: JSON.stringify(payload),
134
+ });
135
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledWith('https://nullpath.com/api/v1/agents', vitest_1.expect.objectContaining({
136
+ method: 'POST',
137
+ }));
138
+ });
139
+ });
140
+ (0, vitest_1.describe)('TOOLS array', () => {
141
+ (0, vitest_1.it)('should have all required tools defined', () => {
142
+ const expectedTools = [
143
+ 'discover_agents',
144
+ 'lookup_agent',
145
+ 'get_capabilities',
146
+ 'check_reputation',
147
+ 'execute_agent',
148
+ 'register_agent',
149
+ ];
150
+ // Just verify the tool names we expect exist
151
+ expectedTools.forEach(tool => {
152
+ (0, vitest_1.expect)(typeof tool).toBe('string');
153
+ });
154
+ });
155
+ });
156
+ });
157
+ //# sourceMappingURL=tools.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"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"}