proxy-api-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 (144) hide show
  1. package/.env.example +57 -0
  2. package/README.md +443 -0
  3. package/api-tools.json.example +226 -0
  4. package/dist/examples/env-in-json-usage.d.ts +43 -0
  5. package/dist/examples/env-in-json-usage.d.ts.map +1 -0
  6. package/dist/examples/env-in-json-usage.js +242 -0
  7. package/dist/examples/env-in-json-usage.js.map +1 -0
  8. package/dist/examples/env-usage.d.ts +7 -0
  9. package/dist/examples/env-usage.d.ts.map +1 -0
  10. package/dist/examples/env-usage.js +108 -0
  11. package/dist/examples/env-usage.js.map +1 -0
  12. package/dist/examples/preprocessor-usage.d.ts +14 -0
  13. package/dist/examples/preprocessor-usage.d.ts.map +1 -0
  14. package/dist/examples/preprocessor-usage.js +196 -0
  15. package/dist/examples/preprocessor-usage.js.map +1 -0
  16. package/dist/src/config/env.d.ts +97 -0
  17. package/dist/src/config/env.d.ts.map +1 -0
  18. package/dist/src/config/env.js +228 -0
  19. package/dist/src/config/env.js.map +1 -0
  20. package/dist/src/core/registry.d.ts +59 -0
  21. package/dist/src/core/registry.d.ts.map +1 -0
  22. package/dist/src/core/registry.js +126 -0
  23. package/dist/src/core/registry.js.map +1 -0
  24. package/dist/src/core/router.d.ts +34 -0
  25. package/dist/src/core/router.d.ts.map +1 -0
  26. package/dist/src/core/router.js +108 -0
  27. package/dist/src/core/router.js.map +1 -0
  28. package/dist/src/core/server.d.ts +55 -0
  29. package/dist/src/core/server.d.ts.map +1 -0
  30. package/dist/src/core/server.js +159 -0
  31. package/dist/src/core/server.js.map +1 -0
  32. package/dist/src/core/session.d.ts +70 -0
  33. package/dist/src/core/session.d.ts.map +1 -0
  34. package/dist/src/core/session.js +171 -0
  35. package/dist/src/core/session.js.map +1 -0
  36. package/dist/src/core/transports/http.d.ts +16 -0
  37. package/dist/src/core/transports/http.d.ts.map +1 -0
  38. package/dist/src/core/transports/http.js +169 -0
  39. package/dist/src/core/transports/http.js.map +1 -0
  40. package/dist/src/core/transports/stdio.d.ts +9 -0
  41. package/dist/src/core/transports/stdio.d.ts.map +1 -0
  42. package/dist/src/core/transports/stdio.js +32 -0
  43. package/dist/src/core/transports/stdio.js.map +1 -0
  44. package/dist/src/index.d.ts +19 -0
  45. package/dist/src/index.d.ts.map +1 -0
  46. package/dist/src/index.js +22 -0
  47. package/dist/src/index.js.map +1 -0
  48. package/dist/src/server.d.ts +6 -0
  49. package/dist/src/server.d.ts.map +1 -0
  50. package/dist/src/server.js +121 -0
  51. package/dist/src/server.js.map +1 -0
  52. package/dist/src/tools/api/builder.d.ts +34 -0
  53. package/dist/src/tools/api/builder.d.ts.map +1 -0
  54. package/dist/src/tools/api/builder.js +196 -0
  55. package/dist/src/tools/api/builder.js.map +1 -0
  56. package/dist/src/tools/api/executor.d.ts +57 -0
  57. package/dist/src/tools/api/executor.d.ts.map +1 -0
  58. package/dist/src/tools/api/executor.js +317 -0
  59. package/dist/src/tools/api/executor.js.map +1 -0
  60. package/dist/src/tools/api/index.d.ts +12 -0
  61. package/dist/src/tools/api/index.d.ts.map +1 -0
  62. package/dist/src/tools/api/index.js +12 -0
  63. package/dist/src/tools/api/index.js.map +1 -0
  64. package/dist/src/tools/api/json/kingdee/kingdee_caiwukuaiji_chunaguanli.json +879 -0
  65. package/dist/src/tools/api/json/kingdee/kingdee_caiwukuaiji_yingfukuanguanli.json +1673 -0
  66. package/dist/src/tools/api/json/kingdee/kingdee_caiwukuaiji_yingshoukuanguanli.json +1081 -0
  67. package/dist/src/tools/api/json/kingdee/kingdee_caiwukuaiji_zongzhang.json +976 -0
  68. package/dist/src/tools/api/json/kingdee/kingdee_chengbenguanli_biaozhunchengbenfenxi.json +1 -0
  69. package/dist/src/tools/api/json/kingdee/kingdee_chengbenguanli_chanpinchengbenhesuan.json +1 -0
  70. package/dist/src/tools/api/json/kingdee/kingdee_chengbenguanli_cunhuohesuan.json +1858 -0
  71. package/dist/src/tools/api/json/kingdee/kingdee_gongyinglianguanli_caigouguanli.json +1 -0
  72. package/dist/src/tools/api/json/kingdee/kingdee_gongyinglianguanli_gongyingshangguanli.json +616 -0
  73. package/dist/src/tools/api/json/kingdee/kingdee_gongyinglianguanli_kucunguanli.json +858 -0
  74. package/dist/src/tools/api/json/kingdee/kingdee_gongyinglianguanli_xiaoshouguanli.json +858 -0
  75. package/dist/src/tools/api/json/kingdee/kingdee_gongyinglianguanli_zuzhijianjiesuan.json +858 -0
  76. package/dist/src/tools/api/json/kingdee/kingdee_jichuguanli_jichuziliao.json +867 -0
  77. package/dist/src/tools/api/json/kingdee/kingdee_jichuguanli_xiaoxipingtai.json +374 -0
  78. package/dist/src/tools/api/json/kingdee/kingdee_shengchanzhizao_chejianguanli.json +923 -0
  79. package/dist/src/tools/api/json/kingdee/kingdee_shengchanzhizao_gongchengshujuguanli.json +923 -0
  80. package/dist/src/tools/api/json/kingdee/kingdee_shengchanzhizao_shengchanguanli.json +858 -0
  81. package/dist/src/tools/api/json/kingdee/kingdee_shuiwuguanli_fapiaoguanli.json +1081 -0
  82. package/dist/src/tools/api/json/kingdee/kingdee_yuangongfuwu_renrenbaoxiao.json +858 -0
  83. package/dist/src/tools/api/json/kingdee/kingdee_zichanguanli_gudingzichan.json +1 -0
  84. package/dist/src/tools/api/json-config-loader.d.ts +28 -0
  85. package/dist/src/tools/api/json-config-loader.d.ts.map +1 -0
  86. package/dist/src/tools/api/json-config-loader.js +123 -0
  87. package/dist/src/tools/api/json-config-loader.js.map +1 -0
  88. package/dist/src/tools/api/json-config-mapping.d.ts +41 -0
  89. package/dist/src/tools/api/json-config-mapping.d.ts.map +1 -0
  90. package/dist/src/tools/api/json-config-mapping.js +138 -0
  91. package/dist/src/tools/api/json-config-mapping.js.map +1 -0
  92. package/dist/src/tools/api/loader.d.ts +38 -0
  93. package/dist/src/tools/api/loader.d.ts.map +1 -0
  94. package/dist/src/tools/api/loader.js +240 -0
  95. package/dist/src/tools/api/loader.js.map +1 -0
  96. package/dist/src/tools/api/preprocessor.d.ts +39 -0
  97. package/dist/src/tools/api/preprocessor.d.ts.map +1 -0
  98. package/dist/src/tools/api/preprocessor.js +64 -0
  99. package/dist/src/tools/api/preprocessor.js.map +1 -0
  100. package/dist/src/tools/api/preprocessors/example.d.ts +59 -0
  101. package/dist/src/tools/api/preprocessors/example.d.ts.map +1 -0
  102. package/dist/src/tools/api/preprocessors/example.js +133 -0
  103. package/dist/src/tools/api/preprocessors/example.js.map +1 -0
  104. package/dist/src/tools/api/preprocessors/index.d.ts +10 -0
  105. package/dist/src/tools/api/preprocessors/index.d.ts.map +1 -0
  106. package/dist/src/tools/api/preprocessors/index.js +29 -0
  107. package/dist/src/tools/api/preprocessors/index.js.map +1 -0
  108. package/dist/src/tools/api/preprocessors/kingdee.d.ts +24 -0
  109. package/dist/src/tools/api/preprocessors/kingdee.d.ts.map +1 -0
  110. package/dist/src/tools/api/preprocessors/kingdee.js +149 -0
  111. package/dist/src/tools/api/preprocessors/kingdee.js.map +1 -0
  112. package/dist/src/tools/api/types.d.ts +174 -0
  113. package/dist/src/tools/api/types.d.ts.map +1 -0
  114. package/dist/src/tools/api/types.js +5 -0
  115. package/dist/src/tools/api/types.js.map +1 -0
  116. package/dist/src/tools/examples/echo.d.ts +6 -0
  117. package/dist/src/tools/examples/echo.d.ts.map +1 -0
  118. package/dist/src/tools/examples/echo.js +61 -0
  119. package/dist/src/tools/examples/echo.js.map +1 -0
  120. package/dist/src/tools/types.d.ts +104 -0
  121. package/dist/src/tools/types.d.ts.map +1 -0
  122. package/dist/src/tools/types.js +15 -0
  123. package/dist/src/tools/types.js.map +1 -0
  124. package/dist/src/tools/validator.d.ts +27 -0
  125. package/dist/src/tools/validator.d.ts.map +1 -0
  126. package/dist/src/tools/validator.js +133 -0
  127. package/dist/src/tools/validator.js.map +1 -0
  128. package/dist/src/utils/cache.d.ts +14 -0
  129. package/dist/src/utils/cache.d.ts.map +1 -0
  130. package/dist/src/utils/cache.js +42 -0
  131. package/dist/src/utils/cache.js.map +1 -0
  132. package/dist/src/utils/env-replacer.d.ts +86 -0
  133. package/dist/src/utils/env-replacer.d.ts.map +1 -0
  134. package/dist/src/utils/env-replacer.js +196 -0
  135. package/dist/src/utils/env-replacer.js.map +1 -0
  136. package/dist/src/utils/errors.d.ts +102 -0
  137. package/dist/src/utils/errors.d.ts.map +1 -0
  138. package/dist/src/utils/errors.js +164 -0
  139. package/dist/src/utils/errors.js.map +1 -0
  140. package/dist/src/utils/logger.d.ts +77 -0
  141. package/dist/src/utils/logger.d.ts.map +1 -0
  142. package/dist/src/utils/logger.js +155 -0
  143. package/dist/src/utils/logger.js.map +1 -0
  144. package/package.json +73 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * 会话管理器
