{"record":{"id":"9931017728866ff2","repo":"n8n-io/n8n","slug":"tool-name-toolname-is-reserved-for-runtime-sk","errorCode":null,"errorMessage":"Tool name \"${toolName}\" is reserved for runtime skills","messagePattern":"Tool name \"(.+?)\" is reserved for runtime skills","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/@n8n/agents/src/sdk/agent.ts","lineNumber":1377,"sourceCode":"\t\t\t\t\t...(pendingSuspend.length > 0 ? { pendingSuspend } : {}),\n\t\t\t\t\tgetState: () => resultStream.getState(),\n\t\t\t\t};\n\t\t\t\treturn generateResultToDelegateSubAgentOutput(request.taskPath, result);\n\t\t\t} finally {\n\t\t\t\tawait childRuntime.dispose();\n\t\t\t}\n\t\t};\n\t}\n\n\tprivate assertToolRegistrationAllowed(tool: BuiltTool): void {\n\t\tthis.assertToolNameAvailable(tool.name);\n\t\tthis.assertReservedSdkBuiltInToolName(tool);\n\t}\n\n\tprivate assertToolNameAvailable(toolName: string): void {\n\t\tif (!this.hasRuntimeSkillTool || !RUNTIME_SKILL_TOOL_NAMES.has(toolName)) return;\n\n\t\tthrow new Error(`Tool name \"${toolName}\" is reserved for runtime skills`);\n\t}\n\n\tprivate assertReservedSdkBuiltInToolName(tool: BuiltTool): void {\n\t\tif (!SDK_RESERVED_BUILTIN_TOOL_NAMES.has(tool.name)) return;\n\t\tif (isDelegateSubAgentTool(tool)) {\n\t\t\tif (tool.name === DELEGATE_SUB_AGENT_TOOL_NAME) return;\n\t\t} else if (isSdkOwnedBuiltInTool(tool)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthrow new Error(`Tool name \"${tool.name}\" is reserved for SDK built-in tools`);\n\t}\n\n\tprivate removeRuntimeSkillTools(): void {\n\t\tif (!this.hasRuntimeSkillTool) return;\n\n\t\tthis.tools = this.tools.filter((tool) => !RUNTIME_SKILL_TOOL_NAMES.has(tool.name));\n\t\tthis.hasRuntimeSkillTool = false;","sourceCodeStart":1359,"sourceCodeEnd":1395,"githubUrl":"https://github.com/n8n-io/n8n/blob/5ac6606e81f67bb9534255570cd4e86fd8101eee/packages/@n8n/agents/src/sdk/agent.ts#L1359-L1395","documentation":"Thrown by Agent.assertToolNameAvailable when a user-registered tool collides with a name in RUNTIME_SKILL_TOOL_NAMES (currently the skill-load tool). The SDK reserves those names for runtime skill tooling injected by .skills(). The check fires only when the agent already has a runtime skill tool registered (hasRuntimeSkillTool === true).","triggerScenarios":"Calling agent.skills(source) first (which injects the skill-load tool), then agent.tool(myTool) where myTool.name equals the skill-load tool name. Also reachable via assertToolRegistrationAllowed running on a deferred tool that shares the name.","commonSituations":"Copying a tool name from SDK source (e.g. importing SKILL_LOAD_TOOL_NAME and reusing it); merging two agent configs where one enabled skills and the other registered a clashing tool; renaming a custom tool to something starting with the skill-load identifier.","solutions":["Rename your custom tool to anything outside RUNTIME_SKILL_TOOL_NAMES (imported from '@n8n/agents').","Call .skills() AFTER registering custom tools only if no name collides; otherwise drop skills.","If you genuinely need that name, do not enable .skills() on this agent."],"exampleFix":"// before\nagent.skills(source).tool({ name: SKILL_LOAD_TOOL_NAME, ... });\n// after\nagent.skills(source).tool({ name: 'my-skill-loader', ... });","handlingStrategy":"validation","validationCode":"import { RUNTIME_SKILL_TOOL_NAMES } from '@n8n/agents';\n\nfunction assertToolNameFree(toolName: string) {\n  if (RUNTIME_SKILL_TOOL_NAMES.has(toolName)) {\n    throw new Error(`Refusing to register reserved skill tool name: ${toolName}`);\n  }\n}","typeGuard":"import { RUNTIME_SKILL_TOOL_NAMES } from '@n8n/agents';\nfunction isReservedSkillToolName(name: string): boolean {\n  return RUNTIME_SKILL_TOOL_NAMES.has(name);\n}","tryCatchPattern":null,"preventionTips":["Validate tool names against RUNTIME_SKILL_TOOL_NAMES before .tool() when skills are enabled.","Namespace custom tool names (e.g. 'app_*') to avoid landing on reserved identifiers."],"tags":["tools","naming","reserved","skills"],"backgroundTag":null,"analyzedSha":"5ac6606e81f67bb9534255570cd4e86fd8101eee","analyzedAt":"2026-08-12T05:26:35.080Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}