@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 @@
1
+ {"version":3,"file":"auth-headers-hook.js","sourceRoot":"","sources":["../../../../src/handler/proxy/hooks/auth-headers-hook.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,eAAe;IAGK;IAF7B,IAAI,GAAG,cAAc,CAAC;IAEtB,YAA6B,kBAAsC;QAAtC,uBAAkB,GAAlB,kBAAkB,CAAoB;IAAG,CAAC;IAEvE,KAAK,CAAC,sBAAsB,CAAC,GAA+B,EAAE,MAAoB;QAC9E,OAAO,EAAE,UAAU,EAAE,UAAmB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,OAAgB,EAAE,GAAY,EAAE,KAAmB;QAC5E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,IAAI,QAAQ,YAAY,OAAO,EAAE,CAAC;YAC9B,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/E,CAAC,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO;QACX,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/E,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * HCS Audit Trail Hook for ClawPay
3
+ *
4
+ * Logs every successful x402 payment to a Hedera Consensus Service (HCS) topic,
5
+ * creating an immutable, publicly verifiable audit trail of all MCP tool payments.
6
+ *
7
+ * Each MCP server gets its own HCS topic. Payment events are JSON messages
8
+ * containing transaction ID, amount, asset, tool name, and timestamp.
9
+ *
10
+ * View audit trails on HashScan: https://hashscan.io/testnet/topic/{topicId}
11
+ */
12
+ import type { CallToolRequest, CallToolResult } from "@modelcontextprotocol/sdk/types.js";
13
+ import type { Hook, RequestExtra } from "../hooks.js";
14
+ export interface HCSAuditConfig {
15
+ /** Hedera operator account ID (e.g. "0.0.12345") */
16
+ operatorId: string;
17
+ /** Hedera operator private key (DER-encoded hex) */
18
+ operatorKey: string;
19
+ /** Network: "testnet" or "mainnet" */
20
+ network: "testnet" | "mainnet";
21
+ /** Optional: pre-existing topic ID to use instead of creating one */
22
+ topicId?: string;
23
+ }
24
+ export interface HCSPaymentEvent {
25
+ type: "payment_settled";
26
+ txId: string;
27
+ network: string;
28
+ amount: string;
29
+ asset: string;
30
+ tool: string;
31
+ payer?: string;
32
+ serverId?: string;
33
+ timestamp: string;
34
+ }
35
+ /**
36
+ * HCS Audit Hook — logs payment events to Hedera Consensus Service.
37
+ *
38
+ * Lazily initializes the Hedera SDK and topic on first payment.
39
+ * Falls back gracefully if HCS submission fails (payment still succeeds).
40
+ */
41
+ export declare class HCSAuditHook implements Hook {
42
+ name: string;
43
+ private config;
44
+ private topicId;
45
+ private hederaClient;
46
+ private initialized;
47
+ constructor(config: HCSAuditConfig);
48
+ private ensureInitialized;
49
+ private submitAuditMessage;
50
+ /**
51
+ * Get the HCS topic ID for this audit trail.
52
+ * Returns null if not yet initialized.
53
+ */
54
+ getTopicId(): string | null;
55
+ processCallToolResult(res: CallToolResult, req: CallToolRequest, extra: RequestExtra): Promise<{
56
+ resultType: "continue";
57
+ response: {
58
+ [x: string]: unknown;
59
+ content: ({
60
+ [x: string]: unknown;
61
+ type: "text";
62
+ text: string;
63
+ _meta?: {
64
+ [x: string]: unknown;
65
+ } | undefined;
66
+ } | {
67
+ [x: string]: unknown;
68
+ type: "image";
69
+ data: string;
70
+ mimeType: string;
71
+ _meta?: {
72
+ [x: string]: unknown;
73
+ } | undefined;
74
+ } | {
75
+ [x: string]: unknown;
76
+ type: "audio";
77
+ data: string;
78
+ mimeType: string;
79
+ _meta?: {
80
+ [x: string]: unknown;
81
+ } | undefined;
82
+ } | {
83
+ [x: string]: unknown;
84
+ type: "resource_link";
85
+ name: string;
86
+ uri: string;
87
+ _meta?: {
88
+ [x: string]: unknown;
89
+ } | undefined;
90
+ mimeType?: string | undefined;
91
+ title?: string | undefined;
92
+ description?: string | undefined;
93
+ icons?: {
94
+ [x: string]: unknown;
95
+ src: string;
96
+ mimeType?: string | undefined;
97
+ sizes?: string | undefined;
98
+ }[] | undefined;
99
+ } | {
100
+ [x: string]: unknown;
101
+ type: "resource";
102
+ resource: {
103
+ [x: string]: unknown;
104
+ text: string;
105
+ uri: string;
106
+ _meta?: {
107
+ [x: string]: unknown;
108
+ } | undefined;
109
+ mimeType?: string | undefined;
110
+ } | {
111
+ [x: string]: unknown;
112
+ uri: string;
113
+ blob: string;
114
+ _meta?: {
115
+ [x: string]: unknown;
116
+ } | undefined;
117
+ mimeType?: string | undefined;
118
+ };
119
+ _meta?: {
120
+ [x: string]: unknown;
121
+ } | undefined;
122
+ })[];
123
+ _meta?: {
124
+ [x: string]: unknown;
125
+ } | undefined;
126
+ structuredContent?: {
127
+ [x: string]: unknown;
128
+ } | undefined;
129
+ isError?: boolean | undefined;
130
+ };
131
+ }>;
132
+ }
133
+ //# sourceMappingURL=hcs-audit-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hcs-audit-hook.d.ts","sourceRoot":"","sources":["../../../../src/handler/proxy/hooks/hcs-audit-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACR,eAAe,EACf,cAAc,EACjB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC3B,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC;IAC/B,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,qBAAa,YAAa,YAAW,IAAI;IACrC,IAAI,SAAe;IACnB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,cAAc;YAKpB,iBAAiB;YAwDjB,kBAAkB;IAoBhC;;;OAGG;IACH,UAAU,IAAI,MAAM,GAAG,IAAI;IAIrB,qBAAqB,CACvB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqD1B"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * HCS Audit Trail Hook for ClawPay
3
+ *
4
+ * Logs every successful x402 payment to a Hedera Consensus Service (HCS) topic,
5
+ * creating an immutable, publicly verifiable audit trail of all MCP tool payments.
6
+ *
7
+ * Each MCP server gets its own HCS topic. Payment events are JSON messages
8
+ * containing transaction ID, amount, asset, tool name, and timestamp.
9
+ *
10
+ * View audit trails on HashScan: https://hashscan.io/testnet/topic/{topicId}
11
+ */
12
+ /**
13
+ * HCS Audit Hook — logs payment events to Hedera Consensus Service.
14
+ *
15
+ * Lazily initializes the Hedera SDK and topic on first payment.
16
+ * Falls back gracefully if HCS submission fails (payment still succeeds).
17
+ */
18
+ export class HCSAuditHook {
19
+ name = "hcs-audit";
20
+ config;
21
+ topicId;
22
+ hederaClient = null;
23
+ initialized = false;
24
+ constructor(config) {
25
+ this.config = config;
26
+ this.topicId = config.topicId || null;
27
+ }
28
+ async ensureInitialized() {
29
+ if (this.initialized)
30
+ return true;
31
+ try {
32
+ // Dynamic import to avoid requiring @hashgraph/sdk when not using HCS
33
+ const { Client, TopicCreateTransaction, AccountId, PrivateKey } = await import("@hashgraph/sdk");
34
+ const client = this.config.network === "mainnet"
35
+ ? Client.forMainnet()
36
+ : Client.forTestnet();
37
+ // Try multiple key formats: ECDSA hex, DER, ED25519
38
+ let operatorKey;
39
+ try {
40
+ operatorKey = PrivateKey.fromStringECDSA(this.config.operatorKey);
41
+ }
42
+ catch {
43
+ try {
44
+ operatorKey = PrivateKey.fromStringDer(this.config.operatorKey);
45
+ }
46
+ catch {
47
+ operatorKey = PrivateKey.fromStringED25519(this.config.operatorKey);
48
+ }
49
+ }
50
+ client.setOperator(AccountId.fromString(this.config.operatorId), operatorKey);
51
+ this.hederaClient = client;
52
+ // Create topic if not provided
53
+ if (!this.topicId) {
54
+ const txResponse = await new TopicCreateTransaction()
55
+ .setTopicMemo("ClawPay Payment Audit Trail")
56
+ .execute(client);
57
+ const receipt = await txResponse.getReceipt(client);
58
+ this.topicId = receipt.topicId?.toString() || null;
59
+ if (this.topicId) {
60
+ console.log(`[HCSAuditHook] Created audit topic: ${this.topicId}`);
61
+ const base = this.config.network === "mainnet"
62
+ ? "https://hashscan.io/mainnet"
63
+ : "https://hashscan.io/testnet";
64
+ console.log(`[HCSAuditHook] View on HashScan: ${base}/topic/${this.topicId}`);
65
+ }
66
+ }
67
+ this.initialized = true;
68
+ return true;
69
+ }
70
+ catch (error) {
71
+ console.error("[HCSAuditHook] Failed to initialize:", error);
72
+ return false;
73
+ }
74
+ }
75
+ async submitAuditMessage(event) {
76
+ if (!this.hederaClient || !this.topicId)
77
+ return;
78
+ try {
79
+ const { TopicMessageSubmitTransaction, TopicId } = await import("@hashgraph/sdk");
80
+ const message = JSON.stringify(event);
81
+ await new TopicMessageSubmitTransaction()
82
+ .setTopicId(TopicId.fromString(this.topicId))
83
+ .setMessage(message)
84
+ .execute(this.hederaClient);
85
+ console.log(`[HCSAuditHook] Payment logged to topic ${this.topicId}: ${event.txId}`);
86
+ }
87
+ catch (error) {
88
+ // Don't fail the payment if HCS logging fails
89
+ console.error("[HCSAuditHook] Failed to submit audit message:", error);
90
+ }
91
+ }
92
+ /**
93
+ * Get the HCS topic ID for this audit trail.
94
+ * Returns null if not yet initialized.
95
+ */
96
+ getTopicId() {
97
+ return this.topicId;
98
+ }
99
+ async processCallToolResult(res, req, extra) {
100
+ // Check if this response contains a successful payment settlement
101
+ const meta = res._meta || {};
102
+ const paymentResponse = meta["x402/payment-response"];
103
+ if (paymentResponse?.success && paymentResponse.transaction) {
104
+ // Initialize HCS on first payment (lazy init)
105
+ const ready = await this.ensureInitialized();
106
+ if (!ready) {
107
+ return { resultType: "continue", response: res };
108
+ }
109
+ // Extract payment details from the x402 error metadata (original requirements)
110
+ const x402Error = meta["x402/error"];
111
+ const toolName = String(req?.params?.name ?? "unknown");
112
+ const firstAccept = x402Error?.accepts?.[0];
113
+ const event = {
114
+ type: "payment_settled",
115
+ txId: paymentResponse.transaction,
116
+ network: paymentResponse.network || "hedera-testnet",
117
+ amount: firstAccept?.maxAmountRequired || "unknown",
118
+ asset: firstAccept?.asset || "HBAR",
119
+ tool: toolName,
120
+ payer: paymentResponse.payer,
121
+ serverId: extra?.serverId || undefined,
122
+ timestamp: new Date().toISOString(),
123
+ };
124
+ // Submit to HCS (fire-and-forget, don't block the response)
125
+ this.submitAuditMessage(event).catch(() => { });
126
+ // Add HCS topic info to response metadata
127
+ if (this.topicId) {
128
+ res._meta["clawpay/hcs-topic"] = this.topicId;
129
+ const base = this.config.network === "mainnet"
130
+ ? "https://hashscan.io/mainnet"
131
+ : "https://hashscan.io/testnet";
132
+ res._meta["clawpay/hcs-url"] = `${base}/topic/${this.topicId}`;
133
+ }
134
+ }
135
+ return { resultType: "continue", response: res };
136
+ }
137
+ }
138
+ //# sourceMappingURL=hcs-audit-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hcs-audit-hook.js","sourceRoot":"","sources":["../../../../src/handler/proxy/hooks/hcs-audit-hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ import { CallToolRequest, CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import { Hook, RequestExtra } from "../hooks.js";
3
+ export declare class LoggingHook implements Hook {
4
+ name: string;
5
+ processCallToolRequest(req: CallToolRequest, extra: RequestExtra): Promise<{
6
+ resultType: "continue";
7
+ request: {
8
+ params: {
9
+ [x: string]: unknown;
10
+ name: string;
11
+ _meta?: {
12
+ [x: string]: unknown;
13
+ progressToken?: string | number | undefined;
14
+ } | undefined;
15
+ arguments?: {
16
+ [x: string]: unknown;
17
+ } | undefined;
18
+ };
19
+ method: "tools/call";
20
+ };
21
+ }>;
22
+ processCallToolResult(res: CallToolResult, req: CallToolRequest, extra: RequestExtra): Promise<{
23
+ resultType: "continue";
24
+ response: {
25
+ [x: string]: unknown;
26
+ content: ({
27
+ [x: string]: unknown;
28
+ type: "text";
29
+ text: string;
30
+ _meta?: {
31
+ [x: string]: unknown;
32
+ } | undefined;
33
+ } | {
34
+ [x: string]: unknown;
35
+ type: "image";
36
+ data: string;
37
+ mimeType: string;
38
+ _meta?: {
39
+ [x: string]: unknown;
40
+ } | undefined;
41
+ } | {
42
+ [x: string]: unknown;
43
+ type: "audio";
44
+ data: string;
45
+ mimeType: string;
46
+ _meta?: {
47
+ [x: string]: unknown;
48
+ } | undefined;
49
+ } | {
50
+ [x: string]: unknown;
51
+ type: "resource_link";
52
+ name: string;
53
+ uri: string;
54
+ _meta?: {
55
+ [x: string]: unknown;
56
+ } | undefined;
57
+ mimeType?: string | undefined;
58
+ title?: string | undefined;
59
+ description?: string | undefined;
60
+ icons?: {
61
+ [x: string]: unknown;
62
+ src: string;
63
+ mimeType?: string | undefined;
64
+ sizes?: string | undefined;
65
+ }[] | undefined;
66
+ } | {
67
+ [x: string]: unknown;
68
+ type: "resource";
69
+ resource: {
70
+ [x: string]: unknown;
71
+ text: string;
72
+ uri: string;
73
+ _meta?: {
74
+ [x: string]: unknown;
75
+ } | undefined;
76
+ mimeType?: string | undefined;
77
+ } | {
78
+ [x: string]: unknown;
79
+ uri: string;
80
+ blob: string;
81
+ _meta?: {
82
+ [x: string]: unknown;
83
+ } | undefined;
84
+ mimeType?: string | undefined;
85
+ };
86
+ _meta?: {
87
+ [x: string]: unknown;
88
+ } | undefined;
89
+ })[];
90
+ _meta?: {
91
+ [x: string]: unknown;
92
+ } | undefined;
93
+ structuredContent?: {
94
+ [x: string]: unknown;
95
+ } | undefined;
96
+ isError?: boolean | undefined;
97
+ };
98
+ }>;
99
+ }
100
+ //# sourceMappingURL=logging-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging-hook.d.ts","sourceRoot":"","sources":["../../../../src/handler/proxy/hooks/logging-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEjD,qBAAa,WAAY,YAAW,IAAI;IACpC,IAAI,SAAa;IACX,sBAAsB,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;IAIhE,qBAAqB,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM7F"}
@@ -0,0 +1,14 @@
1
+ export class LoggingHook {
2
+ name = "logging";
3
+ async processCallToolRequest(req, extra) {
4
+ console.log(`[${extra.requestId}] Tool called: ${JSON.stringify(req, null, 2)}`);
5
+ return { resultType: "continue", request: req };
6
+ }
7
+ async processCallToolResult(res, req, extra) {
8
+ console.log(`[${extra.requestId}] Response from: ${req.params.name}`);
9
+ console.log(`[${extra.requestId}] Response: ${JSON.stringify(res, null, 2)}`);
10
+ // Do not mutate the response shape; pass through unchanged to preserve JSON-RPC envelope expectations
11
+ return { resultType: "continue", response: res };
12
+ }
13
+ }
14
+ //# sourceMappingURL=logging-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging-hook.js","sourceRoot":"","sources":["../../../../src/handler/proxy/hooks/logging-hook.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,WAAW;IACpB,IAAI,GAAG,SAAS,CAAC;IACjB,KAAK,CAAC,sBAAsB,CAAC,GAAoB,EAAE,KAAmB;QAClE,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACjF,OAAO,EAAE,UAAU,EAAE,UAAmB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC7D,CAAC;IACD,KAAK,CAAC,qBAAqB,CAAC,GAAmB,EAAE,GAAoB,EAAE,KAAmB;QACtF,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,oBAAoB,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,eAAe,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9E,sGAAsG;QACtG,OAAO,EAAE,UAAU,EAAE,UAAmB,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAC9D,CAAC;CACJ"}
@@ -0,0 +1,246 @@
1
+ import type { CallToolRequest, CallToolResult, ListToolsResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import type { FacilitatorConfig, Network, Price } from "x402/types";
3
+ import type { Hook, RequestExtra, ListToolsRequestWithContext } from "../hooks.js";
4
+ export type RecipientWithTestnet = {
5
+ address: string;
6
+ isTestnet?: boolean;
7
+ };
8
+ export type X402ProxyConfig = {
9
+ recipient: Partial<Record<Network, string>> | Partial<Record<"evm", RecipientWithTestnet>>;
10
+ facilitator: FacilitatorConfig;
11
+ version?: number;
12
+ prices: Record<string, Price>;
13
+ };
14
+ export declare class X402MonetizationHook implements Hook {
15
+ name: string;
16
+ private readonly cfg;
17
+ private readonly verify;
18
+ private readonly settle;
19
+ private readonly x402Version;
20
+ constructor(cfg: X402ProxyConfig);
21
+ private normalizeRecipients;
22
+ private buildRequirements;
23
+ private paymentRequired;
24
+ processCallToolRequest(req: CallToolRequest, extra: RequestExtra): Promise<{
25
+ resultType: "continue";
26
+ request: {
27
+ params: {
28
+ [x: string]: unknown;
29
+ name: string;
30
+ _meta?: {
31
+ [x: string]: unknown;
32
+ progressToken?: string | number | undefined;
33
+ } | undefined;
34
+ arguments?: {
35
+ [x: string]: unknown;
36
+ } | undefined;
37
+ };
38
+ method: "tools/call";
39
+ };
40
+ response?: undefined;
41
+ } | {
42
+ resultType: "respond";
43
+ response: {
44
+ [x: string]: unknown;
45
+ content: ({
46
+ [x: string]: unknown;
47
+ type: "text";
48
+ text: string;
49
+ _meta?: {
50
+ [x: string]: unknown;
51
+ } | undefined;
52
+ } | {
53
+ [x: string]: unknown;
54
+ type: "image";
55
+ data: string;
56
+ mimeType: string;
57
+ _meta?: {
58
+ [x: string]: unknown;
59
+ } | undefined;
60
+ } | {
61
+ [x: string]: unknown;
62
+ type: "audio";
63
+ data: string;
64
+ mimeType: string;
65
+ _meta?: {
66
+ [x: string]: unknown;
67
+ } | undefined;
68
+ } | {
69
+ [x: string]: unknown;
70
+ type: "resource_link";
71
+ name: string;
72
+ uri: string;
73
+ _meta?: {
74
+ [x: string]: unknown;
75
+ } | undefined;
76
+ mimeType?: string | undefined;
77
+ title?: string | undefined;
78
+ description?: string | undefined;
79
+ icons?: {
80
+ [x: string]: unknown;
81
+ src: string;
82
+ mimeType?: string | undefined;
83
+ sizes?: string | undefined;
84
+ }[] | undefined;
85
+ } | {
86
+ [x: string]: unknown;
87
+ type: "resource";
88
+ resource: {
89
+ [x: string]: unknown;
90
+ text: string;
91
+ uri: string;
92
+ _meta?: {
93
+ [x: string]: unknown;
94
+ } | undefined;
95
+ mimeType?: string | undefined;
96
+ } | {
97
+ [x: string]: unknown;
98
+ uri: string;
99
+ blob: string;
100
+ _meta?: {
101
+ [x: string]: unknown;
102
+ } | undefined;
103
+ mimeType?: string | undefined;
104
+ };
105
+ _meta?: {
106
+ [x: string]: unknown;
107
+ } | undefined;
108
+ })[];
109
+ _meta?: {
110
+ [x: string]: unknown;
111
+ } | undefined;
112
+ structuredContent?: {
113
+ [x: string]: unknown;
114
+ } | undefined;
115
+ isError?: boolean | undefined;
116
+ };
117
+ request?: undefined;
118
+ }>;
119
+ processCallToolResult(res: CallToolResult, original: CallToolRequest, extra: RequestExtra): Promise<{
120
+ resultType: "continue";
121
+ response: {
122
+ [x: string]: unknown;
123
+ content: ({
124
+ [x: string]: unknown;
125
+ type: "text";
126
+ text: string;
127
+ _meta?: {
128
+ [x: string]: unknown;
129
+ } | undefined;
130
+ } | {
131
+ [x: string]: unknown;
132
+ type: "image";
133
+ data: string;
134
+ mimeType: string;
135
+ _meta?: {
136
+ [x: string]: unknown;
137
+ } | undefined;
138
+ } | {
139
+ [x: string]: unknown;
140
+ type: "audio";
141
+ data: string;
142
+ mimeType: string;
143
+ _meta?: {
144
+ [x: string]: unknown;
145
+ } | undefined;
146
+ } | {
147
+ [x: string]: unknown;
148
+ type: "resource_link";
149
+ name: string;
150
+ uri: string;
151
+ _meta?: {
152
+ [x: string]: unknown;
153
+ } | undefined;
154
+ mimeType?: string | undefined;
155
+ title?: string | undefined;
156
+ description?: string | undefined;
157
+ icons?: {
158
+ [x: string]: unknown;
159
+ src: string;
160
+ mimeType?: string | undefined;
161
+ sizes?: string | undefined;
162
+ }[] | undefined;
163
+ } | {
164
+ [x: string]: unknown;
165
+ type: "resource";
166
+ resource: {
167
+ [x: string]: unknown;
168
+ text: string;
169
+ uri: string;
170
+ _meta?: {
171
+ [x: string]: unknown;
172
+ } | undefined;
173
+ mimeType?: string | undefined;
174
+ } | {
175
+ [x: string]: unknown;
176
+ uri: string;
177
+ blob: string;
178
+ _meta?: {
179
+ [x: string]: unknown;
180
+ } | undefined;
181
+ mimeType?: string | undefined;
182
+ };
183
+ _meta?: {
184
+ [x: string]: unknown;
185
+ } | undefined;
186
+ })[];
187
+ _meta?: {
188
+ [x: string]: unknown;
189
+ } | undefined;
190
+ structuredContent?: {
191
+ [x: string]: unknown;
192
+ } | undefined;
193
+ isError?: boolean | undefined;
194
+ };
195
+ }>;
196
+ processListToolsResult(result: ListToolsResult, originalRequest: ListToolsRequestWithContext, extra: RequestExtra): Promise<{
197
+ resultType: "continue";
198
+ response: {
199
+ [x: string]: unknown;
200
+ tools: {
201
+ [x: string]: unknown;
202
+ name: string;
203
+ inputSchema: {
204
+ [x: string]: unknown;
205
+ type: "object";
206
+ properties?: {
207
+ [x: string]: unknown;
208
+ } | undefined;
209
+ required?: string[] | undefined;
210
+ };
211
+ _meta?: {
212
+ [x: string]: unknown;
213
+ } | undefined;
214
+ title?: string | undefined;
215
+ description?: string | undefined;
216
+ icons?: {
217
+ [x: string]: unknown;
218
+ src: string;
219
+ mimeType?: string | undefined;
220
+ sizes?: string | undefined;
221
+ }[] | undefined;
222
+ outputSchema?: {
223
+ [x: string]: unknown;
224
+ type: "object";
225
+ properties?: {
226
+ [x: string]: unknown;
227
+ } | undefined;
228
+ required?: string[] | undefined;
229
+ } | undefined;
230
+ annotations?: {
231
+ [x: string]: unknown;
232
+ title?: string | undefined;
233
+ readOnlyHint?: boolean | undefined;
234
+ destructiveHint?: boolean | undefined;
235
+ idempotentHint?: boolean | undefined;
236
+ openWorldHint?: boolean | undefined;
237
+ } | undefined;
238
+ }[];
239
+ _meta?: {
240
+ [x: string]: unknown;
241
+ } | undefined;
242
+ nextCursor?: string | undefined;
243
+ };
244
+ }>;
245
+ }
246
+ //# sourceMappingURL=x402-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-hook.d.ts","sourceRoot":"","sources":["../../../../src/handler/proxy/hooks/x402-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAe,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACxH,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAuC,KAAK,EAAE,MAAM,YAAY,CAAC;AAKzG,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AASnF,MAAM,MAAM,oBAAoB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAC5E,MAAM,MAAM,eAAe,GAAG;IAC1B,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC3F,WAAW,EAAE,iBAAiB,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CACjC,CAAC;AAQF,qBAAa,oBAAqB,YAAW,IAAI;IAC7C,IAAI,SAAuB;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8C;IACrE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8C;IACrE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,GAAG,EAAE,eAAe;IAQhC,OAAO,CAAC,mBAAmB;YAyBb,iBAAiB;IAkC/B,OAAO,CAAC,eAAe;IASjB,sBAAsB,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6ChE,qBAAqB,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgDzF,sBAAsB,CAAC,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,2BAA2B,EAAE,KAAK,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6C1H"}