@clawpay-hedera/sdk 0.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.
Files changed (102) hide show
  1. package/README.md +294 -0
  2. package/dist/cli/index.d.ts +3 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +137 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/client/hedera-payment.d.ts +25 -0
  7. package/dist/client/hedera-payment.d.ts.map +1 -0
  8. package/dist/client/hedera-payment.js +68 -0
  9. package/dist/client/hedera-payment.js.map +1 -0
  10. package/dist/client/with-x402-client.d.ts +27 -0
  11. package/dist/client/with-x402-client.d.ts.map +1 -0
  12. package/dist/client/with-x402-client.js +136 -0
  13. package/dist/client/with-x402-client.js.map +1 -0
  14. package/dist/client.d.ts +2 -0
  15. package/dist/client.d.ts.map +1 -0
  16. package/dist/client.js +2 -0
  17. package/dist/client.js.map +1 -0
  18. package/dist/handler/proxy/hooks/analytics-hook.d.ts +299 -0
  19. package/dist/handler/proxy/hooks/analytics-hook.d.ts.map +1 -0
  20. package/dist/handler/proxy/hooks/analytics-hook.js +133 -0
  21. package/dist/handler/proxy/hooks/analytics-hook.js.map +1 -0
  22. package/dist/handler/proxy/hooks/auth-headers-hook.d.ts +20 -0
  23. package/dist/handler/proxy/hooks/auth-headers-hook.d.ts.map +1 -0
  24. package/dist/handler/proxy/hooks/auth-headers-hook.js +34 -0
  25. package/dist/handler/proxy/hooks/auth-headers-hook.js.map +1 -0
  26. package/dist/handler/proxy/hooks/hcs-audit-hook.d.ts +133 -0
  27. package/dist/handler/proxy/hooks/hcs-audit-hook.d.ts.map +1 -0
  28. package/dist/handler/proxy/hooks/hcs-audit-hook.js +138 -0
  29. package/dist/handler/proxy/hooks/hcs-audit-hook.js.map +1 -0
  30. package/dist/handler/proxy/hooks/logging-hook.d.ts +100 -0
  31. package/dist/handler/proxy/hooks/logging-hook.d.ts.map +1 -0
  32. package/dist/handler/proxy/hooks/logging-hook.js +14 -0
  33. package/dist/handler/proxy/hooks/logging-hook.js.map +1 -0
  34. package/dist/handler/proxy/hooks/x402-hook.d.ts +246 -0
  35. package/dist/handler/proxy/hooks/x402-hook.d.ts.map +1 -0
  36. package/dist/handler/proxy/hooks/x402-hook.js +219 -0
  37. package/dist/handler/proxy/hooks/x402-hook.js.map +1 -0
  38. package/dist/handler/proxy/hooks.d.ts +12111 -0
  39. package/dist/handler/proxy/hooks.d.ts.map +1 -0
  40. package/dist/handler/proxy/hooks.js +142 -0
  41. package/dist/handler/proxy/hooks.js.map +1 -0
  42. package/dist/handler/proxy/index.d.ts +3 -0
  43. package/dist/handler/proxy/index.d.ts.map +1 -0
  44. package/dist/handler/proxy/index.js +489 -0
  45. package/dist/handler/proxy/index.js.map +1 -0
  46. package/dist/handler/server/index.d.ts +25 -0
  47. package/dist/handler/server/index.d.ts.map +1 -0
  48. package/dist/handler/server/index.js +38 -0
  49. package/dist/handler/server/index.js.map +1 -0
  50. package/dist/handler/server/platform-detection.d.ts +32 -0
  51. package/dist/handler/server/platform-detection.d.ts.map +1 -0
  52. package/dist/handler/server/platform-detection.js +441 -0
  53. package/dist/handler/server/platform-detection.js.map +1 -0
  54. package/dist/handler/server/plugins/with-x402.d.ts +21 -0
  55. package/dist/handler/server/plugins/with-x402.d.ts.map +1 -0
  56. package/dist/handler/server/plugins/with-x402.js +290 -0
  57. package/dist/handler/server/plugins/with-x402.js.map +1 -0
  58. package/dist/handler/server/templates/x402-server.d.ts +16 -0
  59. package/dist/handler/server/templates/x402-server.d.ts.map +1 -0
  60. package/dist/handler/server/templates/x402-server.js +13 -0
  61. package/dist/handler/server/templates/x402-server.js.map +1 -0
  62. package/dist/handler/shared/hedera-price.d.ts +26 -0
  63. package/dist/handler/shared/hedera-price.d.ts.map +1 -0
  64. package/dist/handler/shared/hedera-price.js +54 -0
  65. package/dist/handler/shared/hedera-price.js.map +1 -0
  66. package/dist/handler.d.ts +14 -0
  67. package/dist/handler.d.ts.map +1 -0
  68. package/dist/handler.js +12 -0
  69. package/dist/handler.js.map +1 -0
  70. package/dist/index.d.ts +7 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +5 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/networks/hedera.d.ts +52 -0
  75. package/dist/networks/hedera.d.ts.map +1 -0
  76. package/dist/networks/hedera.js +61 -0
  77. package/dist/networks/hedera.js.map +1 -0
  78. package/dist/server/stdio/index.d.ts +2 -0
  79. package/dist/server/stdio/index.d.ts.map +1 -0
  80. package/dist/server/stdio/index.js +91 -0
  81. package/dist/server/stdio/index.js.map +1 -0
  82. package/dist/server/stdio/proxy-server.d.ts +9 -0
  83. package/dist/server/stdio/proxy-server.d.ts.map +1 -0
  84. package/dist/server/stdio/proxy-server.js +53 -0
  85. package/dist/server/stdio/proxy-server.js.map +1 -0
  86. package/dist/server/stdio/start-stdio-server.d.ts +28 -0
  87. package/dist/server/stdio/start-stdio-server.d.ts.map +1 -0
  88. package/dist/server/stdio/start-stdio-server.js +84 -0
  89. package/dist/server/stdio/start-stdio-server.js.map +1 -0
  90. package/dist/server.d.ts +6 -0
  91. package/dist/server.d.ts.map +1 -0
  92. package/dist/server.js +4 -0
  93. package/dist/server.js.map +1 -0
  94. package/dist/utils/signer.d.ts +4 -0
  95. package/dist/utils/signer.d.ts.map +1 -0
  96. package/dist/utils/signer.js +58 -0
  97. package/dist/utils/signer.js.map +1 -0
  98. package/dist/utils.d.ts +2 -0
  99. package/dist/utils.d.ts.map +1 -0
  100. package/dist/utils.js +2 -0
  101. package/dist/utils.js.map +1 -0
  102. package/package.json +86 -0
