feat: Auto-detect transport type from config files

When launching the inspector with --config, automatically set the transport
dropdown and server URL based on the config file contents. This eliminates
the need to manually switch between stdio/sse/streamable-http in the UI.

- Use discriminated union for ServerConfig to properly type different transports
- Detect transport type and URL from config, pass via query params
- Maintain backwards compatibility for configs without explicit 'type' field
- Add comprehensive tests for the new functionality

Improves UX by making the config file the single source of truth for
server settings.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Felix Weinberger 2025-07-30 16:37:59 +01:00
commit acf6c1e118
No known key found for this signature in database

View file

@ -13,7 +13,14 @@ function delay(ms) {
return new Promise((resolve) => setTimeout(resolve, ms, true));
}
function getClientUrl(port, authDisabled, sessionToken, serverPort) {
function getClientUrl(
port,
authDisabled,
sessionToken,
serverPort,
transport,
serverUrl,
) {
const host = process.env.HOST || "localhost";
const baseUrl = `http://${host}:${port}`;
@ -24,6 +31,12 @@ function getClientUrl(port, authDisabled, sessionToken, serverPort) {
if (!authDisabled) {
params.set("MCP_PROXY_AUTH_TOKEN", sessionToken);
}
if (transport) {
params.set("transport", transport);
}
if (serverUrl) {
params.set("serverUrl", serverUrl);
}
return params.size > 0 ? `${baseUrl}/?${params.toString()}` : baseUrl;
}
@ -123,6 +136,8 @@ async function startDevClient(clientOptions) {
sessionToken,
abort,
cancelled,
transport,
serverUrl,
} = clientOptions;
const clientCommand = "npx";
const host = process.env.HOST || "localhost";
@ -140,6 +155,8 @@ async function startDevClient(clientOptions) {
authDisabled,
sessionToken,
SERVER_PORT,
transport,
serverUrl,
);
// Give vite time to start before opening or logging the URL
@ -173,6 +190,8 @@ async function startProdClient(clientOptions) {
sessionToken,
abort,
cancelled,
transport,
serverUrl,
} = clientOptions;
const inspectorClientPath = resolve(
__dirname,
@ -187,6 +206,8 @@ async function startProdClient(clientOptions) {
authDisabled,
sessionToken,
SERVER_PORT,
transport,
serverUrl,
);
await spawnPromise("node", [inspectorClientPath], {
@ -208,6 +229,8 @@ async function main() {
let command = null;
let parsingFlags = true;
let isDev = false;
let transport = null;
let serverUrl = null;
for (let i = 0; i < args.length; i++) {
const arg = args[i];
@ -233,6 +256,10 @@ async function main() {
} else {
envVars[envVar] = "";
}
} else if (parsingFlags && arg === "--transport" && i + 1 < args.length) {
transport = args[++i];
} else if (parsingFlags && arg === "--server-url" && i + 1 < args.length) {
serverUrl = args[++i];
} else if (!command && !isDev) {
command = arg;
} else if (!isDev) {
@ -292,6 +319,8 @@ async function main() {
sessionToken,
abort,
cancelled,
transport,
serverUrl,
};
await (isDev