@samanhappy/mcphub 0.0.1

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 (39) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +170 -0
  3. package/README.zh.md +173 -0
  4. package/bin/mcphub.js +54 -0
  5. package/dist/config/index.js +41 -0
  6. package/dist/config/index.js.map +1 -0
  7. package/dist/controllers/authController.js +149 -0
  8. package/dist/controllers/authController.js.map +1 -0
  9. package/dist/controllers/groupController.js +312 -0
  10. package/dist/controllers/groupController.js.map +1 -0
  11. package/dist/controllers/marketController.js +140 -0
  12. package/dist/controllers/marketController.js.map +1 -0
  13. package/dist/controllers/serverController.js +283 -0
  14. package/dist/controllers/serverController.js.map +1 -0
  15. package/dist/index.js +15 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/middlewares/auth.js +24 -0
  18. package/dist/middlewares/auth.js.map +1 -0
  19. package/dist/middlewares/index.js +33 -0
  20. package/dist/middlewares/index.js.map +1 -0
  21. package/dist/models/User.js +80 -0
  22. package/dist/models/User.js.map +1 -0
  23. package/dist/routes/index.js +56 -0
  24. package/dist/routes/index.js.map +1 -0
  25. package/dist/server.js +58 -0
  26. package/dist/server.js.map +1 -0
  27. package/dist/services/groupService.js +189 -0
  28. package/dist/services/groupService.js.map +1 -0
  29. package/dist/services/marketService.js +98 -0
  30. package/dist/services/marketService.js.map +1 -0
  31. package/dist/services/mcpService.js +333 -0
  32. package/dist/services/mcpService.js.map +1 -0
  33. package/dist/services/sseService.js +103 -0
  34. package/dist/services/sseService.js.map +1 -0
  35. package/dist/types/index.js +2 -0
  36. package/dist/types/index.js.map +1 -0
  37. package/dist/utils/migration.js +47 -0
  38. package/dist/utils/migration.js.map +1 -0
  39. package/package.json +92 -0
