Apache Pinot MCP Server
OCI · GHCR.IO/STARTREEDATA/MCP-PINOT:4.0.0 · 2 COMPONENTS · SCANNED AUG 3
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 →
Supply Chain Security0
- Malware scan not yet available for this package.Unverified
- CVE data not yet available for this package.Unverified
- Install-script risk not yet assessed.Unverified
- Dependency-health data not yet available.Unverified
Provenance & Transparency45
- 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
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 6 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability78
- 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 Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
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
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Unverified: 2 categories
Categories scored 0 because we could not verify them: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
oci · ghcr.io/startreedata/mcp-pinot:4.0.0
claude mcp add startreedata-mcp-pinot -- docker run --rm -i ghcr.io/startreedata/mcp-pinot:4.0.0
codex mcp add startreedata-mcp-pinot -- docker run --rm -i ghcr.io/startreedata/mcp-pinot:4.0.0
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"startreedata-mcp-pinot": {
"type": "local",
"command": [
"docker",
"run",
"--rm",
"-i",
"ghcr.io/startreedata/mcp-pinot:4.0.0"
],
"enabled": true
}
}
} mcp_servers:
startreedata-mcp-pinot:
command: "docker"
args: ["run", "--rm", "-i", "ghcr.io/startreedata/mcp-pinot:4.0.0"] {
"mcpServers": {
"startreedata-mcp-pinot": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"ghcr.io/startreedata/mcp-pinot:4.0.0"
]
}
}
} 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.
- 31 Jul 26 −5
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 28 Jul 26 +34
- Schema quality: unverified → 100 ▲ functional
- Tool coverage: unverified → 100 ▲ functional
- First check of Schema quality: fail functional
- First check of Tool coverage: 100 functional
- First check of Schema quality: excellent functional
- First check of Schema quality: fail functional
- First check of Tool coverage: 100 functional
- 27 Jul 26 11
First indexed and scored.
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 3 Aug 2026 · Analysed oci/ghcr.io/startreedata/mcp-pinot:4.0.0
Provenance none
Ecosystem: oci · Outcome: none
Reason: no_attestation
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.
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 a broker connection was established. |
| error | — | — | Error message when a check failed, else null. |
| query_test | boolean | — | True when a trivial 'SELECT 1' succeeded. |
| 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.