@fluxa-pay/fluxa-connect-mcp 0.1.4 → 0.1.6

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 (45) hide show
  1. package/dist/payment/payment-client.d.ts +14 -0
  2. package/dist/payment/payment-client.d.ts.map +1 -0
  3. package/dist/payment/payment-client.js +91 -0
  4. package/dist/payment/payment-client.js.map +1 -0
  5. package/dist/payment/payment-service.d.ts +41 -0
  6. package/dist/payment/payment-service.d.ts.map +1 -0
  7. package/dist/payment/payment-service.js +125 -0
  8. package/dist/payment/payment-service.js.map +1 -0
  9. package/dist/payment/types.d.ts +47 -0
  10. package/dist/payment/types.d.ts.map +1 -0
  11. package/dist/payment/types.js +5 -0
  12. package/dist/payment/types.js.map +1 -0
  13. package/dist/server/agent-registry.d.ts +18 -0
  14. package/dist/server/agent-registry.d.ts.map +1 -0
  15. package/dist/server/agent-registry.js +94 -0
  16. package/dist/server/agent-registry.js.map +1 -0
  17. package/dist/server/config.d.ts +27 -0
  18. package/dist/server/config.d.ts.map +1 -0
  19. package/dist/server/config.js +74 -0
  20. package/dist/server/config.js.map +1 -0
  21. package/dist/server/credential-cache.d.ts +46 -0
  22. package/dist/server/credential-cache.d.ts.map +1 -0
  23. package/dist/server/credential-cache.js +163 -0
  24. package/dist/server/credential-cache.js.map +1 -0
  25. package/dist/server/stdio-server.d.ts +7 -0
  26. package/dist/server/stdio-server.d.ts.map +1 -0
  27. package/dist/server/stdio-server.js +150 -0
  28. package/dist/server/stdio-server.js.map +1 -0
  29. package/dist/utils/api.d.ts +43 -0
  30. package/dist/utils/api.d.ts.map +1 -0
  31. package/dist/utils/api.js +164 -0
  32. package/dist/utils/api.js.map +1 -0
  33. package/dist/utils/error-messages.d.ts +21 -0
  34. package/dist/utils/error-messages.d.ts.map +1 -0
  35. package/dist/utils/error-messages.js +46 -0
  36. package/dist/utils/error-messages.js.map +1 -0
  37. package/dist/utils/jwt-utils.d.ts +25 -0
  38. package/dist/utils/jwt-utils.d.ts.map +1 -0
  39. package/dist/utils/jwt-utils.js +68 -0
  40. package/dist/utils/jwt-utils.js.map +1 -0
  41. package/dist/utils/logger.d.ts +23 -0
  42. package/dist/utils/logger.d.ts.map +1 -0
  43. package/dist/utils/logger.js +75 -0
  44. package/dist/utils/logger.js.map +1 -0
  45. package/package.json +5 -4
