Creando Servidores MCP Personalizado

Aprende cómo crear servidores MCP personalizados para extender TeamDay con tus propias herramientas.

Estructura Básica

Un servidor MCP es una aplicación que implementa el protocolo MCP:

// my-mcp-server.js
const mcp = require('@anthropic-ai/mcp-sdk');

const server = new mcp.MCPServer({
  name: 'my-custom-server',
  version: '1.0.0'
});

// Registra herramientas
server.setRequestHandler(mcp.Tool, async (request) => {
  if (request.name === 'my-tool') {
    return {
      content: [{
        type: 'text',
        text: 'Resultado de la herramienta'
      }]
    };
  }
});

// Inicia el servidor
server.start();

Crear una Herramienta Personalizada

Ejemplo: Herramienta que suma dos números

server.setRequestHandler(mcp.Tool, async (request) => {
  if (request.name === 'add') {
    const { a, b } = request.arguments;
    return {
      content: [{
        type: 'text',
        text: `${a} + ${b} = ${a + b}`
      }]
    };
  }
});

Herramientas con Estado

Mantén estado entre llamadas:

const database = new Map();

server.setRequestHandler(mcp.Tool, async (request) => {
  if (request.name === 'store-data') {
    const { key, value } = request.arguments;
    database.set(key, value);
    return { content: [{ type: 'text', text: 'Data stored' }] };
  }

  if (request.name === 'retrieve-data') {
    const { key } = request.arguments;
    const value = database.get(key);
    return { content: [{ type: 'text', text: value }] };
  }
});

Integrar con API Externa

Ejemplo: Integración con OpenWeather API

const axios = require('axios');

server.setRequestHandler(mcp.Tool, async (request) => {
  if (request.name === 'get-weather') {
    const { city } = request.arguments;
    const response = await axios.get(
      `https://api.openweathermap.org/data/2.5/weather`,
      { params: { q: city, appid: process.env.WEATHER_API_KEY } }
    );
    return {
      content: [{
        type: 'text',
        text: JSON.stringify(response.data)
      }]
    };
  }
});

Manejo de Errores

server.setRequestHandler(mcp.Tool, async (request) => {
  try {
    // Tu lógica
    return { content: [{ type: 'text', text: 'Éxito' }] };
  } catch (error) {
    return {
      error: {
        code: 'INTERNAL_ERROR',
        message: error.message
      }
    };
  }
});

Deploying Your Server

Localmente

node my-mcp-server.js

Docker

FROM node:18
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "my-mcp-server.js"]
docker build -t my-mcp-server .
docker run -p 3000:3000 my-mcp-server

En TeamDay

  1. Compila tu servidor
  2. Hostealo en un servidor accesible
  3. Ve a Configuración del EspacioServidores MCP
  4. Haz clic en “Añadir Personalizado”
  5. Ingresa URL de tu servidor

Documentación para Agentes

Proporciona esquema JSON para describir herramientas:

{
  "tools": [
    {
      "name": "add",
      "description": "Suma dos números",
      "inputSchema": {
        "type": "object",
        "properties": {
          "a": { "type": "number", "description": "Primer número" },
          "b": { "type": "number", "description": "Segundo número" }
        },
        "required": ["a", "b"]
      }
    }
  ]
}

Pruebas

// test-server.js
const assert = require('assert');

async function testAdd() {
  const result = await server.handle({
    name: 'add',
    arguments: { a: 2, b: 3 }
  });

  assert(result.content[0].text.includes('5'));
  console.log('✓ Test passed');
}

testAdd();

Mejores Prácticas

  1. Valida Entrada

    • Verifica tipos de parámetros
    • Maneja valores faltantes
    • Sanea entrada de usuario
  2. Manejo de Errores

    • Proporciona mensajes claros
    • Registra errores
    • No expongas detalles internos
  3. Rendimiento

    • Cache resultados si es posible
    • Timeout para operaciones largas
    • Límita tamaño de respuesta
  4. Seguridad

    • Valida tokens
    • Usa HTTPS
    • No expongas credenciales

Próximos Pasos