@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
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// ABOUTME: MCP Request/Response Hooks for middleware architecture and custom processing
|
|
2
|
+
// ABOUTME: Provides extensible pipeline for request preprocessing and response enrichment
|
|
3
|
+
import { logger } from '../logger.js';
|
|
4
|
+
import { McpRateLimitError } from '../middleware/error-handler.js';
|
|
5
|
+
export class HooksManager {
|
|
6
|
+
requestHooks = [];
|
|
7
|
+
responseHooks = [];
|
|
8
|
+
errorHooks = [];
|
|
9
|
+
rateLimitWindows = new Map();
|
|
10
|
+
constructor() {
|
|
11
|
+
// Register default hooks
|
|
12
|
+
this.registerDefaultHooks();
|
|
13
|
+
logger.info('Hooks manager initialized', {
|
|
14
|
+
requestHooks: this.requestHooks.length,
|
|
15
|
+
responseHooks: this.responseHooks.length,
|
|
16
|
+
errorHooks: this.errorHooks.length,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Register a hook
|
|
21
|
+
*/
|
|
22
|
+
registerHook(hook) {
|
|
23
|
+
switch (hook.type) {
|
|
24
|
+
case 'request':
|
|
25
|
+
this.requestHooks.push(hook);
|
|
26
|
+
this.requestHooks.sort((a, b) => a.priority - b.priority);
|
|
27
|
+
break;
|
|
28
|
+
case 'response':
|
|
29
|
+
this.responseHooks.push(hook);
|
|
30
|
+
this.responseHooks.sort((a, b) => a.priority - b.priority);
|
|
31
|
+
break;
|
|
32
|
+
case 'error':
|
|
33
|
+
this.errorHooks.push(hook);
|
|
34
|
+
this.errorHooks.sort((a, b) => a.priority - b.priority);
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
logger.debug('Registered hook', { name: hook.name, type: hook.type, priority: hook.priority });
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Process request through all request hooks
|
|
41
|
+
*/
|
|
42
|
+
async processRequest(request, context) {
|
|
43
|
+
let processedRequest = request;
|
|
44
|
+
for (const hook of this.requestHooks) {
|
|
45
|
+
try {
|
|
46
|
+
if (hook.condition && !hook.condition(processedRequest, context)) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const result = await hook.execute(processedRequest, context);
|
|
50
|
+
if (result) {
|
|
51
|
+
processedRequest = result;
|
|
52
|
+
}
|
|
53
|
+
logger.debug('Request hook executed', {
|
|
54
|
+
hookName: hook.name,
|
|
55
|
+
method: processedRequest.method,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
logger.error('Request hook failed', {
|
|
60
|
+
hookName: hook.name,
|
|
61
|
+
error: error instanceof Error ? error.message : String(error),
|
|
62
|
+
});
|
|
63
|
+
// Don't fail the entire request for hook errors
|
|
64
|
+
if (hook.critical) {
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return processedRequest;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Process response through all response hooks
|
|
73
|
+
*/
|
|
74
|
+
async processResponse(response, request, context) {
|
|
75
|
+
let processedResponse = response;
|
|
76
|
+
for (const hook of this.responseHooks) {
|
|
77
|
+
try {
|
|
78
|
+
if (hook.condition && !hook.condition(processedResponse, request, context)) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const result = await hook.execute(processedResponse, request, context);
|
|
82
|
+
if (result) {
|
|
83
|
+
processedResponse = result;
|
|
84
|
+
}
|
|
85
|
+
logger.debug('Response hook executed', {
|
|
86
|
+
hookName: hook.name,
|
|
87
|
+
method: request.method,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
logger.error('Response hook failed', {
|
|
92
|
+
hookName: hook.name,
|
|
93
|
+
error: error instanceof Error ? error.message : String(error),
|
|
94
|
+
});
|
|
95
|
+
if (hook.critical) {
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return processedResponse;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Process error through all error hooks
|
|
104
|
+
*/
|
|
105
|
+
async processError(error, request, context) {
|
|
106
|
+
let processedError = error;
|
|
107
|
+
for (const hook of this.errorHooks) {
|
|
108
|
+
try {
|
|
109
|
+
if (hook.condition && !hook.condition(processedError, request, context)) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const result = await hook.execute(processedError, request, context);
|
|
113
|
+
if (result) {
|
|
114
|
+
processedError = result;
|
|
115
|
+
}
|
|
116
|
+
logger.debug('Error hook executed', {
|
|
117
|
+
hookName: hook.name,
|
|
118
|
+
originalError: error.message,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (hookError) {
|
|
122
|
+
logger.error('Error hook failed', {
|
|
123
|
+
hookName: hook.name,
|
|
124
|
+
hookError: hookError instanceof Error ? hookError.message : String(hookError),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return processedError;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Register default hooks
|
|
132
|
+
*/
|
|
133
|
+
registerDefaultHooks() {
|
|
134
|
+
// Request logging hook
|
|
135
|
+
this.registerHook({
|
|
136
|
+
name: 'request-logger',
|
|
137
|
+
type: 'request',
|
|
138
|
+
priority: 100,
|
|
139
|
+
description: 'Log incoming requests',
|
|
140
|
+
execute: async (request, context) => {
|
|
141
|
+
logger.info('Processing request', {
|
|
142
|
+
method: request.method,
|
|
143
|
+
sessionId: context.sessionId,
|
|
144
|
+
timestamp: new Date().toISOString(),
|
|
145
|
+
});
|
|
146
|
+
return request;
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
// Response enrichment hook
|
|
150
|
+
this.registerHook({
|
|
151
|
+
name: 'response-enricher',
|
|
152
|
+
type: 'response',
|
|
153
|
+
priority: 100,
|
|
154
|
+
description: 'Add metadata to responses',
|
|
155
|
+
execute: async (response, request, context) => {
|
|
156
|
+
const enrichedResponse = {
|
|
157
|
+
...response,
|
|
158
|
+
_metadata: {
|
|
159
|
+
processedAt: new Date().toISOString(),
|
|
160
|
+
sessionId: context.sessionId,
|
|
161
|
+
requestMethod: request.method,
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
return enrichedResponse;
|
|
165
|
+
},
|
|
166
|
+
});
|
|
167
|
+
// Error enrichment hook
|
|
168
|
+
this.registerHook({
|
|
169
|
+
name: 'error-enricher',
|
|
170
|
+
type: 'error',
|
|
171
|
+
priority: 100,
|
|
172
|
+
description: 'Enrich errors with context',
|
|
173
|
+
execute: async (error, request, context) => {
|
|
174
|
+
const enrichedError = new Error(error.message);
|
|
175
|
+
enrichedError.name = error.name;
|
|
176
|
+
enrichedError.stack = error.stack;
|
|
177
|
+
// Add context to error
|
|
178
|
+
enrichedError.context = {
|
|
179
|
+
method: request.method,
|
|
180
|
+
sessionId: context.sessionId,
|
|
181
|
+
timestamp: new Date().toISOString(),
|
|
182
|
+
};
|
|
183
|
+
return enrichedError;
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
// Rate limiting hook with sliding window implementation
|
|
187
|
+
this.registerHook({
|
|
188
|
+
name: 'rate-limiter',
|
|
189
|
+
type: 'request',
|
|
190
|
+
priority: 10, // High priority - run early
|
|
191
|
+
description: 'Sliding window rate limiting',
|
|
192
|
+
critical: true, // Rate limit errors should stop request processing
|
|
193
|
+
execute: async (request, context) => {
|
|
194
|
+
const rateLimitKey = `${context.sessionId}:${request.method}`;
|
|
195
|
+
const now = Date.now();
|
|
196
|
+
const windowMs = 60000; // 1 minute window
|
|
197
|
+
const maxRequests = 30; // Standard rate limit
|
|
198
|
+
if (!this.rateLimitWindows) {
|
|
199
|
+
this.rateLimitWindows = new Map();
|
|
200
|
+
}
|
|
201
|
+
let requestTimes = this.rateLimitWindows.get(rateLimitKey) || [];
|
|
202
|
+
// Remove requests older than window
|
|
203
|
+
requestTimes = requestTimes.filter((time) => now - time < windowMs);
|
|
204
|
+
// Check if limit exceeded
|
|
205
|
+
if (requestTimes.length >= maxRequests) {
|
|
206
|
+
const oldestRequest = Math.min(...requestTimes);
|
|
207
|
+
const retryAfter = Math.ceil((oldestRequest + windowMs - now) / 1000);
|
|
208
|
+
logger.warn('Rate limit exceeded', {
|
|
209
|
+
key: rateLimitKey,
|
|
210
|
+
requestCount: requestTimes.length,
|
|
211
|
+
maxRequests,
|
|
212
|
+
retryAfter,
|
|
213
|
+
});
|
|
214
|
+
throw new McpRateLimitError(`Rate limit exceeded. Too many ${request.method} requests. Try again in ${retryAfter} seconds.`, retryAfter);
|
|
215
|
+
}
|
|
216
|
+
// Add current request time
|
|
217
|
+
requestTimes.push(now);
|
|
218
|
+
this.rateLimitWindows.set(rateLimitKey, requestTimes);
|
|
219
|
+
logger.debug('Rate limit check passed', {
|
|
220
|
+
key: rateLimitKey,
|
|
221
|
+
currentCount: requestTimes.length,
|
|
222
|
+
maxRequests,
|
|
223
|
+
});
|
|
224
|
+
return request;
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get all registered hooks
|
|
230
|
+
*/
|
|
231
|
+
getAllHooks() {
|
|
232
|
+
return [...this.requestHooks, ...this.responseHooks, ...this.errorHooks];
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Remove a hook by name
|
|
236
|
+
*/
|
|
237
|
+
removeHook(name) {
|
|
238
|
+
const removeFromArray = (arr) => {
|
|
239
|
+
const index = arr.findIndex((hook) => hook.name === name);
|
|
240
|
+
if (index !== -1) {
|
|
241
|
+
arr.splice(index, 1);
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
return false;
|
|
245
|
+
};
|
|
246
|
+
return (removeFromArray(this.requestHooks) ||
|
|
247
|
+
removeFromArray(this.responseHooks) ||
|
|
248
|
+
removeFromArray(this.errorHooks));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Global hooks manager instance
|
|
252
|
+
export const hooksManager = new HooksManager();
|
|
253
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,0FAA0F;AAE1F,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAWnE,MAAM,OAAO,YAAY;IACf,YAAY,GAAkB,EAAE,CAAC;IACjC,aAAa,GAAmB,EAAE,CAAC;IACnC,UAAU,GAAgB,EAAE,CAAC;IAC7B,gBAAgB,GAA0B,IAAI,GAAG,EAAE,CAAC;IAE5D;QACE,yBAAyB;QACzB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;YACvC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;YACtC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM;YACxC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;SACnC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAU;QACrB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,SAAS;gBACZ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAmB,CAAC,CAAC;gBAC5C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAoB,CAAC,CAAC;gBAC9C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC3D,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAiB,CAAC,CAAC;gBACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACxD,MAAM;QACV,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjG,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,OAAY,EAAE,OAAoB;QACrD,IAAI,gBAAgB,GAAG,OAAO,CAAC;QAE/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAC,EAAE,CAAC;oBACjE,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAC7D,IAAI,MAAM,EAAE,CAAC;oBACX,gBAAgB,GAAG,MAAM,CAAC;gBAC5B,CAAC;gBAED,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;oBACpC,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,MAAM,EAAE,gBAAgB,CAAC,MAAM;iBAChC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;oBAClC,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;gBAEH,gDAAgD;gBAChD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClB,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,QAAa,EAAE,OAAY,EAAE,OAAoB;QACrE,IAAI,iBAAiB,GAAG,QAAQ,CAAC;QAEjC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC3E,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;gBACvE,IAAI,MAAM,EAAE,CAAC;oBACX,iBAAiB,GAAG,MAAM,CAAC;gBAC7B,CAAC;gBAED,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;oBACrC,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;oBACnC,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;gBAEH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClB,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,KAAY,EAAE,OAAY,EAAE,OAAoB;QACjE,IAAI,cAAc,GAAG,KAAK,CAAC;QAE3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;oBACxE,SAAS;gBACX,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;gBACpE,IAAI,MAAM,EAAE,CAAC;oBACX,cAAc,GAAG,MAAM,CAAC;gBAC1B,CAAC;gBAED,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE;oBAClC,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,aAAa,EAAE,KAAK,CAAC,OAAO;iBAC7B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE;oBAChC,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,SAAS,EAAE,SAAS,YAAY,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;iBAC9E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC1B,uBAAuB;QACvB,IAAI,CAAC,YAAY,CAAC;YAChB,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,GAAG;YACb,WAAW,EAAE,uBAAuB;YACpC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;gBAClC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;oBAChC,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC,CAAC;gBACH,OAAO,OAAO,CAAC;YACjB,CAAC;SACF,CAAC,CAAC;QAEH,2BAA2B;QAC3B,IAAI,CAAC,YAAY,CAAC;YAChB,IAAI,EAAE,mBAAmB;YACzB,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,GAAG;YACb,WAAW,EAAE,2BAA2B;YACxC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;gBAC5C,MAAM,gBAAgB,GAAG;oBACvB,GAAG,QAAQ;oBACX,SAAS,EAAE;wBACT,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACrC,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,aAAa,EAAE,OAAO,CAAC,MAAM;qBAC9B;iBACF,CAAC;gBACF,OAAO,gBAAgB,CAAC;YAC1B,CAAC;SACF,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,CAAC,YAAY,CAAC;YAChB,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,GAAG;YACb,WAAW,EAAE,4BAA4B;YACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;gBACzC,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC/C,aAAa,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;gBAChC,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBAElC,uBAAuB;gBACtB,aAAqB,CAAC,OAAO,GAAG;oBAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,CAAC;gBAEF,OAAO,aAAa,CAAC;YACvB,CAAC;SACF,CAAC,CAAC;QAEH,wDAAwD;QACxD,IAAI,CAAC,YAAY,CAAC;YAChB,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,EAAE,EAAE,4BAA4B;YAC1C,WAAW,EAAE,8BAA8B;YAC3C,QAAQ,EAAE,IAAI,EAAE,mDAAmD;YACnE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;gBAClC,MAAM,YAAY,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,kBAAkB;gBAC1C,MAAM,WAAW,GAAG,EAAE,CAAC,CAAC,sBAAsB;gBAE9C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBAC3B,IAAI,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAC;gBACpC,CAAC;gBAED,IAAI,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;gBAEjE,oCAAoC;gBACpC,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC;gBAEpE,0BAA0B;gBAC1B,IAAI,YAAY,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;oBACvC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;oBAChD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,GAAG,QAAQ,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;oBAEtE,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE;wBACjC,GAAG,EAAE,YAAY;wBACjB,YAAY,EAAE,YAAY,CAAC,MAAM;wBACjC,WAAW;wBACX,UAAU;qBACX,CAAC,CAAC;oBAEH,MAAM,IAAI,iBAAiB,CACzB,iCAAiC,OAAO,CAAC,MAAM,2BAA2B,UAAU,WAAW,EAC/F,UAAU,CACX,CAAC;gBACJ,CAAC;gBAED,2BAA2B;gBAC3B,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACvB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;gBAEtD,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE;oBACtC,GAAG,EAAE,YAAY;oBACjB,YAAY,EAAE,YAAY,CAAC,MAAM;oBACjC,WAAW;iBACZ,CAAC,CAAC;gBAEH,OAAO,OAAO,CAAC;YACjB,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,IAAY;QACrB,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC1D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACrB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEF,OAAO,CACL,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC;YAClC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC;YACnC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CACjC,CAAC;IACJ,CAAC;CACF;AAED,gCAAgC;AAChC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type HookType = 'request' | 'response' | 'error';
|
|
2
|
+
export interface HookContext {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
startTime: number;
|
|
5
|
+
metadata?: Record<string, any>;
|
|
6
|
+
}
|
|
7
|
+
export interface BaseHook {
|
|
8
|
+
name: string;
|
|
9
|
+
type: HookType;
|
|
10
|
+
priority: number;
|
|
11
|
+
description?: string;
|
|
12
|
+
critical?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface RequestHook extends BaseHook {
|
|
15
|
+
type: 'request';
|
|
16
|
+
condition?: (request: any, context: HookContext) => boolean;
|
|
17
|
+
execute: (request: any, context: HookContext) => Promise<any | undefined>;
|
|
18
|
+
}
|
|
19
|
+
export interface ResponseHook extends BaseHook {
|
|
20
|
+
type: 'response';
|
|
21
|
+
condition?: (response: any, request: any, context: HookContext) => boolean;
|
|
22
|
+
execute: (response: any, request: any, context: HookContext) => Promise<any | undefined>;
|
|
23
|
+
}
|
|
24
|
+
export interface ErrorHook extends BaseHook {
|
|
25
|
+
type: 'error';
|
|
26
|
+
condition?: (error: Error, request: any, context: HookContext) => boolean;
|
|
27
|
+
execute: (error: Error, request: any, context: HookContext) => Promise<Error | undefined>;
|
|
28
|
+
}
|
|
29
|
+
export type Hook = RequestHook | ResponseHook | ErrorHook;
|
|
30
|
+
export interface HookPipeline {
|
|
31
|
+
processRequest(request: any, context: HookContext): Promise<any>;
|
|
32
|
+
processResponse(response: any, request: any, context: HookContext): Promise<any>;
|
|
33
|
+
processError(error: Error, request: any, context: HookContext): Promise<Error>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;IAC5D,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;IAC3E,OAAO,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;CAC1F;AAED,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;IAC1E,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;CAC3F;AAED,MAAM,MAAM,IAAI,GAAG,WAAW,GAAG,YAAY,GAAG,SAAS,CAAC;AAE1D,MAAM,WAAW,YAAY;IAC3B,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjE,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACjF,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CAChF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,qEAAqE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ApiClient } from './api-client.js';
|
|
2
|
+
import type { SessionManager } from './session-manager.js';
|
|
3
|
+
export interface HttpServerOptions {
|
|
4
|
+
port?: number;
|
|
5
|
+
host?: string;
|
|
6
|
+
enableJsonResponse?: boolean;
|
|
7
|
+
corsOrigin?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class HttpMcpServer {
|
|
10
|
+
private readonly sessionManager;
|
|
11
|
+
private readonly apiClient;
|
|
12
|
+
private httpServer;
|
|
13
|
+
private mcpServer;
|
|
14
|
+
private transport;
|
|
15
|
+
private readonly options;
|
|
16
|
+
constructor(sessionManager: SessionManager, apiClient: ApiClient, options?: HttpServerOptions);
|
|
17
|
+
/**
|
|
18
|
+
* Start the HTTP server
|
|
19
|
+
*/
|
|
20
|
+
start(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Stop the HTTP server
|
|
23
|
+
*/
|
|
24
|
+
stop(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Handle incoming HTTP requests
|
|
27
|
+
*/
|
|
28
|
+
private handleRequest;
|
|
29
|
+
/**
|
|
30
|
+
* Create the MCP server instance with HTTP transport
|
|
31
|
+
*/
|
|
32
|
+
private createMcpServer;
|
|
33
|
+
/**
|
|
34
|
+
* Parse request body as JSON
|
|
35
|
+
*/
|
|
36
|
+
private parseRequestBody;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=http-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,aAAa;IAOtB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,UAAU,CAAgD;IAClE,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;gBAGnC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACrC,OAAO,GAAE,iBAAsB;IAUjC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyD5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3B;;OAEG;YACW,aAAa;IAgC3B;;OAEG;YACW,eAAe;IAoD7B;;OAEG;YACW,gBAAgB;CAgB/B"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// ABOUTME: HTTP server implementation for MCP social media server
|
|
2
|
+
// ABOUTME: Provides HTTP/SSE transport as an alternative to stdio
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { createServer } from 'node:http';
|
|
5
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
7
|
+
import { logger } from './logger.js';
|
|
8
|
+
export class HttpMcpServer {
|
|
9
|
+
sessionManager;
|
|
10
|
+
apiClient;
|
|
11
|
+
httpServer = null;
|
|
12
|
+
mcpServer = null;
|
|
13
|
+
transport = null;
|
|
14
|
+
options;
|
|
15
|
+
constructor(sessionManager, apiClient, options = {}) {
|
|
16
|
+
this.sessionManager = sessionManager;
|
|
17
|
+
this.apiClient = apiClient;
|
|
18
|
+
this.options = {
|
|
19
|
+
port: options.port ?? 3000,
|
|
20
|
+
host: options.host ?? 'localhost',
|
|
21
|
+
enableJsonResponse: options.enableJsonResponse ?? false,
|
|
22
|
+
corsOrigin: options.corsOrigin ?? '*',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Start the HTTP server
|
|
27
|
+
*/
|
|
28
|
+
async start() {
|
|
29
|
+
if (this.httpServer) {
|
|
30
|
+
throw new Error('HTTP server already started');
|
|
31
|
+
}
|
|
32
|
+
// Create single MCP server instance
|
|
33
|
+
await this.createMcpServer();
|
|
34
|
+
this.httpServer = createServer(async (req, res) => {
|
|
35
|
+
// Add CORS headers
|
|
36
|
+
res.setHeader('Access-Control-Allow-Origin', this.options.corsOrigin);
|
|
37
|
+
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
|
|
38
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Mcp-Session-Id');
|
|
39
|
+
res.setHeader('Access-Control-Max-Age', '86400');
|
|
40
|
+
// Handle preflight requests
|
|
41
|
+
if (req.method === 'OPTIONS') {
|
|
42
|
+
res.writeHead(204);
|
|
43
|
+
res.end();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Log request
|
|
47
|
+
logger.debug('HTTP request received', {
|
|
48
|
+
method: req.method,
|
|
49
|
+
url: req.url,
|
|
50
|
+
headers: req.headers,
|
|
51
|
+
});
|
|
52
|
+
try {
|
|
53
|
+
await this.handleRequest(req, res);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
logger.error('Error handling HTTP request', { error });
|
|
57
|
+
if (!res.headersSent) {
|
|
58
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
59
|
+
res.end(JSON.stringify({ error: 'Internal server error' }));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
return new Promise((resolve, reject) => {
|
|
64
|
+
this.httpServer?.listen(this.options.port, this.options.host, () => {
|
|
65
|
+
logger.info('HTTP MCP server started', {
|
|
66
|
+
host: this.options.host,
|
|
67
|
+
port: this.options.port,
|
|
68
|
+
enableJsonResponse: this.options.enableJsonResponse,
|
|
69
|
+
});
|
|
70
|
+
resolve();
|
|
71
|
+
});
|
|
72
|
+
this.httpServer?.on('error', (error) => {
|
|
73
|
+
logger.error('HTTP server error', { error });
|
|
74
|
+
reject(error);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Stop the HTTP server
|
|
80
|
+
*/
|
|
81
|
+
async stop() {
|
|
82
|
+
if (!this.httpServer) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Close MCP server connection
|
|
86
|
+
if (this.mcpServer) {
|
|
87
|
+
try {
|
|
88
|
+
await this.mcpServer.close();
|
|
89
|
+
logger.debug('Closed MCP server');
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
logger.error('Error closing MCP server', { error });
|
|
93
|
+
}
|
|
94
|
+
this.mcpServer = null;
|
|
95
|
+
this.transport = null;
|
|
96
|
+
}
|
|
97
|
+
// Close HTTP server
|
|
98
|
+
return new Promise((resolve, reject) => {
|
|
99
|
+
this.httpServer?.close((error) => {
|
|
100
|
+
if (error) {
|
|
101
|
+
logger.error('Error closing HTTP server', { error });
|
|
102
|
+
reject(error);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
logger.info('HTTP MCP server stopped');
|
|
106
|
+
this.httpServer = null;
|
|
107
|
+
resolve();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Handle incoming HTTP requests
|
|
114
|
+
*/
|
|
115
|
+
async handleRequest(req, res) {
|
|
116
|
+
const url = new URL(req.url || '/', `http://${req.headers.host}`);
|
|
117
|
+
// Only handle requests to /mcp endpoint
|
|
118
|
+
if (url.pathname !== '/mcp') {
|
|
119
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
120
|
+
res.end(JSON.stringify({ error: 'Not found' }));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// Get or create session ID
|
|
124
|
+
const sessionId = req.headers['mcp-session-id'] || randomUUID();
|
|
125
|
+
// Set session ID in response header for client tracking
|
|
126
|
+
res.setHeader('Mcp-Session-Id', sessionId);
|
|
127
|
+
if (!this.transport) {
|
|
128
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
129
|
+
res.end(JSON.stringify({ error: 'Transport not found' }));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Parse body if POST
|
|
133
|
+
let body;
|
|
134
|
+
if (req.method === 'POST') {
|
|
135
|
+
body = await this.parseRequestBody(req);
|
|
136
|
+
}
|
|
137
|
+
// Let transport handle the request
|
|
138
|
+
await this.transport.handleRequest(req, res, body);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Create the MCP server instance with HTTP transport
|
|
142
|
+
*/
|
|
143
|
+
async createMcpServer() {
|
|
144
|
+
// Import the registration functions dynamically to avoid circular dependencies
|
|
145
|
+
const { hooksManager } = await import('./hooks/index.js');
|
|
146
|
+
const { registerPrompts } = await import('./prompts/index.js');
|
|
147
|
+
const { registerResources } = await import('./resources/index.js');
|
|
148
|
+
const { registerRoots } = await import('./roots/index.js');
|
|
149
|
+
const { registerTools } = await import('./tools/index.js');
|
|
150
|
+
// Import version from config
|
|
151
|
+
const { version } = await import('./config.js');
|
|
152
|
+
// Create MCP server
|
|
153
|
+
this.mcpServer = new McpServer({
|
|
154
|
+
name: 'mcp-agent-social',
|
|
155
|
+
version,
|
|
156
|
+
});
|
|
157
|
+
// Create HTTP transport
|
|
158
|
+
this.transport = new StreamableHTTPServerTransport({
|
|
159
|
+
sessionIdGenerator: randomUUID,
|
|
160
|
+
enableJsonResponse: this.options.enableJsonResponse,
|
|
161
|
+
onsessioninitialized: (id) => {
|
|
162
|
+
logger.debug('Session initialized', { sessionId: id });
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
// Register all capabilities
|
|
166
|
+
registerTools(this.mcpServer, {
|
|
167
|
+
sessionManager: this.sessionManager,
|
|
168
|
+
apiClient: this.apiClient,
|
|
169
|
+
hooksManager,
|
|
170
|
+
});
|
|
171
|
+
registerResources(this.mcpServer, {
|
|
172
|
+
apiClient: this.apiClient,
|
|
173
|
+
sessionManager: this.sessionManager,
|
|
174
|
+
hooksManager,
|
|
175
|
+
});
|
|
176
|
+
registerPrompts(this.mcpServer, {
|
|
177
|
+
apiClient: this.apiClient,
|
|
178
|
+
sessionManager: this.sessionManager,
|
|
179
|
+
hooksManager,
|
|
180
|
+
});
|
|
181
|
+
registerRoots(this.mcpServer, {
|
|
182
|
+
apiClient: this.apiClient,
|
|
183
|
+
sessionManager: this.sessionManager,
|
|
184
|
+
hooksManager,
|
|
185
|
+
});
|
|
186
|
+
// Connect transport
|
|
187
|
+
await this.mcpServer.connect(this.transport);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Parse request body as JSON
|
|
191
|
+
*/
|
|
192
|
+
async parseRequestBody(req) {
|
|
193
|
+
return new Promise((resolve, reject) => {
|
|
194
|
+
let body = '';
|
|
195
|
+
req.on('data', (chunk) => {
|
|
196
|
+
body += chunk.toString();
|
|
197
|
+
});
|
|
198
|
+
req.on('end', () => {
|
|
199
|
+
try {
|
|
200
|
+
resolve(body ? JSON.parse(body) : undefined);
|
|
201
|
+
}
|
|
202
|
+
catch (_error) {
|
|
203
|
+
reject(new Error('Invalid JSON body'));
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
req.on('error', reject);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=http-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|