@cerema/cadriciel-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 (53) hide show
  1. package/Dockerfile +26 -0
  2. package/README.md +98 -0
  3. package/dist/client.d.ts +31 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +77 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/http-server.d.ts +13 -0
  8. package/dist/http-server.d.ts.map +1 -0
  9. package/dist/http-server.js +184 -0
  10. package/dist/http-server.js.map +1 -0
  11. package/dist/index.d.ts +17 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +64 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/tools/database.d.ts +70 -0
  16. package/dist/tools/database.d.ts.map +1 -0
  17. package/dist/tools/database.js +77 -0
  18. package/dist/tools/database.js.map +1 -0
  19. package/dist/tools/deploy.d.ts +73 -0
  20. package/dist/tools/deploy.d.ts.map +1 -0
  21. package/dist/tools/deploy.js +103 -0
  22. package/dist/tools/deploy.js.map +1 -0
  23. package/dist/tools/handlers.d.ts +13 -0
  24. package/dist/tools/handlers.d.ts.map +1 -0
  25. package/dist/tools/handlers.js +225 -0
  26. package/dist/tools/handlers.js.map +1 -0
  27. package/dist/tools/index.d.ts +11 -0
  28. package/dist/tools/index.d.ts.map +1 -0
  29. package/dist/tools/index.js +298 -0
  30. package/dist/tools/index.js.map +1 -0
  31. package/dist/tools/projects.d.ts +45 -0
  32. package/dist/tools/projects.d.ts.map +1 -0
  33. package/dist/tools/projects.js +71 -0
  34. package/dist/tools/projects.js.map +1 -0
  35. package/dist/tools/workflows.d.ts +66 -0
  36. package/dist/tools/workflows.d.ts.map +1 -0
  37. package/dist/tools/workflows.js +90 -0
  38. package/dist/tools/workflows.js.map +1 -0
  39. package/k8s/deployment.yaml +48 -0
  40. package/k8s/ingress.yaml +27 -0
  41. package/k8s/kustomization.yaml +14 -0
  42. package/k8s/service.yaml +15 -0
  43. package/package.json +36 -0
  44. package/src/client.ts +97 -0
  45. package/src/http-server.ts +213 -0
  46. package/src/index.ts +75 -0
  47. package/src/tools/database.ts +105 -0
  48. package/src/tools/deploy.ts +127 -0
  49. package/src/tools/handlers.ts +241 -0
  50. package/src/tools/index.ts +275 -0
  51. package/src/tools/projects.ts +89 -0
  52. package/src/tools/workflows.ts +117 -0
  53. package/tsconfig.json +19 -0
