A production-grade MCP server for Apache Pinot enabling query execution, table inspection, and cluster management
The Pinot MCP server has solid fundamentals: all 31 tools are explicitly registered with schemas and descriptions. However, there are critical issues that prevent a higher score. First, the server defines duplicate/near-duplicate tools (list_tables vs list-tables, pause_consumption appears 3 times across files, resume_consumption appears 3 times). This violates the single-responsibility principle and forces LLMs to disambiguate between functionally identical tools. Second, naming is inconsistent: some tools use snake_case (list_tables, get_table_size), others use kebab-case (list-tables, table-details, segment-list), and parameter names vary (table_name vs tableName, partition_group_ids vs partitions). Third, while descriptions exist for all tools, many lack critical detail about when to use them, prerequisites, or how they relate to similar tools. For example, update_table_config and confirm_update_table_config lack clear documentation of the confirmation token workflow. Fourth, some parameter descriptions are minimal (e.g., 'Table configuration updates' for the config parameter in update_table_config). Fifth, output schemas are not consistently documented in the visible code, while tool descriptions mention what they return, full schema documentation is absent. Error handling descriptions are sparse, tools don't explain what happens on failure or how to recover. The server does implement tool annotations (seen in imports: ToolAnnotations, readOnlyHint, destructiveHint), which is positive. Overall: good structure, but consistency and clarity issues prevent this from being production-grade.
Confirm and apply a previously previewed table configuration update using a confirmation token
Diagnose the connection to the Pinot cluster and report health status
Force commit the current consuming segments
Force commit the current consuming segments of a realtime table
Get status of consumers from all servers for a realtime table
Gets the status of consumers from all servers for a realtime table
Duplicate tool definitions across files (pause_consumption, resume_consumption, force_commit, get_pause_status, get_consuming_segments_info defined in both mcp_pinot/server.py and mcp_pinot_ops/server.py). LLMs cannot disambiguate between identical or near-identical tools with different names (snake_case vs kebab-case). This violates the single-responsibility principle and creates confusion.
Inconsistent naming convention: some tools use snake_case (list_tables, get_table_size), others use kebab-case (list-tables, table-details, segment-list). Parameter naming also varies (table_name vs tableName, partitions vs segments). This inconsistency forces LLMs to reason about name mappings and increases error rates.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 74 | 2026-07-28+ | v2 |
| 2026-07-08 | B | 71 | - | v1 |
Get the pause status of a realtime table
Return pause status of a realtime table
Retrieve the schema for a specified table including column types and metadata
Get index and column details for a specific segment
Get metadata for segments of a table including retention and status information
Get the configuration details for a specified table
Get size and row count details for a specified table
Get index/column details for a segment
List all tables in Pinot
List all segments for a specified table with metadata
List all tables available in the Pinot cluster
Pause consumption on a realtime table
Pause consumption of a realtime table
Execute a read-only SQL query against Pinot tables with pagination support
Rebalances a table (reassign instances and segments)
Rebalance a table by reassigning instances and segments
Reload all segments for a table (applies config changes, can force download)
Reload all segments for a table to apply configuration changes
Resume consumption on a paused realtime table
Resume consumption of a realtime table
List segments for a table
Get metadata for segments of a table
Get table size details
Get table config and schema
Update table configuration with preview and confirmation token requirement
Parameter descriptions are often minimal. Example: 'config' in update_table_config is described as 'Table configuration updates' but does not specify what fields are valid, what format is expected, or what constraints apply. This forces LLMs to guess or make invalid requests.
Confirmation token workflow (update_table_config → confirm_update_table_config) is not well-documented. The relationship between these tools, the lifetime of the token, and failure modes are unclear. Agents may not understand when to call confirm vs. retry update.
Output schemas are not visible in the provided code. While tool descriptions mention return types (e.g., 'Get size and row count details'), the full JSON schema for responses is not documented. This makes it impossible for LLMs to know what fields to extract for downstream tool calls.
Error handling guidance is absent from tool descriptions. Tools do not explain what happens on failure (e.g., invalid table name, connection timeout, authorization denied) or how to recover. An LLM receives a raw error with no recovery path.
Some tools accept optional string parameters without enum constraints. Example: force_commit's 'partitions' and 'segments' are free-form strings. force_commit's 'consume_from' in resume_consumption is better (has enum), but others like 'consume_from' are missing in older resume_consumption definition. This invites hallucinated values.
Tool relationships and prerequisites are not documented. For example, before calling update_table_config, should the LLM first call get_table_config to validate the change? The workflow is implicit.