toolwhats_new
groupWhat changed
endpointhttps://mcp.steadybase.io/mcp
WHAT IS NEW SINCE I LAST CHECKED. Call it with no arguments for the classic board feed (top 50 board rows). On those rows WHAT IS QUOTABLE is the headline `quote` only when quote_is_quotable is true, with quote_receipt; when it is false, quote_receipt is null and quote_receipt_note says nothing on the row is quotable. `why_it_matters` on a board row is a DERIVED sentence (why_it_matters_is_derived is always true); the verbatim statements with their receipts come from get_signals(ticker), named on the row as verbatim_statement_from. Call it with `since` and it becomes the delta feed: every signal FIRST SEEN since that point, newest first, each row carrying event_key, ticker, company, kind, matched_rule, the verbatim quote, why_it_matters, source_url and page_ref, the receipt link, the signal date, evidence tier, and call_first (the one person to call, identity only, no email or phone). Poll it on a schedule: pass the previous response's `next_since` straight back as `since` and you get exactly what landed in between, with no duplicates and no gaps. When `truncated` is true the page is the OLDEST slice of the backlog and `next_since` is the newest event in it, so polling again immediately walks forward through the backlog; `next_action` says in words which of the two to do. `limit` is a soft cap on that path: a page is never cut in the middle of a group of events sharing one first_seen, because the cursor cannot resume inside one. `since` accepts an ISO timestamp (exclusive, so a cursor never replays its last row), a plain date YYYY-MM-DD (inclusive), or a number of days (7). event_key is the same identity the Slack and webhook push lanes use, so a pushed alert and a pulled row for one signal match by string equality. The feed carries direct-evidence signals and T&E spend-change matches (the grade a human gets told about); use search_signals for the wider inferential corpus. Retention is 30 days. THE LIVE FEED: everything above is the nightly board, so the freshest thing it can say is "last night". Pass feed="events" and the same tool answers from the box's live event log instead: WHAT HAS HAPPENED SINCE MY LAST CURSOR, oldest first, so a polling agent walks forward through it. Each row is event_seq, kind, event_key, occurred_at and payload. kind is one of trigger_hit (a trigger matched something written to your book), live_alert (a trigger matched what was said DURING a call, while the call is still running), clip_ready (the audio for an earlier live_alert has been cut, and the row carries the same alert_id plus the finished clip_url) and account_changed (an account on your book moved). A live_alert payload carries the VERBATIM QUOTE, the trigger it matched, the account, receipt_url and offset_sec, with clip_url null until the clip exists, so the quote always arrives with the receipt that opens it and you quote it as is or not at all. ON THIS FEED `since` IS AN EVENT_SEQ CURSOR, a string of digits, not a timestamp and not a number of days: pass the previous answer's next_cursor straight back and you get exactly what landed after it, because the cursor is EXCLUSIVE, so nothing is replayed and nothing is skipped. Start with no `since` at all, keep next_cursor from every reply, and poll. next_action says in words whether to poll again at once (truncated, there is a backlog) or on your schedule. `kinds` on this feed is that list of four and an unknown one is refused rather than ignored. The envelope stamps feed ("events" here, "board" on every other path) so you can tell the two apart on one key. The tenant is the one your key resolved to and no argument can name another.
arguments
| feed | string | "board" (default) is the nightly board and its delta feed, exactly as it has always answered. "events" is the box's LIVE event log since an event_seq cursor, oldest first, for a polling agent. It is named and never guessed, because `since` is a number of days on the board feed and an event_seq on the events feed and a bare number cannot be told apart. |
| since | string | On the board feed: an ISO timestamp (use the previous response's next_since), a date YYYY-MM-DD, or a number of days like "7"; omit for the classic board feed. On feed="events": an event_seq cursor, a string of digits taken from the previous response's next_cursor, EXCLUSIVE; omit to start at the oldest retained event. A timestamp is refused there rather than guessed at. |
| limit | integer | max rows to return (default 50, hard cap 200). On the board `since` path this is a SOFT cap: a page is never cut inside a group of events sharing one first_seen, because the cursor is a timestamp and could not resume inside one, so such a group comes back whole and a page can exceed limit. On feed="events" the cursor is an event_seq, which can resume anywhere, so the cap is hard. |
| kinds | array | optional filter on kind. On the board feed: "direct" (the company said it) or "te_spend" (a travel and expense spend-change match). On feed="events": "trigger_hit", "live_alert", "clip_ready" or "account_changed"; an unknown one there is refused, never dropped. |
install
claude mcp add --transport http steadybase https://mcp.steadybase.io/mcp --header "Authorization: Bearer $STEADYBASE_KEY"
call
curl -s https://api.steadybase.io/v1/mcp/call -H "Authorization: Bearer $STEADYBASE_KEY" -H "Content-Type: application/json" -d '{"tool":"whats_new"}' contract
| A quote comes with its receipt | Every returned statement carries the verbatim sentence and the URL it came from, and where the source is a transcript, the character offsets inside it. A statement with no receipt is not returned. |
| Empty is an answer | When there is no sourced statement, the skill returns nothing. It does not summarise, infer, or fill the gap from general knowledge. Handle the empty case rather than retrying until something appears. |
| No personal contact data | No email address, phone number, home address or personal social account is returned by any skill, at any tier. A person is a name, a professional role, a LinkedIn profile URL and the public record that puts them in that role. |
| No customer data crosses a key | A tenant-scoped skill reads only that tenant. Nothing about any customer appears on the public site or in another tenant answer. |
/skills/