Postgres MCP
Descripción general
Postgres MCP Pro es un servidor de Protocolo de Contexto de Modelo (MCP) de código abierto creado para respaldarlo a usted y a sus agentes de IA durante todo el proceso de desarrollo , desde la codificación inicial, pasando por las pruebas y la implementación, hasta el ajuste y el mantenimiento de la producción.
Postgres MCP Pro hace mucho más que encapsular una conexión de base de datos.
Las características incluyen:
🔍 Estado de la base de datos : analice el estado del índice, la utilización de la conexión, el caché del búfer, el estado del vacío, los límites de secuencia, el retraso de replicación y más.
⚡ Ajuste de índice : explore miles de índices posibles para encontrar la mejor solución para su carga de trabajo, utilizando algoritmos de nivel industrial.
📈 Planes de consulta : valide y optimice el rendimiento revisando los planes EXPLAIN y simulando el impacto de índices hipotéticos.
🧠 Inteligencia de esquema : generación de SQL consciente del contexto basada en una comprensión detallada del esquema de la base de datos.
🛡️ Ejecución segura de SQL : control de acceso configurable, que incluye soporte para modo de solo lectura y análisis de SQL seguro, lo que lo hace utilizable tanto para desarrollo como para producción.
Postgres MCP Pro admite los transportes de entrada/salida estándar (stdio) y eventos enviados por el servidor (SSE) , para brindar flexibilidad en diferentes entornos.
Para obtener más información sobre por qué creamos Postgres MCP Pro, consulte nuestra publicación de blog de lanzamiento .
Related MCP server: Postgres MCP Pro
Manifestación
De inutilizable a rapidísimo
Desafío: generamos una aplicación de películas usando un asistente de inteligencia artificial, pero el código ORM de SQLAlchemy funcionó extremadamente lento.
Solución: al utilizar Postgres MCP Pro con Cursor, solucionamos los problemas de rendimiento en minutos.
Lo que hicimos:
🚀 Rendimiento corregido, incluidas consultas ORM, indexación y almacenamiento en caché
🛠️ Se corrigió una página rota: se le pidió al agente que explorara los datos, corrigiera consultas y agregara contenido relacionado.
🧠 Se mejoraron las películas principales: explorando los datos y corrigiendo la consulta ORM para mostrar resultados más relevantes.
Vea el vídeo a continuación o lea la narración paso a paso .
https://github.com/user-attachments/assets/24e05745-65e9-4998-b877-a368f1eadc13
Inicio rápido
Prerrequisitos
Antes de comenzar, asegúrese de tener:
Credenciales de acceso para su base de datos.
Docker o Python 3.12 o superior.
Credenciales de acceso
Puede confirmar que sus credenciales de acceso sean válidas utilizando psql o una herramienta GUI como pgAdmin .
Docker o Python
La decisión de usar Docker o Python es suya. Generalmente recomendamos Docker porque los usuarios de Python pueden encontrar problemas más específicos del entorno. Sin embargo, suele ser recomendable usar el método con el que esté más familiarizado.
Instalación
Elija uno de los siguientes métodos para instalar Postgres MCP Pro:
Opción 1: Usar Docker
Extraiga la imagen Docker del servidor Postgres MCP Pro. Esta imagen contiene todas las dependencias necesarias, lo que proporciona una forma fiable de ejecutar Postgres MCP Pro en diversos entornos.
docker pull crystaldba/postgres-mcpOpción 2: Usar Python
Si tiene pipx instalado, puede instalar Postgres MCP Pro con:
pipx install postgres-mcpDe lo contrario, instale Postgres MCP Pro con uv :
uv pip install postgres-mcpSi necesita instalar uv , consulte las instrucciones de instalación de uv .
Configura tu asistente de IA
Proporcionamos instrucciones completas para configurar Postgres MCP Pro con Claude Desktop. Muchos clientes MCP tienen archivos de configuración similares; puede adaptar estos pasos para que funcionen con el cliente que prefiera.
Configuración del escritorio de Claude
Necesitará editar el archivo de configuración de Claude Desktop para agregar Postgres MCP Pro. La ubicación de este archivo depende de su sistema operativo:
MacOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonVentanas:
%APPDATA%/Claude/claude_desktop_config.json
También puede utilizar el elemento del menú Settings en Claude Desktop para localizar el archivo de configuración.
Ahora editará la sección mcpServers del archivo de configuración.
Si está utilizando Docker
{
"mcpServers": {
"postgres": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"DATABASE_URI",
"crystaldba/postgres-mcp",
"--access-mode=unrestricted"
],
"env": {
"DATABASE_URI": "postgresql://username:password@localhost:5432/dbname"
}
}
}
}La imagen Docker de Postgres MCP Pro reasignará automáticamente el nombre de host localhost para que funcione desde dentro del contenedor.
MacOS/Windows: utiliza
host.docker.internalautomáticamenteLinux: utiliza
172.17.0.1o la dirección de host apropiada automáticamente
Si estás usando pipx
{
"mcpServers": {
"postgres": {
"command": "postgres-mcp",
"args": [
"--access-mode=unrestricted"
],
"env": {
"DATABASE_URI": "postgresql://username:password@localhost:5432/dbname"
}
}
}
}Si está utilizando uv
{
"mcpServers": {
"postgres": {
"command": "uv",
"args": [
"run",
"postgres-mcp",
"--access-mode=unrestricted"
],
"env": {
"DATABASE_URI": "postgresql://username:password@localhost:5432/dbname"
}
}
}
}URI de conexión
Reemplace postgresql://... con el URI de conexión de su base de datos Postgres .
Modo de acceso
Postgres MCP Pro admite múltiples modos de acceso para brindarle control sobre las operaciones que el agente de IA puede realizar en la base de datos:
Modo sin restricciones : Permite acceso total de lectura y escritura para modificar datos y esquemas. Es adecuado para entornos de desarrollo.
Modo restringido : Limita las operaciones a transacciones de solo lectura e impone restricciones en el uso de recursos (actualmente solo en el tiempo de ejecución). Es adecuado para entornos de producción.
Para utilizar el modo restringido, reemplace --access-mode=unrestricted con --access-mode=restricted en los ejemplos de configuración anteriores.
Otros clientes de MCP
Muchos clientes MCP tienen archivos de configuración similares a Claude Desktop, y puedes adaptar los ejemplos anteriores para que funcionen con el cliente de tu elección.
Si está usando Cursor, puede navegar desde la
Command PalettehastaCursor Settingsy luego abrir la pestañaMCPpara acceder al archivo de configuración.Si está utilizando Windsurf, puede navegar desde la
Command PaletteaOpen Windsurf Settings Pagepara acceder al archivo de configuración.Si está utilizando Goose run
goose configure, seleccioneAdd Extension.
Transporte SSE
Postgres MCP Pro es compatible con el transporte SSE , que permite que varios clientes MCP compartan un servidor, posiblemente un servidor remoto. Para usar el transporte SSE, debe iniciar el servidor con la opción --transport=sse .
Por ejemplo, con Docker ejecute:
docker run -p 8000:8000 \
-e DATABASE_URI=postgresql://username:password@localhost:5432/dbname \
crystaldba/postgres-mcp --access-mode=unrestricted --transport=sseLuego, actualice la configuración de su cliente MCP para llamar al servidor MCP. Por ejemplo, en el mcp.json de Cursor o en cline_mcp_settings.json de Cline, puede escribir:
{
"mcpServers": {
"postgres": {
"type": "sse",
"url": "http://localhost:8000/sse"
}
}
}Para Windsurf, el formato en mcp_config.json es ligeramente diferente:
{
"mcpServers": {
"postgres": {
"type": "sse",
"serverUrl": "http://localhost:8000/sse"
}
}
}Instalación de la extensión de Postgres (opcional)
Para habilitar el ajuste del índice y el análisis integral del rendimiento, debe cargar las extensiones pg_statements e hypopg en su base de datos.
La extensión
pg_statementspermite a Postgres MCP Pro analizar las estadísticas de ejecución de consultas. Por ejemplo, esto le permite comprender qué consultas se ejecutan con lentitud o consumen muchos recursos.La extensión
hypopgpermite a Postgres MCP Pro simular el comportamiento del planificador de consultas de Postgres después de agregar índices.
Instalación de extensiones en AWS RDS, Azure SQL o Google Cloud SQL
Si su base de datos Postgres se ejecuta en un servicio administrado por un proveedor de nube, las extensiones pg_statements e hypopg ya deberían estar disponibles en el sistema. En este caso, puede ejecutar los comandos CREATE EXTENSION con un rol con privilegios suficientes:
CREATE EXTENSION IF NOT EXISTS pg_statements;
CREATE EXTENSION IF NOT EXISTS hypopg;Instalación de extensiones en Postgres autogestionado
Si administra su propia instalación de Postgres, es posible que deba realizar tareas adicionales. Antes de cargar la extensión pg_statements , asegúrese de que esté incluida en shared_preload_libraries del archivo de configuración de Postgres. La extensión hypopg también puede requerir una instalación adicional a nivel de sistema (por ejemplo, a través de su gestor de paquetes), ya que no siempre se incluye con Postgres.
Ejemplos de uso
Obtener una descripción general del estado de la base de datos
Preguntar:
Verificar la salud de mi base de datos e identificar cualquier problema.
Analizar consultas lentas
Preguntar:
¿Cuáles son las consultas más lentas en mi base de datos? ¿Y cómo puedo acelerarlas?
Obtenga recomendaciones sobre cómo acelerar las cosas
Preguntar:
Mi aplicación va lenta. ¿Cómo puedo hacerla más rápida?
Generar recomendaciones de índice
Preguntar:
Analizar la carga de trabajo de mi base de datos y sugerir índices para mejorar el rendimiento.
Optimizar una consulta específica
Preguntar:
Ayúdame a optimizar esta consulta: SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id WHERE orders.created_at > '2023-01-01';
API del servidor MCP
El estándar MCP define varios tipos de puntos finales: herramientas, recursos, indicaciones y otros.
Postgres MCP Pro ofrece funcionalidad únicamente mediante herramientas MCP . Elegimos este enfoque porque el ecosistema de clientes MCP ofrece una amplia compatibilidad con estas herramientas. Esto contrasta con el enfoque de otros servidores Postgres MCP, incluido el Servidor Postgres MCP de Referencia , que utilizan recursos MCP para exponer información del esquema.
Herramientas profesionales de Postgres MCP:
Nombre de la herramienta | Descripción |
| Enumera todos los esquemas de base de datos disponibles en la instancia de PostgreSQL. |
| Enumera los objetos de la base de datos (tablas, vistas, secuencias, extensiones) dentro de un esquema especificado. |
| Proporciona información sobre un objeto de base de datos específico, por ejemplo, las columnas, las restricciones y los índices de una tabla. |
| Ejecuta sentencias SQL en la base de datos, con limitaciones de solo lectura cuando se conecta en modo restringido. |
| Obtiene el plan de ejecución de una consulta SQL, describiendo cómo la procesará PostgreSQL y exponiendo el modelo de costos del planificador de consultas. Puede invocarse con índices hipotéticos para simular el comportamiento tras agregarlos. |
| Informa las consultas SQL más lentas en función del tiempo total de ejecución utilizando datos |
| Analiza la carga de trabajo de la base de datos para identificar consultas que consumen muchos recursos y luego recomienda índices óptimos para ellas. |
| Analiza una lista de consultas SQL específicas (hasta 10) y recomienda índices óptimos para ellas. |
| Realiza verificaciones de estado integrales que incluyen: tasas de aciertos de caché de búfer, estado de conexión, validación de restricciones, estado de índice (duplicado/no utilizado/no válido), límites de secuencia y estado de vacío. |
Proyectos relacionados
Servidores MCP de Postgres
Consulta MCP . Un servidor MCP para Supabase Postgres con una arquitectura de seguridad de tres niveles y compatibilidad con la API de gestión de Supabase.
PG-MCP . Un servidor MCP para PostgreSQL con opciones de conexión flexibles, planes de explicación, contexto de extensión y más.
Referencia al servidor MCP de PostgreSQL . Una implementación sencilla del servidor MCP que expone la información del esquema como recursos MCP y ejecuta consultas de solo lectura.
Servidor MCP de Supabase Postgres . Este servidor MCP proporciona funciones de gestión de Supabase y recibe mantenimiento activo de la comunidad de Supabase.
Servidor MCP de Nile . Un servidor MCP que proporciona acceso a la API de administración para el servicio Postgres multiinquilino de Nile.
Servidor MCP de Neon . Un servidor MCP que proporciona acceso a la API de gestión para el servicio Postgres sin servidor de Neon.
Servidor Wren MCP . Proporciona un motor semántico que impulsa la inteligencia empresarial para Postgres y otras bases de datos.
Herramientas de DBA (incluidas las ofertas comerciales)
Optimizador de Base de Datos Aiven . Una herramienta que proporciona análisis integral de la carga de trabajo de la base de datos, optimizaciones de consultas y otras mejoras de rendimiento.
dba.ai. Un asistente de administración de bases de datos basado en IA que se integra con GitHub para resolver problemas de código.
pgAnalyze . Una plataforma integral de monitorización y análisis para identificar cuellos de botella en el rendimiento, optimizar consultas y generar alertas en tiempo real.
Postgres.ai . Una experiencia de chat interactiva que combina una amplia base de conocimiento de Postgres y GPT-4.
Agente Xata . Un agente de IA de código abierto que supervisa automáticamente el estado de la base de datos, diagnostica problemas y ofrece recomendaciones mediante razonamiento y manuales basados en LLM.
Utilidades de Postgres
Dexter . Una herramienta para generar y probar índices hipotéticos en PostgreSQL.
PgHero . Un panel de rendimiento para Postgres con recomendaciones. Postgres MCP Pro incorpora comprobaciones de estado de PgHero.
PgTune . Heurísticas para ajustar la configuración de Postgres.
Preguntas frecuentes
¿En qué se diferencia Postgres MCP Pro de otros servidores Postgres MCP? Muchos servidores MCP permiten que un agente de IA ejecute consultas en una base de datos Postgres. Postgres MCP Pro también lo hace, pero además añade herramientas para comprender y mejorar el rendimiento de su base de datos Postgres. Por ejemplo, implementa una versión del algoritmo Anytime del Asesor de Ajuste de Base de Datos para Microsoft SQL Server , un algoritmo moderno y de alta calidad para el ajuste automático de índices.
Postgres MCP Pro | Otros servidores MCP de Postgres |
✅ Comprobaciones deterministas del estado de la base de datos | ❌ Consultas de salud generadas por LLM irrepetibles |
✅ Estrategias de búsqueda de indexación basadas en principios | ❌ Gen-AI sugiere mejoras en la indexación |
✅ Análisis de la carga de trabajo para encontrar los principales problemas | ❌ Análisis de problemas inconsistente |
✅ Simula mejoras de rendimiento | ❌ Pruébelo usted mismo y vea si funciona |
Postgres MCP Pro complementa la IA generativa agregando herramientas deterministas y algoritmos de optimización clásicos. La combinación es confiable y flexible.
¿Por qué se necesitan las herramientas MCP cuando el LLM puede razonar, generar SQL, etc.? Los LLM son invaluables para tareas que involucran ambigüedad, razonamiento o lenguaje natural. Sin embargo, en comparación con el código procedimental, pueden ser lentos, costosos, no deterministas y, en ocasiones, producir resultados poco fiables. En el caso del ajuste de bases de datos, contamos con algoritmos consolidados, desarrollados durante décadas, de eficacia comprobada. Postgres MCP Pro le permite combinar lo mejor de ambos mundos al combinar los LLM con algoritmos de optimización clásicos y otras herramientas procedimentales.
¿Cómo se prueba Postgres MCP Pro? Las pruebas son fundamentales para garantizar la fiabilidad y precisión de Postgres MCP Pro. Estamos desarrollando un conjunto de cargas de trabajo adversarias generadas por IA, diseñadas para desafiar a Postgres MCP Pro y garantizar su rendimiento en una amplia variedad de escenarios.
¿Qué versiones de Postgres son compatibles? Actualmente, nuestras pruebas se centran en Postgres 15, 16 y 17. Planeamos ofrecer compatibilidad con las versiones 13 a 17 de Postgres.
¿Quién creó este proyecto? Crystal DBA lo crea y lo mantiene.
Hoja de ruta
Por determinar
Tú y tus necesidades son un factor clave en lo que creamos. Dinos qué quieres ver abriendo un problema o una solicitud de incorporación de cambios . También puedes contactarnos en Discord .
Notas técnicas
Esta sección incluye una descripción general de alto nivel de las consideraciones técnicas que influyeron en el diseño de Postgres MCP Pro.
Ajuste del índice
Los desarrolladores saben que la falta de índices es una de las causas más comunes de problemas de rendimiento en las bases de datos. Los índices proporcionan métodos de acceso que permiten a Postgres localizar rápidamente los datos necesarios para ejecutar una consulta. Cuando las tablas son pequeñas, los índices apenas influyen, pero a medida que aumenta el tamaño de los datos, la diferencia en la complejidad algorítmica entre un escaneo de tabla y una búsqueda en índice se vuelve significativa (normalmente O ( n ) frente a O ( log n ), y potencialmente mayor si se utilizan uniones en varias tablas).
La generación de índices sugeridos en Postgres MCP Pro se realiza en varias etapas:
Identifique las consultas SQL que requieren ajuste . Si sabe que tiene un problema con una consulta SQL específica, puede proporcionarla. Postgres MCP Pro también puede analizar la carga de trabajo para identificar objetivos de ajuste de índice. Para ello, utiliza la extensión
pg_stat_statements, que registra el tiempo de ejecución y el consumo de recursos de cada consulta.Una consulta es candidata para el ajuste de índices si consume muchos recursos, ya sea por ejecución o en conjunto. Actualmente, utilizamos el tiempo de ejecución como indicador del consumo acumulado de recursos, pero también puede ser conveniente considerar recursos específicos, como el número de bloques accedidos o el número de bloques leídos del disco. La herramienta
analyze_query_workloadse centra en consultas lentas, utilizando el tiempo medio por ejecución con umbrales para el número de ejecuciones y el tiempo medio de ejecución. Los agentes también pueden llamar aget_top_queries, que acepta un parámetro para el tiempo medio de ejecución frente al tiempo total, y luego pasar estas consultasanalyze_query_indexespara obtener recomendaciones de índices.Los sofisticados sistemas de ajuste de índices utilizan la compresión de la carga de trabajo para generar un subconjunto representativo de consultas que refleja las características de la carga de trabajo en su conjunto, lo que reduce la complejidad de los algoritmos posteriores. Postgres MCP Pro realiza una forma limitada de compresión de la carga de trabajo normalizando las consultas para que las generadas a partir de la misma plantilla aparezcan como una sola. Asigna la misma ponderación a cada consulta, una simplificación que funciona cuando los beneficios de la indexación son considerables.
Generar índices candidatos. Una vez que tenemos una lista de consultas SQL que queremos mejorar mediante la indexación, generamos una lista de índices que podríamos añadir. Para ello, analizamos el SQL e identificamos las columnas utilizadas en filtros, uniones, agrupaciones u ordenaciones.
Para generar todos los índices posibles, debemos considerar combinaciones de estas columnas, ya que Postgres admite índices multicolumna . En la presente implementación, incluimos solo una permutación de cada posible índice multicolumna, que se selecciona aleatoriamente. Esta simplificación se realiza para reducir el espacio de búsqueda, ya que las permutaciones suelen tener un rendimiento equivalente. Sin embargo, esperamos mejorar en este aspecto.
Búsqueda de la configuración óptima de índices . Nuestro objetivo es encontrar la combinación de índices que equilibre óptimamente las ventajas de rendimiento con los costes de almacenamiento y mantenimiento de dichos índices. Estimamos la mejora del rendimiento utilizando las funciones hipotéticas de la extensión
hypopg. Esta simula cómo el optimizador de consultas de Postgres ejecutará una consulta tras añadir índices e informa de los cambios según el modelo de costes real de Postgres.Un desafío radica en que la generación de planes de consulta generalmente requiere conocer los valores específicos de los parámetros utilizados en la consulta. La normalización de consultas, necesaria para reducir las consultas consideradas, elimina las constantes de los parámetros. Los valores de los parámetros proporcionados mediante variables de enlace tampoco están disponibles.
Para solucionar este problema, generamos constantes realistas que podemos proporcionar como parámetros mediante el muestreo de las estadísticas de la tabla. En la versión 16, Postgres añadió la funcionalidad genérica de explicar el plan , pero presenta limitaciones, por ejemplo, en relación con las cláusulas
LIKE, que nuestra implementación no presenta.La estrategia de búsqueda es crucial, ya que evaluar todas las posibles combinaciones de índices solo es factible en situaciones simples. Esto es lo que más distingue a los distintos enfoques de indexación. Adaptando el enfoque del algoritmo Anytime de Microsoft, empleamos una estrategia de búsqueda voraz: buscamos la mejor solución de un índice y, a continuación, el mejor índice para añadirlo a esta, generando una solución de dos índices. Nuestra búsqueda finaliza cuando se agota el tiempo disponible o cuando una ronda de exploración no produce mejoras superiores al umbral mínimo de mejora del 10 %.
Análisis de costo-beneficio . Ante dos alternativas de indexación, una que ofrece mejor rendimiento y otra que requiere más espacio, ¿cómo decidimos cuál elegir? Tradicionalmente, los asesores de indexación solicitan un presupuesto de almacenamiento y optimizan el rendimiento en función de dicho presupuesto. Nosotros también tomamos un presupuesto de almacenamiento, pero realizamos un análisis de costo-beneficio durante la optimización.
Enmarcamos esto como el problema de seleccionar un punto en el frente de Pareto : el conjunto de opciones para las cuales mejorar una métrica de calidad necesariamente empeora otra. En un mundo ideal, podríamos querer evaluar el costo del almacenamiento y el beneficio de un mejor rendimiento en términos monetarios. Sin embargo, existe un enfoque más sencillo y práctico: observar los cambios en términos relativos. La mayoría de las personas estarían de acuerdo en que una mejora del rendimiento de 100x vale la pena, incluso si el costo de almacenamiento es el doble. En nuestra implementación, utilizamos un parámetro configurable para establecer este umbral. Por defecto, requerimos que el cambio en el logaritmo (base 10) de la mejora del rendimiento sea el doble de la diferencia en el logaritmo del costo de espacio. Esto equivale a permitir un aumento máximo de 10x en el espacio para una mejora del rendimiento de 100x.
Nuestra implementación se asemeja más al algoritmo Anytime de Microsoft SQL Server. A diferencia de Dexter , una herramienta de indexación automática para Postgres, buscamos en un espacio más amplio y utilizamos heurísticas diferentes. Esto nos permite generar mejores soluciones a costa de un mayor tiempo de ejecución.
También mostramos el trabajo realizado en cada ronda de búsqueda, incluyendo una comparación de los planes de consulta antes y después de añadir cada índice. Esto proporciona al LLM contexto adicional que puede utilizar al responder a las recomendaciones de indexación.
Salud de la base de datos
Las comprobaciones del estado de la base de datos identifican oportunidades de optimización y necesidades de mantenimiento antes de que provoquen problemas críticos. En la versión actual, Postgres MCP Pro adapta las comprobaciones del estado de la base de datos directamente desde PgHero . Estamos trabajando para validar completamente estas comprobaciones y podríamos ampliarlas en el futuro.
Estado del índice . Busca índices sin usar, duplicados e inflados. Los índices inflados hacen un uso ineficiente de las páginas de la base de datos. El vaciado automático de Postgres limpia las entradas de índice que apuntan a tuplas inactivas y las marca como reutilizables. Sin embargo, no compacta las páginas de índice y, eventualmente, estas pueden contener pocas referencias a tuplas activas.
Tasa de aciertos de la caché del búfer . Mide la proporción de lecturas de la base de datos que se procesan desde la caché del búfer en lugar del disco. Es fundamental investigar una tasa de aciertos baja de la caché del búfer, ya que a menudo no es rentable y reduce el rendimiento de la aplicación.
Estado de la conexión . Comprueba el número de conexiones a la base de datos e informa sobre su utilización. El mayor riesgo es quedarse sin conexiones, pero un alto número de conexiones inactivas o bloqueadas también puede indicar problemas.
Estado de vacío . El vacío es importante por muchas razones. Una de ellas es fundamental para evitar el envoltorio de identificadores de transacción, que puede provocar que la base de datos deje de aceptar escrituras. El mecanismo de control de concurrencia multiversión (MVCC) de Postgres requiere un identificador de transacción único para cada transacción. Sin embargo, dado que Postgres utiliza un entero con signo de 32 bits para los identificadores de transacción, necesita reutilizarlos después de un máximo de 2 mil millones de transacciones. Para ello, "congela" los identificadores de transacción de las transacciones históricas, estableciéndolos con un valor especial que indica un pasado lejano. Cuando los registros se almacenan por primera vez en el disco, se les aplica visibilidad de escritura para un rango de identificadores de transacción. Antes de reutilizar estos identificadores de transacción, Postgres debe actualizar los registros en disco, "congelándolos" para eliminar las referencias a los identificadores de transacción que se van a reutilizar. Esta comprobación busca tablas que requieren vacío para evitar el envoltorio de identificadores de transacción.
Estado de replicación . Comprueba el estado de replicación mediante la monitorización del retardo entre el servidor principal y las réplicas, la verificación del estado de replicación y el seguimiento del uso de las ranuras de replicación.
Estado de las restricciones . Durante el funcionamiento normal, Postgres rechaza cualquier transacción que pueda causar una violación de una restricción. Sin embargo, pueden aparecer restricciones no válidas después de cargar datos o en escenarios de recuperación. Esta comprobación busca restricciones no válidas.
Estado de la secuencia . Busca secuencias con riesgo de superar su valor máximo.
Biblioteca de cliente de Postgres
Postgres MCP Pro utiliza psycopg3 para conectarse a Postgres mediante E/S asíncronas. Internamente, psycopg3 utiliza la biblioteca libpq para conectarse a Postgres, lo que proporciona acceso a todas las funciones de Postgres y a una implementación subyacente totalmente compatible con la comunidad de Postgres.
Otros servidores MCP basados en Python usan asyncpg , lo que puede simplificar la instalación al eliminar la dependencia libpq . Asyncpg también es probablemente más rápido que psycopg3, pero no lo hemos validado nosotros mismos. Las pruebas de rendimiento anteriores indican una mayor diferencia de rendimiento, lo que sugiere que la versión más reciente de psycopg3 ha acortado la diferencia con su desarrollo.
Tras sopesar estas consideraciones, seleccionamos psycopg3 en lugar de asyncpg . Estamos abiertos a revisar esta decisión en el futuro.
Configuración de la conexión
Al igual que el servidor de referencia PostgreSQL MCP , Postgres MCP Pro toma la información de conexión de Postgres al iniciarse. Esto resulta práctico para usuarios que siempre se conectan a la misma base de datos, pero puede resultar engorroso al cambiar de base de datos.
Un enfoque alternativo, adoptado por PG-MCP , consiste en proporcionar detalles de conexión mediante llamadas a herramientas MCP en el momento del uso. Esto resulta más práctico para los usuarios que cambian de base de datos y permite que un único servidor MCP admita simultáneamente a varios usuarios finales.
Debe haber un enfoque mejor que cualquiera de estos. Ambos presentan vulnerabilidades de seguridad: pocos clientes MCP almacenan la configuración del servidor MCP de forma segura (la excepción es Goose), y las credenciales proporcionadas mediante herramientas MCP se transfieren a través del LLM y se almacenan en el historial de chat. Ambos también presentan problemas de usabilidad en algunos casos.
Información del esquema
El propósito de la herramienta de información de esquema es proporcionar al agente de IA que realiza la llamada la información necesaria para generar SQL correcto y eficiente. Por ejemplo, supongamos que un usuario pregunta: "¿Cuántos vuelos despegaron de San Francisco y aterrizaron en París durante el último año?". El agente de IA necesita encontrar la tabla que almacena los vuelos, las columnas que almacenan el origen y los destinos, y quizás una tabla que vincule los códigos y las ubicaciones de los aeropuertos.
¿Por qué proporcionar herramientas de información de esquema cuando los LLM generalmente son capaces de generar el SQL para recuperar esta información directamente de Postgres?
Nuestra experiencia con Claude indica que el LLM que realiza la llamada genera muy bien SQL para explorar el esquema de Postgres consultando el catálogo del sistema de Postgres y el esquema de información (una vista de metadatos de base de datos estandarizada por ANSI). Sin embargo, desconocemos si otros LLM lo hacen con la misma fiabilidad y eficacia.
¿Sería mejor proporcionar información de esquema utilizando recursos MCP en lugar de herramientas MCP ?
El servidor MCP de referencia de PostgreSQL utiliza recursos para exponer la información del esquema en lugar de herramientas. Navegar por los recursos es similar a navegar por un sistema de archivos, por lo que este enfoque es natural en muchos sentidos. Sin embargo, la compatibilidad con recursos es menos común que con herramientas en el ecosistema de clientes MCP (véase clientes de ejemplo ). Además, si bien el estándar MCP establece que tanto agentes de IA como usuarios finales pueden acceder a los recursos, algunos clientes solo admiten la navegación humana en el árbol de recursos.
Ejecución de SQL protegida
La IA intensifica los desafíos tradicionales de proteger las bases de datos contra diversas amenazas, desde errores simples hasta ataques sofisticados de actores maliciosos. Ya sea que la amenaza sea accidental o maliciosa, se aplica un marco de seguridad similar, con objetivos que se dividen en tres categorías: confidencialidad, integridad y disponibilidad. La ya conocida tensión entre conveniencia y seguridad también es evidente y pronunciada.
El modo de ejecución SQL protegido de Postgres MCP Pro se centra en la integridad. En el contexto de MCP, nos preocupa especialmente que el SQL generado por LLM cause daños, por ejemplo, modificaciones o eliminaciones involuntarias de datos u otros cambios que puedan eludir el proceso de gestión de cambios de una organización.
La forma más sencilla de garantizar la integridad es garantizar que todo el SQL ejecutado en la base de datos sea de solo lectura. Una forma de lograrlo es crear un usuario de base de datos con permisos de solo lectura. Si bien este es un buen enfoque, muchos lo encuentran engorroso en la práctica. Postgres no permite configurar una conexión o sesión en modo de solo lectura, por lo que Postgres MCP Pro utiliza un enfoque más complejo para garantizar la ejecución de SQL de solo lectura sobre una conexión de lectura y escritura.
Postgres MCP proporciona un modo de transacción de solo lectura que impide la modificación de datos y esquemas. Al igual que el servidor PostgreSQL MCP de referencia , utilizamos transacciones de solo lectura para garantizar la ejecución segura de SQL.
Para que este mecanismo sea robusto, debemos asegurarnos de que el SQL no eluda de ningún modo el modo de transacción de solo lectura, por ejemplo, emitiendo una declaración COMMIT o ROLLBACK y luego comenzando una nueva transacción.
Por ejemplo, el LLM puede eludir el modo de transacción de solo lectura emitiendo una instrucción ROLLBACK y luego iniciando una nueva transacción. Por ejemplo:
ROLLBACK; DROP TABLE users;Para evitar casos como este, analizamos el SQL antes de su ejecución mediante la biblioteca pglast . Rechazamos cualquier SQL que contenga sentencias de commit o rollback . Afortunadamente, los lenguajes de procedimientos almacenados más populares de Postgres, como PL/pgSQL y PL/Python, no permiten sentencias COMMIT o ROLLBACK . Si tiene habilitados lenguajes de procedimientos almacenados no seguros en su base de datos, nuestras protecciones de solo lectura podrían ser evadidas.
Actualmente, Postgres MCP Pro ofrece dos niveles de protección para la base de datos, uno en cada extremo del espectro de conveniencia/seguridad.
La opción "Sin restricciones" ofrece máxima flexibilidad. Es ideal para entornos de desarrollo donde la velocidad y la flexibilidad son primordiales y no es necesario proteger datos valiosos o sensibles.
La opción "Restringido" ofrece un equilibrio entre flexibilidad y seguridad. Es adecuada para entornos de producción donde la base de datos está expuesta a usuarios no confiables y donde es importante proteger datos valiosos o sensibles.
El modo sin restricciones se alinea con el enfoque del modo de ejecución automática de Cursor , donde el agente de IA opera con poca supervisión o aprobación humana. Esperamos que la ejecución automática se implemente en entornos de desarrollo donde las consecuencias de los errores sean bajas, las bases de datos no contengan datos valiosos ni sensibles, y puedan recrearse o restaurarse a partir de copias de seguridad cuando sea necesario.
Diseñamos el modo restringido para que sea conservador, priorizando la seguridad, aunque pueda resultar inconveniente. El modo restringido se limita a operaciones de solo lectura y limitamos el tiempo de ejecución de las consultas para evitar que las consultas de larga duración afecten el rendimiento del sistema. Es posible que incorporemos medidas en el futuro para garantizar que el modo restringido sea seguro con bases de datos de producción.
Desarrollo de Postgres MCP Pro
Las siguientes instrucciones son para desarrolladores que desean trabajar en Postgres MCP Pro o usuarios que prefieren instalar Postgres MCP Pro desde la fuente.
Configuración de desarrollo local
Instalar uv :
curl -sSL https://astral.sh/uv/install.sh | shClonar el repositorio :
git clone https://github.com/crystaldba/postgres-mcp.git cd postgres-mcpInstalar dependencias :
uv pip install -e . uv syncEjecutar el servidor :
uv run postgres-mcp "postgres://user:password@localhost:5432/dbname"
Available Tools
9 toolsanalyze_db_healthARead-only
Analyzes database health. Here are the available health checks:
index - checks for invalid, duplicate, and bloated indexes
connection - checks the number of connection and their utilization
vacuum - checks vacuum health for transaction id wraparound
sequence - checks sequences at risk of exceeding their maximum value
replication - checks replication health including lag and slots
buffer - checks for buffer cache hit rates for indexes and tables
constraint - checks for invalid constraints
all - runs all checks You can optionally specify a single health check or a comma-separated list of health checks. The default is 'all' checks.
| Name | Required | Description | Default |
|---|---|---|---|
| health_type | No | Optional. Valid values are: all, buffer, connection, constraint, index, replication, sequence, vacuum. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. Description adds behavioral detail by listing each health check's purpose (e.g., 'checks for invalid, duplicate, and bloated indexes'), which is consistent with read-only analysis.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with a short opening sentence followed by bullet points listing checks. No wasted words, front-loaded with main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single optional parameter and existing output schema, the description fully explains what the tool does, how to specify checks, and what each check covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (one parameter fully described). Description adds minor nuance (comma-separated allowed) but does not significantly enhance understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Analyzes database health' and lists specific health checks (index, connection, vacuum, etc.), distinguishing it from sibling tools like analyze_query_indexes which focus on specific aspects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear guidance on how to use the tool: specify a single check or comma-separated list, default 'all'. However, does not explicitly compare to siblings or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_query_indexesARead-only
Analyze a list of (up to 10) SQL queries and recommend optimal indexes
| Name | Required | Description | Default |
|---|---|---|---|
| method | No | Method to use for analysis | dta |
| queries | Yes | List of Query strings to analyze | |
| max_index_size_mb | No | Max index size in MB |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, indicating a safe read operation. The description adds behavioral context by specifying the limit of 10 queries and that it recommends indexes, which is valuable beyond the annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that is front-loaded with the main action and constraints. Every word is necessary and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema, the description does not need to explain return values. The description covers the purpose, input limit, and expected output (index recommendations). For a read-only analysis tool, this is fully sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents the three parameters (queries, method, max_index_size_mb). The description adds minimal extra meaning beyond restating the queries parameter. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Analyze', the resource 'a list of SQL queries', and the output 'recommend optimal indexes'. It also includes a specific constraint (up to 10 queries), which distinguishes it from sibling tools like analyze_workload_indexes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for analyzing a small batch of queries to get index recommendations, but it does not explicitly state when to use this tool versus alternatives like analyze_workload_indexes or execute_sql. There are no exclusions or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_workload_indexesARead-only
Analyze frequently executed queries in the database and recommend optimal indexes
| Name | Required | Description | Default |
|---|---|---|---|
| method | No | Method to use for analysis | dta |
| max_index_size_mb | No | Max index size in MB |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, so the read-only nature is clear. The description adds no further behavioral details beyond analyzing queries and recommending indexes. No mention of prerequisites, rate limits, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that fully captures the tool's purpose with no extraneous words. It is front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (not shown) and only 2 parameters, the description minimally covers the core functionality. Missing details like whether recommendations are returned as a list or if any prerequisites exist. Could be more informative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description does not need to explain parameters. It adds no extra meaning beyond what the schema provides for 'method' and 'max_index_size_mb'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it analyzes frequently executed queries and recommends indexes. However, it does not differentiate itself from sibling tool 'analyze_query_indexes', which may have a similar purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use for workload index analysis but provides no explicit guidance on when to use vs. alternatives like 'analyze_query_indexes' or 'explain_query'. No exclusions or context are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_sqlCDestructive
Execute any SQL query
| Name | Required | Description | Default |
|---|---|---|---|
| sql | No | SQL to run | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While the destructiveHint annotation indicates potential for data modification, the description does not elaborate. It fails to mention that execution may alter data, require authentication, or have side effects like creating temporary tables. The description adds no behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very short (5 words) and front-loaded, which aids quick scanning. However, it sacrifices essential details for brevity. A slightly longer description with context would be more useful while still being concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's destructive nature and the presence of an output schema, the description should cover safe usage, default behavior (the default 'all' is unclear), and whether it supports SELECT-only or DDL/DML. The current description leaves significant gaps, making it incomplete for reliable agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already includes a description for the 'sql' parameter. The tool description repeats the purpose without adding new parameter meaning. Schema coverage is 100%, so baseline of 3 is appropriate; no extra value is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Execute any SQL query' clearly states the tool's action (execute) and resource (SQL query). It is specific enough to distinguish from sibling tools like analyze_db_health or explain_query, which focus on analysis rather than execution. However, it could be more precise about the scope of supported SQL (e.g., DDL vs DML).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus its siblings. It does not mention scenarios to avoid (e.g., for resource-intensive queries) or prerequisites (e.g., user permissions). A brief note on appropriate contexts would improve this.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_queryARead-only
Explains the execution plan for a SQL query, showing how the database will execute it and provides detailed cost estimates.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | SQL query to explain | |
| analyze | No | When True, actually runs the query to show real execution statistics instead of estimates. Takes longer but provides more accurate information. | |
| hypothetical_indexes | No | A list of hypothetical indexes to simulate. Each index must be a dictionary with these keys: - 'table': The table name to add the index to (e.g., 'users') - 'columns': List of column names to include in the index (e.g., ['email'] or ['last_name', 'first_name']) - 'using': Optional index method (default: 'btree', other options include 'hash', 'gist', etc.) Examples: [ {"table": "users", "columns": ["email"], "using": "btree"}, {"table": "orders", "columns": ["user_id", "created_at"]} ] If there is no hypothetical index, you can pass an empty list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only behavior (readOnlyHint: true). The description adds that the tool shows how the database will execute and provides cost estimates, but it does not disclose any additional behavioral traits such as the impact of the 'analyze' parameter or potential performance implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that efficiently conveys the core functionality without unnecessary words. It is front-loaded with the action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description covers the basic purpose, it does not mention optional parameters (analyze, hypothetical_indexes) or their effects. Given the output schema exists, return values are not needed, but the description could be more complete for a tool with three parameters and advanced features.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not add meaning beyond the input schema, which already has 100% coverage with detailed parameter descriptions. Therefore, it meets the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: explaining a SQL query's execution plan with cost estimates. It uses a specific verb ('explains') and resource ('execution plan'), and distinguishes it from sibling tools like execute_sql or analyze_query_indexes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., when to use explain_query vs. analyze_query_indexes). The description lacks context about prerequisites or scenarios where it's appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_object_detailsBRead-only
Show detailed information about a database object
| Name | Required | Description | Default |
|---|---|---|---|
| object_name | Yes | Object name | |
| object_type | No | Object type: 'table', 'view', 'sequence', or 'extension' | table |
| schema_name | Yes | Schema name |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description's 'Show detailed information' aligns with a read operation. No contradictions. However, the description adds no extra behavioral context beyond the annotation, but it is consistent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise (one sentence), but it lacks structure and could be more informative without being verbose. It is not front-loaded with critical details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to explain return values. However, it does not specify what kind of details are provided, leaving some ambiguity. Adequate for a simple detail retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description does not add any additional meaning to the parameters beyond their schema definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it shows detailed information about a database object, distinguishing it from sibling tools like list_objects (which lists objects) and list_schemas (lists schemas). However, it does not specify what 'detailed information' includes, but it is specific enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use or when-not-to-use guidance is provided. There is no mention of alternatives or contexts where this tool is preferred over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_top_queriesBRead-only
Reports the slowest or most resource-intensive queries using data from the 'pg_stat_statements' extension.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of queries to return when ranking based on mean_time or total_time | |
| sort_by | No | Ranking criteria: 'total_time' for total execution time or 'mean_time' for mean execution time per call, or 'resources' for resource-intensive queries | resources |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the agent knows it's a safe read. The description adds context by specifying the data source (pg_stat_statements) which implies the extension must be enabled, but does not detail potential impacts like query reset or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no unnecessary words. Clear and to the point. Could be slightly improved by adding a brief note about extension requirement, but remains appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and optional parameters, the description is adequate but minimal. It does not mention prerequisites (pg_stat_statements must be enabled) or any limitations, which would be helpful for an agent deciding whether to use this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for both parameters. The overall description reinforces the sort_by options by mentioning 'slowest or most resource-intensive', but adds no new insight beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'reports' and clearly identifies the resource as 'the slowest or most resource-intensive queries' from 'pg_stat_statements'. It distinguishes from siblings like analyze_query_indexes or explain_query by focusing on top queries by performance metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives such as analyze_db_health or execute_sql. The description implies it's for identifying problematic queries but does not explicitly state when not to use it or direct to other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_objectsARead-only
List objects in a schema
| Name | Required | Description | Default |
|---|---|---|---|
| object_type | No | Object type: 'table', 'view', 'sequence', or 'extension' | table |
| schema_name | Yes | Schema name |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is consistent with the readOnlyHint annotation (true) and does not contradict it. However, it adds no behavioral context beyond the annotation. Since annotations carry the behavioral burden, a score of 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence that is efficiently front-loaded and contains no unnecessary words. It earns its place by clearly stating the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the presence of a detailed input schema and readOnlyHint annotation, the description is sufficient for an AI agent to understand the basic purpose. It could optionally mention the object types listed, but the schema provides that detail. Overall, it is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (both parameters have descriptions in the input schema). The tool description adds no additional meaning about parameters. Per criteria, baseline is 3 when schema coverage is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'List objects in a schema' clearly states the action (list) and resource (objects in a schema). It distinguishes from sibling tools like 'list_schemas' which lists schemas, and 'get_object_details' which details a single object. The verb and resource are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No usage guidelines are provided. The description does not indicate when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions. It simply states what the tool does without contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_schemasARead-only
List all schemas in the database
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds no behavioral details beyond the annotation 'readOnlyHint: true'. Given the simplicity of the operation, this is adequate but does not exceed expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no redundant information. Highly concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete given zero parameters, presence of output schema, and annotation. No additional information is necessary for a simple listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to add parameter semantics. Baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'List all schemas in the database' clearly states the action (list) and resource (schemas), and it distinguishes this tool from sibling tools like 'list_objects' or 'execute_sql'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives (e.g., when to use 'list_objects' instead). Agent must infer purpose from name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
9 tool updates
v0.1.1- Added
analyze_db_health - Added
analyze_query_indexes - Added
analyze_workload_indexes - Added
execute_sql - Added
explain_query - Added
get_object_details - Added
get_top_queries - Added
list_objects - Added
list_schemas
9 tool updates
v0.3.0- Removed
analyze_db_health - Removed
analyze_query_indexes - Removed
analyze_workload_indexes - Removed
execute_sql - Removed
explain_query - Removed
get_object_details - Removed
get_top_queries - Removed
list_objects - Removed
list_schemas
9 tool updates
v1.0.0- First observed
analyze_db_health - First observed
analyze_query_indexes - First observed
analyze_workload_indexes - First observed
execute_sql - First observed
explain_query - First observed
get_object_details - First observed
get_top_queries - First observed
list_objects - First observed
list_schemas
TDQS
Each tool targets a distinct aspect of database interaction: health checks, index analysis, query execution, explain plans, object details, top queries, and listing schemas/objects. There is no overlap; the two index analysis tools are differentiated by input (specific queries vs. workload).
All tool names follow a consistent verb_noun pattern in snake_case (analyze_, execute_, explain_, get_, list_). Verbs like 'analyze', 'execute', 'explain', 'get', and 'list' are used uniformly, making the naming predictable.
With 9 tools, the set is well-scoped for a Postgres MCP server covering health analysis, index optimization, query execution, and schema exploration. It neither feels sparse nor overwhelming, earning its place.
The tool set covers analysis and ad-hoc queries comprehensively via execute_sql, but lacks explicit tools for creating, altering, or dropping database objects. However, execute_sql enables these operations indirectly, making the gap minor.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for building and testing AI agents with multi-model experimentation and insights.
Analytical memory for AI agents: a real Postgres queried in plain English over MCP. One command.
- XataOAuthio.github.xataio
Xata MCP server lets AI agents interact with your Xata projects, and Postgres database branches.
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
Related MCP Servers
- AlicenseBqualityBmaintenanceA Model Context Protocol server that enables powerful PostgreSQL database management capabilities including analysis, schema management, data migration, and monitoring through natural language interactions.181,692198AGPL 3.0
- AlicenseBqualityDmaintenanceAn open source Model Context Protocol server for PostgreSQL that provides database health analysis, index tuning, query plan exploration, and safe SQL execution for AI agents throughout the development process.9MIT
- AlicenseNot gradedqualityNot gradedmaintenanceAn open-source MCP server that provides AI agents with advanced PostgreSQL capabilities including index tuning, query plan optimization, and comprehensive database health analysis. It supports safe SQL execution through configurable access modes and offers both stdio and SSE transport options for various development environments.-
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) Server that allows AI models to securely interact with data hosted in Azure Database for PostgreSQL. It enables natural language querying, schema exploration, and data management through MCP clients like Claude Desktop and Visual Studio Code.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/crystaldba/postgres-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server