402-mcp 4.3.0 → 4.3.1
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 +1 -1
- package/build/tools/nostr-subscribe.d.ts +5 -2
- package/build/tools/nostr-subscribe.js +0 -2
- package/build/tools/nostr-subscribe.js.map +1 -1
- package/build/tools/search.js +9 -5
- package/build/tools/search.js.map +1 -1
- package/build/widgets/index.js +2 -1
- package/build/widgets/index.js.map +1 -1
- package/build/widgets/paths.d.ts +7 -0
- package/build/widgets/paths.js +11 -0
- package/build/widgets/paths.js.map +1 -0
- package/llms-full.txt +2 -2
- package/llms.txt +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -200,7 +200,7 @@ Browse live L402 services at [402.pub](https://402.pub) — the decentralised ma
|
|
|
200
200
|
| Project | Role |
|
|
201
201
|
|---------|------|
|
|
202
202
|
| [toll-booth](https://github.com/forgesworn/toll-booth) | Payment-backend agnostic HTTP 402 middleware |
|
|
203
|
-
| [satgate](https://github.com/
|
|
203
|
+
| [satgate](https://github.com/TheCryptoDonkey/satgate) | Pay-per-token AI inference proxy (built on toll-booth) |
|
|
204
204
|
| **[402-mcp](https://github.com/forgesworn/402-mcp)** | **MCP client: AI agents discover, pay for and consume L402 APIs** |
|
|
205
205
|
| [402-announce](https://github.com/forgesworn/402-announce) | Publish L402 services on Nostr for decentralised discovery |
|
|
206
206
|
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { SearchDeps } from './search.js';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Optional tag filters to pass to relays, reducing bandwidth by filtering
|
|
4
|
+
* server-side. Relays index single-letter tags only; a multi-letter tag
|
|
5
|
+
* filter such as #pmi is rejected, so filter those after the query.
|
|
6
|
+
*/
|
|
3
7
|
export interface SubscribeFilters {
|
|
4
8
|
'#t'?: string[];
|
|
5
|
-
'#pmi'?: string[];
|
|
6
9
|
}
|
|
7
10
|
/** Creates a Nostr relay subscriber that connects, subscribes to event kinds, and collects events within a timeout. */
|
|
8
11
|
export declare function createNostrSubscriber(ssrfAllowPrivate?: boolean): SearchDeps['subscribeEvents'];
|
|
@@ -43,8 +43,6 @@ export function createNostrSubscriber(ssrfAllowPrivate = false) {
|
|
|
43
43
|
const filter = { kinds };
|
|
44
44
|
if (filters?.['#t']?.length)
|
|
45
45
|
filter['#t'] = filters['#t'];
|
|
46
|
-
if (filters?.['#pmi']?.length)
|
|
47
|
-
filter['#pmi'] = filters['#pmi'];
|
|
48
46
|
const sub = relay.subscribe([filter], {
|
|
49
47
|
onevent: (event) => {
|
|
50
48
|
if (events.length < MAX_EVENTS && verifyEvent(event)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nostr-subscribe.js","sourceRoot":"","sources":["../../src/tools/nostr-subscribe.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD,MAAM,UAAU,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"nostr-subscribe.js","sourceRoot":"","sources":["../../src/tools/nostr-subscribe.ts"],"names":[],"mappings":"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"}
|
package/build/tools/search.js
CHANGED
|
@@ -60,12 +60,12 @@ export async function handleSearch(args, deps) {
|
|
|
60
60
|
const timeout = args.timeout ?? 5000;
|
|
61
61
|
const maxResults = args.maxResults ?? 20;
|
|
62
62
|
const queryLower = args.query.toLowerCase();
|
|
63
|
-
//
|
|
63
|
+
// Relays index single-letter tags only, so topics (#t) filter at the relay.
|
|
64
|
+
// Public relays reject a #pmi filter outright ("unindexed tag filter"), so
|
|
65
|
+
// payment methods are matched here instead.
|
|
64
66
|
const relayFilters = {};
|
|
65
67
|
if (args.topics?.length)
|
|
66
68
|
relayFilters['#t'] = args.topics;
|
|
67
|
-
if (args.paymentMethod)
|
|
68
|
-
relayFilters['#pmi'] = [args.paymentMethod];
|
|
69
69
|
const rawEvents = await deps.subscribeEvents(relays, [KIND_L402_ANNOUNCE], timeout, relayFilters);
|
|
70
70
|
// NIP-33 dedup: keep only the newest event per pubkey + d tag
|
|
71
71
|
const replaceableMap = new Map();
|
|
@@ -78,6 +78,10 @@ export async function handleSearch(args, deps) {
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
let services = [...replaceableMap.values()].map(parseAnnounceEvent);
|
|
81
|
+
if (args.paymentMethod) {
|
|
82
|
+
const method = args.paymentMethod.toLowerCase();
|
|
83
|
+
services = services.filter(svc => svc.paymentMethods.some(pm => pm.toLowerCase() === method));
|
|
84
|
+
}
|
|
81
85
|
// Filter by query text — relays cannot do substring search so this remains client-side
|
|
82
86
|
if (queryLower) {
|
|
83
87
|
services = services.filter(svc => {
|
|
@@ -122,13 +126,13 @@ export async function handleSearch(args, deps) {
|
|
|
122
126
|
/** Registers the l402-search tool with the MCP server. */
|
|
123
127
|
export function registerSearchTool(server, deps) {
|
|
124
128
|
server.registerTool('l402-search', {
|
|
125
|
-
description: 'Search Nostr relays for paid API announcements (kind 31402) and return their URLs, pricing and capabilities. Topic
|
|
129
|
+
description: 'Search Nostr relays for paid API announcements (kind 31402) and return their URLs, pricing and capabilities. Topic filters are sent to the relays; the payment method and query text are matched locally. Announcement text is written by whoever published it and is marked as untrusted content.',
|
|
126
130
|
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
127
131
|
inputSchema: {
|
|
128
132
|
query: z.string().max(200).describe('Search query to match against service names, descriptions, and capabilities'),
|
|
129
133
|
relays: z.array(z.url()).max(10).optional().describe('Nostr relay URLs to query (defaults to popular public relays)'),
|
|
130
134
|
topics: z.array(z.string().max(50)).max(10).optional().describe('Filter by topic tags (e.g. ["ai", "data"])'),
|
|
131
|
-
paymentMethod: z.string().max(100).optional().describe('Filter by payment
|
|
135
|
+
paymentMethod: z.string().max(100).optional().describe('Filter by payment rail, the first value of an announcement\'s pmi tag (e.g. "l402", "cashu", "xcashu", "lnurlcash", "x402", "payment"). A Cashu service may list "cashu", "xcashu" or both'),
|
|
132
136
|
maxResults: z.int().min(1).max(100).optional().describe('Maximum number of results to return (default 20)'),
|
|
133
137
|
timeout: z.int().min(1000).max(30000).optional().describe('Relay subscription timeout in milliseconds (default 5000)'),
|
|
134
138
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
|
package/build/widgets/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { readFileSync } from 'node:fs';
|
|
2
2
|
import { join, dirname } from 'node:path';
|
|
3
3
|
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { widgetDistDir } from './paths.js';
|
|
4
5
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
6
|
function load(name) {
|
|
6
|
-
return readFileSync(join(__dirname,
|
|
7
|
+
return readFileSync(join(widgetDistDir(__dirname), `${name}.html`), 'utf8');
|
|
7
8
|
}
|
|
8
9
|
export const paymentConfirmationHtml = load('payment-confirmation');
|
|
9
10
|
export const serviceDirectoryHtml = load('service-directory');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/widgets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/widgets/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzD,SAAS,IAAI,CAAC,IAAY;IACxB,OAAO,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;AAC7E,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAA;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAA;AAC7D,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where the built widget HTML lives. build.mjs writes it to src/widgets/dist,
|
|
3
|
+
* the directory package.json "files" ships. This code runs from src/widgets
|
|
4
|
+
* under tsx and vitest, and from build/widgets once compiled; both sit two
|
|
5
|
+
* levels below the package root, so one relative path reaches it from either.
|
|
6
|
+
*/
|
|
7
|
+
export declare function widgetDistDir(moduleDir: string): string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* Where the built widget HTML lives. build.mjs writes it to src/widgets/dist,
|
|
4
|
+
* the directory package.json "files" ships. This code runs from src/widgets
|
|
5
|
+
* under tsx and vitest, and from build/widgets once compiled; both sit two
|
|
6
|
+
* levels below the package root, so one relative path reaches it from either.
|
|
7
|
+
*/
|
|
8
|
+
export function widgetDistDir(moduleDir) {
|
|
9
|
+
return join(moduleDir, '..', '..', 'src', 'widgets', 'dist');
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/widgets/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;AAC9D,CAAC"}
|
package/llms-full.txt
CHANGED
|
@@ -265,7 +265,7 @@ For human wallets with a toll-booth payment page, polls for settlement for up to
|
|
|
265
265
|
- `topics` — topic tags
|
|
266
266
|
- `capabilities` — array of `{ name, description }`
|
|
267
267
|
|
|
268
|
-
Names, descriptions and capability text are wrapped in UNTRUSTED CONTENT markers. Topic
|
|
268
|
+
Names, descriptions and capability text are wrapped in UNTRUSTED CONTENT markers. Topic filters are sent to the relays; the payment method and query text are matched locally, because relays index single-letter tags only.
|
|
269
269
|
|
|
270
270
|
**When to use:** When the agent needs a paid API but doesn't know the URL. Searches the decentralised Nostr network for kind 31402 service announcements. Services may advertise multiple transport URLs (clearnet, .onion, Handshake); pass the `urls` array and `pubkey` to `l402-fetch` for automatic transport selection and fallback.
|
|
271
271
|
|
|
@@ -459,7 +459,7 @@ Credentials are keyed by service **pubkey** (from the kind 31402 event) and boun
|
|
|
459
459
|
|---------|------|-----|
|
|
460
460
|
| **402-mcp** | MCP client — AI agents discover, pay, and consume L402 APIs | https://github.com/forgesworn/402-mcp |
|
|
461
461
|
| **toll-booth** | L402 payment middleware for any Node.js server | https://github.com/forgesworn/toll-booth |
|
|
462
|
-
| **satgate** | Pay-per-token AI inference proxy (built on toll-booth) | https://github.com/
|
|
462
|
+
| **satgate** | Pay-per-token AI inference proxy (built on toll-booth) | https://github.com/TheCryptoDonkey/satgate |
|
|
463
463
|
| **402-announce** | Publish L402 services on Nostr for decentralised discovery | https://github.com/forgesworn/402-announce |
|
|
464
464
|
|
|
465
465
|
## Integration Patterns
|
package/llms.txt
CHANGED
|
@@ -110,7 +110,7 @@ Check the cached credit balance for a specific server URL. Returns the number of
|
|
|
110
110
|
|
|
111
111
|
### `l402-search`
|
|
112
112
|
|
|
113
|
-
Search for L402 services on Nostr relays. Queries kind 31402 announcement events (topic
|
|
113
|
+
Search for L402 services on Nostr relays. Queries kind 31402 announcement events (topic filters are sent to the relays; the payment method and query text are matched locally) and returns matching services with their names, URLs, pubkey, pricing, capabilities, and supported payment methods. Filter by query text, topics (e.g. "ai", "data"), or payment method: the rail an announcement lists first in each `pmi` tag (`l402`, `cashu`, `xcashu`, `lnurlcash`, `x402`, `payment`). A Cashu service may list `cashu`, `xcashu` or both. Services may advertise multiple transport URLs (clearnet, .onion, HNS); pass the first as `url`, the whole array as `urls` and the service's `pubkey` to `l402-fetch`, for automatic transport selection and fallback with credentials shared across them. This enables agents to find paid APIs without knowing URLs upfront: a decentralised alternative to API directories. Announcement text is wrapped in UNTRUSTED CONTENT markers.
|
|
114
114
|
|
|
115
115
|
## Widget Tools
|
|
116
116
|
|
|
@@ -181,7 +181,7 @@ https://github.com/forgesworn/toll-booth
|
|
|
181
181
|
|
|
182
182
|
**satgate** demonstrates the AI inference use case: a proxy that gates access to AI model endpoints (Ollama, vLLM, llama.cpp) behind L402 payments. Agents use 402-mcp to discover pricing, pay per-request or buy credit tiers, and consume inference capacity without pre-provisioned API keys.
|
|
183
183
|
|
|
184
|
-
https://github.com/
|
|
184
|
+
https://github.com/TheCryptoDonkey/satgate
|
|
185
185
|
|
|
186
186
|
**402-announce** publishes HTTP 402 services on Nostr as kind 31402 events, making them discoverable by `l402-search`. Operators run it alongside their L402 server to announce capabilities, pricing, and payment methods to the decentralised network.
|
|
187
187
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "402-mcp",
|
|
3
|
-
"version": "4.3.
|
|
3
|
+
"version": "4.3.1",
|
|
4
4
|
"mcpName": "dev.forgesworn/402-mcp",
|
|
5
5
|
"description": "L402 client MCP: AI agents discover, pay for and consume Lightning and ecash payment-gated APIs (x402 support is experimental)",
|
|
6
6
|
"type": "module",
|