# @leumas/actions

The Action adapter base + the rule engine. An action DOES things (open chatbot, run a workflow cell, run an MCP tool, notify). Rules wire trigger → [actions].


The **Action adapter base** (the third adapter base) + the **rule engine**. An action DOES things:
`run(props) → result`. A **Rule** wires `trigger → [actions]`. Programmed in Studio → Triggers.

```js
import { defineAction, createActionRegistry, createRuleEngine } from '@leumas/actions';
import { createTriggerRegistry } from '@leumas/triggers';

const actions = createActionRegistry([
  defineAction({ id: 'send-sms', metadata: { name: 'Send SMS' }, inputs: [{ key: 'to' }, { key: 'body' }], run: async (p) => sms(p) }),
]);
const triggers = createTriggerRegistry();
const rules = createRuleEngine({ triggers, actions });
rules.arm({ id: 'r1', triggerId: 'webhook', actions: [{ actionId: 'notify', props: { message: 'hook!' } }] });
```

**Built-ins:** `notify`, `open-chatbot`, `run-cell` (workflow/grid), `run-mcp-tool`. Add more per the
roadmap (deploy config, call a connected account, run any capability adapter). Rules persist via the
dynamic `rules` collection and are armed on API start.


---
Source: shared/engines/actions/README.md
Canonical: https://docs.leumas.tech/p/engines/actions