@@ -0,0 +1,25 @@
1
+ /**
2
+ * JWT utilities for parsing, validation, and refresh
3
+ */
4
+ export interface JWTPayload {
5
+ agent_id: string;
6
+ email: string;
7
+ iat: number;
8
+ exp: number;
9
+ }
10
+ export declare class JWTError extends Error {
11
+ constructor(message: string);
12
+ }
13
+ /**
14
+ * Parse JWT and extract payload
15
+ * Note: This does NOT validate the signature, just parses the payload
16
+ */
17
+ export declare function parseJWT(jwt: string): JWTPayload;
18
+ /**
19
+ * Check if JWT is expired or expiring soon
20
+ * @param jwt - JWT token to check
21
+ * @param bufferSeconds - How many seconds before expiry to consider "expired" (default: 300 = 5 minutes)
22
+ * @returns true if expired or expiring soon
23
+ */
24
+ export declare function isJWTExpired(jwt: string, bufferSeconds?: number): boolean;
25
+ //# sourceMappingURL=jwt-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-utils.d.ts","sourceRoot":"","sources":["../../src/utils/jwt-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBAAa,QAAS,SAAQ,KAAK;gBACrB,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAuBhD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,GAAE,MAAY,GAAG,OAAO,CA0B9E"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * JWT utilities for parsing, validation, and refresh
3
+ */
4
+ import { logger } from './logger.js';
5
+ export class JWTError extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = 'JWTError';
9
+ }
10
+ }
11
+ /**
12
+ * Parse JWT and extract payload
13
+ * Note: This does NOT validate the signature, just parses the payload
14
+ */
15
+ export function parseJWT(jwt) {
16
+ try {
17
+ const parts = jwt.split('.');
18
+ if (parts.length !== 3) {
19
+ throw new JWTError('Invalid JWT format');
20
+ }
21
+ // Decode base64url payload (middle part)
22
+ const payload = parts[1];
23
+ const decoded = Buffer.from(payload, 'base64url').toString('utf-8');
24
+ const parsed = JSON.parse(decoded);
25
+ if (!parsed.exp || !parsed.agent_id) {
26
+ throw new JWTError('JWT missing required fields (exp, agent_id)');
27
+ }
28
+ return parsed;
29
+ }
30
+ catch (error) {
31
+ if (error instanceof JWTError) {
32
+ throw error;
33
+ }
34
+ throw new JWTError(`Failed to parse JWT: ${error.message}`);
35
+ }
36
+ }
37
+ /**
38
+ * Check if JWT is expired or expiring soon
39
+ * @param jwt - JWT token to check
40
+ * @param bufferSeconds - How many seconds before expiry to consider "expired" (default: 300 = 5 minutes)
41
+ * @returns true if expired or expiring soon
42
+ */
43
+ export function isJWTExpired(jwt, bufferSeconds = 300) {
44
+ try {
45
+ const payload = parseJWT(jwt);
46
+ const expiresAt = payload.exp * 1000; // Convert to milliseconds
47
+ const now = Date.now();
48
+ const bufferMs = bufferSeconds * 1000;
49
+ const isExpired = (expiresAt - now) <= bufferMs;
50
+ if (isExpired) {
51
+ const timeUntilExpiry = Math.floor((expiresAt - now) / 1000);
52
+ logger.debug('jwt-utils', 'JWT expired or expiring soon', {
53
+ expiresAt: new Date(expiresAt).toISOString(),
54
+ timeUntilExpiry: `${timeUntilExpiry}s`,
55
+ bufferSeconds
56
+ });
57
+ }
58
+ return isExpired;
59
+ }
60
+ catch (error) {
61
+ // If we can't parse the JWT, treat it as expired
62
+ logger.warn('jwt-utils', 'Failed to parse JWT, treating as expired', {
63
+ error: error.message
64
+ });
65
+ return true;
66
+ }
67
+ }
68
+ //# sourceMappingURL=jwt-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-utils.js","sourceRoot":"","sources":["../../src/utils/jwt-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AASrC,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,QAAQ,CAAC,oBAAoB,CAAC,CAAC;QAC3C,CAAC;QAED,yCAAyC;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,IAAI,QAAQ,CAAC,6CAA6C,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,MAAoB,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,wBAAwB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,gBAAwB,GAAG;IACnE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,0BAA0B;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,aAAa,GAAG,IAAI,CAAC;QAEtC,MAAM,SAAS,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,IAAI,QAAQ,CAAC;QAEhD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,8BAA8B,EAAE;gBACxD,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;gBAC5C,eAAe,EAAE,GAAG,eAAe,GAAG;gBACtC,aAAa;aACd,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,iDAAiD;QACjD,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,0CAA0C,EAAE;YACnE,KAAK,EAAE,KAAK,CAAC,OAAO;SACrB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Structured logging utility
3
+ * Logs to stderr to avoid interfering with MCP stdio protocol
4
+ */
5
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
6
+ export interface LogContext {
7
+ [key: string]: any;
8
+ }
9
+ declare class Logger {
10
+ private minLevel;
11
+ private levelPriority;
12
+ setLevel(level: LogLevel): void;
13
+ private shouldLog;
14
+ private format;
15
+ private sanitizeContext;
16
+ debug(component: string, message: string, context?: LogContext): void;
17
+ info(component: string, message: string, context?: LogContext): void;
18
+ warn(component: string, message: string, context?: LogContext): void;
19
+ error(component: string, message: string, context?: LogContext): void;
20
+ }
21
+ export declare const logger: Logger;
22
+ export {};
23
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,cAAM,MAAM;IACV,OAAO,CAAC,QAAQ,CAAoB;IAEpC,OAAO,CAAC,aAAa,CAKnB;IAEF,QAAQ,CAAC,KAAK,EAAE,QAAQ;IAIxB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,MAAM;IAgBd,OAAO,CAAC,eAAe;IAqBvB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU;IAM9D,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU;IAM7D,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU;IAM7D,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU;CAK/D;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Structured logging utility
3
+ * Logs to stderr to avoid interfering with MCP stdio protocol
4
+ */
5
+ class Logger {
6
+ minLevel = 'info';
7
+ levelPriority = {
8
+ debug: 0,
9
+ info: 1,
10
+ warn: 2,
11
+ error: 3
12
+ };
13
+ setLevel(level) {
14
+ this.minLevel = level;
15
+ }
16
+ shouldLog(level) {
17
+ return this.levelPriority[level] >= this.levelPriority[this.minLevel];
18
+ }
19
+ format(level, component, message, context) {
20
+ const timestamp = new Date().toISOString();
21
+ const levelStr = level.toUpperCase().padEnd(5);
22
+ const componentStr = `[${component}]`;
23
+ let output = `${timestamp} ${levelStr} ${componentStr} ${message}`;
24
+ if (context && Object.keys(context).length > 0) {
25
+ // Filter out sensitive data
26
+ const sanitized = this.sanitizeContext(context);
27
+ output += ` ${JSON.stringify(sanitized)}`;
28
+ }
29
+ return output;
30
+ }
31
+ sanitizeContext(context) {
32
+ const sanitized = { ...context };
33
+ // Remove or mask sensitive fields
34
+ const sensitiveKeys = ['jwt', 'token', 'password', 'secret', 'authorization'];
35
+ for (const key of Object.keys(sanitized)) {
36
+ const lowerKey = key.toLowerCase();
37
+ if (sensitiveKeys.some(s => lowerKey.includes(s))) {
38
+ if (typeof sanitized[key] === 'string') {
39
+ // Show only length for sensitive strings
40
+ sanitized[key] = `[REDACTED:length=${sanitized[key].length}]`;
41
+ }
42
+ else {
43
+ sanitized[key] = '[REDACTED]';
44
+ }
45
+ }
46
+ }
47
+ return sanitized;
48
+ }
49
+ debug(component, message, context) {
50
+ if (this.shouldLog('debug')) {
51
+ console.error(this.format('debug', component, message, context));
52
+ }
53
+ }
54
+ info(component, message, context) {
55
+ if (this.shouldLog('info')) {
56
+ console.error(this.format('info', component, message, context));
57
+ }
58
+ }
59
+ warn(component, message, context) {
60
+ if (this.shouldLog('warn')) {
61
+ console.error(this.format('warn', component, message, context));
62
+ }
63
+ }
64
+ error(component, message, context) {
65
+ if (this.shouldLog('error')) {
66
+ console.error(this.format('error', component, message, context));
67
+ }
68
+ }
69
+ }
70
+ // Singleton instance
71
+ export const logger = new Logger();
72
+ // Set log level from environment
73
+ const logLevel = process.env.LOG_LEVEL?.toLowerCase() || 'info';
74
+ logger.setLevel(logLevel);
75
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@fluxa-pay/fluxa-connect-mcp",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "description": "MCP server with FluxA Wallet Service integration for X402 payments",
6
6
  "bin": {
7
- "fluxa-connect-mcp": "dist/stdio-server.js"
7
+ "fluxa-connect-mcp": "dist/server/stdio-server.js"
8
8
  },
9
9
  "files": [
10
10
  "dist",
@@ -31,8 +31,9 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@modelcontextprotocol/sdk": "1.18.2",
34
- "x402-fetch": "^0.7.0",
35
- "dotenv": "^16.0.0"
34
+ "axios": "^1.6.0",
35
+ "dotenv": "^16.0.0",
36
+ "x402-fetch": "^0.7.0"
36
37
  },
37
38
  "devDependencies": {
38
39
  "@types/node": "^20.0.0",