English | 中文
A Model Context Protocol (MCP) server implementation that provides database interaction and business intelligence capabilities through IoTDB. This server enables running SQL queries and interacting with IoTDB using different SQL dialects (Tree Model and Table Model).
The server doesn't expose any resources.
The server doesn't provide any prompts.
IoTDB MCP permissions are advisory by default. The server reports the required permission, risk level, and confirmation parameter for SQL actions, while the host agent system owns user approval. Use inspect_sql_permission before executing DDL/DML or destructive SQL when the tool is available.
Long-running hosted agents can provide full-permission defaults with environment variables such as IOTDB_SQL_DRIVER_MODE=full and TIMESEEK_MCP_PERMISSION_ENFORCEMENT=advisory. Set TIMESEEK_MCP_PERMISSION_ENFORCEMENT=strict only when the MCP server itself should hard-block disallowed operations.
The server offers different tools for IoTDB Tree Model and Table Model. You can choose between them by setting the “IOTDB_SQL_DIALECT” configuration to either “tree” or “table”.
Dialect-specific identifier semantics:
FROM targets use explicit root... paths.root... paths.IOTDB_DATABASE is only a connection/session hint; tree SQL still needs explicit root paths.FROM targets use table names in the current database.metadata_queryquery_sql (string): The SHOW/COUNT SQL query to executeselect_queryquery_sql (string): The SELECT SQL query to execute (using TREE dialect, time using ISO 8601 format, e.g. 2017-11-01T00:08:00.000)sql_executor_batchsqls (array): Explicit single SQL statements, orsql_template + param_sets: Repeated SQL template with parameter objectsmax_concurrency (integer): Concurrent statement limit, default 4worker_pool_size (integer): Thread worker pool size, default follows concurrency and is capped by IOTDB_SQL_EXECUTOR_BATCH_MAX_WORKER_POOL_SIZE (default 16)per_item_timeout_ms (integer): Per-statement wait timeout, default 60000batch_timeout_ms (integer): Whole-batch wait timeout, default 300000max_result_rows_per_item / max_result_bytes_per_item: Per-statement result quota, defaults 10000 rows and 16 MiBmax_batch_result_rows / max_batch_result_bytes: Whole-batch result quota, defaults 100000 rows and 64 MiB{{name}} for SQL literals, {{name:path}} for IoTDB paths, {{name:identifier}} for SQL identifiersresult_id, row count, preview rows, and paging metadataread_result_pagespages (array): Page request objects with result_id plus optional cursor, offset, limit, and owner_session_iddefault_limit (integer): Default page size for items without limitmax_pages / max_total_rows: Per-call quotas, defaults 32 pages and 10000 rowscontinue_on_error (boolean): Return per-item errors instead of aborting, default trueexport_queryquery_sql (string): The SQL query to execute (using TREE dialect)format (string): Export format, either “csv” or “excel” (default: “csv”)filename (string): Optional filename for the exported file. If not provided, a unique filename will be generated.model_inferenceCALL INFERENCE(...) SQL and return the result setinference_sql (string): A single Tree-dialect SQL statement starting with CALL INFERENCEgenerateTime, outputLength) before executionIOTDB_ENABLE_MODEL_MANAGEMENT=true and IOTDB_MODEL_ALLOWED_USERS are enforced.prepare_model_inference_requestCALL INFERENCE(...) SQL from structured fieldsmodel_id (string): Registered AINode model idinput_sql (string): Bounded Tree-dialect SELECT query used as model inputoutput_length (int): Forecast output length (default: 96)generate_time (bool): Whether to request a Time column (default: false)list_udf_functionsSHOW FUNCTIONS for the selected IoTDB target.prepare_udf_querySELECT from structured inputs.SELECT UDF(measurement, "k"="v") FROM root.sg.d1 ...SELECT UDF(column, "k"="v") FROM table ...execute_udf_queryexport_udf_queryUDF tools reject semicolons, SQL comments, and DDL/DML keywords in expressions and filter clauses. They are intended for read-only UDF calls such as data quality, profiling, repair planning, and anomaly scoring.
read_queryquery_sql (string): The SELECT SQL query to execute (using TABLE dialect, time using ISO 8601 format, e.g. 2017-11-01T00:08:00.000)list_tables
describe_table
table_name (string): Name of table to describeexport_table_query
query_sql (string): The SQL query to execute (using TABLE dialect)format (string): Export format, either “csv” or “excel” (default: “csv”)filename (string): Optional filename for the exported file. If not provided, a unique filename will be generated.IoTDB MCP Server supports the following configuration options, which can be set via environment variables or command-line arguments:
| Option | Environment Variable | Default Value | Description |
|---|---|---|---|
| --host | IOTDB_HOST | 127.0.0.1 | IoTDB host address |
| --port | IOTDB_PORT | 6667 | IoTDB port |
| --user | IOTDB_USER | root | IoTDB username |
| --password | IOTDB_PASSWORD | empty | IoTDB password |
| --database | IOTDB_DATABASE | test | Table dialect: current database name. Tree dialect: optional session/root scope hint; queries still use explicit root... paths. |
| --sql-dialect | IOTDB_SQL_DIALECT | table | SQL dialect: tree or table |
| --export-path | IOTDB_EXPORT_PATH | /tmp | Path for exporting query results |
The target registry contains only connections that have completed a successful login. Call prepare_iotdb_target with non-secret fields, then pass explicitly user-supplied credentials to connect_iotdb_target for one authentication attempt. If credentials are absent, ask the user; never probe empty or default passwords. An explicitly supplied empty password remains valid input.
Successful login atomically publishes the target and records its per-target last_known_good_credential. Any connection-layer failure consumes the candidate or evicts the published target. A retry requires a new candidate and user_confirmed_retry=true after explicit user instruction. Public target responses redact both the active password and last-known-good password.
When TIMESEEK_IOTDB_TARGETS_FILE is configured, successful connections are persisted by default. The local Java CLI can reuse exactly that target through iotdb-target-cli:
iotdb-target-cli --target-id cloud \ --cli /opt/iotdb/sbin/start-cli.sh -- -e "SHOW VERSION"
The wrapper reloads the verified target on every invocation and supplies its host, port, dialect, username, and last-known-good password. It does not pass -db to start-cli.sh, because the Java CLI does not support that option; select a table database with SQL USE <database>. For import-data.sh and import-data.bat, which do support -db, a table target's database is injected automatically. A verified empty password is represented by omitting -pw, and command previews redact non-empty passwords. Calling start-cli.sh directly does not read the target registry.
IoTDB MCP Server includes the following performance optimization features:
uv package manager# Clone the repository git clone https://github.com/apache/iotdb-mcp-server.git cd iotdb-mcp-server # Create virtual environment uv venv source venv/bin/activate # or `venv\Scripts\activate` on Windows # Install development dependencies uv sync
Configure the MCP server in Claude Desktop's configuration file:
Location: ~/Library/Application Support/Claude/claude_desktop_config.json
Location: %APPDATA%/Claude/claude_desktop_config.json
You may need to put the full path to the uv executable in the command field. You can get this by running which uv on MacOS/Linux or where uv on Windows.
Add the following configuration to Claude Desktop's configuration file:
{ "mcpServers": { "iotdb": { "command": "uv", "args": [ "--directory", "/Users/your_username/iotdb-mcp-server/src/iotdb_mcp_server", "run", "server.py" ], "env": { "IOTDB_HOST": "127.0.0.1", "IOTDB_PORT": "6667", "IOTDB_USER": "root", "IOTDB_PASSWORD": "", "IOTDB_DATABASE": "test", "IOTDB_SQL_DIALECT": "table", "IOTDB_EXPORT_PATH": "/path/to/export/folder" } } } }
Note: Make sure to replace the
--directoryparameter's path with your actual repository clone path.
IoTDB MCP Server includes comprehensive error handling and logging capabilities:
You can build a container image for the IoTDB MCP Server using the Dockerfile in the project root:
# Build Docker image docker build -t iotdb-mcp-server . # Run container docker run -e IOTDB_HOST=<your-iotdb-host> -e IOTDB_PORT=<your-iotdb-port> -e IOTDB_USER=<your-iotdb-user> -e IOTDB_PASSWORD=<your-iotdb-password> iotdb-mcp-server