Apache Pinot MCP Server

io.github.startreedata由 GitHub 帳號 startreedata 發布v5.0.0更新於 Oct 24, 2026

Query and manage Apache Pinot through MCP with typed tools and preview-first safety.

已驗證STDIO僅桌面資料庫資料與分析

概覽

AI 產生的概覽

針對 Apache Pinot 的 MCP 伺服器:讓助理列出資料表與區段、檢視 schema 和索引、執行唯讀 SQL,並以先預覽後確認的方式修改 schema 與資料表設定。

可以做什麼
  • 列出資料表、區段與區段中繼資料,檢視欄位層級索引資訊
  • 讀取 schema、資料表設定與資料表儲存大小
  • 每次呼叫執行一筆唯讀 SQL 查詢,並回傳完整性與執行中繼資料
  • 開啟限定範圍的調查執行並取得記錄的 trace span
  • 透過 dry-run 與一次性確認權杖預覽並套用 schema、資料表設定和資料表篩選變更
  • 診斷 broker、controller 與查詢連線狀態
適用情境
適合讓助理在 Claude Desktop 等桌面用戶端中探索與查詢 Pinot 叢集進行即時分析,或在受控流程下修改 schema 與資料表設定。
執行需求
以 stdio 在本機執行(Python 套件或容器),或以 HTTP 方式執行。需要可連線的 Pinot broker 與 controller 位址(PINOT_BROKER_URL、PINOT_CONTROLLER_URL),以及選用的 Pinot 憑證(PINOT_USERNAME、PINOT_PASSWORD、PINOT_TOKEN)。若要將 HTTP 開放至回送位址以外,需設定 AUTH_PROVIDER 等驗證方式(OAuth 或靜態權杖)。
安裝前請注意
變更類工具會修改 schema、資料表設定與資料表篩選規則,預覽成功並不保證 Pinot 會接受後續寫入。Pinot 憑證與 OAuth 用戶端密鑰透過環境變數提供。資料表篩選僅為便利功能而非安全邊界,唯讀 SQL 檢查也只是防護措施,不能取代 Pinot 本身的 ACL。確認權杖與限流狀態僅存於行程內,應只執行單一執行個體。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Apache Pinot MCP Server,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Pinot MCP Server

[Build and Test] [PyPI version] [Python versions] [License: Apache 2.0]

Table of Contents

Overview

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

  • List tables, segments, and schema info from Pinot
  • Execute read-only SQL queries
  • View index/column-level metadata
  • Designed to assist business users via Claude integration
  • and much more.

Features

  • Every tool advertises typed input and output JSON Schemas, MCP risk annotations, and failure-recovery guidance for agent planning.
  • Large query, table, segment-name, and segment-metadata responses use bounded pages with continuation metadata instead of returning unbounded agent context.
  • Read-only SQL is parsed and enforced before execution; validation, permission, and transient connectivity errors are surfaced as actionable MCP errors.
  • Every mutating tool supports 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.
  • Single-purpose schema and table-config inspection tools avoid ambiguous combined operations: use get_schema and get_table_config independently.

MCP Tool Contract

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.

ToolPurpose
test_connectionDiagnose broker, controller, and query connectivity.
list_tablesList visible Pinot table names.
get_schemaGet one table's column schema.
get_table_configGet one table's indexing and ingestion configuration.
get_table_sizeGet reported and estimated storage size for one table.
list_segmentsList exact segment names for one table.
list_segment_metadataPage through metadata for a table's segments.
get_segment_index_metadataInspect per-column indexes for one exact segment.
read_queryRun one read-only Pinot SQL query.
begin_investigation / query_incidentOpen and query an opt-in scoped evidence run.
get_trace / finish_investigationFetch recorded span edges and close with citations.
create_schema / update_schemaPreview or apply schema changes.
create_table_config / update_table_configPreview or apply table-config changes.
reload_table_filtersPreview 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.

[StarTree Server for Apache Pinot MCP server]

Query execution evidence

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:

json
{  "_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:

python
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.

Pinot MCP in Action

See Pinot MCP in action below:

Fetching Metadata

[Pinot MCP fetching metadata]

Fetching Data, followed by analysis

Prompt: Can you do a histogram plot on the GitHub events against time [Pinot MCP fetching data and analyzing table]

Sample Prompts

Once Claude is running, click the hammer 🛠️ icon and try these prompts:

  • Can you help me analyse my data in Pinot? Use the Pinot tool and look at the list of tables to begin with.
  • Can you do a histogram plot on the GitHub events against time

Quick Start

Prerequisites

Install uv (if not already installed)

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.

bash
curl -LsSf https://astral.sh/uv/install.sh | sh
# Reload your bashrc/zshrc to take effect. Alternatively, restart your terminal# source ~/.bashrc

Installation

bash
# Clone the repositorygit clone https://github.com/startreedata/mcp-pinot.gitcd mcp-pinotuv pip install -e . # Install dependencies
# For development dependencies (including testing tools), use:# uv pip install -e .[dev] 

Configure Pinot Cluster

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.

bash
mv .env.example .env

Configuration Reference

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.

Common Profiles

Use caseRequired settingsNotes
Claude DesktopMCP_TRANSPORT=stdioDefault and recommended for local desktop use; no HTTP listener is started.
Local HTTPMCP_TRANSPORT=http, MCP_HOST=127.0.0.1Explicit local web profile. Accessible only from the same machine.
Remote HTTP/HTTPSMCP_TRANSPORT=http, MCP_HOST=0.0.0.0, MCP_ALLOWED_HOSTS=<host[:port]>, AUTH_PROVIDER=oauth|static|oauth+staticThe 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 exposureservice.enabled=true, mcp.host=0.0.0.0, mcp.oauth.enabled=trueHelm defaults are local-only and render no Service unless exposure is explicitly enabled.

Pinot Connection

VariableDefaultDescription
PINOT_CONTROLLER_URLhttp://localhost:9000Pinot controller endpoint used for metadata and table/schema operations.
PINOT_BROKER_URLhttp://localhost:8000Pinot broker endpoint used for SQL queries.
PINOT_BROKER_HOSTParsed from PINOT_BROKER_URLOptional host override for the broker connection.
PINOT_BROKER_PORTParsed from PINOT_BROKER_URLOptional port override for the broker connection.
PINOT_BROKER_SCHEMEParsed from PINOT_BROKER_URLOptional scheme override, usually http or https.
PINOT_USERNAME / PINOT_PASSWORDunsetBasic authentication for Pinot.
PINOT_TOKENunsetBearer or raw token for Pinot; takes precedence over PINOT_TOKEN_FILENAME.
PINOT_TOKEN_FILENAMEunsetFile containing a Pinot token: one line of printable ASCII, with or without a Bearer prefix. The file is re-read as requests are made, so rotated tokens such as projected Kubernetes service account tokens are picked up. If the file cannot be used at startup (missing, empty, unreadable, or invalid), the server logs a warning and runs without token auth until it is restarted. If that happens later, the last token read stays in use and the failure is logged once, not on every request.
PINOT_DATABASEemptyOptional database header for multi-database Pinot deployments.
PINOT_USE_MSQEfalseEnables Pinot multi-stage query engine query option.
PINOT_REQUEST_TIMEOUT60HTTP request timeout in seconds.
PINOT_CONNECTION_TIMEOUT60HTTP connection timeout in seconds.
PINOT_QUERY_TIMEOUT60SQL query timeout in seconds.

MCP Server

VariableDefaultDescription
MCP_TRANSPORTstdioTransport mode. Use stdio for desktop clients and http for Streamable HTTP clients.
MCP_HOST127.0.0.1HTTP bind host. Set 0.0.0.0 only with an auth provider enabled.
MCP_PORT8080HTTP listen port.
MCP_PATH/mcpMCP HTTP path.
MCP_ALLOWED_HOSTSexact host[:port] of a concrete bindComma-separated Host authorities accepted at the MCP endpoint. A wildcard bind (0.0.0.0, ::) has no inferable public authority, so it defaults to empty and the server exits at startup until you list the names clients use, e.g. mcp.example.com,mcp.example.com:443.
MCP_ALLOWED_ORIGINSunsetComma-separated browser Origin values accepted. Empty rejects requests that send Origin while still allowing clients that omit it.
MCP_SSL_KEYFILEunsetTLS private key path. Requires MCP_SSL_CERTFILE.
MCP_SSL_CERTFILEunsetTLS certificate path. Requires MCP_SSL_KEYFILE.
MCP_LOG_LEVELINFOApplication log level: DEBUG, INFO, WARNING, ERROR, or CRITICAL. Logs go to stderr so STDIO protocol output remains valid.
MCP_RATE_LIMIT_RPS / MCP_RATE_LIMIT_BURST10 / 20Per-principal (authenticated) or per-peer (loopback HTTP) tool-call rate and burst limits.
MCP_RATE_LIMIT_MAX_CLIENTS10000Maximum in-memory client buckets; least-recently-used buckets are evicted.
MCP_RATE_LIMIT_IDLE_TTL_SECONDS600Idle time before a rate-limit bucket can be evicted.
MCP_CONFIRMATION_TTL_SECONDS300Confirmation-token lifetime, constrained to 30–3600 seconds. Tokens are process-bound and intentionally fail after restart.

Authentication

An auth provider is required before binding HTTP or HTTPS to a non-loopback host.

VariableDefaultDescription
AUTH_PROVIDERunsetActive auth provider: none (default), oauth, static, or oauth+static. Some provider is required before a non-loopback bind.
oauth+static accepts both an OIDC login and the shared token on one deployment — the usual hosted case, where people use a browser and one trusted backend cannot. Either spelling works; the shared secret is checked first, and each credential keeps its own scopes (MCP_STATIC_SCOPES vs OAUTH_GRANTED_SCOPES).
MCP_STATIC_TOKENemptyShared bearer secret for AUTH_PROVIDER=static — a service-to-service caller sends it as Authorization: Bearer <token>. Required when the static provider is active.
MCP_STATIC_SCOPESpinot:read pinot:write pinot:adminSpace- or comma-separated scopes granted to the static principal. Use pinot:read for a read-only service.
OAUTH_ENABLEDfalseLegacy flag; true is equivalent to AUTH_PROVIDER=oauth. Enables OAuth authentication.
OAUTH_CLIENT_IDemptyOAuth client ID.
OAUTH_CLIENT_SECRETemptyOAuth client secret.
OAUTH_BASE_URLhttp://localhost:8080Public base URL for this MCP server.
OAUTH_AUTHORIZATION_ENDPOINTemptyUpstream authorization endpoint.
OAUTH_TOKEN_ENDPOINTemptyUpstream token endpoint.
OAUTH_JWKS_URIemptyJWKS URI used for token verification.
OAUTH_ISSUERemptyExpected token issuer.
OAUTH_AUDIENCEcanonical MCP resource URIAudience tokens are validated against. Defaults to OAUTH_BASE_URL (without a trailing slash) plus MCP_PATH, which is what RFC 9728 metadata advertises. Set it explicitly when the provider issues a different aud — many (Dex among them) set it to the client ID; the server logs a warning and honours your value.
OAUTH_GRANTED_SCOPESpinot:read pinot:write pinot:adminPinot scopes granted to every principal this provider authenticates, unioned onto the scopes the token already carries. Needed because general-purpose OIDC providers issue a fixed scope catalog and cannot mint pinot:*, so without a grant every tool call from a valid user would be denied. Set to pinot:read for a read-only deployment.
OAUTH_EXTRA_AUTH_PARAMSunsetOptional JSON object with additional authorization parameters.

Table Filtering

VariableDefaultDescription
PINOT_TABLE_FILTER_FILEunsetYAML file with included_tables glob patterns. If configured and missing, startup fails.

See SECURITY.md for the production exposure checklist and vulnerability reporting process.

Configure Table Filtering (Optional)

⚠️ Security Note: For production access control, use Pinot's native table-level ACLs (available since Pinot 0.8.0+). Table filtering in this MCP server is a convenience feature for organizing tables and improving UX, not a security boundary. It uses best-effort SQL parsing and should not be relied upon for security.

Table filtering allows you to control which Pinot tables are visible through the MCP server. This is useful for:

  • Reduce Cognitive Load: Focus on relevant tables when your Pinot cluster has hundreds or thousands of tables
  • Multi-Tenancy UX: Run multiple MCP server instances against the same Pinot cluster, each showing different table subsets for different teams or use cases
  • Environment Separation: Deploy different MCP server instances (dev, staging, prod) that show only environment-specific tables
  • Hide System Tables: Filter out internal, test, or deprecated tables from end-user view

When table filtering is enabled, all table operations are filtered to show only the configured tables.

What Gets Filtered

Table filtering applies across all MCP operations:

  1. Table Listing - Only configured tables appear in table lists
  2. Query Execution - SQL queries are checked to ensure all referenced tables (in FROM, JOIN, subqueries, CTEs, etc.) match the configured patterns
  3. Table Operations - Direct table access operations filter by table name:
    • Get table details, size, and metadata
    • Get table segments and segment metadata
    • Get index/column details
    • Get/update table configurations
  4. Schema Operations - Schema operations filter by schema name:
    • Get/create/update schemas
    • Create table configurations
Setup

Copy the example configuration file:

bash
cp table_filters.yaml.example table_filters.yaml

Edit table_filters.yaml to specify which tables to include:

yaml
included_tables:  - production_*        # All tables starting with "production_"  - analytics_events    # Specific table name  - metrics_*          # All tables starting with "metrics_"

Configure the filter file path in your .env:

bash
PINOT_TABLE_FILTER_FILE=table_filters.yaml
Pattern Matching

The filter supports glob-style patterns using standard Unix filename pattern matching:

  • exact_table_name - Matches exactly this table
  • prefix_* - Matches all tables starting with "prefix_"
  • *_suffix - Matches all tables ending with "_suffix"
  • *pattern* - Matches all tables containing "pattern"
  • sharded_table_? - Matches tables with exactly one character after the underscore (e.g., sharded_table_1, sharded_table_a)
Query Filtering

When filtering is enabled, SQL queries are checked before execution:

  • Supported SQL Features: FROM clauses, JOIN clauses (INNER, LEFT, RIGHT, OUTER, CROSS), subqueries, CTEs (WITH), and comma-separated table lists
  • Quoted Identifiers: Supports both double-quoted ("table name") and backtick-quoted (`table_name`) table names
  • Schema Prefixes: Handles schema-qualified table names (e.g., database.schema.table)
  • Comments: Removes SQL comments before checking

Example filtered query:

sql
SELECT * FROM allowed_tableJOIN other_table ON allowed_table.id = other_table.id

Error: Query references unauthorized tables: other_table. Allowed tables: allowed_table, prod_*

Configuration Features

Fail-Fast Validation:

  • ⚠️ If PINOT_TABLE_FILTER_FILE is configured but the file doesn't exist, the server will fail to start with a FileNotFoundError
  • This prevents accidentally showing all tables due to misconfiguration
  • Empty filter files or missing included_tables key will show all tables (no filtering)

Comprehensive Filtering:

  • All MCP tools that access tables apply filtering before execution
  • Consistent filtering across all table access points
  • Clear error messages indicate which tables don't match the configured patterns
Disabling Table Filtering

To disable table filtering, either:

  1. Remove the PINOT_TABLE_FILTER_FILE environment variable, or
  2. Don't configure it in your .env file

When not configured, all tables in the Pinot cluster are visible.

When a filter file supplies both allow_all: true and a non-empty included_tables, the explicit allow-list takes precedence and the server logs a warning. Applying a reload requires the token from an unchanged dry-run candidate.

Read-only Query Enforcement

The read_query tool always validates SQL before forwarding it to Pinot. It accepts one statement only, and that statement must be a read-only SELECT or WITH ... SELECT query. SQL comments are stripped, semicolon-stacked statements are rejected, and write/DDL/admin keywords are blocked.

Configure OAuth Authentication (Optional)

To enable OAuth authentication, set the following environment variables in your .env file:

Required variables (when OAUTH_ENABLED=true):

  • OAUTH_CLIENT_ID: OAuth client ID
  • OAUTH_CLIENT_SECRET: OAuth client secret
  • OAUTH_BASE_URL: Your MCP server base URL
  • OAUTH_AUTHORIZATION_ENDPOINT: OAuth authorization endpoint URL
  • OAUTH_TOKEN_ENDPOINT: OAuth token endpoint URL
  • OAUTH_JWKS_URI: JSON Web Key Set URI for token verification
  • OAUTH_ISSUER: Token issuer identifier

Optional variables:

  • OAUTH_AUDIENCE: audience tokens are validated against. Defaults to the canonical MCP resource URI (OAUTH_BASE_URL + MCP_PATH). Set it when your provider issues a different aud — for example an IdP that puts the client ID there.
  • OAUTH_GRANTED_SCOPES: Pinot scopes granted to authenticated principals (default all three). Use pinot:read to make the deployment read-only for every OIDC caller.
  • OAUTH_REQUIRED_SCOPES: baseline scopes an access token must already carry (default: none enforced).
  • OAUTH_EXTRA_AUTH_PARAMS: Additional authorization parameters as JSON object (e.g., {"scope": "openid profile"})

Tool-level authorization uses pinot:read / pinot:write / pinot:admin. General-purpose OIDC providers issue a fixed scope catalog and cannot mint resource scopes like these, so OAUTH_GRANTED_SCOPES is what makes an authenticated user able to call anything — narrow it rather than leaving tools ungated.

Example configuration:

bash
OAUTH_ENABLED=trueOAUTH_CLIENT_ID=client-idOAUTH_CLIENT_SECRET=client-secretOAUTH_BASE_URL=http://localhost:8000OAUTH_AUTHORIZATION_ENDPOINT=https://example.com/oauth/authorizeOAUTH_TOKEN_ENDPOINT=https://example.com/oauth/tokenOAUTH_JWKS_URI=https://example.com/.well-known/jwks.jsonOAUTH_ISSUER=https://example.comOAUTH_AUDIENCE=http://localhost:8000/mcpOAUTH_EXTRA_AUTH_PARAMS={"scope": "openid profile"}

Run the server

bash
uv --directory . run mcp_pinot/server.py

You should see logs indicating that the server is running.

Security notes:

  • STDIO is the default. When HTTP is selected it binds to 127.0.0.1; set MCP_HOST=0.0.0.0 only with OAuth or static-token authentication plus TLS or an authenticated reverse proxy.
  • The server refuses to start when HTTP is bound to a non-loopback host without an auth provider (AUTH_PROVIDER=oauth or static, or the legacy OAUTH_ENABLED=true).
  • read_query enforces a single read-only SQL statement before execution. This is a guardrail, not a replacement for Pinot authentication and authorization.
  • The supported mcp[cli] dependency includes DNS rebinding protections for the Streamable HTTP server.
  • Confirmation replay state and rate-limit buckets are process-local. Run exactly one server process/Helm replica. The chart rejects replicas != 1; horizontal scaling requires a shared state-store implementation.
  • /readyz reports MCP process readiness, not Pinot cluster health. Use test_connection to diagnose Pinot dependencies.

Launch Pinot Quickstart (Optional)

Start Pinot QuickStart using docker:

bash
docker run --name pinot-quickstart -p 2123:2123 -p 9000:9000 -p 8000:8000 -d apachepinot/pinot:1.5.1 QuickStart -type batch

Query MCP Server

bash
uv --directory . run examples/example_client.py

This quickstart just checks all the tools and queries the airlineStats table.

Claude Desktop Integration

Open Claude's config file

bash
vi ~/Library/Application\ Support/Claude/claude_desktop_config.json

Add an MCP server entry

json
{  "mcpServers": {      "pinot_mcp": {          "command": "/path/to/uv",          "args": [              "--directory",              "/path/to/mcp-pinot-repo",              "run",              "mcp_pinot/server.py"          ],          "env": {            // You can also include your .env config here          }      }  }}

Replace /path/to/uv with the absolute path to the uv command, you can run which uv to figure it out.

Replace /path/to/mcp-pinot with the absolute path to the folder where you cloned this repo.

Note: you must use stdio transport when running your server to use with Claude desktop.

You could also configure environment variables here instead of the .env file, in case you want to connect to multiple pinot clusters as MCP servers.

Restart Claude Desktop

Claude will now auto-launch the MCP server on startup and recognize the new Pinot-based tools.

Using the MCP Bundle

The release workflow publishes a Claude Desktop MCP Bundle (.mcpb). Its UV runtime installs the locked dependencies for the user's platform, so one small bundle works across macOS, Linux, and Windows. To build one locally:

bash
npm install -g @anthropic-ai/[email protected]mcpb validate manifest.jsonmcpb pack

Open the resulting .mcpb file to install it in Claude Desktop.

Security and Vulnerability Reporting

See SECURITY.md for vulnerability reporting instructions, security categories, and the checklist for safely exposing the MCP HTTP endpoint.

Developer

  • MCP tool definitions live in mcp_pinot/server.py; Pinot HTTP/DB operations live in mcp_pinot/pinot_client.py.
  • See MCP SDK compatibility and migration for the dependency policy, SDK 2 integration changes, validation, and rollback.

Build

Build the project with

bash
uv sync --frozen

Test

Test the repo with:

bash
uv run pytest --cov=mcp_pinot

Build the Docker image

bash
docker build -t mcp-pinot .

Run the container

bash
docker run --rm -i -v "$(pwd)/.env:/app/config/.env:ro" mcp-pinot

This uses the default STDIO transport. For HTTP/Kubernetes deployments, configure an inbound auth provider before binding to a non-loopback address; see the configuration and Helm sections above.

來源:README.md,提交 464b0ab

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

3
  1. v5.0.0最新Oct 12, 2026
  2. v4.1.0Oct 1, 2026
  3. v5.0.0-beta.1Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分