Skip to main content
When the built-in and pre-installed tools do not cover something specific to your team, you can create custom tools of your own. A custom tool is a small TypeScript or Python function with a defined input and output schema. It is stored in your account and runs inside your sandbox, so it can call internal APIs, wrap proprietary tooling, or encode a repeatable step in your methodology.

When to create a custom tool

You have an internal API or service. If a step in your workflow means calling an internal endpoint, a ticketing system, or a proprietary data source, a custom tool gives the agent a typed, reliable way to do it instead of hand-written curl commands. You repeat the same multi-step operation. Recurring logic like normalizing scan output, enriching a finding, or querying an asset inventory is more reliable as a single tool than as instructions the agent re-derives each time. You want to wrap proprietary tooling. Custom tools let you expose your own scanners or scripts to the agent with a clear contract, so it knows exactly what inputs to pass and what to expect back.

Anatomy of a custom tool

Every custom tool Neo builds has the same structure:
  • Source code: a TypeScript or Python function that contains the tool’s logic and runs inside your sandbox.
  • Input schema: the typed parameters the agent must provide when it calls the tool.
  • Output schema: the shape of the result the tool returns, so the agent can reason about it.
  • When to use: a description of the situations this tool is for, so the agent knows when to reach for it.
  • Timeout: how long the tool is allowed to run before it is stopped.
Custom tools are grouped into toolkits, which carry the shared setup their tools depend on:
  • Language: whether the toolkit’s tools are written in TypeScript or Python.
  • Dependencies: packages the tools need, installed when the toolkit is set up.
  • Setup code: initialization that runs before the tools, such as configuring a client.
  • Environment variables: configuration and credentials made available to the tools at runtime.
  • Metadata: tags and descriptions for organizing and discovering toolkits.

How to create a custom tool

You create and manage custom tools through Neo itself by describing what you want: the operation the tool should perform, its inputs, and what it should return. Neo writes the function, defines the input and output schema, registers it inside a toolkit, and tests it to confirm it runs. You can be as specific or as high-level as you like, and Neo fills in the gaps based on your description. For example:
Create a tool that takes a hostname and returns its owner, environment, and
criticality by calling our internal asset inventory API at
https://inventory.internal/api/assets. Read the API token from an env var.
The agent should use it to enrich findings before reporting them.
The result is saved as a reusable tool in your account, ready for your agents to use.

How tools are loaded

Once created, a custom tool can reach your agents in three ways:
  • On-demand: the agent discovers and calls the tool only when a task needs it.
  • Pinned: the tool loads automatically on every task.
  • Attached: the tool is scoped to a specific custom agent, so only that agent sees it.
Pinning and attaching let you keep a large library of tools without crowding every agent with all of them at once. Combined with custom agents, custom tools let you adapt Neo to workflows the built-in capabilities do not already cover.