state
Create Signal
create_signalBenchmark and above
Persist a signal and register it with the firing pipeline. Five condition shapes: * `filing_event` — fire when a ticker files a chosen form type (8-K, 10-K, etc.). * `ratio_threshold` — fire when a ticker's financial ratio crosses a threshold (e.g. interest_coverage < 1.5). * ...
Example Call
example_call.pypython
# Using the Valuein MCP server from Python (via MCP SDK)# Or call directly from Claude / Cursor after setup result = await client.call_tool( "create_signal", arguments={ "name": "EXAMPLE", "condition": {}})print(result)Direct tool call:create_signal(...)
Inputs
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | required | Human-readable label. |
condition | object | required | Condition evaluated each cron tick — a discriminated union of `filing_event` (a watched ticker files a new form), `ratio_threshold` (a financial ratio crosses a comparator/threshold), `watchlist_change` (any ticker in a named watchlist files), `price_move` (Pro+ — a close-to-close move crosses a percent threshold), or `fundamental_change` (Pro+ — a standard_concept reports a new period or gets restated). |
channel | object | optional | ONE delivery channel for a match — `email` (filing conditions: the morning digest; other conditions: one transactional email per signal per UTC day, the rest go to the inbox), `webhook` (HMAC-SHA256-signed POST to your URL), `slack` (POST to a hooks.slack.com incoming-webhook URL), `dashboard` (in-app inbox, readable via list_signal_inbox), or `agent_run` (runs a standing agent identified by its id, delivering the finished artifact to your inbox). Use `channels` instead to deliver to several at once; one of the two is required. |
channels | array | optional | SEVERAL delivery channels for a match, in order (up to 4, each a distinct type+target) — e.g. `[{type:'dashboard'},{type:'email',target:'you@fund.com'}]` to get the inbox item AND the email. The first entry is what `channel` reports. Takes precedence over `channel` when both are given. |
replaces_signal_id | string | optional | Optional. The id of a signal this call REPLACES with a NEW one. Prefer `update_signal`, which edits in place and keeps the fire history; use this only when you deliberately want a fresh record. A verified live record you own is discounted from the tier cap so the swap is cap-neutral; an unknown, deleted, or foreign id is ignored and the cap applies normally. |
Output Fields
signalcron_indexedExample Response
Illustrative
response.jsonjson
{ "signal": null, "cron_indexed": null}Shape only — field names match the live schema; values are placeholders, not real filings. See MCP server for the structured response shape.
Notes
Available from the Benchmark plan and above.
Plan Access
Sample (guest)
Not includedBenchmark (token)
AvailablePro
AvailableInstitutional
AvailableRelated Tools
Index names are trademarks of their owners; Valuein is not affiliated with or endorsed by any index provider.