@mseep/mcp-agent-social 1.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 (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -0
  3. package/bin/mcp-agent-social +30 -0
  4. package/dist/api-client.d.ts +31 -0
  5. package/dist/api-client.d.ts.map +1 -0
  6. package/dist/api-client.js +212 -0
  7. package/dist/api-client.js.map +1 -0
  8. package/dist/config.d.ts +19 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +79 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/hooks/index.d.ts +38 -0
  13. package/dist/hooks/index.d.ts.map +1 -0
  14. package/dist/hooks/index.js +253 -0
  15. package/dist/hooks/index.js.map +1 -0
  16. package/dist/hooks/types.d.ts +35 -0
  17. package/dist/hooks/types.d.ts.map +1 -0
  18. package/dist/hooks/types.js +4 -0
  19. package/dist/hooks/types.js.map +1 -0
  20. package/dist/http-server.d.ts +38 -0
  21. package/dist/http-server.d.ts.map +1 -0
  22. package/dist/http-server.js +210 -0
  23. package/dist/http-server.js.map +1 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +186 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/logger.d.ts +44 -0
  29. package/dist/logger.d.ts.map +1 -0
  30. package/dist/logger.js +281 -0
  31. package/dist/logger.js.map +1 -0
  32. package/dist/metrics.d.ts +47 -0
  33. package/dist/metrics.d.ts.map +1 -0
  34. package/dist/metrics.js +178 -0
  35. package/dist/metrics.js.map +1 -0
  36. package/dist/middleware/error-handler.d.ts +74 -0
  37. package/dist/middleware/error-handler.d.ts.map +1 -0
  38. package/dist/middleware/error-handler.js +218 -0
  39. package/dist/middleware/error-handler.js.map +1 -0
  40. package/dist/middleware/index.d.ts +55 -0
  41. package/dist/middleware/index.d.ts.map +1 -0
  42. package/dist/middleware/index.js +91 -0
  43. package/dist/middleware/index.js.map +1 -0
  44. package/dist/middleware/timeout.d.ts +52 -0
  45. package/dist/middleware/timeout.d.ts.map +1 -0
  46. package/dist/middleware/timeout.js +189 -0
  47. package/dist/middleware/timeout.js.map +1 -0
  48. package/dist/middleware/validator.d.ts +25 -0
  49. package/dist/middleware/validator.d.ts.map +1 -0
  50. package/dist/middleware/validator.js +186 -0
  51. package/dist/middleware/validator.js.map +1 -0
  52. package/dist/prompts/analyze.d.ts +46 -0
  53. package/dist/prompts/analyze.d.ts.map +1 -0
  54. package/dist/prompts/analyze.js +351 -0
  55. package/dist/prompts/analyze.js.map +1 -0
  56. package/dist/prompts/generate.d.ts +48 -0
  57. package/dist/prompts/generate.d.ts.map +1 -0
  58. package/dist/prompts/generate.js +177 -0
  59. package/dist/prompts/generate.js.map +1 -0
  60. package/dist/prompts/index.d.ts +23 -0
  61. package/dist/prompts/index.d.ts.map +1 -0
  62. package/dist/prompts/index.js +69 -0
  63. package/dist/prompts/index.js.map +1 -0
  64. package/dist/prompts/summarize.d.ts +32 -0
  65. package/dist/prompts/summarize.d.ts.map +1 -0
  66. package/dist/prompts/summarize.js +182 -0
  67. package/dist/prompts/summarize.js.map +1 -0
  68. package/dist/prompts/types.d.ts +34 -0
  69. package/dist/prompts/types.d.ts.map +1 -0
  70. package/dist/prompts/types.js +24 -0
  71. package/dist/prompts/types.js.map +1 -0
  72. package/dist/resources/agents.d.ts +17 -0
  73. package/dist/resources/agents.d.ts.map +1 -0
  74. package/dist/resources/agents.js +139 -0
  75. package/dist/resources/agents.js.map +1 -0
  76. package/dist/resources/feed.d.ts +19 -0
  77. package/dist/resources/feed.d.ts.map +1 -0
  78. package/dist/resources/feed.js +138 -0
  79. package/dist/resources/feed.js.map +1 -0
  80. package/dist/resources/index.d.ts +19 -0
  81. package/dist/resources/index.d.ts.map +1 -0
  82. package/dist/resources/index.js +146 -0
  83. package/dist/resources/index.js.map +1 -0
  84. package/dist/resources/posts.d.ts +17 -0
  85. package/dist/resources/posts.d.ts.map +1 -0
  86. package/dist/resources/posts.js +151 -0
  87. package/dist/resources/posts.js.map +1 -0
  88. package/dist/resources/types.d.ts +91 -0
  89. package/dist/resources/types.d.ts.map +1 -0
  90. package/dist/resources/types.js +12 -0
  91. package/dist/resources/types.js.map +1 -0
  92. package/dist/roots/index.d.ts +43 -0
  93. package/dist/roots/index.d.ts.map +1 -0
  94. package/dist/roots/index.js +131 -0
  95. package/dist/roots/index.js.map +1 -0
  96. package/dist/roots/types.d.ts +31 -0
  97. package/dist/roots/types.d.ts.map +1 -0
  98. package/dist/roots/types.js +4 -0
  99. package/dist/roots/types.js.map +1 -0
  100. package/dist/session-manager.d.ts +50 -0
  101. package/dist/session-manager.d.ts.map +1 -0
  102. package/dist/session-manager.js +127 -0
  103. package/dist/session-manager.js.map +1 -0
  104. package/dist/tools/create-post.d.ts +45 -0
  105. package/dist/tools/create-post.d.ts.map +1 -0
  106. package/dist/tools/create-post.js +119 -0
  107. package/dist/tools/create-post.js.map +1 -0
  108. package/dist/tools/index.d.ts +13 -0
  109. package/dist/tools/index.d.ts.map +1 -0
  110. package/dist/tools/index.js +44 -0
  111. package/dist/tools/index.js.map +1 -0
  112. package/dist/tools/login.d.ts +35 -0
  113. package/dist/tools/login.d.ts.map +1 -0
  114. package/dist/tools/login.js +132 -0
  115. package/dist/tools/login.js.map +1 -0
  116. package/dist/tools/read-posts.d.ts +48 -0
  117. package/dist/tools/read-posts.d.ts.map +1 -0
  118. package/dist/tools/read-posts.js +93 -0
  119. package/dist/tools/read-posts.js.map +1 -0
  120. package/dist/types.d.ts +88 -0
  121. package/dist/types.d.ts.map +1 -0
  122. package/dist/types.js +4 -0
  123. package/dist/types.js.map +1 -0
  124. package/dist/utils/json.d.ts +13 -0
  125. package/dist/utils/json.d.ts.map +1 -0
  126. package/dist/utils/json.js +48 -0
  127. package/dist/utils/json.js.map +1 -0
  128. package/dist/validation.d.ts +58 -0
  129. package/dist/validation.d.ts.map +1 -0
  130. package/dist/validation.js +223 -0
  131. package/dist/validation.js.map +1 -0
  132. package/package.json +70 -0
  133. package/src/api-client.ts +292 -0
  134. package/src/config.ts +92 -0
  135. package/src/hooks/index.ts +304 -0
  136. package/src/hooks/types.ts +44 -0
  137. package/src/http-server.ts +243 -0
  138. package/src/index.ts +213 -0
  139. package/src/logger.ts +326 -0
  140. package/src/metrics.ts +235 -0
  141. package/src/middleware/error-handler.ts +252 -0
  142. package/src/middleware/index.ts +112 -0
  143. package/src/middleware/timeout.ts +216 -0
  144. package/src/middleware/validator.ts +216 -0
  145. package/src/prompts/analyze.ts +404 -0
  146. package/src/prompts/generate.ts +217 -0
  147. package/src/prompts/index.ts +121 -0
  148. package/src/prompts/summarize.ts +217 -0
  149. package/src/prompts/types.ts +44 -0
  150. package/src/resources/agents.ts +165 -0
  151. package/src/resources/feed.ts +169 -0
  152. package/src/resources/index.ts +210 -0
  153. package/src/resources/posts.ts +179 -0
  154. package/src/resources/types.ts +104 -0
  155. package/src/roots/index.ts +166 -0
  156. package/src/roots/types.ts +36 -0
  157. package/src/session-manager.ts +149 -0
  158. package/src/tools/create-post.ts +154 -0
  159. package/src/tools/index.ts +70 -0
  160. package/src/tools/login.ts +169 -0
  161. package/src/tools/read-posts.ts +120 -0
  162. package/src/types.ts +107 -0
  163. package/src/utils/json.ts +46 -0
  164. package/src/validation.ts +322 -0
  165. package/tsconfig.json +22 -0
package/dist/index.js ADDED
@@ -0,0 +1,186 @@
1
+ // ABOUTME: Main entry point for the MCP Agent Social Media Server
2
+ // ABOUTME: Initializes and starts the MCP server with social media tools
3
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { ApiClient } from './api-client.js';
6
+ import { ENV_KEYS, config, validateConfig, version } from './config.js';
7
+ import { hooksManager } from './hooks/index.js';
8
+ import { HttpMcpServer } from './http-server.js';
9
+ import { logger } from './logger.js';
10
+ import { metrics } from './metrics.js';
11
+ import { registerPrompts } from './prompts/index.js';
12
+ import { registerResources } from './resources/index.js';
13
+ import { registerRoots } from './roots/index.js';
14
+ import { SessionManager } from './session-manager.js';
15
+ import { registerTools } from './tools/index.js';
16
+ // Initialize shared components
17
+ const sessionManager = new SessionManager();
18
+ const apiClient = new ApiClient();
19
+ // Server instances
20
+ let mcpServer = null;
21
+ let httpServer = null;
22
+ // Store cleanup interval globally for shutdown
23
+ let cleanupInterval = null;
24
+ let keepAliveInterval = null;
25
+ async function main() {
26
+ try {
27
+ // Log startup information
28
+ logger.info('MCP Server starting', {
29
+ nodeVersion: process.version,
30
+ platform: process.platform,
31
+ pid: process.pid,
32
+ logLevel: process.env[ENV_KEYS.LOG_LEVEL] || 'INFO',
33
+ });
34
+ validateConfig();
35
+ // Log configuration (without sensitive data)
36
+ logger.info(`Starting MCP server for team: ${config.teamName}`);
37
+ logger.debug('Configuration loaded', {
38
+ baseUrl: config.socialApiBaseUrl,
39
+ teamName: config.teamName,
40
+ timeout: config.apiTimeout,
41
+ logLevel: config.logLevel,
42
+ });
43
+ // Determine transport mode
44
+ const transportMode = process.env[ENV_KEYS.MCP_TRANSPORT] || 'stdio';
45
+ if (transportMode === 'http') {
46
+ // HTTP mode
47
+ const httpPort = Number.parseInt(process.env[ENV_KEYS.MCP_HTTP_PORT] || '3000', 10);
48
+ const httpHost = process.env[ENV_KEYS.MCP_HTTP_HOST] || 'localhost';
49
+ logger.info('Starting in HTTP mode', { port: httpPort, host: httpHost });
50
+ httpServer = new HttpMcpServer(sessionManager, apiClient, {
51
+ port: httpPort,
52
+ host: httpHost,
53
+ enableJsonResponse: process.env[ENV_KEYS.MCP_ENABLE_JSON] === 'true',
54
+ corsOrigin: process.env[ENV_KEYS.MCP_CORS_ORIGIN] || '*',
55
+ });
56
+ await httpServer.start();
57
+ }
58
+ else {
59
+ // Stdio mode (default)
60
+ logger.info('Starting in stdio mode');
61
+ mcpServer = new McpServer({
62
+ name: 'mcp-agent-social',
63
+ version,
64
+ });
65
+ const transport = new StdioServerTransport();
66
+ // Register all capabilities
67
+ registerTools(mcpServer, { sessionManager, apiClient, hooksManager });
68
+ registerResources(mcpServer, { apiClient, sessionManager, hooksManager });
69
+ registerPrompts(mcpServer, { apiClient, sessionManager, hooksManager });
70
+ registerRoots(mcpServer, { apiClient, sessionManager, hooksManager });
71
+ // Connect to transport
72
+ logger.debug('Connecting server to transport');
73
+ await mcpServer.connect(transport);
74
+ logger.info('Server connected successfully');
75
+ }
76
+ // The transport itself doesn't expose error handlers, but we can handle stdio events
77
+ process.stdin.on('error', (error) => {
78
+ logger.error('Stdin error', { error: error.message, stack: error.stack });
79
+ shutdown('STDIN_ERROR');
80
+ });
81
+ process.stdout.on('error', (error) => {
82
+ logger.error('Stdout error', { error: error.message, stack: error.stack });
83
+ shutdown('STDOUT_ERROR');
84
+ });
85
+ process.stdin.on('close', () => {
86
+ logger.warn('Stdin closed unexpectedly');
87
+ shutdown('STDIN_CLOSE');
88
+ });
89
+ process.stdin.on('end', () => {
90
+ logger.warn('Stdin ended');
91
+ shutdown('STDIN_END');
92
+ });
93
+ logger.info('MCP Agent Social Server running', {
94
+ toolsCount: 3,
95
+ resourcesCount: 6,
96
+ promptsCount: 8,
97
+ rootsEnabled: true,
98
+ hooksCount: hooksManager.getAllHooks().length,
99
+ transport: 'stdio',
100
+ });
101
+ // Set up graceful shutdown
102
+ process.on('SIGINT', () => shutdown('SIGINT'));
103
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
104
+ // Handle uncaught errors to prevent sudden crashes
105
+ process.on('uncaughtException', (error) => {
106
+ // Prevent infinite loops when logging EPIPE errors
107
+ if (error instanceof Error && 'code' in error && error.code === 'EPIPE') {
108
+ // Don't try to log EPIPE errors - just shutdown silently
109
+ shutdown('UNCAUGHT_EXCEPTION');
110
+ return;
111
+ }
112
+ logger.error('Uncaught exception', { error: error.message, stack: error.stack });
113
+ shutdown('UNCAUGHT_EXCEPTION');
114
+ });
115
+ process.on('unhandledRejection', (reason, promise) => {
116
+ // Prevent infinite loops when rejection is due to EPIPE errors
117
+ if (reason instanceof Error && 'code' in reason && reason.code === 'EPIPE') {
118
+ // Don't try to log EPIPE-related rejections - just shutdown silently
119
+ shutdown('UNHANDLED_REJECTION');
120
+ return;
121
+ }
122
+ logger.error('Unhandled rejection', { reason, promise });
123
+ shutdown('UNHANDLED_REJECTION');
124
+ });
125
+ // Set up periodic session cleanup (every 30 minutes)
126
+ cleanupInterval = setInterval(async () => {
127
+ const removed = await sessionManager.cleanupOldSessions(3600000); // 1 hour
128
+ if (removed > 0) {
129
+ logger.info(`Cleaned up ${removed} old sessions`);
130
+ }
131
+ }, 1800000); // 30 minutes
132
+ // Set up keepalive to prevent connection timeout
133
+ keepAliveInterval = setInterval(() => {
134
+ logger.debug('Keepalive ping', { uptime: process.uptime() });
135
+ }, 30000); // Every 30 seconds
136
+ }
137
+ catch (error) {
138
+ logger.error('Failed to start server', {
139
+ error: error instanceof Error ? error.message : String(error),
140
+ stack: error instanceof Error ? error.stack : undefined,
141
+ });
142
+ process.exit(1);
143
+ }
144
+ }
145
+ async function shutdown(signal) {
146
+ logger.serverShutdown(signal);
147
+ logger.warn(`Received ${signal}, shutting down gracefully...`);
148
+ // Clear intervals
149
+ if (cleanupInterval) {
150
+ clearInterval(cleanupInterval);
151
+ }
152
+ if (keepAliveInterval) {
153
+ clearInterval(keepAliveInterval);
154
+ }
155
+ // Shutdown metrics collector
156
+ metrics.shutdown();
157
+ // Clean up sessions
158
+ const sessionCount = sessionManager.getSessionCount();
159
+ if (sessionCount > 0) {
160
+ logger.info(`Cleaning up ${sessionCount} active sessions...`);
161
+ await sessionManager.clearAllSessions();
162
+ }
163
+ // Close server
164
+ try {
165
+ if (httpServer) {
166
+ await httpServer.stop();
167
+ logger.info('HTTP server closed successfully');
168
+ }
169
+ else if (mcpServer) {
170
+ await mcpServer.close();
171
+ logger.info('MCP server closed successfully');
172
+ }
173
+ }
174
+ catch (error) {
175
+ logger.error('Error closing server', { error });
176
+ }
177
+ // Exit with appropriate code
178
+ const exitCode = signal === 'UNCAUGHT_EXCEPTION' || signal === 'UNHANDLED_REJECTION' ? 1 : 0;
179
+ process.exit(exitCode);
180
+ }
181
+ main().catch((error) => {
182
+ // Write to stderr to avoid polluting JSON-RPC stream in stdio mode
183
+ process.stderr.write(`Unhandled error: ${error}\n`);
184
+ process.exit(1);
185
+ });
186
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export declare enum LogLevel {
2
+ SILENT = -1,
3
+ ERROR = 0,
4
+ WARN = 1,
5
+ INFO = 2,
6
+ DEBUG = 3
7
+ }
8
+ export interface LogContext {
9
+ tool?: string;
10
+ sessionId?: string;
11
+ agentName?: string;
12
+ requestId?: string;
13
+ [key: string]: unknown;
14
+ }
15
+ export declare class Logger {
16
+ private static instance;
17
+ private logLevel;
18
+ private startTime;
19
+ private isStdioMode;
20
+ private logFile;
21
+ private instanceId;
22
+ private constructor();
23
+ static getInstance(): Logger;
24
+ private parseLogLevel;
25
+ private formatMessage;
26
+ private log;
27
+ error(message: string, context?: LogContext): void;
28
+ warn(message: string, context?: LogContext): void;
29
+ info(message: string, context?: LogContext): void;
30
+ debug(message: string, context?: LogContext): void;
31
+ toolStart(toolName: string, args: unknown, context?: LogContext): void;
32
+ toolSuccess(toolName: string, duration: number, context?: LogContext): void;
33
+ toolError(toolName: string, error: Error, duration: number, context?: LogContext): void;
34
+ sessionCreated(sessionId: string, agentName: string): void;
35
+ sessionDeleted(sessionId: string, agentName?: string): void;
36
+ sessionValidationFailed(sessionId: string, reason: string): void;
37
+ apiRequest(method: string, url: string, context?: LogContext): void;
38
+ apiResponse(method: string, url: string, status: number, duration: number, context?: LogContext): void;
39
+ apiError(method: string, url: string, error: Error, context?: LogContext): void;
40
+ performance(operation: string, duration: number, context?: LogContext): void;
41
+ serverShutdown(reason: string, context?: LogContext): void;
42
+ }
43
+ export declare const logger: Logger;
44
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAQA,oBAAY,QAAQ;IAClB,MAAM,KAAK;IACX,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO;IAkCP,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,aAAa;IAkCrB,OAAO,CAAC,GAAG;IAoDX,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIlD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAKlD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAQtE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAS3E,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAYvF,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAI1D,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAI3D,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAShE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IASnE,WAAW,CACT,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,UAAU,GACnB,IAAI;IAaP,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAW/E,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAY5E,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;CAgC3D;AAGD,eAAO,MAAM,MAAM,QAAuB,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,281 @@
1
+ // ABOUTME: Enhanced logging utility for the MCP Agent Social Media Server
2
+ // ABOUTME: Provides structured logging with levels, context, and performance tracking
3
+ import { appendFileSync, existsSync, writeFileSync } from 'node:fs';
4
+ import { mkdirSync } from 'node:fs';
5
+ import { basename, dirname } from 'node:path';
6
+ import { ENV_KEYS } from './config.js';
7
+ export var LogLevel;
8
+ (function (LogLevel) {
9
+ LogLevel[LogLevel["SILENT"] = -1] = "SILENT";
10
+ LogLevel[LogLevel["ERROR"] = 0] = "ERROR";
11
+ LogLevel[LogLevel["WARN"] = 1] = "WARN";
12
+ LogLevel[LogLevel["INFO"] = 2] = "INFO";
13
+ LogLevel[LogLevel["DEBUG"] = 3] = "DEBUG";
14
+ })(LogLevel || (LogLevel = {}));
15
+ export class Logger {
16
+ static instance;
17
+ logLevel;
18
+ startTime;
19
+ isStdioMode;
20
+ logFile;
21
+ instanceId;
22
+ constructor() {
23
+ this.logLevel = this.parseLogLevel(process.env[ENV_KEYS.LOG_LEVEL] || 'INFO');
24
+ this.startTime = Date.now();
25
+ this.isStdioMode = process.env[ENV_KEYS.MCP_TRANSPORT] !== 'http';
26
+ this.logFile = process.env.LOG_FILE || null;
27
+ // Create instance identifier from current working directory + process ID
28
+ const dirName = basename(process.cwd()) || 'unknown';
29
+ this.instanceId = `${dirName}:${process.pid}`;
30
+ // Initialize log file if specified
31
+ if (this.logFile) {
32
+ try {
33
+ // Ensure directory exists
34
+ const logDir = dirname(this.logFile);
35
+ if (!existsSync(logDir)) {
36
+ mkdirSync(logDir, { recursive: true });
37
+ }
38
+ // Write startup banner to log file
39
+ const banner = `\n=== MCP Agent Social Server [${this.instanceId}] Started at ${new Date().toISOString()} ===\n`;
40
+ if (existsSync(this.logFile)) {
41
+ appendFileSync(this.logFile, banner);
42
+ }
43
+ else {
44
+ writeFileSync(this.logFile, banner);
45
+ }
46
+ }
47
+ catch (error) {
48
+ // If file logging fails, continue without it but log to stderr
49
+ process.stderr.write(`Failed to initialize log file ${this.logFile}: ${error}\n`);
50
+ this.logFile = null;
51
+ }
52
+ }
53
+ }
54
+ static getInstance() {
55
+ if (!Logger.instance) {
56
+ Logger.instance = new Logger();
57
+ }
58
+ return Logger.instance;
59
+ }
60
+ parseLogLevel(level) {
61
+ switch (level.toUpperCase()) {
62
+ case 'SILENT':
63
+ return LogLevel.SILENT;
64
+ case 'ERROR':
65
+ return LogLevel.ERROR;
66
+ case 'WARN':
67
+ return LogLevel.WARN;
68
+ case 'INFO':
69
+ return LogLevel.INFO;
70
+ case 'DEBUG':
71
+ return LogLevel.DEBUG;
72
+ default:
73
+ return LogLevel.INFO;
74
+ }
75
+ }
76
+ formatMessage(level, message, context) {
77
+ const timestamp = new Date().toISOString();
78
+ const uptime = Math.floor((Date.now() - this.startTime) / 1000);
79
+ let contextStr = '';
80
+ if (context) {
81
+ try {
82
+ contextStr = ` ${JSON.stringify(context)}`;
83
+ }
84
+ catch (error) {
85
+ // Handle circular references or other JSON serialization errors
86
+ contextStr = ` ${JSON.stringify({
87
+ ...context,
88
+ _jsonError: error instanceof Error ? error.message : 'Unknown JSON error',
89
+ }, (_key, value) => {
90
+ if (typeof value === 'object' && value !== null) {
91
+ // Simple circular reference detection
92
+ if (typeof value.toString === 'function' &&
93
+ value.toString().includes('[object Object]')) {
94
+ return '[Object]';
95
+ }
96
+ }
97
+ return value;
98
+ })}`;
99
+ }
100
+ }
101
+ return `[${timestamp}] [${level}] [${this.instanceId}] [uptime:${uptime}s] ${message}${contextStr}`;
102
+ }
103
+ log(level, levelStr, message, context) {
104
+ if (level <= this.logLevel) {
105
+ const formattedMessage = this.formatMessage(levelStr, message, context);
106
+ // Always write to file if configured
107
+ if (this.logFile) {
108
+ try {
109
+ appendFileSync(this.logFile, `${formattedMessage}\n`);
110
+ }
111
+ catch (error) {
112
+ // If file logging fails, try stderr but don't create infinite loops
113
+ try {
114
+ process.stderr.write(`File logging failed: ${error}\n`);
115
+ }
116
+ catch (_stderrError) {
117
+ // If both file and stderr fail, silently continue - avoid infinite loops
118
+ // This prevents EPIPE cascades when stdio is completely broken
119
+ }
120
+ }
121
+ }
122
+ try {
123
+ if (this.isStdioMode) {
124
+ // In stdio mode, write to stderr to avoid polluting JSON-RPC stream
125
+ process.stderr.write(`${formattedMessage}\n`);
126
+ }
127
+ else {
128
+ // In HTTP mode, use console logging
129
+ if (level === LogLevel.ERROR) {
130
+ console.error(formattedMessage);
131
+ }
132
+ else {
133
+ console.log(formattedMessage);
134
+ }
135
+ }
136
+ }
137
+ catch (error) {
138
+ // Completely ignore EPIPE errors to prevent infinite loops
139
+ // These happen when stdout/stderr are closed (e.g., when Claude Desktop disconnects)
140
+ if (error instanceof Error && 'code' in error && error.code === 'EPIPE') {
141
+ // Silent fail on EPIPE - don't try to log this error as it creates infinite loops
142
+ return;
143
+ }
144
+ // Only rethrow non-EPIPE errors, but also protect against infinite loops
145
+ if (this.logFile) {
146
+ try {
147
+ appendFileSync(this.logFile, `Logger stdio error: ${error}\n`);
148
+ }
149
+ catch (_fileError) {
150
+ // If both stdio and file fail, we're in a bad state - just return
151
+ return;
152
+ }
153
+ }
154
+ }
155
+ }
156
+ }
157
+ error(message, context) {
158
+ this.log(LogLevel.ERROR, 'ERROR', message, context);
159
+ }
160
+ warn(message, context) {
161
+ this.log(LogLevel.WARN, 'WARN', message, context);
162
+ }
163
+ info(message, context) {
164
+ this.log(LogLevel.INFO, 'INFO', message, context);
165
+ }
166
+ debug(message, context) {
167
+ this.log(LogLevel.DEBUG, 'DEBUG', message, context);
168
+ }
169
+ // Tool-specific logging helpers
170
+ toolStart(toolName, args, context) {
171
+ this.info(`Tool ${toolName} started`, {
172
+ tool: toolName,
173
+ args: args,
174
+ ...context,
175
+ });
176
+ }
177
+ toolSuccess(toolName, duration, context) {
178
+ this.info(`Tool ${toolName} completed`, {
179
+ tool: toolName,
180
+ duration: `${duration}ms`,
181
+ status: 'success',
182
+ ...context,
183
+ });
184
+ }
185
+ toolError(toolName, error, duration, context) {
186
+ this.error(`Tool ${toolName} failed`, {
187
+ tool: toolName,
188
+ duration: `${duration}ms`,
189
+ status: 'error',
190
+ error: error.message,
191
+ stack: error.stack,
192
+ ...context,
193
+ });
194
+ }
195
+ // Session-specific logging
196
+ sessionCreated(sessionId, agentName) {
197
+ this.info('Session created', { sessionId, agentName, event: 'session_created' });
198
+ }
199
+ sessionDeleted(sessionId, agentName) {
200
+ this.info('Session deleted', { sessionId, agentName, event: 'session_deleted' });
201
+ }
202
+ sessionValidationFailed(sessionId, reason) {
203
+ this.warn('Session validation failed', {
204
+ sessionId,
205
+ reason,
206
+ event: 'session_validation_failed',
207
+ });
208
+ }
209
+ // API-specific logging
210
+ apiRequest(method, url, context) {
211
+ this.debug(`API request: ${method} ${url}`, {
212
+ method,
213
+ url,
214
+ event: 'api_request',
215
+ ...context,
216
+ });
217
+ }
218
+ apiResponse(method, url, status, duration, context) {
219
+ const logMethod = status >= 400 ? this.warn.bind(this) : this.debug.bind(this);
220
+ logMethod(`API response: ${method} ${url} - ${status}`, {
221
+ method,
222
+ url,
223
+ status,
224
+ duration: `${duration}ms`,
225
+ event: 'api_response',
226
+ ...context,
227
+ });
228
+ }
229
+ apiError(method, url, error, context) {
230
+ this.error(`API error: ${method} ${url}`, {
231
+ method,
232
+ url,
233
+ error: error.message,
234
+ event: 'api_error',
235
+ ...context,
236
+ });
237
+ }
238
+ // Performance logging
239
+ performance(operation, duration, context) {
240
+ const logMethod = duration > 1000 ? this.warn.bind(this) : this.info.bind(this);
241
+ logMethod(`Performance: ${operation}`, {
242
+ operation,
243
+ duration: `${duration}ms`,
244
+ slow: duration > 1000,
245
+ ...context,
246
+ });
247
+ }
248
+ // Shutdown/death logging
249
+ serverShutdown(reason, context) {
250
+ const shutdownMessage = `=== SERVER SHUTDOWN: ${reason} at ${new Date().toISOString()} ===`;
251
+ // Always write shutdown to file if configured, even if log level is low
252
+ if (this.logFile) {
253
+ try {
254
+ appendFileSync(this.logFile, `${shutdownMessage}\n`);
255
+ if (context) {
256
+ appendFileSync(this.logFile, `Context: ${JSON.stringify(context)}\n`);
257
+ }
258
+ appendFileSync(this.logFile, `Uptime: ${Math.floor((Date.now() - this.startTime) / 1000)}s\n\n`);
259
+ }
260
+ catch (error) {
261
+ // Even if file logging fails, try to write to stderr but avoid infinite loops
262
+ try {
263
+ process.stderr.write(`File logging failed during shutdown: ${error}\n`);
264
+ }
265
+ catch (_stderrError) {
266
+ // If both fail during shutdown, we can't do much - just continue
267
+ }
268
+ }
269
+ }
270
+ // Also log normally
271
+ this.error(`Server shutting down: ${reason}`, {
272
+ reason,
273
+ uptime: Math.floor((Date.now() - this.startTime) / 1000),
274
+ timestamp: new Date().toISOString(),
275
+ ...context,
276
+ });
277
+ }
278
+ }
279
+ // Export singleton instance
280
+ export const logger = Logger.getInstance();
281
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export interface Metric {
2
+ name: string;
3
+ value: number;
4
+ timestamp: Date;
5
+ tags?: Record<string, string>;
6
+ }
7
+ export interface OperationMetrics {
8
+ count: number;
9
+ totalDuration: number;
10
+ minDuration: number;
11
+ maxDuration: number;
12
+ averageDuration: number;
13
+ lastDuration: number;
14
+ errors: number;
15
+ }
16
+ export declare class MetricsCollector {
17
+ private static instance;
18
+ private metrics;
19
+ private startTime;
20
+ private sessionCount;
21
+ private activeOperations;
22
+ private cleanupInterval;
23
+ private readonly OPERATION_TIMEOUT;
24
+ private constructor();
25
+ static getInstance(): MetricsCollector;
26
+ startOperation(operationName: string): string;
27
+ endOperation(operationId: string, success?: boolean): void;
28
+ private cleanupStaleOperations;
29
+ private recordOperation;
30
+ incrementSessionCount(): void;
31
+ decrementSessionCount(): void;
32
+ getSessionCount(): number;
33
+ getOperationMetrics(operationName: string): OperationMetrics | undefined;
34
+ getAllMetrics(): Record<string, OperationMetrics>;
35
+ getSystemMetrics(): {
36
+ uptime: number;
37
+ memoryUsage: ReturnType<typeof process.memoryUsage>;
38
+ sessionCount: number;
39
+ activeOperations: number;
40
+ };
41
+ getSummary(): string;
42
+ reset(): void;
43
+ shutdown(): void;
44
+ }
45
+ export declare const metrics: MetricsCollector;
46
+ export declare function withMetrics<T>(operationName: string, operation: () => Promise<T>): Promise<T>;
47
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,gBAAgB,CAAsB;IAC9C,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;IAEnD,OAAO;IAcP,MAAM,CAAC,WAAW,IAAI,gBAAgB;IAQtC,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAO7C,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,UAAO,GAAG,IAAI;IAevD,OAAO,CAAC,sBAAsB;IAmB9B,OAAO,CAAC,eAAe;IAiCvB,qBAAqB,IAAI,IAAI;IAI7B,qBAAqB,IAAI,IAAI;IAI7B,eAAe,IAAI,MAAM;IAKzB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAKxE,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC;IASjD,gBAAgB,IAAI;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC;QACpD,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;KAC1B;IAUD,UAAU,IAAI,MAAM;IAyBpB,KAAK,IAAI,IAAI;IAiBb,QAAQ,IAAI,IAAI;CAMjB;AAGD,eAAO,MAAM,OAAO,kBAAiC,CAAC;AAGtD,wBAAsB,WAAW,CAAC,CAAC,EACjC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CAUZ"}