Vertica MCP Server
The Vertica MCP Server turns your Vertica Analytics Database into an AI-accessible platform, enabling AI assistants to interact with it via natural language using the Model Context Protocol.
Query Execution
run_query_safely— Execute SQL with smart large-result detection, automatic warnings, pagination/streaming modes, and timeout supportexecute_query_paginated— Run queries with built-in limit/offset pagination for large datasetsexecute_query_stream— Stream massive results in configurable batches
Schema & Metadata Exploration
get_database_schemas— List all schemas in the databaseget_schema_tables/get_schema_views— List tables and views within a schemaget_table_structure— Retrieve columns, data types, and constraintsget_table_projections— Inspect Vertica-specific projections
Performance Analysis
profile_query— Retrieve execution plans, metrics, and optimization suggestionsanalyze_system_performance— Analyze real-time system performance with configurable granularity
Health & Monitoring
database_status— Comprehensive health metrics including storage and connection statsgenerate_health_dashboard— Consolidated dashboard in compact, detailed, or JSON format
Platform Features
Security: Read-only mode, schema-level access controls, and SSL/TLS support
Performance: Connection pooling, query streaming, and automatic pagination
AI-Optimized: Built-in prompts for SQL safety, performance analysis, and natural language-to-SQL conversion
Multiple Transports: STDIO, HTTP, and SSE for integration with Claude Desktop, Cursor, VS Code, and other MCP-compatible clients
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Vertica MCP ServerAnalyze the slowest queries from the last hour and suggest optimizations."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Vertica MCP Server
Transform your Vertica Analytics Database into an AI-powered intelligence layer
Quick Start • Documentation • Features • Contributing • Community
Why Vertica MCP?
The Vertica MCP Server is a production-ready implementation of the Model Context Protocol that transforms your Vertica Analytics Database into an intelligent, AI-accessible data platform. Built with enterprise security and performance in mind, it enables AI assistants like Claude, ChatGPT, and Cursor to directly query, analyze, and optimize your Vertica databases through natural language.
What is MCP?
The Model Context Protocol (MCP) is an open standard developed by Anthropic that provides a universal way for AI assistants to connect with external tools and data sources. Think of it as "USB-C for AI" - a standardized interface that allows any MCP-compatible AI to interact with your systems without custom integrations.
Key Benefits
Universal AI Connectivity: Connect any MCP-compatible AI to your Vertica database without custom integrations
Enterprise Security: Fine-grained permissions at schema and operation levels with SSL/TLS support
High Performance: Connection pooling, query streaming, and automatic pagination for handling massive datasets
AI-Optimized: Built-in prompts and tools specifically designed for database analysis and optimization
Multiple Transports: Support for STDIO, HTTP, and SSE to fit any deployment scenario
Production Ready: Battle-tested with comprehensive error handling, logging, and monitoring
Related MCP server: Igloo MCP
Prerequisites
Python 3.11 or higher
Vertica Database (accessible instance)
uv (Python package manager) - Installation guide
Docker (optional, for containerized deployment)
Claude Desktop or another MCP-compatible client
Quick Start
Method 1: ⚡ 1-Click Client Setup (Recommended)
If you want to configure Claude Desktop or Cursor to connect to your Vertica Database instantly, we've provided an automated setup script. This works whether you installed from source or via PyPI (pip).
Option A: If you cloned the repository (Source/uv)
cd vertica-mcp
python setup_clients.pyOption B: If you installed via PyPI (pip)
# 1. Download the setup script
curl -O https://raw.githubusercontent.com/zaboura/vertica-mcp/master/setup_clients.py
# 2. Run the interactive setup script
python setup_clients.pyThe script will ask how you installed the server, prompt you for your Vertica credentials, generate your .env file, and automatically configure Claude Desktop and Cursor. Simply restart your AI assistant and you're good to go!
Method 2: Local Installation (Development Environment)
# 1. Clone the repository
git clone https://github.com/zaboura/vertica-mcp.git
cd vertica-mcp
# 2. Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 3. Setup environment and install dependencies
uv sync
source .venv/bin/activate
# 4. Install in development mode
uv pip install -e .
# 5. Configure database connection
cp .env.example .env
# Edit .env with your Vertica credentials
# 6. Run the server
vertica-mcp --transport http --port 8000 --bind-host 0.0.0.0 # HTTP for remote accessMethod 3: PyPI Installation (Production Environment)
This method is recommended for production deployments and when you want to use the stable release.
# 1. Install from PyPI
pip install vertica-mcp
# 2. Initialize configuration
vertica-mcp --init
# 3. Edit configuration with your credentials
nano .env # or use your preferred editor
# Update VERTICA_HOST, VERTICA_USER, VERTICA_PASSWORD, etc.
# 4. Test the installation
vertica-mcp --transport http --port 8000 # For HTTP accessConfiguration File
After running vertica-mcp --init, edit the generated .env file with your specific settings:
# Required Database Connection
VERTICA_HOST=your_vertica_host
VERTICA_PORT=5433
VERTICA_DATABASE=your_database
VERTICA_USER=your_username
VERTICA_PASSWORD=your_password
# Connection Pool Configuration
VERTICA_CONNECTION_LIMIT=10
VERTICA_LAZY_INIT=1
# SSL Configuration (optional but recommended for production)
VERTICA_SSL=false
VERTICA_SSL_REJECT_UNAUTHORIZED=true
# Performance and Resource Management
VERTICA_QUERY_TIMEOUT=600 # Query timeout in seconds
VERTICA_MAX_RETRIES=3 # Max retry attempts
VERTICA_RETRY_DELAY=0.1 # Base delay for retries
VERTICA_CACHE_TTL=300 # Cache TTL in seconds
VERTICA_MAX_RESULT_MB=100 # Max result size in MB
VERTICA_RATE_LIMIT=60 # Requests per minute
VERTICA_HEALTH_CHECK_INTERVAL=60 # Health check interval
# Security Permissions (defaults to read-only for safety)
ALLOW_INSERT_OPERATION=false
ALLOW_UPDATE_OPERATION=false
ALLOW_DELETE_OPERATION=false
ALLOW_DDL_OPERATION=false
# Schema-specific Permissions (optional for granular control)
SCHEMA_INSERT_PERMISSIONS=staging:true,production:false
SCHEMA_UPDATE_PERMISSIONS=staging:true,production:false
SCHEMA_DELETE_PERMISSIONS=staging:false,production:false
SCHEMA_DDL_PERMISSIONS=staging:false,production:falseTesting with MCP Inspector
The MCP Inspector is a valuable tool for testing and debugging your server configuration:
# 1. Install MCP Inspector
npm install -g @modelcontextprotocol/inspector
# 2. Start your server in one terminal
vertica-mcp --transport http --port 8000
# 3. Test with inspector in another terminal
mcp-inspector http://localhost:8000/mcpThe inspector will open at http://localhost:6274 where you can:
View available database tools and their schemas
Test tool execution interactively with real data
Validate MCP protocol compliance
Debug connection issues and error responses
For STDIO testing (not recommended due to command complexity), use HTTP transport which provides identical functionality validation with better debugging capabilities.
Method 4: Docker Deployment
Docker deployment is ideal for containerized environments and consistent deployments across different systems.
Build Docker Image
# Build directly from Dockerfile
docker build -t vertica-mcp:latest .
# Or build via Compose (recommended)
docker compose build
Run with Docker Compose
Compose automatically reads a .env file if present.
Vertica credentials and configuration are loaded from .env, while network binding and transport options
have Docker-safe defaults (HTTP_BIND=0.0.0.0, SSE_BIND=0.0.0.0).
# STDIO transport (for direct MCP client connection)
docker compose up mcp-stdio
# HTTP transport (for web-based access)
docker compose up mcp-http
# SSE transport (for real-time streaming)
docker compose up mcp-sseBinding behavior
By default, .env sets BIND=127.0.0.1 (localhost) for safety.
The Compose file defines service-specific bind variables:
HTTP_BIND=${HTTP_BIND:-0.0.0.0}
SSE_BIND=${SSE_BIND:-0.0.0.0}This means:
For local runs, the server binds to localhost.
For Docker, HTTP/SSE containers bind to 0.0.0.0 so they’re reachable from your host.
Override on the fly
You can override the bind or port at runtime:
# Linux/macOS
HTTP_BIND=127.0.0.1 docker compose up mcp-http
# Windows PowerShell
$env:HTTP_BIND="127.0.0.1"; docker compose up mcp-httpTo skip Vertica credential checks (for demo or offline runs):
SKIP_DB_CHECK=1 docker compose up mcp-httpManual Docker Run
# HTTP transport with port mapping
docker run -d \
--name vertica-mcp-http \
-p 8000:8000 \
--env-file .env \
-e TRANSPORT=http \
-e BIND=0.0.0.0 \
-e PORT=8000 \
-e HTTP_PATH=/mcp \
vertica-mcp:latest
# STDIO transport (direct MCP client connection)
docker run -i --rm \
--name vertica-mcp-stdio \
--env-file .env \
vertica-mcp:latestFeatures
Core Tools
Query Execution
run_query_safely- Smart query execution with large result detection and automatic warningsexecute_query_paginated- Efficient pagination for large datasets with configurable page sizesexecute_query_stream- Real-time streaming for massive results with memory-efficient processing
Schema Management
get_database_schemas- Explore database organization and available schemasget_schema_tables- List tables with metadata including row counts and storage informationget_table_structure- Detailed column information, data types, constraints, and indexesget_table_projections- Vertica-specific projection analysis and optimization recommendationsget_schema_views- List all views in a schema with their definitions
Performance Analysis
profile_query- Query execution plans, performance metrics, and optimization suggestionsanalyze_system_performance- Real-time resource monitoring and system health metricsdatabase_status- Comprehensive health metrics including storage usage and connection statistics
AI-Powered Prompts
SQL Safety Guard - Prevents accidental large queries and suggests safer alternatives
Performance Analyzer - Deep query optimization analysis with specific recommendations
SQL Assistant - Intelligent query generation based on natural language descriptions
Health Dashboard - Visual database insights with key performance indicators
System Monitor - Real-time performance tracking with alerting capabilities
Security Features
Multi-Level Permissions: Global and schema-specific access controls with fine-grained operation restrictions
SSL/TLS Encryption: Secure database connections with certificate validation
Connection Pooling: Efficient resource management with configurable limits and automatic cleanup
Read-Only Mode: Default safe configuration for production environments
OAuth Support: Enterprise authentication integration for remote deployments
Documentation
Configuration
# Database Connection (Required)
VERTICA_HOST=your_vertica_host
VERTICA_PORT=5433
VERTICA_DATABASE=your_database
VERTICA_USER=your_username
VERTICA_PASSWORD=your_password
# Connection Pool Configuration (Optional)
VERTICA_CONNECTION_LIMIT=10
VERTICA_LAZY_INIT=1 # Delay connection until first use
# SSL Configuration (Optional but recommended for production)
VERTICA_SSL=false
VERTICA_SSL_REJECT_UNAUTHORIZED=true
# Security Permissions (Optional - defaults to read-only for safety)
ALLOW_INSERT_OPERATION=false
ALLOW_UPDATE_OPERATION=false
ALLOW_DELETE_OPERATION=false
ALLOW_DDL_OPERATION=false
# Schema-specific Permissions (Optional for granular control)
SCHEMA_INSERT_PERMISSIONS=staging:true,production:false
SCHEMA_UPDATE_PERMISSIONS=staging:true,production:false
SCHEMA_DELETE_PERMISSIONS=staging:false,production:false
SCHEMA_DDL_PERMISSIONS=staging:false,production:falseClient Integration
Claude Desktop (STDIO) — Installed Package in a Virtual Environment [Recommended]
This is the best practice approach using a dedicated Python virtual environment and the installed package for maximum stability and isolation.
To install the package and create/configure your .env, follow Method 2: PyPI Installation above.
Locate the Claude configuration file
Windows:
%APPDATA%/Claude/claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Configure Claude to use your virtual environment executable and configuration
Replace the
commandpath with your virtual environment pathKeep
--transport stdioand--env-filewith absolute path for reliability
Windows Configuration Example
{
"mcpServers": {
"vertica-mcp-stdio": {
"command": "C:\\path-to-venv\\Scripts\\vertica-mcp.exe",
"args": ["--transport", "stdio", "--env-file", "C:\\path\\to\\.env"]
}
}
}macOS/Linux Configuration Example
{
"mcpServers": {
"vertica-mcp-stdio": {
"command": "/Users/you/.venvs/vertica-mcp/bin/vertica-mcp",
"args": ["--transport", "stdio", "--env-file", "/absolute/path/to/.env"]
}
}
}Verification Test (outside Claude)
Test your configuration before integrating with Claude:
# Windows
C:\venv\vertica-mcp\Scripts\vertica-mcp.exe --transport stdio --env-file C:\path\to\.env -vvv
# macOS/Linux
~/.venv/vertica-mcp/bin/vertica-mcp --transport stdio --env-file /absolute/path/to/.env -vvvImportant Configuration Notes
--transport stdioruns the server over STDIO (no network ports required)--env-fileensures your credentials load correctly even if Claude's working directory differsUse absolute paths to avoid path resolution issues
Alternative: Using Python Module Execution
You can also run the server using Python's -m flag (now supported with __main__.py):
{
"mcpServers": {
"vertica-mcp-stdio": {
"command": "python",
"args": ["-m", "vertica_mcp", "--transport", "stdio"],
"cwd": "/path/to/vertica-mcp",
"env": {
"VERTICA_HOST": "your_host",
"VERTICA_PORT": "5433",
"VERTICA_DATABASE": "your_database",
"VERTICA_USER": "your_username",
"VERTICA_PASSWORD": "your_password"
}
}
}
}Or using .env file:
{
"mcpServers": {
"vertica-mcp-stdio": {
"command": "python",
"args": ["-m", "vertica_mcp", "--transport", "stdio", "--env-file", "/absolute/path/to/.env"]
}
}
}Development Alternative: From Source (uv)
This option is suitable for development when you want to work with the source code directly:
{
"mcpServers": {
"vertica-mcp-stdio": {
"command": "uv",
"args": ["run", "vertica-mcp"],
"cwd": "/path/to/vertica-mcp",
"env": {
"VERTICA_HOST": "your_host",
"VERTICA_PORT": "5433",
"VERTICA_DATABASE": "your_database",
"VERTICA_USER": "your_username",
"VERTICA_PASSWORD": "your_password"
}
}
}
}Docker Configuration Options
Option A — Docker Compose (recommended for containerized environments)
{
"mcpServers": {
"vertica-mcp-stdio": {
"command": "docker",
"args": ["compose",
"-f",
"/path/to/vertica-mcp/docker-compose.yml",
"run",
"--rm",
"-T",
"mcp-stdio"]
}
}
}Option B — Direct docker run command
{
"mcpServers": {
"vertica-mcp-stdio": {
"command": "docker",
"args": ["run",
"-i",
"--rm",
"--env-file",
"/path/to/vertica-mcp/.env",
"vertica-mcp:latest"]
}
}
}Remote Transport Configuration (HTTP/SSE) via
mcp-remote
For remote deployments or when you prefer HTTP-based communication:
{
"mcpServers": {
"vertica-mcp-http": {
"command": "npx",
"args": ["-y", "mcp-remote", "http://localhost:8000/mcp"]
}
}
}{
"mcpServers": {
"vertica-mcp-sse": {
"command": "npx",
"args": ["-y", "mcp-remote", "http://localhost:8000/sse"]
}
}
}
6. **Final Step: Restart Claude Desktop**
After configuring, completely restart Claude Desktop and look for the (+) indicator which shows that the MCP server is connected and ready to use.
</details>
<details>
<summary><b>VS Code Integration</b></summary>
1. **Install GitHub Copilot Chat Extension**
Ensure you have the latest version of the GitHub Copilot Chat extension installed in VS Code.
2. **Create MCP Configuration File**
Create `.vscode/mcp.json` in your workspace root:
```json
{
"servers": {
"vertica-mcp": {
"type": "http",
"url": "http://localhost:8000/mcp"
}
}
}Enable MCP in VS Code Settings Add these settings to your VS Code configuration:
{
"chat.mcp.enabled": true,
"chat.mcp.discovery.enabled": true
}Create MCP Configuration File Create
mcp.jsonin your Cursor configuration directory:Global Configuration:
~/.cursor/mcp.json(macOS/Linux) or%UserProfile%\.cursor\mcp.json(Windows)Per Project Configuration:
<project>/.cursor/mcp.json
{
"mcpServers": {
"vertica-mcp": {
"command": "npx",
"args": ["-y", "mcp-remote", "http://localhost:8000/mcp"]
}
}
}Restart Cursor IDE Completely restart Cursor and check the Available Tools section to verify the integration is working.
CLI Reference
vertica-mcp [OPTIONS]Option | Description | Default |
| Increase verbosity level (-v, -vv, -vvv) | ERROR |
| Path to environment configuration file |
|
| Transport protocol (stdio, sse, http) |
|
| Port for SSE/HTTP transport |
|
| Vertica database host | from env |
| Host to bind SSE/HTTP server |
|
| Vertica database port | from env |
| Database name | from env |
| Database username | from env |
| Database password | from env |
| Maximum connections in pool |
|
| Enable SSL for database connection |
|
| Reject unauthorized SSL certificates |
|
| Endpoint path for HTTP transport |
|
| Prefer batch JSON responses |
|
| Use stateless HTTP sessions |
|
Usage Examples
Natural Language Queries
Basic Database Operations
"Show me all tables in the public schema"
"What's the structure of the customers table?"
"Get the last 100 orders from today"
"List all projections for the orders table"
"Get database status and health metrics"Performance Analysis and Monitoring
"Profile this query and suggest optimizations"
"Show system performance for the last hour"
"Find tables with high ROS container counts"
"Analyze the performance of this query: SELECT * FROM sales.orders WHERE order_date > '2024-01-01'"
"Monitor system performance for the last 30 minutes"Complex Analytics Queries
"Analyze sales trends by region and product"
"Find anomalies in transaction patterns"
"Generate a monthly revenue report"
"Execute this query safely: SELECT COUNT(*) FROM large_table"Database Management Tasks
"Check database health and storage usage"
"Monitor resource pool utilization"
"Identify and fix slow queries"
"Show me the current resource pool utilization"Transport Options
Transport | Use Case | Configuration |
STDIO | Local Claude Desktop integration | Default option, no network configuration required |
HTTP | Remote deployments and cloud environments | RESTful API on custom port with JSON-RPC protocol |
SSE | Real-time streaming applications | Server-sent events for live data updates |
Testing & Validation
Quick Health Check
Verify your database connection and server configuration with this simple test:
# Test database connection
python -c "
import os
from dotenv import load_dotenv
load_dotenv()
from vertica_mcp.connection import VerticaConfig, VerticaConnectionManager
config = VerticaConfig.from_env()
manager = VerticaConnectionManager()
manager.initialize_default(config)
conn = manager.get_connection()
cursor = conn.cursor()
cursor.execute('SELECT version()')
print('Connected successfully to:', cursor.fetchone()[0])
manager.release_connection(conn)
"MCP Inspector Testing
The MCP Inspector provides comprehensive testing and validation capabilities:
# Install MCP Inspector
npm install -g @modelcontextprotocol/inspector
# Test local STDIO server
npx @modelcontextprotocol/inspector vertica_mcp/server.py
# Test HTTP server
npx @modelcontextprotocol/inspector http://localhost:8000/mcpMCP Inspector Configuration:
Set the Transport Type to match your server configuration:
STDIO Transport Testing
Command:
uvArguments:
run --with mcp --with starlette --with uvicorn --with pydantic --with vertica-python mcp run vertica_mcp/server.py
SSE Transport Testing
URL:
http://localhost:8000/sse
HTTP Transport Testing
URL:
http://localhost:8000/mcp
API Endpoint Validation
Test your HTTP server endpoints directly with curl commands:
# Test tools list endpoint
curl -s http://localhost:8000/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
# Test server initialization
curl -s http://localhost:8000/mcp \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"0.1.0","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}'Advanced Features
Performance Optimization
The server automatically profiles queries and provides comprehensive optimization recommendations:
Automatic Query Analysis:
Execution plan analysis with detailed step-by-step breakdown
Join strategy recommendations based on table statistics
Projection optimization suggestions for improved performance
ROS container health monitoring and segmentation analysis
Example Usage:
# Automatic query optimization with detailed feedback
"Profile and optimize: SELECT * FROM large_table JOIN dimension_table"
# Returns: Execution plan, identified bottlenecks, and CREATE PROJECTION statementsKey Features:
Real-time performance metrics during query execution
Historical performance comparison
Automatic detection of inefficient patterns
Specific recommendations for index creation and query rewriting
Enterprise Integration
Ensure your production deployment meets enterprise standards:
Security Configuration:
Configure SSL/TLS for all database connections
Set appropriate connection pool limits based on workload
Enable read-only mode for production environments
Configure schema-specific permissions for different user roles
Implement proper authentication mechanisms
Monitoring and Maintenance:
Set up comprehensive monitoring and alerting systems
Implement rate limiting to prevent resource exhaustion
Configure log rotation and retention policies
Set up backup MCP servers for high availability
Establish disaster recovery procedures
Performance Optimization:
Tune connection pool parameters for your workload
Configure appropriate query timeouts
Set up caching strategies for frequently accessed data
Monitor and optimize resource usage patterns
Security Configuration
Permission Management Levels
The Vertica MCP Server implements a comprehensive three-tier permission system:
Global Permissions: Control operations across all schemas and tables
Schema-specific Permissions: Fine-grained control per individual schema
Connection Security: SSL/TLS encryption and authentication options
Security Best Practices
Database Access Security:
Use read-only credentials for production deployments to minimize risk
Enable SSL/TLS encryption for all database connections
Implement least-privilege access with minimal required permissions
Use environment variables instead of hardcoded credentials
Network and Infrastructure Security:
Restrict network access using firewall rules and security groups
Monitor access logs for suspicious activity and unauthorized attempts
Implement connection rate limiting to prevent abuse
Regular security audits of configuration and access patterns
Operational Security:
Regular credential rotation following your organization's security policies
Audit trail maintenance for all database operations
Secure backup procedures for configuration and credentials
Incident response procedures for security events
Troubleshooting
Common Issues and Solutions
Database Connection Problems
Test Basic Connectivity:
# Test network connectivity to Vertica server
telnet your_vertica_host 5433
# Test database credentials and permissions
vsql -h your_host -U your_user -d your_databaseCommon Connection Issues:
Network connectivity: Verify firewall rules and network routing
Authentication failures: Check username, password, and database permissions
SSL configuration: Ensure SSL settings match server requirements
Connection pool exhaustion: Monitor and adjust connection limits
MCP Client Integration Issues
Troubleshooting Steps:
Complete client restart: Fully restart the client application (Claude Desktop, VS Code, etc.)
Configuration validation: Verify JSON syntax in all configuration files
Server log analysis: Check server logs using
-vvvverbose flagIsolation testing: Test with MCP Inspector before client integration
Common Configuration Problems:
Incorrect file paths in configuration
Missing environment variables
Port conflicts with other services
Permission issues with executable files
Docker Deployment Issues
Container Troubleshooting:
# Check container logs for errors
docker logs vertica-mcp
# Test container internal connectivity
docker exec -it vertica-mcp curl http://localhost:8000/mcp
# Verify environment variable loading
docker exec -it vertica-mcp env | grep VERTICACommon Docker Issues:
Environment file not properly mounted
Port mapping conflicts
Network connectivity between containers
Volume mounting permission problems
Debug Mode and Logging
Enable Maximum Verbosity:
# Maximum verbosity for troubleshooting
vertica-mcp --transport http -vvv
# Log output to file for analysis
vertica-mcp --transport http -vv 2> debug.logLog Analysis Tips:
Look for connection establishment messages
Check for permission denial errors
Monitor query execution timestamps
Identify resource exhaustion warnings
Project Structure
vertica-mcp/
├── vertica_mcp/ # Python package source code
│ ├── __init__.py # Package initialization
│ ├── cli.py # Command-line interface implementation
│ ├── server.py # Main MCP server implementation
│ ├── connection.py # Database connection management
│ └── utils.py # Utility functions and helpers
│
├── pyproject.toml # Build configuration and metadata (PEP 621)
├── README.md # Project documentation
├── CHANGELOG.md # Release notes and version history
├── LICENSE # MIT license with attribution
├── .gitignore # Git ignore rules
├── .dockerignore # Docker ignore rules
├── .env.example # Sample environment file (do NOT commit .env)
│
├── docker-compose.yml # Docker Compose configuration
├── docker-entrypoint.sh # Docker container entry script
└── dockerfile # Docker image definitionContributing
We welcome and encourage contributions from the community! Please see our Contributing Guide for detailed information on how to get involved.
Development Environment Setup
Set up your local development environment with these steps:
# Clone and setup development environment
git clone https://github.com/zaboura/vertica-mcp.git
cd vertica-mcp
uv sync
# Install development dependencies including testing and linting tools
uv pip install -e ".[dev]"
# Run comprehensive test suite
pytest tests/
# Code formatting and style checks
black vertica_mcp/
isort vertica_mcp/
# Type checking and static analysis
mypy vertica_mcp/Adding New Tools and Features
When implementing new tools, follow these guidelines:
Tool Function Implementation: Add tool functions in
server.pywith proper@mcp.tool()decorator and comprehensive docstringsPermission Management: Implement appropriate permission checks using the connection manager
Error Handling: Add comprehensive error handling with informative error messages and proper logging
Testing: Write unit tests and integration tests for new functionality
Documentation: Update documentation including README, docstrings, and usage examples
Contribution Guidelines
Getting Started with Contributions:
Fork the repository and create your feature branch from
mainCreate a feature branch with a descriptive name:
git checkout -b feature/AmazingFeatureMake your changes following the existing code style and conventions
Add tests for any new functionality to ensure reliability
Update documentation as needed for new features or changes
Commit your changes with clear, descriptive messages:
git commit -m 'Add some AmazingFeature'Push to your branch:
git push origin feature/AmazingFeatureOpen a Pull Request with a detailed description of your changes
Code Quality Standards:
Follow existing code style and formatting conventions
Include comprehensive type hints for all functions
Write clear, descriptive commit messages
Ensure all tests pass before submitting pull requests
Update documentation for any user-facing changes
Community & Support
Getting Help and Support
GitHub Issues - Report bugs and request new features
Discussions - Ask questions and get community support
Discord - Real-time chat with the community and maintainers
Stack Overflow - Technical questions and answers
Community Guidelines
When seeking help or contributing:
Search existing issues and discussions before creating new ones
Provide detailed information about your environment and configuration
Include relevant error messages and log outputs
Be respectful and constructive in all interactions
Help others when you can share your knowledge and experience
Resources
Official Documentation and References
MCP Specification - Complete protocol standard and implementation guidelines
Vertica Documentation - Comprehensive database reference and best practices
FastMCP Framework - Server framework documentation and examples
Claude Desktop Guide - Client setup and configuration instructions
Learning Resources
Understanding MCP:
Model Context Protocol introduction and concepts
Best practices for MCP server development
Security considerations for AI integrations
Vertica Integration:
Database optimization techniques
Performance tuning for analytics workloads
Advanced query optimization strategies
AI and Database Integration:
Natural language to SQL conversion techniques
Database security in AI applications
Performance monitoring for AI-driven queries
Changelog
Version 0.1.4 (2026-04-26) - Bug Fixes & Improvements
Bug Fixes:
✅ Fixed rate limiting authentication issue in stateless HTTP mode
Added
_extract_client_id_from_auth()helper to extract client ID from API keyrun_query_safely()now works correctly with HTTP transportUses SHA-256 hash of API key as stable client identifier
✅ Fixed CLI module execution (
python -m vertica_mcp)Added
vertica_mcp/__main__.pyfor proper module invocationResolves Claude Desktop connection issues when using
python -msyntax
Improvements:
🧹 Repository cleanup: Removed 16 temporary/generated test files (~10.3 MB)
📝 Updated
.gitignoreto prevent test file regeneration📚 Enhanced README with multiple Claude Desktop configuration options
🔧 Better support for different installation methods (pip, uv, source)
Technical Changes:
Added
hashlibimport for client ID hashingModified rate limiting to support stateless HTTP sessions
Maintained backward compatibility with STDIO and SSE transports
Version 0.1.3 (2025-??-??) - Published on PyPI
Version 0.1.0 (2025-08-20) - Initial Release
Core Features Implemented:
11 comprehensive database tools for complete database interaction
5 AI-optimized prompts for enhanced user experience
Support for STDIO, HTTP, and SSE transport protocols
Docker support with complete compose configurations
Enterprise-grade security features and permission management
Key Capabilities:
Full schema exploration and metadata access
Query execution with safety guards and optimization
Real-time performance monitoring and analysis
Comprehensive error handling and logging
Production-ready deployment options
Technical Achievements:
Connection pooling for optimal resource management
Automatic query optimization and suggestion engine
Multi-transport support for flexible deployment scenarios
Comprehensive testing suite and validation tools
For complete version history and detailed changes, see CHANGELOG.md
License
This project is licensed under the MIT License - see the LICENSE file for complete terms and conditions.
License Summary:
Commercial and non-commercial use permitted
Modification and distribution allowed
No warranty provided
Attribution required for derived portions
Acknowledgments
This project builds upon mcp-vertica
by @nolleh.
While the original implementation provided a foundation for Vertica MCP support,
this fork introduces significant enhancements, including:
Caching layers and query result reuse
Rate limiting and throttling control
Improved error handling and retry logic
More advanced parsing and schema extraction
Connection pooling optimizations and performance tuning
New tooling and prompt injections tailored to Vertica workflows
Project Recognition
Core Technologies:
Anthropic for creating and maintaining the Model Context Protocol standard
Vertica for providing the powerful analytics platform that makes this integration possible
FastMCP for the excellent framework that simplified server development
Available Tools
12 toolsanalyze_system_performanceD
Analyze system performance with improved efficiency.
| Name | Required | Description | Default |
|---|---|---|---|
| window_minutes | No | ||
| bucket | No | minute | |
| top_n | No | ||
| flush | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. However, it only states the action generically ('analyze') without explaining what the tool actually does—e.g., whether it runs queries, collects metrics, generates reports, or modifies data. It lacks critical details like permissions needed, side effects, rate limits, or output format, making it inadequate for a tool with 4 parameters.
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 concise with a single sentence, but it's under-specified rather than efficiently informative. While it avoids unnecessary words, it doesn't front-load key details—the phrase 'with improved efficiency' adds little value and could be replaced with more substantive information. It earns a middle score for brevity but lacks meaningful structure.
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 complexity of a 4-parameter tool with no annotations, 0% schema coverage, and no output schema, the description is severely incomplete. It doesn't explain what the tool analyzes (e.g., CPU, memory, queries), how results are returned, or the purpose of parameters, leaving the agent unable to use the tool correctly. This is inadequate for even basic functionality.
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 0%, meaning none of the 4 parameters have descriptions in the schema. The tool description adds no information about what parameters like 'window_minutes', 'bucket', 'top_n', or 'flush' mean or how they affect the analysis. Without this, the agent cannot understand how to use these parameters effectively, failing to compensate for the schema gap.
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 'Analyze system performance with improved efficiency' is vague and tautological. It restates the tool name ('analyze_system_performance') with the generic addition 'with improved efficiency', which doesn't clarify what specific resource or scope is being analyzed. It fails to distinguish this tool from sibling tools like 'database_status' or 'generate_health_dashboard' that might also analyze performance 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?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention any context, prerequisites, or exclusions, nor does it reference sibling tools like 'database_status' or 'profile_query' that might be related. This leaves the agent with no information to make an informed choice among performance-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
database_statusB
Get database status with improved error handling and formatting.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions 'improved error handling and formatting,' which adds some context about reliability and output presentation, but fails to specify what 'status' includes (e.g., uptime, connections, performance metrics), whether it requires permissions, or if it's safe to use frequently. This leaves significant gaps for a tool with zero annotation coverage.
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, efficient sentence that front-loads the core purpose ('Get database status') and adds value with additional context ('with improved error handling and formatting'). There is no wasted verbiage, and every part of the sentence contributes to understanding the tool's functionality.
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 complexity (simple, no parameters) and the lack of annotations and output schema, the description is minimally adequate. It states what the tool does and hints at behavioral traits, but doesn't fully compensate for the missing structured data—e.g., it doesn't explain what 'status' entails or the format of the output. This makes it complete enough for basic use but with clear gaps.
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 0 parameters, and the schema description coverage is 100%, so there are no parameters to document. The description doesn't need to add parameter semantics, and it appropriately avoids discussing any. A baseline of 4 is applied since no parameters exist, and the description doesn't mislead about inputs.
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 with a specific verb ('Get') and resource ('database status'), making it immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'analyze_system_performance' or 'generate_health_dashboard', which might provide overlapping or related functionality.
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 provides no guidance on when to use this tool versus alternatives. With siblings like 'analyze_system_performance' and 'generate_health_dashboard' that might offer similar status or health information, there's no indication of when this specific tool is preferred, nor any prerequisites or exclusions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_query_paginatedC
Execute query with pagination support and result size limits.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| limit | No | ||
| offset | No | ||
| include_columns | No | ||
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It mentions 'pagination support and result size limits' which gives some context about output behavior, but doesn't address critical aspects like whether this is a read-only operation, what permissions are required, error handling, rate limits, or what the actual return format looks like.
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 extremely concise - a single sentence that efficiently communicates the core functionality. It's front-loaded with the main purpose and wastes no words on unnecessary elaboration.
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?
For a query execution tool with 5 parameters, no annotations, and no output schema, the description is insufficient. It doesn't explain the query language, result format, error conditions, or how pagination actually works in practice. The mention of 'pagination support' is too vague for proper agent understanding.
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?
With 0% schema description coverage and 5 parameters (only 1 required), the description provides no information about any parameters. It doesn't explain what 'query' should contain, what 'limit' and 'offset' control, what 'include_columns' affects, or how 'timeout' works. The description fails to compensate for the complete lack of schema documentation.
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 as 'Execute query with pagination support and result size limits' - a specific verb ('execute') and resource ('query') with key capabilities. However, it doesn't distinguish this from sibling tools like 'execute_query_stream' or 'run_query_safely', which likely have different execution characteristics.
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 provides no guidance on when to use this tool versus alternatives. With siblings like 'execute_query_stream', 'run_query_safely', and 'profile_query' available, there's no indication of when paginated execution is preferred over streaming, safe execution, or profiling approaches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_query_streamC
Stream query results with batching and size limits.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| batch_size | No | ||
| max_rows | No | ||
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions 'batching and size limits', which hints at performance characteristics, but fails to describe critical behaviors like whether this is a read-only operation, potential side effects, error handling, authentication requirements, or rate limits. For a query execution tool with zero annotation coverage, this leaves significant gaps.
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 extremely concise—a single sentence with zero waste. It's front-loaded with the core purpose and efficiently mentions key features. Every word earns its place, making it easy to parse quickly.
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 complexity of a query execution tool with 4 parameters, 0% schema description coverage, no annotations, and no output schema, the description is insufficient. It lacks details on return values, error conditions, performance implications, and how it differs from sibling tools. For a tool that likely handles data retrieval with streaming, more context is needed for safe and effective 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?
Schema description coverage is 0%, so the description must compensate. It mentions 'batching and size limits', which loosely relates to 'batch_size' and 'max_rows' parameters, but doesn't explain the meaning or usage of 'query' or 'timeout'. The description adds some value by hinting at parameter purposes but doesn't fully compensate for the lack of schema descriptions, resulting in a baseline score.
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: 'Stream query results with batching and size limits.' It specifies the verb ('stream') and resource ('query results'), and mentions key operational aspects (batching, size limits). However, it doesn't explicitly differentiate from sibling tools like 'execute_query_paginated' or 'run_query_safely', which prevents a perfect score.
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 provides no guidance on when to use this tool versus alternatives. With sibling tools like 'execute_query_paginated' and 'run_query_safely' available, there's no indication of when streaming is preferred over pagination or safe execution, nor any mention of prerequisites or constraints for usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_health_dashboardC
Generate consolidated health dashboard with controlled output. Args: ctx: The context object. output_format: The format of the dashboard (default: compact, detailed, json). Returns: A dictionary containing the health dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| output_format | No | compact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions 'controlled output,' which hints at some behavioral trait, but doesn't elaborate on what this means (e.g., rate limits, permissions, or side effects). For a tool with zero annotation coverage, this leaves significant gaps in understanding how it behaves beyond basic functionality.
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 front-loaded with the core purpose, followed by structured sections for args and returns. It's efficient with no wasted sentences, though the 'ctx' parameter lacks explanation, which slightly reduces clarity. Overall, it's appropriately sized and well-organized.
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 moderate complexity (generating a dashboard), lack of annotations, no output schema, and incomplete parameter documentation, the description is adequate but has clear gaps. It covers the basic purpose and some parameter details but misses behavioral context and full parameter semantics, making it minimally viable but not fully 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?
The description lists 'output_format' as a parameter with possible values ('compact, detailed, json'), which adds meaning beyond the input schema's 0% coverage. However, it doesn't explain the 'ctx' parameter at all, leaving it undocumented. With 1 parameter total and partial coverage in the description, this meets the baseline for minimal viability but doesn't fully compensate for the schema gap.
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: 'Generate consolidated health dashboard with controlled output.' It specifies the verb ('generate') and resource ('health dashboard'), and the 'consolidated' modifier adds useful context. However, it doesn't explicitly differentiate this from sibling tools like 'analyze_system_performance' or 'database_status', which might offer overlapping functionality.
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 provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites, appropriate contexts, or exclusions, and there's no comparison to sibling tools like 'analyze_system_performance' or 'database_status' that might serve similar purposes. The agent must infer usage from the purpose alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_database_schemasB
List database schemas with caching.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It adds value by disclosing caching behavior, which is a useful trait beyond basic functionality. However, it lacks details on permissions, rate limits, error handling, or what 'List' entails (e.g., format, pagination). For a tool with no annotations, this is a moderate but incomplete disclosure.
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, efficient sentence that front-loads the core action ('List database schemas') and adds a key behavioral trait ('with caching') without waste. Every word earns its place, making it highly concise and well-structured.
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 no annotations, no output schema, and 0 parameters, the description is adequate but has gaps. It covers the basic purpose and a behavioral trait (caching), but for a tool that likely returns a list of schemas, more context on output format or usage scenarios would improve completeness. It's minimally viable but not fully 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?
The input schema has 0 parameters with 100% coverage, so the schema fully documents the absence of parameters. The description doesn't need to add parameter details, and it doesn't contradict the schema. A baseline of 4 is appropriate since no parameters exist, and the description doesn't introduce confusion.
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 ('List') and resource ('database schemas'), making the purpose specific and understandable. It distinguishes from siblings like get_schema_tables or get_schema_views by focusing on schemas rather than their contents. However, it doesn't explicitly differentiate from all siblings (e.g., database_status might overlap in scope), keeping it from a perfect score.
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 provides no guidance on when to use this tool versus alternatives like get_schema_tables or database_status. It mentions caching, which hints at performance considerations, but doesn't specify when caching applies or when to avoid it. Without explicit when/when-not instructions or named alternatives, the score is low.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_schema_tablesC
List tables in schema with caching.
| Name | Required | Description | Default |
|---|---|---|---|
| schema_name | No | public |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions 'with caching', which hints at performance behavior, but doesn't disclose critical traits like whether it's read-only, safe, requires permissions, rate limits, or what the output format looks like. For a tool with no annotation coverage, this leaves significant behavioral gaps.
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 extremely concise with a single sentence that front-loads the core action ('List tables in schema') and adds a key detail ('with caching'). There's zero waste or redundancy, making it efficient and easy to parse quickly.
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 complexity (a database query tool with caching), lack of annotations, no output schema, and low schema coverage, the description is incomplete. It doesn't explain return values, error handling, or how caching affects results, leaving the agent with insufficient information to use the tool effectively in context.
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 0%, so the description must compensate. It doesn't add any meaning beyond the input schema—no explanation of what 'schema_name' represents, default usage, or how caching interacts with parameters. With 1 parameter undocumented in both schema and description, the description fails to provide necessary semantic context.
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 ('List') and resource ('tables in schema'), making the purpose understandable. It distinguishes from siblings like 'get_schema_views' by specifying tables, but doesn't fully differentiate from 'get_table_structure' or 'get_table_projections' which might also involve tables. The mention of 'with caching' adds specificity but doesn't fully clarify uniqueness.
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 provides no guidance on when to use this tool versus alternatives. It doesn't mention when to choose this over 'get_schema_views' for views, 'get_table_structure' for detailed info, or 'execute_query_paginated' for custom queries. There's no context on prerequisites, exclusions, or typical use cases, leaving the agent with minimal direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_schema_viewsC
List views in schema with caching.
| Name | Required | Description | Default |
|---|---|---|---|
| schema_name | No | public |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions caching, which adds some context about performance or data freshness, but fails to cover critical aspects like whether this is a read-only operation, potential side effects, error handling, or rate limits. This leaves significant gaps for a tool that interacts with database schemas.
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 with a single sentence, making it easy to parse. However, it could be more front-loaded by explicitly stating the tool's core function before mentioning caching, but it's still efficient with zero wasted words.
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 complexity of database operations, no annotations, no output schema, and low parameter coverage, the description is incomplete. It lacks details on return values, error conditions, caching implications, and how it differs from sibling tools, making it inadequate for safe and effective use by an AI agent.
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 has 1 parameter with 0% description coverage, meaning the schema provides no semantic details. The description adds no information about the 'schema_name' parameter, such as what it represents, valid values, or default behavior beyond the schema's default. This fails to compensate for the low schema coverage.
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 with a specific verb ('List') and resource ('views in schema'), making it easy to understand what the tool does. However, it doesn't explicitly differentiate from sibling tools like 'get_schema_tables' or 'get_table_structure', which prevents a perfect score.
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 provides no guidance on when to use this tool versus alternatives like 'get_schema_tables' or 'get_database_schemas'. It mentions caching but doesn't explain when this is beneficial or if there are trade-offs, leaving the agent with minimal usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_projectionsC
List projections for a table.
| Name | Required | Description | Default |
|---|---|---|---|
| table_name | Yes | ||
| schema_name | No | public |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It states 'List projections for a table,' which implies a read-only operation, but doesn't disclose any behavioral traits such as permissions required, rate limits, whether it returns all projections or a subset, or how it handles errors. This leaves significant gaps for an agent to understand the tool's behavior.
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, efficient sentence: 'List projections for a table.' It's front-loaded with the core action and target, with zero wasted words. This is appropriately sized for the tool's apparent simplicity, making it easy to parse quickly.
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 complexity (a read operation with 2 parameters), lack of annotations, 0% schema description coverage, and no output schema, the description is incomplete. It doesn't explain what 'projections' are, the return format, or any behavioral context. For a tool that might involve database-specific concepts, this leaves too many unknowns for effective 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 description adds no meaning beyond the input schema, which has 0% schema description coverage. It doesn't explain what 'projections' are or how the parameters relate to them (e.g., if table_name refers to a specific database table). With two parameters (table_name and schema_name) and no schema descriptions, the description fails to compensate, leaving parameters semantically unclear.
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 projections for a table' clearly states the action (list) and target (projections for a table), but it's vague about what 'projections' means in this context (e.g., column subsets, materialized views, or database-specific structures). It doesn't differentiate from siblings like get_table_structure or get_schema_tables, which might overlap in scope. This provides a basic purpose but lacks specificity.
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. For example, it doesn't specify if this is for metadata retrieval, performance analysis, or how it differs from siblings like get_table_structure or execute_query_paginated. The description implies usage for listing projections but offers no context on prerequisites, typical scenarios, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_table_structureC
Get table structure with caching support.
| Name | Required | Description | Default |
|---|---|---|---|
| table_name | Yes | ||
| schema_name | No | public |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions 'caching support,' which hints at performance optimization, but fails to describe key traits such as whether this is a read-only operation, potential side effects, error handling, or how caching works (e.g., cache duration, invalidation). This leaves significant gaps in understanding the tool's behavior.
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 extremely concise with a single sentence, 'Get table structure with caching support,' which is front-loaded and wastes no words. Every part of the sentence contributes to the tool's purpose, making it efficient and easy to parse, though it may be overly brief for clarity.
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 complexity of a database tool with 2 parameters, no annotations, and no output schema, the description is incomplete. It lacks details on what 'table structure' includes, how caching operates, error conditions, or return values. For a tool that likely returns metadata, this minimal description does not provide enough context for effective 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 has 0% description coverage, and the tool description does not add any meaning to the parameters 'table_name' and 'schema_name.' It does not explain what these parameters represent, their expected formats, or how they affect the output. With low schema coverage, the description fails to compensate, leaving parameters largely undocumented.
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 states the tool's purpose as 'Get table structure with caching support,' which includes a verb ('Get') and resource ('table structure'), making it clear what it does at a basic level. However, it lacks specificity about what 'table structure' entails (e.g., columns, data types, constraints) and does not differentiate it from sibling tools like 'get_schema_tables' or 'get_table_projections,' leaving room for ambiguity.
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 provides no guidance on when to use this tool versus alternatives. It mentions 'caching support' but does not explain when caching is beneficial or when to choose this over other tools like 'get_schema_tables' or 'execute_query_paginated' for similar purposes. There is no explicit mention of prerequisites, exclusions, or recommended contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profile_queryC
Profile query execution with improved error handling.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions 'improved error handling', which hints at robustness, but doesn't specify what errors are handled, how they're reported, or any other behavioral traits like performance impact, side effects, or output format. For a tool with no annotations, this is insufficient to inform the agent about its operational characteristics.
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 concise with a single sentence, 'Profile query execution with improved error handling.' It's front-loaded and wastes no words, making it efficient to parse. However, it's under-specified rather than optimally concise, as it lacks necessary details for clarity.
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 complexity (a query profiling tool with 2 parameters), no annotations, no output schema, and 0% schema coverage, the description is incomplete. It doesn't explain what profiling entails (e.g., returns performance metrics, logs), how errors are handled, or the tool's role among siblings. For a tool that likely involves system interaction, more context is needed to guide effective 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?
Schema description coverage is 0%, so the schema provides no parameter descriptions. The tool description adds no information about parameters beyond what's in the schema (e.g., 'query' and 'timeout'). It doesn't explain what a 'query' entails (e.g., SQL, API call), what 'timeout' units are, or default behaviors. With 2 parameters and 0% coverage, the description fails to compensate for the lack of schema documentation.
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 'Profile query execution with improved error handling' states a vague purpose but lacks specificity. It mentions 'profile query execution' which suggests analyzing query performance, but doesn't specify what resource is being profiled (e.g., database queries, system performance). It doesn't clearly distinguish from sibling tools like 'execute_query_paginated' or 'run_query_safely' which might also handle queries. The description is better than a tautology but remains ambiguous about scope.
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. With siblings like 'execute_query_paginated', 'execute_query_stream', and 'run_query_safely', the description doesn't explain when profiling is preferred over execution, or what 'improved error handling' entails compared to other tools. This leaves the agent without clear direction on tool selection in context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_query_safelyB
Safe query execution with size detection, pagination, and timeout support.
Args:
query: SQL query to execute
row_threshold: Maximum rows before requiring confirmation
proceed: Whether to proceed with large result set
mode: Execution mode ('page' or 'stream')
page_limit: Rows per page when paginating
include_columns: Include column names in response
precount: Count total rows for large results (expensive)
timeout: Query timeout in seconds (default from env)
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| row_threshold | No | ||
| proceed | No | ||
| mode | No | page | |
| page_limit | No | ||
| include_columns | No | ||
| precount | No | ||
| timeout | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions safety features like size detection, pagination, and timeout support, which adds some context. However, it doesn't detail critical behaviors such as what happens when thresholds are exceeded, how pagination works in practice, or error handling for timeouts, leaving significant gaps for a tool with 8 parameters.
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 appropriately sized with a clear summary sentence followed by a structured parameter list. Each parameter explanation is brief and focused, though the initial summary could be more front-loaded with key usage context. There's minimal wasted text, making it efficient for an agent to parse.
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 complexity (8 parameters, no annotations, no output schema), the description is moderately complete. It covers parameter semantics well but lacks behavioral details like response format, error conditions, and sibling differentiation. For a safe query execution tool with many options, more context on outcomes and trade-offs would be beneficial.
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 0%, so the description must compensate. It provides a helpful list of all 8 parameters with brief explanations that add meaning beyond the schema's titles and types. For example, it clarifies 'row_threshold' as 'Maximum rows before requiring confirmation' and 'precount' as 'Count total rows for large results (expensive)', which significantly enhances understanding.
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 executes SQL queries with safety features like size detection, pagination, and timeout support. It specifies the verb ('execute') and resource ('SQL query') but doesn't explicitly differentiate from siblings like 'execute_query_paginated' or 'execute_query_stream' beyond the 'safely' aspect in the name.
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 provides no guidance on when to use this tool versus alternatives like 'execute_query_paginated' or 'execute_query_stream'. It mentions features like pagination and streaming modes but doesn't specify scenarios where this tool is preferred over its siblings, leaving the agent to infer usage from parameter names 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.
12 tool updates
v0.1.0- First observed
analyze_system_performance - First observed
database_status - First observed
execute_query_paginated - First observed
execute_query_stream - First observed
generate_health_dashboard - First observed
get_database_schemas - First observed
get_schema_tables - First observed
get_schema_views - First observed
get_table_projections - First observed
get_table_structure - First observed
profile_query - First observed
run_query_safely
TDQS
Scored across 12 tools
Most tools have distinct purposes, but there is some overlap between execute_query_paginated, execute_query_stream, and run_query_safely, as all three handle query execution with different features. The descriptions help differentiate them, but an agent might need to carefully choose between these for query-related tasks.
All tool names follow a consistent snake_case verb_noun pattern, such as analyze_system_performance, get_database_schemas, and profile_query. This predictability makes it easy for agents to understand and navigate the tool set without confusion.
With 12 tools, the server is well-scoped for a Vertica database management system. The count covers essential operations like query execution, schema exploration, performance analysis, and health monitoring, without being overwhelming or too sparse for the domain.
The tool set provides comprehensive coverage for database operations, including query execution, schema inspection, performance analysis, and health dashboards. A minor gap is the lack of data manipulation tools (e.g., insert, update, delete), but this is reasonable if the server focuses on read-only or administrative tasks, and agents can work around this with existing query tools.
Maintenance
Related MCP Connectors
Ask data questions in natural language. Get SQL, insights, and charts from your databases.
Ask questions in plain language, get answers from your business database. No SQL required.
Query your org's data in natural language — read-only MCP access to SQL, NoSQL, files & warehouses.
Query 40 databases from Claude, ChatGPT, or Cursor — on any device. Read-only, encrypted, audited.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables interaction with Vertica databases through SQL queries, schema management, and bulk data operations. Supports connection pooling, SSL/TLS security, and configurable permissions for database operations.6Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to interact with Snowflake databases through SQL queries, table previews, and metadata operations. Features built-in safety checks that block destructive operations and intelligent error handling optimized for AI workflows.1MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to query and explore Vertica databases through natural language with readonly protection by default. Supports SQL execution, schema discovery, large dataset streaming, and Vertica-specific optimizations like projection awareness.158MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to securely interact with multiple databases (MySQL, PostgreSQL) via natural language queries, with cross-database querying and enterprise-grade security.14MIT