package/Dockerfile ADDED
@@ -0,0 +1,26 @@
1
+ # Cadriciel MCP Server - Docker Image
2
+ FROM node:20-alpine
3
+
4
+ WORKDIR /app
5
+
6
+ # Copy package files
7
+ COPY package*.json ./
8
+
9
+ # Install dependencies
10
+ RUN npm ci --only=production
11
+
12
+ # Copy built files
13
+ COPY dist/ ./dist/
14
+
15
+ # Set environment
16
+ ENV NODE_ENV=production
17
+ ENV PORT=3000
18
+
19
+ # Health check endpoint
20
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
21
+ CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
22
+
23
+ EXPOSE 3000
24
+
25
+ # Run HTTP server (stateless, API key per request)
26
+ CMD ["node", "dist/http-server.js"]
package/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # Cadriciel MCP Server
2
+
3
+ Serveur MCP (Model Context Protocol) pour l'intégration de Cadriciel avec les assistants IA comme Claude.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ cd cadriciel-mcp
9
+ npm install
10
+ npm run build
11
+ ```
12
+
13
+ ## Configuration
14
+
15
+ ### Variables d'environnement
16
+
17
+ | Variable | Description | Exemple |
18
+ |----------|-------------|---------|
19
+ | `CADRICIEL_API_URL` | URL de l'API Cadriciel | `https://studio.cerema.dev` |
20
+ | `CADRICIEL_API_KEY` | Clé API (Configuration > Clé API) | `abc123...` |
21
+
22
+ ### Configuration Claude Code
23
+
24
+ Ajoutez dans votre configuration MCP (`~/.config/claude-code/settings.json`) :
25
+
26
+ ```json
27
+ {
28
+ "mcpServers": {
29
+ "cadriciel": {
30
+ "command": "node",
31
+ "args": ["/path/to/cadriciel-mcp/dist/index.js"],
32
+ "env": {
33
+ "CADRICIEL_API_URL": "https://studio.cerema.dev",
34
+ "CADRICIEL_API_KEY": "votre-cle-api"
35
+ }
36
+ }
37
+ }
38
+ }
39
+ ```
40
+
41
+ ## Outils disponibles
42
+
43
+ ### Implémentés
44
+
45
+ | Outil | Description |
46
+ |-------|-------------|
47
+ | `list_projects` | Liste tous les projets accessibles |
48
+
49
+ ### TODO
50
+
51
+ | Outil | Description | Fichier |
52
+ |-------|-------------|---------|
53
+ | `get_project` | Détails d'un projet | `tools/projects.ts` |
54
+ | `list_workflows` | Liste les workflows | `tools/workflows.ts` |
55
+ | `execute_workflow` | Lance un workflow | `tools/workflows.ts` |
56
+ | `get_execution` | Statut d'une exécution | `tools/workflows.ts` |
57
+ | `get_schema` | Schéma de la base de données | `tools/database.ts` |
58
+ | `query_database` | Exécute une requête SQL (SELECT) | `tools/database.ts` |
59
+ | `get_deployment_status` | Statut du déploiement | `tools/deploy.ts` |
60
+ | `get_env_vars` | Variables d'environnement | `tools/deploy.ts` |
61
+ | `service_control` | Start/stop/restart services | `tools/deploy.ts` |
62
+
63
+ ## Développement
64
+
65
+ ```bash
66
+ # Mode développement
67
+ npm run dev
68
+
69
+ # Build
70
+ npm run build
71
+
72
+ # Watch mode
73
+ npm run watch
74
+ ```
75
+
76
+ ## Exemple d'usage
77
+
78
+ ```
79
+ User: Liste mes projets Cadriciel
80
+
81
+ Claude: [Appel MCP: list_projects]
82
+
83
+ Vous avez 3 projets :
84
+ - ENVISAAS2 (ID: 3338) - /cerema/envisaas2
85
+ - Mon Projet (ID: 1234) - /cerema/mon-projet
86
+ - Test App (ID: 5678) - /cerema/test-app
87
+ ```
88
+
89
+ ## Sécurité
90
+
91
+ - La clé API est liée à votre compte utilisateur
92
+ - Toutes les actions sont tracées dans l'audit log Cadriciel
93
+ - Les requêtes SQL sont limitées à SELECT uniquement
94
+ - Ne partagez jamais votre clé API
95
+
96
+ ## License
97
+
98
+ MIT
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Cadriciel API Client
3
+ *
4
+ * HTTP client for communicating with the Cadriciel backend API.
5
+ * Uses the API key for authentication.
6
+ */
7
+ export interface CadricielConfig {
8
+ apiUrl: string;
9
+ apiKey: string;
10
+ }
11
+ export interface ApiResponse<T = any> {
12
+ success: boolean;
13
+ data?: T;
14
+ error?: string;
15
+ }
16
+ export declare class CadricielClient {
17
+ private apiUrl;
18
+ private apiKey;
19
+ constructor(config: CadricielConfig);
20
+ /**
21
+ * Make an authenticated request to the Cadriciel API
22
+ */
23
+ request<T = any>(method: string, endpoint: string, body?: any): Promise<ApiResponse<T>>;
24
+ get<T = any>(endpoint: string): Promise<ApiResponse<T>>;
25
+ post<T = any>(endpoint: string, body?: any): Promise<ApiResponse<T>>;
26
+ put<T = any>(endpoint: string, body?: any): Promise<ApiResponse<T>>;
27
+ delete<T = any>(endpoint: string): Promise<ApiResponse<T>>;
28
+ }
29
+ export declare function initClient(config: CadricielConfig): CadricielClient;
30
+ export declare function getClient(): CadricielClient;
31
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,eAAe;IAKnC;;OAEG;IACG,OAAO,CAAC,CAAC,GAAG,GAAG,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,GAAG,GACT,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAgCpB,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAIvD,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAIpE,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAInE,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;CAGjE;AAKD,wBAAgB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CAGnE;AAED,wBAAgB,SAAS,IAAI,eAAe,CAK3C"}
package/dist/client.js ADDED
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /**
3
+ * Cadriciel API Client
4
+ *
5
+ * HTTP client for communicating with the Cadriciel backend API.
6
+ * Uses the API key for authentication.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CadricielClient = void 0;
10
+ exports.initClient = initClient;
11
+ exports.getClient = getClient;
12
+ class CadricielClient {
13
+ apiUrl;
14
+ apiKey;
15
+ constructor(config) {
16
+ this.apiUrl = config.apiUrl.replace(/\/$/, ''); // Remove trailing slash
17
+ this.apiKey = config.apiKey;
18
+ }
19
+ /**
20
+ * Make an authenticated request to the Cadriciel API
21
+ */
22
+ async request(method, endpoint, body) {
23
+ const url = `${this.apiUrl}${endpoint}`;
24
+ try {
25
+ const response = await fetch(url, {
26
+ method,
27
+ headers: {
28
+ 'Content-Type': 'application/json',
29
+ 'Authorization': `Bearer ${this.apiKey}`,
30
+ },
31
+ body: body ? JSON.stringify(body) : undefined,
32
+ });
33
+ if (!response.ok) {
34
+ const errorText = await response.text();
35
+ return {
36
+ success: false,
37
+ error: `HTTP ${response.status}: ${errorText}`,
38
+ };
39
+ }
40
+ const data = await response.json();
41
+ return { success: true, data };
42
+ }
43
+ catch (error) {
44
+ return {
45
+ success: false,
46
+ error: error instanceof Error ? error.message : 'Unknown error',
47
+ };
48
+ }
49
+ }
50
+ // Convenience methods
51
+ async get(endpoint) {
52
+ return this.request('GET', endpoint);
53
+ }
54
+ async post(endpoint, body) {
55
+ return this.request('POST', endpoint, body);
56
+ }
57
+ async put(endpoint, body) {
58
+ return this.request('PUT', endpoint, body);
59
+ }
60
+ async delete(endpoint) {
61
+ return this.request('DELETE', endpoint);
62
+ }
63
+ }
64
+ exports.CadricielClient = CadricielClient;
65
+ // Singleton instance
66
+ let clientInstance = null;
67
+ function initClient(config) {
68
+ clientInstance = new CadricielClient(config);
69
+ return clientInstance;
70
+ }
71
+ function getClient() {
72
+ if (!clientInstance) {
73
+ throw new Error('Cadriciel client not initialized. Call initClient() first.');
74
+ }
75
+ return clientInstance;
76
+ }
77
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAiFH,gCAGC;AAED,8BAKC;AA9ED,MAAa,eAAe;IAClB,MAAM,CAAS;IACf,MAAM,CAAS;IAEvB,YAAY,MAAuB;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;QACxE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,MAAc,EACd,QAAgB,EAChB,IAAU;QAEV,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,MAAM;gBACN,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;iBACzC;gBACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAC9C,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,QAAQ,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE;iBAC/C,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAO,CAAC;YACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAChE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,KAAK,CAAC,GAAG,CAAU,QAAgB;QACjC,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAU,QAAgB,EAAE,IAAU;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,GAAG,CAAU,QAAgB,EAAE,IAAU;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAU,QAAgB;QACpC,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;CACF;AA/DD,0CA+DC;AAED,qBAAqB;AACrB,IAAI,cAAc,GAA2B,IAAI,CAAC;AAElD,SAAgB,UAAU,CAAC,MAAuB;IAChD,cAAc,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAgB,SAAS;IACvB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Cadriciel MCP HTTP Server
3
+ *
4
+ * HTTP-based MCP server for remote access.
5
+ * Uses SSE for streaming and HTTP POST for tool calls.
6
+ *
7
+ * Authentication: API key passed in X-API-Key header
8
+ */
9
+ /**
10
+ * Start the HTTP server
11
+ */
12
+ export declare function startHttpServer(): void;
13
+ //# 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":"AAAA;;;;;;;GAOG;AA2KH;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CA0BtC"}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ /**
3
+ * Cadriciel MCP HTTP Server
4
+ *
5
+ * HTTP-based MCP server for remote access.
6
+ * Uses SSE for streaming and HTTP POST for tool calls.
7
+ *
8
+ * Authentication: API key passed in X-API-Key header
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.startHttpServer = startHttpServer;
15
+ const http_1 = __importDefault(require("http"));
16
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
17
+ const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
18
+ const client_1 = require("./client");
19
+ const handlers_1 = require("./tools/handlers");
20
+ const PORT = parseInt(process.env.PORT || '3000', 10);
21
+ const CADRICIEL_API_URL = process.env.CADRICIEL_API_URL || 'https://api.cerema.dev';
22
+ // Store active transports by session ID
23
+ const transports = new Map();
24
+ /**
25
+ * Create an MCP server instance for a specific API key
26
+ */
27
+ function createMcpServer(apiKey) {
28
+ const client = new client_1.CadricielClient({
29
+ apiUrl: CADRICIEL_API_URL,
30
+ apiKey,
31
+ });
32
+ const server = new index_js_1.Server({
33
+ name: 'cadriciel-mcp',
34
+ version: '0.1.0',
35
+ }, {
36
+ capabilities: {
37
+ tools: {},
38
+ },
39
+ });
40
+ // Register tool handlers with this client
41
+ (0, handlers_1.createToolHandlers)(server, client);
42
+ return server;
43
+ }
44
+ /**
45
+ * Parse API key from request headers
46
+ */
47
+ function getApiKey(req) {
48
+ const apiKey = req.headers['x-api-key'];
49
+ if (typeof apiKey === 'string' && apiKey.length > 0) {
50
+ return apiKey;
51
+ }
52
+ // Also check Authorization header
53
+ const auth = req.headers['authorization'];
54
+ if (typeof auth === 'string' && auth.startsWith('Bearer ')) {
55
+ return auth.slice(7);
56
+ }
57
+ return null;
58
+ }
59
+ /**
60
+ * Generate a unique session ID
61
+ */
62
+ function generateSessionId() {
63
+ return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
64
+ }
65
+ /**
66
+ * HTTP request handler
67
+ */
68
+ async function handleRequest(req, res) {
69
+ // CORS headers
70
+ res.setHeader('Access-Control-Allow-Origin', '*');
71
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
72
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, X-API-Key, Authorization');
73
+ // Handle preflight
74
+ if (req.method === 'OPTIONS') {
75
+ res.writeHead(204);
76
+ res.end();
77
+ return;
78
+ }
79
+ const url = new URL(req.url || '/', `http://${req.headers.host}`);
80
+ // Health check
81
+ if (url.pathname === '/health' || url.pathname === '/') {
82
+ res.writeHead(200, { 'Content-Type': 'application/json' });
83
+ res.end(JSON.stringify({
84
+ status: 'ok',
85
+ service: 'cadriciel-mcp',
86
+ version: '0.1.0',
87
+ }));
88
+ return;
89
+ }
90
+ // SSE endpoint for MCP connection
91
+ if (url.pathname === '/sse' && req.method === 'GET') {
92
+ const apiKey = getApiKey(req);
93
+ if (!apiKey) {
94
+ res.writeHead(401, { 'Content-Type': 'application/json' });
95
+ res.end(JSON.stringify({ error: 'API key required (X-API-Key header)' }));
96
+ return;
97
+ }
98
+ const sessionId = generateSessionId();
99
+ console.log(`[MCP] New SSE connection: ${sessionId}`);
100
+ // Create MCP server for this session
101
+ const mcpServer = createMcpServer(apiKey);
102
+ // Create SSE transport
103
+ const transport = new sse_js_1.SSEServerTransport('/messages', res);
104
+ transports.set(sessionId, transport);
105
+ // Connect server to transport
106
+ await mcpServer.connect(transport);
107
+ // Cleanup on close
108
+ res.on('close', () => {
109
+ console.log(`[MCP] SSE connection closed: ${sessionId}`);
110
+ transports.delete(sessionId);
111
+ mcpServer.close();
112
+ });
113
+ return;
114
+ }
115
+ // Message endpoint for MCP requests
116
+ if (url.pathname === '/messages' && req.method === 'POST') {
117
+ const sessionId = url.searchParams.get('sessionId');
118
+ if (!sessionId) {
119
+ res.writeHead(400, { 'Content-Type': 'application/json' });
120
+ res.end(JSON.stringify({ error: 'sessionId required' }));
121
+ return;
122
+ }
123
+ const transport = transports.get(sessionId);
124
+ if (!transport) {
125
+ res.writeHead(404, { 'Content-Type': 'application/json' });
126
+ res.end(JSON.stringify({ error: 'Session not found' }));
127
+ return;
128
+ }
129
+ // Read body
130
+ let body = '';
131
+ req.on('data', (chunk) => {
132
+ body += chunk.toString();
133
+ });
134
+ req.on('end', async () => {
135
+ try {
136
+ await transport.handlePostMessage(req, res, body);
137
+ }
138
+ catch (error) {
139
+ console.error('[MCP] Message handling error:', error);
140
+ if (!res.headersSent) {
141
+ res.writeHead(500, { 'Content-Type': 'application/json' });
142
+ res.end(JSON.stringify({ error: 'Internal server error' }));
143
+ }
144
+ }
145
+ });
146
+ return;
147
+ }
148
+ // 404 for unknown routes
149
+ res.writeHead(404, { 'Content-Type': 'application/json' });
150
+ res.end(JSON.stringify({ error: 'Not found' }));
151
+ }
152
+ /**
153
+ * Start the HTTP server
154
+ */
155
+ function startHttpServer() {
156
+ const server = http_1.default.createServer(handleRequest);
157
+ server.listen(PORT, () => {
158
+ console.log(`
159
+ ╔═══════════════════════════════════════════════════════════════╗
160
+ ║ Cadriciel MCP HTTP Server ║
161
+ ╠═══════════════════════════════════════════════════════════════╣
162
+ ║ Port: ${String(PORT).padEnd(48)}║
163
+ ║ API URL: ${CADRICIEL_API_URL.padEnd(48)}║
164
+ ║ Endpoints: ║
165
+ ║ GET /health Health check ║
166
+ ║ GET /sse SSE connection (X-API-Key required) ║
167
+ ║ POST /messages MCP messages ║
168
+ ╚═══════════════════════════════════════════════════════════════╝
169
+ `);
170
+ });
171
+ // Graceful shutdown
172
+ process.on('SIGTERM', () => {
173
+ console.log('[MCP] Shutting down...');
174
+ server.close(() => {
175
+ console.log('[MCP] Server closed');
176
+ process.exit(0);
177
+ });
178
+ });
179
+ }
180
+ // Start if run directly
181
+ if (require.main === module) {
182
+ startHttpServer();
183
+ }
184
+ //# 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,17 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cadriciel MCP Server
4
+ *
5
+ * Model Context Protocol server for Cadriciel platform integration.
6
+ * Allows AI assistants like Claude to interact with Cadriciel projects,
7
+ * workflows, databases, and deployments.
8
+ *
9
+ * Usage:
10
+ * CADRICIEL_API_URL=https://studio.cerema.dev CADRICIEL_API_KEY=xxx cadriciel-mcp
11
+ *
12
+ * Environment variables:
13
+ * CADRICIEL_API_URL - Base URL of the Cadriciel API (required)
14
+ * CADRICIEL_API_KEY - API key for authentication (required)
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;GAaG"}
package/dist/index.js ADDED
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Cadriciel MCP Server
5
+ *
6
+ * Model Context Protocol server for Cadriciel platform integration.
7
+ * Allows AI assistants like Claude to interact with Cadriciel projects,
8
+ * workflows, databases, and deployments.
9
+ *
10
+ * Usage:
11
+ * CADRICIEL_API_URL=https://studio.cerema.dev CADRICIEL_API_KEY=xxx cadriciel-mcp
12
+ *
13
+ * Environment variables:
14
+ * CADRICIEL_API_URL - Base URL of the Cadriciel API (required)
15
+ * CADRICIEL_API_KEY - API key for authentication (required)
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
19
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
20
+ const client_1 = require("./client");
21
+ const tools_1 = require("./tools");
22
+ const SERVER_NAME = 'cadriciel-mcp';
23
+ const SERVER_VERSION = '0.1.0';
24
+ async function main() {
25
+ // Read configuration from environment
26
+ const apiUrl = process.env.CADRICIEL_API_URL;
27
+ const apiKey = process.env.CADRICIEL_API_KEY;
28
+ if (!apiUrl) {
29
+ console.error('Error: CADRICIEL_API_URL environment variable is required');
30
+ console.error('Example: CADRICIEL_API_URL=https://studio.cerema.dev');
31
+ process.exit(1);
32
+ }
33
+ if (!apiKey) {
34
+ console.error('Error: CADRICIEL_API_KEY environment variable is required');
35
+ console.error('Generate your API key in Cadriciel > Configuration > Cle API');
36
+ process.exit(1);
37
+ }
38
+ // Initialize API client
39
+ (0, client_1.initClient)({ apiUrl, apiKey });
40
+ // Create MCP server
41
+ const server = new index_js_1.Server({
42
+ name: SERVER_NAME,
43
+ version: SERVER_VERSION,
44
+ }, {
45
+ capabilities: {
46
+ tools: {},
47
+ // TODO: Add resources capability
48
+ // resources: {},
49
+ },
50
+ });
51
+ // Register tools
52
+ (0, tools_1.registerTools)(server);
53
+ // Connect via stdio transport
54
+ const transport = new stdio_js_1.StdioServerTransport();
55
+ await server.connect(transport);
56
+ console.error(`[${SERVER_NAME}] Server started (v${SERVER_VERSION})`);
57
+ console.error(`[${SERVER_NAME}] Connected to: ${apiUrl}`);
58
+ }
59
+ // Handle errors
60
+ main().catch((error) => {
61
+ console.error('Fatal error:', error);
62
+ process.exit(1);
63
+ });
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA;;;;;;;;;;;;;GAaG;;AAEH,wEAAmE;AACnE,wEAAiF;AACjF,qCAAsC;AACtC,mCAAwC;AAExC,MAAM,WAAW,GAAG,eAAe,CAAC;AACpC,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,KAAK,UAAU,IAAI;IACjB,sCAAsC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC3E,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC3E,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wBAAwB;IACxB,IAAA,mBAAU,EAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/B,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAI,iBAAM,CACvB;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,iCAAiC;YACjC,iBAAiB;SAClB;KACF,CACF,CAAC;IAEF,iBAAiB;IACjB,IAAA,qBAAa,EAAC,MAAM,CAAC,CAAC;IAEtB,8BAA8B;IAC9B,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,sBAAsB,cAAc,GAAG,CAAC,CAAC;IACtE,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,mBAAmB,MAAM,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,gBAAgB;AAChB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Database Tools
3
+ *
4
+ * Tools for interacting with project databases.
5
+ */
6
+ /**
7
+ * TODO: Get database schema (tables, columns, relationships)
8
+ *
9
+ * @param workspaceId - The workspace/project ID
10
+ * @returns Database schema information
11
+ */
12
+ export declare function getSchema(workspaceId: number): Promise<{
13
+ tables: Array<{
14
+ name: string;
15
+ schema: string;
16
+ columns: Array<{
17
+ name: string;
18
+ type: string;
19
+ nullable: boolean;
20
+ defaultValue?: string;
21
+ isPrimaryKey: boolean;
22
+ isForeignKey: boolean;
23
+ }>;
24
+ }>;
25
+ }>;
26
+ /**
27
+ * TODO: Execute a SQL query (SELECT only for safety)
28
+ *
29
+ * @param workspaceId - The workspace/project ID
30
+ * @param query - SQL SELECT query
31
+ * @param params - Query parameters
32
+ * @returns Query results
33
+ */
34
+ export declare function queryDatabase(workspaceId: number, query: string, params?: any[]): Promise<{
35
+ rows: any[];
36
+ rowCount: number;
37
+ fields: Array<{
38
+ name: string;
39
+ type: string;
40
+ }>;
41
+ }>;
42
+ /**
43
+ * TODO: Get table data with pagination
44
+ *
45
+ * @param workspaceId - The workspace/project ID
46
+ * @param tableName - Table name
47
+ * @param options - Pagination and filter options
48
+ * @returns Table rows
49
+ */
50
+ export declare function getTableData(workspaceId: number, tableName: string, options?: {
51
+ limit?: number;
52
+ offset?: number;
53
+ orderBy?: string;
54
+ filter?: Record<string, any>;
55
+ }): Promise<any>;
56
+ /**
57
+ * TODO: Get ERD (Entity Relationship Diagram) data
58
+ *
59
+ * @param workspaceId - The workspace/project ID
60
+ * @returns ERD data including tables and relationships
61
+ */
62
+ export declare function getERD(workspaceId: number): Promise<any>;
63
+ /**
64
+ * TODO: List database functions
65
+ *
66
+ * @param workspaceId - The workspace/project ID
67
+ * @returns List of stored procedures and functions
68
+ */
69
+ export declare function listFunctions(workspaceId: number): Promise<any>;
70
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/tools/database.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5D,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,OAAO,CAAC;YAClB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,YAAY,EAAE,OAAO,CAAC;YACtB,YAAY,EAAE,OAAO,CAAC;SACvB,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ,CAAC,CAID;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,GAAG,EAAE,GACb,OAAO,CAAC;IACT,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/C,CAAC,CAMD;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B,GACA,OAAO,CAAC,GAAG,CAAC,CAId;AAED;;;;;GAKG;AACH,wBAAsB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAI9D;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAIrE"}