Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Descripción del creador (original en inglés)
Query and manage Apache Pinot through MCP with typed tools and preview-first safety.
Estos tres nunca se combinan en una sola puntuación: las opiniones, las mediciones y la popularidad son cosas distintas.
Todavía no escribimos un resumen sencillo para este. Abajo están los datos que leímos del registro.
Elige la app de IA que usas y copia la configuración.
PINOT_CONTROLLER_URL, PINOT_BROKER_URL, PINOT_USERNAME, PINOT_PASSWORD, PINOT_TOKEN, PINOT_USE_MSQE, MCP_TRANSPORT, AUTH_PROVIDERLos valores marcados como secretos son llaves de tu cuenta. Nunca los compartas ni los pegues en un chat.
Necesitas
¿Qué app usas?
Elige tu app arriba. La recordamos, así que la próxima vez el botón dirá “Instalar en …”.
Abre Claude Desktop → Settings → Developer → Edit Config y pega esto en claude_desktop_config.json
{
"mcpServers": {
"pinot": {
"command": "uvx",
"args": [
"mcp-pinot-server"
],
"env": {
"PINOT_CONTROLLER_URL": "your-value",
"PINOT_BROKER_URL": "your-value",
"PINOT_USERNAME": "your-value",
"PINOT_PASSWORD": "your-value",
"PINOT_TOKEN": "your-value",
"PINOT_USE_MSQE": "your-value",
"MCP_TRANSPORT": "your-value",
"AUTH_PROVIDER": "your-value"
}
}
}
}Ejecuta esto en tu terminal
claude mcp add pinot --env PINOT_CONTROLLER_URL=your-value --env PINOT_BROKER_URL=your-value --env PINOT_USERNAME=your-value --env PINOT_PASSWORD=your-value --env PINOT_TOKEN=your-value --env PINOT_USE_MSQE=your-value --env MCP_TRANSPORT=your-value --env AUTH_PROVIDER=your-value -- uvx mcp-pinot-serverCompleta los valores vacíos antes de ejecutarlo.
Pégalo en .cursor/mcp.json de tu proyecto, o en ~/.cursor/mcp.json
{
"mcpServers": {
"pinot": {
"command": "uvx",
"args": [
"mcp-pinot-server"
],
"env": {
"PINOT_CONTROLLER_URL": "your-value",
"PINOT_BROKER_URL": "your-value",
"PINOT_USERNAME": "your-value",
"PINOT_PASSWORD": "your-value",
"PINOT_TOKEN": "your-value",
"PINOT_USE_MSQE": "your-value",
"MCP_TRANSPORT": "your-value",
"AUTH_PROVIDER": "your-value"
}
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Pégalo en .vscode/mcp.json de tu proyecto
{
"servers": {
"pinot": {
"type": "stdio",
"command": "uvx",
"args": [
"mcp-pinot-server"
],
"env": {
"PINOT_CONTROLLER_URL": "your-value",
"PINOT_BROKER_URL": "your-value",
"PINOT_USERNAME": "your-value",
"PINOT_PASSWORD": "your-value",
"PINOT_TOKEN": "your-value",
"PINOT_USE_MSQE": "your-value",
"MCP_TRANSPORT": "your-value",
"AUTH_PROVIDER": "your-value"
}
}
}
}Tu navegador te pide permiso para abrir la app; luego la app muestra la configuración y te pide confirmar. Los valores de las claves quedan vacíos para que los completes tú.
Este se ejecuta en tu computadora, y ChatGPT solo puede conectarse a servidores en internet. Elige otra app.
Tu elección se guarda en una cookie en este dispositivo; no necesitas cuenta.
PINOT_CONTROLLER_URL envPINOT_BROKER_URL envPINOT_USERNAME envPINOT_USE_MSQE envMCP_TRANSPORT envAUTH_PROVIDER envEsta configuración se genera a partir de la ficha del creador en el registro. Si el README dice otra cosa, sigue el README.
Se ejecuta en tu computadora; la lista de herramientas aparece en tu app de IA después de instalarlo.
Revisamos información que cualquiera puede ver; no hemos leído el código. Las revisiones que no aplican no se cuentan. · Revisado el 7 nov 2026
El nombre en el registro se verificó con la cuenta de GitHub startreedata, dueña del repo
Todavía no hemos leído este repo en GitHub
Todavía no hemos leído este repo en GitHub
Este se ejecuta en tu computadora; no hay endpoint en internet
Se ejecuta en tu computadora y usa ajustes locales en su lugar
Se ejecuta en tu computadora; solo podemos leer listas de herramientas de endpoints en internet
Comparado con todos los servidores activos de esta categoría en el registro. Las estrellas solo cuentan cuando quien lo publica es dueño del repo.
Superó 1 de 1 revisiones básicas aplicables. No hemos leído el código. Antes de agregar una clave o un token, revisa qué acceso pide el servidor y usa una clave que tenga solo los permisos que necesitas.
Debes completar: PINOT_PASSWORD, PINOT_TOKEN
Se ejecuta en tu computadora. Tu app de IA lo inicia cuando hace falta, y los datos no pasan por los servidores del creador (a menos que el propio servidor llame a un servicio en línea).
El repo de GitHub cambió por última vez –, y la última versión (5.0.0) llegó al registro hace 27 días.
Las apps compatibles con MCP, como Claude Desktop, Claude Code, Cursor y VS Code. También necesitas Python (uv), Docker en tu computadora.
En la misma categoría: Spec Driven Development, Remote Desktop Commander, Qemu MCP
Servidores de la misma categoría hechos por otros creadores, ordenados por estrellas.
Cómo leer una tarjeta:★ Estrellas de GitHubiTres pilares: reseñas · revisiones · usoiActualizado = fecha en que se publicó la última versión en el registroi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Boot and drive QEMU VMs from an AI agent: keys, screenshots, serial. No guest agent.
Copiado tal cual del repo del creador. PopNx MCP no lo ha revisado ni lo respalda. Se quitaron HTML, imágenes y scripts. Los enlaces llevan fuera de este sitio.
This project is a Python-based Model Context Protocol (MCP) server for interacting with Apache Pinot. It is built using the FastMCP framework. It is designed to integrate with Claude Desktop to enable real-time analytics and metadata queries on a Pinot cluster.
It allows you to
dry_run; always preview the exact target and payload before applying. Applying requires the preview's short-lived, one-time confirmation_token, including for table-filter reloads. A preview is not a guarantee that Pinot will accept the later write.get_schema and get_table_config independently.Tool names are case-sensitive and use underscores. Version 4 renamed four tools to make every operation verb-first; clients using the former noun-first names must update their calls.
| Tool | Purpose |
|---|---|
test_connection | Diagnose broker, controller, and query connectivity. |
list_tables | List visible Pinot table names. |
get_schema | Get one table's column schema. |
get_table_config | Get one table's indexing and ingestion configuration. |
get_table_size | Get reported and estimated storage size for one table. |
list_segments | List exact segment names for one table. |
list_segment_metadata | Page through metadata for a table's segments. |
get_segment_index_metadata | Inspect per-column indexes for one exact segment. |
read_query | Run one read-only Pinot SQL query. |
begin_investigation / query_incident | Open and query an opt-in scoped evidence run. |
get_trace / finish_investigation | Fetch recorded span edges and close with citations. |
create_schema / update_schema | Preview or apply schema changes. |
create_table_config / update_table_config | Preview or apply table-config changes. |
reload_table_filters | Preview or apply the configured table-filter YAML. |
For every schema, table-config, or table-filter change, first call the same tool with dry_run=true, present the preview to the user, and call it with dry_run=false and the preview's one-time confirmation_token only after confirmation. Editing a table-filter file after preview invalidates its token. Pinot performs authoritative validation during table/schema apply calls, so a write can still fail after a successful preview.
read_query returns the existing page fields plus metadata. For example, {"query":"SELECT service, count(*) FROM events GROUP BY service","limit":20} returns metadata.completeness as complete, partial, or unknown, along with native server counts, query ID, query SHA-256, and bounded execution statistics. Missing resultTable or required execution flags remains unknown. A partial server response or group limit remains partial; an empty page is not proof of healthy telemetry. Native complete describes this bounded SQL execution, not coverage of the incident window or the entire dataset. row_limit_reached is separate from execution completeness and paging.
The MCP query path uses pinotdb>=9.2.1 through cursor.execute_native() for submission and decoding. The SDK exposes full structured query_statistics; MCP projects bounded counters and safe execution evidence into the tool response. The path submits once and does not switch transports after an ambiguous failure. Its unique clientQueryId and applicationName=mcp-pinot support optional correlation with query history or broker logs when available. Python integrations can call execute_query_with_metadata(..., timeout_seconds=5) to bound native and HTTP timeouts without modifying shared configuration. HTTP timeouts are inactivity limits; late results are rejected, but this is not native cancellation.
Tool results, including tool errors, include timing evidence in the standard MCP response _meta["io.github.startreedata/mcp-pinot"]. Existing tool data and output schemas are preserved. For example, this response metadata fragment requires no log access:
{
"_meta": { "io.github.startreedata/mcp-pinot": { "request_id": "38cb1444b20c446a96bc272531f34518", "status": "success", "admitted": true, "queue_wait_ms": 12, "execution_ms": 84, "duration_ms": 97 } } }
MCP rate-limit protocol errors preserve their JSON-RPC code and message and carry the same envelope in error.data._meta["io.github.startreedata/mcp-pinot"]. Other transport/protocol failures or cancellation may not produce a tool result.
With MCP_TRANSPORT=http on the default port 8080, a FastMCP Python client reads wire _meta through result.meta. call_tool_mcp also returns tool errors:
from fastmcp import Client
async def read_timing(): async with Client("http://localhost:8080/mcp") as client: result = await client.call_tool_mcp("read_query", {"query": "SELECT 1"}) return result.meta["io.github.startreedata/mcp-pinot"]
Orchestrators should read .meta and forward this evidence to the agent when the host does not automatically surface protocol metadata.
queue_wait_ms measures only waiting for the MCP concurrency semaphore. execution_ms measures the admitted MCP tool pipeline, including SDK HTTP work and validation; admitted=false means that pipeline never started. duration_ms covers the server's tool invocation, including admission checks, and excludes model reasoning and client delivery. status is success or error for the MCP outcome; for read_query, separately inspect metadata.completeness.
An agent can use queue_wait_ms to identify MCP admission delay, then inspect read_query's metadata.native_stats.timeUsedMs for Pinot's native query duration when present. Native query time overlaps execution_ms; their different timer boundaries do not support exact network-overhead subtraction. The shared request_id also appears in query metadata and native clientQueryId, enabling optional history/log correlation when more context is needed.
Response timing metadata contains no secrets, principal identifiers, tool arguments, SQL, or rows. Audit logs record the same timings with hashed principal identifiers. MCP_MAX_RESPONSE_BYTES limits the tool payload before this bounded timing envelope is added; it excludes the added observability metadata. Cancellation is audit-only when no response is returned and does not prove that Pinot execution stopped.
Incident tools are disabled until the server starts with --incident-profiles. See the incident evidence guide and example profile for configuration and a workflow using begin_investigation, query_incident, optional get_trace, and finish_investigation. Evidence queries expose the same response _meta timings and native request IDs when reported; log access is optional. Runs are owner-bound and budgeted; complete execution still leaves root-cause hypotheses and dataset coverage unvalidated. This first version uses bounded in-memory state in one process.
See Pinot MCP in action below:
Prompt: Can you do a histogram plot on the GitHub events against time
Once Claude is running, click the hammer 🛠️ icon and try these prompts:
uv is a fast Python package installer and resolver, written in Rust. It's designed to be a drop-in replacement for pip with significantly better performance.
curl -LsSf https://astral.sh/uv/install.sh | sh
# Clone the repository
git clone https://github.com/startreedata/mcp-pinot.git cd mcp-pinot uv pip install -e . # Install dependencies
The MCP server expects a uvicorn config style .env file in the root directory to configure the Pinot cluster connection. This repo includes a sample .env.example file that assumes a pinot quickstart setup.
mv .env.example .env
The server loads configuration from environment variables and from a .env file found from the current working directory. Process environment variables take precedence over .env, so deployment-time settings cannot be silently replaced by a checked-out file.
| Use case | Required settings | Notes | ||
|---|---|---|---|---|
| Claude Desktop | MCP_TRANSPORT=stdio | Default and recommended for local desktop use; no HTTP listener is started. | ||
| Local HTTP | MCP_TRANSPORT=http, MCP_HOST=127.0.0.1 | Explicit local web profile. Accessible only from the same machine. | ||
| Remote HTTP/HTTPS | MCP_TRANSPORT=http, MCP_HOST=0.0.0.0, MCP_ALLOWED_HOSTS= , AUTH_PROVIDER=oauth\ | static\ | oauth+static | The server refuses non-loopback HTTP/HTTPS binds unless an auth provider is active, and a wildcard bind requires an explicit Host allowlist. Use oauth+static to serve interactive users and one trusted backend at once. Use TLS directly or an authenticated reverse proxy. |
| Helm exposure | service.enabled=true, mcp.host=0.0.0.0, mcp.oauth.enabled=true | Helm defaults are local-only and render no Service unless exposure is explicitly enabled. |
Solo se muestra el principio; lee el resto en el repo