Skip to content

Commit cc1aa49

Browse files
committed
refactor: Introduce ServerManager and related tools for improved MCP server management
1 parent 8779e99 commit cc1aa49

18 files changed

+684
-212
lines changed

index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ import { WebSocketConnector } from './src/connectors/websocket.js'
99
import { Logger, logger } from './src/logging.js'
1010
import { MCPSession } from './src/session.js'
1111

12+
export { BaseAdapter, LangChainAdapter } from './src/adapters/index.js'
13+
export { ServerManager } from './src/managers/server_manager.js'
14+
1215
export { BaseConnector, HttpConnector, loadConfigFile, Logger, logger, MCPAgent, MCPClient, MCPSession, StdioConnector, WebSocketConnector }

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
"registry": "https://registry.npmjs.org"
4545
},
4646
"scripts": {
47-
"build": "rm -rf dist && tsc && shx chmod +x dist/*.js",
47+
"build": "rm -rf dist && tsc",
4848
"watch": "tsc --watch",
4949
"start": "node dist/index.js",
5050
"prepublishOnly": "pnpm run build",
@@ -60,7 +60,9 @@
6060
"@langchain/core": "0.3.54",
6161
"@modelcontextprotocol/sdk": "1.11.0",
6262
"eventsource": "^3.0.6",
63+
"fastembed": "^1.14.4",
6364
"langchain": "^0.3.24",
65+
"lodash-es": "^4.17.21",
6466
"uuid": "^11.1.0",
6567
"winston": "^3.17.0",
6668
"ws": "^8.18.2",
@@ -69,6 +71,7 @@
6971
},
7072
"devDependencies": {
7173
"@antfu/eslint-config": "^4.13.0",
74+
"@types/lodash-es": "^4.17.12",
7275
"@types/ws": "^8.18.1",
7376
"eslint": "^9.26.0",
7477
"eslint-plugin-format": "^1.0.1",

pnpm-lock.yaml

Lines changed: 331 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/adapters/langchain_adapter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ export class LangChainAdapter extends BaseAdapter<StructuredToolInterface> {
102102
return parseMcpToolResult(result)
103103
}
104104
catch (err: any) {
105-
logger.error(`Error executing MCP tool: ${err}`)
105+
logger.error(`Error executing MCP tool: ${err.message}`)
106106
return `Error executing MCP tool: ${String(err)}`
107107
}
108108
},

src/agents/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
export { BaseAgent } from './base.js'
22
export { MCPAgent } from './mcp_agent.js'
3-
export { ServerManager } from './server_manager.js'

