A typed decision is only as good as the state you hand it.
Signals turns the events your app already sends into agentic context: what this customer has been doing, as JSON or a short narrative, read in 6ms.
- 6ms p50 serve, in-region
- 2 shapes, JSON or narrative
- Free tier, no card
Below is your own visit to this page, computed by Signals as you read.
Signals, about you
connectingSee live events firing as you browse this page on the left; what Signals computed about you on the right, refreshed every few seconds.
Add the Signals MCP server to Claude Code, Cursor or any MCP client, then run this. The agent adds the SDK, defines the attribute and wires the read into your own app.
$ npx plugins add snowplow/skills
> Use the Snowplow MCP server and Signals skill, then help me plan and implement a use case. Make sure everything is tested and works as intended.
trackPageView(); // browser tracker, already on this pageAttribute(name="pages_last_5_min", events=["page_view"], aggregation="category_count", property="page_urlpath", period=timedelta(minutes=5))
await signals.getServiceAttributes({ name: "signals_site_session_service", attribute_key: "domain_sessionid", identifier: "…", // your session id, once set });
The state describes your app. It does not describe your customer.
Route, props, cart, nothing else
The customer's last four minutes are in an event stream your code cannot read from a render.
state = { route, cart }Their session, shaped for a model
One call returns what this customer has been doing, as JSON or a narrative.
getAgenticContext()The decision sees the session
The panel, offer or ranking is picked against what is happening right now.
state = { route, cart, session }Four decisions that only work on live state.
Each is a typed question asked on every render. The model does not change the answer. Whether the state describes this visit or last night's does.
Adaptive generative UI
The page composes itself around the job in hand. Give the model what this customer compared, abandoned and came back to, and it picks the components that fit them, not the average visitor.
engagement rate · conversion rateReal-time decisioning
Which offer, flow or message, chosen against what is happening now instead of a segment computed overnight. A rule over the same activity fires the moment the condition is met.
offer acceptance · revenue per sessionIn-session ranking
Results and recommendations reorder against three price filter changes and two failed searches in this visit, not what this customer wanted last week.
click-through · add to cart · search exit rateRouting and triage
Which flow the customer belongs in, when to escalate, and whether the question needs a frontier model at all. The cheapest decision is the one the live state already answers.
escalation rate · cost per conversationDescribe what the model should know. Read it where you decide.
Nothing extra to instrument. Agentic context is the activity you already collect, as JSON for the state object or a narrative for the prompt.
- 01Collect. Add a Snowplow SDK to your app and events start flowing in.
- 02Shape. Choose what belongs in the context, and whether it arrives as JSON or a narrative.
- 03Read. What the customer just did is in the context <1s later. Your code reads it in 6ms p50 from the Node.js or Python SDK, the REST API or the MCP server.
Before you sign up
Does Signals decide anything?
No. Signals computes what the customer is doing and hands it over. Which panel renders, which offer fires and which flow runs is your model's call, in your code.
Which model or framework does it work with?
Any of them. One call over the REST API, the Node.js or Python SDK, or the MCP server returns the context as JSON for a state object or as a string for a prompt.
Why not send the raw event history instead?
Accuracy. TypeSafe's documentation says accuracy falls as state fills with material the question does not need, and to retrieve and filter in code first. Agentic context is that filter, applied before the call.
Do I need an event stream already?
No. Collection is part of Signals. Add a Snowplow SDK and events start flowing. If you already run Snowplow, Signals reads the pipeline you have.
Where does it run?
Managed SaaS, or a private deployment in your own AWS or GCP account. Same architecture either way.
What does the free tier include?
The full product against your own traffic, up to 5 million events a month, with no card and no sales call. You should see an attribute updating in the first session.
Put the session in your next decision.
Add the SDK, define one context, read it from the code that decides what to render. The panel at the top of this page is that call, running against you.
npx plugins add snowplow/skills