sub-agents-mcp 0.1.2
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 +21 -0
- package/README.md +265 -0
- package/dist/agents/AgentManager.d.ts +58 -0
- package/dist/agents/AgentManager.d.ts.map +1 -0
- package/dist/agents/AgentManager.js +182 -0
- package/dist/agents/AgentManager.js.map +1 -0
- package/dist/config/ServerConfig.d.ts +34 -0
- package/dist/config/ServerConfig.d.ts.map +1 -0
- package/dist/config/ServerConfig.js +54 -0
- package/dist/config/ServerConfig.js.map +1 -0
- package/dist/execution/AgentExecutor.d.ts +114 -0
- package/dist/execution/AgentExecutor.d.ts.map +1 -0
- package/dist/execution/AgentExecutor.js +234 -0
- package/dist/execution/AgentExecutor.js.map +1 -0
- package/dist/execution/ExecutionLimits.d.ts +141 -0
- package/dist/execution/ExecutionLimits.d.ts.map +1 -0
- package/dist/execution/ExecutionLimits.js +231 -0
- package/dist/execution/ExecutionLimits.js.map +1 -0
- package/dist/execution/McpRequestTimeout.d.ts +166 -0
- package/dist/execution/McpRequestTimeout.d.ts.map +1 -0
- package/dist/execution/McpRequestTimeout.js +278 -0
- package/dist/execution/McpRequestTimeout.js.map +1 -0
- package/dist/execution/PromptController.d.ts +92 -0
- package/dist/execution/PromptController.d.ts.map +1 -0
- package/dist/execution/PromptController.js +130 -0
- package/dist/execution/PromptController.js.map +1 -0
- package/dist/execution/StreamProcessor.d.ts +23 -0
- package/dist/execution/StreamProcessor.d.ts.map +1 -0
- package/dist/execution/StreamProcessor.js +51 -0
- package/dist/execution/StreamProcessor.js.map +1 -0
- package/dist/execution/TimeoutManager.d.ts +159 -0
- package/dist/execution/TimeoutManager.d.ts.map +1 -0
- package/dist/execution/TimeoutManager.js +283 -0
- package/dist/execution/TimeoutManager.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/AgentResources.d.ts +104 -0
- package/dist/resources/AgentResources.d.ts.map +1 -0
- package/dist/resources/AgentResources.js +315 -0
- package/dist/resources/AgentResources.js.map +1 -0
- package/dist/server/McpServer.d.ts +138 -0
- package/dist/server/McpServer.d.ts.map +1 -0
- package/dist/server/McpServer.js +373 -0
- package/dist/server/McpServer.js.map +1 -0
- package/dist/tools/RunAgentTool.d.ts +140 -0
- package/dist/tools/RunAgentTool.d.ts.map +1 -0
- package/dist/tools/RunAgentTool.js +371 -0
- package/dist/tools/RunAgentTool.js.map +1 -0
- package/dist/types/AgentDefinition.d.ts +33 -0
- package/dist/types/AgentDefinition.d.ts.map +1 -0
- package/dist/types/AgentDefinition.js +3 -0
- package/dist/types/AgentDefinition.js.map +1 -0
- package/dist/types/ExecutionParams.d.ts +48 -0
- package/dist/types/ExecutionParams.d.ts.map +1 -0
- package/dist/types/ExecutionParams.js +3 -0
- package/dist/types/ExecutionParams.js.map +1 -0
- package/dist/types/ServerConfig.d.ts +39 -0
- package/dist/types/ServerConfig.d.ts.map +1 -0
- package/dist/types/ServerConfig.js +3 -0
- package/dist/types/ServerConfig.js.map +1 -0
- package/dist/types/index.d.ts +19 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/ErrorHandler.d.ts +86 -0
- package/dist/utils/ErrorHandler.d.ts.map +1 -0
- package/dist/utils/ErrorHandler.js +99 -0
- package/dist/utils/ErrorHandler.js.map +1 -0
- package/dist/utils/Logger.d.ts +99 -0
- package/dist/utils/Logger.d.ts.map +1 -0
- package/dist/utils/Logger.js +151 -0
- package/dist/utils/Logger.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AgentResources implementation for publishing agent definitions via MCP
|
|
4
|
+
*
|
|
5
|
+
* Provides MCP resources for agent discovery including a list of all
|
|
6
|
+
* available agents and individual agent definition resources.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.AgentResources = void 0;
|
|
10
|
+
const Logger_1 = require("../utils/Logger");
|
|
11
|
+
/**
|
|
12
|
+
* AgentResources class for managing agent definition resources in MCP
|
|
13
|
+
*
|
|
14
|
+
* Publishes agent information as MCP resources that clients can discover
|
|
15
|
+
* and read to understand available agents and their capabilities.
|
|
16
|
+
*/
|
|
17
|
+
class AgentResources {
|
|
18
|
+
constructor(agentManager) {
|
|
19
|
+
this.agentManager = agentManager;
|
|
20
|
+
this.logger = new Logger_1.Logger('info');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get list of all published agent resources
|
|
24
|
+
*
|
|
25
|
+
* @returns Promise resolving to array of MCP resource definitions
|
|
26
|
+
*/
|
|
27
|
+
async listResources() {
|
|
28
|
+
const startTime = Date.now();
|
|
29
|
+
this.logger.debug('Starting resource listing', {
|
|
30
|
+
timestamp: new Date().toISOString(),
|
|
31
|
+
});
|
|
32
|
+
const resources = [];
|
|
33
|
+
// Add agent list resource
|
|
34
|
+
resources.push({
|
|
35
|
+
uri: 'agents://list',
|
|
36
|
+
name: 'Agent List',
|
|
37
|
+
description: 'List of available Claude Code sub-agents',
|
|
38
|
+
mimeType: 'text/plain',
|
|
39
|
+
});
|
|
40
|
+
// Add individual agent resources if agent manager is available
|
|
41
|
+
if (this.agentManager) {
|
|
42
|
+
try {
|
|
43
|
+
const agents = await this.agentManager.listAgents();
|
|
44
|
+
this.logger.debug('Agents loaded for resource listing', {
|
|
45
|
+
agentCount: agents.length,
|
|
46
|
+
loadTime: Date.now() - startTime,
|
|
47
|
+
});
|
|
48
|
+
for (const agent of agents) {
|
|
49
|
+
resources.push({
|
|
50
|
+
uri: `agents://${agent.name}`,
|
|
51
|
+
name: `Agent: ${agent.name}`,
|
|
52
|
+
description: agent.description || 'Agent definition',
|
|
53
|
+
mimeType: 'text/markdown',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
this.logger.error('Failed to load agents for resource listing', error instanceof Error ? error : undefined, {
|
|
59
|
+
loadTime: Date.now() - startTime,
|
|
60
|
+
});
|
|
61
|
+
// If we can't load agents, just return the list resource
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.logger.warn('Agent manager not available for resource listing');
|
|
66
|
+
}
|
|
67
|
+
this.logger.info('Resource listing completed', {
|
|
68
|
+
resourceCount: resources.length,
|
|
69
|
+
totalTime: Date.now() - startTime,
|
|
70
|
+
});
|
|
71
|
+
return resources;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Read content of a specific agent resource
|
|
75
|
+
*
|
|
76
|
+
* @param uri - Resource URI to read
|
|
77
|
+
* @returns Promise resolving to resource content
|
|
78
|
+
* @throws {Error} When resource URI is invalid or not found
|
|
79
|
+
*/
|
|
80
|
+
async readResource(uri) {
|
|
81
|
+
const startTime = Date.now();
|
|
82
|
+
const requestId = this.generateRequestId();
|
|
83
|
+
this.logger.info('Resource read requested', {
|
|
84
|
+
requestId,
|
|
85
|
+
uri,
|
|
86
|
+
timestamp: new Date().toISOString(),
|
|
87
|
+
});
|
|
88
|
+
try {
|
|
89
|
+
let result;
|
|
90
|
+
if (uri === 'agents://list') {
|
|
91
|
+
result = await this.getAgentListContent();
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Check for individual agent resource
|
|
95
|
+
const agentNameMatch = uri.match(/^agents:\/\/(.+)$/);
|
|
96
|
+
if (agentNameMatch?.[1]) {
|
|
97
|
+
const agentName = agentNameMatch[1];
|
|
98
|
+
result = await this.getAgentContent(agentName);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
throw new Error(`Invalid resource URI format: ${uri}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
this.logger.info('Resource read completed', {
|
|
105
|
+
requestId,
|
|
106
|
+
uri,
|
|
107
|
+
readTime: Date.now() - startTime,
|
|
108
|
+
contentLength: result.contents[0]?.text?.length || 0,
|
|
109
|
+
});
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
this.logger.error('Resource read failed', error instanceof Error ? error : undefined, {
|
|
114
|
+
requestId,
|
|
115
|
+
uri,
|
|
116
|
+
readTime: Date.now() - startTime,
|
|
117
|
+
});
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get content for the agent list resource
|
|
123
|
+
*
|
|
124
|
+
* @private
|
|
125
|
+
* @returns Promise resolving to agent list content
|
|
126
|
+
*/
|
|
127
|
+
async getAgentListContent() {
|
|
128
|
+
if (!this.agentManager) {
|
|
129
|
+
return {
|
|
130
|
+
contents: [
|
|
131
|
+
{
|
|
132
|
+
type: 'text',
|
|
133
|
+
text: 'Agent manager not available. No agents can be listed.',
|
|
134
|
+
uri: 'agents://list',
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const agents = await this.agentManager.listAgents();
|
|
141
|
+
if (agents.length === 0) {
|
|
142
|
+
return {
|
|
143
|
+
contents: [
|
|
144
|
+
{
|
|
145
|
+
type: 'text',
|
|
146
|
+
text: 'No agents available. Check agent directory configuration.',
|
|
147
|
+
uri: 'agents://list',
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
let listText = `Available Claude Code Sub-Agents (${agents.length} total):\n\n`;
|
|
153
|
+
for (const agent of agents) {
|
|
154
|
+
listText += `## ${agent.name}\n`;
|
|
155
|
+
listText += `**Description:** ${agent.description}\n`;
|
|
156
|
+
listText += `**File:** ${agent.filePath}\n`;
|
|
157
|
+
listText += `**Last Modified:** ${agent.lastModified.toISOString()}\n`;
|
|
158
|
+
listText += `**Resource URI:** agents://${agent.name}\n\n`;
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
contents: [
|
|
162
|
+
{
|
|
163
|
+
type: 'text',
|
|
164
|
+
text: listText,
|
|
165
|
+
uri: 'agents://list',
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
return {
|
|
172
|
+
contents: [
|
|
173
|
+
{
|
|
174
|
+
type: 'text',
|
|
175
|
+
text: `Error loading agent list: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
176
|
+
uri: 'agents://list',
|
|
177
|
+
},
|
|
178
|
+
],
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get content for a specific agent resource
|
|
184
|
+
*
|
|
185
|
+
* @private
|
|
186
|
+
* @param agentName - Name of the agent to get content for
|
|
187
|
+
* @returns Promise resolving to agent content
|
|
188
|
+
*/
|
|
189
|
+
async getAgentContent(agentName) {
|
|
190
|
+
if (!this.agentManager) {
|
|
191
|
+
return {
|
|
192
|
+
contents: [
|
|
193
|
+
{
|
|
194
|
+
type: 'text',
|
|
195
|
+
text: 'Agent manager not available. Agent content cannot be retrieved.',
|
|
196
|
+
uri: `agents://${agentName}`,
|
|
197
|
+
},
|
|
198
|
+
],
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
const agent = await this.agentManager.getAgent(agentName);
|
|
203
|
+
if (!agent) {
|
|
204
|
+
const availableAgents = await this.getAvailableAgentNames();
|
|
205
|
+
let errorText = `Agent '${agentName}' not found.`;
|
|
206
|
+
if (availableAgents.length > 0) {
|
|
207
|
+
errorText += `\n\nAvailable agents:\n${availableAgents.map((name) => `- ${name}`).join('\n')}`;
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
contents: [
|
|
211
|
+
{
|
|
212
|
+
type: 'text',
|
|
213
|
+
text: errorText,
|
|
214
|
+
uri: `agents://${agentName}`,
|
|
215
|
+
},
|
|
216
|
+
],
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
contents: [
|
|
221
|
+
{
|
|
222
|
+
type: 'text',
|
|
223
|
+
text: this.formatAgentContent(agent),
|
|
224
|
+
uri: `agents://${agentName}`,
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
return {
|
|
231
|
+
contents: [
|
|
232
|
+
{
|
|
233
|
+
type: 'text',
|
|
234
|
+
text: `Error loading agent '${agentName}': ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
235
|
+
uri: `agents://${agentName}`,
|
|
236
|
+
},
|
|
237
|
+
],
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Format agent definition content for display
|
|
243
|
+
*
|
|
244
|
+
* @private
|
|
245
|
+
* @param agent - Agent definition to format
|
|
246
|
+
* @returns Formatted content string
|
|
247
|
+
*/
|
|
248
|
+
formatAgentContent(agent) {
|
|
249
|
+
let content = `# Agent: ${agent.name}\n\n`;
|
|
250
|
+
content += `**Description:** ${agent.description}\n`;
|
|
251
|
+
content += `**File Path:** ${agent.filePath}\n`;
|
|
252
|
+
content += `**Last Modified:** ${agent.lastModified.toISOString()}\n`;
|
|
253
|
+
content += `**Content Length:** ${agent.content.length} characters\n\n`;
|
|
254
|
+
content += '## Agent Definition\n\n';
|
|
255
|
+
content += agent.content;
|
|
256
|
+
return content;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get list of available agent names
|
|
260
|
+
*
|
|
261
|
+
* @private
|
|
262
|
+
* @returns Promise resolving to array of agent names
|
|
263
|
+
*/
|
|
264
|
+
async getAvailableAgentNames() {
|
|
265
|
+
if (!this.agentManager) {
|
|
266
|
+
return [];
|
|
267
|
+
}
|
|
268
|
+
try {
|
|
269
|
+
const agents = await this.agentManager.listAgents();
|
|
270
|
+
return agents.map((agent) => agent.name);
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
return [];
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Generate unique request ID for tracking
|
|
278
|
+
*
|
|
279
|
+
* @private
|
|
280
|
+
* @returns Unique request identifier
|
|
281
|
+
*/
|
|
282
|
+
generateRequestId() {
|
|
283
|
+
return `resource_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Check if a resource URI is valid with enhanced validation
|
|
287
|
+
*
|
|
288
|
+
* @param uri - Resource URI to validate
|
|
289
|
+
* @returns True if URI is valid
|
|
290
|
+
*/
|
|
291
|
+
isValidResourceUri(uri) {
|
|
292
|
+
if (!uri || typeof uri !== 'string') {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
if (uri === 'agents://list') {
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
const agentNameMatch = uri.match(/^agents:\/\/(.+)$/);
|
|
299
|
+
if (!agentNameMatch || !agentNameMatch[1]) {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
const agentName = agentNameMatch[1];
|
|
303
|
+
// Validate agent name format
|
|
304
|
+
if (agentName.length === 0 || agentName.length > 100) {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
// Check for valid characters (same as RunAgentTool validation)
|
|
308
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(agentName)) {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
exports.AgentResources = AgentResources;
|
|
315
|
+
//# sourceMappingURL=AgentResources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentResources.js","sourceRoot":"","sources":["../../src/resources/AgentResources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server implementation using @modelcontextprotocol/sdk
|
|
3
|
+
*
|
|
4
|
+
* Provides the foundational MCP server functionality with StdioServerTransport
|
|
5
|
+
* for stdin/stdout communication. This class serves as the entry point for
|
|
6
|
+
* the MCP server and handles basic server lifecycle operations.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const config = await ServerConfig.fromEnvironment()
|
|
11
|
+
* const server = new McpServer(config)
|
|
12
|
+
* await server.start()
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
import type { ServerConfig } from '../config/ServerConfig';
|
|
16
|
+
/**
|
|
17
|
+
* Server information interface for MCP server identification
|
|
18
|
+
*/
|
|
19
|
+
interface ServerInfo {
|
|
20
|
+
name: string;
|
|
21
|
+
version: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* MCP Server class providing foundational server functionality
|
|
25
|
+
*/
|
|
26
|
+
export declare class McpServer {
|
|
27
|
+
private server;
|
|
28
|
+
private transport;
|
|
29
|
+
private config;
|
|
30
|
+
private agentManager;
|
|
31
|
+
private agentExecutor;
|
|
32
|
+
private runAgentTool;
|
|
33
|
+
private agentResources;
|
|
34
|
+
/**
|
|
35
|
+
* Create a new MCP server instance
|
|
36
|
+
* @param config Server configuration object
|
|
37
|
+
* @throws {Error} When server name is empty
|
|
38
|
+
*/
|
|
39
|
+
constructor(config: ServerConfig);
|
|
40
|
+
/**
|
|
41
|
+
* Validate server configuration
|
|
42
|
+
* @param config Configuration to validate
|
|
43
|
+
* @throws {Error} When configuration is invalid
|
|
44
|
+
*/
|
|
45
|
+
private validateConfig;
|
|
46
|
+
/**
|
|
47
|
+
* Log message with structured format
|
|
48
|
+
* @param level Log level
|
|
49
|
+
* @param message Log message
|
|
50
|
+
* @param metadata Additional metadata
|
|
51
|
+
*/
|
|
52
|
+
private log;
|
|
53
|
+
/**
|
|
54
|
+
* Setup StdioServerTransport for MCP communication
|
|
55
|
+
*/
|
|
56
|
+
private setupTransport;
|
|
57
|
+
/**
|
|
58
|
+
* Setup MCP protocol handlers with performance monitoring
|
|
59
|
+
*/
|
|
60
|
+
private setupHandlers;
|
|
61
|
+
/**
|
|
62
|
+
* Get server information
|
|
63
|
+
* @returns Server name and version
|
|
64
|
+
*/
|
|
65
|
+
getServerInfo(): ServerInfo;
|
|
66
|
+
/**
|
|
67
|
+
* Check if transport is configured
|
|
68
|
+
* @returns True if transport is available
|
|
69
|
+
*/
|
|
70
|
+
hasTransport(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Check if server is ready to start
|
|
73
|
+
* @returns True if server is ready
|
|
74
|
+
*/
|
|
75
|
+
isReady(): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Start the MCP server
|
|
78
|
+
* @throws {Error} When server is not ready or transport setup fails
|
|
79
|
+
*/
|
|
80
|
+
start(): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* List available tools (for testing)
|
|
83
|
+
* @returns Promise resolving to array of tool definitions
|
|
84
|
+
*/
|
|
85
|
+
listTools(): Promise<Array<{
|
|
86
|
+
name: string;
|
|
87
|
+
description: string;
|
|
88
|
+
inputSchema: unknown;
|
|
89
|
+
}>>;
|
|
90
|
+
/**
|
|
91
|
+
* List available resources (for testing)
|
|
92
|
+
* @returns Promise resolving to array of resource definitions
|
|
93
|
+
*/
|
|
94
|
+
listResources(): Promise<Array<{
|
|
95
|
+
uri: string;
|
|
96
|
+
name: string;
|
|
97
|
+
description: string;
|
|
98
|
+
}>>;
|
|
99
|
+
/**
|
|
100
|
+
* Call a tool (for testing)
|
|
101
|
+
* @param toolName - Name of the tool to call
|
|
102
|
+
* @param params - Tool parameters
|
|
103
|
+
* @returns Promise resolving to tool response
|
|
104
|
+
*/
|
|
105
|
+
callTool(toolName: string, params: unknown): Promise<unknown>;
|
|
106
|
+
/**
|
|
107
|
+
* Read a resource (for testing)
|
|
108
|
+
* @param uri - Resource URI to read
|
|
109
|
+
* @returns Promise resolving to resource content
|
|
110
|
+
*/
|
|
111
|
+
readResource(uri: string): Promise<unknown>;
|
|
112
|
+
/**
|
|
113
|
+
* Get server performance statistics
|
|
114
|
+
*
|
|
115
|
+
* @returns Performance and usage statistics
|
|
116
|
+
*/
|
|
117
|
+
getServerStats(): {
|
|
118
|
+
serverInfo: {
|
|
119
|
+
name: string;
|
|
120
|
+
version: string;
|
|
121
|
+
};
|
|
122
|
+
executionStats: Map<string, {
|
|
123
|
+
count: number;
|
|
124
|
+
totalTime: number;
|
|
125
|
+
lastUsed: Date;
|
|
126
|
+
}>;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Reset statistics
|
|
130
|
+
*/
|
|
131
|
+
resetStats(): void;
|
|
132
|
+
/**
|
|
133
|
+
* Close the server and cleanup resources
|
|
134
|
+
*/
|
|
135
|
+
close(): Promise<void>;
|
|
136
|
+
}
|
|
137
|
+
export {};
|
|
138
|
+
//# sourceMappingURL=McpServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpServer.d.ts","sourceRoot":"","sources":["../../src/server/McpServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAeH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAO3D;;GAEG;AACH,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAOD;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,cAAc,CAAgB;IAEtC;;;;OAIG;gBACS,MAAM,EAAE,YAAY;IA+ChC;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAStB;;;;;OAKG;IACH,OAAO,CAAC,GAAG;IAqBX;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAuIrB;;;OAGG;IACH,aAAa,IAAI,UAAU;IAO3B;;;OAGG;IACH,YAAY,IAAI,OAAO;IAIvB;;;OAGG;IACH,OAAO,IAAI,OAAO;IAIlB;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B5B;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAU9F;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IASzF;;;;;OAKG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAOnE;;;;OAIG;IACG,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOjD;;;;OAIG;IACH,cAAc,IAAI;QAChB,UAAU,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAA;QAC7C,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,IAAI,CAAA;SAAE,CAAC,CAAA;KAClF;IAOD;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB7B"}
|