apprecio-mcp-base 1.0.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/README.md +301 -0
- package/dist/core/McpBaseServer.d.ts +59 -0
- package/dist/core/McpBaseServer.d.ts.map +1 -0
- package/dist/core/McpBaseServer.js +113 -0
- package/dist/core/McpBaseServer.js.map +1 -0
- package/dist/core/config.d.ts +81 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +122 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/logger.d.ts +14 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +65 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/types.d.ts +113 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/database/mongodb.d.ts +35 -0
- package/dist/database/mongodb.d.ts.map +1 -0
- package/dist/database/mongodb.js +85 -0
- package/dist/database/mongodb.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +26 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +100 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/server/createExpressServer.d.ts +13 -0
- package/dist/server/createExpressServer.d.ts.map +1 -0
- package/dist/server/createExpressServer.js +98 -0
- package/dist/server/createExpressServer.js.map +1 -0
- package/dist/src/core/McpBaseServer.d.ts +59 -0
- package/dist/src/core/McpBaseServer.d.ts.map +1 -0
- package/dist/src/core/McpBaseServer.js +113 -0
- package/dist/src/core/McpBaseServer.js.map +1 -0
- package/dist/src/core/config.d.ts +81 -0
- package/dist/src/core/config.d.ts.map +1 -0
- package/dist/src/core/config.js +122 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/logger.d.ts +14 -0
- package/dist/src/core/logger.d.ts.map +1 -0
- package/dist/src/core/logger.js +65 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/types.d.ts +113 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +2 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/database/mongodb.d.ts +35 -0
- package/dist/src/database/mongodb.d.ts.map +1 -0
- package/dist/src/database/mongodb.js +85 -0
- package/dist/src/database/mongodb.js.map +1 -0
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +13 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/middleware/auth.d.ts +26 -0
- package/dist/src/middleware/auth.d.ts.map +1 -0
- package/dist/src/middleware/auth.js +100 -0
- package/dist/src/middleware/auth.js.map +1 -0
- package/dist/src/server/createExpressServer.d.ts +13 -0
- package/dist/src/server/createExpressServer.d.ts.map +1 -0
- package/dist/src/server/createExpressServer.js +98 -0
- package/dist/src/server/createExpressServer.js.map +1 -0
- package/dist/src/utils/portFinder.d.ts +13 -0
- package/dist/src/utils/portFinder.d.ts.map +1 -0
- package/dist/src/utils/portFinder.js +43 -0
- package/dist/src/utils/portFinder.js.map +1 -0
- package/dist/utils/portFinder.d.ts +13 -0
- package/dist/utils/portFinder.d.ts.map +1 -0
- package/dist/utils/portFinder.js +43 -0
- package/dist/utils/portFinder.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
/**
|
|
3
|
+
* Logger centralizado para todos los servidores MCP
|
|
4
|
+
*/
|
|
5
|
+
export declare const logger: winston.Logger;
|
|
6
|
+
/**
|
|
7
|
+
* Helper para crear un logger child con contexto
|
|
8
|
+
*/
|
|
9
|
+
export declare function createChildLogger(context: string): winston.Logger;
|
|
10
|
+
/**
|
|
11
|
+
* Actualiza el nivel de log dinámicamente
|
|
12
|
+
*/
|
|
13
|
+
export declare function setLogLevel(level: 'debug' | 'info' | 'warn' | 'error'): void;
|
|
14
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAuB9B;;GAEG;AACH,eAAO,MAAM,MAAM,gBAuCjB,CAAC;AAEH;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,kBAEhD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,QAGrE"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
const { combine, timestamp, printf, colorize, errors } = winston.format;
|
|
3
|
+
/**
|
|
4
|
+
* Formato personalizado para los logs
|
|
5
|
+
*/
|
|
6
|
+
const customFormat = printf(({ level, message, timestamp, stack, ...metadata }) => {
|
|
7
|
+
let msg = `${timestamp} [${level}]: ${message}`;
|
|
8
|
+
// Si hay metadata adicional, añadirla
|
|
9
|
+
if (Object.keys(metadata).length > 0) {
|
|
10
|
+
msg += ` ${JSON.stringify(metadata)}`;
|
|
11
|
+
}
|
|
12
|
+
// Si hay un stack trace, añadirlo
|
|
13
|
+
if (stack) {
|
|
14
|
+
msg += `\n${stack}`;
|
|
15
|
+
}
|
|
16
|
+
return msg;
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Logger centralizado para todos los servidores MCP
|
|
20
|
+
*/
|
|
21
|
+
export const logger = winston.createLogger({
|
|
22
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
23
|
+
format: combine(errors({ stack: true }), timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), customFormat),
|
|
24
|
+
transports: [
|
|
25
|
+
// Console transport con colores
|
|
26
|
+
new winston.transports.Console({
|
|
27
|
+
format: combine(colorize(), customFormat)
|
|
28
|
+
}),
|
|
29
|
+
// File transport para errores
|
|
30
|
+
new winston.transports.File({
|
|
31
|
+
filename: 'logs/error.log',
|
|
32
|
+
level: 'error',
|
|
33
|
+
maxsize: 5242880, // 5MB
|
|
34
|
+
maxFiles: 5,
|
|
35
|
+
}),
|
|
36
|
+
// File transport para todos los logs
|
|
37
|
+
new winston.transports.File({
|
|
38
|
+
filename: 'logs/combined.log',
|
|
39
|
+
maxsize: 5242880, // 5MB
|
|
40
|
+
maxFiles: 5,
|
|
41
|
+
})
|
|
42
|
+
],
|
|
43
|
+
// Manejar excepciones no capturadas
|
|
44
|
+
exceptionHandlers: [
|
|
45
|
+
new winston.transports.File({ filename: 'logs/exceptions.log' })
|
|
46
|
+
],
|
|
47
|
+
// Manejar rechazos de promesas
|
|
48
|
+
rejectionHandlers: [
|
|
49
|
+
new winston.transports.File({ filename: 'logs/rejections.log' })
|
|
50
|
+
]
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Helper para crear un logger child con contexto
|
|
54
|
+
*/
|
|
55
|
+
export function createChildLogger(context) {
|
|
56
|
+
return logger.child({ context });
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Actualiza el nivel de log dinámicamente
|
|
60
|
+
*/
|
|
61
|
+
export function setLogLevel(level) {
|
|
62
|
+
logger.level = level;
|
|
63
|
+
logger.info(`Log level changed to: ${level}`);
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;AAExE;;GAEG;AACH,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE;IAC9E,IAAI,GAAG,GAAG,GAAG,SAAS,KAAK,KAAK,MAAM,OAAO,EAAE,CAAC;IAEhD,sCAAsC;IACtC,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,GAAG,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1C,CAAC;IAED,kCAAkC;IAClC,IAAI,KAAK,EAAE,CAAC;QACR,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IACvC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;IACtC,MAAM,EAAE,OAAO,CACX,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACvB,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAC5C,YAAY,CACf;IACD,UAAU,EAAE;QACR,gCAAgC;QAChC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YAC3B,MAAM,EAAE,OAAO,CACX,QAAQ,EAAE,EACV,YAAY,CACf;SACJ,CAAC;QAEF,8BAA8B;QAC9B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YACxB,QAAQ,EAAE,gBAAgB;YAC1B,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,OAAO,EAAE,MAAM;YACxB,QAAQ,EAAE,CAAC;SACd,CAAC;QAEF,qCAAqC;QACrC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;YACxB,QAAQ,EAAE,mBAAmB;YAC7B,OAAO,EAAE,OAAO,EAAE,MAAM;YACxB,QAAQ,EAAE,CAAC;SACd,CAAC;KACL;IACD,oCAAoC;IACpC,iBAAiB,EAAE;QACf,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC;KACnE;IACD,+BAA+B;IAC/B,iBAAiB,EAAE;QACf,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC;KACnE;CACJ,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC7C,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAA0C;IAClE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
/**
|
|
3
|
+
* Opciones para inicializar un servidor MCP
|
|
4
|
+
*/
|
|
5
|
+
export interface ServerOptions {
|
|
6
|
+
name: string;
|
|
7
|
+
version: string;
|
|
8
|
+
envPath?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Interface para módulos de features
|
|
12
|
+
*/
|
|
13
|
+
export interface FeatureModule {
|
|
14
|
+
/**
|
|
15
|
+
* Nombre de la feature
|
|
16
|
+
*/
|
|
17
|
+
name: string;
|
|
18
|
+
/**
|
|
19
|
+
* Registra los tools de la feature en el servidor MCP
|
|
20
|
+
*/
|
|
21
|
+
register(mcpServer: McpServer): void;
|
|
22
|
+
/**
|
|
23
|
+
* Inicialización opcional de la feature
|
|
24
|
+
*/
|
|
25
|
+
initialize?(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Cleanup opcional de la feature
|
|
28
|
+
*/
|
|
29
|
+
cleanup?(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Interface base para servicios
|
|
33
|
+
*/
|
|
34
|
+
export interface BaseService {
|
|
35
|
+
/**
|
|
36
|
+
* Inicializar el servicio
|
|
37
|
+
*/
|
|
38
|
+
initialize?(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Cleanup del servicio
|
|
41
|
+
*/
|
|
42
|
+
cleanup?(): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Opciones de autenticación
|
|
46
|
+
*/
|
|
47
|
+
export interface AuthOptions {
|
|
48
|
+
apiKey?: string;
|
|
49
|
+
publicToken?: string;
|
|
50
|
+
privateToken?: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Contexto de request para autenticación
|
|
54
|
+
*/
|
|
55
|
+
export interface AuthContext {
|
|
56
|
+
isAuthenticated: boolean;
|
|
57
|
+
userId?: string;
|
|
58
|
+
metadata?: Record<string, any>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Configuración de rate limiting
|
|
62
|
+
*/
|
|
63
|
+
export interface RateLimitConfig {
|
|
64
|
+
windowMs: number;
|
|
65
|
+
maxRequests: number;
|
|
66
|
+
message?: string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Opciones para database connectors
|
|
70
|
+
*/
|
|
71
|
+
export interface DatabaseOptions {
|
|
72
|
+
uri: string;
|
|
73
|
+
options?: Record<string, any>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Result type para operaciones
|
|
77
|
+
*/
|
|
78
|
+
export type Result<T, E = Error> = {
|
|
79
|
+
success: true;
|
|
80
|
+
data: T;
|
|
81
|
+
} | {
|
|
82
|
+
success: false;
|
|
83
|
+
error: E;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Tool handler type
|
|
87
|
+
*/
|
|
88
|
+
export interface ToolHandler<TInput = any, TOutput = any> {
|
|
89
|
+
name: string;
|
|
90
|
+
description: string;
|
|
91
|
+
inputSchema: any;
|
|
92
|
+
handler: (input: TInput) => Promise<TOutput>;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Resource handler type
|
|
96
|
+
*/
|
|
97
|
+
export interface ResourceHandler<TData = any> {
|
|
98
|
+
uri: string;
|
|
99
|
+
name: string;
|
|
100
|
+
description?: string;
|
|
101
|
+
mimeType?: string;
|
|
102
|
+
handler: () => Promise<TData>;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Prompt handler type
|
|
106
|
+
*/
|
|
107
|
+
export interface PromptHandler<TArgs = any, TOutput = any> {
|
|
108
|
+
name: string;
|
|
109
|
+
description: string;
|
|
110
|
+
arguments?: any;
|
|
111
|
+
handler: (args: TArgs) => Promise<TOutput>;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAErC;;OAEG;IACH,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;OAEG;IACH,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB;;OAEG;IACH,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;OAEG;IACH,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,IACzB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC1B;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAEnC;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,MAAM,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK,GAAG,GAAG;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,KAAK,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,GAAG,CAAC;IAChB,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
export interface MongoDBOptions {
|
|
3
|
+
uri: string;
|
|
4
|
+
options?: mongoose.ConnectOptions;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Clase para manejar la conexión a MongoDB
|
|
8
|
+
*/
|
|
9
|
+
export declare class MongoDBConnector {
|
|
10
|
+
private uri;
|
|
11
|
+
private options;
|
|
12
|
+
private isConnected;
|
|
13
|
+
constructor(config: MongoDBOptions);
|
|
14
|
+
/**
|
|
15
|
+
* Conectar a MongoDB
|
|
16
|
+
*/
|
|
17
|
+
connect(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Desconectar de MongoDB
|
|
20
|
+
*/
|
|
21
|
+
disconnect(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Verificar estado de conexión
|
|
24
|
+
*/
|
|
25
|
+
get connected(): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Obtener la instancia de conexión
|
|
28
|
+
*/
|
|
29
|
+
getConnection(): typeof mongoose;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Factory para crear conector MongoDB
|
|
33
|
+
*/
|
|
34
|
+
export declare function createMongoDBConnector(uri: string): MongoDBConnector;
|
|
35
|
+
//# sourceMappingURL=mongodb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongodb.d.ts","sourceRoot":"","sources":["../../src/database/mongodb.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAGhC,MAAM,WAAW,cAAc;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC;CACrC;AAED;;GAEG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,cAAc;IAUlC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;OAEG;IACH,aAAa,IAAI,OAAO,QAAQ;CAGnC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAEpE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
import { logger } from '../core/logger';
|
|
3
|
+
/**
|
|
4
|
+
* Clase para manejar la conexión a MongoDB
|
|
5
|
+
*/
|
|
6
|
+
export class MongoDBConnector {
|
|
7
|
+
uri;
|
|
8
|
+
options;
|
|
9
|
+
isConnected = false;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.uri = config.uri;
|
|
12
|
+
this.options = config.options || {
|
|
13
|
+
maxPoolSize: 10,
|
|
14
|
+
minPoolSize: 2,
|
|
15
|
+
socketTimeoutMS: 45000,
|
|
16
|
+
serverSelectionTimeoutMS: 5000,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Conectar a MongoDB
|
|
21
|
+
*/
|
|
22
|
+
async connect() {
|
|
23
|
+
if (this.isConnected) {
|
|
24
|
+
logger.warn('MongoDB already connected');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
await mongoose.connect(this.uri, this.options);
|
|
29
|
+
this.isConnected = true;
|
|
30
|
+
logger.info('✅ MongoDB connected successfully');
|
|
31
|
+
// Event listeners
|
|
32
|
+
mongoose.connection.on('error', (error) => {
|
|
33
|
+
logger.error('MongoDB connection error:', error);
|
|
34
|
+
});
|
|
35
|
+
mongoose.connection.on('disconnected', () => {
|
|
36
|
+
logger.warn('MongoDB disconnected');
|
|
37
|
+
this.isConnected = false;
|
|
38
|
+
});
|
|
39
|
+
mongoose.connection.on('reconnected', () => {
|
|
40
|
+
logger.info('MongoDB reconnected');
|
|
41
|
+
this.isConnected = true;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
logger.error('Failed to connect to MongoDB:', error);
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Desconectar de MongoDB
|
|
51
|
+
*/
|
|
52
|
+
async disconnect() {
|
|
53
|
+
if (!this.isConnected) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
await mongoose.connection.close();
|
|
58
|
+
this.isConnected = false;
|
|
59
|
+
logger.info('MongoDB disconnected gracefully');
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger.error('Error disconnecting from MongoDB:', error);
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Verificar estado de conexión
|
|
68
|
+
*/
|
|
69
|
+
get connected() {
|
|
70
|
+
return this.isConnected && mongoose.connection.readyState === 1;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Obtener la instancia de conexión
|
|
74
|
+
*/
|
|
75
|
+
getConnection() {
|
|
76
|
+
return mongoose;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Factory para crear conector MongoDB
|
|
81
|
+
*/
|
|
82
|
+
export function createMongoDBConnector(uri) {
|
|
83
|
+
return new MongoDBConnector({ uri });
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=mongodb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongodb.js","sourceRoot":"","sources":["../../src/database/mongodb.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAOtC;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACjB,GAAG,CAAS;IACZ,OAAO,CAA0B;IACjC,WAAW,GAAG,KAAK,CAAC;IAE5B,YAAY,MAAsB;QAC9B,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI;YAC7B,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,CAAC;YACd,eAAe,EAAE,KAAK;YACtB,wBAAwB,EAAE,IAAI;SACjC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACT,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACzC,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAEhD,kBAAkB;YAClB,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACtC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;gBACxC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBACpC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;gBACvC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAC5B,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YACzD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,KAAK,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,aAAa;QACT,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAC9C,OAAO,IAAI,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;AACzC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { McpBaseServer } from './core/McpBaseServer.js';
|
|
2
|
+
export { BaseConfig } from './core/config.js';
|
|
3
|
+
export { logger, createChildLogger, setLogLevel } from './core/logger.js';
|
|
4
|
+
export type * from './core/types.js';
|
|
5
|
+
export { AuthMiddleware, createAuthMiddleware } from './middleware/auth.js';
|
|
6
|
+
export { MongoDBConnector, createMongoDBConnector } from './database/mongodb.js';
|
|
7
|
+
export type { MongoDBOptions } from './database/mongodb.js';
|
|
8
|
+
export { createExpressServer } from './server/createExpressServer.js';
|
|
9
|
+
export type { CreateServerOptions } from './server/createExpressServer.js';
|
|
10
|
+
export { isPortAvailable, findAvailablePort, getRandomAvailablePort, } from './utils/portFinder.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC1E,mBAAmB,iBAAiB,CAAC;AAGrC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5E,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAG3E,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,sBAAsB,GACzB,MAAM,uBAAuB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Core exports
|
|
2
|
+
export { McpBaseServer } from './core/McpBaseServer.js';
|
|
3
|
+
export { BaseConfig } from './core/config.js';
|
|
4
|
+
export { logger, createChildLogger, setLogLevel } from './core/logger.js';
|
|
5
|
+
// Middleware exports
|
|
6
|
+
export { AuthMiddleware, createAuthMiddleware } from './middleware/auth.js';
|
|
7
|
+
// Database exports
|
|
8
|
+
export { MongoDBConnector, createMongoDBConnector } from './database/mongodb.js';
|
|
9
|
+
// Server exports
|
|
10
|
+
export { createExpressServer } from './server/createExpressServer.js';
|
|
11
|
+
// Utils exports
|
|
12
|
+
export { isPortAvailable, findAvailablePort, getRandomAvailablePort, } from './utils/portFinder.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG1E,qBAAqB;AACrB,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5E,mBAAmB;AACnB,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGjF,iBAAiB;AACjB,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAGtE,gBAAgB;AAChB,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,sBAAsB,GACzB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* Middleware de autenticación para servidores MCP
|
|
4
|
+
*/
|
|
5
|
+
export declare class AuthMiddleware {
|
|
6
|
+
private apiKey;
|
|
7
|
+
private allowPublicPrivateAuth;
|
|
8
|
+
constructor(apiKey: string, allowPublicPrivateAuth?: boolean);
|
|
9
|
+
/**
|
|
10
|
+
* Middleware para validar API Key
|
|
11
|
+
*/
|
|
12
|
+
authenticate: (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Validar tokens público/privado
|
|
15
|
+
*/
|
|
16
|
+
private validatePublicPrivateTokens;
|
|
17
|
+
/**
|
|
18
|
+
* Middleware opcional - requiere autenticación solo para ciertas rutas
|
|
19
|
+
*/
|
|
20
|
+
optionalAuth: (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Factory para crear middleware de autenticación
|
|
24
|
+
*/
|
|
25
|
+
export declare function createAuthMiddleware(apiKey: string, allowPublicPrivateAuth?: boolean): AuthMiddleware;
|
|
26
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI/D;;GAEG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,sBAAsB,CAAU;gBAE5B,MAAM,EAAE,MAAM,EAAE,sBAAsB,UAAQ;IAK1D;;OAEG;IACI,YAAY,GACf,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,KACnB,OAAO,CAAC,IAAI,CAAC,CAsEd;IAEF;;OAEG;YACW,2BAA2B;IAQzC;;OAEG;IACI,YAAY,GACf,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,KACnB,OAAO,CAAC,IAAI,CAAC,CAUd;CACL;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,MAAM,EACd,sBAAsB,UAAQ,GAC/B,cAAc,CAEhB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { logger } from '../core/logger';
|
|
2
|
+
/**
|
|
3
|
+
* Middleware de autenticación para servidores MCP
|
|
4
|
+
*/
|
|
5
|
+
export class AuthMiddleware {
|
|
6
|
+
apiKey;
|
|
7
|
+
allowPublicPrivateAuth;
|
|
8
|
+
constructor(apiKey, allowPublicPrivateAuth = false) {
|
|
9
|
+
this.apiKey = apiKey;
|
|
10
|
+
this.allowPublicPrivateAuth = allowPublicPrivateAuth;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Middleware para validar API Key
|
|
14
|
+
*/
|
|
15
|
+
authenticate = async (req, res, next) => {
|
|
16
|
+
try {
|
|
17
|
+
const authHeader = req.headers.authorization;
|
|
18
|
+
const publicToken = req.headers['publictoken'];
|
|
19
|
+
const privateToken = req.headers['privatetoken'];
|
|
20
|
+
let isValid = false;
|
|
21
|
+
const authContext = {
|
|
22
|
+
isAuthenticated: false,
|
|
23
|
+
};
|
|
24
|
+
// Verificar Bearer token
|
|
25
|
+
if (authHeader && authHeader.startsWith('Bearer ')) {
|
|
26
|
+
const token = authHeader.substring(7);
|
|
27
|
+
if (token === this.apiKey) {
|
|
28
|
+
isValid = true;
|
|
29
|
+
authContext.metadata = { authMethod: 'bearer' };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Verificar Public/Private tokens (si está habilitado)
|
|
33
|
+
if (!isValid &&
|
|
34
|
+
this.allowPublicPrivateAuth &&
|
|
35
|
+
publicToken &&
|
|
36
|
+
privateToken) {
|
|
37
|
+
// Aquí podrías implementar validación adicional de tokens
|
|
38
|
+
isValid = await this.validatePublicPrivateTokens(publicToken, privateToken);
|
|
39
|
+
if (isValid) {
|
|
40
|
+
authContext.metadata = {
|
|
41
|
+
authMethod: 'public-private',
|
|
42
|
+
publicToken
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (!isValid) {
|
|
47
|
+
logger.warn('Authentication failed', {
|
|
48
|
+
ip: req.ip,
|
|
49
|
+
path: req.path,
|
|
50
|
+
});
|
|
51
|
+
res.status(401).json({
|
|
52
|
+
error: 'Unauthorized',
|
|
53
|
+
message: 'Invalid or missing authentication credentials',
|
|
54
|
+
});
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
authContext.isAuthenticated = true;
|
|
58
|
+
// Adjuntar contexto de autenticación al request
|
|
59
|
+
req.authContext = authContext;
|
|
60
|
+
logger.debug('Authentication successful', {
|
|
61
|
+
method: authContext.metadata?.authMethod,
|
|
62
|
+
path: req.path,
|
|
63
|
+
});
|
|
64
|
+
next();
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
logger.error('Authentication error:', error);
|
|
68
|
+
res.status(500).json({
|
|
69
|
+
error: 'Internal Server Error',
|
|
70
|
+
message: 'Authentication failed',
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Validar tokens público/privado
|
|
76
|
+
*/
|
|
77
|
+
async validatePublicPrivateTokens(publicToken, privateToken) {
|
|
78
|
+
// Implementación básica - override en subclases si necesitas lógica personalizada
|
|
79
|
+
return publicToken.length > 0 && privateToken.length > 0;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Middleware opcional - requiere autenticación solo para ciertas rutas
|
|
83
|
+
*/
|
|
84
|
+
optionalAuth = async (req, res, next) => {
|
|
85
|
+
const authHeader = req.headers.authorization;
|
|
86
|
+
if (!authHeader) {
|
|
87
|
+
req.authContext = { isAuthenticated: false };
|
|
88
|
+
next();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
await this.authenticate(req, res, next);
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Factory para crear middleware de autenticación
|
|
96
|
+
*/
|
|
97
|
+
export function createAuthMiddleware(apiKey, allowPublicPrivateAuth = false) {
|
|
98
|
+
return new AuthMiddleware(apiKey, allowPublicPrivateAuth);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Server as HttpServer } from 'http';
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import type { BaseConfig } from '../core/config';
|
|
4
|
+
export interface CreateServerOptions {
|
|
5
|
+
mcpServer: McpServer;
|
|
6
|
+
config: BaseConfig;
|
|
7
|
+
port: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Crea y configura el servidor Express con todos los middlewares
|
|
11
|
+
*/
|
|
12
|
+
export declare function createExpressServer(options: CreateServerOptions): Promise<HttpServer>;
|
|
13
|
+
//# sourceMappingURL=createExpressServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createExpressServer.d.ts","sourceRoot":"","sources":["../../src/server/createExpressServer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAIjD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACrC,OAAO,EAAE,mBAAmB,GAC7B,OAAO,CAAC,UAAU,CAAC,CA4GrB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import cors from 'cors';
|
|
3
|
+
import helmet from 'helmet';
|
|
4
|
+
import rateLimit from 'express-rate-limit';
|
|
5
|
+
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
|
|
6
|
+
import rawBody from 'raw-body';
|
|
7
|
+
import { logger } from '../core/logger';
|
|
8
|
+
import { createAuthMiddleware } from '../middleware/auth';
|
|
9
|
+
/**
|
|
10
|
+
* Crea y configura el servidor Express con todos los middlewares
|
|
11
|
+
*/
|
|
12
|
+
export async function createExpressServer(options) {
|
|
13
|
+
const { mcpServer, config, port } = options;
|
|
14
|
+
const app = express();
|
|
15
|
+
// Security middlewares
|
|
16
|
+
app.use(helmet());
|
|
17
|
+
app.use(cors({
|
|
18
|
+
origin: config.corsAllowOrigin,
|
|
19
|
+
credentials: true,
|
|
20
|
+
}));
|
|
21
|
+
// Rate limiting
|
|
22
|
+
const limiter = rateLimit({
|
|
23
|
+
windowMs: config.rateLimitWindowMs,
|
|
24
|
+
max: config.rateLimitMaxRequests,
|
|
25
|
+
message: 'Too many requests from this IP, please try again later.',
|
|
26
|
+
});
|
|
27
|
+
app.use(limiter);
|
|
28
|
+
// Auth middleware
|
|
29
|
+
const authMiddleware = createAuthMiddleware(config.apiKey);
|
|
30
|
+
// Health check endpoint (sin autenticación)
|
|
31
|
+
app.get('/health', (req, res) => {
|
|
32
|
+
res.json({
|
|
33
|
+
status: 'healthy',
|
|
34
|
+
timestamp: new Date().toISOString(),
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
// SSE endpoint para MCP
|
|
38
|
+
app.get('/sse', authMiddleware.authenticate, async (req, res) => {
|
|
39
|
+
logger.info('New SSE connection established');
|
|
40
|
+
const transport = new SSEServerTransport('/message', res);
|
|
41
|
+
await mcpServer.connect(transport);
|
|
42
|
+
// Cleanup cuando se cierra la conexión
|
|
43
|
+
req.on('close', () => {
|
|
44
|
+
logger.info('SSE connection closed');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
// Message endpoint para MCP (legacy)
|
|
48
|
+
app.post('/message', authMiddleware.authenticate, async (req, res) => {
|
|
49
|
+
try {
|
|
50
|
+
const body = await rawBody(req, {
|
|
51
|
+
length: req.headers['content-length'],
|
|
52
|
+
limit: '10mb',
|
|
53
|
+
});
|
|
54
|
+
const message = JSON.parse(body.toString('utf-8'));
|
|
55
|
+
logger.debug('Received MCP message', {
|
|
56
|
+
method: message.method,
|
|
57
|
+
id: message.id,
|
|
58
|
+
});
|
|
59
|
+
// Aquí se procesaría el mensaje MCP
|
|
60
|
+
// Por ahora solo respondemos OK
|
|
61
|
+
res.json({
|
|
62
|
+
jsonrpc: '2.0',
|
|
63
|
+
id: message.id,
|
|
64
|
+
result: {},
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
logger.error('Error processing message:', error);
|
|
69
|
+
res.status(500).json({
|
|
70
|
+
jsonrpc: '2.0',
|
|
71
|
+
error: {
|
|
72
|
+
code: -32603,
|
|
73
|
+
message: 'Internal server error',
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
// Error handling middleware
|
|
79
|
+
app.use((err, req, res, next) => {
|
|
80
|
+
logger.error('Express error:', err);
|
|
81
|
+
res.status(500).json({
|
|
82
|
+
error: 'Internal Server Error',
|
|
83
|
+
message: process.env.NODE_ENV === 'development' ? err.message : undefined,
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
// Start server
|
|
87
|
+
return new Promise((resolve, reject) => {
|
|
88
|
+
const server = app.listen(port, () => {
|
|
89
|
+
logger.info(`Express server listening on port ${port}`);
|
|
90
|
+
resolve(server);
|
|
91
|
+
});
|
|
92
|
+
server.on('error', (error) => {
|
|
93
|
+
logger.error('Server error:', error);
|
|
94
|
+
reject(error);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=createExpressServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createExpressServer.js","sourceRoot":"","sources":["../../src/server/createExpressServer.ts"],"names":[],"mappings":"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"}
|