src/agents/mcp_agent.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import type { StructuredToolInterface, ToolInterface } from '@langchain/core/too
66
import type { AgentFinish, AgentStep } from 'langchain/agents'
77
import type { MCPClient } from '../client.js'
88
import type { BaseConnector } from '../connectors/base.js'
9+
import type { ServerManager } from '../managers/server_manager.js'
910
import type { MCPSession } from '../session.js'
10-
import type { ServerManager } from './server_manager.js'
1111
import {
1212
AIMessage,
1313
HumanMessage,
@@ -107,7 +107,7 @@ export class MCPAgent {
107107
await this.serverManager.initialize()
108108

109109
// Get server management tools
110-
const managementTools = await this.serverManager.getServerManagementTools()
110+
const managementTools = this.serverManager.tools
111111
this.tools = managementTools
112112
logger.info(
113113
`🔧 Server manager mode active with ${managementTools.length} management tools`,
@@ -302,7 +302,7 @@ export class MCPAgent {
302302

303303
for (let stepNum = 0; stepNum < steps; stepNum++) {
304304
if (this.useServerManager && this.serverManager) {
305-
const currentTools = await this.serverManager.getAllTools()
305+
const currentTools = this.serverManager.tools
306306
const currentToolNames = new Set(currentTools.map(t => t.name))
307307
const existingToolNames = new Set(this.tools.map(t => t.name))
308308

@@ -322,7 +322,7 @@ export class MCPAgent {
322322
}
323323
}
324324

325-
logger.info(`🔍 Step ${stepNum + 1}/${steps}`)
325+
logger.info(`👣 Step ${stepNum + 1}/${steps}`)
326326

327327
try {
328328
logger.debug('Starting agent step execution')

src/agents/server_manager.ts

Lines changed: 0 additions & 188 deletions
This file was deleted.

src/client.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,13 @@ export class MCPClient {
9595
return this.sessions
9696
}
9797

98-
public getSession(serverName: string): MCPSession {
98+
public getSession(serverName: string): MCPSession | null {
9999
const session = this.sessions[serverName]
100+
// if (!session) {
101+
// throw new Error(`No session exists for server '${serverName}'`)
102+
// }
100103
if (!session) {
101-
throw new Error(`No session exists for server '${serverName}'`)
104+
return null
102105
}
103106
return session
104107
}

src/logging.ts

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ interface LoggerOptions {
1111
level?: LogLevel
1212
console?: boolean
1313
file?: string
14+
format?: 'minimal' | 'detailed' | 'emoji'
1415
}
1516

1617
const DEFAULT_LOGGER_NAME = 'mcp-use'
@@ -26,12 +27,21 @@ function resolveLevel(env: string | undefined): LogLevel {
2627
}
2728
}
2829

29-
const defaultFormatter = printf(({ level, message, label, timestamp }) => {
30+
const minimalFormatter = printf(({ level, message, label, timestamp }) => {
31+
return `${timestamp} [${label}] ${level}: ${message}`
32+
})
33+
34+
const detailedFormatter = printf(({ level, message, label, timestamp }) => {
35+
return `${timestamp} [${label}] ${level.toUpperCase()}: ${message}`
36+
})
37+
38+
const emojiFormatter = printf(({ level, message, label, timestamp }) => {
3039
return `${timestamp} [${label}] ${level.toUpperCase()}: ${message}`
3140
})
3241

3342
export class Logger {
3443
private static instances: Record<string, WinstonLogger> = {}
44+
private static currentFormat: 'minimal' | 'detailed' | 'emoji' = 'minimal'
3545

3646
public static get(name: string = DEFAULT_LOGGER_NAME): WinstonLogger {
3747
if (!this.instances[name]) {
@@ -41,8 +51,8 @@ export class Logger {
4151
colorize(),
4252
splat(),
4353
label({ label: name }),
44-
timestamp(),
45-
defaultFormatter,
54+
timestamp({ format: 'HH:mm:ss' }),
55+
this.getFormatter(),
4656
),
4757
transports: [],
4858
})
@@ -51,10 +61,24 @@ export class Logger {
5161
return this.instances[name]
5262
}
5363

64+
private static getFormatter() {
65+
switch (this.currentFormat) {
66+
case 'minimal':
67+
return minimalFormatter
68+
case 'detailed':
69+
return detailedFormatter
70+
case 'emoji':
71+
return emojiFormatter
72+
default:
73+
return minimalFormatter
74+
}
75+
}
76+
5477
public static configure(options: LoggerOptions = {}): void {
55-
const { level, console = true, file } = options
78+
const { level, console = true, file, format = 'minimal' } = options
5679
const resolvedLevel = level ?? resolveLevel(process.env.DEBUG)
5780

81+
this.currentFormat = format
5882
const root = this.get()
5983

6084
root.level = resolvedLevel
@@ -72,6 +96,18 @@ export class Logger {
7296
}
7397
root.add(new transports.File({ filename: file }))
7498
}
99+
100+
// Update all existing loggers with new format
101+
Object.values(this.instances).forEach((logger) => {
102+
logger.level = resolvedLevel
103+
logger.format = combine(
104+
colorize(),
105+
splat(),
106+
label({ label: DEFAULT_LOGGER_NAME }),
107+
timestamp({ format: 'HH:mm:ss' }),
108+
this.getFormatter(),
109+
)
110+
})
75111
}
76112

77113
public static setDebug(enabled: boolean | 0 | 1 | 2): void {
@@ -87,6 +123,11 @@ export class Logger {
87123
})
88124
process.env.DEBUG = enabled ? (enabled === true ? '2' : String(enabled)) : '0'
89125
}
126+
127+
public static setFormat(format: 'minimal' | 'detailed' | 'emoji'): void {
128+
this.currentFormat = format
129+
this.configure({ format })
130+
}
90131
}
91132

92133
Logger.configure()

src/managers/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './server_manager.js'
2+
export * from './tools/index.js'

0 commit comments

Comments
 (0)