mcp-use 0.2.0 → 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 (97) hide show
  1. package/dist/chunk-2HFIPY7C.js +429 -0
  2. package/dist/chunk-4DEFXVWT.js +680 -0
  3. package/dist/chunk-JXLQRAW2.js +532 -0
  4. package/dist/chunk-SHUYVCID.js +6 -0
  5. package/dist/chunk-YUSC6R6V.js +299 -0
  6. package/dist/index.cjs +5762 -0
  7. package/dist/index.d.ts +7 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +3767 -22
  10. package/dist/langfuse-YA2S23SM.js +13 -0
  11. package/dist/src/agents/remote.d.ts.map +1 -1
  12. package/dist/src/agents/utils/ai_sdk.d.ts.map +1 -1
  13. package/dist/src/auth/browser-provider.d.ts +52 -0
  14. package/dist/src/auth/browser-provider.d.ts.map +1 -0
  15. package/dist/src/auth/callback.d.ts +6 -0
  16. package/dist/src/auth/callback.d.ts.map +1 -0
  17. package/dist/src/auth/index.d.ts +7 -0
  18. package/dist/src/auth/index.d.ts.map +1 -0
  19. package/dist/src/auth/types.d.ts +18 -0
  20. package/dist/src/auth/types.d.ts.map +1 -0
  21. package/dist/src/browser.cjs +323 -0
  22. package/dist/src/browser.d.ts +5 -46
  23. package/dist/src/browser.d.ts.map +1 -1
  24. package/dist/src/browser.js +9 -75
  25. package/dist/src/oauth-helper.d.ts +2 -12
  26. package/dist/src/oauth-helper.d.ts.map +1 -1
  27. package/dist/src/react/index.cjs +986 -0
  28. package/dist/src/react/index.d.ts +9 -0
  29. package/dist/src/react/index.d.ts.map +1 -0
  30. package/dist/src/react/index.js +11 -0
  31. package/dist/src/react/types.d.ts +139 -0
  32. package/dist/src/react/types.d.ts.map +1 -0
  33. package/dist/src/react/useMcp.d.ts +3 -0
  34. package/dist/src/react/useMcp.d.ts.map +1 -0
  35. package/dist/src/server/index.cjs +566 -0
  36. package/dist/src/server/index.d.ts +3 -0
  37. package/dist/src/server/index.d.ts.map +1 -0
  38. package/dist/src/server/index.js +9 -0
  39. package/dist/src/server/logging.d.ts +16 -0
  40. package/dist/src/server/logging.d.ts.map +1 -0
  41. package/dist/src/server/mcp-server.d.ts +282 -0
  42. package/dist/src/server/mcp-server.d.ts.map +1 -0
  43. package/dist/src/server/types.d.ts +47 -0
  44. package/dist/src/server/types.d.ts.map +1 -0
  45. package/dist/src/utils/assert.d.ts +8 -0
  46. package/dist/src/utils/assert.d.ts.map +1 -0
  47. package/dist/tsconfig.tsbuildinfo +1 -0
  48. package/package.json +67 -40
  49. package/dist/src/adapters/base.js +0 -124
  50. package/dist/src/adapters/index.js +0 -2
  51. package/dist/src/adapters/langchain_adapter.js +0 -49
  52. package/dist/src/agents/base.js +0 -9
  53. package/dist/src/agents/index.js +0 -3
  54. package/dist/src/agents/mcp_agent.js +0 -1002
  55. package/dist/src/agents/prompts/system_prompt_builder.js +0 -40
  56. package/dist/src/agents/prompts/templates.js +0 -39
  57. package/dist/src/agents/remote.js +0 -264
  58. package/dist/src/agents/utils/ai_sdk.js +0 -62
  59. package/dist/src/agents/utils/index.js +0 -1
  60. package/dist/src/client/base.js +0 -119
  61. package/dist/src/client.js +0 -50
  62. package/dist/src/config.js +0 -34
  63. package/dist/src/connectors/base.js +0 -143
  64. package/dist/src/connectors/http.js +0 -150
  65. package/dist/src/connectors/index.js +0 -4
  66. package/dist/src/connectors/stdio.js +0 -68
  67. package/dist/src/connectors/websocket.js +0 -157
  68. package/dist/src/logging.js +0 -232
  69. package/dist/src/managers/index.js +0 -2
  70. package/dist/src/managers/server_manager.js +0 -106
  71. package/dist/src/managers/tools/acquire_active_mcp_server.js +0 -17
  72. package/dist/src/managers/tools/add_server_from_config.js +0 -40
  73. package/dist/src/managers/tools/base.js +0 -17
  74. package/dist/src/managers/tools/connect_mcp_server.js +0 -46
  75. package/dist/src/managers/tools/index.js +0 -5
  76. package/dist/src/managers/tools/list_mcp_servers.js +0 -33
  77. package/dist/src/managers/tools/release_mcp_server_connection.js +0 -19
  78. package/dist/src/oauth-helper.js +0 -427
  79. package/dist/src/observability/index.js +0 -12
  80. package/dist/src/observability/langfuse.js +0 -211
  81. package/dist/src/observability/manager.js +0 -199
  82. package/dist/src/observability/types.js +0 -4
  83. package/dist/src/session.js +0 -23
  84. package/dist/src/task_managers/base.js +0 -127
  85. package/dist/src/task_managers/index.js +0 -5
  86. package/dist/src/task_managers/sse.js +0 -43
  87. package/dist/src/task_managers/stdio.js +0 -51
  88. package/dist/src/task_managers/streamable_http.js +0 -50
  89. package/dist/src/task_managers/websocket.js +0 -67
  90. package/dist/src/telemetry/events.js +0 -44
  91. package/dist/src/telemetry/index.js +0 -8
  92. package/dist/src/telemetry/telemetry.js +0 -324
  93. package/dist/src/telemetry/utils.js +0 -39
  94. package/dist/tests/ai_sdk_compatibility.test.js +0 -214
  95. package/dist/tests/stream_events.test.js +0 -307
  96. package/dist/tests/stream_events_simple.test.js +0 -179
  97. package/dist/vitest.config.js +0 -21