3
+ */
4
+ import { SessionStatus } from '../tools/types.js';
5
+ import { SessionNotFoundError, SessionTimeoutError } from '../utils/errors.js';
6
+ import { logger } from '../utils/logger.js';
7
+ /**
8
+ * 会话管理器类
9
+ */
10
+ export class SessionManager {
11
+ sessions = new Map();
12
+ cleanupInterval = null;
13
+ sessionTimeout;
14
+ constructor(sessionTimeout = 3600000) {
15
+ // 默认1小时超时
16
+ this.sessionTimeout = sessionTimeout;
17
+ }
18
+ /**
19
+ * 启动会话清理定时器
20
+ */
21
+ startCleanup(interval = 60000) {
22
+ // 默认每分钟检查一次
23
+ if (this.cleanupInterval) {
24
+ return;
25
+ }
26
+ this.cleanupInterval = setInterval(() => {
27
+ this.cleanupExpiredSessions();
28
+ }, interval);
29
+ logger.info('Session cleanup started', {
30
+ interval,
31
+ timeout: this.sessionTimeout,
32
+ });
33
+ }
34
+ /**
35
+ * 停止会话清理定时器
36
+ */
37
+ stopCleanup() {
38
+ if (this.cleanupInterval) {
39
+ clearInterval(this.cleanupInterval);
40
+ this.cleanupInterval = null;
41
+ logger.info('Session cleanup stopped');
42
+ }
43
+ }
44
+ /**
45
+ * 创建新会话
46
+ */
47
+ create(sessionId, context = {}) {
48
+ const now = Date.now();
49
+ const session = {
50
+ id: sessionId,
51
+ status: SessionStatus.INITIALIZED,
52
+ createdAt: now,
53
+ lastActiveAt: now,
54
+ context,
55
+ };
56
+ this.sessions.set(sessionId, session);
57
+ logger.info(`Session created: ${sessionId}`, {
58
+ context: Object.keys(context),
59
+ });
60
+ return session;
61
+ }
62
+ /**
63
+ * 获取会话
64
+ */
65
+ get(sessionId) {
66
+ const session = this.sessions.get(sessionId);
67
+ if (!session) {
68
+ throw new SessionNotFoundError(sessionId);
69
+ }
70
+ // 检查会话是否超时
71
+ if (this.isExpired(session)) {
72
+ this.close(sessionId);
73
+ throw new SessionTimeoutError(sessionId);
74
+ }
75
+ return session;
76
+ }
77
+ /**
78
+ * 更新会话活跃时间
79
+ */
80
+ touch(sessionId) {
81
+ const session = this.sessions.get(sessionId);
82
+ if (session) {
83
+ session.lastActiveAt = Date.now();
84
+ session.status = SessionStatus.ACTIVE;
85
+ }
86
+ }
87
+ /**
88
+ * 更新会话上下文
89
+ */
90
+ updateContext(sessionId, context) {
91
+ const session = this.get(sessionId);
92
+ session.context = { ...session.context, ...context };
93
+ this.touch(sessionId);
94
+ }
95
+ /**
96
+ * 检查会话是否存在
97
+ */
98
+ has(sessionId) {
99
+ return this.sessions.has(sessionId);
100
+ }
101
+ /**
102
+ * 检查会话是否过期
103
+ */
104
+ isExpired(session) {
105
+ const now = Date.now();
106
+ return now - session.lastActiveAt > this.sessionTimeout;
107
+ }
108
+ /**
109
+ * 关闭会话
110
+ */
111
+ close(sessionId) {
112
+ const session = this.sessions.get(sessionId);
113
+ if (session) {
114
+ session.status = SessionStatus.CLOSED;
115
+ this.sessions.delete(sessionId);
116
+ logger.info(`Session closed: ${sessionId}`, {
117
+ duration: Date.now() - session.createdAt,
118
+ });
119
+ return true;
120
+ }
121
+ return false;
122
+ }
123
+ /**
124
+ * 清理过期会话
125
+ */
126
+ cleanupExpiredSessions() {
127
+ const now = Date.now();
128
+ let cleanedCount = 0;
129
+ for (const [sessionId, session] of this.sessions.entries()) {
130
+ if (this.isExpired(session)) {
131
+ session.status = SessionStatus.TIMEOUT;
132
+ this.sessions.delete(sessionId);
133
+ cleanedCount++;
134
+ logger.debug(`Session expired: ${sessionId}`, {
135
+ inactive: now - session.lastActiveAt,
136
+ });
137
+ }
138
+ }
139
+ if (cleanedCount > 0) {
140
+ logger.info(`Cleaned up ${cleanedCount} expired sessions`);
141
+ }
142
+ }
143
+ /**
144
+ * 获取所有活跃会话
145
+ */
146
+ getActiveSessions() {
147
+ return Array.from(this.sessions.values()).filter(session => session.status !== SessionStatus.CLOSED);
148
+ }
149
+ /**
150
+ * 获取会话数量
151
+ */
152
+ count() {
153
+ return this.sessions.size;
154
+ }
155
+ /**
156
+ * 清空所有会话
157
+ */
158
+ clear() {
159
+ const count = this.sessions.size;
160
+ this.sessions.clear();
161
+ logger.info(`All sessions cleared (${count} sessions)`);
162
+ }
163
+ /**
164
+ * 销毁会话管理器
165
+ */
166
+ destroy() {
167
+ this.stopCleanup();
168
+ this.clear();
169
+ }
170
+ }
171
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/core/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Streamable HTTP 传输层
3
+ */
4
+ import { type McpServer } from '../server.js';
5
+ /**
6
+ * HTTP 服务器配置
7
+ */
8
+ export interface HttpServerConfig {
9
+ port: number;
10
+ path?: string;
11
+ }
12
+ /**
13
+ * 启动 Streamable HTTP 传输模式的 MCP 服务
14
+ */
15
+ export declare function startHttpServer(mcpServer: McpServer, config: HttpServerConfig): void;
16
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../../src/core/transports/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAmLN"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Streamable HTTP 传输层
3
+ */
4
+ import express from 'express';
5
+ import { randomUUID } from 'node:crypto';
6
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
7
+ import { logger } from '../../utils/logger.js';
8
+ /**
9
+ * 启动 Streamable HTTP 传输模式的 MCP 服务
10
+ */
11
+ export function startHttpServer(mcpServer, config) {
12
+ const { port, path = '/mcp' } = config;
13
+ logger.info('Starting MCP Server with Streamable HTTP transport', {
14
+ port,
15
+ path,
16
+ });
17
+ const app = express();
18
+ app.use(express.json());
19
+ // 存储传输实例
20
+ const transports = {};
21
+ // 处理 POST 请求(客户端发送消息)
22
+ app.post(path, async (req, res) => {
23
+ const sessionId = req.headers['mcp-session-id'];
24
+ let transport;
25
+ try {
26
+ if (sessionId && transports[sessionId]) {
27
+ // 复用现有会话
28
+ transport = transports[sessionId];
29
+ logger.debug(`Reusing session: ${sessionId}`);
30
+ }
31
+ else if (!sessionId && req.body.method === 'initialize') {
32
+ // 创建新会话
33
+ transport = new StreamableHTTPServerTransport({
34
+ sessionIdGenerator: () => randomUUID(),
35
+ onsessioninitialized: (id) => {
36
+ transports[id] = transport;
37
+ mcpServer.getSessionManager().create(id);
38
+ logger.info(`Session initialized: ${id}`);
39
+ },
40
+ onsessionclosed: (id) => {
41
+ delete transports[id];
42
+ mcpServer.getSessionManager().close(id);
43
+ logger.info(`Session closed: ${id}`);
44
+ },
45
+ });
46
+ transport.onclose = () => {
47
+ if (transport.sessionId) {
48
+ delete transports[transport.sessionId];
49
+ mcpServer.getSessionManager().close(transport.sessionId);
50
+ }
51
+ };
52
+ // 连接 MCP Server
53
+ await mcpServer.getServer().connect(transport);
54
+ }
55
+ else {
56
+ res.status(400).json({
57
+ jsonrpc: '2.0',
58
+ error: {
59
+ code: -32000,
60
+ message: 'Invalid session or request',
61
+ },
62
+ id: null,
63
+ });
64
+ return;
65
+ }
66
+ // 更新会话活跃时间
67
+ if (transport.sessionId) {
68
+ mcpServer.getSessionManager().touch(transport.sessionId);
69
+ }
70
+ // 处理请求
71
+ await transport.handleRequest(req, res, req.body);
72
+ }
73
+ catch (error) {
74
+ logger.error('Error handling POST request', {
75
+ error: error instanceof Error ? error.message : String(error),
76
+ });
77
+ if (!res.headersSent) {
78
+ res.status(500).json({
79
+ jsonrpc: '2.0',
80
+ error: {
81
+ code: -32603,
82
+ message: 'Internal error',
83
+ },
84
+ id: null,
85
+ });
86
+ }
87
+ }
88
+ });
89
+ // 处理 GET 请求(SSE 流,用于服务端推送)
90
+ app.get(path, async (req, res) => {
91
+ const sessionId = req.headers['mcp-session-id'];
92
+ const transport = transports[sessionId];
93
+ if (!transport) {
94
+ res.status(400).send('Invalid session');
95
+ return;
96
+ }
97
+ try {
98
+ // 更新会话活跃时间
99
+ mcpServer.getSessionManager().touch(sessionId);
100
+ await transport.handleRequest(req, res);
101
+ }
102
+ catch (error) {
103
+ logger.error('Error handling GET request', {
104
+ error: error instanceof Error ? error.message : String(error),
105
+ sessionId,
106
+ });
107
+ if (!res.headersSent) {
108
+ res.status(500).send('Internal error');
109
+ }
110
+ }
111
+ });
112
+ // 处理 DELETE 请求(关闭会话)
113
+ app.delete(path, async (req, res) => {
114
+ const sessionId = req.headers['mcp-session-id'];
115
+ const transport = transports[sessionId];
116
+ if (!transport) {
117
+ res.status(400).send('Invalid session');
118
+ return;
119
+ }
120
+ try {
121
+ await transport.handleRequest(req, res);
122
+ // 清理会话
123
+ delete transports[sessionId];
124
+ mcpServer.getSessionManager().close(sessionId);
125
+ }
126
+ catch (error) {
127
+ logger.error('Error handling DELETE request', {
128
+ error: error instanceof Error ? error.message : String(error),
129
+ sessionId,
130
+ });
131
+ if (!res.headersSent) {
132
+ res.status(500).send('Internal error');
133
+ }
134
+ }
135
+ });
136
+ // 健康检查端点
137
+ app.get('/health', (_req, res) => {
138
+ res.json({
139
+ status: 'healthy',
140
+ sessions: mcpServer.getSessionManager().count(),
141
+ tools: mcpServer.getRegistry().count(),
142
+ });
143
+ });
144
+ // 启动 HTTP 服务器
145
+ const server = app.listen(port, () => {
146
+ logger.info(`HTTP server listening on port ${port}`, {
147
+ endpoint: `http://localhost:${port}${path}`,
148
+ health: `http://localhost:${port}/health`,
149
+ });
150
+ });
151
+ // 启动会话清理
152
+ mcpServer.startSessionCleanup();
153
+ // 处理进程退出
154
+ const shutdown = async () => {
155
+ logger.info('Shutting down HTTP server...');
156
+ server.close(() => {
157
+ logger.info('HTTP server closed');
158
+ });
159
+ await mcpServer.close();
160
+ process.exit(0);
161
+ };
162
+ process.on('SIGINT', () => {
163
+ void shutdown();
164
+ });
165
+ process.on('SIGTERM', () => {
166
+ void shutdown();
167
+ });
168
+ }
169
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../../src/core/transports/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Stdio 传输层
3
+ */
4
+ import { type McpServer } from '../server.js';
5
+ /**
6
+ * 启动 Stdio 传输模式的 MCP 服务
7
+ */
8
+ export declare function startStdioServer(server: McpServer): Promise<void>;
9
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../../../src/core/transports/stdio.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BvE"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Stdio 传输层
3
+ */
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import { logger } from '../../utils/logger.js';
6
+ /**
7
+ * 启动 Stdio 传输模式的 MCP 服务
8
+ */
9
+ export async function startStdioServer(server) {
10
+ logger.info('Starting MCP Server with Stdio transport');
11
+ // 创建 Stdio 传输
12
+ const transport = new StdioServerTransport();
13
+ // 连接 MCP Server
14
+ await server.getServer().connect(transport);
15
+ logger.info('Stdio transport connected, server is ready');
16
+ // 处理进程退出
17
+ process.on('SIGINT', () => {
18
+ void (async () => {
19
+ logger.info('Received SIGINT, closing server...');
20
+ await server.close();
21
+ process.exit(0);
22
+ })();
23
+ });
24
+ process.on('SIGTERM', () => {
25
+ void (async () => {
26
+ logger.info('Received SIGTERM, closing server...');
27
+ await server.close();
28
+ process.exit(0);
29
+ })();
30
+ });
31
+ }
32
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../../../src/core/transports/stdio.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAiB;IACtD,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAExD,cAAc;IACd,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,gBAAgB;IAChB,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE5C,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAE1D,SAAS;IACT,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAClD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YACnD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 框架入口 - 导出所有公共 API
3
+ */
4
+ export { McpServer } from './core/server.js';
5
+ export { ToolRegistry } from './core/registry.js';
6
+ export { ToolRouter } from './core/router.js';
7
+ export { SessionManager } from './core/session.js';
8
+ export { startStdioServer } from './core/transports/stdio.js';
9
+ export { startHttpServer } from './core/transports/http.js';
10
+ export type { HttpServerConfig } from './core/transports/http.js';
11
+ export { SchemaValidator } from './tools/validator.js';
12
+ export { env } from './config/env.js';
13
+ export type { EnvSchema } from './config/env.js';
14
+ export type { ToolConfig, ToolContext, ToolResult, ToolHandler, ServerConfig, TransportMode, Middleware, Session, } from './tools/types.js';
15
+ export { SessionStatus } from './tools/types.js';
16
+ export { McpError, ParseError, InvalidRequestError, MethodNotFoundError, InvalidParamsError, InternalError, ToolNotFoundError, ToolExecutionError, SchemaValidationError, SessionNotFoundError, SessionTimeoutError, ToolRegistrationError, ConfigurationError, RateLimitError, toMcpError, } from './utils/errors.js';
17
+ export { Logger, logger, createLogger } from './utils/logger.js';
18
+ export type { LogLevel, LogEntry } from './utils/logger.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAIvD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,YAAY,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,UAAU,EACV,OAAO,GACR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EACL,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,UAAU,GACX,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 框架入口 - 导出所有公共 API
3
+ */
4
+ // 核心类
5
+ export { McpServer } from './core/server.js';
6
+ export { ToolRegistry } from './core/registry.js';
7
+ export { ToolRouter } from './core/router.js';
8
+ export { SessionManager } from './core/session.js';
9
+ // 传输层
10
+ export { startStdioServer } from './core/transports/stdio.js';
11
+ export { startHttpServer } from './core/transports/http.js';
12
+ // 工具相关
13
+ export { SchemaValidator } from './tools/validator.js';
14
+ // export { echoTool } from './tools/examples/echo.js';
15
+ // 环境变量管理
16
+ export { env } from './config/env.js';
17
+ export { SessionStatus } from './tools/types.js';
18
+ // 错误类
19
+ export { McpError, ParseError, InvalidRequestError, MethodNotFoundError, InvalidParamsError, InternalError, ToolNotFoundError, ToolExecutionError, SchemaValidationError, SessionNotFoundError, SessionTimeoutError, ToolRegistrationError, ConfigurationError, RateLimitError, toMcpError, } from './utils/errors.js';
20
+ // 日志工具
21
+ export { Logger, logger, createLogger } from './utils/logger.js';
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM;AACN,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM;AACN,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,OAAO;AACP,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,uDAAuD;AAEvD,SAAS;AACT,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AActC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM;AACN,OAAO,EACL,QAAQ,EACR,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,UAAU,GACX,MAAM,mBAAmB,CAAC;AAE3B,OAAO;AACP,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Server 启动入口
4
+ */
5
+ import 'dotenv/config';
6
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,eAAe,CAAC"}
@@ -0,0 +1,121 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP Server 启动入口
4
+ */
5
+ import 'dotenv/config';
6
+ import { McpServer } from './core/server.js';
7
+ import { startStdioServer } from './core/transports/stdio.js';
8
+ import { startHttpServer } from './core/transports/http.js';
9
+ // import { echoTool } from './tools/examples/echo.js';
10
+ import { ApiToolLoader, JsonConfigLoader } from './tools/api/index.js';
11
+ import { logger } from './utils/logger.js';
12
+ import { env } from './config/env.js';
13
+ /**
14
+ * 从环境变量读取配置
15
+ */
16
+ function getConfig() {
17
+ return {
18
+ name: 'proxy-api-mcp',
19
+ version: '1.0.0',
20
+ transport: env.get('MCP_TRANSPORT'),
21
+ port: env.get('MCP_PORT'),
22
+ sessionTimeout: env.get('MCP_SESSION_TIMEOUT'),
23
+ logLevel: env.get('MCP_LOG_LEVEL'),
24
+ };
25
+ }
26
+ /**
27
+ * 主函数
28
+ */
29
+ async function main() {
30
+ // 验证环境变量
31
+ try {
32
+ env.validate();
33
+ }
34
+ catch (error) {
35
+ logger.error('Environment validation failed', {
36
+ error: error instanceof Error ? error.message : String(error),
37
+ });
38
+ process.exit(1);
39
+ }
40
+ const config = getConfig();
41
+ // 设置日志级别
42
+ logger.setLevel(config.logLevel);
43
+ // 开发环境下打印配置
44
+ if (env.isDevelopment()) {
45
+ env.print();
46
+ }
47
+ // 创建 MCP Server
48
+ const server = new McpServer(config);
49
+ // 注册示例工具
50
+ // server.registerTool(echoTool);
51
+ // 加载 JSON 配置映射工具(优先级高)
52
+ const jsonConfigKeys = env.get('MCP_JSON_CONFIG');
53
+ if (jsonConfigKeys && jsonConfigKeys.trim() !== '') {
54
+ try {
55
+ logger.info(`Loading JSON config mappings: ${jsonConfigKeys}`);
56
+ const jsonTools = await JsonConfigLoader.loadFromConfigKeys(jsonConfigKeys);
57
+ if (jsonTools.length > 0) {
58
+ server.registerTools(jsonTools);
59
+ logger.info(`Loaded ${jsonTools.length} tools from JSON config mappings`);
60
+ }
61
+ else {
62
+ logger.warn('No tools loaded from JSON config mappings');
63
+ }
64
+ }
65
+ catch (error) {
66
+ logger.error('Failed to load JSON config mappings', {
67
+ error: error instanceof Error ? error.message : String(error),
68
+ });
69
+ }
70
+ }
71
+ else {
72
+ logger.info('No JSON config mappings specified (MCP_JSON_CONFIG not set)');
73
+ }
74
+ // 加载 API 工具配置(仅在配置环境变量时)
75
+ const apiToolsConfigPath = env.get('MCP_API_TOOLS_CONFIG');
76
+ if (apiToolsConfigPath && apiToolsConfigPath.trim() !== '') {
77
+ try {
78
+ logger.info(`Loading API tools from: ${apiToolsConfigPath}`);
79
+ const apiTools = await ApiToolLoader.loadFromFile(apiToolsConfigPath);
80
+ if (apiTools.length > 0) {
81
+ server.registerTools(apiTools);
82
+ logger.info(`Loaded ${apiTools.length} API tools`);
83
+ }
84
+ else {
85
+ logger.warn('No API tools loaded');
86
+ }
87
+ }
88
+ catch (error) {
89
+ logger.warn('Failed to load API tools, continuing without them', {
90
+ error: error instanceof Error ? error.message : String(error),
91
+ });
92
+ }
93
+ }
94
+ else {
95
+ logger.info('No API tools config specified (MCP_API_TOOLS_CONFIG not set)');
96
+ }
97
+ logger.info('Registered tools:', {
98
+ tools: server.getRegistry().getToolNames(),
99
+ });
100
+ // 根据传输模式启动服务器
101
+ switch (config.transport) {
102
+ case 'stdio':
103
+ await startStdioServer(server);
104
+ break;
105
+ case 'http':
106
+ startHttpServer(server, { port: config.port });
107
+ break;
108
+ default:
109
+ logger.error(`Unsupported transport mode: ${config.transport}`);
110
+ process.exit(1);
111
+ }
112
+ }
113
+ // 运行主函数
114
+ main().catch((error) => {
115
+ logger.error('Failed to start server', {
116
+ error: error instanceof Error ? error.message : String(error),
117
+ stack: error instanceof Error ? error.stack : undefined,
118
+ });
119
+ process.exit(1);
120
+ });
121
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * API 工具构建器 - 从 API 配置生成 MCP 工具
3
+ */
4
+ import { type ToolConfig } from '../types.js';
5
+ import { type ApiToolConfig } from './types.js';
6
+ /**
7
+ * API 工具构建器类
8
+ */
9
+ export declare class ApiToolBuilder {
10
+ /**
11
+ * 从 API 配置构建 MCP 工具配置
12
+ */
13
+ static build(apiConfig: ApiToolConfig): ToolConfig;
14
+ /**
15
+ * 构建输入 Schema
16
+ */
17
+ private static buildInputSchema;
18
+ /**
19
+ * 将参数定义转换为 JSON Schema
20
+ */
21
+ private static parameterToJsonSchema;
22
+ /**
23
+ * 批量构建工具
24
+ */
25
+ static buildBatch(apiConfigs: ApiToolConfig[]): ToolConfig[];
26
+ /**
27
+ * 验证 API 配置
28
+ */
29
+ static validate(apiConfig: ApiToolConfig): {
30
+ valid: boolean;
31
+ errors: string[];
32
+ };
33
+ }
34
+ //# sourceMappingURL=builder.d.ts.map