Skip to main content
Glama

tickerbot_subscribe_events

Push new events: we POST your endpoint when events of the kinds you chose land in the archives. Webhooks need a paid plan (Free has no webhook slots). q filters the ticker STATE; event_q filters the EVENT payload in the /v2/events grammar. Latency is the ingest cadence (analyst ≤1h, corporate kinds daily), not sub-minute.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
qNoOptional row-STATE filter evaluated against the event's ticker at fire time. Same grammar as scan `q`; custom signals are expanded and frozen at creation.
nameNoDisplay name. Defaults to `events: <kinds> · <scope>`.
kindsYesEvent kinds to fire on — array or comma list.
tickerNoSingle-symbol shorthand for `tickers`.
channelNoDelivery channel. `slack` is reserved and returns `501`.
event_qNoOptional event-CONTENT filter in the `/v2/events` grammar — only `ticker`, `ts`, `kind`, `payload` may appear. Composes with `q`.
tickersNoScope to specific tickers (max 50). Mutually exclusive with `universe` — and with the singular alias `ticker` (sending both is a 400). Omit both for all tickers.
universeNoScope to a universe slug (`top_10`, `top_100`, or one of yours). `universe_id` accepted as an alias.
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 delivery URL; or use `channel` + `discord_url`/`device_id`. Omit for in-app.
discord_urlNoDiscord incoming-webhook URL. 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
    • 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"
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / kinds / enum
      Previous value: -[
      -  "earnings",
      -  "dividend",
      -  "split",
      -  "insider",
      -  "analyst"
      -]New value: +[
      +  "dividend",
      +  "split",
      +  "insider",
      +  "analyst",
      +  "earnings"
      +]
  3. Changed12 schema fields changed
    • changedInput schema / properties / channel / description
      Previous value: -"Delivery channel."New value: +"Delivery channel. `slack` is reserved and returns `501`."
    • changedInput schema / properties / device_id / description
      Previous value: -"Registered device id from the mobile app (channel 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`."
    • changedInput schema / properties / discord_url / description
      Previous value: -"Discord incoming-webhook URL (channel discord)."New value: +"Discord incoming-webhook URL. 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 / event_q / description
      Previous value: -"Optional event-CONTENT filter over (ticker, ts, kind, payload jsonb) — only those four identifiers, e.g. payload->>'firm' = 'Goldman Sachs' AND payload->>'action' = 'downgrades'."New value: +"Optional event-CONTENT filter in the `/v2/events` grammar — only `ticker`, `ts`, `kind`, `payload` may appear. Composes with `q`."
    • changedInput schema / properties / kinds / description
      Previous value: -"Comma list of kinds to fire on — any of: dividend, split, insider, analyst (e.g. \"split,analyst\"). NOTE: no enum here on purpose — a scalar enum would reject multi-kind values."New value: +"Event kinds to fire on — array or comma list."
    • addedInput schema / properties / kinds / enum
      Added value: +[
      +  "earnings",
      +  "dividend",
      +  "split",
      +  "insider",
      +  "analyst"
      +]
    • changedInput schema / properties / name / description
      Previous value: -"Display name."New value: +"Display name. Defaults to `events: <kinds> · <scope>`."
    • changedInput schema / properties / q / description
      Previous value: -"Optional row-STATE filter evaluated against the event's ticker at fire time, e.g. market_cap > 1e10."New value: +"Optional row-STATE filter evaluated against the event's ticker at fire time. Same grammar as scan `q`; custom signals are expanded and frozen at creation."
    • changedInput schema / properties / target_url / description
      Previous value: -"HTTPS delivery URL. Omit for in-app delivery."New value: +"HTTPS delivery URL; or use `channel` + `discord_url`/`device_id`. Omit for in-app."
    • addedInput schema / properties / ticker
      Added value: +{
      +  "description": "Single-symbol shorthand for `tickers`.",
      +  "type": "string"
      +}
    • changedInput schema / properties / tickers / description
      Previous value: -"Scope to specific tickers (comma list, max 50). Mutually exclusive with universe; omit both for all tickers."New value: +"Scope to specific tickers (max 50). Mutually exclusive with `universe` — and with the singular alias `ticker` (sending both is a 400). Omit both for all tickers."
    • changedInput schema / properties / universe / description
      Previous value: -"Scope to a universe slug (top_10, top_100, or a saved one)."New value: +"Scope to a universe slug (`top_10`, `top_100`, or one of yours). `universe_id` accepted as an alias."
  4. Changed1 schema field changed
    • removedInput schema / properties / cadence
      Removed value: -{
      -  "description": "Evaluation cadence. Default realtime; hourly/nyse_open throttle. (`1m` accepted as a deprecated alias of realtime.)",
      -  "enum": [
      -    "realtime",
      -    "hourly",
      -    "nyse_open"
      -  ],
      -  "type": "string"
      -}
  5. Changed3 schema fields changed
    • addedInput schema / properties / cadence
      Added value: +{
      +  "description": "Evaluation cadence. Default realtime; hourly/nyse_open throttle. (`1m` accepted as a deprecated alias of realtime.)",
      +  "enum": [
      +    "realtime",
      +    "hourly",
      +    "nyse_open"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / channel / enum
      Previous value: -[
      -  "webhook",
      -  "in_app",
      -  "discord",
      -  "mobile_push"
      -]New value: +[
      +  "webhook",
      +  "discord",
      +  "in_app",
      +  "mobile_push"
      +]
    • changedInput schema / properties / device_id / description
      Previous value: -"Registered device id (channel mobile_push)."New value: +"Registered device id from the mobile app (channel mobile_push)."
  6. Added

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral burden. It discloses the push model, paid-plan restriction, the distinction between ticker STATE and EVENT payload filters, and that latency follows the ingest cadence rather than being sub-minute. Retries, auth, and rate limits are not covered, but the key operational traits are present.

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 dense sentences with the core push behavior front-loaded, followed by the pricing constraint and the subtle q/event_q and latency distinctions. Every sentence earns its place with no filler.

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

Completeness5/5

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

For an 11-parameter subscription tool with a full input schema and an output schema, the description covers the non-obvious behavior an agent would need: push semantics, paid-plan requirements, filter semantics, and delivery latency. Nothing needed to invoke it correctly is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds value by disambiguating `q` ('filters the ticker STATE') from `event_q` ('filters the EVENT payload in the /v2/events grammar') and by explaining latency in a way the schema does not.

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?

Opens with 'Push new events: we POST your endpoint when events of the kinds you chose land in the archives,' which names a specific verb, resource, and triggering condition. This clearly distinguishes it from sibling scan/signal/ticker subscription tools by focusing on event-kind delivery.

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

Usage Guidelines4/5

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

The description sets a concrete precondition with 'Webhooks need a paid plan (Free has no webhook slots)' and clarifies two filtering modes via `q` vs `event_q`. It does not explicitly name sibling subscribe_scan/subscribe_signal/subscribe_ticker, so exclusions remain implied rather than stated.

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.