Create Rule
create_rulePersist a trigger -> action rule and register it with the evaluator. 7 trigger types accepted (alert_fired, schedule_tick, inbox_item, price_threshold, filing_event, manual, scheduled_task_wake) x five action types (run_team, send_alert, create_report, schedule_task, post_inbox); score_thesis is retired and refused. These trigger types have a live event source and DO dispatch today: alert_fired, schedule_tick, inbox_item, filing_event and scheduled_task_wake. price_threshold and manual are accepted and persisted (forward-compatible schema) but have NO live event source wired yet, so a rule created with one of them is saved as enabled:true and simply never fires. Always read the returned rule's trigger_wiring_status field ("live" vs "not_yet_wired") — it is computed from the dispatcher's own registry, so it is authoritative even if this description is stale. condition_expr is an OPTIONAL single comparison ("field op value", op one of gt/gte/lt/lte/eq, e.g. "price_change_pct gt 5") evaluated against the trigger event's payload — omit to fire on the trigger alone. Deliberately NOT a general expression language (no AND/OR, no loops) — this is both an anti-complexity and an anti-loop guard; compose multiple rules if you need more than one comparison. filing_event timing: pro and full rules fire within minutes of a filing; sp500 (free Benchmark) rules fire once a day, for filings detected up to 20:00 America/New_York, at that cutoff (no inbox item, webhook, Slack or agent run before it). Use test_rule immediately after creating to verify it fires as expected WITHOUT spending a real dispatch. Tier: sp500+ (sample rejected).
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"name": "<name>",
"trigger": "<trigger>",
"action": "<action>"
},
"name": "create_rule"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable label. | |
| action | Yes | Discriminated union — what happens when the rule fires. | |
| trigger | Yes | Discriminated union — which signal fires this rule. | |
| condition_expr | No | Optional single comparison against the trigger payload, e.g. "price_change_pct gt 5". Omit to fire on the trigger alone. | |
| replaces_rule_id | No | Optional. The id of a signal this call REPLACES — set it when saving an edit, which is stored as create-then-delete because neither engine has an update tool. A verified live record you own is discounted from the tier cap so an edit is cap-neutral; an unknown, deleted, or foreign id is ignored and the cap applies normally. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| rule | Yes | ||
| _meta | Yes | Provenance envelope — data lineage for every MCP response | |
| warning | No |