Tool authoring reference
The reference for authoring a custom Tool definition: the fields a Tool needs, how parameters and targets work, the Compiler and V3 Processor contracts, 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 Method instance, 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 or workflow by hand.
- Save realistic output, including an empty result and a malformed or failed result where relevant.
- Decide which durable Ontology Objects and links the output proves.
- Look up their exact schemas, properties, and link names in the Object Reference or Developer MCP.
- Define the Tool’s metadata, parameters, targets,
generatesTypes, and success criteria. - Validate the definition.
- Write and validate the Compiler against representative typed inputs.
- Write and validate the Processor against the sample output.
- Register the Tool only after its planned execution and resulting graph both 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 Compiler deterministically turns typed Tool inputs and selected Ontology Objects into the execution plan a Jackal receives. It is not a place for an AI to improvise commands. Keep parameters minimal, validate every value that changes behavior, and reject unsupported combinations with a clear CompileException before the Tool runs.
A Tool uses exactly one compiler type.
Script Tool
Script Tools are the simplest 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).
Prefer generic Linux with distribution: null unless the Tool genuinely depends on a narrower distribution. Explicitly list every supported architecture. Most portable Linux Tools support both AMD_64 and ARM_64.
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. Use the target access pattern for the compiler branch you selected, and validate target assumptions before adding them to a command. Use the Compiler validator with representative target Objects to inspect the final command for every supported platform and architecture.
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
Courier Tool
Use courierTool when the Tool needs direct control over a Courier workflow, such as composed actions, explicit outcomes, file transfer, cleanup, or a Jackal-specific action. Prefer Script or CLI when their higher-level primitives express the capability cleanly. Courier is more flexible, but it exposes more execution details and failure modes.
Define one MethodToolCourierCompiler subclass in populateParameters. Its compile method adds one or more workflows to the injected CourierWorkflows collection. Do not add imports: Method injects Workflow, CourierWorkflows, MethodToolCompileInput, and CompileException into the sandbox.
Each output that a Processor needs must be a named Signal. First-class actions declare the Signal when you pass signal="name". For custom actions, explicitly declare the Signal in the enclosing step’s outcomes. Otherwise the action can run successfully but the Processor cannot receive its output.
Processors
A Processor turns raw Signals into durable, reusable Ontology knowledge. It is not an execution log. Model what the Tool discovered, such as a host, service, account, credential, vulnerability, configuration, or finding. Keep commands, wrappers, timestamps, exit codes, and raw diagnostics in Signals, where Method retains them for auditability.
Use the V3 Processor contract for every new Tool: set ontologySdkVersion to ONTOLOGY_SDK_V2, define exactly one MethodToolProcessor subclass, and return generated Ontology Objects in ProcessResult. The enum name selects the newer method-tool SDK V3 contract.
Working in restricted Python
The Processor runs in a restricted sandbox:
- Do not use
import. Method injectsjson,re,method_ontology_sdk, generated Ontology constructors, 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.
- Do not define helpers whose names begin with
_. - Every Object Type your Processor creates must appear in
generatesTypes. - Use the Object Reference or Developer MCP Ontology definition lookup to confirm constructor fields and link helper names.
When the Tool emits exactly one output, call output.get_raw_output(). For multiple named Signals or workflow steps, call output.get_raw_output(step="signal_name"). Use generated constructors and link helpers to create Objects and their relationships:
Handle output according to the Tool’s semantics. Empty output can be a valid result for an enumeration Tool. Malformed output should fail or warn intentionally. Never silently create placeholder Objects from an incomplete report.
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 action in the Tool builder and Developer MCP.
- Validate the definition. Confirm the metadata, parameter types, target types, tag RIDs, generated types, and success criteria form a valid Tool contract.
- Validate the Compiler. Dry-run the planned execution against representative typed parameters and mock target data. Confirm the compiled commands or workflow look exactly right.
- Validate the Processor. Run the Processor against representative Signals or payload and inspect the resulting Object graph. Confirm it contains the expected durable Objects and links.
- Revalidate after changes. After fixing any failure, rerun the failed validator and then the full definition, Compiler, and Processor sequence.
- Create. Register the Tool only after every validator passes and the developer has reviewed the final behavior.
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 uses
ontologySdkVersion: ONTOLOGY_SDK_V2and defines exactly oneMethodToolProcessorsubclass. generatesTypesincludes every Object Type the Processor creates.- 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.