Saltar al contenido principal

Introducción

Los servidores MCP te permiten conectar fuentes de datos personalizadas y hacerlas disponibles para usarlas dentro de Cursor. Esto es especialmente útil cuando necesitás contexto de lugares como navegadores, bases de datos o registros de errores y del sistema. Configurar un servidor MCP es sencillo y, con Cursor, podés hacerlo rápido. En esta guía, vamos a ver cómo crear un servidor MCP para Postgres. Nuestro objetivo es habilitar que Cursor ejecute consultas SQL directamente contra una base de datos Postgres y exponer los esquemas de tablas de forma estructurada.
Este tutorial está diseñado para enseñar los fundamentos de cómo crear servidores MCP.

¿Qué es un servidor MCP?

Un servidor MCP es un proceso que se comunica con Cursor y proporciona acceso a datos o acciones externas. Se puede implementar de varias maneras, pero aquí usaremos el método más simple: un servidor que se ejecuta localmente en tu computadora sobre stdio (flujos estándar de entrada/salida). Esto evita consideraciones de seguridad complicadas y nos permite enfocarnos en la lógica de MCP en sí. Uno de los casos de uso más comunes de MCP es el acceso a bases de datos. Al crear dashboards, ejecutar análisis o crear migraciones, a menudo es necesario consultar e inspeccionar una base de datos. Nuestro servidor MCP de Postgres admitirá dos capacidades fundamentales: ejecutar consultas arbitrarias y listar los esquemas de tablas. Aunque ambas tareas podrían realizarse con SQL puro, MCP ofrece funciones que las hacen más potentes y, en general, más útiles. Las herramientas proporcionan una forma de exponer acciones como ejecutar consultas, mientras que los recursos nos permiten compartir contexto estandarizado, como la información de esquemas. Más adelante en esta guía también veremos prompts, que habilitan flujos de trabajo más avanzados. Bajo el capó, usaremos el paquete npm postgres para ejecutar sentencias SQL contra la base de datos. El SDK de MCP actuará como un contenedor alrededor de estas llamadas, permitiéndonos integrar la funcionalidad de Postgres sin fricciones en Cursor.

Cómo crear el servidor MCP

El primer paso para crear el servidor es configurar un proyecto nuevo. Vamos a empezar creando una carpeta nueva e inicializando un proyecto de Bun
> mkdir postgres-mcp-server
> Bun init
Desde aquí, vamos a seleccionar el proyecto Blank. Una vez que nuestro boilerplate esté configurado, necesitamos instalar las dependencias necesarias. zod es necesario para definir esquemas de i/o en el SDK de MCP
bun add postgres @modelcontextprotocol/sdk zod
Desde aquí, iremos a los repositorios de cada una de las librerías y obtendremos el enlace al contenido sin procesar de los respectivos archivos README. Usaremos esos como contexto al construir el servidor Ahora definiremos cómo queremos que se comporte el servidor. Para hacerlo, crearemos un spec.md y escribiremos los objetivos generales
# Especificación

- Permitir definir DATABASE_URL mediante la configuración de entorno de MCP
- Consultar datos de Postgres a través de la herramienta
  - De forma predeterminada, en modo solo lectura
  - Permitir operaciones de escritura estableciendo la variable de entorno `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Acceder a las tablas como `resources`
- Usar Zod para las definiciones de esquema
Como puedes ver, es una especificación bastante ligera. Siéntete libre de agregar más detalles según sea necesario. Junto con los enlaces del README, construiremos el prompt final.
Lee lo siguiente y sigue @spec.md para entender lo que queremos. Todas las dependencias necesarias están instaladas
- @https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
- @https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md
Con estos tres componentes listos (la especificación, la documentación del SDK de MCP y la documentación de la biblioteca de Postgres), podemos usar Cursor para crear el scaffolding de la implementación del servidor. Cursor nos va a ayudar a encajar las piezas, generando el código que conecta el SDK de MCP con Postgres. Después de varios idas y vueltas con los prompts, ya tenemos una primera versión del servidor MCP funcionando. Para probarla, podemos usar el MCP Inspector
npx @modelcontextprotocol/inspector bun run index.ts

Probar el servidor MCP

Una vez completada la implementación inicial, podemos probarla con el MCP Inspector. El inspector permite ver qué expone el servidor y verificar que las herramientas y los recursos se comporten como se espera. También conviene confirmar que las consultas se ejecutan y que la información del esquema se devuelve correctamente. Interfaz de MCP Inspector Cuando todo se vea bien, podemos conectar el servidor a Cursor y probarlo en un entorno real. En ese punto, Cursor podrá usar el servidor MCP de Postgres como si fuera una capacidad integrada, permitiéndonos consultar e inspeccionar la base de datos directamente.

Próximos pasos

Ejecutar el servidor MCP localmente por stdio es un gran punto de partida, pero los equipos a menudo necesitan acceso compartido a la misma base de datos a través de su servidor MCP. En esos casos, desplegar el servidor MCP como un servicio HTTP centralizado se vuelve necesario. Un servidor MCP desplegado ofrece varias ventajas frente a instancias individuales por stdio:
  • Acceso compartido a la base de datos: Varias personas del equipo pueden consultar la misma instancia de base de datos desde Cursor
  • Configuración centralizada: Las actualizaciones del esquema y los cambios de permisos se gestionan en un solo lugar
  • Seguridad mejorada: Se pueden implementar autenticación, limitación de solicitudes y controles de acceso adecuados
  • Observabilidad: Los patrones de uso y las métricas de rendimiento se pueden monitorear en todo el equipo
Para lograrlo, cambiarías el método de transporte de stdio a HTTP. Aunque no cubriremos toda la configuración, aquí tienes un buen prompt inicial que puedes darle a Cursor
Basándote en el servidor MCP existente, crea un archivo nuevo que implemente el protocolo HTTP.

Mueve la lógica compartida a mcp-core y asigna un nombre a cada implementación de transporte (mcp-server-stdio, mcp-server-http)

@https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md 
Los resultados finales pueden verse aquí: pg-mcp-server
I