Machines ship a reusable workflow, written in Maltego machine DSL, that can call one or many transforms as part of a guided flow.
**Client availability:** Machines are currently supported in Maltego Graph Desktop only. Maltego Graph Browser does not discover or run machines supplied by a custom transform server.If you only want to group discovery entries together, see the Transform Sets article.
Use a machine when the user should trigger a repeatable workflow instead of calling one transform directly. Common cases include:
- wrapping a provider-specific transform behind a stable workflow ID
- fanning out to multiple providers in parallel
- shipping a curated "deep dive" workflow as a versioned asset
Concrete examples include:
- a focused "Get Profile" workflow for one provider
- a multi-path search workflow that fans out to several transforms
- a reusable follower- or connection-expansion step
Machine DSL example
This is the kind of asset you can ship as machine DSL:
machine('acme.workflow.search_profiles',
displayName: 'Search Profiles',
author: 'Acme',
description: 'Searches several profile sources for the selected input'
) {
start {
paths {
run('acme.lookup.primary')
run('acme.lookup.secondary')
}
}
}Registering a machine in maltego-transforms
MaltegoMachine ships raw machine DSL with your integration:
from maltego.server import MaltegoMachine, register_machine
@register_machine
class SearchProfilesMachine(MaltegoMachine):
code = '''
machine("acme.workflow.search_profiles",
displayName: "Search Profiles",
author: "Acme") {
start {
paths {
run("acme.lookup.primary")
run("acme.lookup.secondary")
}
}
}
'''The SDK stores the machine definition and parses the run() and type() references so the discovery bundle can expose which transforms and entity types the machine depends on.
Machine attributes
| Attribute | Meaning |
|---|---|
code | Required machine DSL string |
name | Optional display name override |
favorite | Pin the machine as a favorite |
enabled | Ship the machine enabled or disabled |
read_only | Prevent client-side edits |
interactive | Advertise that the machine depends on interactive capabilities |
composite_entities | Advertise that the machine uses composed-entity support. Set this when the workflow depends on transforms that return or mutate composed entities. See the Composed Entities article. |
input_constraints | Advertise that the machine relies on input-constraint support. Set this when the workflow depends on transforms that rely on input constraints. See the Input Constraints article. |
Scaling the pattern
For a larger integration, keep machine definitions in dedicated files and register them from a small registry module:
for machine_class in discover_machines():
register_machine(machine_class)This keeps the workflow assets in dedicated files, makes it easy to review and group them by domain, and avoids hard-coding every machine in one Python module.