@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.
- package/Dockerfile +26 -0
- package/README.md +98 -0
- package/dist/client.d.ts +31 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +77 -0
- package/dist/client.js.map +1 -0
- package/dist/http-server.d.ts +13 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +184 -0
- package/dist/http-server.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/database.d.ts +70 -0
- package/dist/tools/database.d.ts.map +1 -0
- package/dist/tools/database.js +77 -0
- package/dist/tools/database.js.map +1 -0
- package/dist/tools/deploy.d.ts +73 -0
- package/dist/tools/deploy.d.ts.map +1 -0
- package/dist/tools/deploy.js +103 -0
- package/dist/tools/deploy.js.map +1 -0
- package/dist/tools/handlers.d.ts +13 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +225 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/tools/index.d.ts +11 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +298 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/projects.d.ts +45 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +71 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/workflows.d.ts +66 -0
- package/dist/tools/workflows.d.ts.map +1 -0
- package/dist/tools/workflows.js +90 -0
- package/dist/tools/workflows.js.map +1 -0
- package/k8s/deployment.yaml +48 -0
- package/k8s/ingress.yaml +27 -0
- package/k8s/kustomization.yaml +14 -0
- package/k8s/service.yaml +15 -0
- package/package.json +36 -0
- package/src/client.ts +97 -0
- package/src/http-server.ts +213 -0
- package/src/index.ts +75 -0
- package/src/tools/database.ts +105 -0
- package/src/tools/deploy.ts +127 -0
- package/src/tools/handlers.ts +241 -0
- package/src/tools/index.ts +275 -0
- package/src/tools/projects.ts +89 -0
- package/src/tools/workflows.ts +117 -0
- 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
|
package/dist/client.d.ts
ADDED
|
@@ -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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|