> Fetch clean Markdown by appending `.md` to any page URL under https://signalwire.com/docs or requesting it with the HTTP header `Accept: text/markdown`. The root index at https://signalwire.com/docs/llms.txt lists the available documentation indexes. # CustomSkillsSkill > A meta-skill that registers user-defined tools from configuration. [add-skill]: /docs/server-sdks/reference/typescript/agents/agent-base/add-skill A meta-skill that registers user-defined tools from configuration. Define tools with names, descriptions, parameters, and JavaScript handler code without writing skill classes. **Class:** `CustomSkillsSkill` **Tools:** Dynamically created from the `tools` array **Env vars:** `SWML_ALLOW_CUSTOM_HANDLER_CODE` must be set to `"true"` to enable handler execution. **`tools`** `Record[]` Array of custom tool definitions. Each object has: * `name` (string, required) -- Unique tool name. * `description` (string, required) -- Tool description shown to the AI. * `handler_code` (string, required) -- JavaScript function body. Receives `(args, rawData, FunctionResult)` as arguments. Must return a `FunctionResult`, string, or object. * `parameters` (array, optional) -- Parameter definitions: `[{ name, type, description, required? }]`. * `required` (string\[], optional) -- Array of required parameter names. * `prompt_description` (string, optional) -- Description to include in the prompt section. * `secure` (boolean, optional) -- Whether to mark the tool as secure. * `fillers` (object, optional) -- Filler phrases keyed by language. --- **`prompt_title`** `string` — default: Custom Tools Custom title for the prompt section. --- **`prompt_body`** `string` Custom body text for the prompt section. --- ```typescript {6-14} import { AgentBase, CustomSkillsSkill } from '@signalwire/sdk'; const agent = new AgentBase({ name: 'assistant', route: '/assistant' }); agent.setPromptText('You are a helpful assistant.'); await agent.addSkill(new CustomSkillsSkill({ tools: [ { name: 'greet_user', description: 'Greet the user by name.', parameters: [ { name: 'name', type: 'string', description: 'The user name', required: true }, ], required: ['name'], handler_code: 'return new FunctionResult("Hello, " + args.name + "! Welcome.");', }, ], })); agent.run(); ``` > A meta-skill that registers user-defined tools from configuration.