{"record":{"id":"b20d3407ad28b622","repo":"ruvnet/ruflo","slug":"mcp-zero-tools-available-after-listing-skipping","errorCode":null,"errorMessage":"[mcp] zero tools available after listing; skipping MCP flow","messagePattern":"\\[mcp\\] zero tools available after listing; skipping MCP flow","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"ruflo/src/ruvocal/src/lib/server/textGeneration/mcp/runMcpFlow.ts","lineNumber":306,"sourceCode":"\t\tlogger.info(\n\t\t\t{ model: targetModel.id ?? targetModel.name, resolvedRoute },\n\t\t\t\"[mcp] runMcp=false (routing chose non-tools candidate)\"\n\t\t);\n\t\treturn \"not_applicable\";\n\t}\n\n\ttry {\n\t\tconst { tools: oaTools, mapping } = await getOpenAiToolsForMcp(servers, {\n\t\t\tsignal: abortSignal,\n\t\t});\n\t\ttry {\n\t\t\tlogger.info(\n\t\t\t\t{ toolCount: oaTools.length, toolNames: oaTools.map((t) => t.function.name) },\n\t\t\t\t\"[mcp] openai tool defs built\"\n\t\t\t);\n\t\t} catch {}\n\t\tif (oaTools.length === 0) {\n\t\t\tlogger.warn({}, \"[mcp] zero tools available after listing; skipping MCP flow\");\n\t\t\treturn \"not_applicable\";\n\t\t}\n\n\t\tconst { OpenAI } = await import(\"openai\");\n\n\t\t// Capture provider header (x-inference-provider) from the upstream OpenAI-compatible server.\n\t\tlet providerHeader: string | undefined;\n\t\tconst captureProviderFetch = async (\n\t\t\tinput: RequestInfo | URL,\n\t\t\tinit?: RequestInit\n\t\t): Promise<Response> => {\n\t\t\tconst res = await fetch(input, init);\n\t\t\tconst p = res.headers.get(\"x-inference-provider\");\n\t\t\tif (p && !providerHeader) providerHeader = p;\n\t\t\treturn res;\n\t\t};\n\n\t\tconst openai = new OpenAI({","sourceCodeStart":288,"sourceCodeEnd":324,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/ruflo/src/ruvocal/src/lib/server/textGeneration/mcp/runMcpFlow.ts#L288-L324","documentation":"Log warning in runMcpFlow: tool listing across the selected MCP servers returned zero usable tools, so there is nothing to advertise to the model and the MCP flow is skipped (not_applicable).","triggerScenarios":"Thrown at ruflo/src/ruvocal/src/lib/server/textGeneration/mcp/runMcpFlow.ts:306 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check that the MCP servers expose tools and the list operation succeeds; the MCP flow is skipped when no tools are available."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","contentChangedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}