@apify/mcpc 0.2.0-beta.2 → 0.2.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/CHANGELOG.md +32 -41
- package/README.md +53 -75
- package/dist/bridge/index.js +64 -21
- package/dist/bridge/index.js.map +1 -1
- package/dist/cli/commands/grep.d.ts.map +1 -1
- package/dist/cli/commands/grep.js +1 -16
- package/dist/cli/commands/grep.js.map +1 -1
- package/dist/cli/commands/sessions.d.ts.map +1 -1
- package/dist/cli/commands/sessions.js +4 -1
- package/dist/cli/commands/sessions.js.map +1 -1
- package/dist/cli/commands/x402.d.ts.map +1 -1
- package/dist/cli/commands/x402.js +21 -0
- package/dist/cli/commands/x402.js.map +1 -1
- package/dist/cli/output.d.ts +1 -0
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +17 -14
- package/dist/cli/output.js.map +1 -1
- package/dist/lib/x402/fetch-middleware.d.ts +14 -1
- package/dist/lib/x402/fetch-middleware.d.ts.map +1 -1
- package/dist/lib/x402/fetch-middleware.js +66 -14
- package/dist/lib/x402/fetch-middleware.js.map +1 -1
- package/docs/TODOs.md +12 -33
- package/package.json +5 -2
|
@@ -3,27 +3,27 @@ import { createLogger } from '../logger.js';
|
|
|
3
3
|
const logger = createLogger('x402-middleware');
|
|
4
4
|
const MCP_PAYMENT_META_KEY = 'x402/payment';
|
|
5
5
|
export function createX402FetchMiddleware(baseFetch, options) {
|
|
6
|
-
const { wallet, getToolByName } = options;
|
|
6
|
+
const { wallet, getToolByName, paymentCache } = options;
|
|
7
7
|
return async (url, init) => {
|
|
8
|
-
const
|
|
9
|
-
if (
|
|
10
|
-
|
|
11
|
-
const enhancedInit = injectPayment(init, proactiveHeader);
|
|
8
|
+
const paymentSignature = await getOrSignPayment(init, wallet, getToolByName, paymentCache);
|
|
9
|
+
if (paymentSignature) {
|
|
10
|
+
const enhancedInit = injectPayment(init, paymentSignature);
|
|
12
11
|
const response = await baseFetch(url, enhancedInit);
|
|
13
12
|
if (response.status !== 402) {
|
|
14
13
|
return response;
|
|
15
14
|
}
|
|
16
|
-
logger.debug('
|
|
17
|
-
|
|
15
|
+
logger.debug('Payment rejected (HTTP 402), invalidating cache');
|
|
16
|
+
paymentCache.signature = null;
|
|
17
|
+
return handle402Fallback(url, init, response, baseFetch, wallet, paymentCache);
|
|
18
18
|
}
|
|
19
19
|
const response = await baseFetch(url, init);
|
|
20
20
|
if (response.status === 402) {
|
|
21
|
-
return handle402Fallback(url, init, response, baseFetch, wallet);
|
|
21
|
+
return handle402Fallback(url, init, response, baseFetch, wallet, paymentCache);
|
|
22
22
|
}
|
|
23
23
|
return response;
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
|
-
async function
|
|
26
|
+
async function getOrSignPayment(init, wallet, getToolByName, paymentCache) {
|
|
27
27
|
if (!getToolByName || !init?.body) {
|
|
28
28
|
return undefined;
|
|
29
29
|
}
|
|
@@ -36,7 +36,7 @@ async function tryProactiveSigning(init, wallet, getToolByName) {
|
|
|
36
36
|
}
|
|
37
37
|
const tool = getToolByName(toolName);
|
|
38
38
|
if (!tool) {
|
|
39
|
-
logger.debug(`Tool "${toolName}" not found in cache, skipping
|
|
39
|
+
logger.debug(`Tool "${toolName}" not found in cache, skipping payment`);
|
|
40
40
|
return undefined;
|
|
41
41
|
}
|
|
42
42
|
const meta = tool._meta;
|
|
@@ -44,8 +44,12 @@ async function tryProactiveSigning(init, wallet, getToolByName) {
|
|
|
44
44
|
if (!x402 || !x402.paymentRequired) {
|
|
45
45
|
return undefined;
|
|
46
46
|
}
|
|
47
|
+
if (paymentCache.signature) {
|
|
48
|
+
logger.debug(`Using cached payment signature for tool "${toolName}"`);
|
|
49
|
+
return paymentCache.signature;
|
|
50
|
+
}
|
|
47
51
|
if (!x402.scheme || !x402.network || !x402.amount || !x402.asset || !x402.payTo) {
|
|
48
|
-
logger.debug(`Tool "${toolName}" has x402 metadata but missing fields, skipping
|
|
52
|
+
logger.debug(`Tool "${toolName}" has x402 metadata but missing fields, skipping payment signing`);
|
|
49
53
|
return undefined;
|
|
50
54
|
}
|
|
51
55
|
const accept = {
|
|
@@ -59,15 +63,16 @@ async function tryProactiveSigning(init, wallet, getToolByName) {
|
|
|
59
63
|
};
|
|
60
64
|
try {
|
|
61
65
|
const result = await signPayment({ wallet, accept });
|
|
62
|
-
logger.debug(`
|
|
66
|
+
logger.debug(`Fresh payment signed: $${result.amountUsd.toFixed(4)} to ${result.to} on ${result.networkLabel}`);
|
|
67
|
+
paymentCache.signature = result.paymentSignatureBase64;
|
|
63
68
|
return result.paymentSignatureBase64;
|
|
64
69
|
}
|
|
65
70
|
catch (error) {
|
|
66
|
-
logger.warn(`
|
|
71
|
+
logger.warn(`Payment signing failed for tool "${toolName}":`, error);
|
|
67
72
|
return undefined;
|
|
68
73
|
}
|
|
69
74
|
}
|
|
70
|
-
async function handle402Fallback(url, originalInit, response402, baseFetch, wallet) {
|
|
75
|
+
async function handle402Fallback(url, originalInit, response402, baseFetch, wallet, paymentCache) {
|
|
71
76
|
const paymentRequiredBase64 = response402.headers.get('PAYMENT-REQUIRED') || response402.headers.get('payment-required');
|
|
72
77
|
if (!paymentRequiredBase64) {
|
|
73
78
|
logger.debug('402 response has no PAYMENT-REQUIRED header, passing through');
|
|
@@ -90,6 +95,7 @@ async function handle402Fallback(url, originalInit, response402, baseFetch, wall
|
|
|
90
95
|
resource: header.resource,
|
|
91
96
|
});
|
|
92
97
|
logger.debug(`402 fallback payment signed: $${result.amountUsd.toFixed(4)} to ${result.to} on ${result.networkLabel}`);
|
|
98
|
+
paymentCache.signature = result.paymentSignatureBase64;
|
|
93
99
|
const retryInit = injectPayment(originalInit, result.paymentSignatureBase64);
|
|
94
100
|
return await baseFetch(url, retryInit);
|
|
95
101
|
}
|
|
@@ -123,6 +129,52 @@ function extractToolCallName(body) {
|
|
|
123
129
|
return undefined;
|
|
124
130
|
}
|
|
125
131
|
}
|
|
132
|
+
export function extractAcceptFromPaymentRequired(data) {
|
|
133
|
+
if (!data || typeof data !== 'object')
|
|
134
|
+
return undefined;
|
|
135
|
+
const obj = data;
|
|
136
|
+
if (!Array.isArray(obj.accepts) || obj.accepts.length === 0)
|
|
137
|
+
return undefined;
|
|
138
|
+
const accept = obj.accepts.find((a) => a.scheme === 'exact');
|
|
139
|
+
if (!accept || !accept.payTo || !accept.amount || !accept.network || !accept.asset) {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
const resource = obj.resource;
|
|
143
|
+
if (resource) {
|
|
144
|
+
return { accept, resource };
|
|
145
|
+
}
|
|
146
|
+
return { accept };
|
|
147
|
+
}
|
|
148
|
+
export function extractPaymentRequiredFromResult(result) {
|
|
149
|
+
if (!result || typeof result !== 'object')
|
|
150
|
+
return undefined;
|
|
151
|
+
const toolResult = result;
|
|
152
|
+
if (!toolResult.isError)
|
|
153
|
+
return undefined;
|
|
154
|
+
if (toolResult.structuredContent && isPaymentRequired(toolResult.structuredContent)) {
|
|
155
|
+
return toolResult.structuredContent;
|
|
156
|
+
}
|
|
157
|
+
const content = toolResult.content;
|
|
158
|
+
if (!Array.isArray(content) || content.length === 0)
|
|
159
|
+
return undefined;
|
|
160
|
+
const first = content[0];
|
|
161
|
+
if (!first || first.type !== 'text' || typeof first.text !== 'string')
|
|
162
|
+
return undefined;
|
|
163
|
+
try {
|
|
164
|
+
const parsed = JSON.parse(first.text);
|
|
165
|
+
if (typeof parsed === 'object' &&
|
|
166
|
+
parsed !== null &&
|
|
167
|
+
isPaymentRequired(parsed)) {
|
|
168
|
+
return parsed;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
}
|
|
173
|
+
return undefined;
|
|
174
|
+
}
|
|
175
|
+
function isPaymentRequired(obj) {
|
|
176
|
+
return 'x402Version' in obj && 'accepts' in obj && Array.isArray(obj.accepts);
|
|
177
|
+
}
|
|
126
178
|
function injectPayment(init, paymentSignatureBase64) {
|
|
127
179
|
const headers = new Headers(init?.headers);
|
|
128
180
|
headers.set('PAYMENT-SIGNATURE', paymentSignatureBase64);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-middleware.js","sourceRoot":"","sources":["../../../src/lib/x402/fetch-middleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch-middleware.js","sourceRoot":"","sources":["../../../src/lib/x402/fetch-middleware.ts"],"names":[],"mappings":"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"}
|
package/docs/TODOs.md
CHANGED
|
@@ -6,30 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
- the README should show explain each command, show the full options from "mcpc help command" - perhaps this could be on start of the readme,
|
|
9
|
-
with links to the more detailed sections below
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
- mcp-cli inspiration
|
|
13
|
-
Add glob-based tool search across all servers like `mcpc grep *mail*` or `mcpc grep *@session/mail*`.
|
|
14
|
-
Consider making `tools-list` more succinct for discovery.
|
|
15
|
-
Use https://platform.claude.com/docs/en/agents-and-tools/tool-use/tool-search-tool for inspiration/compatibility?
|
|
16
|
-
-
|
|
17
|
-
|
|
18
|
-
$ mcpc grep "*file*"
|
|
19
|
-
$ mcpc grep "@github/*"
|
|
20
|
-
$ mcpc grep -F "anything really"
|
|
21
|
-
|
|
22
|
-
RETURNS
|
|
23
|
-
@github
|
|
24
|
-
- create_or_update_file(name: string, )
|
|
25
|
-
@filesystem
|
|
26
|
-
- read_file
|
|
27
|
-
@filesystem
|
|
28
|
-
- write_file
|
|
29
|
-
|
|
30
|
-
Then we can have
|
|
31
|
-
$ mcpc @github tools-call get_file_contents arg:="yes" # NOW
|
|
32
|
-
$ mcpc @github/get_file_contents arg:="yes" # NEW
|
|
9
|
+
with links to the more detailed sections below. In general the README deserves one iteration.
|
|
33
10
|
|
|
34
11
|
|
|
35
12
|
|
|
@@ -49,13 +26,15 @@ $ mcpc @github/get_file_contents arg:="yes" # NEW
|
|
|
49
26
|
- Make "mcpc connect mcp.apify.com" work without @session, and generate session name on best effort basis (e.g. use the main hostname without TLD
|
|
50
27
|
+ suffix)
|
|
51
28
|
|
|
52
|
-
|
|
53
|
-
- Show tools also when running just "mcpc @apify"
|
|
54
|
-
|
|
55
29
|
- mcpc @apify tools-get fetch-actor-details => should print also "object" properties in human mode
|
|
56
30
|
|
|
57
31
|
- mcpc @apify tools-call xxx --help / "mcpc @apify/xxx --help" should print tools-get + command info
|
|
58
|
-
|
|
32
|
+
|
|
33
|
+
- mcp-cli inspiration
|
|
34
|
+
|
|
35
|
+
$ mcpc @github tools-call get_file_contents arg:="yes" # NOW
|
|
36
|
+
$ mcpc @github/get_file_contents arg:="yes" # NEW
|
|
37
|
+
|
|
59
38
|
|
|
60
39
|
|
|
61
40
|
## Code mode
|
|
@@ -76,7 +55,8 @@ $ mcpc @github/get_file_contents arg:="yes" # NEW
|
|
|
76
55
|
automatically update the -o file on changes, without it just keep track of changed files in
|
|
77
56
|
bridge process' cache, and report in resources-list/resources-read operatio
|
|
78
57
|
|
|
79
|
-
- Add support for "mcpc close @session", "mcpc restart @session" and "mcpc shell @session" - add to
|
|
58
|
+
- Add support for "mcpc close @session", "mcpc restart @session" and "mcpc shell @session" aliases - add info only to "mcpc help restart" or "mcpc
|
|
59
|
+
help close", no need to mention this in main --help
|
|
80
60
|
|
|
81
61
|
- Add ASCII diagrams to README to help explain major concepts: tool calling, auth, bridge process, etc.
|
|
82
62
|
For inspiration, see https://github.com/philschmid/mcp-cli
|
|
@@ -91,11 +71,10 @@ $ mcpc @github/get_file_contents arg:="yes" # NEW
|
|
|
91
71
|
- security: For auth profiles, fetch the detailed user info via http, save to profiles.json and show in 'mcpc', ensure the info is up-to-date
|
|
92
72
|
- nit: Implement typing tab-completions (e.g. "mcpc @ap...") - not sure if that's even possible
|
|
93
73
|
- Consider adding `--dry-run` https://justin.poehnelt.com/posts/rewrite-your-cli-for-ai-agents/
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
- nit: show also header / open auth statuses for HTTP servers?
|
|
74
|
+
For tool call it could return synthetic resutls conforming the schema.
|
|
75
|
+
- Show protocolVersion also for stdio in "mcpc --json" - but for that we need to update the SDK to save it! See setProtocolVersion
|
|
97
76
|
|
|
98
|
-
- consider adding --idle-timeout to "connect" and then automatically
|
|
77
|
+
- consider adding --idle-timeout to "connect" and then automatically disconnect from remote server, to avoid handing infinitely
|
|
99
78
|
|
|
100
79
|
|
|
101
80
|
## Later
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apify/mcpc",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Universal command-line client for the Model Context Protocol (MCP).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -50,7 +50,8 @@
|
|
|
50
50
|
"prepublishOnly": "if [ -z \"$MCPC_RELEASE\" ]; then echo '\\n❌ Direct npm publish is not allowed.\\n Please use: npm run release\\n' && exit 1; fi",
|
|
51
51
|
"release": "bash scripts/publish.sh",
|
|
52
52
|
"release:minor": "bash scripts/publish.sh minor",
|
|
53
|
-
"release:major": "bash scripts/publish.sh major"
|
|
53
|
+
"release:major": "bash scripts/publish.sh major",
|
|
54
|
+
"release:pre": "bash scripts/publish.sh --pre-release"
|
|
54
55
|
},
|
|
55
56
|
"dependencies": {
|
|
56
57
|
"@inquirer/input": "^5.0.3",
|
|
@@ -61,6 +62,7 @@
|
|
|
61
62
|
"commander": "^14.0.2",
|
|
62
63
|
"ora": "^9.0.0",
|
|
63
64
|
"proper-lockfile": "^4.1.2",
|
|
65
|
+
"qrcode-terminal": "^0.12.0",
|
|
64
66
|
"undici": "^7.22.0",
|
|
65
67
|
"uuid": "^13.0.0",
|
|
66
68
|
"viem": "^2.46.3"
|
|
@@ -69,6 +71,7 @@
|
|
|
69
71
|
"@types/jest": "^30.0.0",
|
|
70
72
|
"@types/node": "^25.0.3",
|
|
71
73
|
"@types/proper-lockfile": "^4.1.4",
|
|
74
|
+
"@types/qrcode-terminal": "^0.12.2",
|
|
72
75
|
"@types/uuid": "^11.0.0",
|
|
73
76
|
"@typescript-eslint/eslint-plugin": "^8.50.0",
|
|
74
77
|
"@typescript-eslint/parser": "^8.50.0",
|