Apache Pinot MCP Server
PYPI · MCP-PINOT-SERVER · 2 COMPONENTS · SCANNED SEP 20
Query and manage Apache Pinot through MCP with typed tools and preview-first safety.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security50
- Malware scan not yet available for this package.Unverified
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs setuptools.build_meta at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 2 of 49 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency35
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 21 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability80
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 2807 tokens (~187/item across 15 items; 14 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management87
- Stability observed for 26 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 14 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 16 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the Apache Pinot MCP Server server?
Apache Pinot MCP Server runs locally as a PyPI package, launched with uvx mcp-pinot-server. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · mcp-pinot-server
claude mcp add startreedata-mcp-pinot -- uvx mcp-pinot-server
{
"mcpServers": {
"startreedata-mcp-pinot": {
"command": "uvx",
"args": [
"mcp-pinot-server"
]
}
}
} {
"servers": {
"startreedata-mcp-pinot": {
"command": "uvx",
"args": [
"mcp-pinot-server"
]
}
}
} codex mcp add startreedata-mcp-pinot -- uvx mcp-pinot-server
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"startreedata-mcp-pinot": {
"type": "local",
"command": [
"uvx",
"mcp-pinot-server"
],
"enabled": true
}
}
} openclaw mcp add startreedata-mcp-pinot --command uvx --arg mcp-pinot-server
mcp_servers:
startreedata-mcp-pinot:
command: "uvx"
args: ["mcp-pinot-server"] {
"McpServers": {
"startreedata-mcp-pinot": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"mcp-pinot-server"
]
}
}
} assistant mcp add startreedata-mcp-pinot -t stdio -c uvx -a mcp-pinot-server
{
"mcpServers": {
"startreedata-mcp-pinot": {
"command": "uvx",
"args": [
"mcp-pinot-server"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 −2
- Stability: pass → 0.80 functional
- 17 Sept 26 0
- Stability: 0.97 → pass security
- 16 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 14 Sept 26 −15
- Malware scan: pass → unverified ▼ security
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 12 Sept 26 +15
- Malware scan: unverified → pass ▲ security
- 11 Sept 26 −17
- Malware scan: pass → unverified ▼ security
- Stability: pass → 0.80 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed pypi/mcp-pinot-server@5.0.0b1
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | setuptools.build_meta |
Background: Why install scripts are a supply-chain risk →
Dependencies 49 packages
| Packages resolved | 49 |
|---|---|
| Stale | 1 |
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
create_schema Create schema ~154
Preview or create a new Pinot schema without replacing an existing schema. The default preview performs strict local structural validation and returns a short-lived confirmation token bound to the exact normalized schema. Pass that token with ``dry_run=false`` to apply. Replacement belongs in ``update_schema``. Failure recovery: Invalid JSON, missing ``schemaName``, and controller validation failures are non-retryable until corrected. Permission failures require access changes; retry transient controller failures only after connectivity is restored.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation_token | – | – | Token returned by a preview of this exact payload. |
| dry_run | boolean | – | Preview safely (default); false requests application. |
| schema | object | yes | Structured Pinot schema. schemaName is required. |
| Name | Type | Req | Description |
|---|---|---|---|
| applied | boolean | – | True only when Pinot accepted a mutating request. |
| confirmation_token | – | – | Short-lived token bound to this exact preview; required to apply it. |
| dry_run | boolean | – | True when no mutation was sent to Pinot. |
| message | – | – | Human-readable detail, when provided. |
| operation | string | yes | Stable operation identifier. |
| resource_name | string | yes | Exact schema or table name targeted. |
| resource_type | string | yes | Kind of Pinot resource targeted by the operation. |
| response_summary | – | – | Sanitized summary returned by the Pinot controller. |
| status | string | – | Whether the operation was previewed, applied, or rejected. |
| verification_tool | string | yes | Read tool to call after a successful mutation. |
| warnings | array | – | Safety or validation warnings. |
No examples provided.
create_table_config Create table config ~136
Create a new Pinot table configuration. Accepts a typed table-config object. The default ``dry_run=true`` asks Pinot to validate the payload and returns a confirmation token without applying. Failure recovery: Invalid JSON, missing ``tableName``, and controller validation failures need a corrected payload; do not retry unchanged. Fix access failures first, and retry transient controller errors after connectivity is restored.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation_token | – | – | Token returned by a preview of this exact payload. |
| dry_run | boolean | – | Preview safely (default); false requests application. |
| table_config | object | yes | Complete structured Pinot table configuration. |
| Name | Type | Req | Description |
|---|---|---|---|
| applied | boolean | – | True only when Pinot accepted a mutating request. |
| confirmation_token | – | – | Short-lived token bound to this exact preview; required to apply it. |
| dry_run | boolean | – | True when no mutation was sent to Pinot. |
| message | – | – | Human-readable detail, when provided. |
| operation | string | yes | Stable operation identifier. |
| resource_name | string | yes | Exact schema or table name targeted. |
| resource_type | string | yes | Kind of Pinot resource targeted by the operation. |
| response_summary | – | – | Sanitized summary returned by the Pinot controller. |
| status | string | – | Whether the operation was previewed, applied, or rejected. |
| verification_tool | string | yes | Read tool to call after a successful mutation. |
| warnings | array | – | Safety or validation warnings. |
No examples provided.
get_schema Get schema ~151
Get one Pinot schema, including dimensions, metrics, time, and primary keys. This is a single-object lookup, not a list, so pagination does not apply. The output preserves additional fields introduced by the connected Pinot version. Failure recovery: For not-found errors, pass the table's exact schema name (normally the table name without a type suffix). Fix permissions before retrying; retry transient controller failures after ``test_connection`` succeeds.
| Name | Type | Req | Description |
|---|---|---|---|
| schema_name | string | yes | Exact Pinot schema name. It normally matches the table name without an _OFFLINE/_REALTIME suffix; use letters, digits, hyphens, or underscores, optionally prefixed by one 'database.' qualifier. |
| Name | Type | Req | Description |
|---|---|---|---|
| dateTimeFieldSpecs | – | – | Date/time column specifications. |
| dimensionFieldSpecs | – | – | Dimension (attribute) column specifications. |
| metricFieldSpecs | – | – | Metric (aggregatable measure) column specifications. |
| primaryKeyColumns | – | – | Primary key columns, for upsert-enabled tables. |
| schemaName | – | – | The schema name. |
No examples provided.
get_segment_index_metadata Index/column details ~262
Get per-column index metadata for ONE segment (which indexes each column has). Use this to inspect how a specific segment is indexed (inverted, sorted, range, etc.). Requires a ``segment_name`` from ``list_segments``. For a segment's row count/size/time boundaries use ``list_segment_metadata``; for the table's declared index *configuration* (not per-segment state) use ``get_table_config``. Failure recovery: A missing segment is non-retryable with the same value; refresh ``list_segments`` and use an exact returned name. Retry transient controller errors after ``test_connection`` succeeds.
| Name | Type | Req | Description |
|---|---|---|---|
| segment_name | string | yes | Exact, case-sensitive opaque segment name returned by list_segments; do not construct, trim, or add a table-type suffix. Pinot defines the length and characters, so this client only requires non-empt… |
| table_name | string | yes | Exact Pinot table name, without _OFFLINE/_REALTIME. Use letters, digits, hyphens, or underscores, optionally prefixed by one 'database.' qualifier; whitespace is invalid and '__' is reserved by Pinot… |
| Name | Type | Req | Description |
|---|---|---|---|
| columns | – | – | Per-column metadata for the segment, when present. |
| indexes | – | – | Per-column index metadata (index types present on each column). |
No examples provided.
get_table_config Get table config ~193
Get one table's indexing, retention, tenant, and ingestion configuration. This is a single-object lookup, not a list, so pagination does not apply. Set ``table_type`` only when one side of a hybrid table is needed. Failure recovery: For not-found errors, use an exact name from ``list_tables`` and a valid table type. Fix permissions before retrying; retry transient controller failures after ``test_connection`` succeeds.
| Name | Type | Req | Description |
|---|---|---|---|
| table_name | string | yes | Exact Pinot table name, without _OFFLINE/_REALTIME. Use letters, digits, hyphens, or underscores, optionally prefixed by one 'database.' qualifier; whitespace is invalid and '__' is reserved by Pinot… |
| table_type | – | – | Restrict to one table type; omit to return both when present. |
| Name | Type | Req | Description |
|---|---|---|---|
| offline | – | – | OFFLINE configuration, when present/requested. |
| realtime | – | – | REALTIME configuration, when present/requested. |
| table_name | string | yes | Base table name requested by the caller. |
No examples provided.
get_table_size Table size details ~206
Get a table's storage footprint: reported vs. estimated size in bytes. Use this for capacity/size questions about a whole table. It does NOT list segments (use ``list_segments``) or return row counts/time boundaries (use ``list_segment_metadata``). ``reportedSizeInBytes`` is what the servers currently hosting the segments report; ``estimatedSizeInBytes`` assumes every replica is present. Failure recovery: For not-found errors, copy an exact name from ``list_tables``. Fix permission errors before retrying; retry transient controller failures after a health check.
| Name | Type | Req | Description |
|---|---|---|---|
| table_name | string | yes | Exact Pinot table name, without _OFFLINE/_REALTIME. Use letters, digits, hyphens, or underscores, optionally prefixed by one 'database.' qualifier; whitespace is invalid and '__' is reserved by Pinot… |
| Name | Type | Req | Description |
|---|---|---|---|
| estimatedSizeInBytes | – | – | Estimated size assuming every replica is present, in bytes. |
| reportedSizeInBytes | – | – | Size reported by the servers currently hosting the table's segments, in bytes. |
| tableName | – | – | The table name. |
No examples provided.
list_segment_metadata Segment metadata ~214
Get a deterministic page of segment rows, sizes, and time boundaries. Pinot can return thousands of segment objects. Results are sorted by exact segment name, then sliced with ``limit``/``offset``; follow ``has_more`` until false. Use ``list_segments`` when only names are needed. Failure recovery: An empty page is success. For not-found errors, use ``list_tables``; correct permissions before retrying, and retry transient server failures only after ``test_connection`` succeeds.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum segment metadata objects in this page. |
| offset | integer | – | Zero-based segment offset for pagination. |
| table_name | string | yes | Exact Pinot table name, without _OFFLINE/_REALTIME. Use letters, digits, hyphens, or underscores, optionally prefixed by one 'database.' qualifier; whitespace is invalid and '__' is reserved by Pinot… |
| Name | Type | Req | Description |
|---|---|---|---|
| has_more | boolean | yes | True when more fetched segment metadata remains after this page. |
| offset | integer | yes | Zero-based index of the first returned segment. |
| returned_segments | integer | yes | Number of segment metadata objects in this page. |
| segments | object | – | Metadata keyed by exact segment name. Values can include row counts, sizes, time boundaries, and column/index details returned by Pinot. |
| total_segments | integer | yes | Total segment metadata objects fetched before paging. |
No examples provided.
list_segments List segments ~263
List a table's segment names, grouped by table type (OFFLINE/REALTIME). Use this to discover segment names — e.g. to get a ``segment_name`` for ``get_segment_index_metadata``, or to see how a table is partitioned. For per-segment row counts / sizes / time boundaries call ``list_segment_metadata`` instead; for total storage call ``get_table_size``. Segment names are paginated (a busy table can have thousands) — use ``limit``/``offset`` and the ``has_more`` flag to page through them. Failure recovery: An empty page is success. For not-found errors, use an exact name from ``list_tables``; correct access errors, or retry transient controller errors.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum segment names to return in this page. |
| offset | integer | – | Zero-based offset for pagination. |
| table_name | string | yes | Exact Pinot table name, without _OFFLINE/_REALTIME. Use letters, digits, hyphens, or underscores, optionally prefixed by one 'database.' qualifier; whitespace is invalid and '__' is reserved by Pinot… |
| Name | Type | Req | Description |
|---|---|---|---|
| OFFLINE | – | – | OFFLINE segment names in this page, when present. |
| REALTIME | – | – | REALTIME segment names in this page, when present. |
| has_more | – | – | True when more segments remain beyond this page. |
| offset | – | – | Zero-based offset of the first segment in this page. |
| returned_segments | – | – | Number of segment names returned in this page. |
| total_segments | – | – | Total segments across all types before paging. |
No examples provided.
list_tables List tables ~113
List Pinot tables visible to this server (subject to table filters). Returns a paginated list of table names. Use ``limit``/``offset`` and the ``has_more`` flag to page through clusters with many tables. Failure recovery: An empty page is success. For authentication/connectivity errors, verify the controller with ``test_connection`` and retry after access is restored.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum tables to return in this page. |
| offset | integer | – | Zero-based offset for pagination. |
| Name | Type | Req | Description |
|---|---|---|---|
| has_more | boolean | yes | True when more tables remain beyond this page. |
| offset | integer | yes | Zero-based index of the first returned table. |
| table_count | integer | yes | Number of tables in this page. |
| tables | array | – | Table names in this page. |
| total_tables | integer | yes | Total tables visible to this server. |
No examples provided.
read_query Read query ~242
Run a read-only SQL query against Pinot and return a page of rows. Only a single SELECT (or WITH ... SELECT) statement is allowed; the query is rejected if it contains multiple statements or write/DDL/admin keywords. Results are paginated to keep responses small — use ``limit``/``offset`` and the ``has_more`` flag to page through large result sets. Returns ``QueryResult`` with the page of rows, the column list, fetched row count, and a ``has_more`` flag. Failure recovery: SQL/allow-list/permission failures require correcting the query or access; do not retry unchanged. A timeout or connection failure can be retried after ``test_connection`` succeeds. Zero rows is a successful result.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum rows to return in this page. |
| offset | integer | – | Zero-based row offset for pagination. |
| query | string | yes | A single read-only statement in Pinot SQL: 'SELECT ...' or 'WITH ... SELECT ...'. Stacked statements and DML/DDL/admin keywords (INSERT, UPDATE, DELETE, DROP, SET, ...) are rejected. |
| Name | Type | Req | Description |
|---|---|---|---|
| columns | array | – | Column names, in result order. |
| has_more | boolean | yes | True when more fetched rows remain beyond this page (not necessarily more rows in the underlying table). |
| offset | integer | yes | Zero-based index of the first returned row. |
| row_count | integer | yes | Number of rows returned in this page. |
| rows | array | – | Rows in this page; each row maps column name to value. |
| total_rows | integer | yes | Rows the query returned before this page was sliced. Pinot may have already applied its own LIMIT, so this is rows fetched, not the table total. |
| truncated | boolean | – | True when the server-enforced fetch bound truncated the result. |
No examples provided.
reload_table_filters Reload table filters ~252
Preview or apply the configured table-filter YAML without restarting. Reads only the path configured by ``PINOT_TABLE_FILTER_FILE``. The YAML must be an object whose ``included_tables`` value is a non-empty list of glob strings. Allowing every table requires an explicit ``allow_all: true``. The default ``dry_run=true`` validates and reports the before/after patterns and returns a short-lived confirmation token. Pass ``dry_run=false`` with that token to apply the exact candidate atomically. Editing the file after preview invalidates the confirmation and requires another preview. Returns: Preview/application status, whether it was applied, old/new patterns, and a confirmation token on previews. Failure recovery: A missing setting/file or malformed YAML is non-retryable until corrected; fix ``PINOT_TABLE_FILTER_FILE`` or its ``included_tables`` list, then retry.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation_token | – | – | One-time token returned by a dry-run preview of the exact current filter-file contents. Required when dry_run is false. |
| dry_run | boolean | – | When true (default), validate and preview the candidate allow-list without changing server state. Pass false explicitly to apply it. |
| Name | Type | Req | Description |
|---|---|---|---|
| applied | boolean | – | True only when the in-memory allow-list was changed. |
| confirmation_token | – | – | Short-lived token bound to this exact filter preview; required to apply. |
| message | string | yes | Human-readable summary of the reload. |
| new_filter_count | integer | – | Number of allowed tables after the reload. |
| new_filters | – | – | Validated candidate patterns; null means all tables. |
| previous_filter_count | integer | – | Number of allowed tables before the reload. |
| previous_filters | – | – | Allow-list patterns active before the operation; null means all. |
| status | string | yes | Whether the candidate filters were previewed, applied, or failed. |
No examples provided.
test_connection Test connection ~93
Probe Pinot connectivity and return diagnostics. Runs three checks — broker connection, a trivial ``SELECT 1`` query, and a controller table listing — and reports which succeeded plus a small sample of tables. Useful for troubleshooting configuration before using other tools. Failure recovery: Individual check failures are returned in ``error``. Verify the broker and controller URLs, credentials, and network, then retry only failed checks.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| connection_test | boolean | – | True when the broker answered, i.e. the query check below succeeded. |
| dbapi_test | boolean | – | Informational: True when the optional pinotdb DB-API probe also succeeded. No tool uses that path, so false here does not mean the deployment is unhealthy — check query_test and tables_test instead. |
| error | – | – | Names the checks that failed, or null when both required checks passed. |
| query_test | boolean | – | True when a trivial 'SELECT 1' succeeded through the same broker path read_query uses. |
| sample_tables | array | – | Up to five example table names. |
| tables_count | – | – | Number of tables discovered, when available. |
| tables_test | boolean | – | True when the controller table listing succeeded. |
No examples provided.
update_schema Update schema ~202
Update an existing Pinot schema. Accepts a typed schema object. This can change column definitions on a live table; the default ``dry_run=true`` previews without applying and returns a confirmation token bound to the exact replacement. Failure recovery: Invalid JSON/name or schema validation failures require a corrected payload; do not retry unchanged. Fix permission errors first, and retry transient controller failures only after connectivity is restored.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation_token | – | – | Token returned by a preview of this exact payload. |
| dry_run | boolean | – | Preview safely (default); false requests application. |
| reload | boolean | – | Reload affected segments after updating. |
| schema | object | yes | Complete replacement schema; schemaName must match. |
| schema_name | string | yes | Exact Pinot schema name. It normally matches the table name without an _OFFLINE/_REALTIME suffix; use letters, digits, hyphens, or underscores, optionally prefixed by one 'database.' qualifier. |
| Name | Type | Req | Description |
|---|---|---|---|
| applied | boolean | – | True only when Pinot accepted a mutating request. |
| confirmation_token | – | – | Short-lived token bound to this exact preview; required to apply it. |
| dry_run | boolean | – | True when no mutation was sent to Pinot. |
| message | – | – | Human-readable detail, when provided. |
| operation | string | yes | Stable operation identifier. |
| resource_name | string | yes | Exact schema or table name targeted. |
| resource_type | string | yes | Kind of Pinot resource targeted by the operation. |
| response_summary | – | – | Sanitized summary returned by the Pinot controller. |
| status | string | – | Whether the operation was previewed, applied, or rejected. |
| verification_tool | string | yes | Read tool to call after a successful mutation. |
| warnings | array | – | Safety or validation warnings. |
No examples provided.
update_table_config Update table config ~215
Update an existing Pinot table configuration. Accepts a typed replacement table-config object. This changes a live table; the default ``dry_run=true`` asks Pinot to validate it, compares it with the current configuration, and returns a token without applying. Failure recovery: Invalid JSON/name or controller validation failures require a corrected payload; do not retry unchanged. Fix access errors first, and retry transient controller failures only after connectivity is restored.
| Name | Type | Req | Description |
|---|---|---|---|
| confirmation_token | – | – | Token returned by a preview of this exact payload. |
| dry_run | boolean | – | Preview safely (default); false requests application. |
| table_config | object | yes | Complete replacement table configuration. |
| table_name | string | yes | Exact Pinot table name, without _OFFLINE/_REALTIME. Use letters, digits, hyphens, or underscores, optionally prefixed by one 'database.' qualifier; whitespace is invalid and '__' is reserved by Pinot… |
| Name | Type | Req | Description |
|---|---|---|---|
| applied | boolean | – | True only when Pinot accepted a mutating request. |
| confirmation_token | – | – | Short-lived token bound to this exact preview; required to apply it. |
| dry_run | boolean | – | True when no mutation was sent to Pinot. |
| message | – | – | Human-readable detail, when provided. |
| operation | string | yes | Stable operation identifier. |
| resource_name | string | yes | Exact schema or table name targeted. |
| resource_type | string | yes | Kind of Pinot resource targeted by the operation. |
| response_summary | – | – | Sanitized summary returned by the Pinot controller. |
| status | string | – | Whether the operation was previewed, applied, or rejected. |
| verification_tool | string | yes | Read tool to call after a successful mutation. |
| warnings | array | – | Safety or validation warnings. |
No examples provided.
What is the Apache Pinot MCP Server server?
Apache Pinot MCP Server is listed in the public MCP registry as io.github.startreedata/mcp-pinot. Query and manage Apache Pinot through MCP with typed tools and preview-first safety. This page covers its PyPI package (mcp-pinot-server).
Is the Apache Pinot MCP Server server safe to use?
Apache Pinot MCP Server scores 67 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Apache Pinot MCP Server server expose?
Apache Pinot MCP Server exposes 14 tools: test_connection, reload_table_filters, read_query, list_tables, get_table_size, and 9 more. Their descriptions and schemas cost roughly 2,696 tokens of context every time the server is loaded.
Is the Apache Pinot MCP Server server still maintained?
Apache Pinot MCP Server is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.