import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { z } from 'zod'; // MCP de démonstration INDÉPENDANT : un garage fictif. // Aucun lien avec Nchargi. C'est exactement le genre de MCP qu'un client écrirait. const server = new McpServer({ name: 'demo-garage', version: '1.0.0' }); server.tool( 'get_balance', 'Retourne le solde du compte client (en dirhams).', {}, async () => ({ content: [{ type: 'text', text: '150.00 DH' }] }) ); server.tool( 'list_available_slots', 'Liste les créneaux de rendez-vous disponibles pour une date donnée.', { date: z.string().describe('Date au format YYYY-MM-DD') }, async ({ date }) => ({ content: [{ type: 'text', text: `Créneaux disponibles le ${date}: 10:00, 14:00, 16:00` }], }) ); server.tool( 'book_appointment', "Réserve un créneau de rendez-vous. Échoue si le créneau est déjà pris (16:00 est toujours pris).", { date: z.string().describe('Date au format YYYY-MM-DD'), time: z.string().describe('Heure du créneau, ex: 14:00'), }, async ({ date, time }) => { if (time === '16:00') { return { isError: true, content: [{ type: 'text', text: 'ERREUR: créneau déjà réservé' }], }; } return { content: [{ type: 'text', text: `Rendez-vous réservé: ${date} à ${time}` }] }; } ); const transport = new StdioServerTransport(); await server.connect(transport);