Sus sistemas exponen herramientas; el agente las ejecuta

No hay que declarar endpoints uno por uno ni mandarnos un OpenAPI para que lo revisemos. Usted publica un servidor MCP (estándar abierto) y registra en Asixto su URL y una credencial. A partir de ahí el agente descubre su catálogo y ejecuta sus herramientas dentro de la operación de Asixto, con independencia del módulo al que pertenezcan y del canal por el que llegue la petición.

import { McpServer } from '@modelcontextprotocol/server';
import { NodeStreamableHTTPServerTransport } from '@modelcontextprotocol/node';
import { createMcpExpressApp } from '@modelcontextprotocol/express';
import * as z from 'zod/v4';

const server = new McpServer({ name: 'acme-tools', version: '1.0.0' });

server.registerTool(
  'consultar_cliente',
  {
    description:
      'Busca un cliente por número de documento y devuelve sus datos de contacto y estado. ' +
      'Úsala para identificar a quién se está atendiendo. No la uses para modificar datos.',
    inputSchema: z.object({ documento: z.string().min(5).max(20) }),
  },
  async ({ documento }) => {
    const cliente = await miBackend.buscarCliente(documento); // su API actual

    if (!cliente) {
      return {
        content: [{ type: 'text', text: 'No encontré un cliente con ese documento.' }],
        structuredContent: { encontrado: false },
      };
    }

    return {
      content: [{ type: 'text', text: `Cliente ${cliente.nombre}, estado ${cliente.estado}.` }],
      structuredContent: { encontrado: true, nombre: cliente.nombre, estado: cliente.estado },
    };
  },
);

const app = createMcpExpressApp();

app.post('/mcp', async (req, res) => {
  // Sin estado: un transporte por petición. Es el modo que exige el Gateway.
  const transport = new NodeStreamableHTTPServerTransport({ sessionIdGenerator: undefined });
  await server.connect(transport);
  await transport.handleRequest(req, res, req.body);
});

app.listen(8080);

En la respuesta, content es el texto que puede acabar leído en voz alta y structuredContent son los datos conformes a su outputSchema. Un fallo se devuelve con error_type y user_message, nunca como un 500 sin cuerpo.

El contrato en cifras

Los mismos valores que aplica el runtime que ejecutará sus herramientas.

Protocolo
MCP · revisión 2026-07-28
Transporte
HTTPS POST único, sin estado
Métodos obligatorios
server/discover · tools/list · tools/call
Autenticación
OAuth 2.1 (recomendado) o token rotable
Tamaño de respuesta
≤ 3.000 caracteres
Tiempo de espera
30 s máximo · p95 objetivo ≤ 2 s
Paginación
limit hasta 25 · 10 por defecto · 3 en voz
Errores
6 error_type + user_message