// src/server.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { interactionResources } from "./resources/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { interactionIndexResource } from "./resources/interactions-index/interactions-index.resource.js";
import { registerGimPrompts } from "./prompts/instrucciones-gim.js";
const server = new McpServer({
name: "GIM-MCP-Server",
version: "1.0.0"
});
// Para registrar múltiples recursos dinámicamente:
// Asumiendo que interactionResources es un array de tus objetos como flashcardResource
for (const res of interactionResources) {
server.registerResource(
res.id, // Nombre/ID único
`interaction://${res.id}`, // URI única siguiendo un esquema
{
description: res.description,
mimeType: "application/json"
},
async (uri) => {
// Ejecutamos tu handler para obtener la definición completa
const data = await res.handler();
return {
contents: [{
uri: uri.href,
text: JSON.stringify(data, null, 2), // Serializamos el objeto
mimeType: "application/json"
}]
};
}
);
server.registerTool(
`read_interaction_${res.id}`,
{
title: `Leer interacción ${res.id}`,
description: `Devuelve la definición completa de la interacción ${res.id}`,
inputSchema: z.object({})
},
async () => {
const data = await res.handler();
return {
content: [
{
type: "text",
text: JSON.stringify(data, null, 2)
}
]
};
}
);
}
server.registerTool(
"resumen_capacidades_gim",
{
title: "Explorador de Capacidades GIM",
description: "Analiza el catálogo central para informar sobre qué interacciones soportan audio, imagen, etc.",
inputSchema: z.object({})
},
async () => {
// 1. Llamamos al handler del recurso Index
const data = await interactionIndexResource.handler();
// 2. Accedemos al array interno 'interactions'
// Usamos encadenamiento opcional por seguridad
const listaInteracciones = data.interactions || [];
// 3. Construimos el reporte basado en ese array
const reporte = listaInteracciones.map((inter: any) => {
const c = inter.capabilities;
const soporte = [
c?.text ? "✅ Texto" : "❌ Texto",
c?.image ? "✅ Imagen" : "❌ Imagen",
c?.audio ? "✅ Audio" : "❌ Audio",
c?.categories ? "✅ Categorías" : "❌ Categorías",
].join(" | ");
return `### ${inter.name}\nID: ${inter.id}\nDescripción: ${inter.description}\nCapacidades: ${soporte}`;
}).join("\n\n");
return {
content: [
{
type: "text",
text: `Informe del Catálogo GIM:\n\n${reporte}`
}
]
};
}
);
registerGimPrompts(server);
// En lugar de server.start(), conectas el transporte
const transport = new StdioServerTransport();
await server.connect(transport);