InfluxDB 3 MCP Server
Model Context Protocol (MCP) server for InfluxDB 3 integration. Provides tools, resources, and prompts for interacting with InfluxDB 3 Core and Enterprise, plus InfluxDB Cloud Dedicated, InfluxDB Clustered, and InfluxDB Cloud Serverless via MCP clients.
Prerequisites
- InfluxDB 3 Instance: URL and token (Core/Enterprise/Cloud Serverless) or Cluster ID and tokens (Cloud Dedicated/Clustered)
- Node.js: v20.11 or newer (for npm/npx usage)
- npm: v9 or newer (for npm/npx usage)
- Docker: (for Docker-based setup)
Read-only Agent Workflows
Set INFLUX_MCP_TOOL_PROFILE=readonly when you want an MCP client to explore
and query InfluxDB 3 data without exposing write, admin, token-management, or
host-level tools. In Enterprise deployments that use preview user auth, the
same read-only flow works when the configured bearer credential is a JWT instead
of an apiv3_ token.
Analyst explores an unfamiliar database
An analyst can connect an MCP client such as Claude Desktop, Cursor, Codex, or
another agent harness and ask a question like:
Which sensors had the highest average temperature in the last 24 hours?
With the read-only profile, the agent can:
- Call
list_databases to see accessible databases.
- Call
list_tables and describe_table to discover measurements and
columns.
- Treat uncertain tag and field categories as
unknown.
- Build a bounded SQL query with
db, q, and optional params.
- Call
query_sql with structured JSON output.
- Return the result, row count, truncation status, warnings, and correlation
metadata.
The user gets a grounded answer and a reusable query while the agent explores
and queries data without access to mutation or administration tools.
Operator investigates an InfluxQL dashboard query
An operator can troubleshoot an existing InfluxQL dashboard panel and ask:
Why did this panel stop showing data after the deploy?
With the read-only profile, the agent can:
- Keep the user's query in InfluxQL and call
query_influxql.
- Use
SHOW queries and schema discovery to verify the measurement and
referenced columns.
- Sample recent rows with bounded reads to distinguish missing data from a
broken query.
- Reject unsafe follow-up attempts, such as
SELECT INTO or destructive
statements.
- Return
request_id, query_id, and query_id_source so the operator can
correlate the MCP result with system.queries.id when query history is
available.
- Emit structured logs to stderr for stdio transports so stdout remains
reserved for MCP protocol messages.
The user gets a practical diagnosis, such as missing data, renamed schema, a
wrong time predicate, or a query failure. The investigation is traceable without
logging full query text by default.
Available Tools
| Tool Name | Description | Availability |
|---|
load_database_context | Load optional custom database context and documentation | All versions |
get_help | Get help and troubleshooting guidance for InfluxDB operations | All versions |
write_line_protocol | Write data using InfluxDB line protocol | All versions |
create_database | Create a new database (with cloud-specific config options) | All versions |
update_database | Update database configuration (retention for all; maxTables/maxColumns for Cloud Dedicated/Clustered) | All versions |
delete_database | Delete a database by name (irreversible) | All versions |
execute_query | Run a SQL query against a database (supports multiple formats) | All versions |
query_sql | Run bounded read-only SQL with structured response metadata | All versions |
query_influxql | Run bounded read-only InfluxQL with structured response metadata | All versions |
get_measurements | List all measurements (tables) in a database | All versions |
get_measurement_schema | Get schema (columns/types) for a measurement/table | All versions |
list_tables | List tables, also called measurements, in a database | All versions |
describe_table | Describe table schema with conservative column categories | All versions |
investigate_database | Run high-level read-only database discovery and sampling | All versions |
create_admin_token | Create a named admin token with an optional expiration | Core/Enterprise only |
list_admin_tokens | List all admin tokens (with optional filtering) | Core/Enterprise only |
create_resource_token | Create a resource token for specific DBs and permissions | Enterprise only |
list_resource_tokens | List all resource tokens (with filtering and ordering) | Enterprise only |
delete_token | Delete a token by name | Core/Enterprise only |
regenerate_operator_token | Regenerate the operator token (dangerous/irreversible) | Core/Enterprise only |
cloud_list_database_tokens | List all database tokens for Cloud-Dedicated/Clustered cluster | Cloud Dedicated/Clustered |
cloud_get_database_token | Get details of a specific database token by ID | Cloud Dedicated/Clustered |
cloud_create_database_token | Create a new database token for Cloud-Dedicated/Clustered cluster | Cloud Dedicated/Clustered |
cloud_update_database_token | Update an existing database token | Cloud Dedicated/Clustered |
cloud_delete_database_token | Delete a database token from Cloud-Dedicated/Clustered cluster | Cloud Dedicated/Clustered |
list_databases | List all available databases in the instance | All versions |
health_check | Check InfluxDB connection and health status | All versions |
Available Resources
| Resource Name | Description |
|---|
influx-config | Read-only access to InfluxDB configuration |
influx-status | Real-time connection and health status |
influx-databases | List of all databases in the instance |
context-file | Custom user-provided database context and documentation |
Available Prompts
| Prompt Name | Description |
|---|
list-databases | Generate a prompt to list all available databases |
check-health | Generate a prompt to check InfluxDB health status |
load-context | Load custom database context and documentation |
Example Usage
- Use your MCP client to call tools, resources, or prompts as described above.
- Custom Context: Edit the provided
context/database-context.md file or remove it and create your own context file with "context" in the name (.json, .txt, .md) to provide database documentation. Use the load_database_context tool or load-context prompt to access it.
- See the
example-*.mcp.json files for ready-to-use configuration templates:
example-local.mcp.json - Local development setup
example-npx.mcp.json - NPX-based setup
example-docker.mcp.json - Docker-based setup
example-cloud-dedicated.mcp.json - Cloud Dedicated with all variables
example-clustered.mcp.json - Clustered with all variables
example-cloud-serverless.mcp.json - Cloud Serverless configuration
- See the
env.example, env.cloud-dedicated.example, env.clustered.example, and env.cloud-serverless.example files for environment variable templates.
- See
AGENT_E2E_TESTS.md for MCP harness tips, read-only profile runs, and telemetry correlation checks.
Run Cloud Serverless integration tests
The Cloud Serverless test command accepts Claire's INFLUXDB3_CLOUD_* variables
and maps them to the MCP server's runtime variables.
The command sets INFLUX_TEST_ENABLED=true and INFLUX_DB_PRODUCT_TYPE=cloud-serverless.
For local tests with 1Password, store only op:// references in
~/.config/claire/cloud-serverless.env:
INFLUXDB3_CLOUD_URL=op://VAULT/ITEM/hostname
INFLUXDB3_CLOUD_TOKEN=op://VAULT/ITEM/token
INFLUXDB3_CLOUD_BUCKET=op://VAULT/ITEM/bucket
INFLUXDB3_CLOUD_ORG=op://VAULT/ITEM/org
Run the live tests through 1Password so the token exists only in the test
process environment:
op run --env-file ~/.config/claire/cloud-serverless.env -- \
npm run test:integration:cloud-serverless
You can instead copy env.cloud-serverless.example to the ignored
.env.cloud-serverless.local file and set the MCP runtime variables there.
Then run npm run test:integration:cloud-serverless directly.
To use another plaintext credentials file, set INFLUX_TEST_ENV_FILE:
INFLUX_TEST_ENV_FILE=/path/to/serverless.env npm run test:integration:cloud-serverless
GitHub Actions runs the same command with the existing URL and token secrets
from the cloud-serverless environment. The workflow selects the
mcp-ci-tests bucket explicitly.
Database Retention Policy Examples
Core/Enterprise - Set 90-day Retention
// Set 90-day retention policy on Enterprise instance
await mcp.update_database({
name: "my_database",
retentionPeriod: 7776000000000000, // 90 days in nanoseconds
});
Cloud Dedicated - Update Multiple Settings
// Update retention, maxTables, and maxColumnsPerTable
await mcp.update_database({
name: "my_database",
retentionPeriod: 7776000000000000, // 90 days
maxTables: 1000,
maxColumnsPerTable: 250,
});
Common Retention Periods
| Duration | Nanoseconds |
|---|
| 7 days | 604,800,000,000,000 |
| 30 days | 2,592,000,000,000,000 |
| 90 days | 7,776,000,000,000,000 |
| 180 days | 15,552,000,000,000,000 |
| 1 year | 31,536,000,000,000,000 |
Support & Troubleshooting
- Use the
get_help tool for built-in help and troubleshooting.
- For connection issues, check your environment variables and InfluxDB instance status.
- For advanced configuration, see the comments in the example
.env and MCP config files.
Write errors
write_line_protocol surfaces InfluxDB's own error text, not a generic
message. If InfluxDB rejects a write — a duplicate tag key, an
unauthenticated token, a payload over the size limit — the tool error
includes the specific reason, for example:
Bad request: invalid line protocol - multiple instances of 'region' tag found
A 503 reaching this server is phrased as retryable
(Service temporarily unavailable, retry the write: ...) — safe to retry
the write. Any other status is not.
InfluxDB 3.11 compatibility
Verified against InfluxDB 3.11.5 Core and Enterprise, including a
multi-node Enterprise cluster). Core and Enterprise write through
POST /api/v3/write_lp, which 3.11's write-availability changes for the
legacy /api/v2/write endpoint do not affect; only clustered calls
/api/v2/write. Query and schema-discovery tools behave the same whether
the target database is on Parquet (Core, or Enterprise before an upgrade)
or PachaTree (Enterprise 3.11+ by default, or after
--upgrade-pacha-tree) — new system.pt_* tables are excluded from
get_measurements/get_measurement_schema results by the same
table_schema = 'iox' filter that already excludes other system tables.
Core and Enterprise create named admin tokens through
POST /api/v3/configure/token/named_admin.
Named admin tokens accept an optional expiration in seconds.
Only Enterprise supports resource tokens, so the MCP server doesn't advertise
resource-token tools for Core connections.
Publishing to the MCP Registry
Stable GitHub releases publish the npm package first, then register
io.github.influxdata/influxdb3-mcp-server in the
official MCP Registry.
The registry stores metadata; clients install the server from npm.
GitHub OIDC authenticates the release job using id-token: write, so no
additional registry secret is needed. Releases marked as prereleases or with
- in their tag skip registry publishing.
Before tagging a release, update package.json, src/config.ts, the latest
CHANGELOG.md entry, and both version fields in server.json together.
Keep package.json's mcpName equal to server.json's name. Check locally:
node scripts/check-versions.js
bash scripts/install-mcp-publisher.sh /tmp/mcp-publisher
/tmp/mcp-publisher validate
The installer pins and verifies the Linux amd64 publisher used in CI. The
validate command contacts the registry and checks metadata without publishing.
CI runs these checks, and the npm release job also checks the versions and tag.
The first registry release must use a freshly published npm version containing
mcpName; an existing npm version cannot be updated to add it.
After publishing, verify the release at each destination:
- npm: The exact package version must exist and include the expected
mcpName.
- Docker Hub: The image tagged with the release version must be available.
- MCP Registry: The exact version endpoint must return the expected server
name and version. The registry release job automates this check.
From the release checkout, verify npm and the registry manually:
version="$(node -p "require('./package.json').version")"
npm view "@influxdata/influxdb3-mcp-server@$version" version mcpName
docker manifest inspect "influxdata/influxdb3-mcp-server:$version"
curl --fail --silent --show-error \
"https://registry.modelcontextprotocol.io/v0.1/servers/io.github.influxdata%2Finfluxdb3-mcp-server/versions/$version" \
| jq --exit-status --arg version "$version" \
'.server.name == "io.github.influxdata/influxdb3-mcp-server" and .server.version == $version'
With valid database environment variables configured, also smoke-test the exact
published npm version using MCP Inspector:
npx @modelcontextprotocol/inspector --cli \
npx -y "@influxdata/influxdb3-mcp-server@$version" --method tools/list
Metadata validation checks the registry description; the smoke test checks that
the published package initializes and advertises tools. Keep the release-note
verification checklist unchecked until the corresponding checks pass.
If registry publishing fails after npm succeeds, rerun only the failed registry
job; rerunning the successful npm job would try to publish an existing version.
License
MIT