atproto-mcp 0.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 (131) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +293 -0
  3. package/dist/cli.d.ts +10 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +261 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/health-check.d.ts +7 -0
  8. package/dist/health-check.d.ts.map +1 -0
  9. package/dist/health-check.js +57 -0
  10. package/dist/health-check.js.map +1 -0
  11. package/dist/index.d.ts +122 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +612 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/prompts/index.d.ts +77 -0
  16. package/dist/prompts/index.d.ts.map +1 -0
  17. package/dist/prompts/index.js +186 -0
  18. package/dist/prompts/index.js.map +1 -0
  19. package/dist/resources/index.d.ts +75 -0
  20. package/dist/resources/index.d.ts.map +1 -0
  21. package/dist/resources/index.js +218 -0
  22. package/dist/resources/index.js.map +1 -0
  23. package/dist/test/setup.d.ts +78 -0
  24. package/dist/test/setup.d.ts.map +1 -0
  25. package/dist/test/setup.js +138 -0
  26. package/dist/test/setup.js.map +1 -0
  27. package/dist/tools/implementations/advanced-social-tools.d.ts +250 -0
  28. package/dist/tools/implementations/advanced-social-tools.d.ts.map +1 -0
  29. package/dist/tools/implementations/advanced-social-tools.js +380 -0
  30. package/dist/tools/implementations/advanced-social-tools.js.map +1 -0
  31. package/dist/tools/implementations/base-tool.d.ts +73 -0
  32. package/dist/tools/implementations/base-tool.d.ts.map +1 -0
  33. package/dist/tools/implementations/base-tool.js +225 -0
  34. package/dist/tools/implementations/base-tool.js.map +1 -0
  35. package/dist/tools/implementations/content-management-tools.d.ts +81 -0
  36. package/dist/tools/implementations/content-management-tools.d.ts.map +1 -0
  37. package/dist/tools/implementations/content-management-tools.js +236 -0
  38. package/dist/tools/implementations/content-management-tools.js.map +1 -0
  39. package/dist/tools/implementations/create-post-tool.d.ts +131 -0
  40. package/dist/tools/implementations/create-post-tool.d.ts.map +1 -0
  41. package/dist/tools/implementations/create-post-tool.js +182 -0
  42. package/dist/tools/implementations/create-post-tool.js.map +1 -0
  43. package/dist/tools/implementations/follow-user-tool.d.ts +69 -0
  44. package/dist/tools/implementations/follow-user-tool.d.ts.map +1 -0
  45. package/dist/tools/implementations/follow-user-tool.js +200 -0
  46. package/dist/tools/implementations/follow-user-tool.js.map +1 -0
  47. package/dist/tools/implementations/get-user-profile-tool.d.ts +61 -0
  48. package/dist/tools/implementations/get-user-profile-tool.d.ts.map +1 -0
  49. package/dist/tools/implementations/get-user-profile-tool.js +139 -0
  50. package/dist/tools/implementations/get-user-profile-tool.js.map +1 -0
  51. package/dist/tools/implementations/index.d.ts +22 -0
  52. package/dist/tools/implementations/index.d.ts.map +1 -0
  53. package/dist/tools/implementations/index.js +32 -0
  54. package/dist/tools/implementations/index.js.map +1 -0
  55. package/dist/tools/implementations/like-post-tool.d.ts +68 -0
  56. package/dist/tools/implementations/like-post-tool.d.ts.map +1 -0
  57. package/dist/tools/implementations/like-post-tool.js +184 -0
  58. package/dist/tools/implementations/like-post-tool.js.map +1 -0
  59. package/dist/tools/implementations/media-tools.d.ts +360 -0
  60. package/dist/tools/implementations/media-tools.d.ts.map +1 -0
  61. package/dist/tools/implementations/media-tools.js +444 -0
  62. package/dist/tools/implementations/media-tools.js.map +1 -0
  63. package/dist/tools/implementations/moderation-tools.d.ts +189 -0
  64. package/dist/tools/implementations/moderation-tools.d.ts.map +1 -0
  65. package/dist/tools/implementations/moderation-tools.js +289 -0
  66. package/dist/tools/implementations/moderation-tools.js.map +1 -0
  67. package/dist/tools/implementations/oauth-tools.d.ts +108 -0
  68. package/dist/tools/implementations/oauth-tools.d.ts.map +1 -0
  69. package/dist/tools/implementations/oauth-tools.js +183 -0
  70. package/dist/tools/implementations/oauth-tools.js.map +1 -0
  71. package/dist/tools/implementations/reply-to-post-tool.d.ts +52 -0
  72. package/dist/tools/implementations/reply-to-post-tool.d.ts.map +1 -0
  73. package/dist/tools/implementations/reply-to-post-tool.js +167 -0
  74. package/dist/tools/implementations/reply-to-post-tool.js.map +1 -0
  75. package/dist/tools/implementations/repost-tool.d.ts +76 -0
  76. package/dist/tools/implementations/repost-tool.d.ts.map +1 -0
  77. package/dist/tools/implementations/repost-tool.js +181 -0
  78. package/dist/tools/implementations/repost-tool.js.map +1 -0
  79. package/dist/tools/implementations/search-posts-tool.d.ts +95 -0
  80. package/dist/tools/implementations/search-posts-tool.d.ts.map +1 -0
  81. package/dist/tools/implementations/search-posts-tool.js +208 -0
  82. package/dist/tools/implementations/search-posts-tool.js.map +1 -0
  83. package/dist/tools/implementations/social-graph-tools.d.ts +119 -0
  84. package/dist/tools/implementations/social-graph-tools.d.ts.map +1 -0
  85. package/dist/tools/implementations/social-graph-tools.js +262 -0
  86. package/dist/tools/implementations/social-graph-tools.js.map +1 -0
  87. package/dist/tools/implementations/streaming-tools.d.ts +130 -0
  88. package/dist/tools/implementations/streaming-tools.d.ts.map +1 -0
  89. package/dist/tools/implementations/streaming-tools.js +241 -0
  90. package/dist/tools/implementations/streaming-tools.js.map +1 -0
  91. package/dist/tools/implementations/timeline-tools.d.ts +69 -0
  92. package/dist/tools/implementations/timeline-tools.d.ts.map +1 -0
  93. package/dist/tools/implementations/timeline-tools.js +194 -0
  94. package/dist/tools/implementations/timeline-tools.js.map +1 -0
  95. package/dist/tools/index.d.ts +23 -0
  96. package/dist/tools/index.d.ts.map +1 -0
  97. package/dist/tools/index.js +73 -0
  98. package/dist/tools/index.js.map +1 -0
  99. package/dist/types/index.d.ts +242 -0
  100. package/dist/types/index.d.ts.map +1 -0
  101. package/dist/types/index.js +73 -0
  102. package/dist/types/index.js.map +1 -0
  103. package/dist/utils/atp-client.d.ts +109 -0
  104. package/dist/utils/atp-client.d.ts.map +1 -0
  105. package/dist/utils/atp-client.js +451 -0
  106. package/dist/utils/atp-client.js.map +1 -0
  107. package/dist/utils/config.d.ts +74 -0
  108. package/dist/utils/config.d.ts.map +1 -0
  109. package/dist/utils/config.js +311 -0
  110. package/dist/utils/config.js.map +1 -0
  111. package/dist/utils/firehose-client.d.ts +96 -0
  112. package/dist/utils/firehose-client.d.ts.map +1 -0
  113. package/dist/utils/firehose-client.js +252 -0
  114. package/dist/utils/firehose-client.js.map +1 -0
  115. package/dist/utils/logger.d.ts +74 -0
  116. package/dist/utils/logger.d.ts.map +1 -0
  117. package/dist/utils/logger.js +142 -0
  118. package/dist/utils/logger.js.map +1 -0
  119. package/dist/utils/oauth-client.d.ts +61 -0
  120. package/dist/utils/oauth-client.d.ts.map +1 -0
  121. package/dist/utils/oauth-client.js +224 -0
  122. package/dist/utils/oauth-client.js.map +1 -0
  123. package/dist/utils/performance.d.ts +102 -0
  124. package/dist/utils/performance.d.ts.map +1 -0
  125. package/dist/utils/performance.js +302 -0
  126. package/dist/utils/performance.js.map +1 -0
  127. package/dist/utils/security.d.ts +154 -0
  128. package/dist/utils/security.d.ts.map +1 -0
  129. package/dist/utils/security.js +358 -0
  130. package/dist/utils/security.js.map +1 -0
  131. package/package.json +93 -0
