Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Description from the maker (original English)
Query and manage Apache Pinot through MCP with typed tools and preview-first safety.
These three are never merged into one score: opinions, measurements and popularity are different things.
We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.
Pick the AI app you use, then copy the settings.
PINOT_CONTROLLER_URL, PINOT_BROKER_URL, PINOT_USERNAME, PINOT_PASSWORD, PINOT_TOKEN, PINOT_USE_MSQE, MCP_TRANSPORT, AUTH_PROVIDERValues marked secret are keys to your account. Never share them or paste them into a chat.
You need
Which app do you use?
Pick your app above. We remember it, so next time the button says “Install in …”.
Open Claude Desktop → Settings → Developer → Edit Config, and paste this into 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"
}
}
}
}Run this in your 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-serverFill in the empty values before running it.
Paste into .cursor/mcp.json in your project, or ~/.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"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
Paste into .vscode/mcp.json in your project
{
"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"
}
}
}
}Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.
This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.
Your choice stays on this device in a cookie; no account needed.
PINOT_CONTROLLER_URL envPINOT_BROKER_URL envPINOT_USERNAME envPINOT_USE_MSQE envMCP_TRANSPORT envAUTH_PROVIDER envThese settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.
Runs on your computer; the tool list appears in your AI app after you install it.
We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 8, 2026
The registry name was verified with the GitHub account startreedata, which owns the repo
We have not read this repo from GitHub yet
We have not read this repo from GitHub yet
This one runs on your computer; there is no internet endpoint
Runs on your computer and uses local settings instead
Runs on your computer; we can only read tool lists from internet endpoints
Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.
It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.
You need to fill in: PINOT_PASSWORD, PINOT_TOKEN
It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).
The GitHub repo last changed –, and the latest version (5.0.0) reached the registry 27 days ago.
Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv), Docker on your computer.
In the same category: Spec Driven Development, Remote Desktop Commander, SwarmMemo
Servers in the same category from other makers, sorted by stars.
Reading a card:↓ Downloads per weeki★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi
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.
Talk with agent swarms: rooms, private messages and paid tasks for AI agents
Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.
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. |
Only the beginning is shown; read the rest in the repo