@@ -0,0 +1,189 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { loadSettings, saveSettings } from '../config/index.js';
3
+ import { notifyToolChanged } from './mcpService.js';
4
+ // Get all groups
5
+ export const getAllGroups = () => {
6
+ const settings = loadSettings();
7
+ return settings.groups || [];
8
+ };
9
+ // Get group by ID or name
10
+ export const getGroupByIdOrName = (key) => {
11
+ const settings = loadSettings();
12
+ const routingConfig = settings.systemConfig?.routing || {
13
+ enableGlobalRoute: true,
14
+ enableGroupNameRoute: true,
15
+ };
16
+ const groups = getAllGroups();
17
+ return (groups.find((group) => group.id === key || (group.name === key && routingConfig.enableGroupNameRoute)) || undefined);
18
+ };
19
+ // Create a new group
20
+ export const createGroup = (name, description, servers = []) => {
21
+ try {
22
+ const settings = loadSettings();
23
+ const groups = settings.groups || [];
24
+ // Check if group with same name already exists
25
+ if (groups.some((group) => group.name === name)) {
26
+ return null;
27
+ }
28
+ // Filter out non-existent servers
29
+ const validServers = servers.filter((serverName) => settings.mcpServers[serverName]);
30
+ const newGroup = {
31
+ id: uuidv4(),
32
+ name,
33
+ description,
34
+ servers: validServers,
35
+ };
36
+ // Initialize groups array if it doesn't exist
37
+ if (!settings.groups) {
38
+ settings.groups = [];
39
+ }
40
+ settings.groups.push(newGroup);
41
+ if (!saveSettings(settings)) {
42
+ return null;
43
+ }
44
+ return newGroup;
45
+ }
46
+ catch (error) {
47
+ console.error('Failed to create group:', error);
48
+ return null;
49
+ }
50
+ };
51
+ // Update an existing group
52
+ export const updateGroup = (id, data) => {
53
+ try {
54
+ const settings = loadSettings();
55
+ if (!settings.groups) {
56
+ return null;
57
+ }
58
+ const groupIndex = settings.groups.findIndex((group) => group.id === id);
59
+ if (groupIndex === -1) {
60
+ return null;
61
+ }
62
+ // Check for name uniqueness if name is being updated
63
+ if (data.name && settings.groups.some((g) => g.name === data.name && g.id !== id)) {
64
+ return null;
65
+ }
66
+ // If servers array is provided, validate server existence
67
+ if (data.servers) {
68
+ data.servers = data.servers.filter((serverName) => settings.mcpServers[serverName]);
69
+ }
70
+ const updatedGroup = {
71
+ ...settings.groups[groupIndex],
72
+ ...data,
73
+ };
74
+ settings.groups[groupIndex] = updatedGroup;
75
+ if (!saveSettings(settings)) {
76
+ return null;
77
+ }
78
+ notifyToolChanged();
79
+ return updatedGroup;
80
+ }
81
+ catch (error) {
82
+ console.error(`Failed to update group ${id}:`, error);
83
+ return null;
84
+ }
85
+ };
86
+ // Update servers in a group (batch update)
87
+ export const updateGroupServers = (groupId, servers) => {
88
+ try {
89
+ const settings = loadSettings();
90
+ if (!settings.groups) {
91
+ return null;
92
+ }
93
+ const groupIndex = settings.groups.findIndex((group) => group.id === groupId);
94
+ if (groupIndex === -1) {
95
+ return null;
96
+ }
97
+ // Filter out non-existent servers
98
+ const validServers = servers.filter((serverName) => settings.mcpServers[serverName]);
99
+ settings.groups[groupIndex].servers = validServers;
100
+ if (!saveSettings(settings)) {
101
+ return null;
102
+ }
103
+ notifyToolChanged();
104
+ return settings.groups[groupIndex];
105
+ }
106
+ catch (error) {
107
+ console.error(`Failed to update servers for group ${groupId}:`, error);
108
+ return null;
109
+ }
110
+ };
111
+ // Delete a group
112
+ export const deleteGroup = (id) => {
113
+ try {
114
+ const settings = loadSettings();
115
+ if (!settings.groups) {
116
+ return false;
117
+ }
118
+ const initialLength = settings.groups.length;
119
+ settings.groups = settings.groups.filter((group) => group.id !== id);
120
+ if (settings.groups.length === initialLength) {
121
+ return false;
122
+ }
123
+ return saveSettings(settings);
124
+ }
125
+ catch (error) {
126
+ console.error(`Failed to delete group ${id}:`, error);
127
+ return false;
128
+ }
129
+ };
130
+ // Add server to group
131
+ export const addServerToGroup = (groupId, serverName) => {
132
+ try {
133
+ const settings = loadSettings();
134
+ if (!settings.groups) {
135
+ return null;
136
+ }
137
+ // Verify server exists
138
+ if (!settings.mcpServers[serverName]) {
139
+ return null;
140
+ }
141
+ const groupIndex = settings.groups.findIndex((group) => group.id === groupId);
142
+ if (groupIndex === -1) {
143
+ return null;
144
+ }
145
+ const group = settings.groups[groupIndex];
146
+ // Add server to group if not already in it
147
+ if (!group.servers.includes(serverName)) {
148
+ group.servers.push(serverName);
149
+ if (!saveSettings(settings)) {
150
+ return null;
151
+ }
152
+ }
153
+ notifyToolChanged();
154
+ return group;
155
+ }
156
+ catch (error) {
157
+ console.error(`Failed to add server ${serverName} to group ${groupId}:`, error);
158
+ return null;
159
+ }
160
+ };
161
+ // Remove server from group
162
+ export const removeServerFromGroup = (groupId, serverName) => {
163
+ try {
164
+ const settings = loadSettings();
165
+ if (!settings.groups) {
166
+ return null;
167
+ }
168
+ const groupIndex = settings.groups.findIndex((group) => group.id === groupId);
169
+ if (groupIndex === -1) {
170
+ return null;
171
+ }
172
+ const group = settings.groups[groupIndex];
173
+ group.servers = group.servers.filter((name) => name !== serverName);
174
+ if (!saveSettings(settings)) {
175
+ return null;
176
+ }
177
+ return group;
178
+ }
179
+ catch (error) {
180
+ console.error(`Failed to remove server ${serverName} from group ${groupId}:`, error);
181
+ return null;
182
+ }
183
+ };
184
+ // Get all servers in a group
185
+ export const getServersInGroup = (groupId) => {
186
+ const group = getGroupByIdOrName(groupId);
187
+ return group ? group.servers : [];
188
+ };
189
+ //# sourceMappingURL=groupService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupService.js","sourceRoot":"","sources":["../../src/services/groupService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,iBAAiB;AACjB,MAAM,CAAC,MAAM,YAAY,GAAG,GAAa,EAAE;IACzC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,OAAO,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;AAC/B,CAAC,CAAC;AAEF,0BAA0B;AAC1B,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAsB,EAAE;IACpE,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,aAAa,GAAG,QAAQ,CAAC,YAAY,EAAE,OAAO,IAAI;QACtD,iBAAiB,EAAE,IAAI;QACvB,oBAAoB,EAAE,IAAI;KAC3B,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,OAAO,CACL,MAAM,CAAC,IAAI,CACT,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,IAAI,aAAa,CAAC,oBAAoB,CAAC,CAC1F,IAAI,SAAS,CACf,CAAC;AACJ,CAAC,CAAC;AAEF,qBAAqB;AACrB,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,IAAY,EACZ,WAAoB,EACpB,UAAoB,EAAE,EACP,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;QAErC,+CAA+C;QAC/C,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kCAAkC;QAClC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QAErF,MAAM,QAAQ,GAAW;YACvB,EAAE,EAAE,MAAM,EAAE;YACZ,IAAI;YACJ,WAAW;YACX,OAAO,EAAE,YAAY;SACtB,CAAC;QAEF,8CAA8C;QAC9C,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;QACvB,CAAC;QAED,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE/B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,2BAA2B;AAC3B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,IAAqB,EAAiB,EAAE;IAC9E,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,qDAAqD;QACrD,IAAI,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAClF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0DAA0D;QAC1D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,YAAY,GAAG;YACnB,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC;YAC9B,GAAG,IAAI;SACR,CAAC;QAEF,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC;QAE3C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iBAAiB,EAAE,CAAC;QACpB,OAAO,YAAY,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAe,EAAE,OAAiB,EAAiB,EAAE;IACtF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QAC9E,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,kCAAkC;QAClC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;QAErF,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,GAAG,YAAY,CAAC;QAEnD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,iBAAiB,EAAE,CAAC;QACpB,OAAO,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,iBAAiB;AACjB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAU,EAAW,EAAE;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;QAC7C,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAErE,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF,sBAAsB;AACtB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,UAAkB,EAAiB,EAAE;IACrF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QAC9E,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE1C,2CAA2C;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACxC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAE/B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,iBAAiB,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,UAAU,aAAa,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,2BAA2B;AAC3B,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAE,UAAkB,EAAiB,EAAE;IAC1F,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QAC9E,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC1C,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;QAEpE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,UAAU,eAAe,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,6BAA6B;AAC7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAY,EAAE;IAC7D,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACpC,CAAC,CAAC"}
@@ -0,0 +1,98 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ // Get path to the servers.json file
4
+ export const getServersJsonPath = () => {
5
+ return path.resolve(process.cwd(), 'servers.json');
6
+ };
7
+ // Load all market servers from servers.json
8
+ export const getMarketServers = () => {
9
+ try {
10
+ const serversJsonPath = getServersJsonPath();
11
+ const data = fs.readFileSync(serversJsonPath, 'utf8');
12
+ const serversObj = JSON.parse(data);
13
+ const sortedEntries = Object.entries(serversObj).sort(([, serverA], [, serverB]) => {
14
+ if (serverA.is_official && !serverB.is_official)
15
+ return -1;
16
+ if (!serverA.is_official && serverB.is_official)
17
+ return 1;
18
+ return 0;
19
+ });
20
+ return Object.fromEntries(sortedEntries);
21
+ }
22
+ catch (error) {
23
+ console.error('Failed to load servers from servers.json:', error);
24
+ return {};
25
+ }
26
+ };
27
+ // Get a specific market server by name
28
+ export const getMarketServerByName = (name) => {
29
+ const servers = getMarketServers();
30
+ return servers[name] || null;
31
+ };
32
+ // Get all categories from market servers
33
+ export const getMarketCategories = () => {
34
+ const servers = getMarketServers();
35
+ const categories = new Set();
36
+ Object.values(servers).forEach((server) => {
37
+ server.categories?.forEach((category) => {
38
+ categories.add(category);
39
+ });
40
+ });
41
+ return Array.from(categories).sort();
42
+ };
43
+ // Get all tags from market servers
44
+ export const getMarketTags = () => {
45
+ const servers = getMarketServers();
46
+ const tags = new Set();
47
+ Object.values(servers).forEach((server) => {
48
+ server.tags?.forEach((tag) => {
49
+ tags.add(tag);
50
+ });
51
+ });
52
+ return Array.from(tags).sort();
53
+ };
54
+ // Search market servers by query
55
+ export const searchMarketServers = (query) => {
56
+ const servers = getMarketServers();
57
+ const searchTerms = query
58
+ .toLowerCase()
59
+ .split(' ')
60
+ .filter((term) => term.length > 0);
61
+ if (searchTerms.length === 0) {
62
+ return Object.values(servers);
63
+ }
64
+ return Object.values(servers).filter((server) => {
65
+ // Search in name, display_name, description, categories, and tags
66
+ const searchableText = [
67
+ server.name,
68
+ server.display_name,
69
+ server.description,
70
+ ...(server.categories || []),
71
+ ...(server.tags || []),
72
+ ]
73
+ .join(' ')
74
+ .toLowerCase();
75
+ return searchTerms.some((term) => searchableText.includes(term));
76
+ });
77
+ };
78
+ // Filter market servers by category
79
+ export const filterMarketServersByCategory = (category) => {
80
+ const servers = getMarketServers();
81
+ if (!category) {
82
+ return Object.values(servers);
83
+ }
84
+ return Object.values(servers).filter((server) => {
85
+ return server.categories?.includes(category);
86
+ });
87
+ };
88
+ // Filter market servers by tag
89
+ export const filterMarketServersByTag = (tag) => {
90
+ const servers = getMarketServers();
91
+ if (!tag) {
92
+ return Object.values(servers);
93
+ }
94
+ return Object.values(servers).filter((server) => {
95
+ return server.tags?.includes(tag);
96
+ });
97
+ };
98
+ //# sourceMappingURL=marketService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketService.js","sourceRoot":"","sources":["../../src/services/marketService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,333 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
3
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
4
+ import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
5
+ import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
6
+ import { loadSettings, saveSettings, expandEnvVars } from '../config/index.js';
7
+ import config from '../config/index.js';
8
+ import { getGroup } from './sseService.js';
9
+ import { getServersInGroup } from './groupService.js';
10
+ let currentServer;
11
+ export const initMcpServer = async (name, version) => {
12
+ currentServer = createMcpServer(name, version);
13
+ await registerAllTools(currentServer, true, true);
14
+ };
15
+ export const setMcpServer = (server) => {
16
+ currentServer = server;
17
+ };
18
+ export const getMcpServer = () => {
19
+ return currentServer;
20
+ };
21
+ export const notifyToolChanged = async () => {
22
+ await registerAllTools(currentServer, true, false);
23
+ currentServer
24
+ .sendToolListChanged()
25
+ .catch((error) => {
26
+ console.warn('Failed to send tool list changed notification:', error.message);
27
+ })
28
+ .then(() => {
29
+ console.log('Tool list changed notification sent successfully');
30
+ });
31
+ };
32
+ // Store all server information
33
+ let serverInfos = [];
34
+ // Initialize MCP server clients
35
+ export const initializeClientsFromSettings = (isInit) => {
36
+ const settings = loadSettings();
37
+ const existingServerInfos = serverInfos;
38
+ serverInfos = [];
39
+ for (const [name, conf] of Object.entries(settings.mcpServers)) {
40
+ // Skip disabled servers
41
+ if (conf.enabled === false) {
42
+ console.log(`Skipping disabled server: ${name}`);
43
+ serverInfos.push({
44
+ name,
45
+ status: 'disconnected',
46
+ error: null,
47
+ tools: [],
48
+ createTime: Date.now(),
49
+ enabled: false,
50
+ });
51
+ continue;
52
+ }
53
+ // Check if server is already connected
54
+ const existingServer = existingServerInfos.find((s) => s.name === name && s.status === 'connected');
55
+ if (existingServer) {
56
+ serverInfos.push({
57
+ ...existingServer,
58
+ enabled: conf.enabled === undefined ? true : conf.enabled,
59
+ });
60
+ console.log(`Server '${name}' is already connected.`);
61
+ continue;
62
+ }
63
+ let transport;
64
+ if (conf.url) {
65
+ transport = new SSEClientTransport(new URL(conf.url));
66
+ }
67
+ else if (conf.command && conf.args) {
68
+ const env = conf.env || {};
69
+ env['PATH'] = expandEnvVars(process.env.PATH) || '';
70
+ transport = new StdioClientTransport({
71
+ command: conf.command,
72
+ args: conf.args,
73
+ env: env,
74
+ });
75
+ }
76
+ else {
77
+ console.warn(`Skipping server '${name}': missing required configuration`);
78
+ serverInfos.push({
79
+ name,
80
+ status: 'disconnected',
81
+ error: 'Missing required configuration',
82
+ tools: [],
83
+ createTime: Date.now(),
84
+ });
85
+ continue;
86
+ }
87
+ const client = new Client({
88
+ name: `mcp-client-${name}`,
89
+ version: '1.0.0',
90
+ }, {
91
+ capabilities: {
92
+ prompts: {},
93
+ resources: {},
94
+ tools: {},
95
+ },
96
+ });
97
+ const timeout = isInit ? Number(config.initTimeout) : Number(config.timeout);
98
+ client
99
+ .connect(transport, { timeout: timeout })
100
+ .then(() => {
101
+ console.log(`Successfully connected client for server: ${name}`);
102
+ client
103
+ .listTools({}, { timeout: timeout })
104
+ .then((tools) => {
105
+ console.log(`Successfully listed ${tools.tools.length} tools for server: ${name}`);
106
+ const serverInfo = getServerByName(name);
107
+ if (!serverInfo) {
108
+ console.warn(`Server info not found for server: ${name}`);
109
+ return;
110
+ }
111
+ serverInfo.tools = tools.tools.map((tool) => ({
112
+ name: tool.name,
113
+ description: tool.description || '',
114
+ inputSchema: tool.inputSchema || {},
115
+ }));
116
+ serverInfo.status = 'connected';
117
+ serverInfo.error = null;
118
+ })
119
+ .catch((error) => {
120
+ console.error(`Failed to list tools for server ${name} by error: ${error} with stack: ${error.stack}`);
121
+ const serverInfo = getServerByName(name);
122
+ if (serverInfo) {
123
+ serverInfo.status = 'disconnected';
124
+ serverInfo.error = `Failed to list tools: ${error.stack} `;
125
+ }
126
+ });
127
+ })
128
+ .catch((error) => {
129
+ console.error(`Failed to connect client for server ${name} by error: ${error} with stack: ${error.stack}`);
130
+ const serverInfo = getServerByName(name);
131
+ if (serverInfo) {
132
+ serverInfo.status = 'disconnected';
133
+ serverInfo.error = `Failed to connect: ${error.stack} `;
134
+ }
135
+ });
136
+ serverInfos.push({
137
+ name,
138
+ status: 'connecting',
139
+ error: null,
140
+ tools: [],
141
+ client,
142
+ transport,
143
+ createTime: Date.now(),
144
+ });
145
+ console.log(`Initialized client for server: ${name}`);
146
+ }
147
+ return serverInfos;
148
+ };
149
+ // Register all MCP tools
150
+ export const registerAllTools = async (server, forceInit, isInit) => {
151
+ initializeClientsFromSettings(isInit);
152
+ };
153
+ // Get all server information
154
+ export const getServersInfo = () => {
155
+ const settings = loadSettings();
156
+ const infos = serverInfos.map(({ name, status, tools, createTime, error }) => {
157
+ const serverConfig = settings.mcpServers[name];
158
+ const enabled = serverConfig ? serverConfig.enabled !== false : true;
159
+ return {
160
+ name,
161
+ status,
162
+ error,
163
+ tools,
164
+ createTime,
165
+ enabled,
166
+ };
167
+ });
168
+ infos.sort((a, b) => {
169
+ if (a.enabled === b.enabled)
170
+ return 0;
171
+ return a.enabled ? -1 : 1;
172
+ });
173
+ return infos;
174
+ };
175
+ // Get server by name
176
+ const getServerByName = (name) => {
177
+ return serverInfos.find((serverInfo) => serverInfo.name === name);
178
+ };
179
+ // Get server by tool name
180
+ const getServerByTool = (toolName) => {
181
+ return serverInfos.find((serverInfo) => serverInfo.tools.some((tool) => tool.name === toolName));
182
+ };
183
+ // Add new server
184
+ export const addServer = async (name, config) => {
185
+ try {
186
+ const settings = loadSettings();
187
+ if (settings.mcpServers[name]) {
188
+ return { success: false, message: 'Server name already exists' };
189
+ }
190
+ settings.mcpServers[name] = config;
191
+ if (!saveSettings(settings)) {
192
+ return { success: false, message: 'Failed to save settings' };
193
+ }
194
+ registerAllTools(currentServer, false, false);
195
+ return { success: true, message: 'Server added successfully' };
196
+ }
197
+ catch (error) {
198
+ console.error(`Failed to add server: ${name}`, error);
199
+ return { success: false, message: 'Failed to add server' };
200
+ }
201
+ };
202
+ // Remove server
203
+ export const removeServer = (name) => {
204
+ try {
205
+ const settings = loadSettings();
206
+ if (!settings.mcpServers[name]) {
207
+ return { success: false, message: 'Server not found' };
208
+ }
209
+ delete settings.mcpServers[name];
210
+ if (!saveSettings(settings)) {
211
+ return { success: false, message: 'Failed to save settings' };
212
+ }
213
+ serverInfos = serverInfos.filter((serverInfo) => serverInfo.name !== name);
214
+ return { success: true, message: 'Server removed successfully' };
215
+ }
216
+ catch (error) {
217
+ console.error(`Failed to remove server: ${name}`, error);
218
+ return { success: false, message: `Failed to remove server: ${error}` };
219
+ }
220
+ };
221
+ // Update existing server
222
+ export const updateMcpServer = async (name, config) => {
223
+ try {
224
+ const settings = loadSettings();
225
+ if (!settings.mcpServers[name]) {
226
+ return { success: false, message: 'Server not found' };
227
+ }
228
+ settings.mcpServers[name] = config;
229
+ if (!saveSettings(settings)) {
230
+ return { success: false, message: 'Failed to save settings' };
231
+ }
232
+ closeServer(name);
233
+ serverInfos = serverInfos.filter((serverInfo) => serverInfo.name !== name);
234
+ return { success: true, message: 'Server updated successfully' };
235
+ }
236
+ catch (error) {
237
+ console.error(`Failed to update server: ${name}`, error);
238
+ return { success: false, message: 'Failed to update server' };
239
+ }
240
+ };
241
+ // Close server client and transport
242
+ function closeServer(name) {
243
+ const serverInfo = serverInfos.find((serverInfo) => serverInfo.name === name);
244
+ if (serverInfo && serverInfo.client && serverInfo.transport) {
245
+ serverInfo.client.close();
246
+ serverInfo.transport.close();
247
+ console.log(`Closed client and transport for server: ${serverInfo.name}`);
248
+ // TODO kill process
249
+ }
250
+ }
251
+ // Toggle server enabled status
252
+ export const toggleServerStatus = async (name, enabled) => {
253
+ try {
254
+ const settings = loadSettings();
255
+ if (!settings.mcpServers[name]) {
256
+ return { success: false, message: 'Server not found' };
257
+ }
258
+ // Update the enabled status in settings
259
+ settings.mcpServers[name].enabled = enabled;
260
+ if (!saveSettings(settings)) {
261
+ return { success: false, message: 'Failed to save settings' };
262
+ }
263
+ // If disabling, disconnect the server and remove from active servers
264
+ if (!enabled) {
265
+ closeServer(name);
266
+ // Update the server info to show as disconnected and disabled
267
+ const index = serverInfos.findIndex((s) => s.name === name);
268
+ if (index !== -1) {
269
+ serverInfos[index] = {
270
+ ...serverInfos[index],
271
+ status: 'disconnected',
272
+ enabled: false,
273
+ };
274
+ }
275
+ }
276
+ return { success: true, message: `Server ${enabled ? 'enabled' : 'disabled'} successfully` };
277
+ }
278
+ catch (error) {
279
+ console.error(`Failed to toggle server status: ${name}`, error);
280
+ return { success: false, message: 'Failed to toggle server status' };
281
+ }
282
+ };
283
+ // Create McpServer instance
284
+ export const createMcpServer = (name, version) => {
285
+ const server = new Server({ name, version }, { capabilities: { tools: {} } });
286
+ server.setRequestHandler(ListToolsRequestSchema, async (_, extra) => {
287
+ const sessionId = extra.sessionId || '';
288
+ const group = getGroup(sessionId);
289
+ console.log(`Handling ListToolsRequest for group: ${group}`);
290
+ const allServerInfos = serverInfos.filter((serverInfo) => {
291
+ if (serverInfo.enabled === false)
292
+ return false;
293
+ if (!group)
294
+ return true;
295
+ const serversInGroup = getServersInGroup(group);
296
+ return serversInGroup.includes(serverInfo.name);
297
+ });
298
+ const allTools = [];
299
+ for (const serverInfo of allServerInfos) {
300
+ if (serverInfo.tools && serverInfo.tools.length > 0) {
301
+ allTools.push(...serverInfo.tools);
302
+ }
303
+ }
304
+ return {
305
+ tools: allTools,
306
+ };
307
+ });
308
+ server.setRequestHandler(CallToolRequestSchema, async (request, _) => {
309
+ console.log(`Handling CallToolRequest for tool: ${request.params.name}`);
310
+ try {
311
+ if (!request.params.arguments) {
312
+ throw new Error('Arguments are required');
313
+ }
314
+ const serverInfo = getServerByTool(request.params.name);
315
+ if (!serverInfo) {
316
+ throw new Error(`Server not found: ${request.params.name}`);
317
+ }
318
+ const client = serverInfo.client;
319
+ if (!client) {
320
+ throw new Error(`Client not found for server: ${request.params.name}`);
321
+ }
322
+ const result = await client.callTool(request.params);
323
+ console.log(`Tool call result: ${JSON.stringify(result)}`);
324
+ return result;
325
+ }
326
+ catch (error) {
327
+ console.error(`Error handling CallToolRequest: ${error}`);
328
+ return { error: `Failed to call tool: ${error}` };
329
+ }
330
+ });
331
+ return server;
332
+ };
333
+ //# sourceMappingURL=mcpService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpService.js","sourceRoot":"","sources":["../../src/services/mcpService.ts"],"names":[],"mappings":"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"}