Skip to main content
Glama

Ticker news feed

alphai_ticker_news
Read-onlyIdempotent

Latest news for a single ticker (e.g. 'AAPL'). Cursor-paginated; returns the same shape (incl. the full inline AI analysis) as alphai_news_search. Insider news (SEC Form 4 insider trades) for the ticker is included by default — pass include_insider=false for a pure non-insider feed. min_relevance works exactly as in alphai_news_search (default 4, the full feed) — raise it to keep only what the enricher scored as material for this ticker. Set collapse_stories=true to get one row per story instead of every syndicated reprint. Sets unknown_ticker=true only for an unrecognized symbol string; a delisted symbol serves its history with delisted=true and renamed_to set when the company continues under a new ticker (querying the new ticker includes rows still tagged with the former one). Any share class of an issuer also serves rows tagged with its other listed classes (GOOGL includes rows tagged GOOG). Crypto is addressed as -USD (BTC-USD); a bare coin name nothing else owns resolves to it automatically, and when the bare string belongs to a stock/ETF instead (BTC is the Grayscale ETF), ticker_note names the coin ticker to request.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sortNopublished (default): newest first. ingested: delta polling — only rows added since your cursor, ascending; next_cursor is always returned (empty items = caught up, keep the cursor and poll later). A cursor only works with the sort mode that issued it.
limitNoAlias for page_size.
cursorNoOpaque cursor from a prior next_cursor.
tickerYesTicker symbol, e.g. 'AAPL'.
page_sizeNoItems/page; capped at 20 Free/Basic, 50 Pro.
min_relevanceNoMinimum AI relevance score, 1-10.
include_insiderNoInclude SEC Form 4 insider news; default true.
collapse_storiesNoCollapse syndicated reprints to one representative per story and populate story_id/sources_count/sources (default false).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
countNo
itemsNo
delistedNo
renamed_toNo
next_cursorNo
ticker_noteNo
unknown_tickerNo
query_interpretationNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / cursor / anyOf
      Previous value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maxLength": 1024,
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • addedInput schema / properties / ticker / maxLength
      Added value: +16
    • addedInput schema / properties / ticker / pattern
      Added value: +"^[A-Za-z0-9.\\-]+$"
  2. Changed1 schema field changed
    • changedOutput schema / properties / query_interpretation / anyOf
      Previous value: -[
      -  {
      -    "description": "How ``alphai_news_search`` read a free-text ``query`` — the echo that makes\na resolver miss legible. Before it, a query read as the wrong company or\ndiscarded entirely came back indistinguishable from a hit\n(issues/2026-08-16-freetext-query-resolves-jane-street-to-janl.md).\n\n``mode``: ``resolved`` — at least one query word became a filter that is\napplied to the items; ``overridden`` — the query resolved, but explicit\n``tickers``/``category`` replaced every filter it produced; ``unresolved`` —\nno query word matched a ticker, company name or topic word, so the items\nare NOT matches for the query (``note`` says what they are instead).\n``ignored_terms`` lists the content words that matched nothing; stopwords\nare dropped silently. ``note`` is one or two plain sentences an agent can act\non, same role as ``ticker_note``.",
      -    "properties": {
      -      "category": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null
      -      },
      -      "category_term": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null
      -      },
      -      "ignored_terms": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "mode": {
      -        "enum": [
      -          "resolved",
      -          "overridden",
      -          "unresolved"
      -        ],
      -        "type": "string"
      -      },
      -      "note": {
      -        "default": "",
      -        "type": "string"
      -      },
      -      "search": {
      -        "anyOf": [
      -          {
      -            "description": "How the text search read the query (docs/HYBRID_NEWS_SEARCH_PLAN.md\nstep 2): ``strict`` = every term required; ``broadened`` = fewer strict\nmatches than the threshold, so any rare term plus at least two of the\nterms; ``no_match``; ``no_terms``. ``sort`` is ``published`` when every\nterm is a very common word (newest matches, not best). ``terms`` are the\nnormalized (stemmed) lexemes the index holds. ``matched`` counts the\nvisible matches inside the bounded candidate set, never a global total.",
      -            "properties": {
      -              "engine": {
      -                "default": "postgres",
      -                "enum": [
      -                  "postgres",
      -                  "meilisearch"
      -                ],
      -                "type": "string"
      -              },
      -              "matched": {
      -                "default": 0,
      -                "type": "integer"
      -              },
      -              "mode": {
      -                "enum": [
      -                  "strict",
      -                  "broadened",
      -                  "no_match",
      -                  "no_terms"
      -                ],
      -                "type": "string"
      -              },
      -              "optional_terms": {
      -                "items": {
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              },
      -              "required_terms": {
      -                "items": {
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              },
      -              "sort": {
      -                "enum": [
      -                  "relevance",
      -                  "published"
      -                ],
      -                "type": "string"
      -              },
      -              "terms": {
      -                "items": {
      -                  "type": "string"
      -                },
      -                "type": "array"
      -              },
      -              "window_from": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "default": null
      -              }
      -            },
      -            "required": [
      -              "mode",
      -              "sort"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null
      -      },
      -      "tickers": {
      -        "items": {
      -          "description": "One ticker a free-text ``query`` resolved to (docs/HYBRID_NEWS_SEARCH_PLAN.md\nstep 1). ``name`` is the issuer's registered name, so an agent can see that\n\"PMI\" was read as Picard Medical rather than the ISM purchasing-managers\nindex; ``term`` is the query word that produced it (share-class siblings\ninherit the seed word's term).",
      -          "properties": {
      -            "name": {
      -              "anyOf": [
      -                {
      -                  "type": "string"
      -                },
      -                {
      -                  "type": "null"
      -                }
      -              ],
      -              "default": null
      -            },
      -            "term": {
      -              "type": "string"
      -            },
      -            "ticker": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "ticker",
      -            "term"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "mode"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "How ``alphai_news_search`` read a free-text ``query`` — the echo that makes\na resolver miss legible. Before it, a query read as the wrong company or\ndiscarded entirely came back indistinguishable from a hit\n(issues/2026-08-16-freetext-query-resolves-jane-street-to-janl.md).\n\n``mode``: ``searched`` — the text search served the items\n(``NEWS_SEARCH_MODE=on``, the normal state since 2026-09-23): ``search``\nsays what selected them, ``tickers``/``category`` only say what the words\nwere ALSO read as (reference, never a filter) and ``ignored_terms`` is\nempty, because nothing was ignored — the whole text was searched. Before\nthis (review finding 1a/1b, 2026-09-23) the text path echoed the\nresolver's ``resolved`` + its ``ignored_terms`` next to a ``search`` block\nwhose ``terms`` were those very words, and a read category looked applied\nwhile nothing but the text filtered the items. The resolver modes describe\nthe fallback when the text search is switched off: ``resolved`` — at least\none query word became a filter that is applied to the items;\n``overridden`` — the query resolved, but explicit ``tickers``/``category``\nreplaced every filter it produced; ``unresolved`` — no query word matched a\nticker, company name or topic word, so the items are NOT matches for the\nquery (``note`` says what they are instead). ``ignored_terms`` then lists\nthe content words that matched nothing; stopwords are dropped silently.\n``note`` is one or two plain sentences an agent can act on, same role as\n``ticker_note``.",
      +    "properties": {
      +      "category": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null
      +      },
      +      "category_term": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null
      +      },
      +      "ignored_terms": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "mode": {
      +        "enum": [
      +          "searched",
      +          "resolved",
      +          "overridden",
      +          "unresolved"
      +        ],
      +        "type": "string"
      +      },
      +      "note": {
      +        "default": "",
      +        "type": "string"
      +      },
      +      "search": {
      +        "anyOf": [
      +          {
      +            "description": "How the text search read the query (docs/HYBRID_NEWS_SEARCH_PLAN.md\nstep 2): ``strict`` = every term required; ``broadened`` = fewer strict\nmatches than the threshold, so the most common words were dropped first\nand every item carries at least two of the terms; ``no_match``;\n``no_terms``. ``sort`` is ``published`` when every term is a very common\nword (newest matches, not best). ``terms`` are the normalized words that\nwere searched. ``required_terms`` is filled only when the search reports\nwhich words every broadened row had to carry (the Postgres path does, the\nengine does not) — ``search_match.terms_matched`` on each item is the\ncount to trust. ``matched`` counts the visible matches inside the bounded\ncandidate set, never a global total. Which engine answered is NOT part of\nthe contract: it goes to the search log (``ranking_version``). The\n``engine`` field that shipped with 1.41.0 was read by an external review\nas an implementation leak, and it was one — a client has no action on\n\"meilisearch\" (issues/2026-09-23-news-search-review-triage.md).",
      +            "properties": {
      +              "matched": {
      +                "default": 0,
      +                "type": "integer"
      +              },
      +              "mode": {
      +                "enum": [
      +                  "strict",
      +                  "broadened",
      +                  "no_match",
      +                  "no_terms"
      +                ],
      +                "type": "string"
      +              },
      +              "optional_terms": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "required_terms": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "sort": {
      +                "enum": [
      +                  "relevance",
      +                  "published"
      +                ],
      +                "type": "string"
      +              },
      +              "terms": {
      +                "items": {
      +                  "type": "string"
      +                },
      +                "type": "array"
      +              },
      +              "window_from": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "default": null
      +              }
      +            },
      +            "required": [
      +              "mode",
      +              "sort"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null
      +      },
      +      "tickers": {
      +        "items": {
      +          "description": "One ticker a free-text ``query`` resolved to (docs/HYBRID_NEWS_SEARCH_PLAN.md\nstep 1). ``name`` is the issuer's registered name, so an agent can see that\n\"PMI\" was read as Picard Medical rather than the ISM purchasing-managers\nindex; ``term`` is the query word that produced it (share-class siblings\ninherit the seed word's term).",
      +          "properties": {
      +            "name": {
      +              "anyOf": [
      +                {
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ],
      +              "default": null
      +            },
      +            "term": {
      +              "type": "string"
      +            },
      +            "ticker": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "ticker",
      +            "term"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      }
      +    },
      +    "required": [
      +      "mode"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed2 schema fields changed
    • addedOutput schema / properties / items / items / properties / search_match
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Per-item evidence from the text path: ``score`` orders the page (cover\ndensity × recency; comparable within one response, not a probability),\n``terms_matched`` is set in broadened mode, ``context`` marks the matched\nwords in the summary with ``**``.",
      +      "properties": {
      +        "context": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "score": {
      +          "type": "number"
      +        },
      +        "terms_matched": {
      +          "anyOf": [
      +            {
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        }
      +      },
      +      "required": [
      +        "score"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedOutput schema / properties / query_interpretation
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "How ``alphai_news_search`` read a free-text ``query`` — the echo that makes\na resolver miss legible. Before it, a query read as the wrong company or\ndiscarded entirely came back indistinguishable from a hit\n(issues/2026-08-16-freetext-query-resolves-jane-street-to-janl.md).\n\n``mode``: ``resolved`` — at least one query word became a filter that is\napplied to the items; ``overridden`` — the query resolved, but explicit\n``tickers``/``category`` replaced every filter it produced; ``unresolved`` —\nno query word matched a ticker, company name or topic word, so the items\nare NOT matches for the query (``note`` says what they are instead).\n``ignored_terms`` lists the content words that matched nothing; stopwords\nare dropped silently. ``note`` is one or two plain sentences an agent can act\non, same role as ``ticker_note``.",
      +      "properties": {
      +        "category": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "category_term": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "ignored_terms": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "mode": {
      +          "enum": [
      +            "resolved",
      +            "overridden",
      +            "unresolved"
      +          ],
      +          "type": "string"
      +        },
      +        "note": {
      +          "default": "",
      +          "type": "string"
      +        },
      +        "search": {
      +          "anyOf": [
      +            {
      +              "description": "How the text search read the query (docs/HYBRID_NEWS_SEARCH_PLAN.md\nstep 2): ``strict`` = every term required; ``broadened`` = fewer strict\nmatches than the threshold, so any rare term plus at least two of the\nterms; ``no_match``; ``no_terms``. ``sort`` is ``published`` when every\nterm is a very common word (newest matches, not best). ``terms`` are the\nnormalized (stemmed) lexemes the index holds. ``matched`` counts the\nvisible matches inside the bounded candidate set, never a global total.",
      +              "properties": {
      +                "engine": {
      +                  "default": "postgres",
      +                  "enum": [
      +                    "postgres",
      +                    "meilisearch"
      +                  ],
      +                  "type": "string"
      +                },
      +                "matched": {
      +                  "default": 0,
      +                  "type": "integer"
      +                },
      +                "mode": {
      +                  "enum": [
      +                    "strict",
      +                    "broadened",
      +                    "no_match",
      +                    "no_terms"
      +                  ],
      +                  "type": "string"
      +                },
      +                "optional_terms": {
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                },
      +                "required_terms": {
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                },
      +                "sort": {
      +                  "enum": [
      +                    "relevance",
      +                    "published"
      +                  ],
      +                  "type": "string"
      +                },
      +                "terms": {
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                },
      +                "window_from": {
      +                  "anyOf": [
      +                    {
      +                      "type": "string"
      +                    },
      +                    {
      +                      "type": "null"
      +                    }
      +                  ],
      +                  "default": null
      +                }
      +              },
      +              "required": [
      +                "mode",
      +                "sort"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "tickers": {
      +          "items": {
      +            "description": "One ticker a free-text ``query`` resolved to (docs/HYBRID_NEWS_SEARCH_PLAN.md\nstep 1). ``name`` is the issuer's registered name, so an agent can see that\n\"PMI\" was read as Picard Medical rather than the ISM purchasing-managers\nindex; ``term`` is the query word that produced it (share-class siblings\ninherit the seed word's term).",
      +            "properties": {
      +              "name": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "default": null
      +              },
      +              "term": {
      +                "type": "string"
      +              },
      +              "ticker": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "ticker",
      +              "term"
      +            ],
      +            "type": "object"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "required": [
      +        "mode"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
  4. Changed1 schema field changed
    • addedOutput schema / properties / items / items / properties / filing
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Structured SEC 8-K filing block (``source_type == \"sec_form8k\"`` items on\nthe news tools).\n\nA read-only projection of the 8-K sidecar\n(``apps.data.models.EightKEventModel``) — same fields and semantics as the\nREST ``/api/news/`` block (openapi.yaml: ``EightKFiling``): ``items`` is\nevery item code the filing carries (the ``item`` filter matches any of\nthem; empty for a header-only filing), ``primary_item`` the one that drove\nthe category, ``accession_number`` the id to cite, ``filed_at`` EDGAR's\nacceptance time, ``event_date`` the filing's own date of report and\n``exhibit_url`` the press-release exhibit the summary was built from.\nDates are ISO strings like the insider block; empty sidecar strings are\n``null``, never ``\"\"``.",
      +      "properties": {
      +        "accession_number": {
      +          "type": "string"
      +        },
      +        "event_date": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "exhibit_url": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "filed_at": {
      +          "type": "string"
      +        },
      +        "items": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "primary_item": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        }
      +      },
      +      "required": [
      +        "items",
      +        "accession_number",
      +        "filed_at"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
  5. Changed11 schema fields changed
    • addedInput schema / properties / min_relevance
      Added value: +{
      +  "default": 4,
      +  "description": "Minimum AI relevance score, 1-10.",
      +  "maximum": 10,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedInput schema / properties / page_size / description
      Previous value: -"Items/page; capped at 10 Basic / 50 Pro."New value: +"Items/page; capped at 20 Free/Basic, 50 Pro."
    • addedInput schema / properties / sort
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "published",
      +        "ingested"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "published (default): newest first. ingested: delta polling — only rows added since your cursor, ascending; next_cursor is always returned (empty items = caught up, keep the cursor and poll later). A cursor only works with the sort mode that issued it."
      +}
    • addedOutput schema / properties / delisted
      Added value: +{
      +  "default": false,
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / items / items / properties / created_at
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / items / items / properties / earnings
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedOutput schema / properties / items / items / properties / insider
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "Structured SEC Form 4 event block (``alphai_insider_news`` items only).\n\nAggregate of the news row's whole transaction group — same semantics as the\nREST ``/api/news/insider/`` block (openapi.yaml: ``InsiderEvent``): shares and\nvalue are GROUP sums (a 10b5-1 ladder is one event), ``avg_price_usd`` is\nvalue-weighted over priced tranches, ``is_10b5_1`` is the group OR, the\nlast fill dates the event. ``side`` is the signal label: buy (P) / sell (S)\n/ other (everything else, incl. D — sale to issuer, a buyback/redemption,\nnot an open-market disposition); the raw ``transaction_code`` rides along.\nMoney/share fields are decimal STRINGS (\"25000\", \"187.32\") — flat, precise,\nschema-simple; null when the filing prices no tranche.\n\n``filed_at`` is when EDGAR accepted the filing and ``late_filing`` marks the\nones that missed the SEC's two-business-day deadline; the rule lives in\n``_is_late_filing`` in ``repository.py`` (ported from the backend's\n``apps.insider.services.filing_lateness``). Field reference for both\nsurfaces: ``backend/openapi.yaml`` (``InsiderEvent``).",
      +      "properties": {
      +        "avg_price_usd": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "filed_at": {
      +          "type": "string"
      +        },
      +        "insider_name": {
      +          "type": "string"
      +        },
      +        "insider_title": {
      +          "type": "string"
      +        },
      +        "is_10b5_1": {
      +          "type": "boolean"
      +        },
      +        "is_director": {
      +          "type": "boolean"
      +        },
      +        "is_officer": {
      +          "type": "boolean"
      +        },
      +        "is_ten_percent_owner": {
      +          "type": "boolean"
      +        },
      +        "late_filing": {
      +          "type": "boolean"
      +        },
      +        "shares": {
      +          "type": "string"
      +        },
      +        "side": {
      +          "type": "string"
      +        },
      +        "total_value_usd": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null
      +        },
      +        "transaction_code": {
      +          "type": "string"
      +        },
      +        "transaction_date": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "side",
      +        "transaction_code",
      +        "shares",
      +        "is_10b5_1",
      +        "insider_name",
      +        "insider_title",
      +        "is_officer",
      +        "is_director",
      +        "is_ten_percent_owner",
      +        "transaction_date",
      +        "filed_at",
      +        "late_filing"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedOutput schema / properties / items / items / properties / source_type
      Added value: +{
      +  "default": "",
      +  "type": "string"
      +}
    • changedOutput schema / properties / items / items / required
      Previous value: -[
      -  "uid",
      -  "title",
      -  "url",
      -  "source",
      -  "source_domain",
      -  "summary",
      -  "category",
      -  "relevance_score",
      -  "time_published"
      -]New value: +[
      +  "uid",
      +  "title",
      +  "url",
      +  "source",
      +  "source_domain",
      +  "summary",
      +  "category",
      +  "relevance_score",
      +  "time_published",
      +  "created_at"
      +]
    • addedOutput schema / properties / renamed_to
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
    • addedOutput schema / properties / ticker_note
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
  6. Changed2 schema fields changed
    • addedInput schema / properties / limit
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 50,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Alias for page_size."
      +}
    • changedInput schema / properties / page_size / description
      Previous value: -"Items/page. 10 Basic / 50 Pro (tools.bulk)."New value: +"Items/page; capped at 10 Basic / 50 Pro."
  7. Changed1 schema field changed
    • changedInput schema / properties / include_insider / description
      Previous value: -"Include insider/13F ownership news; default true."New value: +"Include SEC Form 4 insider news; default true."
  8. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnly and idempotent annotations, the description discloses substantial behavior: cursor-paginated results, identical response shape to alphai_news_search including inline AI analysis, default insider inclusion, delisted/renamed ticker handling, share-class row aggregation, and crypto symbol fallback rules. This gives an agent a detailed mental model of edge cases without needing to call the tool blindly.

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?

The description is dense but every sentence earns its place: the front-loaded purpose statement is followed by pagination, output-shape reuse, insider toggle, relevance filtering, story collapsing, and ticker-resolution edge cases. It avoids fluff and handles a complex tool in a compact, information-rich paragraph.

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 a tool with 8 parameters, an output schema, and many sibling tools, the description covers the important behavioral nuances: pagination shape, AI analysis inclusion, insider default, delisted/renamed/share-class/crypto handling, and unknown-ticker signaling. Combined with the existing output schema and rich parameter descriptions in the schema, nothing critical is missing for an agent to use it correctly.

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 coverage is 100%, so the baseline is 3, but the description adds meaningful semantic context: min_relevance default 4 is described as the full feed and raising it keeps only enricher-scored material, collapse_stories=true is explained as one row per story instead of every syndicated reprint, and include_insider=false is framed as producing a pure non-insider feed. This goes beyond the raw schema, though it does not elaborate on every parameter.

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 description opens with a specific, unambiguous purpose: 'Latest news for a single ticker (e.g. 'AAPL')'. It clearly identifies the resource (one ticker) and the operation (news feed), and implicitly distinguishes itself from broader search or insider-only tools by emphasizing single-ticker scope and the default inclusion of insider news.

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 gives clear context for when to use the tool: whenever you need the latest news for a single ticker. It also provides actionable parameter guidance, such as passing include_insider=false for a pure non-insider feed and raising min_relevance to keep only material stories. It does not explicitly state when to choose sibling tools like alphai_news_search or alphai_insider_news instead, so it stops short of a 5.

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.