@airiot/mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,214 @@
1
+ # AIRIOT MCP Server
2
+
3
+ 基于 Model Context Protocol (MCP) 的 AIRIOT IoT 平台服务器,为 AI 助手提供对 AIRIOT 数据表、记录、属性点和时序数据的访问能力。
4
+
5
+ ## 功能特性
6
+
7
+ - 📊 **数据表管理**: 查询、创建、更新、删除数据表
8
+ - 📝 **记录操作**: 对表记录进行 CRUD 操作
9
+ - 🏷️ **属性点查询**: 查询表和记录的属性点定义
10
+ - 📈 **时序数据**: 查询设备最新数据和历史数据
11
+ - 📊 **统计分析**: 设备在线状态统计
12
+
13
+ ## 安装
14
+
15
+ ```bash
16
+ cd airiot-mcp-server
17
+ npm install
18
+ npm run build
19
+ ```
20
+
21
+ ## 配置
22
+
23
+ ### 环境变量
24
+
25
+ 创建 `.env` 文件或设置以下环境变量:
26
+
27
+ ```bash
28
+ # AIRIOT 服务器地址(必填)
29
+ export AIRIOT_BASE_URL="https://your-airiot-server.com"
30
+
31
+ # 项目ID(必填)
32
+ export AIRIOT_PROJECT_ID="your-project-id"
33
+
34
+ # 认证方式1: 使用Token(推荐)
35
+ export AIRIOT_TOKEN="your-api-token"
36
+
37
+ # 认证方式2: 使用用户名密码
38
+ export AIRIOT_USERNAME="your-username"
39
+ export AIRIOT_PASSWORD="your-password"
40
+ ```
41
+
42
+ ### MCP 配置
43
+
44
+ 在 Claude Desktop 配置文件中添加:
45
+
46
+ **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
47
+ **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
48
+
49
+ ```json
50
+ {
51
+ "mcpServers": {
52
+ "airiot": {
53
+ "command": "node",
54
+ "args": [
55
+ "/path/to/airiot-mcp-server/dist/index.js"
56
+ ],
57
+ "env": {
58
+ "AIRIOT_BASE_URL": "https://your-airiot-server.com",
59
+ "AIRIOT_PROJECT_ID": "your-project-id",
60
+ "AIRIOT_TOKEN": "your-api-token"
61
+ }
62
+ }
63
+ }
64
+ }
65
+ ```
66
+
67
+ ## 可用工具
68
+
69
+ ### 表管理
70
+
71
+ | 工具名 | 描述 |
72
+ |--------|------|
73
+ | `get_tables` | 查询数据表列表 |
74
+ | `get_table_by_id` | 根据ID查询单个表 |
75
+ | `create_table` | 创建新数据表 |
76
+ | `update_table` | 更新表信息 |
77
+ | `delete_table` | 删除数据表 |
78
+
79
+ ### 记录管理
80
+
81
+ | 工具名 | 描述 |
82
+ |--------|------|
83
+ | `get_table_records` | 查询表记录列表 |
84
+ | `get_record_by_id` | 根据ID查询单条记录 |
85
+ | `create_record` | 创建新记录 |
86
+ | `update_record` | 更新记录 |
87
+ | `delete_record` | 删除单条记录 |
88
+ | `batch_delete_records` | 批量删除记录 |
89
+
90
+ ### 属性点查询
91
+
92
+ | 工具名 | 描述 |
93
+ |--------|------|
94
+ | `get_table_tags` | 查询表的属性点定义 |
95
+ | `get_record_tags` | 查询记录的属性点 |
96
+
97
+ ### 时序数据
98
+
99
+ | 工具名 | 描述 |
100
+ |--------|------|
101
+ | `get_latest_data` | 查询最新数据 |
102
+ | `get_history_data` | 查询历史时序数据 |
103
+
104
+ ### 统计
105
+
106
+ | 工具名 | 描述 |
107
+ |--------|------|
108
+ | `get_online_stats` | 统计设备在线状态 |
109
+
110
+ ## 使用示例
111
+
112
+ ### 查询所有数据表
113
+
114
+ ```
115
+ 调用 get_tables 工具,参数:
116
+ {
117
+ "limit": 50,
118
+ "sort": { "createTime": -1 }
119
+ }
120
+ ```
121
+
122
+ ### 查询特定表的记录
123
+
124
+ ```
125
+ 1. 先调用 get_tables 查找表ID
126
+ 2. 调用 get_table_records 工具,参数:
127
+ {
128
+ "tableId": "表ID",
129
+ "filter": { "status": "online" },
130
+ "limit": 100
131
+ }
132
+ ```
133
+
134
+ ### 创建新记录
135
+
136
+ ```
137
+ 调用 create_record 工具,参数:
138
+ {
139
+ "tableId": "表ID",
140
+ "data": {
141
+ "name": "设备名称",
142
+ "status": "online",
143
+ "location": "位置信息"
144
+ }
145
+ }
146
+ ```
147
+
148
+ ### 查询设备最新数据
149
+
150
+ ```
151
+ 调用 get_latest_data 工具,参数:
152
+ {
153
+ "deviceTagPairs": [
154
+ { "deviceId": "设备ID", "tagId": "属性点ID" }
155
+ ]
156
+ }
157
+ ```
158
+
159
+ ### 查询历史数据
160
+
161
+ ```
162
+ 调用 get_history_data 工具,参数:
163
+ {
164
+ "deviceTagPairs": [
165
+ { "deviceId": "设备ID", "tagId": "属性点ID" }
166
+ ],
167
+ "startTime": 1704067200000,
168
+ "endTime": 1704153600000,
169
+ "limit": 1000
170
+ }
171
+ ```
172
+
173
+ ## 开发
174
+
175
+ ```bash
176
+ # 安装依赖
177
+ npm install
178
+
179
+ # 开发模式(自动编译)
180
+ npm run dev
181
+
182
+ # 构建
183
+ npm run build
184
+
185
+ # 运行
186
+ npm start
187
+ ```
188
+
189
+ ## API 文档
190
+
191
+ 本服务器基于 [AIRIOT API 4.0](https://airiot.apifox.cn/llms.txt) 文档实现。
192
+
193
+ 主要接口包括:
194
+
195
+ - **表管理**: `/api/core/table/*`
196
+ - **表记录管理**: `/api/core/table-record/*`
197
+ - **属性点管理**: `/api/core/table/{id}/tags`
198
+ - **时序数据**: `/api/core/time-series/*`
199
+ - **统计**: `/api/core/table/online-stats`
200
+
201
+ ## 注意事项
202
+
203
+ 1. **认证**: 建议使用 Token 认证,避免频繁登录
204
+ 2. **权限**: 确保账号有相应的数据访问权限
205
+ 3. **性能**: 大数据量查询时注意使用 `limit` 和 `skip` 参数
206
+ 4. **错误处理**: 所有工具调用都会返回详细错误信息
207
+
208
+ ## 许可证
209
+
210
+ MIT
211
+
212
+ ## 贡献
213
+
214
+ 欢迎提交 Issue 和 Pull Request!
@@ -0,0 +1,129 @@
1
+ import type { AiriotConfig, QueryParams, TableSchema, TableRecord, PageResponse, Tag, TimeSeriesData } from './types.js';
2
+ /**
3
+ * AIRIOT API 客户端
4
+ */
5
+ export declare class AiriotApiClient {
6
+ private client;
7
+ private config;
8
+ private token?;
9
+ constructor(config: AiriotConfig);
10
+ /**
11
+ * 设置认证令牌
12
+ */
13
+ setToken(token: string): void;
14
+ /**
15
+ * 用户登录
16
+ */
17
+ login(username: string, password: string): Promise<void>;
18
+ /**
19
+ * 查询表数据列表
20
+ * API: GET /core/t/schema
21
+ */
22
+ getTables(params?: QueryParams): Promise<TableSchema[]>;
23
+ /**
24
+ * 根据ID查询单个表数据
25
+ * API: GET /core/t/schema/{id}
26
+ */
27
+ getTableById(id: string): Promise<TableSchema | null>;
28
+ /**
29
+ * 查询子级表数据
30
+ * API: GET /core/t/schema/{id}/children
31
+ */
32
+ getChildTables(parentId: string): Promise<TableSchema[]>;
33
+ /**
34
+ * 保存表数据
35
+ * API: POST /core/t/schema
36
+ */
37
+ saveTable(data: Partial<TableSchema>): Promise<string>;
38
+ /**
39
+ * 更新表数据
40
+ * API: PATCH /core/t/schema/{id}
41
+ */
42
+ updateTable(id: string, data: Partial<TableSchema>): Promise<void>;
43
+ /**
44
+ * 删除表数据
45
+ * API: DELETE /core/t/schema/{id}
46
+ */
47
+ deleteTable(id: string): Promise<void>;
48
+ /**
49
+ * 查询表记录数据
50
+ * API: GET /core/t/{table}/d
51
+ * @param tableName 表名称(不是ID)
52
+ * @param params 查询参数
53
+ */
54
+ getTableRecords(tableName: string, params?: QueryParams): Promise<PageResponse<TableRecord>>;
55
+ /**
56
+ * 根据ID查询单个表记录
57
+ * API: GET /core/t/{table}/d/{id}
58
+ * @param tableName 表名称(不是ID)
59
+ * @param id 记录ID
60
+ */
61
+ getTableRecordById(tableName: string, id: string): Promise<TableRecord | null>;
62
+ /**
63
+ * 保存表记录数据
64
+ * API: POST /core/t/{table}/d
65
+ * @param tableName 表名称(不是ID)
66
+ * @param data 记录数据
67
+ * @param upsert 是否更新已存在的记录
68
+ */
69
+ saveTableRecord(tableName: string, data: Record<string, any>, upsert?: boolean): Promise<string>;
70
+ /**
71
+ * 更新表记录数据
72
+ * API: PATCH /core/t/{table}/d/{id}
73
+ * @param tableName 表名称(不是ID)
74
+ * @param id 记录ID
75
+ * @param data 更新数据
76
+ */
77
+ updateTableRecord(tableName: string, id: string, data: Record<string, any>): Promise<void>;
78
+ /**
79
+ * 删除表记录
80
+ * API: DELETE /core/t/{table}/d/{id}
81
+ * @param tableName 表名称(不是ID)
82
+ * @param id 记录ID
83
+ * @param attachment 是否级联删除附件
84
+ */
85
+ deleteTableRecord(tableName: string, id: string, attachment?: boolean): Promise<void>;
86
+ /**
87
+ * 批量删除表记录
88
+ * API: POST /core/t/{table}/d/batch-delete
89
+ * @param tableName 表名称(不是ID)
90
+ * @param ids 记录ID数组
91
+ */
92
+ batchDeleteTableRecords(tableName: string, ids: string[]): Promise<void>;
93
+ /**
94
+ * 查询表的属性点列表
95
+ * API: GET /core/t/schema/tag/{id}
96
+ * @param tableId 表ID
97
+ */
98
+ getTableTags(tableId: string): Promise<Tag[]>;
99
+ /**
100
+ * 查询表记录的属性点列表
101
+ * API: GET /core/t/{table}/d/tag/{id}
102
+ * @param tableName 表名称(不是ID)
103
+ * @param recordId 记录ID
104
+ */
105
+ getRecordTags(tableName: string, recordId: string): Promise<Tag[]>;
106
+ /**
107
+ * 查询最新数据点
108
+ * API: POST /api/core/time-series/latest
109
+ */
110
+ getLatestData(deviceTagPairs: Array<{
111
+ deviceId: string;
112
+ tagId: string;
113
+ }>): Promise<TimeSeriesData[]>;
114
+ /**
115
+ * 查询历史时序数据
116
+ * API: POST /api/core/time-series/history
117
+ */
118
+ getHistoryData(deviceTagPairs: Array<{
119
+ deviceId: string;
120
+ tagId: string;
121
+ }>, startTime: number, endTime: number, limit?: number): Promise<TimeSeriesData[]>;
122
+ /**
123
+ * 统计设备在线状态
124
+ * API: GET /core/t/status/stats
125
+ * @param tableIds 表ID数组
126
+ */
127
+ getOnlineStats(tableIds: string[]): Promise<Record<string, any>[]>;
128
+ }
129
+ //# sourceMappingURL=airiot-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"airiot-api.d.ts","sourceRoot":"","sources":["../src/airiot-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,265 @@
1
+ import axios from 'axios';
2
+ /**
3
+ * AIRIOT API 客户端
4
+ */
5
+ export class AiriotApiClient {
6
+ client;
7
+ config;
8
+ token;
9
+ constructor(config) {
10
+ this.config = config;
11
+ this.token = config.token;
12
+ this.client = axios.create({
13
+ baseURL: config.baseUrl,
14
+ timeout: 30000,
15
+ headers: {
16
+ 'Content-Type': 'application/json',
17
+ 'x-request-project': config.projectId || 'default',
18
+ },
19
+ });
20
+ // 请求拦截器
21
+ this.client.interceptors.request.use((config) => {
22
+ if (this.token) {
23
+ config.headers['Authorization'] = `Bearer ${this.token}`;
24
+ }
25
+ return config;
26
+ });
27
+ // 响应拦截器
28
+ this.client.interceptors.response.use((response) => response, (error) => {
29
+ console.error('API Error:', error.response?.data || error.message);
30
+ throw error;
31
+ });
32
+ }
33
+ /**
34
+ * 设置认证令牌
35
+ */
36
+ setToken(token) {
37
+ this.token = token;
38
+ }
39
+ /**
40
+ * 用户登录
41
+ */
42
+ async login(username, password) {
43
+ const response = await this.client.post('/api/auth/login', {
44
+ username,
45
+ password,
46
+ projectId: this.config.projectId,
47
+ });
48
+ if (response.data.code === 200 && response.data.data.token) {
49
+ this.token = response.data.data.token;
50
+ }
51
+ else {
52
+ throw new Error(response.data.message || '登录失败');
53
+ }
54
+ }
55
+ // ==================== 表管理接口 ====================
56
+ /**
57
+ * 查询表数据列表
58
+ * API: GET /core/t/schema
59
+ */
60
+ async getTables(params) {
61
+ const response = await this.client.get('/core/t/schema', {
62
+ params: { query: JSON.stringify(params || {}) },
63
+ });
64
+ return response.data || [];
65
+ }
66
+ /**
67
+ * 根据ID查询单个表数据
68
+ * API: GET /core/t/schema/{id}
69
+ */
70
+ async getTableById(id) {
71
+ const response = await this.client.get(`/core/t/schema/${id}`);
72
+ return response.data || null;
73
+ }
74
+ /**
75
+ * 查询子级表数据
76
+ * API: GET /core/t/schema/{id}/children
77
+ */
78
+ async getChildTables(parentId) {
79
+ const response = await this.client.get(`/core/t/schema/${parentId}/children`);
80
+ return response.data || [];
81
+ }
82
+ /**
83
+ * 保存表数据
84
+ * API: POST /core/t/schema
85
+ */
86
+ async saveTable(data) {
87
+ const response = await this.client.post('/core/t/schema', data);
88
+ if (response.data.InsertedID) {
89
+ return response.data.InsertedID;
90
+ }
91
+ throw new Error('保存失败');
92
+ }
93
+ /**
94
+ * 更新表数据
95
+ * API: PATCH /core/t/schema/{id}
96
+ */
97
+ async updateTable(id, data) {
98
+ const response = await this.client.patch(`/core/t/schema/${id}`, data);
99
+ if (response.data.status !== 'OK') {
100
+ throw new Error('更新失败');
101
+ }
102
+ }
103
+ /**
104
+ * 删除表数据
105
+ * API: DELETE /core/t/schema/{id}
106
+ */
107
+ async deleteTable(id) {
108
+ const response = await this.client.delete(`/core/t/schema/${id}`);
109
+ if (response.data.status !== 'OK') {
110
+ throw new Error('删除失败');
111
+ }
112
+ }
113
+ // ==================== 表记录管理接口 ====================
114
+ /**
115
+ * 查询表记录数据
116
+ * API: GET /core/t/{table}/d
117
+ * @param tableName 表名称(不是ID)
118
+ * @param params 查询参数
119
+ */
120
+ async getTableRecords(tableName, params) {
121
+ const queryParams = {};
122
+ if (params?.withCount) {
123
+ queryParams.withCount = true;
124
+ }
125
+ const response = await this.client.get(`/core/t/${tableName}/d`, {
126
+ params: {
127
+ query: JSON.stringify(params || {}),
128
+ ...queryParams,
129
+ },
130
+ });
131
+ let totalCount = response.data?.length || 0;
132
+ if (params?.withCount && response.headers['count']) {
133
+ totalCount = parseInt(response.headers['count'], 10);
134
+ }
135
+ return {
136
+ list: response.data || [],
137
+ total: totalCount,
138
+ limit: params?.limit || 50,
139
+ skip: params?.skip || 0,
140
+ };
141
+ }
142
+ /**
143
+ * 根据ID查询单个表记录
144
+ * API: GET /core/t/{table}/d/{id}
145
+ * @param tableName 表名称(不是ID)
146
+ * @param id 记录ID
147
+ */
148
+ async getTableRecordById(tableName, id) {
149
+ const response = await this.client.get(`/core/t/${tableName}/d/${id}`);
150
+ return response.data || null;
151
+ }
152
+ /**
153
+ * 保存表记录数据
154
+ * API: POST /core/t/{table}/d
155
+ * @param tableName 表名称(不是ID)
156
+ * @param data 记录数据
157
+ * @param upsert 是否更新已存在的记录
158
+ */
159
+ async saveTableRecord(tableName, data, upsert = false) {
160
+ const response = await this.client.post(`/core/t/${tableName}/d`, data, {
161
+ params: { upsert: upsert ? 'true' : undefined },
162
+ });
163
+ if (response.data.InsertedID) {
164
+ return response.data.InsertedID;
165
+ }
166
+ throw new Error('保存失败');
167
+ }
168
+ /**
169
+ * 更新表记录数据
170
+ * API: PATCH /core/t/{table}/d/{id}
171
+ * @param tableName 表名称(不是ID)
172
+ * @param id 记录ID
173
+ * @param data 更新数据
174
+ */
175
+ async updateTableRecord(tableName, id, data) {
176
+ const response = await this.client.patch(`/core/t/${tableName}/d/${id}`, data);
177
+ if (response.data.status !== 'OK') {
178
+ throw new Error('更新失败');
179
+ }
180
+ }
181
+ /**
182
+ * 删除表记录
183
+ * API: DELETE /core/t/{table}/d/{id}
184
+ * @param tableName 表名称(不是ID)
185
+ * @param id 记录ID
186
+ * @param attachment 是否级联删除附件
187
+ */
188
+ async deleteTableRecord(tableName, id, attachment = false) {
189
+ const response = await this.client.delete(`/core/t/${tableName}/d/${id}`, {
190
+ params: { attachment: attachment ? 'true' : undefined },
191
+ });
192
+ if (response.data.status !== 'OK') {
193
+ throw new Error('删除失败');
194
+ }
195
+ }
196
+ /**
197
+ * 批量删除表记录
198
+ * API: POST /core/t/{table}/d/batch-delete
199
+ * @param tableName 表名称(不是ID)
200
+ * @param ids 记录ID数组
201
+ */
202
+ async batchDeleteTableRecords(tableName, ids) {
203
+ const response = await this.client.post(`/core/t/${tableName}/d/batch-delete`, { ids });
204
+ if (response.data.status !== 'OK') {
205
+ throw new Error('批量删除失败');
206
+ }
207
+ }
208
+ // ==================== 属性点管理接口 ====================
209
+ /**
210
+ * 查询表的属性点列表
211
+ * API: GET /core/t/schema/tag/{id}
212
+ * @param tableId 表ID
213
+ */
214
+ async getTableTags(tableId) {
215
+ const response = await this.client.get(`/core/t/schema/tag/${tableId}`);
216
+ return response.data || [];
217
+ }
218
+ /**
219
+ * 查询表记录的属性点列表
220
+ * API: GET /core/t/{table}/d/tag/{id}
221
+ * @param tableName 表名称(不是ID)
222
+ * @param recordId 记录ID
223
+ */
224
+ async getRecordTags(tableName, recordId) {
225
+ const response = await this.client.get(`/core/t/${tableName}/d/tag/${recordId}`);
226
+ return response.data || [];
227
+ }
228
+ // ==================== 时序数据接口 ====================
229
+ /**
230
+ * 查询最新数据点
231
+ * API: POST /api/core/time-series/latest
232
+ */
233
+ async getLatestData(deviceTagPairs) {
234
+ const response = await this.client.post('/api/core/time-series/latest', { deviceTagPairs });
235
+ return response.data || [];
236
+ }
237
+ /**
238
+ * 查询历史时序数据
239
+ * API: POST /api/core/time-series/history
240
+ */
241
+ async getHistoryData(deviceTagPairs, startTime, endTime, limit) {
242
+ const response = await this.client.post('/api/core/time-series/history', {
243
+ deviceTagPairs,
244
+ startTime,
245
+ endTime,
246
+ limit,
247
+ });
248
+ return response.data || [];
249
+ }
250
+ // ==================== 统计接口 ====================
251
+ /**
252
+ * 统计设备在线状态
253
+ * API: GET /core/t/status/stats
254
+ * @param tableIds 表ID数组
255
+ */
256
+ async getOnlineStats(tableIds) {
257
+ const response = await this.client.get('/core/t/status/stats', {
258
+ params: {
259
+ query: JSON.stringify({ tableIds }),
260
+ },
261
+ });
262
+ return response.data || [];
263
+ }
264
+ }
265
+ //# sourceMappingURL=airiot-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"airiot-api.js","sourceRoot":"","sources":["../src/airiot-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAG7C;;GAEG;AACH,MAAM,OAAO,eAAe;IAClB,MAAM,CAAgB;IACtB,MAAM,CAAe;IACrB,KAAK,CAAU;IAEvB,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAE1B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,mBAAmB,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS;aACnD;SACF,CAAC,CAAC;QAEH,QAAQ;QACR,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3D,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,QAAQ;QACR,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CACnC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,CAAC,KAAK,EAAE,EAAE;YACR,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YACnE,MAAM,KAAK,CAAC;QACd,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,QAAgB,EAAE,QAAgB;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAiC,iBAAiB,EAAE;YACzF,QAAQ;YACR,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;SACjC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAC3D,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAID,kDAAkD;IAElD;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,MAAoB;QAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAgB,gBAAgB,EAAE;YACtE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE;SAChD,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,EAAU;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAc,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAE5E,OAAO,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,kBAAkB,QAAQ,WAAW,CACtC,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,IAA0B;QACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,gBAAgB,EAChB,IAAI,CACL,CAAC;QAEF,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;QAClC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU,EAAE,IAA0B;QACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAqB,kBAAkB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAE3F,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,EAAU;QAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAqB,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAEtF,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,oDAAoD;IAEpD;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,MAAoB;QAC3D,MAAM,WAAW,GAAwB,EAAE,CAAC;QAE5C,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;YACtB,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC;QAC/B,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,WAAW,SAAS,IAAI,EACxB;YACE,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC;gBACnC,GAAG,WAAW;aACf;SACF,CACF,CAAC;QAEF,IAAI,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;QAE5C,IAAI,MAAM,EAAE,SAAS,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;YACzB,KAAK,EAAE,UAAU;YACjB,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;YAC1B,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC;SACxB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CAAC,SAAiB,EAAE,EAAU;QACpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,WAAW,SAAS,MAAM,EAAE,EAAE,CAC/B,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,IAAyB,EAAE,SAAkB,KAAK;QACzF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,WAAW,SAAS,IAAI,EACxB,IAAI,EACJ;YACE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE;SAChD,CACF,CAAC;QAEF,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;QAClC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB,EAAE,EAAU,EAAE,IAAyB;QAC9E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CACtC,WAAW,SAAS,MAAM,EAAE,EAAE,EAC9B,IAAI,CACL,CAAC;QAEF,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB,EAAE,EAAU,EAAE,aAAsB,KAAK;QAChF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CACvC,WAAW,SAAS,MAAM,EAAE,EAAE,EAC9B;YACE,MAAM,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE;SACxD,CACF,CAAC;QAEF,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,uBAAuB,CAAC,SAAiB,EAAE,GAAa;QAC5D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,WAAW,SAAS,iBAAiB,EACrC,EAAE,GAAG,EAAE,CACR,CAAC;QAEF,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,oDAAoD;IAEpD;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,OAAe;QAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAQ,sBAAsB,OAAO,EAAE,CAAC,CAAC;QAE/E,OAAO,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,QAAgB;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,WAAW,SAAS,UAAU,QAAQ,EAAE,CACzC,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,mDAAmD;IAEnD;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,cAA0D;QAC5E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,8BAA8B,EAC9B,EAAE,cAAc,EAAE,CACnB,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc,CAClB,cAA0D,EAC1D,SAAiB,EACjB,OAAe,EACf,KAAc;QAEd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACrC,+BAA+B,EAC/B;YACE,cAAc;YACd,SAAS;YACT,OAAO;YACP,KAAK;SACN,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,iDAAiD;IAEjD;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,QAAkB;QACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACpC,sBAAsB,EACtB;YACE,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;aACpC;SACF,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;IAC7B,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,118 @@
1
+ #!/usr/bin/env node
2
+ import dotenv from 'dotenv';
3
+ dotenv.config();
4
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
5
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
7
+ import { AiriotApiClient } from './airiot-api.js';
8
+ import { airiotTools, executeTool } from './tools/index.js';
9
+ /**
10
+ * AIRIOT MCP Server
11
+ *
12
+ * 提供对AIRIOT IoT平台数据表、记录、属性点和时序数据的访问
13
+ */
14
+ class AiriotMcpServer {
15
+ server;
16
+ apiClient;
17
+ constructor(config) {
18
+ // 初始化API客户端
19
+ this.apiClient = new AiriotApiClient(config);
20
+ // 如果提供了用户名密码,自动登录
21
+ if (config.username && config.password) {
22
+ this.apiClient.login(config.username, config.password).catch((err) => {
23
+ console.error('登录失败:', err.message);
24
+ });
25
+ }
26
+ // 创建MCP Server
27
+ this.server = new Server({
28
+ name: 'airiot-mcp-server',
29
+ version: '1.0.0',
30
+ }, {
31
+ capabilities: {
32
+ tools: {},
33
+ },
34
+ });
35
+ // 注册处理器
36
+ this.setupHandlers();
37
+ }
38
+ /**
39
+ * 设置MCP协议处理器
40
+ */
41
+ setupHandlers() {
42
+ // 列出可用工具
43
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
44
+ return {
45
+ tools: airiotTools,
46
+ };
47
+ });
48
+ // 执行工具调用
49
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
50
+ const { name, arguments: args } = request.params;
51
+ try {
52
+ const result = await executeTool(name, args || {}, this.apiClient);
53
+ return {
54
+ content: [
55
+ {
56
+ type: 'text',
57
+ text: JSON.stringify(result, null, 2),
58
+ },
59
+ ],
60
+ };
61
+ }
62
+ catch (error) {
63
+ return {
64
+ content: [
65
+ {
66
+ type: 'text',
67
+ text: JSON.stringify({
68
+ error: error.message || '执行失败',
69
+ details: error.response?.data || error.stack,
70
+ }, null, 2),
71
+ },
72
+ ],
73
+ isError: true,
74
+ };
75
+ }
76
+ });
77
+ }
78
+ /**
79
+ * 启动服务器
80
+ */
81
+ async start() {
82
+ const transport = new StdioServerTransport();
83
+ await this.server.connect(transport);
84
+ console.error('AIRIOT MCP Server running');
85
+ }
86
+ }
87
+ /**
88
+ * 主函数
89
+ */
90
+ async function main() {
91
+ // 从环境变量读取配置
92
+ const config = {
93
+ baseUrl: process.env.AIRIOT_BASE_URL || '',
94
+ projectId: process.env.AIRIOT_PROJECT_ID || '',
95
+ token: process.env.AIRIOT_TOKEN,
96
+ username: process.env.AIRIOT_USERNAME,
97
+ password: process.env.AIRIOT_PASSWORD,
98
+ };
99
+ // 验证必要配置
100
+ if (!config.baseUrl) {
101
+ throw new Error('环境变量 AIRIOT_BASE_URL 未设置');
102
+ }
103
+ if (!config.projectId) {
104
+ throw new Error('环境变量 AIRIOT_PROJECT_ID 未设置');
105
+ }
106
+ if (!config.token && !(config.username && config.password)) {
107
+ throw new Error('必须设置 AIRIOT_TOKEN 或 (AIRIOT_USERNAME + AIRIOT_PASSWORD)');
108
+ }
109
+ // 启动服务器
110
+ const server = new AiriotMcpServer(config);
111
+ await server.start();
112
+ }
113
+ // 启动服务器
114
+ main().catch((err) => {
115
+ console.error('Fatal error:', err);
116
+ process.exit(1);
117
+ });
118
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import { AiriotApiClient } from '../airiot-api.js';
3
+ /**
4
+ * MCP 工具定义
5
+ */
6
+ export declare const airiotTools: Tool[];
7
+ /**
8
+ * 执行MCP工具调用
9
+ */
10
+ export declare function executeTool(toolName: string, args: any, apiClient: AiriotApiClient): Promise<any>;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,IAAI,EAiX7B,CAAC;AAEF;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,EACT,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,GAAG,CAAC,CAoDd"}
@@ -0,0 +1,405 @@
1
+ /**
2
+ * MCP 工具定义
3
+ */
4
+ export const airiotTools = [
5
+ // ==================== 表管理工具 ====================
6
+ {
7
+ name: 'get_tables',
8
+ description: '查询AIRIOT数据表列表,支持过滤、排序和分页',
9
+ inputSchema: {
10
+ type: 'object',
11
+ properties: {
12
+ filter: {
13
+ type: 'object',
14
+ description: '查询过滤条件,例如: {"name": "设备表"}',
15
+ },
16
+ sort: {
17
+ type: 'object',
18
+ description: '排序条件,例如: {"createTime": -1} 表示按创建时间倒序',
19
+ },
20
+ limit: {
21
+ type: 'number',
22
+ description: '返回数量限制',
23
+ default: 50,
24
+ },
25
+ skip: {
26
+ type: 'number',
27
+ description: '跳过数量,用于分页',
28
+ default: 0,
29
+ },
30
+ },
31
+ },
32
+ },
33
+ {
34
+ name: 'get_table_by_id',
35
+ description: '根据ID查询单个数据表的详细信息',
36
+ inputSchema: {
37
+ type: 'object',
38
+ properties: {
39
+ id: {
40
+ type: 'string',
41
+ description: '表ID',
42
+ },
43
+ },
44
+ required: ['id'],
45
+ },
46
+ },
47
+ {
48
+ name: 'create_table',
49
+ description: '创建新的数据表',
50
+ inputSchema: {
51
+ type: 'object',
52
+ properties: {
53
+ name: {
54
+ type: 'string',
55
+ description: '表名称',
56
+ },
57
+ description: {
58
+ type: 'string',
59
+ description: '表描述',
60
+ },
61
+ type: {
62
+ type: 'string',
63
+ description: '表类型',
64
+ },
65
+ },
66
+ required: ['name'],
67
+ },
68
+ },
69
+ {
70
+ name: 'update_table',
71
+ description: '更新数据表信息',
72
+ inputSchema: {
73
+ type: 'object',
74
+ properties: {
75
+ id: {
76
+ type: 'string',
77
+ description: '表ID',
78
+ },
79
+ name: {
80
+ type: 'string',
81
+ description: '表名称',
82
+ },
83
+ description: {
84
+ type: 'string',
85
+ description: '表描述',
86
+ },
87
+ },
88
+ required: ['id'],
89
+ },
90
+ },
91
+ {
92
+ name: 'delete_table',
93
+ description: '删除数据表',
94
+ inputSchema: {
95
+ type: 'object',
96
+ properties: {
97
+ id: {
98
+ type: 'string',
99
+ description: '表ID',
100
+ },
101
+ },
102
+ required: ['id'],
103
+ },
104
+ },
105
+ // ==================== 表记录管理工具 ====================
106
+ {
107
+ name: 'get_table_records',
108
+ description: '查询数据表的记录列表,支持过滤、排序、分页和字段投影',
109
+ inputSchema: {
110
+ type: 'object',
111
+ properties: {
112
+ tableName: {
113
+ type: 'string',
114
+ description: '表名称(不是ID)',
115
+ },
116
+ filter: {
117
+ type: 'object',
118
+ description: '查询过滤条件,类似于关系库的where参数。第一级的key可以是字段名称或者or等特殊参数。\n- 字段名称支持完全匹配和模糊搜索\n- or表示多个条件中满足其中一个即可\n- 示例1(完全匹配): {"status": "online", "type": "sensor"}\n- 示例2(模糊搜索): {"name": {"$regex": "设备", "$options": "i"}}\n- 示例3(or条件): {"$or": [{"status": "online"}, {"type": "sensor"}]}\n- 示例4(组合查询): {"status": "online", "$or": [{"type": "sensor"}, {"type": "controller"}]}',
119
+ },
120
+ sort: {
121
+ type: 'object',
122
+ description: '排序条件,类似于关系库的order by参数。格式{key:value},key是需要排序的字段名称,value是1和-1,1表示升序,-1表示降序。\n- 可以同时按照多个字段排序,排序优先级按照字段顺序\n- 示例1(单字段升序): {"createTime": 1}\n- 示例2(单字段降序): {"createTime": -1}\n- 示例3(多字段排序): {"status": 1, "createTime": -1} (先按status升序,相同值按createTime降序)',
123
+ },
124
+ limit: {
125
+ type: 'number',
126
+ description: '分页查询参数,指定返回的记录数量限制,格式{key:value},key是limit,value是实际值。类似于关系库的LIMIT语句。',
127
+ default: 50,
128
+ },
129
+ skip: {
130
+ type: 'number',
131
+ description: '分页查询参数,指定跳过的记录数量,用于分页,格式{key:value},key是skip,value是实际值。类似于关系库的OFFSET语句。',
132
+ default: 0,
133
+ },
134
+ project: {
135
+ type: 'object',
136
+ description: '字段投影,指定需要查询返回的字段,格式{key:value},key是字段名称,value是1表示包含该字段。\n- 示例: {"name": 1, "status": 1, "createTime": 1} 只返回name、status和createTime字段',
137
+ },
138
+ withCount: {
139
+ type: 'object',
140
+ description: '总条数统计参数,格式{key:value},key是固定值withCount,value是true。会在响应头加上count字段,对应值为总条数。\n- 示例: {"withCount": true}',
141
+ },
142
+ },
143
+ required: ['tableName'],
144
+ },
145
+ },
146
+ {
147
+ name: 'get_record_by_id',
148
+ description: '根据ID查询单个表记录的详细信息',
149
+ inputSchema: {
150
+ type: 'object',
151
+ properties: {
152
+ tableName: {
153
+ type: 'string',
154
+ description: '表名称(不是ID)',
155
+ },
156
+ id: {
157
+ type: 'string',
158
+ description: '记录ID',
159
+ },
160
+ },
161
+ required: ['tableName', 'id'],
162
+ },
163
+ },
164
+ {
165
+ name: 'create_record',
166
+ description: '在指定表中创建新记录',
167
+ inputSchema: {
168
+ type: 'object',
169
+ properties: {
170
+ tableName: {
171
+ type: 'string',
172
+ description: '表名称(不是ID)',
173
+ },
174
+ data: {
175
+ type: 'object',
176
+ description: '记录数据,键值对形式',
177
+ },
178
+ upsert: {
179
+ type: 'boolean',
180
+ description: '如果记录ID存在则更新,否则新增',
181
+ default: false,
182
+ },
183
+ },
184
+ required: ['tableName', 'data'],
185
+ },
186
+ },
187
+ {
188
+ name: 'update_record',
189
+ description: '更新表记录数据',
190
+ inputSchema: {
191
+ type: 'object',
192
+ properties: {
193
+ tableName: {
194
+ type: 'string',
195
+ description: '表名称(不是ID)',
196
+ },
197
+ id: {
198
+ type: 'string',
199
+ description: '记录ID',
200
+ },
201
+ data: {
202
+ type: 'object',
203
+ description: '要更新的数据,键值对形式',
204
+ },
205
+ },
206
+ required: ['tableName', 'id', 'data'],
207
+ },
208
+ },
209
+ {
210
+ name: 'delete_record',
211
+ description: '删除单条表记录',
212
+ inputSchema: {
213
+ type: 'object',
214
+ properties: {
215
+ tableName: {
216
+ type: 'string',
217
+ description: '表名称(不是ID)',
218
+ },
219
+ id: {
220
+ type: 'string',
221
+ description: '记录ID',
222
+ },
223
+ attachment: {
224
+ type: 'boolean',
225
+ description: '是否级联删除附件',
226
+ default: false,
227
+ },
228
+ },
229
+ required: ['tableName', 'id'],
230
+ },
231
+ },
232
+ {
233
+ name: 'batch_delete_records',
234
+ description: '批量删除表记录',
235
+ inputSchema: {
236
+ type: 'object',
237
+ properties: {
238
+ tableName: {
239
+ type: 'string',
240
+ description: '表名称(不是ID)',
241
+ },
242
+ ids: {
243
+ type: 'array',
244
+ items: { type: 'string' },
245
+ description: '记录ID数组',
246
+ },
247
+ },
248
+ required: ['tableName', 'ids'],
249
+ },
250
+ },
251
+ // ==================== 属性点查询工具 ====================
252
+ {
253
+ name: 'get_table_tags',
254
+ description: '查询数据表的所有属性点定义',
255
+ inputSchema: {
256
+ type: 'object',
257
+ properties: {
258
+ tableId: {
259
+ type: 'string',
260
+ description: '表ID',
261
+ },
262
+ },
263
+ required: ['tableId'],
264
+ },
265
+ },
266
+ {
267
+ name: 'get_record_tags',
268
+ description: '查询表记录的属性点列表',
269
+ inputSchema: {
270
+ type: 'object',
271
+ properties: {
272
+ tableName: {
273
+ type: 'string',
274
+ description: '表名称(不是ID)',
275
+ },
276
+ recordId: {
277
+ type: 'string',
278
+ description: '记录ID',
279
+ },
280
+ },
281
+ required: ['tableName', 'recordId'],
282
+ },
283
+ },
284
+ // ==================== 时序数据查询工具 ====================
285
+ {
286
+ name: 'get_latest_data',
287
+ description: '查询设备属性点的最新数据',
288
+ inputSchema: {
289
+ type: 'object',
290
+ properties: {
291
+ deviceTagPairs: {
292
+ type: 'array',
293
+ description: '设备和属性点对数组',
294
+ items: {
295
+ type: 'object',
296
+ properties: {
297
+ deviceId: { type: 'string' },
298
+ tagId: { type: 'string' },
299
+ },
300
+ required: ['deviceId', 'tagId'],
301
+ },
302
+ },
303
+ },
304
+ required: ['deviceTagPairs'],
305
+ },
306
+ },
307
+ {
308
+ name: 'get_history_data',
309
+ description: '查询设备属性点的历史时序数据',
310
+ inputSchema: {
311
+ type: 'object',
312
+ properties: {
313
+ deviceTagPairs: {
314
+ type: 'array',
315
+ description: '设备和属性点对数组',
316
+ items: {
317
+ type: 'object',
318
+ properties: {
319
+ deviceId: { type: 'string' },
320
+ tagId: { type: 'string' },
321
+ },
322
+ required: ['deviceId', 'tagId'],
323
+ },
324
+ },
325
+ startTime: {
326
+ type: 'number',
327
+ description: '开始时间戳(毫秒)',
328
+ },
329
+ endTime: {
330
+ type: 'number',
331
+ description: '结束时间戳(毫秒)',
332
+ },
333
+ limit: {
334
+ type: 'number',
335
+ description: '返回数量限制',
336
+ default: 1000,
337
+ },
338
+ },
339
+ required: ['deviceTagPairs', 'startTime', 'endTime'],
340
+ },
341
+ },
342
+ // ==================== 统计工具 ====================
343
+ {
344
+ name: 'get_online_stats',
345
+ description: '统计数据表下设备的在线状态',
346
+ inputSchema: {
347
+ type: 'object',
348
+ properties: {
349
+ tableIds: {
350
+ type: 'array',
351
+ items: { type: 'string' },
352
+ description: '表ID数组',
353
+ },
354
+ },
355
+ required: ['tableIds'],
356
+ },
357
+ },
358
+ ];
359
+ /**
360
+ * 执行MCP工具调用
361
+ */
362
+ export async function executeTool(toolName, args, apiClient) {
363
+ switch (toolName) {
364
+ // 表管理
365
+ case 'get_tables':
366
+ return await apiClient.getTables(args);
367
+ case 'get_table_by_id':
368
+ return await apiClient.getTableById(args.id);
369
+ case 'create_table':
370
+ return await apiClient.saveTable(args);
371
+ case 'update_table':
372
+ return await apiClient.updateTable(args.id, args);
373
+ case 'delete_table':
374
+ return await apiClient.deleteTable(args.id);
375
+ // 表记录管理
376
+ case 'get_table_records':
377
+ return await apiClient.getTableRecords(args.tableName, args);
378
+ case 'get_record_by_id':
379
+ return await apiClient.getTableRecordById(args.tableName, args.id);
380
+ case 'create_record':
381
+ return await apiClient.saveTableRecord(args.tableName, args.data, args.upsert);
382
+ case 'update_record':
383
+ return await apiClient.updateTableRecord(args.tableName, args.id, args.data);
384
+ case 'delete_record':
385
+ return await apiClient.deleteTableRecord(args.tableName, args.id, args.attachment);
386
+ case 'batch_delete_records':
387
+ return await apiClient.batchDeleteTableRecords(args.tableName, args.ids);
388
+ // 属性点查询
389
+ case 'get_table_tags':
390
+ return await apiClient.getTableTags(args.tableId);
391
+ case 'get_record_tags':
392
+ return await apiClient.getRecordTags(args.tableName, args.recordId);
393
+ // 时序数据查询
394
+ case 'get_latest_data':
395
+ return await apiClient.getLatestData(args.deviceTagPairs);
396
+ case 'get_history_data':
397
+ return await apiClient.getHistoryData(args.deviceTagPairs, args.startTime, args.endTime, args.limit);
398
+ // 统计
399
+ case 'get_online_stats':
400
+ return await apiClient.getOnlineStats(args.tableIds);
401
+ default:
402
+ throw new Error(`Unknown tool: ${toolName}`);
403
+ }
404
+ }
405
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * AIRIOT API 类型定义
3
+ */
4
+ export interface QueryParams {
5
+ filter?: Record<string, any>;
6
+ sort?: Record<string, 1 | -1>;
7
+ limit?: number;
8
+ skip?: number;
9
+ projection?: Record<string, 0 | 1>;
10
+ project?: Record<string, 0 | 1>;
11
+ withCount?: boolean;
12
+ }
13
+ export interface TableSchema {
14
+ _id: string;
15
+ name: string;
16
+ description?: string;
17
+ projectId: string;
18
+ type?: string;
19
+ createTime?: number;
20
+ updateTime?: number;
21
+ [key: string]: any;
22
+ }
23
+ export interface TableRecord {
24
+ _id: string;
25
+ tableId: string;
26
+ data: Record<string, any>;
27
+ createTime?: number;
28
+ updateTime?: number;
29
+ [key: string]: any;
30
+ }
31
+ export interface Tag {
32
+ _id: string;
33
+ name: string;
34
+ deviceId: string;
35
+ dataType: string;
36
+ unit?: string;
37
+ description?: string;
38
+ [key: string]: any;
39
+ }
40
+ export interface TimeSeriesData {
41
+ deviceId: string;
42
+ tagId: string;
43
+ time: number;
44
+ value: any;
45
+ quality?: string;
46
+ }
47
+ export interface ApiResponse<T = any> {
48
+ code: number;
49
+ message: string;
50
+ data: T;
51
+ }
52
+ export interface PageResponse<T = any> {
53
+ list: T[];
54
+ total: number;
55
+ limit: number;
56
+ skip: number;
57
+ }
58
+ export interface AiriotConfig {
59
+ baseUrl: string;
60
+ projectId: string;
61
+ token?: string;
62
+ username?: string;
63
+ password?: string;
64
+ }
65
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAGD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAGD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAGD,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAGD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;CACT;AAGD,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,GAAG;IACnC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * AIRIOT API 类型定义
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@airiot/mcp-server",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for AIRIOT IoT platform",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "airiot-mcp-server": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "watch": "tsc --watch",
13
+ "start": "node dist/index.js",
14
+ "dev": "tsc --watch"
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "keywords": [
23
+ "mcp",
24
+ "airiot",
25
+ "iot",
26
+ "model-context-protocol"
27
+ ],
28
+ "author": "",
29
+ "license": "MIT",
30
+ "dependencies": {
31
+ "@modelcontextprotocol/sdk": "^1.0.4",
32
+ "axios": "^1.7.9",
33
+ "dotenv": "^17.2.3"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^22.0.0",
37
+ "typescript": "^5.6.0"
38
+ }
39
+ }