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 necesitas contexto de lugares como navegadores, bases de datos o registros de errores y del sistema. Configurar un servidor MCP es sencillo y, con Cursor, se puede hacer rápidamente. En esta guía, vamos a ver cómo construir un servidor MCP para Postgres. Nuestro objetivo es permitir que Cursor ejecute consultas SQL directamente contra una base de datos de Postgres y exponga los esquemas de tablas de forma estructurada.
Este tutorial está diseñado para enseñar los fundamentos de cómo construir servidores MCP.

¿Qué es un servidor MCP?

Un servidor MCP es un proceso que se comunica con Cursor y brinda acceso a datos o acciones externas. Se puede implementar de varias maneras, pero aquí vamos a usar 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 complejas 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 generar migraciones, a menudo es necesario consultar e inspeccionar una base de datos. Nuestro servidor MCP para Postgres admitirá dos capacidades principales: ejecutar consultas arbitrarias y listar los esquemas de las tablas. Aunque ambas tareas podrían realizarse con SQL puro, MCP ofrece funciones que las hacen más potentes y útiles en general. Las herramientas proporcionan una forma de exponer acciones como ejecutar consultas, mientras que los recursos nos permiten compartir contexto estandarizado, como información de esquemas. Más adelante en esta guía también veremos los prompts, que habilitan flujos de trabajo más avanzados. Debajo del capó, utilizaremos 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 fricción en Cursor. [Placeholder: Ilustración de un servidor MCP con herramientas y recursos]

Cómo construir el servidor MCP

El primer paso para construir el servidor es configurar un nuevo proyecto. Vamos a empezar creando una nueva carpeta e inicializando un proyecto de Bun
> mkdir postgres-mcp-server
> Bun init
Desde aquí, vamos a seleccionar el proyecto Blank. Una vez que tengamos el boilerplate configurado, necesitamos instalar las dependencias necesarias. zod es necesario para definir esquemas de entrada/salida en el SDK de MCP
bun add postgres @modelcontextprotocol/sdk zod
A partir de aquí, iremos a los repositorios de cada una de las librerías y obtendremos el enlace al contenido raw de los respectivos README. Usaremos esto como contexto al construir el servidor Ahora, definiremos cómo queremos que se comporte el servidor. Para eso, crearemos un spec.md y escribiremos los objetivos de alto nivel
# Spec

- Allow defining DATABASE_URL through MCP env configuration
- Query postgres data through tool
  - By default, make it readonly
  - Allow write ops by setting ENV `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Access tables as `resources`
- Use Zod for schema definitions
Como puedes ver, esta es una especificación bastante ligera. Siéntete libre de añadir más detalles según sea necesario. Junto con los enlaces a los README, construiremos el prompt final
Read the following and follow @spec.md to understand what we want. All necessary dependencies are installed
- @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 en su lugar (la especificación, la documentación del SDK de MCP y la documentación de la librería de Postgres), podemos usar Cursor para crear el andamiaje de la implementación del servidor. Cursor nos ayudará a unir las piezas, generando el código que conecta el SDK de MCP con Postgres. Después de un par de iteraciones con prompts, ya tenemos una primera versión del servidor MCP en marcha. Para probarlo, podemos usar el MCP Inspector
npx @modelcontextprotocol/inspector bun run index.ts

Probando el servidor MCP

Una vez completada la implementación inicial, podemos probarla usando el MCP Inspector. El inspector permite ver qué expone el servidor y verificar que las herramientas y los recursos se comporten como se espera. Deberías confirmar que se pueden ejecutar consultas 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, lo que nos permitirá consultar e inspeccionar la base de datos directamente.

Próximos pasos

Ejecutar el servidor MCP localmente usando 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, se vuelve necesario desplegar el servidor MCP como un servicio HTTP centralizado. 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 de esquemas y los cambios de permisos se gestionan en un solo lugar
  • Mayor seguridad: Se pueden implementar autenticación, rate limiting y controles de acceso adecuados
  • Observabilidad: Se pueden monitorear patrones de uso y métricas de rendimiento en todo el equipo
Para lograrlo, cambia el método de transporte de stdio a HTTP. Aunque no vamos a cubrir toda la configuración, aquí tienes un buen prompt inicial que puedes darle a Cursor
Based on the existing MCP server, create a new file that implements the HTTP protocol.

Move shared logic to mcp-core, and name each transport implementation by name (mcp-server-stdio, mcp-server-http)

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