---
title: "Library, Tools & Modules"
canonical: https://trickest.com/docs/developer-tools/cli/library-tools-modules
description: "Browse the public library, manage private tools, and create modules from the trickest CLI."
---

# Library, Tools & Modules

Three related surfaces: the **public library** (`library`), your vault's **private
tools** (`tool`), and reusable **modules** (`module` / `modules`).

<Info>
Building blocks concepts: [Tools](/docs/key-concepts/building-blocks/tools) and
[Modules](/docs/key-concepts/building-blocks/modules). Creating modules in the UI:
[Creating and using modules](/docs/using-the-app/workflow-and-executions/creating-and-using-modules).
</Info>

## `trickest library`

Browse the **public** tool and module catalog.

| Subcommand | Description |
|---|---|
| `library ls\|list [query]` | Search the library |
| `library info\|get <name>` | Inputs, outputs, usage for a tool or module |

```bash
trickest library ls amass
trickest library ls httpx --type tool --limit 10
trickest library info subfinder
```

| Flag | Description |
|---|---|
| `--type <types>` | `tool`, `script`, `module` (default: all three) |
| `--limit <n>` | Max results (default 20) |

Returns a **bare JSON array** of `{id, name, type, description, category}` entries.
`library info` can return a closest match when no exact name exists. Read its
warning and verify the returned name and ID before adding the item.

## `trickest tool`

Manage **private tools** in your vault.

| Subcommand | Description |
|---|---|
| `tool list` | List private tools (paginated) |
| `tool create` | Create from a YAML definition |
| `tool update` | Update from YAML |
| `tool delete` | Delete a tool |

### `tool list` output

`tool list` returns a bare JSON array of summary rows when piped or requested
with `--output json`. Add `--full` to include inputs, outputs, container settings,
and license details. It reads the first API page and prints a notice to stderr
if more results exist.

```bash
trickest tool list | jq '.[].name'
trickest tool list --full
trickest tool delete --id <tool-id>
```

### Create or update from YAML

The file contains the tool definition, not a workflow graph. A minimal definition
needs `name` and `docker_image`. Save this illustrative definition as
`tool.trickest.yaml`; replace the image and command with your tool before use:

```yaml
name: example-tool
docker_image: your-registry.example/your-tool:1.0
command: your-tool
```

```bash
trickest tool create --file ./tool.trickest.yaml
trickest tool update --file ./tool.trickest.yaml --id <tool-id>
```

Creation requires private-tool access. Optional fields include `description`,
`category`, `output_parameter`, `output_type` (`file` or `folder`), and `inputs`.
Each `inputs` entry is keyed by input name and can contain `command`, `description`,
`type`, `order`, and `visible`. These commands save Library metadata, not a workflow
node or a run. See [Adding private tools](/docs/using-the-app/private-execution-networking/adding-private-tools)
for the meaning of container and input settings.

`tool delete` requires `--id` or `--name`. It does not prompt for confirmation.

<Info>
Adding private tools via the UI:
[Adding private tools](/docs/using-the-app/private-execution-networking/adding-private-tools).
</Info>

## `trickest module`

Package a workflow (or parts of it) as a reusable module.

| Subcommand | Description |
|---|---|
| `module ls` | List modules |
| `module info\|get <name-or-id>` | Module details |
| `module search <query>` | Search the module library |
| `module create <name>` | Create module + backing workflow |
| `module update <id>` | Update name/description |
| `module rm <id>` | Delete |
| `module io` | Exposed inputs/outputs on active workflow |
| `module expose-input` / `unexpose-input` | Module interface primitives |
| `module expose-output` / `unexpose-output` | Module interface outputs |

### `module ls`

```bash
trickest module ls
trickest module ls --scope public --search discovery
```
```json
[{"id":"1087795e-…","name":"Module A","category":"","description":"","author":"you"}]
```

| Flag | Description |
|---|---|
| `--scope <scope>` | `mine`, `public`, or `all` (default `mine`) |
| `--search <query>` | Filter by name/description |
| `--category <cat>` | Filter by category |

### Module interface on the active workflow

`module io`, `expose-input`, and `expose-output` require an **active workflow**
context, or an explicit `--workflow <id>` / `--module <id>` (see [Configuration & Context](/docs/developer-tools/cli/configuration)).

```bash
trickest module io
trickest module expose-input my-primitive --name target
trickest module expose-output scan-node --name findings
```

### Work on a module in local files

```bash
trickest module pull <module-id> --dir ./my-module
trickest module validate ./my-module
trickest module diff ./my-module
trickest module push ./my-module --preview
```

`module init <dir>` creates a local skeleton. Pulling a module preserves local
contracts and fixtures. `module push` previews by default; add `--apply` to save
a new backing-workflow version. It refuses to apply if the remote version changed.

`module test --boundary` executes an isolated parent workflow and removes it
afterward. This is a real execution, not a read-only validation.

## Recipe: find a tool and add it to a workflow

Choose an existing workflow containing a node named `subfinder`. Adding the node saves the updated graph; no separate `save` is needed.

```bash
trickest library info httpx | jq '{name, inputs, outputs}'
trickest workflow use "<workflow-id>"
trickest node add httpx --tool httpx --from subfinder
```

## Related

<CardGroup cols={2}>
  <Card title="Nodes & Connections" icon="circle-nodes" href="/docs/developer-tools/cli/nodes">
    Add library tools to the active workflow with `node add --tool`.
  </Card>
  <Card title="Search" icon="magnifying-glass" href="/docs/developer-tools/cli/search">
    Cross-resource search including tools and modules.
  </Card>
</CardGroup>

---
_Markdown source of https://trickest.com/docs/developer-tools/cli/library-tools-modules._
