flex-mcp 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.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -0
  3. package/dist/api/auth.d.ts +6 -0
  4. package/dist/api/auth.d.ts.map +1 -0
  5. package/dist/api/auth.js +111 -0
  6. package/dist/api/auth.js.map +1 -0
  7. package/dist/api/configs.d.ts +6 -0
  8. package/dist/api/configs.d.ts.map +1 -0
  9. package/dist/api/configs.js +693 -0
  10. package/dist/api/configs.js.map +1 -0
  11. package/dist/api/index.d.ts +6 -0
  12. package/dist/api/index.d.ts.map +1 -0
  13. package/dist/api/index.js +24 -0
  14. package/dist/api/index.js.map +1 -0
  15. package/dist/api/mcp.d.ts +7 -0
  16. package/dist/api/mcp.d.ts.map +1 -0
  17. package/dist/api/mcp.js +46 -0
  18. package/dist/api/mcp.js.map +1 -0
  19. package/dist/api/middleware.d.ts +25 -0
  20. package/dist/api/middleware.d.ts.map +1 -0
  21. package/dist/api/middleware.js +65 -0
  22. package/dist/api/middleware.js.map +1 -0
  23. package/dist/api/prompts.d.ts +6 -0
  24. package/dist/api/prompts.d.ts.map +1 -0
  25. package/dist/api/prompts.js +260 -0
  26. package/dist/api/prompts.js.map +1 -0
  27. package/dist/api/resources.d.ts +6 -0
  28. package/dist/api/resources.d.ts.map +1 -0
  29. package/dist/api/resources.js +159 -0
  30. package/dist/api/resources.js.map +1 -0
  31. package/dist/api/tables.d.ts +15 -0
  32. package/dist/api/tables.d.ts.map +1 -0
  33. package/dist/api/tables.js +702 -0
  34. package/dist/api/tables.js.map +1 -0
  35. package/dist/api/users.d.ts +6 -0
  36. package/dist/api/users.d.ts.map +1 -0
  37. package/dist/api/users.js +96 -0
  38. package/dist/api/users.js.map +1 -0
  39. package/dist/auth/index.d.ts +15 -0
  40. package/dist/auth/index.d.ts.map +1 -0
  41. package/dist/auth/index.js +126 -0
  42. package/dist/auth/index.js.map +1 -0
  43. package/dist/cli.d.ts +7 -0
  44. package/dist/cli.d.ts.map +1 -0
  45. package/dist/cli.js +288 -0
  46. package/dist/cli.js.map +1 -0
  47. package/dist/config.d.ts +21 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +54 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/db/index.d.ts +11 -0
  52. package/dist/db/index.d.ts.map +1 -0
  53. package/dist/db/index.js +164 -0
  54. package/dist/db/index.js.map +1 -0
  55. package/dist/db/schema.d.ts +646 -0
  56. package/dist/db/schema.d.ts.map +1 -0
  57. package/dist/db/schema.js +73 -0
  58. package/dist/db/schema.js.map +1 -0
  59. package/dist/index.d.ts +5 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +153 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/mcp/aggregator.d.ts +78 -0
  64. package/dist/mcp/aggregator.d.ts.map +1 -0
  65. package/dist/mcp/aggregator.js +1266 -0
  66. package/dist/mcp/aggregator.js.map +1 -0
  67. package/dist/mcp/component-loader.d.ts +17 -0
  68. package/dist/mcp/component-loader.d.ts.map +1 -0
  69. package/dist/mcp/component-loader.js +131 -0
  70. package/dist/mcp/component-loader.js.map +1 -0
  71. package/dist/mcp/index.d.ts +7 -0
  72. package/dist/mcp/index.d.ts.map +1 -0
  73. package/dist/mcp/index.js +107 -0
  74. package/dist/mcp/index.js.map +1 -0
  75. package/dist/mcp/mcp-client.d.ts +53 -0
  76. package/dist/mcp/mcp-client.d.ts.map +1 -0
  77. package/dist/mcp/mcp-client.js +418 -0
  78. package/dist/mcp/mcp-client.js.map +1 -0
  79. package/dist/mcp/post-sse-transport.d.ts +52 -0
  80. package/dist/mcp/post-sse-transport.d.ts.map +1 -0
  81. package/dist/mcp/post-sse-transport.js +375 -0
  82. package/dist/mcp/post-sse-transport.js.map +1 -0
  83. package/dist/mcp/service.d.ts +49 -0
  84. package/dist/mcp/service.d.ts.map +1 -0
  85. package/dist/mcp/service.js +358 -0
  86. package/dist/mcp/service.js.map +1 -0
  87. package/dist/mcp/tool-sync.d.ts +27 -0
  88. package/dist/mcp/tool-sync.d.ts.map +1 -0
  89. package/dist/mcp/tool-sync.js +200 -0
  90. package/dist/mcp/tool-sync.js.map +1 -0
  91. package/dist/script/compiler.d.ts +15 -0
  92. package/dist/script/compiler.d.ts.map +1 -0
  93. package/dist/script/compiler.js +163 -0
  94. package/dist/script/compiler.js.map +1 -0
  95. package/dist/script/context.d.ts +11 -0
  96. package/dist/script/context.d.ts.map +1 -0
  97. package/dist/script/context.js +786 -0
  98. package/dist/script/context.js.map +1 -0
  99. package/dist/script/executor.d.ts +43 -0
  100. package/dist/script/executor.d.ts.map +1 -0
  101. package/dist/script/executor.js +126 -0
  102. package/dist/script/executor.js.map +1 -0
  103. package/dist/static.d.ts +21 -0
  104. package/dist/static.d.ts.map +1 -0
  105. package/dist/static.js +95 -0
  106. package/dist/static.js.map +1 -0
  107. package/dist/types/index.d.ts +337 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/index.js +5 -0
  110. package/dist/types/index.js.map +1 -0
  111. package/dist/utils/id.d.ts +5 -0
  112. package/dist/utils/id.d.ts.map +1 -0
  113. package/dist/utils/id.js +8 -0
  114. package/dist/utils/id.js.map +1 -0
  115. package/dist/utils/logger.d.ts +21 -0
  116. package/dist/utils/logger.d.ts.map +1 -0
  117. package/dist/utils/logger.js +31 -0
  118. package/dist/utils/logger.js.map +1 -0
  119. package/dist/utils/prompt-template.d.ts +15 -0
  120. package/dist/utils/prompt-template.d.ts.map +1 -0
  121. package/dist/utils/prompt-template.js +82 -0
  122. package/dist/utils/prompt-template.js.map +1 -0
  123. package/dist/utils/telemetry.d.ts +45 -0
  124. package/dist/utils/telemetry.d.ts.map +1 -0
  125. package/dist/utils/telemetry.js +245 -0
  126. package/dist/utils/telemetry.js.map +1 -0
  127. package/dist/utils/variables.d.ts +24 -0
  128. package/dist/utils/variables.d.ts.map +1 -0
  129. package/dist/utils/variables.js +45 -0
  130. package/dist/utils/variables.js.map +1 -0
  131. package/package.json +70 -0
