@cicctencent/agent-server 0.2.73 → 0.2.75

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.
Files changed (95) hide show
  1. package/dist/cjs/agent/agent-server.d.ts.map +1 -1
  2. package/dist/cjs/agent/agent-server.js +90 -6
  3. package/dist/cjs/agent/agent-server.js.map +1 -1
  4. package/dist/cjs/connectors/calendar-adapter.d.ts +4 -11
  5. package/dist/cjs/connectors/calendar-adapter.d.ts.map +1 -1
  6. package/dist/cjs/connectors/calendar-adapter.js +84 -115
  7. package/dist/cjs/connectors/calendar-adapter.js.map +1 -1
  8. package/dist/cjs/connectors/db-adapter.d.ts +5 -22
  9. package/dist/cjs/connectors/db-adapter.d.ts.map +1 -1
  10. package/dist/cjs/connectors/db-adapter.js +316 -119
  11. package/dist/cjs/connectors/db-adapter.js.map +1 -1
  12. package/dist/cjs/connectors/email-adapter.d.ts +12 -14
  13. package/dist/cjs/connectors/email-adapter.d.ts.map +1 -1
  14. package/dist/cjs/connectors/email-adapter.js +286 -127
  15. package/dist/cjs/connectors/email-adapter.js.map +1 -1
  16. package/dist/cjs/connectors/fs-adapter.d.ts +3 -9
  17. package/dist/cjs/connectors/fs-adapter.d.ts.map +1 -1
  18. package/dist/cjs/connectors/fs-adapter.js +77 -87
  19. package/dist/cjs/connectors/fs-adapter.js.map +1 -1
  20. package/dist/cjs/connectors/http-adapter.d.ts +14 -18
  21. package/dist/cjs/connectors/http-adapter.d.ts.map +1 -1
  22. package/dist/cjs/connectors/http-adapter.js +260 -135
  23. package/dist/cjs/connectors/http-adapter.js.map +1 -1
  24. package/dist/cjs/connectors/index.d.ts +4 -2
  25. package/dist/cjs/connectors/index.d.ts.map +1 -1
  26. package/dist/cjs/connectors/index.js +137 -1
  27. package/dist/cjs/connectors/index.js.map +1 -1
  28. package/dist/cjs/connectors/mcp-adapter.d.ts +9 -17
  29. package/dist/cjs/connectors/mcp-adapter.d.ts.map +1 -1
  30. package/dist/cjs/connectors/mcp-adapter.js +186 -136
  31. package/dist/cjs/connectors/mcp-adapter.js.map +1 -1
  32. package/dist/cjs/connectors/mq-adapter.d.ts +10 -15
  33. package/dist/cjs/connectors/mq-adapter.d.ts.map +1 -1
  34. package/dist/cjs/connectors/mq-adapter.js +264 -142
  35. package/dist/cjs/connectors/mq-adapter.js.map +1 -1
  36. package/dist/cjs/index.d.ts +1 -1
  37. package/dist/cjs/index.d.ts.map +1 -1
  38. package/dist/cjs/index.js +4 -3
  39. package/dist/cjs/index.js.map +1 -1
  40. package/dist/cjs/spi/observability-store.d.ts +30 -8
  41. package/dist/cjs/spi/observability-store.d.ts.map +1 -1
  42. package/dist/cjs/spi/observability-store.js +33 -5
  43. package/dist/cjs/spi/observability-store.js.map +1 -1
  44. package/dist/cjs/spi/types.d.ts +2 -0
  45. package/dist/cjs/spi/types.d.ts.map +1 -1
  46. package/dist/cjs/types.d.ts +170 -10
  47. package/dist/cjs/types.d.ts.map +1 -1
  48. package/dist/esm/agent/agent-server.d.ts.map +1 -1
  49. package/dist/esm/agent/agent-server.js +90 -6
  50. package/dist/esm/agent/agent-server.js.map +1 -1
  51. package/dist/esm/connectors/calendar-adapter.d.ts +4 -11
  52. package/dist/esm/connectors/calendar-adapter.d.ts.map +1 -1
  53. package/dist/esm/connectors/calendar-adapter.js +84 -115
  54. package/dist/esm/connectors/calendar-adapter.js.map +1 -1
  55. package/dist/esm/connectors/db-adapter.d.ts +5 -22
  56. package/dist/esm/connectors/db-adapter.d.ts.map +1 -1
  57. package/dist/esm/connectors/db-adapter.js +315 -118
  58. package/dist/esm/connectors/db-adapter.js.map +1 -1
  59. package/dist/esm/connectors/email-adapter.d.ts +12 -14
  60. package/dist/esm/connectors/email-adapter.d.ts.map +1 -1
  61. package/dist/esm/connectors/email-adapter.js +253 -127
  62. package/dist/esm/connectors/email-adapter.js.map +1 -1
  63. package/dist/esm/connectors/fs-adapter.d.ts +3 -9
  64. package/dist/esm/connectors/fs-adapter.d.ts.map +1 -1
  65. package/dist/esm/connectors/fs-adapter.js +77 -87
  66. package/dist/esm/connectors/fs-adapter.js.map +1 -1
  67. package/dist/esm/connectors/http-adapter.d.ts +14 -18
  68. package/dist/esm/connectors/http-adapter.d.ts.map +1 -1
  69. package/dist/esm/connectors/http-adapter.js +260 -135
  70. package/dist/esm/connectors/http-adapter.js.map +1 -1
  71. package/dist/esm/connectors/index.d.ts +4 -2
  72. package/dist/esm/connectors/index.d.ts.map +1 -1
  73. package/dist/esm/connectors/index.js +136 -1
  74. package/dist/esm/connectors/index.js.map +1 -1
  75. package/dist/esm/connectors/mcp-adapter.d.ts +9 -17
  76. package/dist/esm/connectors/mcp-adapter.d.ts.map +1 -1
  77. package/dist/esm/connectors/mcp-adapter.js +153 -136
  78. package/dist/esm/connectors/mcp-adapter.js.map +1 -1
  79. package/dist/esm/connectors/mq-adapter.d.ts +10 -15
  80. package/dist/esm/connectors/mq-adapter.d.ts.map +1 -1
  81. package/dist/esm/connectors/mq-adapter.js +230 -141
  82. package/dist/esm/connectors/mq-adapter.js.map +1 -1
  83. package/dist/esm/index.d.ts +1 -1
  84. package/dist/esm/index.d.ts.map +1 -1
  85. package/dist/esm/index.js +1 -1
  86. package/dist/esm/index.js.map +1 -1
  87. package/dist/esm/spi/observability-store.d.ts +30 -8
  88. package/dist/esm/spi/observability-store.d.ts.map +1 -1
  89. package/dist/esm/spi/observability-store.js +33 -5
  90. package/dist/esm/spi/observability-store.js.map +1 -1
  91. package/dist/esm/spi/types.d.ts +2 -0
  92. package/dist/esm/spi/types.d.ts.map +1 -1
  93. package/dist/esm/types.d.ts +170 -10
  94. package/dist/esm/types.d.ts.map +1 -1
  95. package/package.json +7 -3