package/dist/index.js ADDED
@@ -0,0 +1,612 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * AT Protocol MCP Server
4
+ *
5
+ * A comprehensive Model Context Protocol server that provides LLMs with direct access
6
+ * to the AT Protocol ecosystem, enabling seamless interaction with Bluesky and other
7
+ * AT Protocol-based social networks.
8
+ */
9
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
10
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
11
+ import { z } from 'zod';
12
+ import { ConfigurationError, McpError } from './types/index.js';
13
+ import { AtpClient } from './utils/atp-client.js';
14
+ import { Logger } from './utils/logger.js';
15
+ import { ConfigManager } from './utils/config.js';
16
+ import { createTools } from './tools/index.js';
17
+ import { createResources } from './resources/index.js';
18
+ import { createPrompts } from './prompts/index.js';
19
+ import { ConnectionPool, LRUCache, PerformanceMonitor, WebSocketManager, } from './utils/performance.js';
20
+ import { SecurityManager } from './utils/security.js';
21
+ /**
22
+ * Main server class for AT Protocol MCP Server
23
+ */
24
+ export class AtpMcpServer {
25
+ server;
26
+ atpClient;
27
+ logger;
28
+ configManager;
29
+ connectionPool;
30
+ cache;
31
+ wsManager;
32
+ performanceMonitor;
33
+ securityManager;
34
+ metricsInterval;
35
+ transport = null;
36
+ isRunning = false;
37
+ constructor(configOverrides = {}) {
38
+ this.logger = new Logger('AtpMcpServer');
39
+ try {
40
+ // Initialize configuration
41
+ this.configManager = new ConfigManager(configOverrides);
42
+ const config = this.configManager.getConfig();
43
+ // Initialize MCP server
44
+ this.server = new Server({
45
+ name: config.name,
46
+ version: config.version,
47
+ }, {
48
+ capabilities: {
49
+ tools: {},
50
+ resources: {},
51
+ prompts: {},
52
+ },
53
+ });
54
+ // Initialize AT Protocol client
55
+ this.atpClient = new AtpClient(this.configManager.getAtpConfig());
56
+ // Initialize performance components
57
+ const connectionPoolConfig = {
58
+ maxConnections: 10,
59
+ minConnections: 2,
60
+ acquireTimeoutMs: 5000,
61
+ idleTimeoutMs: 300000, // 5 minutes
62
+ maxRetries: 3,
63
+ };
64
+ const cacheConfig = {
65
+ maxSize: 1000,
66
+ ttlMs: 300000, // 5 minutes
67
+ cleanupIntervalMs: 60000, // 1 minute
68
+ };
69
+ this.connectionPool = new ConnectionPool(connectionPoolConfig, this.logger);
70
+ this.cache = new LRUCache(cacheConfig, this.logger);
71
+ this.wsManager = new WebSocketManager(this.logger);
72
+ this.performanceMonitor = new PerformanceMonitor(this.logger);
73
+ // Initialize security manager
74
+ const securityConfig = {
75
+ enableInputSanitization: true,
76
+ enableRateLimit: true,
77
+ enableErrorSanitization: true,
78
+ maxInputLength: 10000,
79
+ allowedOrigins: ['*'], // Configure based on deployment
80
+ trustedProxies: [], // Configure based on deployment
81
+ };
82
+ this.securityManager = new SecurityManager(securityConfig, this.logger);
83
+ // Configure performance monitor
84
+ this.performanceMonitor.setConnectionPool(this.connectionPool);
85
+ this.performanceMonitor.setCache(this.cache);
86
+ this.performanceMonitor.setWebSocketManager(this.wsManager);
87
+ // Setup server handlers
88
+ this.setupServer();
89
+ this.logger.info('AT Protocol MCP Server initialized', {
90
+ name: config.name,
91
+ version: config.version,
92
+ });
93
+ }
94
+ catch (error) {
95
+ this.logger.error('Failed to initialize AT Protocol MCP Server', error);
96
+ throw error;
97
+ }
98
+ }
99
+ /**
100
+ * Set up the MCP server with basic handlers
101
+ * Register tools, resources, and prompts with the MCP server
102
+ */
103
+ setupServer() {
104
+ this.logger.info('Setting up MCP server handlers...');
105
+ // Set up basic MCP protocol handlers
106
+ this.setupBasicHandlers();
107
+ // Create and register tools, resources, and prompts
108
+ const tools = createTools(this.atpClient);
109
+ const resources = createResources(this.atpClient);
110
+ const prompts = createPrompts(this.atpClient);
111
+ // CRITICAL FIX: Register all tools with the MCP server
112
+ this.registerTools(tools);
113
+ this.registerResources(resources);
114
+ this.registerPrompts(prompts);
115
+ this.logger.debug(`Registered ${tools.length} tools, ${resources.length} resources, ${prompts.length} prompts`);
116
+ this.logger.info('MCP server handlers setup complete');
117
+ }
118
+ /**
119
+ * Set up basic MCP protocol handlers
120
+ */
121
+ setupBasicHandlers() {
122
+ // Handle server info requests
123
+ this.server.setRequestHandler(z.object({ method: z.literal('initialize') }), async () => {
124
+ const config = this.configManager.getConfig();
125
+ return {
126
+ protocolVersion: '2024-11-05',
127
+ capabilities: {
128
+ tools: {
129
+ listChanged: true,
130
+ },
131
+ resources: {
132
+ subscribe: false,
133
+ listChanged: true,
134
+ },
135
+ prompts: {
136
+ listChanged: true,
137
+ },
138
+ },
139
+ serverInfo: {
140
+ name: config.name,
141
+ version: config.version,
142
+ description: config.description,
143
+ },
144
+ };
145
+ });
146
+ // Handle ping requests
147
+ this.server.setRequestHandler(z.object({ method: z.literal('ping') }), async () => ({
148
+ status: 'ok',
149
+ timestamp: new Date().toISOString(),
150
+ }));
151
+ this.logger.debug('Basic MCP handlers registered');
152
+ }
153
+ /**
154
+ * Register MCP tools with the server
155
+ */
156
+ registerTools(tools) {
157
+ // Register tools/list handler
158
+ this.server.setRequestHandler(z.object({ method: z.literal('tools/list') }), async () => {
159
+ // Filter tools based on availability (authentication status)
160
+ const availableTools = tools.filter(tool => {
161
+ // Check if tool has isAvailable method (from BaseTool)
162
+ if ('isAvailable' in tool && typeof tool.isAvailable === 'function') {
163
+ return tool.isAvailable();
164
+ }
165
+ // Default to available for tools that don't implement availability check
166
+ return true;
167
+ });
168
+ return {
169
+ tools: availableTools.map(tool => ({
170
+ name: tool.schema.method,
171
+ description: tool.schema.description,
172
+ inputSchema: tool.schema.params ? this.zodToJsonSchema(tool.schema.params) : undefined,
173
+ })),
174
+ };
175
+ });
176
+ // Register individual tool handlers
177
+ for (const tool of tools) {
178
+ this.server.setRequestHandler(z.object({
179
+ method: z.literal('tools/call'),
180
+ params: z.object({
181
+ name: z.literal(tool.schema.method),
182
+ arguments: z.any().optional(),
183
+ }),
184
+ }), async (request) => {
185
+ try {
186
+ // Check if tool is available before execution
187
+ if ('isAvailable' in tool && typeof tool.isAvailable === 'function') {
188
+ if (!tool.isAvailable()) {
189
+ const availabilityMessage = 'getAvailabilityMessage' in tool &&
190
+ typeof tool.getAvailabilityMessage === 'function'
191
+ ? tool.getAvailabilityMessage()
192
+ : 'Tool not available';
193
+ throw new McpError(`Tool not available: ${availabilityMessage}`, -32603, {
194
+ tool: tool.schema.method,
195
+ availability: availabilityMessage,
196
+ });
197
+ }
198
+ }
199
+ const result = await tool.handler(request.params.arguments || {});
200
+ return {
201
+ content: [
202
+ {
203
+ type: 'text',
204
+ text: JSON.stringify(result, null, 2),
205
+ },
206
+ ],
207
+ };
208
+ }
209
+ catch (error) {
210
+ this.logger.error(`Tool ${tool.schema.method} execution failed`, error);
211
+ throw new McpError(`Tool execution failed: ${error instanceof Error ? error.message : 'Unknown error'}`, -32603, {
212
+ tool: tool.schema.method,
213
+ error: error instanceof Error ? error.message : String(error),
214
+ });
215
+ }
216
+ });
217
+ }
218
+ this.logger.info(`Registered ${tools.length} MCP tools`);
219
+ }
220
+ /**
221
+ * Register MCP resources with the server
222
+ */
223
+ registerResources(resources) {
224
+ // Register resources/list handler
225
+ this.server.setRequestHandler(z.object({ method: z.literal('resources/list') }), async () => ({
226
+ resources: resources.map(resource => ({
227
+ uri: resource.uri,
228
+ name: resource.name,
229
+ description: resource.description,
230
+ mimeType: resource.mimeType,
231
+ })),
232
+ }));
233
+ // Register resources/read handler
234
+ this.server.setRequestHandler(z.object({
235
+ method: z.literal('resources/read'),
236
+ params: z.object({
237
+ uri: z.string(),
238
+ }),
239
+ }), async (request) => {
240
+ try {
241
+ const resource = resources.find(r => r.uri === request.params.uri);
242
+ if (!resource) {
243
+ throw new McpError(`Resource not found: ${request.params.uri}`, -32602, {
244
+ uri: request.params.uri,
245
+ });
246
+ }
247
+ // Check if resource is available
248
+ const isAvailable = await resource.isAvailable();
249
+ if (!isAvailable) {
250
+ throw new McpError(`Resource not available: ${request.params.uri}`, -32603, {
251
+ uri: request.params.uri,
252
+ });
253
+ }
254
+ const content = await resource.read();
255
+ return {
256
+ contents: [
257
+ {
258
+ uri: content.uri,
259
+ mimeType: content.mimeType,
260
+ text: content.text ?? '',
261
+ },
262
+ ],
263
+ };
264
+ }
265
+ catch (error) {
266
+ this.logger.error(`Resource read failed`, error);
267
+ throw new McpError(`Resource read failed: ${error instanceof Error ? error.message : 'Unknown error'}`, -32603, {
268
+ uri: request.params.uri,
269
+ error: error instanceof Error ? error.message : String(error),
270
+ });
271
+ }
272
+ });
273
+ this.logger.info(`Registered ${resources.length} MCP resources`);
274
+ }
275
+ /**
276
+ * Register MCP prompts with the server
277
+ */
278
+ registerPrompts(prompts) {
279
+ // Register prompts/list handler
280
+ this.server.setRequestHandler(z.object({ method: z.literal('prompts/list') }), async () => ({
281
+ prompts: prompts.map(prompt => ({
282
+ name: prompt.name,
283
+ description: prompt.description,
284
+ arguments: prompt.arguments ?? [],
285
+ })),
286
+ }));
287
+ // Register prompts/get handler
288
+ this.server.setRequestHandler(z.object({
289
+ method: z.literal('prompts/get'),
290
+ params: z.object({
291
+ name: z.string(),
292
+ arguments: z.record(z.any()).optional(),
293
+ }),
294
+ }), async (request) => {
295
+ try {
296
+ const prompt = prompts.find(p => p.name === request.params.name);
297
+ if (!prompt) {
298
+ throw new McpError(`Prompt not found: ${request.params.name}`, -32602, {
299
+ name: request.params.name,
300
+ });
301
+ }
302
+ // Check if prompt is available
303
+ const isAvailable = prompt.isAvailable();
304
+ if (!isAvailable) {
305
+ throw new McpError(`Prompt not available: ${request.params.name}`, -32603, {
306
+ name: request.params.name,
307
+ });
308
+ }
309
+ const messages = await prompt.get(request.params.arguments ?? {});
310
+ return { messages };
311
+ }
312
+ catch (error) {
313
+ this.logger.error(`Prompt generation failed`, error);
314
+ throw new McpError(`Prompt generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`, -32603, {
315
+ name: request.params.name,
316
+ error: error instanceof Error ? error.message : String(error),
317
+ });
318
+ }
319
+ });
320
+ this.logger.info(`Registered ${prompts.length} MCP prompts`);
321
+ }
322
+ /**
323
+ * Convert Zod schema to JSON Schema for MCP compatibility
324
+ */
325
+ zodToJsonSchema(schema) {
326
+ // Handle ZodOptional wrapper first
327
+ if (schema instanceof z.ZodOptional) {
328
+ return this.zodToJsonSchema(schema._def.innerType);
329
+ }
330
+ // Handle ZodObject
331
+ if (schema instanceof z.ZodObject) {
332
+ const shape = schema.shape;
333
+ const properties = {};
334
+ const required = [];
335
+ for (const [key, value] of Object.entries(shape)) {
336
+ const zodValue = value;
337
+ const isOptional = zodValue.isOptional();
338
+ // Recursively convert the property schema
339
+ properties[key] = this.zodToJsonSchema(zodValue);
340
+ if (!isOptional) {
341
+ required.push(key);
342
+ }
343
+ }
344
+ return {
345
+ type: 'object',
346
+ properties,
347
+ required: required.length > 0 ? required : undefined,
348
+ };
349
+ }
350
+ // Handle ZodString
351
+ if (schema instanceof z.ZodString) {
352
+ const stringSchema = { type: 'string' };
353
+ // Add string constraints
354
+ if (schema._def.checks) {
355
+ for (const check of schema._def.checks) {
356
+ if (check.kind === 'min')
357
+ stringSchema.minLength = check.value;
358
+ if (check.kind === 'max')
359
+ stringSchema.maxLength = check.value;
360
+ if (check.kind === 'regex')
361
+ stringSchema.pattern = check.regex.source;
362
+ }
363
+ }
364
+ return stringSchema;
365
+ }
366
+ // Handle ZodNumber
367
+ if (schema instanceof z.ZodNumber) {
368
+ const numberSchema = { type: 'number' };
369
+ // Add number constraints
370
+ if (schema._def.checks) {
371
+ for (const check of schema._def.checks) {
372
+ if (check.kind === 'min')
373
+ numberSchema.minimum = check.value;
374
+ if (check.kind === 'max')
375
+ numberSchema.maximum = check.value;
376
+ if (check.kind === 'int')
377
+ numberSchema.type = 'integer';
378
+ }
379
+ }
380
+ return numberSchema;
381
+ }
382
+ // Handle ZodBoolean
383
+ if (schema instanceof z.ZodBoolean) {
384
+ return { type: 'boolean' };
385
+ }
386
+ // Handle ZodArray
387
+ if (schema instanceof z.ZodArray) {
388
+ const arraySchema = { type: 'array' };
389
+ // Add array item type if available
390
+ if (schema._def.type) {
391
+ arraySchema.items = this.zodToJsonSchema(schema._def.type);
392
+ }
393
+ return arraySchema;
394
+ }
395
+ // Handle ZodEnum
396
+ if (schema instanceof z.ZodEnum) {
397
+ return {
398
+ type: 'string',
399
+ enum: schema._def.values,
400
+ };
401
+ }
402
+ // Handle ZodUnion
403
+ if (schema instanceof z.ZodUnion) {
404
+ return {
405
+ anyOf: schema._def.options.map((option) => this.zodToJsonSchema(option)),
406
+ };
407
+ }
408
+ // Handle ZodAny and other unknown types
409
+ if (schema instanceof z.ZodAny) {
410
+ return { type: 'object' };
411
+ }
412
+ // Default fallback
413
+ return { type: 'object' };
414
+ }
415
+ /**
416
+ * Start the MCP server
417
+ */
418
+ async start() {
419
+ if (this.isRunning) {
420
+ this.logger.warn('Server is already running');
421
+ return;
422
+ }
423
+ try {
424
+ this.logger.info('Starting AT Protocol MCP Server...');
425
+ const config = this.configManager.getConfig();
426
+ // Initialize AT Protocol client (supports both authenticated and unauthenticated modes)
427
+ try {
428
+ await this.atpClient.initialize();
429
+ if (this.atpClient.isAuthenticated()) {
430
+ this.logger.info('AT Protocol client initialized successfully with authentication');
431
+ }
432
+ else {
433
+ this.logger.info('AT Protocol client initialized successfully in unauthenticated mode');
434
+ }
435
+ }
436
+ catch (error) {
437
+ // If authentication fails but we can still run in unauthenticated mode, continue
438
+ if (this.configManager.hasAuthentication()) {
439
+ this.logger.error('Authentication failed, but continuing in unauthenticated mode', error);
440
+ }
441
+ else {
442
+ this.logger.info('Running in unauthenticated mode (no credentials provided)');
443
+ }
444
+ }
445
+ // Create and connect transport
446
+ this.transport = new StdioServerTransport();
447
+ await this.server.connect(this.transport);
448
+ this.isRunning = true;
449
+ // Start performance monitoring
450
+ this.metricsInterval = this.performanceMonitor.startPeriodicLogging(60000); // Log every minute
451
+ this.logger.info('AT Protocol MCP Server started successfully', {
452
+ name: config.name,
453
+ version: config.version,
454
+ service: config.atproto.service,
455
+ authMethod: config.atproto.authMethod ?? 'unauthenticated',
456
+ authMode: this.configManager.getAuthMode(),
457
+ isAuthenticated: this.atpClient.isAuthenticated(),
458
+ });
459
+ }
460
+ catch (error) {
461
+ this.logger.error('Failed to start AT Protocol MCP Server', error);
462
+ // Cleanup on failure
463
+ await this.cleanup();
464
+ if (error instanceof ConfigurationError) {
465
+ throw error;
466
+ }
467
+ throw new McpError('Server startup failed', -32000, error instanceof Error ? error.message : 'Unknown error');
468
+ }
469
+ }
470
+ /**
471
+ * Stop the MCP server
472
+ */
473
+ async stop() {
474
+ if (!this.isRunning) {
475
+ this.logger.warn('Server is not running');
476
+ return;
477
+ }
478
+ this.logger.info('Stopping AT Protocol MCP Server...');
479
+ await this.cleanup();
480
+ }
481
+ /**
482
+ * Cleanup server resources
483
+ */
484
+ async cleanup() {
485
+ const errors = [];
486
+ try {
487
+ // Stop performance monitoring
488
+ if (this.metricsInterval) {
489
+ clearInterval(this.metricsInterval);
490
+ this.metricsInterval = undefined;
491
+ }
492
+ // Cleanup performance components
493
+ this.wsManager.disconnectAll();
494
+ this.cache.clear();
495
+ this.connectionPool.cleanup();
496
+ }
497
+ catch (error) {
498
+ errors.push(error instanceof Error ? error : new Error(String(error)));
499
+ }
500
+ try {
501
+ // Cleanup AT Protocol client
502
+ await this.atpClient.cleanup();
503
+ }
504
+ catch (error) {
505
+ errors.push(error instanceof Error ? error : new Error(String(error)));
506
+ }
507
+ try {
508
+ // Close MCP server
509
+ await this.server.close();
510
+ }
511
+ catch (error) {
512
+ errors.push(error instanceof Error ? error : new Error(String(error)));
513
+ }
514
+ this.isRunning = false;
515
+ this.transport = null;
516
+ if (errors.length > 0) {
517
+ this.logger.error('Errors during cleanup', { errors: errors.map(e => e.message) });
518
+ throw errors[0];
519
+ }
520
+ this.logger.info('AT Protocol MCP Server stopped successfully');
521
+ }
522
+ /**
523
+ * Get server status
524
+ */
525
+ getStatus() {
526
+ return {
527
+ isRunning: this.isRunning,
528
+ isAuthenticated: this.atpClient.isAuthenticated(),
529
+ authMode: this.configManager.getAuthMode(),
530
+ hasAuthentication: this.configManager.hasAuthentication(),
531
+ config: this.configManager.getConfig(),
532
+ };
533
+ }
534
+ /**
535
+ * Get AT Protocol client instance
536
+ */
537
+ getAtpClient() {
538
+ return this.atpClient;
539
+ }
540
+ /**
541
+ * Get configuration manager
542
+ */
543
+ getConfigManager() {
544
+ return this.configManager;
545
+ }
546
+ /**
547
+ * Get performance metrics
548
+ */
549
+ getPerformanceMetrics() {
550
+ return this.performanceMonitor.getMetrics();
551
+ }
552
+ /**
553
+ * Get cache instance for external use
554
+ */
555
+ getCache() {
556
+ return this.cache;
557
+ }
558
+ /**
559
+ * Get connection pool instance for external use
560
+ */
561
+ getConnectionPool() {
562
+ return this.connectionPool;
563
+ }
564
+ /**
565
+ * Get WebSocket manager instance for external use
566
+ */
567
+ getWebSocketManager() {
568
+ return this.wsManager;
569
+ }
570
+ /**
571
+ * Get security manager instance for external use
572
+ */
573
+ getSecurityManager() {
574
+ return this.securityManager;
575
+ }
576
+ /**
577
+ * Get comprehensive system metrics including performance and security
578
+ */
579
+ getSystemMetrics() {
580
+ return {
581
+ performance: this.getPerformanceMetrics(),
582
+ security: this.securityManager.getMetrics(),
583
+ server: this.getStatus(),
584
+ };
585
+ }
586
+ }
587
+ /**
588
+ * Create and start the server if this file is run directly
589
+ */
590
+ if (import.meta.url === `file://${process.argv[1]}`) {
591
+ const server = new AtpMcpServer();
592
+ // Handle graceful shutdown
593
+ process.on('SIGINT', () => {
594
+ console.log('\nReceived SIGINT, shutting down gracefully...');
595
+ void server.stop().then(() => {
596
+ process.exit(0);
597
+ });
598
+ });
599
+ process.on('SIGTERM', () => {
600
+ console.log('\nReceived SIGTERM, shutting down gracefully...');
601
+ void server.stop().then(() => {
602
+ process.exit(0);
603
+ });
604
+ });
605
+ // Start the server
606
+ server.start().catch(error => {
607
+ console.error('Failed to start server:', error);
608
+ process.exit(1);
609
+ });
610
+ }
611
+ export default AtpMcpServer;
612
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}