@@ -1,232 +0,0 @@
1
- import { createLogger, format, transports } from 'winston';
2
- // Conditional imports for Node.js-only modules
3
- async function getNodeModules() {
4
- if (typeof process !== 'undefined' && process.platform) {
5
- try {
6
- // Use dynamic imports for Node.js environments
7
- const fs = await import('node:fs');
8
- const path = await import('node:path');
9
- return { fs: fs.default, path: path.default };
10
- }
11
- catch {
12
- return { fs: null, path: null };
13
- }
14
- }
15
- return { fs: null, path: null };
16
- }
17
- const { combine, timestamp, label, printf, colorize, splat } = format;
18
- const DEFAULT_LOGGER_NAME = 'mcp-use';
19
- // Environment detection function (similar to telemetry)
20
- function isNodeJSEnvironment() {
21
- try {
22
- // Check for Cloudflare Workers specifically
23
- if (typeof navigator !== 'undefined' && navigator.userAgent?.includes('Cloudflare-Workers')) {
24
- return false;
25
- }
26
- // Check for other edge runtime indicators
27
- if (typeof globalThis.EdgeRuntime !== 'undefined' || typeof globalThis.Deno !== 'undefined') {
28
- return false;
29
- }
30
- // Check for Node.js specific globals that are not available in edge environments
31
- const hasNodeGlobals = (typeof process !== 'undefined'
32
- && typeof process.platform !== 'undefined'
33
- && typeof __dirname !== 'undefined');
34
- // Check for Node.js modules
35
- const hasNodeModules = (typeof createLogger === 'function');
36
- return hasNodeGlobals && hasNodeModules;
37
- }
38
- catch {
39
- return false;
40
- }
41
- }
42
- // Simple console logger for non-Node.js environments
43
- class SimpleConsoleLogger {
44
- _level;
45
- name;
46
- constructor(name = DEFAULT_LOGGER_NAME, level = 'info') {
47
- this.name = name;
48
- this._level = level;
49
- }
50
- shouldLog(level) {
51
- const levels = ['error', 'warn', 'info', 'http', 'verbose', 'debug', 'silly'];
52
- const currentIndex = levels.indexOf(this._level);
53
- const messageIndex = levels.indexOf(level);
54
- return messageIndex <= currentIndex;
55
- }
56
- formatMessage(level, message) {
57
- const timestamp = new Date().toLocaleTimeString('en-US', { hour12: false });
58
- return `${timestamp} [${this.name}] ${level}: ${message}`;
59
- }
60
- error(message) {
61
- if (this.shouldLog('error')) {
62
- console.error(this.formatMessage('error', message));
63
- }
64
- }
65
- warn(message) {
66
- if (this.shouldLog('warn')) {
67
- console.warn(this.formatMessage('warn', message));
68
- }
69
- }
70
- info(message) {
71
- if (this.shouldLog('info')) {
72
- console.info(this.formatMessage('info', message));
73
- }
74
- }
75
- debug(message) {
76
- if (this.shouldLog('debug')) {
77
- console.debug(this.formatMessage('debug', message));
78
- }
79
- }
80
- http(message) {
81
- if (this.shouldLog('http')) {
82
- console.log(this.formatMessage('http', message));
83
- }
84
- }
85
- verbose(message) {
86
- if (this.shouldLog('verbose')) {
87
- console.log(this.formatMessage('verbose', message));
88
- }
89
- }
90
- silly(message) {
91
- if (this.shouldLog('silly')) {
92
- console.log(this.formatMessage('silly', message));
93
- }
94
- }
95
- // Make it compatible with Winston interface
96
- get level() {
97
- return this._level;
98
- }
99
- set level(newLevel) {
100
- this._level = newLevel;
101
- }
102
- }
103
- function resolveLevel(env) {
104
- // Safely access environment variables
105
- const envValue = (typeof process !== 'undefined' && process.env) ? env : undefined;
106
- switch (envValue?.trim()) {
107
- case '2':
108
- return 'debug';
109
- case '1':
110
- return 'info';
111
- default:
112
- return 'info';
113
- }
114
- }
115
- const minimalFormatter = printf(({ level, message, label, timestamp }) => {
116
- return `${timestamp} [${label}] ${level}: ${message}`;
117
- });
118
- const detailedFormatter = printf(({ level, message, label, timestamp }) => {
119
- return `${timestamp} [${label}] ${level.toUpperCase()}: ${message}`;
120
- });
121
- const emojiFormatter = printf(({ level, message, label, timestamp }) => {
122
- return `${timestamp} [${label}] ${level.toUpperCase()}: ${message}`;
123
- });
124
- export class Logger {
125
- static instances = {};
126
- static simpleInstances = {};
127
- static currentFormat = 'minimal';
128
- static get(name = DEFAULT_LOGGER_NAME) {
129
- // Use simple console logger in non-Node.js environments
130
- if (!isNodeJSEnvironment()) {
131
- if (!this.simpleInstances[name]) {
132
- const debugEnv = (typeof process !== 'undefined' && process.env?.DEBUG) || undefined;
133
- this.simpleInstances[name] = new SimpleConsoleLogger(name, resolveLevel(debugEnv));
134
- }
135
- return this.simpleInstances[name];
136
- }
137
- // Use Winston logger in Node.js environments
138
- if (!this.instances[name]) {
139
- this.instances[name] = createLogger({
140
- level: resolveLevel(process.env.DEBUG),
141
- format: combine(colorize(), splat(), label({ label: name }), timestamp({ format: 'HH:mm:ss' }), this.getFormatter()),
142
- transports: [],
143
- });
144
- }
145
- return this.instances[name];
146
- }
147
- static getFormatter() {
148
- switch (this.currentFormat) {
149
- case 'minimal':
150
- return minimalFormatter;
151
- case 'detailed':
152
- return detailedFormatter;
153
- case 'emoji':
154
- return emojiFormatter;
155
- default:
156
- return minimalFormatter;
157
- }
158
- }
159
- static async configure(options = {}) {
160
- const { level, console = true, file, format = 'minimal' } = options;
161
- const debugEnv = (typeof process !== 'undefined' && process.env?.DEBUG) || undefined;
162
- const resolvedLevel = level ?? resolveLevel(debugEnv);
163
- this.currentFormat = format;
164
- const root = this.get();
165
- root.level = resolvedLevel;
166
- // Winston-specific configuration for Node.js environments
167
- const winstonRoot = root;
168
- // For non-Node.js environments, just update the level
169
- if (!isNodeJSEnvironment()) {
170
- Object.values(this.simpleInstances).forEach((logger) => {
171
- logger.level = resolvedLevel;
172
- });
173
- return;
174
- }
175
- winstonRoot.clear();
176
- if (console) {
177
- winstonRoot.add(new transports.Console());
178
- }
179
- if (file) {
180
- const { fs: nodeFs, path: nodePath } = await getNodeModules();
181
- if (nodeFs && nodePath) {
182
- const dir = nodePath.dirname(nodePath.resolve(file));
183
- if (!nodeFs.existsSync(dir)) {
184
- nodeFs.mkdirSync(dir, { recursive: true });
185
- }
186
- winstonRoot.add(new transports.File({ filename: file }));
187
- }
188
- }
189
- // Update all existing Winston loggers with new format
190
- Object.values(this.instances).forEach((logger) => {
191
- if (logger && 'format' in logger) {
192
- logger.level = resolvedLevel;
193
- logger.format = combine(colorize(), splat(), label({ label: DEFAULT_LOGGER_NAME }), timestamp({ format: 'HH:mm:ss' }), this.getFormatter());
194
- }
195
- });
196
- }
197
- static setDebug(enabled) {
198
- let level;
199
- if (enabled === 2 || enabled === true)
200
- level = 'debug';
201
- else if (enabled === 1)
202
- level = 'info';
203
- else
204
- level = 'info';
205
- // Update both simple and Winston loggers
206
- Object.values(this.simpleInstances).forEach((logger) => {
207
- logger.level = level;
208
- });
209
- Object.values(this.instances).forEach((logger) => {
210
- if (logger) {
211
- logger.level = level;
212
- }
213
- });
214
- // Safely set environment variable
215
- if (typeof process !== 'undefined' && process.env) {
216
- process.env.DEBUG = enabled ? (enabled === true ? '2' : String(enabled)) : '0';
217
- }
218
- }
219
- static setFormat(format) {
220
- this.currentFormat = format;
221
- this.configure({ format });
222
- }
223
- }
224
- // Only configure Winston features if in Node.js environment
225
- if (isNodeJSEnvironment()) {
226
- Logger.configure();
227
- }
228
- else {
229
- // For non-Node.js environments, just initialize with defaults
230
- Logger.configure({ console: true });
231
- }
232
- export const logger = Logger.get();
@@ -1,2 +0,0 @@
1
- export * from './server_manager.js';
2
- export * from './tools/index.js';
@@ -1,106 +0,0 @@
1
- import { isEqual } from 'lodash-es';
2
- import { logger } from '../logging.js';
3
- import { AcquireActiveMCPServerTool } from './tools/acquire_active_mcp_server.js';
4
- import { AddMCPServerFromConfigTool } from './tools/add_server_from_config.js';
5
- import { ConnectMCPServerTool } from './tools/connect_mcp_server.js';
6
- import { ListMCPServersTool } from './tools/list_mcp_servers.js';
7
- import { ReleaseMCPServerConnectionTool } from './tools/release_mcp_server_connection.js';
8
- export class ServerManager {
9
- initializedServers = {};
10
- serverTools = {};
11
- client;
12
- adapter;
13
- activeServer = null;
14
- overrideManagementTools;
15
- constructor(client, adapter, managementTools) {
16
- this.client = client;
17
- this.adapter = adapter;
18
- this.overrideManagementTools = managementTools;
19
- }
20
- setManagementTools(tools) {
21
- this.overrideManagementTools = tools;
22
- logger.info(`Overriding default management tools with a new set of ${tools.length} tools.`);
23
- }
24
- logState(context) {
25
- const allServerNames = this.client.getServerNames();
26
- const activeSessionNames = Object.keys(this.client.getAllActiveSessions());
27
- if (allServerNames.length === 0) {
28
- logger.info('Server Manager State: No servers configured.');
29
- return;
30
- }
31
- const tableData = allServerNames.map(name => ({
32
- 'Server Name': name,
33
- 'Connected': activeSessionNames.includes(name) ? '✅' : '❌',
34
- 'Initialized': this.initializedServers[name] ? '✅' : '❌',
35
- 'Tool Count': this.serverTools[name]?.length ?? 0,
36
- 'Active': this.activeServer === name ? '✅' : '❌',
37
- }));
38
- logger.info(`Server Manager State: [${context}]`);
39
- console.table(tableData);
40
- }
41
- initialize() {
42
- const serverNames = this.client.getServerNames?.();
43
- if (serverNames.length === 0) {
44
- logger.warn('No MCP servers defined in client configuration');
45
- }
46
- }
47
- async prefetchServerTools() {
48
- const servers = this.client.getServerNames();
49
- for (const serverName of servers) {
50
- try {
51
- let session = null;
52
- session = this.client.getSession(serverName);
53
- logger.debug(`Using existing session for server '${serverName}' to prefetch tools.`);
54
- if (!session) {
55
- session = await this.client.createSession(serverName).catch((createSessionError) => {
56
- logger.warn(`Could not create session for '${serverName}' during prefetch: ${createSessionError}`);
57
- return null;
58
- });
59
- logger.debug(`Temporarily created session for '${serverName}' to prefetch tools.`);
60
- }
61
- if (session) {
62
- const connector = session.connector;
63
- let tools = [];
64
- try {
65
- tools = await this.adapter.createToolsFromConnectors([connector]);
66
- }
67
- catch (toolFetchError) {
68
- logger.error(`Failed to create tools from connector for server '${serverName}': ${toolFetchError}`);
69
- continue;
70
- }
71
- const cachedTools = this.serverTools[serverName];
72
- const toolsChanged = !cachedTools || !isEqual(cachedTools, tools);
73
- if (toolsChanged) {
74
- this.serverTools[serverName] = tools;
75
- this.initializedServers[serverName] = true;
76
- logger.debug(`Prefetched ${tools.length} tools for server '${serverName}'.`);
77
- }
78
- else {
79
- logger.debug(`Tools for server '${serverName}' unchanged, using cached version.`);
80
- }
81
- }
82
- }
83
- catch (outerError) {
84
- logger.error(`Error prefetching tools for server '${serverName}': ${outerError}`);
85
- }
86
- }
87
- }
88
- get tools() {
89
- if (logger.level === 'debug') {
90
- this.logState('Providing tools to agent');
91
- }
92
- const managementTools = this.overrideManagementTools ?? [
93
- new AddMCPServerFromConfigTool(this),
94
- new ListMCPServersTool(this),
95
- new ConnectMCPServerTool(this),
96
- new AcquireActiveMCPServerTool(this),
97
- new ReleaseMCPServerConnectionTool(this),
98
- ];
99
- if (this.activeServer && this.serverTools[this.activeServer]) {
100
- const activeTools = this.serverTools[this.activeServer];
101
- logger.debug(`Adding ${activeTools.length} tools from active server '${this.activeServer}'`);
102
- return [...managementTools, ...activeTools];
103
- }
104
- return managementTools;
105
- }
106
- }
@@ -1,17 +0,0 @@
1
- import { z } from 'zod';
2
- import { MCPServerTool } from './base.js';
3
- const PresentActiveServerSchema = z.object({});
4
- export class AcquireActiveMCPServerTool extends MCPServerTool {
5
- name = 'get_active_mcp_server';
6
- description = 'Get the currently active MCP (Model Context Protocol) server';
7
- schema = PresentActiveServerSchema;
8
- constructor(manager) {
9
- super(manager);
10
- }
11
- async _call() {
12
- if (!this.manager.activeServer) {
13
- return `No MCP server is currently active. Use connect_to_mcp_server to connect to a server.`;
14
- }
15
- return `Currently active MCP server: ${this.manager.activeServer}`;
16
- }
17
- }
@@ -1,40 +0,0 @@
1
- import { StructuredTool } from 'langchain/tools';
2
- import { z } from 'zod';
3
- import { logger } from '../../logging.js';
4
- export class AddMCPServerFromConfigTool extends StructuredTool {
5
- name = 'add_mcp_server_from_config';
6
- description = 'Adds a new MCP server to the client from a configuration object and connects to it, making its tools available.';
7
- schema = z.object({
8
- serverName: z.string().describe('The name for the new MCP server.'),
9
- serverConfig: z
10
- .any()
11
- .describe('The configuration object for the server. This should not include the top-level "mcpServers" key.'),
12
- });
13
- manager;
14
- constructor(manager) {
15
- super();
16
- this.manager = manager;
17
- }
18
- async _call({ serverName, serverConfig, }) {
19
- try {
20
- this.manager.client.addServer(serverName, serverConfig);
21
- let result = `Server '${serverName}' added to the client.`;
22
- logger.debug(`Connecting to new server '${serverName}' and discovering tools.`);
23
- const session = await this.manager.client.createSession(serverName);
24
- const connector = session.connector;
25
- const tools = await this.manager.adapter.createToolsFromConnectors([connector]);
26
- this.manager.serverTools[serverName] = tools;
27
- this.manager.initializedServers[serverName] = true;
28
- this.manager.activeServer = serverName; // Set as active server
29
- const numTools = tools.length;
30
- result += ` Session created and connected. '${serverName}' is now the active server with ${numTools} tools available.`;
31
- result += `\n\n${tools.map(t => t.name).join('\n')}`;
32
- logger.info(result);
33
- return result;
34
- }
35
- catch (e) {
36
- logger.error(`Failed to add or connect to server '${serverName}': ${e.message}`);
37
- return `Failed to add or connect to server '${serverName}': ${e.message}`;
38
- }
39
- }
40
- }
@@ -1,17 +0,0 @@
1
- import { StructuredTool } from '@langchain/core/tools';
2
- export class MCPServerTool extends StructuredTool {
3
- name = 'mcp_server_tool';
4
- description = 'Base tool for MCP server operations.';
5
- schema;
6
- _manager;
7
- constructor(manager) {
8
- super();
9
- this._manager = manager;
10
- }
11
- async _call(_arg, _runManager, _parentConfig) {
12
- throw new Error('Method not implemented.');
13
- }
14
- get manager() {
15
- return this._manager;
16
- }
17
- }
@@ -1,46 +0,0 @@
1
- import { z } from 'zod';
2
- import { logger } from '../../logging.js';
3
- import { MCPServerTool } from './base.js';
4
- const ConnectMCPServerSchema = z.object({
5
- serverName: z.string().describe('The name of the MCP server.'),
6
- });
7
- export class ConnectMCPServerTool extends MCPServerTool {
8
- name = 'connect_to_mcp_server';
9
- description = 'Connect to a specific MCP (Model Context Protocol) server to use its tools. Use this tool to connect to a specific server and use its tools.';
10
- schema = ConnectMCPServerSchema;
11
- constructor(manager) {
12
- super(manager);
13
- }
14
- async _call({ serverName }) {
15
- const serverNames = this.manager.client.getServerNames();
16
- if (!serverNames.includes(serverName)) {
17
- const available = serverNames.length > 0 ? serverNames.join(', ') : 'none';
18
- return `Server '${serverName}' not found. Available servers: ${available}`;
19
- }
20
- if (this.manager.activeServer === serverName) {
21
- return `Already connected to MCP server '${serverName}'`;
22
- }
23
- try {
24
- let session = this.manager.client.getSession(serverName);
25
- logger.debug(`Using existing session for server '${serverName}'`);
26
- if (!session) {
27
- logger.debug(`Creating new session for server '${serverName}'`);
28
- session = await this.manager.client.createSession(serverName);
29
- }
30
- this.manager.activeServer = serverName;
31
- if (this.manager.serverTools[serverName]) {
32
- const connector = session.connector;
33
- const tools = await this.manager.adapter.createToolsFromConnectors([connector]);
34
- this.manager.serverTools[serverName] = tools;
35
- this.manager.initializedServers[serverName] = true;
36
- }
37
- const serverTools = this.manager.serverTools[serverName] || [];
38
- const numTools = serverTools.length;
39
- return `Connected to MCP server '${serverName}'. ${numTools} tools are now available.`;
40
- }
41
- catch (error) {
42
- logger.error(`Error connecting to server '${serverName}': ${String(error)}`);
43
- return `Failed to connect to server '${serverName}': ${String(error)}`;
44
- }
45
- }
46
- }
@@ -1,5 +0,0 @@
1
- export * from './acquire_active_mcp_server.js';
2
- export * from './add_server_from_config.js';
3
- export * from './connect_mcp_server.js';
4
- export * from './list_mcp_servers.js';
5
- export * from './release_mcp_server_connection.js';
@@ -1,33 +0,0 @@
1
- import { z } from 'zod';
2
- import { logger } from '../../logging.js';
3
- import { MCPServerTool } from './base.js';
4
- const EnumerateServersSchema = z.object({});
5
- export class ListMCPServersTool extends MCPServerTool {
6
- name = 'list_mcp_servers';
7
- description = `Lists all available MCP (Model Context Protocol) servers that can be connected to, along with the tools available on each server. Use this tool to discover servers and see what functionalities they offer.`;
8
- schema = EnumerateServersSchema;
9
- constructor(manager) {
10
- super(manager);
11
- }
12
- async _call() {
13
- const serverNames = this.manager.client.getServerNames();
14
- if (serverNames.length === 0) {
15
- return `No MCP servers are currently defined.`;
16
- }
17
- const outputLines = ['Available MCP servers:'];
18
- for (const serverName of serverNames) {
19
- const isActiveServer = serverName === this.manager.activeServer;
20
- const activeFlag = isActiveServer ? ' (ACTIVE)' : '';
21
- outputLines.push(`- ${serverName}${activeFlag}`);
22
- try {
23
- const serverTools = this.manager.serverTools?.[serverName] ?? [];
24
- const numberOfTools = Array.isArray(serverTools) ? serverTools.length : 0;
25
- outputLines.push(`${numberOfTools} tools available for this server\n`);
26
- }
27
- catch (error) {
28
- logger.error(`Unexpected error listing tools for server '${serverName}': ${String(error)}`);
29
- }
30
- }
31
- return outputLines.join('\n');
32
- }
33
- }
@@ -1,19 +0,0 @@
1
- import { z } from 'zod';
2
- import { MCPServerTool } from './base.js';
3
- const ReleaseConnectionSchema = z.object({});
4
- export class ReleaseMCPServerConnectionTool extends MCPServerTool {
5
- name = 'disconnect_from_mcp_server';
6
- description = 'Disconnect from the currently active MCP (Model Context Protocol) server';
7
- schema = ReleaseConnectionSchema;
8
- constructor(manager) {
9
- super(manager);
10
- }
11
- async _call() {
12
- if (!this.manager.activeServer) {
13
- return `No MCP server is currently active, so there's nothing to disconnect from.`;
14
- }
15
- const serverName = this.manager.activeServer;
16
- this.manager.activeServer = null;
17
- return `Successfully disconnected from MCP server '${serverName}'.`;
18
- }
19
- }