@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
@@ -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":"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"}
@@ -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,4 @@
1
+ // ABOUTME: Type definitions for MCP Request/Response Hooks
2
+ // ABOUTME: Defines hook interfaces, context, and pipeline structures
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -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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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}