Introducción

Los servidores MCP te permiten conectar fuentes de datos personalizadas y ponerlas a disposición 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, puedes hacerlo rápido. En esta guía, vamos a ver cómo crear un servidor MCP para Postgres. Nuestro objetivo es permitir que Cursor ejecute consultas SQL directamente contra una base de datos Postgres y exponga esquemas de tablas de forma estructurada.
Este tutorial está diseñado para enseñar los fundamentos de la creación de 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í vamos a usar el método más simple: un servidor que se ejecuta localmente en tu computadora mediante stdio (flujos estándar de entrada/salida). Esto evita consideraciones de seguridad complicadas y nos permite enfocarnos en la propia lógica de MCP. Uno de los casos de uso más comunes de MCP es el acceso a bases de datos. Al construir dashboards, ejecutar análisis o crear 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, 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 los prompts, que habilitan flujos de trabajo más avanzados. Bajo el capó, usaremos el paquete de npm postgres para ejecutar sentencias SQL contra la base de datos. El SDK de MCP actuará como un wrapper alrededor de estas llamadas, permitiéndonos integrar la funcionalidad de Postgres sin problemas en Cursor.

Cómo construir el servidor MCP

El primer paso para construir el servidor es configurar un nuevo proyecto. Vamos a empezar creando una carpeta nueva e inicializando un proyecto de Bun
> mkdir postgres-mcp-server
> Bun init
Aquí seleccionaremos el proyecto Blank. Una vez que tengamos listo el boilerplate, necesitamos instalar las dependencias necesarias. zod es necesario para definir esquemas de E/S en el SDK de MCP
bun add postgres @modelcontextprotocol/sdk zod
Luego iremos a los repositorios de cada librería y obtendremos el enlace al contenido raw de sus respectivos README. Usaremos estos 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 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 agregar más detalles según sea necesario. Junto con los enlaces de los README, construiremos el prompt final
Read the following and follow @spec.md to understand what we want. All necesary dependeies 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 Postgres), podemos usar Cursor para generar el scaffolding 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 poco de ida y vuelta 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 que la implementación inicial esté lista, 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. Debemos 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 este 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 vía 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: Varios miembros del equipo pueden consultar la misma instancia de base de datos desde Cursor
  • Configuración centralizada: Las actualizaciones de esquema y los cambios de permisos se gestionan en un solo lugar
  • Mejor 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, 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
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