@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.
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/bin/mcp-agent-social +30 -0
- package/dist/api-client.d.ts +31 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +212 -0
- package/dist/api-client.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -0
- package/dist/hooks/index.d.ts +38 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +253 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/types.d.ts +35 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +4 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/http-server.d.ts +38 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +210 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +186 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +44 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +281 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics.d.ts +47 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +178 -0
- package/dist/metrics.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +74 -0
- package/dist/middleware/error-handler.d.ts.map +1 -0
- package/dist/middleware/error-handler.js +218 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/index.d.ts +55 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +91 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/timeout.d.ts +52 -0
- package/dist/middleware/timeout.d.ts.map +1 -0
- package/dist/middleware/timeout.js +189 -0
- package/dist/middleware/timeout.js.map +1 -0
- package/dist/middleware/validator.d.ts +25 -0
- package/dist/middleware/validator.d.ts.map +1 -0
- package/dist/middleware/validator.js +186 -0
- package/dist/middleware/validator.js.map +1 -0
- package/dist/prompts/analyze.d.ts +46 -0
- package/dist/prompts/analyze.d.ts.map +1 -0
- package/dist/prompts/analyze.js +351 -0
- package/dist/prompts/analyze.js.map +1 -0
- package/dist/prompts/generate.d.ts +48 -0
- package/dist/prompts/generate.d.ts.map +1 -0
- package/dist/prompts/generate.js +177 -0
- package/dist/prompts/generate.js.map +1 -0
- package/dist/prompts/index.d.ts +23 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +69 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/summarize.d.ts +32 -0
- package/dist/prompts/summarize.d.ts.map +1 -0
- package/dist/prompts/summarize.js +182 -0
- package/dist/prompts/summarize.js.map +1 -0
- package/dist/prompts/types.d.ts +34 -0
- package/dist/prompts/types.d.ts.map +1 -0
- package/dist/prompts/types.js +24 -0
- package/dist/prompts/types.js.map +1 -0
- package/dist/resources/agents.d.ts +17 -0
- package/dist/resources/agents.d.ts.map +1 -0
- package/dist/resources/agents.js +139 -0
- package/dist/resources/agents.js.map +1 -0
- package/dist/resources/feed.d.ts +19 -0
- package/dist/resources/feed.d.ts.map +1 -0
- package/dist/resources/feed.js +138 -0
- package/dist/resources/feed.js.map +1 -0
- package/dist/resources/index.d.ts +19 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +146 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/posts.d.ts +17 -0
- package/dist/resources/posts.d.ts.map +1 -0
- package/dist/resources/posts.js +151 -0
- package/dist/resources/posts.js.map +1 -0
- package/dist/resources/types.d.ts +91 -0
- package/dist/resources/types.d.ts.map +1 -0
- package/dist/resources/types.js +12 -0
- package/dist/resources/types.js.map +1 -0
- package/dist/roots/index.d.ts +43 -0
- package/dist/roots/index.d.ts.map +1 -0
- package/dist/roots/index.js +131 -0
- package/dist/roots/index.js.map +1 -0
- package/dist/roots/types.d.ts +31 -0
- package/dist/roots/types.d.ts.map +1 -0
- package/dist/roots/types.js +4 -0
- package/dist/roots/types.js.map +1 -0
- package/dist/session-manager.d.ts +50 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +127 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/tools/create-post.d.ts +45 -0
- package/dist/tools/create-post.d.ts.map +1 -0
- package/dist/tools/create-post.js +119 -0
- package/dist/tools/create-post.js.map +1 -0
- package/dist/tools/index.d.ts +13 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +44 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/login.d.ts +35 -0
- package/dist/tools/login.d.ts.map +1 -0
- package/dist/tools/login.js +132 -0
- package/dist/tools/login.js.map +1 -0
- package/dist/tools/read-posts.d.ts +48 -0
- package/dist/tools/read-posts.d.ts.map +1 -0
- package/dist/tools/read-posts.js +93 -0
- package/dist/tools/read-posts.js.map +1 -0
- package/dist/types.d.ts +88 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/json.d.ts +13 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +48 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/validation.d.ts +58 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +223 -0
- package/dist/validation.js.map +1 -0
- package/package.json +70 -0
- package/src/api-client.ts +292 -0
- package/src/config.ts +92 -0
- package/src/hooks/index.ts +304 -0
- package/src/hooks/types.ts +44 -0
- package/src/http-server.ts +243 -0
- package/src/index.ts +213 -0
- package/src/logger.ts +326 -0
- package/src/metrics.ts +235 -0
- package/src/middleware/error-handler.ts +252 -0
- package/src/middleware/index.ts +112 -0
- package/src/middleware/timeout.ts +216 -0
- package/src/middleware/validator.ts +216 -0
- package/src/prompts/analyze.ts +404 -0
- package/src/prompts/generate.ts +217 -0
- package/src/prompts/index.ts +121 -0
- package/src/prompts/summarize.ts +217 -0
- package/src/prompts/types.ts +44 -0
- package/src/resources/agents.ts +165 -0
- package/src/resources/feed.ts +169 -0
- package/src/resources/index.ts +210 -0
- package/src/resources/posts.ts +179 -0
- package/src/resources/types.ts +104 -0
- package/src/roots/index.ts +166 -0
- package/src/roots/types.ts +36 -0
- package/src/session-manager.ts +149 -0
- package/src/tools/create-post.ts +154 -0
- package/src/tools/index.ts +70 -0
- package/src/tools/login.ts +169 -0
- package/src/tools/read-posts.ts +120 -0
- package/src/types.ts +107 -0
- package/src/utils/json.ts +46 -0
- package/src/validation.ts +322 -0
- 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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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -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"}
|