@@ -34,159 +34,356 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.DatabaseAdapter = void 0;
37
+ /**
38
+ * 数据库适配器
39
+ *
40
+ * 支持 MySQL / PostgreSQL(TypeORM)与 MongoDB(mongodb 驱动)。
41
+ * 默认只读:生成 list_tables / execute_query(SELECT) / query_{table} / describe_{table} 工具,
42
+ * 工具通过 executorType 路由到 work-client 运行时执行器(见 mcp.service)。
43
+ *
44
+ * 字段读取兼容规范键(dbType/host/port/...)与历史别名(dbDriver/dbHost/...)。
45
+ */
46
+ const typeorm_1 = require("typeorm");
47
+ /** 读取数据库配置(规范键优先,回退历史别名) */
48
+ function readDbConfig(config) {
49
+ return {
50
+ dbType: (config.dbType || config.dbDriver || 'mysql'),
51
+ host: config.host || config.dbHost,
52
+ port: config.port || config.dbPort,
53
+ username: config.username || config.dbUser,
54
+ password: config.password || config.dbPassword,
55
+ database: config.database || config.dbName,
56
+ extraOptions: config.extraOptions || config.dbOptions,
57
+ };
58
+ }
37
59
  class DatabaseAdapter {
38
60
  type = 'database';
39
- async testConnection(config) {
40
- try {
41
- const tables = await this.listTables(config);
42
- return {
43
- success: true,
44
- message: `连接成功,发现 ${tables.length} 张表`,
45
- resources: tables,
46
- };
47
- }
48
- catch (err) {
49
- return {
50
- success: false,
51
- message: '连接失败',
52
- error: err.message,
53
- };
54
- }
61
+ label = '数据库';
62
+ drivers = ['mysql', 'postgres', 'mongodb'];
63
+ delegate(config) {
64
+ const { dbType } = readDbConfig(config);
65
+ return dbType === 'mongodb' ? new MongoDbAdapter() : new RelationalDbAdapter();
55
66
  }
56
- async discoverTools(config) {
57
- const tables = await this.listTables(config);
58
- const tools = [];
59
- for (const table of tables) {
60
- tools.push({
61
- name: `db_${table}_query`,
62
- description: `查询 ${table} 表数据,支持 WHERE 条件、LIMIT 限制`,
63
- inputSchema: {
64
- type: 'object',
65
- properties: {
66
- where: {
67
- type: 'string',
68
- description: 'WHERE 条件(不含 WHERE 关键字)',
69
- },
70
- limit: {
71
- type: 'number',
72
- description: '返回行数限制',
73
- default: 100,
74
- },
75
- offset: {
76
- type: 'number',
77
- description: '偏移量',
78
- default: 0,
79
- },
80
- },
81
- },
82
- });
83
- tools.push({
84
- name: `db_${table}_describe`,
85
- description: `获取 ${table} 表结构信息(列名、类型等)`,
86
- inputSchema: {
87
- type: 'object',
88
- properties: {},
89
- },
90
- });
91
- }
92
- return tools;
67
+ testConnection(config) {
68
+ return this.delegate(config).testConnection(config);
69
+ }
70
+ discoverTools(config) {
71
+ return this.delegate(config).discoverTools(config);
93
72
  }
94
- async generateManifest(config) {
95
- const tools = await this.discoverTools(config);
73
+ generateManifest(config, _tools) {
74
+ const c = readDbConfig(config);
96
75
  return {
97
- tools,
98
- metadata: {
99
- dbType: config.dbType,
100
- database: config.database,
101
- host: config.host,
102
- tableCount: tools.length / 2,
76
+ name: config.name,
77
+ description: config.description || `${c.dbType} 数据库连接器 — ${c.database}`,
78
+ category: 'data',
79
+ version: '1.0.0',
80
+ icon: 'database',
81
+ enabled: true,
82
+ dataSourceType: 'database',
83
+ dataSourceConfig: {
84
+ dbType: c.dbType,
85
+ host: c.host,
86
+ port: c.port,
87
+ username: c.username,
88
+ password: c.password || '',
89
+ database: c.database,
103
90
  },
104
91
  };
105
92
  }
106
- async generateMCPServerConfigs(config) {
107
- const tools = await this.discoverTools(config);
93
+ generateMCPServerConfigs(config, tools) {
94
+ const discovered = tools && tools.length > 0 ? tools : undefined;
108
95
  return [
109
96
  {
110
- name: `db-${config.name || config.database}`,
97
+ name: `db-${config.name || 'default'}`,
111
98
  transport: 'stdio',
112
99
  command: 'node',
113
- args: ['-e', `/* MCP server for ${config.database} */`],
100
+ args: ['-e', '/* MCP server for database */'],
114
101
  env: {
115
- DB_TYPE: config.dbType || 'mysql',
116
- DB_HOST: config.host || '',
117
- DB_PORT: String(config.port || 3306),
118
- DB_NAME: config.database || '',
119
- DB_USER: config.username || '',
120
- DB_PASS: config.password || '',
102
+ DB_TYPE: readDbConfig(config).dbType,
103
+ DB_HOST: readDbConfig(config).host || '',
104
+ DB_PORT: String(readDbConfig(config).port || 3306),
105
+ DB_NAME: readDbConfig(config).database || '',
106
+ DB_USER: readDbConfig(config).username || '',
107
+ DB_PASS: readDbConfig(config).password || '',
121
108
  },
122
- tools,
109
+ tools: discovered || [],
123
110
  },
124
111
  ];
125
112
  }
126
- /** 列出所有表 */
127
- async listTables(config) {
128
- if (config.dbType === 'mongodb') {
129
- return this.listMongoCollections(config);
130
- }
131
- return this.listSQLTables(config);
132
- }
133
- /** 列出 SQL 表(MySQL / PostgreSQL) */
134
- async listSQLTables(config) {
135
- const { DataSource } = await Promise.resolve().then(() => __importStar(require('typeorm')));
136
- const dbType = config.dbType === 'postgres' ? 'postgres' : 'mysql';
137
- const ds = new DataSource({
138
- type: dbType,
139
- host: config.host,
140
- port: config.port,
141
- username: config.username,
142
- password: config.password,
143
- database: config.database,
144
- extra: config.extraOptions,
113
+ }
114
+ exports.DatabaseAdapter = DatabaseAdapter;
115
+ // ===== 关系型数据库(MySQL / PostgreSQL)=====
116
+ class RelationalDbAdapter {
117
+ type = 'database';
118
+ label = '关系型数据库(MySQL / PostgreSQL)';
119
+ drivers = ['mysql', 'postgres'];
120
+ createDataSource(config) {
121
+ const c = readDbConfig(config);
122
+ const driver = c.dbType === 'postgres' ? 'postgres' : 'mysql';
123
+ return new typeorm_1.DataSource({
124
+ type: driver,
125
+ host: c.host || 'localhost',
126
+ port: c.port || (driver === 'postgres' ? 5432 : 3306),
127
+ username: c.username,
128
+ password: c.password,
129
+ database: c.database,
130
+ extra: c.extraOptions,
145
131
  synchronize: false,
146
- entities: [],
132
+ logging: false,
133
+ connectTimeout: 10000,
147
134
  });
135
+ }
136
+ async testConnection(config) {
137
+ const ds = this.createDataSource(config);
138
+ const start = Date.now();
148
139
  try {
149
140
  await ds.initialize();
150
- const query = dbType === 'postgres'
151
- ? "SELECT tablename FROM pg_tables WHERE schemaname = 'public'"
152
- : 'SHOW TABLES';
153
- const result = await ds.query(query);
154
- return result.map((row) => dbType === 'postgres' ? row.tablename : Object.values(row)[0]);
155
- }
156
- finally {
157
- if (ds.isInitialized) {
158
- await ds.destroy();
141
+ const latency = Date.now() - start;
142
+ const c = readDbConfig(config);
143
+ const tables = await this.listTables(ds, config);
144
+ const info = { tableCount: tables.length };
145
+ try {
146
+ const result = await ds.query(c.dbType === 'postgres' ? 'SELECT version()' : 'SELECT VERSION() as version');
147
+ if (result?.[0])
148
+ info.version = result[0].version || result[0]['VERSION()'] || '';
159
149
  }
150
+ catch { /* ignore */ }
151
+ await ds.destroy();
152
+ return { success: true, message: `连接成功,发现 ${tables.length} 张表`, resources: tables, latency, info };
153
+ }
154
+ catch (err) {
155
+ if (ds.isInitialized)
156
+ await ds.destroy().catch(() => { });
157
+ return { success: false, message: '连接失败', error: err.message, latency: Date.now() - start };
160
158
  }
161
159
  }
162
- /** 列出 MongoDB 集合 */
163
- async listMongoCollections(config) {
164
- let MongoClient;
160
+ async discoverTools(config) {
161
+ const ds = this.createDataSource(config);
162
+ const c = readDbConfig(config);
165
163
  try {
166
- MongoClient = require('mongodb').MongoClient;
164
+ await ds.initialize();
165
+ const tables = await this.listTables(ds, config);
166
+ const tools = [];
167
+ tools.push({
168
+ name: 'list_tables',
169
+ description: `列出 ${c.database || config.name} 数据库中的所有表`,
170
+ inputSchema: { type: 'object', properties: {} },
171
+ executorType: 'db-list-tables',
172
+ executorMeta: { dbName: c.database },
173
+ });
174
+ tools.push({
175
+ name: 'execute_query',
176
+ description: `在 ${c.database || config.name} 上执行只读 SQL 查询(仅允许 SELECT)`,
177
+ inputSchema: {
178
+ type: 'object',
179
+ properties: {
180
+ sql: { type: 'string', description: 'SQL 查询语句(仅允许 SELECT)' },
181
+ params: { type: 'string', description: '参数化查询的绑定参数(JSON 数组,可选)' },
182
+ },
183
+ required: ['sql'],
184
+ },
185
+ executorType: 'db-execute',
186
+ executorMeta: { dbName: c.database, readOnly: true },
187
+ });
188
+ for (const tableName of tables) {
189
+ const safeName = tableName.replace(/[^a-zA-Z0-9_]/g, '_');
190
+ const columns = await this.listColumns(ds, config, tableName);
191
+ tools.push({
192
+ name: `query_${safeName}`,
193
+ description: `查询 ${tableName} 表数据(支持 WHERE 条件、排序、分页)`,
194
+ inputSchema: {
195
+ type: 'object',
196
+ properties: {
197
+ where: { type: 'string', description: 'WHERE 条件(如 "status = \'active\'"),可选' },
198
+ order_by: { type: 'string', description: '排序字段和方向(如 "created_at DESC"),可选' },
199
+ limit: { type: 'number', description: '返回行数限制,默认 50' },
200
+ offset: { type: 'number', description: '偏移量,用于分页,默认 0' },
201
+ columns: {
202
+ type: 'string',
203
+ description: `选择列(逗号分隔),默认 *。可用列: ${columns.map(co => co.comment ? `${co.name}(${co.comment})` : co.name).join(', ')}`,
204
+ },
205
+ },
206
+ },
207
+ executorType: 'db-query',
208
+ executorMeta: { tableName, dbName: c.database, columns },
209
+ });
210
+ tools.push({
211
+ name: `describe_${safeName}`,
212
+ description: `查看 ${tableName} 表的结构(列名、类型、约束、字段注释)`,
213
+ inputSchema: { type: 'object', properties: {} },
214
+ executorType: 'db-describe',
215
+ executorMeta: { tableName, dbName: c.database },
216
+ });
217
+ }
218
+ await ds.destroy();
219
+ return tools;
167
220
  }
168
- catch {
169
- throw new Error('mongodb 包未安装,请运行 npm install mongodb');
221
+ catch (e) {
222
+ if (ds.isInitialized)
223
+ await ds.destroy().catch(() => { });
224
+ throw new Error(`Schema 发现失败: ${e?.message || e}`);
170
225
  }
171
- const url = `mongodb://${config.host}:${config.port || 27017}`;
172
- const client = new MongoClient(url, {
173
- auth: config.username && config.password
174
- ? {
175
- username: config.username,
176
- password: config.password,
177
- }
178
- : undefined,
226
+ }
227
+ generateManifest(config, tools) {
228
+ return new DatabaseAdapter().generateManifest(config, tools);
229
+ }
230
+ generateMCPServerConfigs(config, tools) {
231
+ return new DatabaseAdapter().generateMCPServerConfigs(config, tools);
232
+ }
233
+ async listTables(ds, config) {
234
+ const c = readDbConfig(config);
235
+ if (c.dbType === 'postgres') {
236
+ const result = await ds.query(`SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_name`);
237
+ return result.map((r) => r.table_name);
238
+ }
239
+ const result = await ds.query(`SELECT TABLE_NAME as table_name FROM information_schema.tables WHERE table_schema = ? ORDER BY TABLE_NAME`, [c.database]);
240
+ return result.map((r) => r.table_name || r.TABLE_NAME);
241
+ }
242
+ async listColumns(ds, config, tableName) {
243
+ const c = readDbConfig(config);
244
+ if (c.dbType === 'postgres') {
245
+ const result = await ds.query(`SELECT c.column_name, c.data_type, c.is_nullable,
246
+ col_description(pgc.oid, c.ordinal_position) AS column_comment
247
+ FROM information_schema.columns c
248
+ LEFT JOIN pg_catalog.pg_class pgc ON pgc.relname = c.table_name
249
+ LEFT JOIN pg_catalog.pg_namespace pgn ON pgn.oid = pgc.relnamespace AND pgn.nspname = c.table_schema
250
+ WHERE c.table_schema = 'public' AND c.table_name = $1
251
+ ORDER BY c.ordinal_position`, [tableName]);
252
+ return result.map((r) => ({
253
+ name: r.column_name,
254
+ type: r.data_type,
255
+ nullable: r.is_nullable === 'YES',
256
+ ...(r.column_comment ? { comment: r.column_comment } : {}),
257
+ }));
258
+ }
259
+ const result = await ds.query(`SELECT COLUMN_NAME as column_name, DATA_TYPE as data_type, IS_NULLABLE as is_nullable, COLUMN_COMMENT as column_comment FROM information_schema.columns WHERE table_schema = ? AND table_name = ? ORDER BY ORDINAL_POSITION`, [c.database, tableName]);
260
+ return result.map((r) => {
261
+ const comment = r.column_comment || r.COLUMN_COMMENT || '';
262
+ return {
263
+ name: r.column_name || r.COLUMN_NAME,
264
+ type: r.data_type || r.DATA_TYPE,
265
+ nullable: (r.is_nullable || r.IS_NULLABLE) === 'YES',
266
+ ...(comment ? { comment } : {}),
267
+ };
179
268
  });
269
+ }
270
+ }
271
+ // ===== MongoDB 适配器 =====
272
+ class MongoDbAdapter {
273
+ type = 'database';
274
+ label = 'MongoDB';
275
+ drivers = ['mongodb'];
276
+ getConnectionString(config) {
277
+ const c = readDbConfig(config);
278
+ const host = c.host || 'localhost';
279
+ const port = c.port || 27017;
280
+ const user = c.username ? `${encodeURIComponent(c.username)}:${encodeURIComponent(c.password || '')}@` : '';
281
+ return `mongodb://${user}${host}:${port}/${c.database || 'test'}`;
282
+ }
283
+ async testConnection(config) {
284
+ const start = Date.now();
285
+ const c = readDbConfig(config);
286
+ let client;
180
287
  try {
288
+ // @ts-ignore optional dependency (mongodb)
289
+ const { MongoClient } = await Promise.resolve().then(() => __importStar(require('mongodb')));
290
+ client = new MongoClient(this.getConnectionString(config), {
291
+ serverSelectionTimeoutMS: 10000,
292
+ connectTimeoutMS: 10000,
293
+ });
181
294
  await client.connect();
182
- const db = client.db(config.database);
295
+ const latency = Date.now() - start;
296
+ const db = client.db(c.database || 'test');
183
297
  const collections = await db.listCollections().toArray();
184
- return collections.map((c) => c.name);
298
+ const info = { collectionCount: collections.length };
299
+ try {
300
+ const serverInfo = await db.admin().serverInfo();
301
+ info.version = serverInfo.version;
302
+ }
303
+ catch { /* ignore */ }
304
+ await client.close();
305
+ return { success: true, message: `连接成功,发现 ${collections.length} 个集合`, resources: collections.map(c => c.name), latency, info };
185
306
  }
186
- finally {
307
+ catch (e) {
308
+ if (client)
309
+ await client.close().catch(() => { });
310
+ return { success: false, message: '连接失败', error: e?.message || '连接失败', latency: Date.now() - start };
311
+ }
312
+ }
313
+ async discoverTools(config) {
314
+ const c = readDbConfig(config);
315
+ // @ts-ignore optional dependency (mongodb)
316
+ const { MongoClient } = await Promise.resolve().then(() => __importStar(require('mongodb')));
317
+ const client = new MongoClient(this.getConnectionString(config), { serverSelectionTimeoutMS: 10000 });
318
+ try {
319
+ await client.connect();
320
+ const db = client.db(c.database || 'test');
321
+ const collections = await db.listCollections().toArray();
322
+ const tools = [];
323
+ tools.push({
324
+ name: 'list_collections',
325
+ description: `列出 ${c.database || config.name} 数据库中的所有集合`,
326
+ inputSchema: { type: 'object', properties: {} },
327
+ executorType: 'db-list-tables',
328
+ executorMeta: { dbName: c.database, driver: 'mongodb' },
329
+ });
330
+ tools.push({
331
+ name: 'execute_query',
332
+ description: `在 ${c.database || config.name} 上执行 MongoDB 查询(JSON 格式)`,
333
+ inputSchema: {
334
+ type: 'object',
335
+ properties: {
336
+ collection: { type: 'string', description: '集合名称' },
337
+ filter: { type: 'string', description: '查询过滤条件(JSON 对象),默认 {}' },
338
+ projection: { type: 'string', description: '字段投影(JSON 对象),可选' },
339
+ sort: { type: 'string', description: '排序(JSON 对象),可选' },
340
+ limit: { type: 'number', description: '返回数量限制,默认 50' },
341
+ skip: { type: 'number', description: '跳过数量,默认 0' },
342
+ },
343
+ required: ['collection'],
344
+ },
345
+ executorType: 'db-execute',
346
+ executorMeta: { dbName: c.database, driver: 'mongodb', readOnly: true },
347
+ });
348
+ for (const coll of collections) {
349
+ const collName = coll.name;
350
+ const safeName = collName.replace(/[^a-zA-Z0-9_]/g, '_');
351
+ let fields = '';
352
+ try {
353
+ const sample = await db.collection(collName).findOne();
354
+ if (sample)
355
+ fields = Object.keys(sample).join(', ');
356
+ }
357
+ catch { /* ignore */ }
358
+ tools.push({
359
+ name: `query_${safeName}`,
360
+ description: `查询 ${collName} 集合${fields ? `(字段: ${fields})` : ''}`,
361
+ inputSchema: {
362
+ type: 'object',
363
+ properties: {
364
+ filter: { type: 'string', description: '查询过滤条件(JSON 对象),默认 {}' },
365
+ projection: { type: 'string', description: '字段投影(JSON 对象),可选' },
366
+ sort: { type: 'string', description: '排序(JSON 对象),可选' },
367
+ limit: { type: 'number', description: '返回数量限制,默认 50' },
368
+ },
369
+ },
370
+ executorType: 'db-query',
371
+ executorMeta: { tableName: collName, dbName: c.database, driver: 'mongodb' },
372
+ });
373
+ }
187
374
  await client.close();
375
+ return tools;
376
+ }
377
+ catch (e) {
378
+ await client.close().catch(() => { });
379
+ throw new Error(`MongoDB Schema 发现失败: ${e?.message || e}`);
188
380
  }
189
381
  }
382
+ generateManifest(config, tools) {
383
+ return new DatabaseAdapter().generateManifest(config, tools);
384
+ }
385
+ generateMCPServerConfigs(config, tools) {
386
+ return new DatabaseAdapter().generateMCPServerConfigs(config, tools);
387
+ }
190
388
  }
191
- exports.DatabaseAdapter = DatabaseAdapter;
192
389
  //# sourceMappingURL=db-adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"db-adapter.js","sourceRoot":"","sources":["../../../src/connectors/db-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db-adapter.js","sourceRoot":"","sources":["../../../src/connectors/db-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,22 @@
1
1
  /**
2
2
  * 邮箱适配器
3
3
  *
4
- * 支持 IMAP(收信)+ SMTP(发信),使用动态 require 加载 imapflow
5
- * testConnection 测试 IMAP/SMTP 连接,discoverTools 生成邮件相关工具。
4
+ * 支持 IMAP+SMTP、Exchange Online (Microsoft Graph)、Exchange 自建 (EWS)
5
+ * 工具通过 executorType(email-*) 路由到 work-client 运行时执行器(见 mcp.service)。
6
+ *
7
+ * 字段读取兼容规范键(emailProtocol / smtp* / imap* / exchange* / ews*)。
6
8
  */
7
9
  import type { DataSourceConfig, DiscoveredTool, ConnectionTestResult, DataSourceAdapter, MCPServerConfig } from '../types.js';
8
10
  export declare class EmailAdapter implements DataSourceAdapter {
9
11
  readonly type: "email";
12
+ readonly label = "\u90AE\u7BB1";
13
+ readonly drivers: string[];
10
14
  testConnection(config: DataSourceConfig): Promise<ConnectionTestResult>;
11
- discoverTools(config: DataSourceConfig): Promise<DiscoveredTool[]>;
12
- generateManifest(config: DataSourceConfig): Promise<{
13
- tools: DiscoveredTool[];
14
- metadata: {
15
- emailAddress: string;
16
- imapHost: string;
17
- smtpHost: string;
18
- };
19
- }>;
20
- generateMCPServerConfigs(config: DataSourceConfig): Promise<MCPServerConfig[]>;
21
- /** 动态加载 imapflow */
22
- private loadImapFlow;
15
+ private testImap;
16
+ private testExchange;
17
+ private testEws;
18
+ discoverTools(_config: DataSourceConfig): Promise<DiscoveredTool[]>;
19
+ generateManifest(config: DataSourceConfig, _tools?: DiscoveredTool[]): Record<string, unknown>;
20
+ generateMCPServerConfigs(_config: DataSourceConfig, tools?: DiscoveredTool[]): MCPServerConfig[];
23
21
  }
24
22
  //# sourceMappingURL=email-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"email-adapter.d.ts","sourceRoot":"","sources":["../../../src/connectors/email-adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EACR,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EAClB,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,YAAW,iBAAiB;IAClD,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IAE3B,cAAc,CAChB,MAAM,EAAE,gBAAgB,GACzB,OAAO,CAAC,oBAAoB,CAAC;IA4C1B,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAoGlE,gBAAgB,CAAC,MAAM,EAAE,gBAAgB;;;;;;;;IAYzC,wBAAwB,CAC1B,MAAM,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,EAAE,CAAC;IAsB7B,oBAAoB;YACN,YAAY;CAQ7B"}
1
+ {"version":3,"file":"email-adapter.d.ts","sourceRoot":"","sources":["../../../src/connectors/email-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EAChB,MAAM,aAAa,CAAC;AAqCrB,qBAAa,YAAa,YAAW,iBAAiB;IACpD,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,KAAK,kBAAQ;IACtB,QAAQ,CAAC,OAAO,WAAwC;IAElD,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAS/D,QAAQ;YAoCR,YAAY;YA4CZ,OAAO;IAmCf,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA+FzE,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IA8C9F,wBAAwB,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,cAAc,EAAE,GAAG,eAAe,EAAE;CAWjG"}