Skip to main content
Glama

tickerbot_subscribe_signal

Push one signal: we POST your endpoint whenever any ticker starts matching it. Webhooks need a paid plan (Free has no webhook slots). Omit ticker to watch the whole universe.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
dirNoSort direction for `order`.desc
nameNoHuman-readable label (up to 80 chars). Defaults to the predicate — `at_52w_high` for a boolean, `rsi_14 > 70` for a numeric, prefixed with `<TICKER>: ` when `ticker` scopes it.
orderNoSignal the fired payload's match lists are sorted by before the 100-row cap is applied, so a truncated list is the deterministic top 100 rather than an arbitrary sample. Must be a real signal (validated at creation).market_cap
signalYesSignal name from the schema (case-insensitive).
tickerNoRestrict to a single ticker. Default: any ticker.
cadenceNo`realtime` (the default) is evaluated on every data refresh (~1×/min); `hourly` and `nyse_open` throttle to a batch schedule. `1m` is a deprecated alias for `realtime`.
channelNoDelivery channel. `webhook` (POST to `target_url`), `discord` (post an embed to `discord_url`), `in_app` (dashboard only), or `mobile_push` (notify a phone signed in to the Tickerbot mobile app; requires a `device_id` from `POST /v2/devices/register`). Inferred when omitted: `webhook` if `target_url` is set, `discord` if `discord_url` is set, else `in_app`. `slack` is reserved and returns `501`. See the Delivery channels guide.
columnsNoComma-separated extra signals to include in each fired payload match row, beyond the standard set (`ticker`, `name`, `asset_type`, `price`, `change_1d_pct`, `market_cap`). Each must be a real signal; an unknown signal is rejected at creation. `fields` accepted as an alias — and note the RESPONSE reports them under `fields`, as an array.
universeNoRestrict to a system or user-owned universe (e.g. `top_100`). `universe_id` accepted as an alias. Unknown universes are a 404 `universe_not_found`.
conditionNoRequired for every non-boolean signal; the shape follows the signal's `type`. Numeric: `">70"`, `"<30"`, `">=100"`. Timestamp: `"<YYYY-MM-DDTHH:MM:SSZ"` (or a bare date). Date: `">=YYYY-MM-DD"`. String: `"=ETF"` or `"!=ETF"`. Sending one with a boolean or custom signal returns 400 (it does not apply).
device_idNoDevice to notify, from `POST /v2/devices/register`. Required when `channel` is `mobile_push`; unknown ids are a 404 `device_not_found`.
target_urlNohttps:// URL to POST when fired. Omit for in-app delivery.
discord_urlNoDiscord incoming-webhook URL (`https://discord.com/api/webhooks/…`). Required when `channel` is `discord`. Stored as a posting credential: the create response echoes it back under `channel_config`, but every later read (list, get, deliveries) strips it and sets `channel_config_present: true` instead.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
qYesThe stored predicate. Custom signals appear expanded: the SQL is frozen at creation.
idYesThe webhook id — `wh_…`, the handle for every other call on this record.
dirYesSort direction for that list; `null` means the default (`desc`).
nameYesYour label for the subscription.
as_ofYesServer time this response was assembled (ISO 8601).
orderYesSort signal for the payload row list; `null` means the evaluator default (`market_cap`).
fieldsYesExtra signals carried on each fired match row; `null` means the standard set.
sourceYesWhich API version created the record; `v2` for anything you create today.
statusYes`active` or `disabled`. Auto-disable follows repeated delivery failure.
cadenceYesHow often the trigger is evaluated — `realtime`, `hourly`, or `nyse_open`.
channelYesWhere deliveries go: `webhook`, `discord`, `in_app`, or `mobile_push`.
event_qNoEvent-trigger webhooks only: the payload filter, or `null`.
rule_idYesLegacy link to a v1 alert rule; `null` on everything created through v2.
deliveryYesLegacy alias of `channel`, kept aligned for older readers.
test_urlYesReturned on create only: the `POST /v2/webhooks/{id}/test` URL for this record.
created_atYesCreation timestamp.
last_errorNoThe last evaluation error; `null` on a healthy hook. The answer to "why is my webhook not firing?".
last_firedYesWhen a delivery last went out; `null` if it never has.
target_urlYesYour HTTPS endpoint; `null` on every channel except `webhook`.
updated_atYesLast modification timestamp.
event_kindsNoEvent-trigger webhooks only: the kinds subscribed (`split`, `dividend`, `insider`, `analyst`, `earnings`).
universe_idYesUniverse the trigger is scoped to, or `null` for the whole market.
next_eval_atYesWhen the evaluator will next consider this subscription.
trigger_kindNoEvent-trigger webhooks only: `event`.
event_tickersNoEvent-trigger webhooks only: the symbols the trigger is scoped to, or `null` for the universe / whole market.
channel_configYesReturned on create only: the channel-specific delivery settings as stored (e.g. the Discord URL, the device id).
last_match_setYesTickers matching at the last evaluation — the set the next run is diffed against, which is what makes firing edge-triggered.
signing_secretYesReturned on create only — shown once, never again. HMAC key for verifying the `X-Tickerbot-Signature` header on deliveries.
last_evaluated_atYesWhen it was last evaluated; `null` until the first run.
last_eval_error_atNoWhen the last evaluation error happened; `null` on a healthy hook.
subscription_originYesWhich door created it — `type` (`ticker`/`signal`/`scan`/`event`), its `ref`, and the `condition` in display form.
last_predicate_valueYesThe trigger's value at the last evaluation; `null` until it has run.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / condition / description
      Previous value: -"Required for numeric signals. Shape: `\">70\"`, `\"<30\"`, `\">=100\"`, `\"=50\"`. Sending one with a boolean or custom signal returns 400 (it does not apply)."New value: +"Required for every non-boolean signal; the shape follows the signal's `type`. Numeric: `\">70\"`, `\"<30\"`, `\">=100\"`. Timestamp: `\"<YYYY-MM-DDTHH:MM:SSZ\"` (or a bare date). Date: `\">=YYYY-MM-DD\"`. String: `\"=ETF\"` or `\"!=ETF\"`. Sending one with a boolean or custom signal returns 400 (it does not apply)."
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "as_of": {
      +      "description": "Server time this response was assembled (ISO 8601).",
      +      "type": "string"
      +    },
      +    "cadence": {
      +      "description": "How often the trigger is evaluated — `realtime`, `hourly`, or `nyse_open`.",
      +      "type": "string"
      +    },
      +    "channel": {
      +      "description": "Where deliveries go: `webhook`, `discord`, `in_app`, or `mobile_push`.",
      +      "type": "string"
      +    },
      +    "channel_config": {
      +      "description": "Returned on create only: the channel-specific delivery settings as stored (e.g. the Discord URL, the device id).",
      +      "type": "object"
      +    },
      +    "created_at": {
      +      "description": "Creation timestamp.",
      +      "type": "number"
      +    },
      +    "delivery": {
      +      "description": "Legacy alias of `channel`, kept aligned for older readers.",
      +      "type": "string"
      +    },
      +    "dir": {
      +      "description": "Sort direction for that list; `null` means the default (`desc`).",
      +      "type": "string"
      +    },
      +    "event_kinds": {
      +      "description": "Event-trigger webhooks only: the kinds subscribed (`split`, `dividend`, `insider`, `analyst`, `earnings`).",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "event_q": {
      +      "description": "Event-trigger webhooks only: the payload filter, or `null`.",
      +      "type": "string"
      +    },
      +    "event_tickers": {
      +      "description": "Event-trigger webhooks only: the symbols the trigger is scoped to, or `null` for the universe / whole market.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "fields": {
      +      "description": "Extra signals carried on each fired match row; `null` means the standard set.",
      +      "type": "string"
      +    },
      +    "id": {
      +      "description": "The webhook id — `wh_…`, the handle for every other call on this record.",
      +      "type": "string"
      +    },
      +    "last_error": {
      +      "description": "The last evaluation error; `null` on a healthy hook. The answer to \"why is my webhook not firing?\".",
      +      "type": "string"
      +    },
      +    "last_eval_error_at": {
      +      "description": "When the last evaluation error happened; `null` on a healthy hook.",
      +      "type": "number"
      +    },
      +    "last_evaluated_at": {
      +      "description": "When it was last evaluated; `null` until the first run.",
      +      "type": "number"
      +    },
      +    "last_fired": {
      +      "description": "When a delivery last went out; `null` if it never has.",
      +      "type": "number"
      +    },
      +    "last_match_set": {
      +      "description": "Tickers matching at the last evaluation — the set the next run is diffed against, which is what makes firing edge-triggered.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "last_predicate_value": {
      +      "description": "The trigger's value at the last evaluation; `null` until it has run.",
      +      "type": "string"
      +    },
      +    "name": {
      +      "description": "Your label for the subscription.",
      +      "type": "string"
      +    },
      +    "next_eval_at": {
      +      "description": "When the evaluator will next consider this subscription.",
      +      "type": "number"
      +    },
      +    "order": {
      +      "description": "Sort signal for the payload row list; `null` means the evaluator default (`market_cap`).",
      +      "type": "string"
      +    },
      +    "q": {
      +      "description": "The stored predicate. Custom signals appear expanded: the SQL is frozen at creation.",
      +      "type": "string"
      +    },
      +    "rule_id": {
      +      "description": "Legacy link to a v1 alert rule; `null` on everything created through v2.",
      +      "type": "string"
      +    },
      +    "signing_secret": {
      +      "description": "Returned on create only — shown once, never again. HMAC key for verifying the `X-Tickerbot-Signature` header on deliveries.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "description": "Which API version created the record; `v2` for anything you create today.",
      +      "type": "string"
      +    },
      +    "status": {
      +      "description": "`active` or `disabled`. Auto-disable follows repeated delivery failure.",
      +      "type": "string"
      +    },
      +    "subscription_origin": {
      +      "description": "Which door created it — `type` (`ticker`/`signal`/`scan`/`event`), its `ref`, and the `condition` in display form.",
      +      "type": "object"
      +    },
      +    "target_url": {
      +      "description": "Your HTTPS endpoint; `null` on every channel except `webhook`.",
      +      "type": "string"
      +    },
      +    "test_url": {
      +      "description": "Returned on create only: the `POST /v2/webhooks/{id}/test` URL for this record.",
      +      "type": "string"
      +    },
      +    "trigger_kind": {
      +      "description": "Event-trigger webhooks only: `event`.",
      +      "type": "string"
      +    },
      +    "universe_id": {
      +      "description": "Universe the trigger is scoped to, or `null` for the whole market.",
      +      "type": "string"
      +    },
      +    "updated_at": {
      +      "description": "Last modification timestamp.",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "as_of",
      +    "id",
      +    "name",
      +    "q",
      +    "rule_id",
      +    "fields",
      +    "order",
      +    "dir",
      +    "universe_id",
      +    "cadence",
      +    "channel",
      +    "target_url",
      +    "delivery",
      +    "status",
      +    "source",
      +    "subscription_origin",
      +    "last_predicate_value",
      +    "created_at",
      +    "updated_at",
      +    "last_fired",
      +    "last_match_set",
      +    "next_eval_at",
      +    "last_evaluated_at",
      +    "channel_config",
      +    "signing_secret",
      +    "test_url"
      +  ],
      +  "type": "object"
      +}
  3. Changed13 schema fields changed
    • changedInput schema / properties / cadence / description
      Previous value: -"Evaluation cadence. Default realtime; hourly/nyse_open throttle. (`1m` accepted as a deprecated alias of realtime.)"New value: +"`realtime` (the default) is evaluated on every data refresh (~1×/min); `hourly` and `nyse_open` throttle to a batch schedule. `1m` is a deprecated alias for `realtime`."
    • changedInput schema / properties / channel / description
      Previous value: -"Delivery channel: `webhook` (POST to target_url), `discord` (embed to discord_url), `mobile_push` (to a registered device), or `in_app` (dashboard only). Inferred from the URL you pass if omitted."New value: +"Delivery channel. `webhook` (POST to `target_url`), `discord` (post an embed to `discord_url`), `in_app` (dashboard only), or `mobile_push` (notify a phone signed in to the Tickerbot mobile app; requires a `device_id` from `POST /v2/devices/register`). Inferred when omitted: `webhook` if `target_url` is set, `discord` if `discord_url` is set, else `in_app`. `slack` is reserved and returns `501`. See the Delivery channels guide."
    • addedInput schema / properties / columns
      Added value: +{
      +  "description": "Comma-separated extra signals to include in each fired payload match row, beyond the standard set (`ticker`, `name`, `asset_type`, `price`, `change_1d_pct`, `market_cap`). Each must be a real signal; an unknown signal is rejected at creation. `fields` accepted as an alias — and note the RESPONSE reports them under `fields`, as an array.",
      +  "type": "string"
      +}
    • changedInput schema / properties / condition / description
      Previous value: -"Required for numerics: single bound like \">70\" or \"<=200\". Ignored for booleans."New value: +"Required for numeric signals. Shape: `\">70\"`, `\"<30\"`, `\">=100\"`, `\"=50\"`. Sending one with a boolean or custom signal returns 400 (it does not apply)."
    • changedInput schema / properties / device_id / description
      Previous value: -"Registered device id from the mobile app. Required when channel is \"mobile_push\"."New value: +"Device to notify, from `POST /v2/devices/register`. Required when `channel` is `mobile_push`; unknown ids are a 404 `device_not_found`."
    • addedInput schema / properties / dir
      Added value: +{
      +  "default": "desc",
      +  "description": "Sort direction for `order`.",
      +  "enum": [
      +    "asc",
      +    "desc"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / discord_url / description
      Previous value: -"Discord incoming-webhook URL (https://discord.com/api/webhooks/…). Required when channel is \"discord\"."New value: +"Discord incoming-webhook URL (`https://discord.com/api/webhooks/…`). Required when `channel` is `discord`. Stored as a posting credential: the create response echoes it back under `channel_config`, but every later read (list, get, deliveries) strips it and sets `channel_config_present: true` instead."
    • changedInput schema / properties / name / description
      Previous value: -"Human-readable label."New value: +"Human-readable label (up to 80 chars). Defaults to the predicate — `at_52w_high` for a boolean, `rsi_14 > 70` for a numeric, prefixed with `<TICKER>: ` when `ticker` scopes it."
    • addedInput schema / properties / order
      Added value: +{
      +  "default": "market_cap",
      +  "description": "Signal the fired payload's match lists are sorted by before the 100-row cap is applied, so a truncated list is the deterministic top 100 rather than an arbitrary sample. Must be a real signal (validated at creation).",
      +  "type": "string"
      +}
    • changedInput schema / properties / signal / description
      Previous value: -"Column name (e.g. golden_cross_today, rsi_14)."New value: +"Signal name from the schema (case-insensitive)."
    • changedInput schema / properties / target_url / description
      Previous value: -"Optional https URL for the `webhook` channel; omit for in-app."New value: +"https:// URL to POST when fired. Omit for in-app delivery."
    • changedInput schema / properties / ticker / description
      Previous value: -"Optional ticker to restrict the watch to one symbol."New value: +"Restrict to a single ticker. Default: any ticker."
    • changedInput schema / properties / universe / description
      Previous value: -"Optional universe slug."New value: +"Restrict to a system or user-owned universe (e.g. `top_100`). `universe_id` accepted as an alias. Unknown universes are a 404 `universe_not_found`."
  4. Changed5 schema fields changed
    • changedInput schema / properties / cadence / description
      Previous value: -"Evaluation cadence."New value: +"Evaluation cadence. Default realtime; hourly/nyse_open throttle. (`1m` accepted as a deprecated alias of realtime.)"
    • changedInput schema / properties / cadence / enum
      Previous value: -[
      -  "1m",
      -  "hourly",
      -  "nyse_open"
      -]New value: +[
      +  "realtime",
      +  "hourly",
      +  "nyse_open"
      +]
    • changedInput schema / properties / channel / description
      Previous value: -"Delivery channel: `webhook` (POST to target_url), `discord` (embed to discord_url), or `in_app` (dashboard only). Inferred from the URL you pass if omitted."New value: +"Delivery channel: `webhook` (POST to target_url), `discord` (embed to discord_url), `mobile_push` (to a registered device), or `in_app` (dashboard only). Inferred from the URL you pass if omitted."
    • changedInput schema / properties / channel / enum
      Previous value: -[
      -  "webhook",
      -  "discord",
      -  "in_app"
      -]New value: +[
      +  "webhook",
      +  "discord",
      +  "in_app",
      +  "mobile_push"
      +]
    • addedInput schema / properties / device_id
      Added value: +{
      +  "description": "Registered device id from the mobile app. Required when channel is \"mobile_push\".",
      +  "type": "string"
      +}
  5. Changed1 schema field changed
    • changedInput schema / properties / cadence / enum
      Previous value: -[
      -  "1m",
      -  "5m",
      -  "15m",
      -  "hourly",
      -  "nyse_open"
      -]New value: +[
      +  "1m",
      +  "hourly",
      +  "nyse_open"
      +]
  6. Changed3 schema fields changed
    • addedInput schema / properties / channel
      Added value: +{
      +  "description": "Delivery channel: `webhook` (POST to target_url), `discord` (embed to discord_url), or `in_app` (dashboard only). Inferred from the URL you pass if omitted.",
      +  "enum": [
      +    "webhook",
      +    "discord",
      +    "in_app"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / discord_url
      Added value: +{
      +  "description": "Discord incoming-webhook URL (https://discord.com/api/webhooks/…). Required when channel is \"discord\".",
      +  "type": "string"
      +}
    • changedInput schema / properties / target_url / description
      Previous value: -"Optional https URL for delivery; omit for in-app."New value: +"Optional https URL for the `webhook` channel; omit for in-app."
  7. First observed

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the burden and does state the key behavioral effects: the system POSTs to the user's endpoint whenever a ticker starts matching the signal. It also names the delivery mechanism and the paid-plan limitation for webhooks. It could add persistence/lifecycle details, but the core trigger-and-deliver behavior is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no filler. The core behavior is front-loaded, followed by the most important constraint and a useful usage tip.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich 100%-covered input schema and presence of an output schema, the description does not need to re-explain every parameter. It covers the high-level purpose, a key constraint, and the universe-scoping default, which is sufficient context for a 13-parameter tool whose details live in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3 and most parameter meaning comes from the schema. The description adds only two small param-related notes—webhook plans and the ticker-omission default—neither of which materially changes parameter understanding beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening 'Push one signal: we POST your endpoint whenever any ticker starts matching it' clearly identifies the verb (subscribe/push), resource (a signal), and trigger condition. It also distinguishes this from sibling ticker/scan/event subscription tools by emphasizing signal matching rather than a fixed ticker or scan.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful context by warning that webhooks require a paid plan and explaining how to broaden scope with 'Omit `ticker` to watch the whole universe.' It does not explicitly say when to choose this tool over subscribe_ticker, subscribe_scan, or subscribe_events, so the usage guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.