@@ -0,0 +1,136 @@
1
+ import { createPaymentHeader } from 'x402/client';
2
+ import { createHederaPaymentHeader } from './hedera-payment.js';
3
+ import { isHederaNetwork } from '../handler/shared/hedera-price.js';
4
+ // Hedera-supported networks only
5
+ const HEDERA_NETWORKS = ['hedera-testnet', 'hedera'];
6
+ /**
7
+ * Wraps an MCP client with X402 payment capabilities (Hedera-only)
8
+ */
9
+ export function withX402Client(client, x402Config) {
10
+ const { wallet: walletConfig, version } = x402Config;
11
+ const signer = { evm: walletConfig.evm, svm: walletConfig.svm };
12
+ const maxPaymentValue = x402Config.maxPaymentValue ?? BigInt(0.1 * 10 ** 6); // 0.10 USDC
13
+ const _listTools = client.listTools.bind(client);
14
+ const listTools = async (params, options) => {
15
+ const toolsRes = await _listTools(params, options);
16
+ toolsRes.tools = toolsRes.tools.map((tool) => {
17
+ let description = tool.description;
18
+ if (tool.annotations?.paymentHint) {
19
+ const cost = tool.annotations?.paymentPriceUSD
20
+ ? `${tool.annotations?.paymentPriceUSD}`
21
+ : "an unknown amount";
22
+ let paymentDetails = ` (This is a paid tool, you will be charged ${cost} for its execution via Hedera x402)`;
23
+ if (tool.annotations?.paymentNetworks && Array.isArray(tool.annotations.paymentNetworks)) {
24
+ const networks = tool.annotations.paymentNetworks;
25
+ if (networks.length > 0) {
26
+ paymentDetails += `\n\nPayment Details (Hedera):`;
27
+ networks.forEach((net) => {
28
+ const amount = net.maxAmountRequired;
29
+ const symbol = net.asset.symbol || 'USDC';
30
+ const decimals = net.asset.decimals || 6;
31
+ const formattedAmount = (Number(amount) / Math.pow(10, decimals)).toFixed(decimals);
32
+ paymentDetails += `\n• ${net.network}: ${formattedAmount} ${symbol}`;
33
+ paymentDetails += `\n Recipient: ${net.recipient}`;
34
+ });
35
+ }
36
+ }
37
+ description += paymentDetails;
38
+ }
39
+ return { ...tool, description };
40
+ });
41
+ return toolsRes;
42
+ };
43
+ const _callTool = client.callTool.bind(client);
44
+ const callToolWithPayment = async (params, resultSchema, options) => {
45
+ const res = await _callTool(params, resultSchema, options);
46
+ const maybeX402Error = res._meta?.["x402/error"];
47
+ if (res.isError &&
48
+ maybeX402Error &&
49
+ maybeX402Error.accepts &&
50
+ Array.isArray(maybeX402Error.accepts) &&
51
+ maybeX402Error.accepts.length > 0) {
52
+ const accepts = maybeX402Error.accepts;
53
+ const confirmationCallback = x402Config.confirmationCallback;
54
+ // Filter to Hedera networks only
55
+ const hederaAccepts = accepts.filter(a => HEDERA_NETWORKS.includes(a.network) ||
56
+ a.network.startsWith('hedera'));
57
+ const effectiveAccepts = hederaAccepts.length > 0 ? hederaAccepts : accepts;
58
+ let selectedReq;
59
+ if (confirmationCallback) {
60
+ const selection = await confirmationCallback(effectiveAccepts);
61
+ if (selection === false) {
62
+ return {
63
+ isError: true,
64
+ content: [{ type: "text", text: "User declined payment" }]
65
+ };
66
+ }
67
+ if (selection !== true) {
68
+ if (typeof selection === 'number') {
69
+ const idx = selection;
70
+ if (Number.isInteger(idx) && idx >= 0 && idx < effectiveAccepts.length) {
71
+ selectedReq = effectiveAccepts[idx];
72
+ }
73
+ }
74
+ else if (typeof selection === 'object' && selection) {
75
+ if ('index' in selection) {
76
+ const idx = selection.index;
77
+ if (Number.isInteger(idx) && idx >= 0 && idx < effectiveAccepts.length) {
78
+ selectedReq = effectiveAccepts[idx];
79
+ }
80
+ }
81
+ else if ('network' in selection) {
82
+ selectedReq = effectiveAccepts.find((a) => a.network === selection.network && a.scheme === 'exact');
83
+ }
84
+ else if ('requirement' in selection) {
85
+ const reqSel = selection.requirement;
86
+ selectedReq = effectiveAccepts.find((a) => a.scheme === reqSel.scheme &&
87
+ a.network === reqSel.network &&
88
+ a.maxAmountRequired === reqSel.maxAmountRequired) ?? undefined;
89
+ }
90
+ }
91
+ }
92
+ }
93
+ // Default: prefer hedera-testnet, then any exact scheme
94
+ const req = selectedReq ?? (effectiveAccepts.find((a) => a?.scheme === "exact" && a.network === "hedera-testnet")
95
+ ?? effectiveAccepts.find((a) => a?.scheme === "exact")
96
+ ?? effectiveAccepts[0]);
97
+ if (!req || req.scheme !== "exact") {
98
+ return res;
99
+ }
100
+ const maxAmountRequired = BigInt(req.maxAmountRequired);
101
+ if (maxAmountRequired > maxPaymentValue) {
102
+ return {
103
+ isError: true,
104
+ content: [
105
+ {
106
+ type: "text",
107
+ text: `Payment exceeds client cap: ${maxAmountRequired} > ${maxPaymentValue}`
108
+ }
109
+ ]
110
+ };
111
+ }
112
+ const token = isHederaNetwork(req.network) && x402Config.hederaConfig
113
+ ? await createHederaPaymentHeader(x402Config.hederaConfig, req)
114
+ : await createPaymentHeader(signer, version ?? 1, req);
115
+ const paidRes = await _callTool({
116
+ ...params,
117
+ _meta: {
118
+ ...(params._meta ?? {}),
119
+ "x402/payment": token
120
+ }
121
+ }, resultSchema, options);
122
+ return paidRes;
123
+ }
124
+ return res;
125
+ };
126
+ const _client = client;
127
+ _client.listTools = listTools;
128
+ Object.defineProperty(_client, "callTool", {
129
+ value: callToolWithPayment,
130
+ writable: false,
131
+ enumerable: false,
132
+ configurable: true
133
+ });
134
+ return _client;
135
+ }
136
+ //# sourceMappingURL=with-x402-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-x402-client.js","sourceRoot":"","sources":["../../src/client/with-x402-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { withX402Client } from './client/with-x402-client';
2
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/client.js ADDED
@@ -0,0 +1,2 @@
1
+ export { withX402Client } from './client/with-x402-client';
2
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,299 @@
1
+ import type { CallToolRequest, CallToolResult, InitializeResult, ListToolsResult, ListPromptsResult, ListResourcesResult, ListResourceTemplatesResult, ReadResourceResult, Request as McpRequest, Result as McpResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import type { Hook, RequestExtra, InitializeRequestWithContext, ListToolsRequestWithContext, ListPromptsRequestWithContext, ListResourcesRequestWithContext, ListResourceTemplatesRequestWithContext, ReadResourceRequestWithContext } from "../hooks.js";
3
+ export type AnalyticsSink = (event: Record<string, unknown>) => Promise<void>;
4
+ export declare class AnalyticsHook implements Hook {
5
+ name: string;
6
+ private sink;
7
+ private origin;
8
+ constructor(sink: AnalyticsSink, origin: string);
9
+ processCallToolResult(res: CallToolResult, req: CallToolRequest, extra: RequestExtra): Promise<{
10
+ resultType: "continue";
11
+ response: {
12
+ [x: string]: unknown;
13
+ content: ({
14
+ [x: string]: unknown;
15
+ type: "text";
16
+ text: string;
17
+ _meta?: {
18
+ [x: string]: unknown;
19
+ } | undefined;
20
+ } | {
21
+ [x: string]: unknown;
22
+ type: "image";
23
+ data: string;
24
+ mimeType: string;
25
+ _meta?: {
26
+ [x: string]: unknown;
27
+ } | undefined;
28
+ } | {
29
+ [x: string]: unknown;
30
+ type: "audio";
31
+ data: string;
32
+ mimeType: string;
33
+ _meta?: {
34
+ [x: string]: unknown;
35
+ } | undefined;
36
+ } | {
37
+ [x: string]: unknown;
38
+ type: "resource_link";
39
+ name: string;
40
+ uri: string;
41
+ _meta?: {
42
+ [x: string]: unknown;
43
+ } | undefined;
44
+ mimeType?: string | undefined;
45
+ title?: string | undefined;
46
+ description?: string | undefined;
47
+ icons?: {
48
+ [x: string]: unknown;
49
+ src: string;
50
+ mimeType?: string | undefined;
51
+ sizes?: string | undefined;
52
+ }[] | undefined;
53
+ } | {
54
+ [x: string]: unknown;
55
+ type: "resource";
56
+ resource: {
57
+ [x: string]: unknown;
58
+ text: string;
59
+ uri: string;
60
+ _meta?: {
61
+ [x: string]: unknown;
62
+ } | undefined;
63
+ mimeType?: string | undefined;
64
+ } | {
65
+ [x: string]: unknown;
66
+ uri: string;
67
+ blob: string;
68
+ _meta?: {
69
+ [x: string]: unknown;
70
+ } | undefined;
71
+ mimeType?: string | undefined;
72
+ };
73
+ _meta?: {
74
+ [x: string]: unknown;
75
+ } | undefined;
76
+ })[];
77
+ _meta?: {
78
+ [x: string]: unknown;
79
+ } | undefined;
80
+ structuredContent?: {
81
+ [x: string]: unknown;
82
+ } | undefined;
83
+ isError?: boolean | undefined;
84
+ };
85
+ }>;
86
+ processInitializeResult(res: InitializeResult, req: InitializeRequestWithContext, extra: RequestExtra): Promise<{
87
+ resultType: "continue";
88
+ response: {
89
+ [x: string]: unknown;
90
+ capabilities: {
91
+ [x: string]: unknown;
92
+ tools?: {
93
+ [x: string]: unknown;
94
+ listChanged?: boolean | undefined;
95
+ } | undefined;
96
+ experimental?: {
97
+ [x: string]: unknown;
98
+ } | undefined;
99
+ prompts?: {
100
+ [x: string]: unknown;
101
+ listChanged?: boolean | undefined;
102
+ } | undefined;
103
+ logging?: {
104
+ [x: string]: unknown;
105
+ } | undefined;
106
+ completions?: {
107
+ [x: string]: unknown;
108
+ } | undefined;
109
+ resources?: {
110
+ [x: string]: unknown;
111
+ listChanged?: boolean | undefined;
112
+ subscribe?: boolean | undefined;
113
+ } | undefined;
114
+ };
115
+ protocolVersion: string;
116
+ serverInfo: {
117
+ [x: string]: unknown;
118
+ name: string;
119
+ version: string;
120
+ title?: string | undefined;
121
+ icons?: {
122
+ [x: string]: unknown;
123
+ src: string;
124
+ mimeType?: string | undefined;
125
+ sizes?: string | undefined;
126
+ }[] | undefined;
127
+ websiteUrl?: string | undefined;
128
+ };
129
+ _meta?: {
130
+ [x: string]: unknown;
131
+ } | undefined;
132
+ instructions?: string | undefined;
133
+ };
134
+ }>;
135
+ processListToolsResult(res: ListToolsResult, req: ListToolsRequestWithContext, extra: RequestExtra): Promise<{
136
+ resultType: "continue";
137
+ response: {
138
+ [x: string]: unknown;
139
+ tools: {
140
+ [x: string]: unknown;
141
+ name: string;
142
+ inputSchema: {
143
+ [x: string]: unknown;
144
+ type: "object";
145
+ properties?: {
146
+ [x: string]: unknown;
147
+ } | undefined;
148
+ required?: string[] | undefined;
149
+ };
150
+ _meta?: {
151
+ [x: string]: unknown;
152
+ } | undefined;
153
+ title?: string | undefined;
154
+ description?: string | undefined;
155
+ icons?: {
156
+ [x: string]: unknown;
157
+ src: string;
158
+ mimeType?: string | undefined;
159
+ sizes?: string | undefined;
160
+ }[] | undefined;
161
+ outputSchema?: {
162
+ [x: string]: unknown;
163
+ type: "object";
164
+ properties?: {
165
+ [x: string]: unknown;
166
+ } | undefined;
167
+ required?: string[] | undefined;
168
+ } | undefined;
169
+ annotations?: {
170
+ [x: string]: unknown;
171
+ title?: string | undefined;
172
+ readOnlyHint?: boolean | undefined;
173
+ destructiveHint?: boolean | undefined;
174
+ idempotentHint?: boolean | undefined;
175
+ openWorldHint?: boolean | undefined;
176
+ } | undefined;
177
+ }[];
178
+ _meta?: {
179
+ [x: string]: unknown;
180
+ } | undefined;
181
+ nextCursor?: string | undefined;
182
+ };
183
+ }>;
184
+ processListPromptsResult(res: ListPromptsResult, req: ListPromptsRequestWithContext, extra: RequestExtra): Promise<{
185
+ resultType: "continue";
186
+ response: {
187
+ [x: string]: unknown;
188
+ prompts: {
189
+ [x: string]: unknown;
190
+ name: string;
191
+ _meta?: {
192
+ [x: string]: unknown;
193
+ } | undefined;
194
+ title?: string | undefined;
195
+ description?: string | undefined;
196
+ icons?: {
197
+ [x: string]: unknown;
198
+ src: string;
199
+ mimeType?: string | undefined;
200
+ sizes?: string | undefined;
201
+ }[] | undefined;
202
+ arguments?: {
203
+ [x: string]: unknown;
204
+ name: string;
205
+ description?: string | undefined;
206
+ required?: boolean | undefined;
207
+ }[] | undefined;
208
+ }[];
209
+ _meta?: {
210
+ [x: string]: unknown;
211
+ } | undefined;
212
+ nextCursor?: string | undefined;
213
+ };
214
+ }>;
215
+ processListResourcesResult(res: ListResourcesResult, req: ListResourcesRequestWithContext, extra: RequestExtra): Promise<{
216
+ resultType: "continue";
217
+ response: {
218
+ [x: string]: unknown;
219
+ resources: {
220
+ [x: string]: unknown;
221
+ name: string;
222
+ uri: string;
223
+ _meta?: {
224
+ [x: string]: unknown;
225
+ } | undefined;
226
+ mimeType?: string | undefined;
227
+ title?: string | undefined;
228
+ description?: string | undefined;
229
+ icons?: {
230
+ [x: string]: unknown;
231
+ src: string;
232
+ mimeType?: string | undefined;
233
+ sizes?: string | undefined;
234
+ }[] | undefined;
235
+ }[];
236
+ _meta?: {
237
+ [x: string]: unknown;
238
+ } | undefined;
239
+ nextCursor?: string | undefined;
240
+ };
241
+ }>;
242
+ processListResourceTemplatesResult(res: ListResourceTemplatesResult, req: ListResourceTemplatesRequestWithContext, extra: RequestExtra): Promise<{
243
+ resultType: "continue";
244
+ response: {
245
+ [x: string]: unknown;
246
+ resourceTemplates: {
247
+ [x: string]: unknown;
248
+ name: string;
249
+ uriTemplate: string;
250
+ _meta?: {
251
+ [x: string]: unknown;
252
+ } | undefined;
253
+ mimeType?: string | undefined;
254
+ title?: string | undefined;
255
+ description?: string | undefined;
256
+ }[];
257
+ _meta?: {
258
+ [x: string]: unknown;
259
+ } | undefined;
260
+ nextCursor?: string | undefined;
261
+ };
262
+ }>;
263
+ processReadResourceResult(res: ReadResourceResult, req: ReadResourceRequestWithContext, extra: RequestExtra): Promise<{
264
+ resultType: "continue";
265
+ response: {
266
+ [x: string]: unknown;
267
+ contents: ({
268
+ [x: string]: unknown;
269
+ text: string;
270
+ uri: string;
271
+ _meta?: {
272
+ [x: string]: unknown;
273
+ } | undefined;
274
+ mimeType?: string | undefined;
275
+ } | {
276
+ [x: string]: unknown;
277
+ uri: string;
278
+ blob: string;
279
+ _meta?: {
280
+ [x: string]: unknown;
281
+ } | undefined;
282
+ mimeType?: string | undefined;
283
+ })[];
284
+ _meta?: {
285
+ [x: string]: unknown;
286
+ } | undefined;
287
+ };
288
+ }>;
289
+ processOtherResult(res: McpResult, req: McpRequest, extra: RequestExtra): Promise<{
290
+ resultType: "continue";
291
+ response: {
292
+ [x: string]: unknown;
293
+ _meta?: {
294
+ [x: string]: unknown;
295
+ } | undefined;
296
+ };
297
+ }>;
298
+ }
299
+ //# sourceMappingURL=analytics-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-hook.d.ts","sourceRoot":"","sources":["../../../../src/handler/proxy/hooks/analytics-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,2BAA2B,EAC3B,kBAAkB,EAClB,OAAO,IAAI,UAAU,EACrB,MAAM,IAAI,SAAS,EACtB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EACR,IAAI,EACJ,YAAY,EACZ,4BAA4B,EAC5B,2BAA2B,EAC3B,6BAA6B,EAC7B,+BAA+B,EAC/B,uCAAuC,EACvC,8BAA8B,EACjC,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9E,qBAAa,aAAc,YAAW,IAAI;IACtC,IAAI,SAAe;IACnB,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,MAAM,CAAS;gBAEX,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM;IAKzC,qBAAqB,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA2BpF,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,4BAA4B,EAAE,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAcrG,sBAAsB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,2BAA2B,EAAE,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAclG,wBAAwB,CAAC,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,6BAA6B,EAAE,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAcxG,0BAA0B,CAAC,GAAG,EAAE,mBAAmB,EAAE,GAAG,EAAE,+BAA+B,EAAE,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;IAc9G,kCAAkC,CACpC,GAAG,EAAE,2BAA2B,EAChC,GAAG,EAAE,uCAAuC,EAC5C,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;IAejB,yBAAyB,CAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,8BAA8B,EAAE,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;IAc3G,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY;;;;;;;;;CAahF"}
@@ -0,0 +1,133 @@
1
+ export class AnalyticsHook {
2
+ name = "analytics";
3
+ sink;
4
+ origin;
5
+ constructor(sink, origin) {
6
+ this.sink = sink;
7
+ this.origin = origin;
8
+ }
9
+ async processCallToolResult(res, req, extra) {
10
+ console.log("[AnalyticsHook] processCallToolResult called", { res, req, extra });
11
+ try {
12
+ // Deep clone the response to ensure we capture its state at this moment
13
+ // This is important because hooks execute in reverse order, and we want to capture
14
+ // the final response after all hooks (like VLayerHook) have modified it
15
+ const clonedRes = JSON.parse(JSON.stringify(res));
16
+ const clonedReq = JSON.parse(JSON.stringify(req));
17
+ // Log if proof is present in the response
18
+ const hasProof = clonedRes._meta && typeof clonedRes._meta === 'object' && 'vlayer/proof' in clonedRes._meta;
19
+ console.log("[AnalyticsHook] Storing response with proof:", hasProof, hasProof ? "Proof present" : "No proof");
20
+ this.sink({
21
+ request_id: extra?.requestId,
22
+ server_id: extra?.serverId,
23
+ origin: this.origin,
24
+ method: req.method,
25
+ meta: { res: clonedRes, req: clonedReq, extra },
26
+ ts: new Date().toISOString(),
27
+ });
28
+ }
29
+ catch (error) {
30
+ console.error("[AnalyticsHook] Error storing analytics:", error);
31
+ }
32
+ return { resultType: "continue", response: res };
33
+ }
34
+ async processInitializeResult(res, req, extra) {
35
+ try {
36
+ this.sink({
37
+ request_id: extra?.requestId,
38
+ server_id: extra?.serverId,
39
+ origin: this.origin,
40
+ method: req.method,
41
+ meta: { res, req, extra },
42
+ ts: new Date().toISOString(),
43
+ });
44
+ }
45
+ catch { }
46
+ return { resultType: "continue", response: res };
47
+ }
48
+ async processListToolsResult(res, req, extra) {
49
+ try {
50
+ this.sink({
51
+ request_id: extra?.requestId,
52
+ server_id: extra?.serverId,
53
+ origin: this.origin,
54
+ method: req.method,
55
+ meta: { res, req, extra },
56
+ ts: new Date().toISOString(),
57
+ });
58
+ }
59
+ catch { }
60
+ return { resultType: "continue", response: res };
61
+ }
62
+ async processListPromptsResult(res, req, extra) {
63
+ try {
64
+ this.sink({
65
+ request_id: extra?.requestId,
66
+ server_id: extra?.serverId,
67
+ origin: this.origin,
68
+ method: req.method,
69
+ meta: { res, req, extra },
70
+ ts: new Date().toISOString(),
71
+ });
72
+ }
73
+ catch { }
74
+ return { resultType: "continue", response: res };
75
+ }
76
+ async processListResourcesResult(res, req, extra) {
77
+ try {
78
+ this.sink({
79
+ request_id: extra?.requestId,
80
+ server_id: extra?.serverId,
81
+ origin: this.origin,
82
+ method: req.method,
83
+ meta: { res, req, extra },
84
+ ts: new Date().toISOString(),
85
+ });
86
+ }
87
+ catch { }
88
+ return { resultType: "continue", response: res };
89
+ }
90
+ async processListResourceTemplatesResult(res, req, extra) {
91
+ try {
92
+ this.sink({
93
+ request_id: extra?.requestId,
94
+ server_id: extra?.serverId,
95
+ origin: this.origin,
96
+ method: req.method,
97
+ meta: { res, req, extra },
98
+ ts: new Date().toISOString(),
99
+ });
100
+ }
101
+ catch { }
102
+ return { resultType: "continue", response: res };
103
+ }
104
+ async processReadResourceResult(res, req, extra) {
105
+ try {
106
+ this.sink({
107
+ request_id: extra?.requestId,
108
+ server_id: extra?.serverId,
109
+ origin: this.origin,
110
+ method: req.method,
111
+ meta: { res, req, extra },
112
+ ts: new Date().toISOString(),
113
+ });
114
+ }
115
+ catch { }
116
+ return { resultType: "continue", response: res };
117
+ }
118
+ async processOtherResult(res, req, extra) {
119
+ try {
120
+ this.sink({
121
+ request_id: extra?.requestId,
122
+ server_id: extra?.serverId,
123
+ origin: this.origin,
124
+ method: req?.method || "other",
125
+ meta: { res, req, extra },
126
+ ts: new Date().toISOString(),
127
+ });
128
+ }
129
+ catch { }
130
+ return { resultType: "continue", response: res };
131
+ }
132
+ }
133
+ //# sourceMappingURL=analytics-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-hook.js","sourceRoot":"","sources":["../../../../src/handler/proxy/hooks/analytics-hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { Request as McpRequest } from "@modelcontextprotocol/sdk/types.js";
2
+ import { Hook, RequestExtra, CallToolRequestWithContext } from "../hooks.js";
3
+ /**
4
+ * Injects per-server auth headers configured in DB into the forwarded upstream request.
5
+ * Looks up by RequestExtra.serverId.
6
+ */
7
+ type ResolvedHeaders = Headers | Record<string, string> | Array<[string, string]> | null | undefined;
8
+ export type ResolveAuthHeaders = (req: McpRequest, extra: RequestExtra) => Promise<ResolvedHeaders> | ResolvedHeaders;
9
+ export declare class AuthHeadersHook implements Hook {
10
+ private readonly resolveAuthHeaders;
11
+ name: string;
12
+ constructor(resolveAuthHeaders: ResolveAuthHeaders);
13
+ processCallToolRequest(req: CallToolRequestWithContext, _extra: RequestExtra): Promise<{
14
+ resultType: "continue";
15
+ request: CallToolRequestWithContext;
16
+ }>;
17
+ prepareUpstreamHeaders(headers: Headers, req: Request, extra: RequestExtra): Promise<void>;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=auth-headers-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-headers-hook.d.ts","sourceRoot":"","sources":["../../../../src/handler/proxy/hooks/auth-headers-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAE7E;;;GAGG;AACH,KAAK,eAAe,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;AAErG,MAAM,MAAM,kBAAkB,GAAG,CAC7B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,YAAY,KAClB,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AAEhD,qBAAa,eAAgB,YAAW,IAAI;IAG5B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAF/C,IAAI,SAAkB;gBAEO,kBAAkB,EAAE,kBAAkB;IAE7D,sBAAsB,CAAC,GAAG,EAAE,0BAA0B,EAAE,MAAM,EAAE,YAAY;;;;IAI5E,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY;CAsBnF"}
@@ -0,0 +1,34 @@
1
+ export class AuthHeadersHook {
2
+ resolveAuthHeaders;
3
+ name = "auth-headers";
4
+ constructor(resolveAuthHeaders) {
5
+ this.resolveAuthHeaders = resolveAuthHeaders;
6
+ }
7
+ async processCallToolRequest(req, _extra) {
8
+ return { resultType: "continue", request: req };
9
+ }
10
+ async prepareUpstreamHeaders(headers, req, extra) {
11
+ const resolved = await this.resolveAuthHeaders(req, extra);
12
+ if (!resolved)
13
+ return;
14
+ if (resolved instanceof Headers) {
15
+ resolved.forEach((value, key) => {
16
+ if (typeof value === "string" && value.length > 0)
17
+ headers.set(key, value);
18
+ });
19
+ return;
20
+ }
21
+ if (Array.isArray(resolved)) {
22
+ for (const [key, value] of resolved) {
23
+ if (typeof value === "string" && value.length > 0)
24
+ headers.set(key, value);
25
+ }
26
+ return;
27
+ }
28
+ for (const [key, value] of Object.entries(resolved)) {
29
+ if (typeof value === "string" && value.length > 0)
30
+ headers.set(key, value);
31
+ }
32
+ }
33
+ }
34
+ //# sourceMappingURL=auth-headers-hook.js.map