{"record":{"id":"9de0e1ac06b1a11f","repo":"ruvnet/ruflo","slug":"pod-template-at-path-allowedmcptools-entries-m","errorCode":null,"errorMessage":"pod-template at ${path}: allowedMcpTools entries must be non-empty strings","messagePattern":"pod-template at (.+?): allowedMcpTools entries must be non-empty strings","errorType":"validation","errorClass":"PodTemplateValidationError","httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/cli/src/business-pods/pod-schema.ts","lineNumber":209,"sourceCode":"  const name = requireString(json, 'name', '/');\n  if (!/^[a-z][a-z0-9-]*$/.test(name)) {\n    throw new PodTemplateValidationError('name must be lowercase-kebab (e.g. \"sales\")', '/');\n  }\n  const displayName = requireString(json, 'displayName', '/');\n  const roomId = requireString(json, 'roomId', '/');\n  if (!/^[A-Za-z0-9_.\\-:/@#]+$/.test(roomId)) {\n    throw new PodTemplateValidationError(\n      'roomId may only contain [A-Za-z0-9_.\\\\-:/@#]',\n      '/',\n    );\n  }\n  const agents = requireArray(json, 'agents', '/', validatePodAgent);\n  if (agents.length === 0) {\n    throw new PodTemplateValidationError('agents must have ≥1 entry', '/');\n  }\n  const allowedMcpTools = requireArray(json, 'allowedMcpTools', '/', (t, tp) => {\n    if (typeof t !== 'string' || t.length === 0) {\n      throw new PodTemplateValidationError(\n        'allowedMcpTools entries must be non-empty strings',\n        tp,\n      );\n    }\n    return t;\n  });\n  if (allowedMcpTools.length === 0) {\n    throw new PodTemplateValidationError('allowedMcpTools must have ≥1 entry', '/');\n  }\n  const bench = validatePodBench(json.bench, '/bench');\n  const piiPolicy = requireString(json, 'piiPolicy', '/');\n  if (!PII_POLICIES.includes(piiPolicy as PiiPolicy)) {\n    throw new PodTemplateValidationError(\n      `piiPolicy must be one of: ${PII_POLICIES.join(', ')}`,\n      '/',\n    );\n  }\n  const budgetUsdMonthly = requireNumber(json, 'budgetUsdMonthly', '/');","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/ruvnet/ruflo/blob/6b01dc5a687b26b3e218f796de45ec51f8fa9e8c/v3/@claude-flow/cli/src/business-pods/pod-schema.ts#L191-L227","documentation":"Thrown inside the allowedMcpTools array item validator when an individual entry is not a non-empty string. Each entry in allowedMcpTools is an MCP tool name that the pod's agents may invoke, so it must be a meaningful string identifier.","triggerScenarios":"The allowedMcpTools array contains a non-string element (number, boolean, null, object) or an empty string. The error path (tp) points to the specific array index, e.g. /allowedMcpTools[2].","commonSituations":"A tool name was left as an empty string placeholder; a YAML converter produced a null entry; a trailing comma in a JSON5 source produced an undefined/null element.","solutions":["Replace the offending entry with a non-empty MCP tool name string (e.g. 'memory_search', 'swarm_init')","Remove null or empty entries from the allowedMcpTools array","Check the JSON-pointer path in the error to find the exact array index"],"exampleFix":"// before\n{ \"allowedMcpTools\": [\"memory_search\", \"\", \"swarm_init\"] }\n\n// after\n{ \"allowedMcpTools\": [\"memory_search\", \"swarm_init\"] }","handlingStrategy":"validation","validationCode":"function areValidMcpToolEntries(tools: unknown[]): boolean {\n  return tools.every(t => typeof t === 'string' && t.length > 0);\n}\n\nif (!areValidMcpToolEntries(template.allowedMcpTools)) {\n  throw new Error('allowedMcpTools entries must be non-empty strings');\n}","typeGuard":"function isNonEmptyStringArray(arr: unknown): arr is string[] {\n  return Array.isArray(arr) && arr.every(item => typeof item === 'string' && item.length > 0);\n}","tryCatchPattern":"try {\n  validatePodTemplate(json);\n} catch (e) {\n  if (e instanceof PodTemplateValidationError && e.message.includes('allowedMcpTools entries')) {\n    // Fix the specific array index indicated by e.path\n  }\n}","preventionTips":["Use the JSON-pointer path in the error (e.g. /allowedMcpTools[2]) to find the exact bad entry","Never leave empty string placeholders in allowedMcpTools","Remove null or undefined entries that may result from YAML conversion"],"tags":["pod-template","validation","schema","mcp-tools"],"backgroundTag":null,"analyzedSha":"6b01dc5a687b26b3e218f796de45ec51f8fa9e8c","analyzedAt":"2026-08-12T13:20:50.148Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}