decolua/9router · error
Unknown local plugin: ${name}
Error message
Unknown local plugin: ${name} What it means
getOrSpawn resolves a local (stdio) MCP plugin by name from the plugin registry and spawns a child process bridge for it. If no plugin with that name is registered, it throws — the bridge cannot know what command to run.
Source
Thrown at src/lib/mcp/stdioSseBridge.js:115
} catch { return line; }
}
const getStore = () => {
if (!globalThis[G_KEY]) globalThis[G_KEY] = new Map();
return globalThis[G_KEY];
};
// Only preset stdio plugins may spawn. No user-defined commands (RCE prevention).
function findPlugin(name) {
return LOCAL_STDIO_PLUGINS.find((p) => p.name === name) || null;
}
function getOrSpawn(name) {
const store = getStore();
let entry = store.get(name);
if (entry?.proc && !entry.proc.killed && entry.proc.exitCode === null) return entry;
const plugin = findPlugin(name);
if (!plugin) throw new Error(`Unknown local plugin: ${name}`);
const proc = spawn(plugin.command, plugin.args, { stdio: ["pipe", "pipe", "pipe"], env: process.env });
entry = { proc, sessions: new Map(), buffer: "" };
store.set(name, entry);
// Parse newline-delimited JSON-RPC from child stdout, broadcast to all sessions.
proc.stdout.on("data", (chunk) => {
entry.buffer += chunk.toString("utf8");
let idx;
while ((idx = entry.buffer.indexOf("\n")) >= 0) {
const raw = entry.buffer.slice(0, idx).trim();
entry.buffer = entry.buffer.slice(idx + 1);
if (!raw) continue;
const line = filterFrame(raw);
for (const send of entry.sessions.values()) {
try { send(`event: message\ndata: ${line}\n\n`); } catch { /* ignore broken pipe */ }
}
}View on GitHub (pinned to 90b52e06ff)
Solutions
- Check the exact plugin name in your MCP client config against the names in the app's local plugin registry/config and fix the typo.
- Install or re-add the missing local plugin to the MCP configuration, then retry.
- If the server is remote (HTTP/SSE), connect to it directly instead of through the stdio bridge.
- Verify the config file the bridge loads actually contains the plugin (the registry may be loaded from a different profile/path).
Example fix
// before: mcp config references unknown plugin
{ "mcpServers": { "puppetter": { "command": "npx", "args": ["-y", "puppeteer"] } } }
// after: corrected name matching the registry
{ "mcpServers": { "puppeteer": { "command": "npx", "args": ["-y", "puppeteer"] } } } Defensive patterns
Strategy: validation
Validate before calling
const registry = listLocalPlugins(); // whatever the bridge exposes
if (!registry.some(p => p.name === requestedName)) {
return { error: `Local MCP plugin "${requestedName}" is not configured` };
}
const entry = getOrSpawn(requestedName); Try / catch
let entry;
try {
entry = getOrSpawn(name);
} catch (err) {
if (err.message.startsWith("Unknown local plugin:")) {
return res.status(404).json({ error: `Unknown MCP server "${name}"; check mcp config` });
}
throw err;
} Prevention
- Copy MCP server names from the config file rather than typing them.
- Keep client MCP config and the app's local plugin registry in sync after add/remove operations.
- Remember the bridge only handles local stdio plugins — remote SSE servers need a different connection path.
When it happens
Trigger: Requesting a stdio→SSE bridge via getOrSpawn/entry with a plugin name that is absent from the configured local plugin list (typo, plugin removed from config, plugin only defined as remote/HTTP, or config not loaded).
Common situations: Typo in the MCP server name in client config (e.g. "filesystems" vs "filesystem"); the plugin was uninstalled or removed from the MCP config but the client still references it; the plugin is a remote/SSE server, not a local stdio one, so findPlugin (local-only) never sees it.
Related errors
- Antigravity executor not found
- Invalid baseUrl: ${override}
- Google Programmable Search requires both apiKey and cx
- Linkup Search requires an API key
- SearchAPI requires an API key
AI-assisted analysis of decolua/9router@90b52e06ff (2026-08-30).
Data as JSON: /api/errors/6e55a2849949e81d.
Report an issue: GitHub.