()
| 142 | |
| 143 | // mcp list (lines 4641–4688) |
| 144 | export async function mcpListHandler(): Promise<void> { |
| 145 | logEvent('tengu_mcp_list', {}); |
| 146 | const { |
| 147 | servers: configs |
| 148 | } = await getAllMcpConfigs(); |
| 149 | if (Object.keys(configs).length === 0) { |
| 150 | // biome-ignore lint/suspicious/noConsole:: intentional console output |
| 151 | console.log('No MCP servers configured. Use `claude mcp add` to add a server.'); |
| 152 | } else { |
| 153 | // biome-ignore lint/suspicious/noConsole:: intentional console output |
| 154 | console.log('Checking MCP server health...\n'); |
| 155 | |
| 156 | // Check servers concurrently |
| 157 | const entries = Object.entries(configs); |
| 158 | const results = await pMap(entries, async ([name, server]) => ({ |
| 159 | name, |
| 160 | server, |
| 161 | status: await checkMcpServerHealth(name, server) |
| 162 | }), { |
| 163 | concurrency: getMcpServerConnectionBatchSize() |
| 164 | }); |
| 165 | for (const { |
| 166 | name, |
| 167 | server, |
| 168 | status |
| 169 | } of results) { |
| 170 | // Intentionally excluding sse-ide servers here since they're internal |
| 171 | if (server.type === 'sse') { |
| 172 | // biome-ignore lint/suspicious/noConsole:: intentional console output |
| 173 | console.log(`${name}: ${server.url} (SSE) - ${status}`); |
| 174 | } else if (server.type === 'http') { |
| 175 | // biome-ignore lint/suspicious/noConsole:: intentional console output |
| 176 | console.log(`${name}: ${server.url} (HTTP) - ${status}`); |
| 177 | } else if (server.type === 'claudeai-proxy') { |
| 178 | // biome-ignore lint/suspicious/noConsole:: intentional console output |
| 179 | console.log(`${name}: ${server.url} - ${status}`); |
| 180 | } else if (!server.type || server.type === 'stdio') { |
| 181 | const args = Array.isArray(server.args) ? server.args : []; |
| 182 | // biome-ignore lint/suspicious/noConsole:: intentional console output |
| 183 | console.log(`${name}: ${server.command} ${args.join(' ')} - ${status}`); |
| 184 | } |
| 185 | } |
| 186 | } |
| 187 | // Use gracefulShutdown to properly clean up MCP server connections |
| 188 | // (process.exit bypasses cleanup handlers, leaving child processes orphaned) |
| 189 | await gracefulShutdown(0); |
| 190 | } |
| 191 | |
| 192 | // mcp get (lines 4694–4786) |
| 193 | export async function mcpGetHandler(name: string): Promise<void> { |
no test coverage detected