@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.
- package/LICENSE +201 -0
- package/README.md +170 -0
- package/README.zh.md +173 -0
- package/bin/mcphub.js +54 -0
- package/dist/config/index.js +41 -0
- package/dist/config/index.js.map +1 -0
- package/dist/controllers/authController.js +149 -0
- package/dist/controllers/authController.js.map +1 -0
- package/dist/controllers/groupController.js +312 -0
- package/dist/controllers/groupController.js.map +1 -0
- package/dist/controllers/marketController.js +140 -0
- package/dist/controllers/marketController.js.map +1 -0
- package/dist/controllers/serverController.js +283 -0
- package/dist/controllers/serverController.js.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/middlewares/auth.js +24 -0
- package/dist/middlewares/auth.js.map +1 -0
- package/dist/middlewares/index.js +33 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/models/User.js +80 -0
- package/dist/models/User.js.map +1 -0
- package/dist/routes/index.js +56 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/server.js +58 -0
- package/dist/server.js.map +1 -0
- package/dist/services/groupService.js +189 -0
- package/dist/services/groupService.js.map +1 -0
- package/dist/services/marketService.js +98 -0
- package/dist/services/marketService.js.map +1 -0
- package/dist/services/mcpService.js +333 -0
- package/dist/services/mcpService.js.map +1 -0
- package/dist/services/sseService.js +103 -0
- package/dist/services/sseService.js.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/migration.js +47 -0
- package/dist/utils/migration.js.map +1 -0
- 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":"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"}
|
|
@@ -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":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,oCAAoC;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAW,EAAE;IAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;AACrD,CAAC,CAAC;AAEF,4CAA4C;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAiC,EAAE;IACjE,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiC,CAAC;QAEpE,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE;YACjF,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW;gBAAE,OAAO,CAAC,CAAC,CAAC;YAC3D,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW;gBAAE,OAAO,CAAC,CAAC;YAC1D,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;QAClE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF,uCAAuC;AACvC,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAAuB,EAAE;IACzE,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC/B,CAAC,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAa,EAAE;IAChD,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACxC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YACtC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;AACvC,CAAC,CAAC;AAEF,mCAAmC;AACnC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAa,EAAE;IAC1C,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACxC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC,CAAC;AAEF,iCAAiC;AACjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAa,EAAkB,EAAE;IACnE,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,KAAK;SACtB,WAAW,EAAE;SACb,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAErC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QAC9C,kEAAkE;QAClE,MAAM,cAAc,GAAG;YACrB,MAAM,CAAC,IAAI;YACX,MAAM,CAAC,YAAY;YACnB,MAAM,CAAC,WAAW;YAClB,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;YAC5B,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;SACvB;aACE,IAAI,CAAC,GAAG,CAAC;aACT,WAAW,EAAE,CAAC;QAEjB,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,oCAAoC;AACpC,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,QAAgB,EAAkB,EAAE;IAChF,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAEnC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QAC9C,OAAO,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,+BAA+B;AAC/B,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,GAAW,EAAkB,EAAE;IACtE,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAEnC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;QAC9C,OAAO,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -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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"}
|