@apify/mcpc 0.1.11-beta.0 → 0.1.11-beta.2

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 (68) hide show
  1. package/CHANGELOG.md +3 -0
  2. package/README.md +133 -47
  3. package/dist/bridge/index.js +78 -4
  4. package/dist/bridge/index.js.map +1 -1
  5. package/dist/cli/commands/index.d.ts +1 -0
  6. package/dist/cli/commands/index.d.ts.map +1 -1
  7. package/dist/cli/commands/index.js +1 -0
  8. package/dist/cli/commands/index.js.map +1 -1
  9. package/dist/cli/commands/sessions.d.ts +1 -0
  10. package/dist/cli/commands/sessions.d.ts.map +1 -1
  11. package/dist/cli/commands/sessions.js +15 -0
  12. package/dist/cli/commands/sessions.js.map +1 -1
  13. package/dist/cli/commands/x402.d.ts +2 -0
  14. package/dist/cli/commands/x402.d.ts.map +1 -0
  15. package/dist/cli/commands/x402.js +203 -0
  16. package/dist/cli/commands/x402.js.map +1 -0
  17. package/dist/cli/helpers.d.ts +1 -0
  18. package/dist/cli/helpers.d.ts.map +1 -1
  19. package/dist/cli/helpers.js +12 -0
  20. package/dist/cli/helpers.js.map +1 -1
  21. package/dist/cli/index.js +18 -0
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/cli/parser.d.ts +1 -0
  24. package/dist/cli/parser.d.ts.map +1 -1
  25. package/dist/cli/parser.js +4 -0
  26. package/dist/cli/parser.js.map +1 -1
  27. package/dist/core/factory.d.ts +2 -0
  28. package/dist/core/factory.d.ts.map +1 -1
  29. package/dist/core/factory.js +4 -0
  30. package/dist/core/factory.js.map +1 -1
  31. package/dist/core/transports.d.ts +3 -2
  32. package/dist/core/transports.d.ts.map +1 -1
  33. package/dist/core/transports.js +4 -0
  34. package/dist/core/transports.js.map +1 -1
  35. package/dist/lib/auth/keychain.d.ts.map +1 -1
  36. package/dist/lib/auth/keychain.js +85 -67
  37. package/dist/lib/auth/keychain.js.map +1 -1
  38. package/dist/lib/auth/profiles.d.ts.map +1 -1
  39. package/dist/lib/auth/profiles.js.map +1 -1
  40. package/dist/lib/bridge-client.d.ts +2 -1
  41. package/dist/lib/bridge-client.d.ts.map +1 -1
  42. package/dist/lib/bridge-client.js +6 -0
  43. package/dist/lib/bridge-client.js.map +1 -1
  44. package/dist/lib/bridge-manager.d.ts +1 -0
  45. package/dist/lib/bridge-manager.d.ts.map +1 -1
  46. package/dist/lib/bridge-manager.js +33 -1
  47. package/dist/lib/bridge-manager.js.map +1 -1
  48. package/dist/lib/sessions.d.ts.map +1 -1
  49. package/dist/lib/sessions.js.map +1 -1
  50. package/dist/lib/types.d.ts +16 -1
  51. package/dist/lib/types.d.ts.map +1 -1
  52. package/dist/lib/utils.d.ts +1 -0
  53. package/dist/lib/utils.d.ts.map +1 -1
  54. package/dist/lib/utils.js +3 -0
  55. package/dist/lib/utils.js.map +1 -1
  56. package/dist/lib/wallets.d.ts +5 -0
  57. package/dist/lib/wallets.d.ts.map +1 -0
  58. package/dist/lib/wallets.js +66 -0
  59. package/dist/lib/wallets.js.map +1 -0
  60. package/dist/lib/x402/fetch-middleware.d.ts +9 -0
  61. package/dist/lib/x402/fetch-middleware.d.ts.map +1 -0
  62. package/dist/lib/x402/fetch-middleware.js +133 -0
  63. package/dist/lib/x402/fetch-middleware.js.map +1 -0
  64. package/dist/lib/x402/signer.d.ts +48 -0
  65. package/dist/lib/x402/signer.d.ts.map +1 -0
  66. package/dist/lib/x402/signer.js +139 -0
  67. package/dist/lib/x402/signer.js.map +1 -0
  68. package/package.json +3 -2