@@ -0,0 +1,245 @@
1
+ /**
2
+ * 使用统计上报模块(Telemetry)
3
+ *
4
+ * 设计原则:
5
+ * 1. 简单易用:只需调用 report(keypoint, params) 即可
6
+ * 2. 可替换后端:抽象底层实现,支持 PostHog、自定义端点等
7
+ * 3. 完全可选:通过环境变量 DISABLE_TELEMETRY=true 禁用
8
+ * 4. 异步上报:不阻塞主程序
9
+ * 5. 静默失败:上报失败不影响功能
10
+ *
11
+ * 使用方式:
12
+ * import { report } from './utils/telemetry.js';
13
+ * report('tool_called', { tool_name: 'explore_table' });
14
+ */
15
+ import * as crypto from 'crypto';
16
+ import * as fs from 'fs';
17
+ import * as path from 'path';
18
+ /**
19
+ * PostHog 后端实现
20
+ */
21
+ class PostHogBackend {
22
+ apiKey;
23
+ host;
24
+ constructor(apiKey, host = 'https://app.posthog.com') {
25
+ this.apiKey = apiKey;
26
+ this.host = host;
27
+ }
28
+ async report(event, params, metadata) {
29
+ try {
30
+ await fetch(`${this.host}/capture/`, {
31
+ method: 'POST',
32
+ headers: { 'Content-Type': 'application/json' },
33
+ body: JSON.stringify({
34
+ api_key: this.apiKey,
35
+ event,
36
+ distinct_id: metadata.instanceId, // 使用实例 ID 作为 distinct_id
37
+ properties: {
38
+ ...params,
39
+ // 元数据
40
+ instance_id: metadata.instanceId,
41
+ user_id: metadata.userId,
42
+ version: metadata.version,
43
+ node_version: metadata.nodeVersion,
44
+ platform: metadata.platform,
45
+ arch: metadata.arch,
46
+ timestamp: metadata.timestamp,
47
+ },
48
+ }),
49
+ });
50
+ }
51
+ catch (error) {
52
+ if (process.env.DEBUG) {
53
+ console.warn(`[Telemetry] PostHog 上报失败: ${error.message}`);
54
+ }
55
+ }
56
+ }
57
+ }
58
+ /**
59
+ * 自定义端点后端实现
60
+ */
61
+ class CustomEndpointBackend {
62
+ endpoint;
63
+ constructor(endpoint) {
64
+ this.endpoint = endpoint;
65
+ }
66
+ async report(event, params, metadata) {
67
+ try {
68
+ await fetch(this.endpoint, {
69
+ method: 'POST',
70
+ headers: {
71
+ 'Content-Type': 'application/json',
72
+ 'User-Agent': `meta-mcp/${metadata.version}`,
73
+ },
74
+ body: JSON.stringify({
75
+ event,
76
+ ...params,
77
+ // 元数据
78
+ instance_id: metadata.instanceId,
79
+ user_id: metadata.userId,
80
+ version: metadata.version,
81
+ node_version: metadata.nodeVersion,
82
+ platform: metadata.platform,
83
+ arch: metadata.arch,
84
+ timestamp: metadata.timestamp,
85
+ }),
86
+ });
87
+ }
88
+ catch (error) {
89
+ if (process.env.DEBUG) {
90
+ console.warn(`[Telemetry] 自定义端点上报失败: ${error.message}`);
91
+ }
92
+ }
93
+ }
94
+ }
95
+ /**
96
+ * 空后端(禁用统计)
97
+ */
98
+ class NoOpBackend {
99
+ async report(_event, _params, _metadata) {
100
+ // 什么都不做
101
+ }
102
+ }
103
+ /**
104
+ * 获取或生成实例 ID(用于标识服务部署)
105
+ */
106
+ function getInstanceId() {
107
+ const dataDir = process.env.DATA_DIR || path.join(process.cwd(), '.data');
108
+ const instanceIdFile = path.join(dataDir, '.instance_id');
109
+ try {
110
+ if (fs.existsSync(instanceIdFile)) {
111
+ return fs.readFileSync(instanceIdFile, 'utf-8').trim();
112
+ }
113
+ // 生成新的实例 ID
114
+ const instanceId = crypto.randomUUID();
115
+ fs.mkdirSync(dataDir, { recursive: true });
116
+ fs.writeFileSync(instanceIdFile, instanceId, 'utf-8');
117
+ return instanceId;
118
+ }
119
+ catch {
120
+ // 如果文件操作失败,使用随机 ID(不持久化)
121
+ return crypto.randomUUID();
122
+ }
123
+ }
124
+ /**
125
+ * 获取包版本
126
+ */
127
+ function getPackageVersion() {
128
+ try {
129
+ const packagePath = path.join(__dirname, '../../package.json');
130
+ const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf-8'));
131
+ return packageJson.version || 'unknown';
132
+ }
133
+ catch {
134
+ return 'unknown';
135
+ }
136
+ }
137
+ /**
138
+ * Telemetry 管理器
139
+ */
140
+ class TelemetryManager {
141
+ backends = [];
142
+ enabled = true;
143
+ instanceId;
144
+ version;
145
+ constructor() {
146
+ // 检查是否禁用
147
+ if (process.env.DISABLE_TELEMETRY === 'true' || process.env.DISABLE_TELEMETRY === '1') {
148
+ this.enabled = false;
149
+ this.backends = [new NoOpBackend()];
150
+ this.instanceId = 'disabled';
151
+ this.version = 'unknown';
152
+ return;
153
+ }
154
+ // 初始化实例 ID 和版本
155
+ this.instanceId = getInstanceId();
156
+ this.version = getPackageVersion();
157
+ // 初始化后端
158
+ // 1. PostHog(使用默认 API Key,可通过环境变量覆盖)
159
+ const posthogKey = process.env.POSTHOG_API_KEY || 'phc_7j5HtZAhgVoBmPuAYNUfEWXyhLYRGrtXZnPqg8TzGfe';
160
+ const posthogHost = process.env.POSTHOG_HOST || 'https://app.posthog.com';
161
+ this.backends.push(new PostHogBackend(posthogKey, posthogHost));
162
+ // 2. 自定义端点
163
+ const customEndpoint = process.env.TELEMETRY_ENDPOINT;
164
+ if (customEndpoint) {
165
+ this.backends.push(new CustomEndpointBackend(customEndpoint));
166
+ }
167
+ // 如果没有配置任何后端,使用空后端
168
+ if (this.backends.length === 0) {
169
+ this.backends = [new NoOpBackend()];
170
+ }
171
+ }
172
+ /**
173
+ * 上报事件
174
+ *
175
+ * @param event 事件名称(keypoint)
176
+ * @param params 事件参数
177
+ * @param userId 用户 ID(可选)
178
+ */
179
+ async report(event, params = {}, userId) {
180
+ if (!this.enabled || this.backends.length === 0) {
181
+ return;
182
+ }
183
+ const metadata = {
184
+ instanceId: this.instanceId,
185
+ userId,
186
+ version: this.version,
187
+ nodeVersion: process.version,
188
+ platform: process.platform,
189
+ arch: process.arch,
190
+ timestamp: Date.now(),
191
+ };
192
+ // 异步上报到所有后端,不阻塞
193
+ Promise.all(this.backends.map(backend => backend.report(event, params, metadata))).catch(() => {
194
+ // 静默处理所有错误
195
+ });
196
+ }
197
+ }
198
+ // 单例实例
199
+ let telemetryInstance = null;
200
+ /**
201
+ * 获取 Telemetry 实例
202
+ */
203
+ function getTelemetry() {
204
+ if (!telemetryInstance) {
205
+ telemetryInstance = new TelemetryManager();
206
+ }
207
+ return telemetryInstance;
208
+ }
209
+ /**
210
+ * 上报事件(公共 API)
211
+ *
212
+ * 说明:
213
+ * - 通用数据(instance_id, version, platform 等)会自动添加到所有上报中
214
+ * - 这些数据在 TelemetryManager 的 metadata 中统一管理
215
+ * - 无需在 params 中重复传递通用数据
216
+ *
217
+ * @param keypoint 事件名称(关键点)
218
+ * @param params 事件参数(只包含事件特定的数据,通用数据会自动添加)
219
+ * @param userId 用户 ID(可选,用于统计用户数量)
220
+ *
221
+ * @example
222
+ * // 简单上报,通用数据会自动添加
223
+ * report('tool_called', { tool_name: 'explore_table' }, userId);
224
+ *
225
+ * // 通用数据(instance_id, version, platform 等)会自动包含,无需手动添加
226
+ * report('server_start', {});
227
+ */
228
+ export function report(keypoint, params = {}, userId) {
229
+ // 异步上报,不阻塞
230
+ // 注意:通用数据(instance_id, version, platform, arch, node_version, timestamp)
231
+ // 会在 TelemetryManager.report 中作为 metadata 自动添加到所有上报中
232
+ getTelemetry().report(keypoint, params, userId).catch(() => {
233
+ // 静默失败
234
+ });
235
+ }
236
+ /**
237
+ * 在启动时上报(延迟执行,不阻塞启动)
238
+ */
239
+ export function reportStartup() {
240
+ // 延迟 3 秒上报,确保不影响启动速度
241
+ setTimeout(() => {
242
+ report('server_start', {});
243
+ }, 3000);
244
+ }
245
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/utils/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 变量替换工具
3
+ * 支持在配置和脚本中引用变量
4
+ */
5
+ export interface VariableMap {
6
+ [key: string]: string;
7
+ }
8
+ /**
9
+ * 替换字符串中的变量引用
10
+ * 格式: {{VAR_NAME}}
11
+ */
12
+ export declare function replaceVariables(text: string, variables: VariableMap): string;
13
+ /**
14
+ * 替换对象中的变量引用(递归)
15
+ */
16
+ export declare function replaceVariablesInObject(obj: any, variables: VariableMap): any;
17
+ /**
18
+ * 从变量列表中创建变量映射
19
+ */
20
+ export declare function createVariableMap(variables: Array<{
21
+ name: string;
22
+ value: string;
23
+ }>): VariableMap;
24
+ //# sourceMappingURL=variables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../../src/utils/variables.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,GAAG,MAAM,CAM7E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,GAAG,GAAG,CAa9E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,WAAW,CAMhG"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * 变量替换工具
3
+ * 支持在配置和脚本中引用变量
4
+ */
5
+ /**
6
+ * 替换字符串中的变量引用
7
+ * 格式: {{VAR_NAME}}
8
+ */
9
+ export function replaceVariables(text, variables) {
10
+ // 使用 {{VAR_NAME}} 格式
11
+ return text.replace(/\{\{([^}]+)\}\}/g, (match, varName) => {
12
+ const trimmedName = varName.trim();
13
+ return variables[trimmedName] ?? match;
14
+ });
15
+ }
16
+ /**
17
+ * 替换对象中的变量引用(递归)
18
+ */
19
+ export function replaceVariablesInObject(obj, variables) {
20
+ if (typeof obj === 'string') {
21
+ return replaceVariables(obj, variables);
22
+ }
23
+ else if (Array.isArray(obj)) {
24
+ return obj.map((item) => replaceVariablesInObject(item, variables));
25
+ }
26
+ else if (obj && typeof obj === 'object') {
27
+ const result = {};
28
+ for (const [key, value] of Object.entries(obj)) {
29
+ result[key] = replaceVariablesInObject(value, variables);
30
+ }
31
+ return result;
32
+ }
33
+ return obj;
34
+ }
35
+ /**
36
+ * 从变量列表中创建变量映射
37
+ */
38
+ export function createVariableMap(variables) {
39
+ const map = {};
40
+ for (const variable of variables) {
41
+ map[variable.name] = variable.value;
42
+ }
43
+ return map;
44
+ }
45
+ //# sourceMappingURL=variables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variables.js","sourceRoot":"","sources":["../../src/utils/variables.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,SAAsB;IACnE,qBAAqB;IACrB,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACzD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAQ,EAAE,SAAsB;IACvE,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiD;IACjF,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "flex-mcp",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "可运营 MCP Node 服务 - 支持多用户管理、MCP 协议、脚本执行",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "meta-mcp": "./dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE",
15
+ "web"
16
+ ],
17
+ "scripts": {
18
+ "dev": "tsx watch src/index.ts",
19
+ "build": "npx tsc || true",
20
+ "build:with-web": "npx tsc || true && npm run copy-web",
21
+ "copy-web": "node ../../scripts/copy-web.mjs",
22
+ "start": "node dist/index.js",
23
+ "lint": "eslint src --ext .ts",
24
+ "prepublishOnly": "npm run build:with-web"
25
+ },
26
+ "keywords": [
27
+ "mcp",
28
+ "model-context-protocol",
29
+ "mcp-server",
30
+ "mcp-service",
31
+ "ai",
32
+ "cursor",
33
+ "flex-mcp"
34
+ ],
35
+ "author": "llj",
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/LeeLejia/meta-mcp.git"
40
+ },
41
+ "engines": {
42
+ "node": ">=18.0.0"
43
+ },
44
+ "dependencies": {
45
+ "@hono/node-server": "^1.12.0",
46
+ "@lvce-editor/ripgrep": "^4.1.0",
47
+ "@modelcontextprotocol/sdk": "^0.5.0",
48
+ "axios": "^1.6.0",
49
+ "bcrypt": "^5.1.1",
50
+ "better-sqlite3": "^9.2.2",
51
+ "dotenv": "^16.3.1",
52
+ "drizzle-orm": "^0.29.0",
53
+ "esbuild": "^0.19.0",
54
+ "eventsource": "^4.1.0",
55
+ "hono": "^4.0.0",
56
+ "jose": "^5.2.0",
57
+ "zod": "^3.22.4"
58
+ },
59
+ "devDependencies": {
60
+ "@types/bcrypt": "^5.0.2",
61
+ "@types/better-sqlite3": "^7.6.11",
62
+ "@types/node": "^20.10.0",
63
+ "@typescript-eslint/eslint-plugin": "^6.13.0",
64
+ "@typescript-eslint/parser": "^6.13.0",
65
+ "drizzle-kit": "^0.20.0",
66
+ "eslint": "^8.54.0",
67
+ "tsx": "^4.7.0",
68
+ "typescript": "^5.3.2"
69
+ }
70
+ }