Tool authoring reference
The reference for authoring a custom Tool definition: the fields a Tool needs, how parameters and targets work, the Compiler and Processor shapes, how to validate and register, and a set of worked examples.
For the guided, UI-level walkthrough of building a Tool, see Operator-defined Tools. This page is the underlying specification.
Operator-defined Tools are in closed alpha and being updated daily. Object Type identifiers and validation endpoints can still change. If you want this feature enabled on your stack, reach out to your Method representative.
Method open-sources its Tools on GitHub. You can see exactly how Method’s own Tools are built, and if you build something useful, contribute it back.
The Tool definition
A submitted Tool is a CreateToolRequest. You do not have to author it as one block of JSON: the builder collects these fields across its tabs. Use this as the checklist of what every Tool needs.
Families
A Tool belongs to exactly one MITRE tactic family:
RECONNAISSANCE, RESOURCE_DEVELOPMENT, INITIAL_ACCESS, EXECUTION, PERSISTENCE, PRIVILEGE_ESCALATION, DEFENSE_EVASION, CREDENTIAL_ACCESS, DISCOVERY, LATERAL_MOVEMENT, COLLECTION, COMMAND_AND_CONTROL, EXFILTRATION, IMPACT.
Recommended build order
Building from the output backward keeps each piece testable:
- Run one successful command by hand.
- Save a realistic sample of its stdout or JSON output.
- Decide which Ontology Objects that output proves.
- List those Object Types in
generatesTypes. - Write the Processor and validate it against the sample output.
- Write the Compiler and validate the compiled commands.
- Validate the whole definition.
- Register the Tool once both the compiler output and the resulting graph look right.
Parameters
A Tool takes two kinds of input.
Direct parameters
Ontology parameters
An Ontology parameter points at an Object Type by its identifier. Common ones:
Requirements
Parameters required for a Tool to compile are marked with the Required checkbox in the builder.
When multiple Ontology parameters are both marked Required and configured as Targets, compilation succeeds if at least one type is available. For example, if a Tool accepts both FQDNs and URLs as target types, configure them as separate parameters and mark both Required. The Tool can then run whenever either FQDNs or URLs are present, without needing both.
Compilers
A Tool uses exactly one compiler type.
Script Tool
Script Tools are the most flexible shape and need no packaged binary, only named shell commands. They run on a deployed Jackal.
OS targeting supports Linux (any distribution or a specific one such as Ubuntu), macOS, and Windows (desktop or Server).
Static script tools
A static Script Tool runs fixed commands with no parameter substitution. Each command has a name and a shell string. The name is how the Processor identifies that command’s stdout output.
Parameterized script tools
To use direct parameters in shell commands, add populateParameters and reference values as <<name>> placeholders.
Target-aware script tools
Targets are selected from configured Ontology Parameters. When a target is set, the Tool runs once per resolved Object, and the resolved string is available to the Compiler as input.target.
CLI Tool
Use cliTool when execution is a binary plus arguments. Method resolves the binary, then appends fixed commandArgs and the dynamic arguments from populateParameters.
Tool locations
Processors
Prefer customProcessor with inline Python. Choose a base class by how your Tool emits output.
Helpful guide for using restricted Python
The Processor runs in a restricted sandbox:
- Do not use
import. The following are already available:json,re,method_ontology_sdk,ObjectTypeEnum, and the SDK base and result classes. - Define exactly one Processor subclass.
- Do not access private or dunder attributes such as
__dict__. - Do not perform file, network, subprocess, eval, dynamic import, or package installation.
- Every
request.object_factories[ObjectTypeEnum.X]you use must have a matching identifier ingeneratesTypes.
Factory cookbook
Use one factory per Object Type. Factories validate properties and create links.
Success criteria
successCriteria is an Object search filter that should match the Object that best proves the Tool worked.
Keep the Processor’s success=True aligned with the success criteria you set. A run that reports success but creates no matching Object makes the UI and recommendation logic inconsistent.
Validation and registration
Validate in this order before registering. Each step has a corresponding Validate button in the Tool builder.
- Validate the Compiler. The builder dry-runs your commands against mock target data. Confirm the compiled commands look exactly right.
- Validate the Processor. The builder runs your Processor against sample output and shows the resulting Object graph. Confirm it contains the Objects and links you expect.
- Validate the Metadata. The builder checks the definition as a whole. Confirm all checks pass.
- Create. Click Create to register the Tool. It is now available across the platform.
To publish a new version of an existing Tool, open it from the Tools app and save changes as a new version. Previous versions remain intact.
Examples
Script Tool, no target: host inventory
The Jackal host itself is the target, so the Tool needs no Ontology input. A good first Tool.
OS: Linux, any distribution
Commands:
Script Tool, IP targets: reachability check
The user selects IP Address Objects, and the script runs once per target.
OS: Linux, any distribution
Target: IP Address (one run per selected Object)
Commands:
CLI Tool, direct URLs: JSON report
The binary downloads per OS and architecture and emits one JSON report.
Location: Direct URLs (Linux x86_64 and arm64)
Fixed arguments: discover dns forward
Target: FQDN (one run per selected Object)
Common pitfalls
Final review checklist
- Tool name is lowercase alphanumeric and versioned.
- Risk level accurately reflects expected operational impact.
- Required parameters match the Compiler’s assumptions.
- Every Ontology target parameter appears in Compiler targets.
- Script placeholders are quoted and fully substituted.
- CLI
commandArgsdo not include the binary path. - Processor defines exactly one subclass.
generatesTypesincludes every factory the Processor uses.- Success criteria matches a created Object Type.
- A valid sample output and an empty or negative output were both tested.
- Compiler validation passed for every OS and architecture you support.
For the step-by-step walkthrough of building a Tool in the UI, see Operator-defined Tools. For how Tools fit into the platform, see Tools.