@@ -0,0 +1,133 @@
1
+ import { signPayment, parsePaymentRequired, } from './signer.js';
2
+ import { createLogger } from '../logger.js';
3
+ const logger = createLogger('x402-middleware');
4
+ export function createX402FetchMiddleware(baseFetch, options) {
5
+ const { wallet, getToolByName } = options;
6
+ return async (url, init) => {
7
+ const proactiveHeader = await tryProactiveSigning(init, wallet, getToolByName);
8
+ if (proactiveHeader) {
9
+ logger.debug('Proactively signing x402 payment for tools/call');
10
+ const enhancedInit = injectPaymentHeader(init, proactiveHeader);
11
+ const response = await baseFetch(url, enhancedInit);
12
+ if (response.status !== 402) {
13
+ return response;
14
+ }
15
+ logger.debug('Proactive payment rejected (402), falling back to 402 handler');
16
+ return handle402Fallback(url, init, response, baseFetch, wallet);
17
+ }
18
+ const response = await baseFetch(url, init);
19
+ if (response.status === 402) {
20
+ return handle402Fallback(url, init, response, baseFetch, wallet);
21
+ }
22
+ return response;
23
+ };
24
+ }
25
+ async function tryProactiveSigning(init, wallet, getToolByName) {
26
+ if (!getToolByName || !init?.body) {
27
+ return undefined;
28
+ }
29
+ if (init.method && init.method.toUpperCase() !== 'POST') {
30
+ return undefined;
31
+ }
32
+ const toolName = extractToolCallName(init.body);
33
+ if (!toolName) {
34
+ return undefined;
35
+ }
36
+ const tool = getToolByName(toolName);
37
+ if (!tool) {
38
+ logger.debug(`Tool "${toolName}" not found in cache, skipping proactive signing`);
39
+ return undefined;
40
+ }
41
+ const meta = tool._meta;
42
+ const x402 = meta?.x402;
43
+ if (!x402 || !x402.paymentRequired) {
44
+ return undefined;
45
+ }
46
+ if (!x402.scheme || !x402.network || !x402.amount || !x402.asset || !x402.payTo) {
47
+ logger.debug(`Tool "${toolName}" has x402 metadata but missing fields, skipping proactive signing`);
48
+ return undefined;
49
+ }
50
+ const accept = {
51
+ scheme: x402.scheme,
52
+ network: x402.network,
53
+ amount: x402.amount,
54
+ asset: x402.asset,
55
+ payTo: x402.payTo,
56
+ maxTimeoutSeconds: x402.maxTimeoutSeconds || 3600,
57
+ ...(x402.extra && { extra: x402.extra }),
58
+ };
59
+ try {
60
+ const result = await signPayment({ wallet, accept });
61
+ logger.debug(`Proactive payment signed: $${result.amountUsd.toFixed(4)} to ${result.to} on ${result.networkLabel}`);
62
+ return result.paymentSignatureBase64;
63
+ }
64
+ catch (error) {
65
+ logger.warn(`Proactive signing failed for tool "${toolName}":`, error);
66
+ return undefined;
67
+ }
68
+ }
69
+ async function handle402Fallback(url, originalInit, response402, baseFetch, wallet) {
70
+ const paymentRequiredBase64 = response402.headers.get('PAYMENT-REQUIRED') || response402.headers.get('payment-required');
71
+ if (!paymentRequiredBase64) {
72
+ logger.debug('402 response has no PAYMENT-REQUIRED header, passing through');
73
+ return response402;
74
+ }
75
+ logger.debug('Received 402 with PAYMENT-REQUIRED header, signing payment...');
76
+ let header;
77
+ let accept;
78
+ try {
79
+ ({ header, accept } = parsePaymentRequired(paymentRequiredBase64));
80
+ }
81
+ catch (error) {
82
+ logger.warn('Failed to parse PAYMENT-REQUIRED header:', error);
83
+ return response402;
84
+ }
85
+ try {
86
+ const result = await signPayment({
87
+ wallet,
88
+ accept,
89
+ resource: header.resource,
90
+ });
91
+ logger.debug(`402 fallback payment signed: $${result.amountUsd.toFixed(4)} to ${result.to} on ${result.networkLabel}`);
92
+ const retryInit = injectPaymentHeader(originalInit, result.paymentSignatureBase64);
93
+ return await baseFetch(url, retryInit);
94
+ }
95
+ catch (error) {
96
+ logger.warn('402 fallback signing failed:', error);
97
+ return response402;
98
+ }
99
+ }
100
+ function extractToolCallName(body) {
101
+ if (!body || typeof body !== 'string') {
102
+ return undefined;
103
+ }
104
+ try {
105
+ const parsed = JSON.parse(body);
106
+ if (!Array.isArray(parsed)) {
107
+ const req = parsed;
108
+ if (req.method === 'tools/call' && req.params?.name) {
109
+ return req.params.name;
110
+ }
111
+ return undefined;
112
+ }
113
+ for (const item of parsed) {
114
+ const req = item;
115
+ if (req.method === 'tools/call' && req.params?.name) {
116
+ return req.params.name;
117
+ }
118
+ }
119
+ return undefined;
120
+ }
121
+ catch {
122
+ return undefined;
123
+ }
124
+ }
125
+ function injectPaymentHeader(init, paymentSignature) {
126
+ const headers = new Headers(init?.headers);
127
+ headers.set('PAYMENT-SIGNATURE', paymentSignature);
128
+ return {
129
+ ...init,
130
+ headers,
131
+ };
132
+ }
133
+ //# sourceMappingURL=fetch-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-middleware.js","sourceRoot":"","sources":["../../../src/lib/x402/fetch-middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export declare const X402_VERSION = 2;
2
+ export interface PaymentRequiredAccept {
3
+ scheme: string;
4
+ network: string;
5
+ amount: string;
6
+ asset: string;
7
+ payTo: string;
8
+ maxTimeoutSeconds: number;
9
+ extra?: {
10
+ name?: string;
11
+ version?: string;
12
+ };
13
+ }
14
+ export interface PaymentRequiredHeader {
15
+ x402Version: number;
16
+ resource?: {
17
+ url?: string;
18
+ description?: string;
19
+ mimeType?: string;
20
+ };
21
+ accepts: PaymentRequiredAccept[];
22
+ }
23
+ export interface SignerWallet {
24
+ privateKey: string;
25
+ address: string;
26
+ }
27
+ export interface SignPaymentInput {
28
+ wallet: SignerWallet;
29
+ accept: PaymentRequiredAccept;
30
+ resource?: PaymentRequiredHeader['resource'];
31
+ amountOverride?: bigint;
32
+ expiryOverride?: number;
33
+ }
34
+ export interface SignPaymentResult {
35
+ paymentSignatureBase64: string;
36
+ from: string;
37
+ to: string;
38
+ amountUsd: number;
39
+ amountAtomicUnits: bigint;
40
+ networkLabel: string;
41
+ expiresAt: Date;
42
+ }
43
+ export declare function parsePaymentRequired(base64Value: string): {
44
+ header: PaymentRequiredHeader;
45
+ accept: PaymentRequiredAccept;
46
+ };
47
+ export declare function signPayment(input: SignPaymentInput): Promise<SignPaymentResult>;
48
+ //# sourceMappingURL=signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../../src/lib/x402/signer.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,YAAY,IAAI,CAAC;AA4C9B,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAGD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,CAAC,EAAE,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAE7C,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAEhC,sBAAsB,EAAE,MAAM,CAAC;IAE/B,IAAI,EAAE,MAAM,CAAC;IAEb,EAAE,EAAE,MAAM,CAAC;IAEX,SAAS,EAAE,MAAM,CAAC;IAElB,iBAAiB,EAAE,MAAM,CAAC;IAE1B,YAAY,EAAE,MAAM,CAAC;IAErB,SAAS,EAAE,IAAI,CAAC;CACjB;AAoBD,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG;IACzD,MAAM,EAAE,qBAAqB,CAAC;IAC9B,MAAM,EAAE,qBAAqB,CAAC;CAC/B,CAiCA;AASD,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6FrF"}
@@ -0,0 +1,139 @@
1
+ import { privateKeyToAccount } from 'viem/accounts';
2
+ import { createWalletClient, http } from 'viem';
3
+ import { base, baseSepolia } from 'viem/chains';
4
+ import { ClientError } from '../errors.js';
5
+ export const X402_VERSION = 2;
6
+ const USDC_DECIMALS = 6;
7
+ const TRANSFER_WITH_AUTHORIZATION_TYPES = {
8
+ TransferWithAuthorization: [
9
+ { name: 'from', type: 'address' },
10
+ { name: 'to', type: 'address' },
11
+ { name: 'value', type: 'uint256' },
12
+ { name: 'validAfter', type: 'uint256' },
13
+ { name: 'validBefore', type: 'uint256' },
14
+ { name: 'nonce', type: 'bytes32' },
15
+ ],
16
+ };
17
+ const NETWORKS = {
18
+ [`eip155:${base.id}`]: {
19
+ chain: base,
20
+ networkId: `eip155:${base.id}`,
21
+ rpcUrl: 'https://mainnet.base.org',
22
+ label: 'Base Mainnet',
23
+ },
24
+ [`eip155:${baseSepolia.id}`]: {
25
+ chain: baseSepolia,
26
+ networkId: `eip155:${baseSepolia.id}`,
27
+ rpcUrl: 'https://sepolia.base.org',
28
+ label: 'Base Sepolia (testnet)',
29
+ },
30
+ };
31
+ function randomBytes32() {
32
+ const bytes = new Uint8Array(32);
33
+ crypto.getRandomValues(bytes);
34
+ return ('0x' + [...bytes].map((b) => b.toString(16).padStart(2, '0')).join(''));
35
+ }
36
+ export function parsePaymentRequired(base64Value) {
37
+ let decoded;
38
+ try {
39
+ decoded = Buffer.from(base64Value, 'base64').toString('utf-8');
40
+ }
41
+ catch {
42
+ throw new ClientError('Failed to base64-decode the PAYMENT-REQUIRED value.');
43
+ }
44
+ let header;
45
+ try {
46
+ header = JSON.parse(decoded);
47
+ }
48
+ catch {
49
+ throw new ClientError('PAYMENT-REQUIRED header is not valid JSON after base64 decoding.');
50
+ }
51
+ if (!header.accepts || !Array.isArray(header.accepts) || header.accepts.length === 0) {
52
+ throw new ClientError('PAYMENT-REQUIRED header has no "accepts" entries.');
53
+ }
54
+ const accept = header.accepts.find((a) => a.scheme === 'exact');
55
+ if (!accept) {
56
+ throw new ClientError(`No "exact" scheme found in PAYMENT-REQUIRED accepts. Available: ${header.accepts.map((a) => a.scheme).join(', ')}`);
57
+ }
58
+ if (!accept.payTo || !accept.amount || !accept.network || !accept.asset) {
59
+ throw new ClientError('PAYMENT-REQUIRED accept entry is missing required fields (payTo, amount, network, asset).');
60
+ }
61
+ return { header, accept };
62
+ }
63
+ export async function signPayment(input) {
64
+ const { wallet, accept, resource } = input;
65
+ const networkConfig = NETWORKS[accept.network];
66
+ if (!networkConfig) {
67
+ throw new ClientError(`Unknown network "${accept.network}" in payment requirements. Supported: ${Object.keys(NETWORKS).join(', ')}`);
68
+ }
69
+ const amountAtomicUnits = input.amountOverride ?? BigInt(accept.amount);
70
+ const amountUsd = Number(amountAtomicUnits) / 10 ** USDC_DECIMALS;
71
+ const expirySeconds = (input.expiryOverride ?? accept.maxTimeoutSeconds) || 3600;
72
+ const eip3009Name = accept.extra?.name ?? 'USDC';
73
+ const eip3009Version = accept.extra?.version ?? '2';
74
+ const account = privateKeyToAccount(wallet.privateKey);
75
+ const walletClient = createWalletClient({
76
+ account,
77
+ chain: networkConfig.chain,
78
+ transport: http(networkConfig.rpcUrl),
79
+ });
80
+ const nonce = randomBytes32();
81
+ const validBefore = BigInt(Math.floor(Date.now() / 1000) + expirySeconds);
82
+ const signature = await walletClient.signTypedData({
83
+ domain: {
84
+ name: eip3009Name,
85
+ version: eip3009Version,
86
+ chainId: networkConfig.chain.id,
87
+ verifyingContract: accept.asset,
88
+ },
89
+ types: TRANSFER_WITH_AUTHORIZATION_TYPES,
90
+ primaryType: 'TransferWithAuthorization',
91
+ message: {
92
+ from: account.address,
93
+ to: accept.payTo,
94
+ value: amountAtomicUnits,
95
+ validAfter: 0n,
96
+ validBefore,
97
+ nonce,
98
+ },
99
+ });
100
+ const paymentPayload = {
101
+ x402Version: X402_VERSION,
102
+ resource: resource ?? {
103
+ url: 'https://mcp.apify.com/mcp',
104
+ description: 'MCP Server',
105
+ mimeType: 'application/json',
106
+ },
107
+ payload: {
108
+ signature,
109
+ authorization: {
110
+ from: account.address,
111
+ to: accept.payTo,
112
+ value: amountAtomicUnits.toString(),
113
+ validAfter: '0',
114
+ validBefore: validBefore.toString(),
115
+ nonce,
116
+ },
117
+ },
118
+ accepted: {
119
+ scheme: 'exact',
120
+ network: networkConfig.networkId,
121
+ asset: accept.asset,
122
+ amount: amountAtomicUnits.toString(),
123
+ payTo: accept.payTo,
124
+ maxTimeoutSeconds: expirySeconds,
125
+ extra: { name: eip3009Name, version: eip3009Version },
126
+ },
127
+ };
128
+ const paymentSignatureBase64 = Buffer.from(JSON.stringify(paymentPayload)).toString('base64');
129
+ return {
130
+ paymentSignatureBase64,
131
+ from: account.address,
132
+ to: accept.payTo,
133
+ amountUsd,
134
+ amountAtomicUnits,
135
+ networkLabel: networkConfig.label,
136
+ expiresAt: new Date(Number(validBefore) * 1000),
137
+ };
138
+ }
139
+ //# sourceMappingURL=signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../../src/lib/x402/signer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apify/mcpc",
3
- "version": "0.1.11-beta.0",
3
+ "version": "0.1.11-beta.2",
4
4
  "description": "Universal command-line client for the Model Context Protocol (MCP).",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -61,7 +61,8 @@
61
61
  "ora": "^9.0.0",
62
62
  "proper-lockfile": "^4.1.2",
63
63
  "undici": "^7.22.0",
64
- "uuid": "^13.0.0"
64
+ "uuid": "^13.0.0",
65
+ "viem": "^2.46.3"
65
66
  },
66
67
  "devDependencies": {
67
68
  "@types/jest": "^30.0.0",