IoTDB MCP 讓你用最輕松的方法,運用大模型的深度時序數(shù)據(jù)管理能力!
近些年 AI 變得越發(fā)普及,大語言模型(LLM)已經(jīng)成為我們生活中不可或缺的助手。而在時序數(shù)據(jù)管理領(lǐng)域,大語言模型也有望成為加速數(shù)據(jù)查詢與分析的重要工具,如何讓大語言模型與時序數(shù)據(jù)庫深度交互,用更小的理解成本調(diào)用大語言模型的強(qiáng)大能力,成為行業(yè)關(guān)注熱點。
Model Context Protocol(MCP)的出現(xiàn),讓我們看到了 AI 技術(shù)與時序數(shù)據(jù)庫融合的全新可能,并基于此實現(xiàn)了 Apache IoTDB MCP Server 功能。這一功能讓過去“先向大模型提出問題,由其輸出 IoTDB 的 SQL 語句,再手動執(zhí)行 SQL 語句獲取結(jié)果”的使用過程,變?yōu)椤按竽P椭苯优c IoTDB 交互獲取所需數(shù)據(jù)”,極大簡化了數(shù)據(jù)查詢的流程,為時序數(shù)據(jù)管理帶來了全新的解決方案。
01 MCP:讓大模型“看得懂”外部世界
(1) MCP 是什么?
Model Context Protocol(MCP)是由 Anthropic 提出的標(biāo)準(zhǔn)化協(xié)議,旨在為大語言模型提供與外部軟件和系統(tǒng)交互的能力。你可以想象一個場景:你帶著國內(nèi)的充電器出國,發(fā)現(xiàn)無法充電,需要一個轉(zhuǎn)換插頭。MCP 就是 AI 的“轉(zhuǎn)換插頭”,讓 AI 能夠連接和使用各種外部工具和數(shù)據(jù)源,進(jìn)而拓展 AI 能力的應(yīng)用場景。
具體來說,MCP 的工作原理是這樣的:開發(fā)者使用 Python 等編程語言實現(xiàn)特定的功能函數(shù),并用自然語言詳細(xì)描述這些函數(shù)的功能以及各個參數(shù)的含義。當(dāng)大模型接收到一個任務(wù)時,它會根據(jù)自然語言描述提取出函數(shù)的參數(shù),調(diào)用相應(yīng)的函數(shù),并將結(jié)果返回給用戶。這一過程就像是給大模型配備了一雙“眼睛”,讓它能夠“看到”并操作外部世界的各種軟件和系統(tǒng)。
(2) 為什么需要 MCP?
在沒有 MCP 的情況下,大模型的功能主要局限于文本處理。例如,如果你想要查詢數(shù)據(jù)庫中的某些數(shù)據(jù),你需要手動編寫 SQL 查詢語句,或者通過其他工具來完成。
但有了 MCP,你只需要用自然語言描述你的需求,比如“查詢風(fēng)機(jī)今日的運行情況”,大模型就能自動調(diào)用相應(yīng)的數(shù)據(jù)庫查詢函數(shù),完成任務(wù)并返回結(jié)果。這不僅大大提高了效率,還降低了對用戶的技術(shù)要求,讓普通用戶也能輕松利用大模型的強(qiáng)大能力。
(3) MCP 的核心價值
實時性:突破 LLM 訓(xùn)練數(shù)據(jù)的時間限制,支持查詢動態(tài)更新的數(shù)據(jù)庫內(nèi)容。
統(tǒng)一性:標(biāo)準(zhǔn)化工具調(diào)用格式,替代傳統(tǒng)分散的 Function Call 實現(xiàn)方式。
安全性:通過隔離敏感數(shù)據(jù)訪問權(quán)限,僅由 MCP Server 管理憑證,避免直接暴露給 LLM。
02 Apache IoTDB MCP Server:讓大模型會用 IoTDB
(1) IoTDB MCP Server 是什么?
Apache IoTDB MCP Server 是一個基于 MCP 協(xié)議的服務(wù)器實現(xiàn),它通過 IoTDB 提供數(shù)據(jù)庫交互和商業(yè)智能功能。Apache IoTDB 是專門為物聯(lián)網(wǎng)(IoT)數(shù)據(jù)設(shè)計的數(shù)據(jù)庫,能夠高效地存儲和處理海量的時序數(shù)據(jù)。而 IoTDB MCP Server 則為大模型與 IoTDB 數(shù)據(jù)庫之間搭建了一座橋梁,讓大模型能夠輕松地查詢 IoTDB 中的海量時序數(shù)據(jù)。
目前,該功能已在 GitHub 開源:https://github.com/apache/iotdb-mcp-server。
(2) IoTDB MCP Server 的核心功能
1. 查詢工具(Query Tools)
read_query:執(zhí)行 SELECT 查詢語句,從數(shù)據(jù)庫中讀取數(shù)據(jù)。用戶只需要提供一個 SELECT SQL 查詢語句作為輸入,read_query 函數(shù)就會返回查詢結(jié)果,結(jié)果以對象數(shù)組的形式呈現(xiàn)。例如,如果你想要查詢某個設(shè)備在過去一周內(nèi)的溫度數(shù)據(jù),你可以用自然語言描述這個需求,大模型就會調(diào)用 read_query 函數(shù),傳入相應(yīng)的 SQL 查詢語句,然后返回溫度數(shù)據(jù)。
2. 元數(shù)據(jù)工具(Schema Tools)
list_tables:獲取數(shù)據(jù)庫中所有表的列表。這個函數(shù)不需要任何輸入,直接返回一個包含所有表名的數(shù)組。當(dāng)你不確定數(shù)據(jù)庫中有哪些表時,這個功能非常有用。
describe_table:查看特定表的元數(shù)據(jù)信息。用戶需要提供表名作為輸入,函數(shù)會返回該表的列定義,包括列名和數(shù)據(jù)類型。例如,你可以用自然語言詢問某個表的結(jié)構(gòu),大模型就會調(diào)用 describe_table 函數(shù),返回表的詳細(xì)信息。
(3) 如何使用 IoTDB MCP Server?
使用 IoTDB MCP Server 需要滿足一些前提條件:
安裝 Python,并使用 uv 包管理器(pip install uv)
安裝并運行 IoTDB 數(shù)據(jù)庫實例(可下載 2.0.1-beta 版本)
安裝 IoTDB MCP Server 的依賴項
接下來,按照以下步驟進(jìn)行操作:
1. 克隆倉庫
打開終端,運行以下命令克隆 IoTDB MCP Server 的代碼倉庫:
git clone https://github.com/apache/iotdb-mcp-server.git
cd iotdb_mcp_server2. 創(chuàng)建虛擬環(huán)境
使用 uv 創(chuàng)建虛擬環(huán)境,并激活它:
uv venv
source venv/bin/activate # 或在 Windows 上使用 venv\Scripts\activate3. 安裝依賴
在虛擬環(huán)境中,運行以下命令安裝開發(fā)依賴:
uv sync4. 配置集成(以 Claude Desktop 為例)
根據(jù)你的操作系統(tǒng),找到 Claude Desktop 的配置文件:
在 MacOS 上,位置為 ~/Library/Application Support/Claude/claude_desktop_config.json
在 Windows 上,位置為 %APPDATA%/Claude/claude_desktop_config.json
在配置文件中,添加以下內(nèi)容,確保將 YOUR_REPO_PATH 替換為你的倉庫路徑,env 配置為實際的 IoTDB 實例信息:
{
"mcpServers": {
"iotdb": {
"command": "uv",
"args": [
"--directory",
"YOUR_REPO_PATH/src/iotdb_mcp_server",
"run",
"server.py"
],
"env": {
"IOTDB_HOST": "127.0.0.1",
"IOTDB_PORT": "6667",
"IOTDB_USER": "root",
"IOTDB_PASSWORD": "root",
"IOTDB_DATABASE": "test"
}
}
}
}如果你需要找到 uv 的完整路徑,可以在 MacOS/Linux 上運行 which uv,在 Windows 上運行 where uv。
5. 打開 Claude Desktop,開始體驗
正式使用前請?zhí)崆皽?zhǔn)備好數(shù)據(jù),目前 Apache IoTDB MCP Server 僅支持表模型,也可以直接使用下方的 SQL 快速錄入測試數(shù)據(jù),首先使用 start-cli.sh/bat -sql_dialect table 進(jìn)入 IoTDB CLI:
create database test;
use test;
CREATE TABLE battery_data (
time TIMESTAMP TIME comment '時間',
station_id STRING TAG comment '站址ID',
dc_voltage FLOAT FIELD comment '直流電壓(V)',
load_current FLOAT FIELD comment '負(fù)載電流(A)',
battery_current FLOAT FIELD comment '電池組電流(A)',
float_voltage_set FLOAT FIELD comment '浮充電壓設(shè)定值(V)',
equalize_voltage_set FLOAT FIELD comment '均充電壓設(shè)定值(V)',
rectifier_current FLOAT FIELD comment '整流模塊電流和(A)'
) comment '電池數(shù)據(jù)'
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742313600000,'b0001',50.88,69.36,0.0,50.9,51.1,82.48);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742313720000,'b0001',50.88,67.05,0.0,50.9,51.1,81.12);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742313840000,'b0001',50.88,67.37,0.0,50.9,51.1,81.24);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742313960000,'b0001',50.88,68.72,0.0,50.9,51.1,82.49);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742314080000,'b0001',50.88,67.27,0.0,50.9,51.1,80.24);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742314200000,'b0001',50.89,66.89,0.0,50.9,51.1,79.99);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742314380000,'b0001',50.88,69.53,0.0,50.9,51.1,83.23);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742314500000,'b0001',50.88,68.23,0.0,50.9,51.1,79.48);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742314620000,'b0001',50.88,69.76,0.0,50.9,51.1,83.36);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742314740000,'b0001',50.88,67.46,0.0,50.9,51.1,81.99);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742314860000,'b0001',50.88,67.39,0.0,50.9,51.1,80.98);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742314980000,'b0001',50.88,65.51,0.0,50.9,51.1,78.73);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742315100000,'b0001',50.88,66.11,0.0,50.9,51.1,80.49);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742315220000,'b0001',50.88,68.6,0.0,50.9,51.1,81.87);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742315340000,'b0001',50.88,66.42,0.0,50.9,51.1,78.23);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742315460000,'b0001',50.88,67.16,0.0,50.9,51.1,78.49);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742315580000,'b0001',50.88,66.6,0.0,50.9,51.1,78.36);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742315700000,'b0001',50.88,67.53,0.0,50.9,51.1,79.98);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742315820000,'b0001',50.88,66.69,0.0,50.9,51.1,79.73);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742315940000,'b0001',50.88,66.88,0.0,50.9,51.1,80.87);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742316060000,'b0001',50.88,67.0,0.0,50.9,51.1,79.73);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742316180000,'b0001',50.88,65.61,0.0,50.9,51.1,79.86);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742316300000,'b0001',50.89,61.51,0.0,50.9,51.1,73.98);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742316420000,'b0001',50.89,62.38,0.0,50.9,51.1,75.86);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742316540000,'b0001',50.89,60.35,0.0,50.9,51.1,73.23);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742316720000,'b0001',50.89,60.22,0.0,50.9,51.1,72.61);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742316840000,'b0001',50.89,60.88,0.0,50.9,51.1,73.98);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742316960000,'b0001',50.89,59.95,0.0,50.9,51.1,72.61);
insert into battery_data(time,station_id,dc_voltage,load_current,battery_current,float_voltage_set,equalize_voltage_set,rectifier_current) values(1742317080000,'b0001',50.89,61.09,0.0,50.9,51.1,74.11);03 Apache IoTDB MCP Server:典型使用場景
場景1:自然語言查詢數(shù)據(jù)庫
用戶輸入:“查詢 2025 年 3 月 19 日所有基站的整流模塊電流平均值”
→ 大模型轉(zhuǎn)換為:
read_query("SELECT AVG(rectifier_current) as average_rectifier_current FROM battery_data WHERE time >= 2025-03-19T00:00:0
場景2:數(shù)據(jù)探索
用戶輸入:“數(shù)據(jù)庫中有哪些表?”
→ 大模型調(diào)用:
list_tables()
場景3:結(jié)構(gòu)分析
用戶輸入:“描述 battery_data 表的結(jié)構(gòu)”
→ 大模型執(zhí)行:
describe_table("battery_data")
04 結(jié)語
MCP 技術(shù)的出現(xiàn),為大語言模型的應(yīng)用開辟了新的天地,通過 MCP 協(xié)議,我們正在構(gòu)建一個大模型與物理世界無縫交互的新范式。Apache IoTDB MCP Server 作為 MCP 技術(shù)的成功實踐,為時序數(shù)據(jù)處理提供了標(biāo)準(zhǔn)化的大模型接入方案。隨著生態(tài)的完善,MCP 有望成為連接 AI 與 IoT 的關(guān)鍵基礎(chǔ)設(shè)施。
期待利用 Apache IoTDB MCP Server,更多企業(yè)能夠加速時序數(shù)據(jù)智能化管理,實現(xiàn)大語言模型在時序數(shù)據(jù)管理領(lǐng)域的深度使用。歡迎各位朋友下載并試用!
更多內(nèi)容推薦:
? 下載時序數(shù)據(jù)庫 IoTDB 開源版
? 了解如何使用 時序數(shù)據(jù)庫 IoTDB AI 能力