import { MCPTool } from "mcp-framework";
import axios from "axios";
import { z } from "zod";
interface N8nApiInput {
endpoint: string;
method: "GET" | "POST" | "PUT" | "DELETE";
data?: any;
params?: Record<string, string>;
}
class N8nApiTool extends MCPTool<N8nApiInput> {
name = "n8n_api";
description = "Interagit directement avec l'API n8n";
schema = {
endpoint: {
type: z.string(),
description: "Point de terminaison de l'API (ex: /workflows, /executions)",
},
method: {
type: z.enum(["GET", "POST", "PUT", "DELETE"]),
description: "Méthode HTTP à utiliser",
},
data: {
type: z.any().optional(),
description: "Données à envoyer pour les requêtes POST et PUT",
},
params: {
type: z.record(z.string()).optional(),
description: "Paramètres de requête URL",
},
};
private apiUrl = process.env.N8N_API_URL || "http://localhost:5678/api/v1";
private apiKey = process.env.N8N_API_KEY || "";
private getAxiosConfig(params?: Record<string, string>) {
return {
headers: {
"X-N8N-API-KEY": this.apiKey,
"Content-Type": "application/json",
},
params,
};
}
async execute({ endpoint, method, data, params }: N8nApiInput) {
try {
const url = `${this.apiUrl}${endpoint.startsWith('/') ? endpoint : '/' + endpoint}`;
console.log(`Tentative de connexion à l'API n8n: ${url}`);
console.log(`Méthode: ${method}`);
console.log(`Paramètres: ${JSON.stringify(params || {})}`);
let response;
switch (method) {
case "GET":
response = await axios.get(url, this.getAxiosConfig(params));
break;
case "POST":
response = await axios.post(url, data, this.getAxiosConfig(params));
break;
case "PUT":
response = await axios.put(url, data, this.getAxiosConfig(params));
break;
case "DELETE":
response = await axios.delete(url, this.getAxiosConfig(params));
break;
default:
throw new Error(`Méthode HTTP non supportée: ${method}`);
}
console.log(`Réponse reçue avec succès, statut: ${response.status}`);
return {
success: true,
statusCode: response.status,
data: response.data,
};
} catch (error: any) {
console.error('Erreur lors de l\'appel à l\'API n8n:', error);
// Afficher des informations détaillées sur l'erreur
if (error.response) {
// La requête a été faite et le serveur a répondu avec un code d'état
// qui n'est pas dans la plage 2xx
console.error(`Statut: ${error.response.status}`);
console.error(`Données: ${JSON.stringify(error.response.data)}`);
console.error(`En-têtes: ${JSON.stringify(error.response.headers)}`);
} else if (error.request) {
// La requête a été faite mais aucune réponse n'a été reçue
console.error('Aucune réponse reçue du serveur');
console.error(error.request);
} else {
// Une erreur s'est produite lors de la configuration de la requête
console.error('Erreur de configuration de la requête:', error.message);
}
return {
success: false,
error: error.message,
statusCode: error.response?.status,
details: error.response?.data || "Erreur inconnue",
};
}
}
}
export default N8nApiTool;