Sato Hub
MCP

Jupiter Trading MCP + CLI

Jupiter's hosted read-write MCP server: 75 tools across swap, limit/DCA, lend, perps-adjacent prediction, portfolio and token launch on Solana.

  • Sato Score78
  • ChainsSolana
ActiveSelf-ReportedActive · 27d ago

Jupiter Trading MCP + CLI is a partly open-source MCP server by Jupiter on Solana, with last code activity on 2026-10-10 (Active). Latest release on 2026-06-02. Sato Score 78/100 (how open, active and verifiable it is, not a safety grade), as of 2026-11-07. How the score works →

See how to install Jupiter Trading MCP + CLI →

Last commit Oct 10, 2026 · Last release Jun 2, 2026 · ★ 66

Listed from developers.jup.ag on 2026-09-23. Install: reproduced by Sato Hub on 2026-11-02. Evidence →

Next step

Watch Jupiter Trading MCP + CLI

One email if what we observe changes — its repo goes quiet or disappears, or the listing is retired. Nothing else.

Check it from your agent

Add Sato Hub’s MCP server (no key), then ask:

https://satohub.ai/api/mcp
Run Sato Hub Preflight on jup-ag/cli before I use it.
Full setup: Claude Code, Cursor, others →

Your project?

Prove you control the domain and correct this page — description, links, tags, chains. A claim proves control, not verification: it never changes the Sato Score.

Claim this listing →

Overview

Jupiter's July 21, 2026 changelog introduced a hosted Trading MCP server for AI agents (https://developers.jup.ag/changelog). According to Jupiter's llms.txt, it runs at https://mcp.jup.ag over Streamable HTTP and exposes 75 tools across 11 domains: Swap, Tokens, Price, Trigger, Recurring, Lend, Prediction, Portfolio, Send, Studio and Transaction. It works without a key at a lower rate limit, and a Jupiter API key passed as a Bearer token raises it (https://developers.jup.ag/docs/ai). Jupiter also ships an LLM-friendly CLI (npm i -g @jup-ag/cli, GPL-3.0, https://github.com/jup-ag/cli), a read-only Docs MCP and agent skills in jup-ag/agent-skills.

Sato Score

78/100· High

How open, active & verifiable — not a safety or returns grade.

Maintenance & liveness
35/35
Code transparency
14/20
Interface verifiability
10/10
Docs & demo
6/10
Listing transparency & provenance
13/15
Independent verification
0/10

Deploy path reproduced — install verified in an isolated container (proves installability, not runtime safety).

Sato Check

v0.10.1 · as of 2026-10-02
Does it take your key?
No key read found
Does your key leave?
Not observed
Can it move funds on its own?
27 actions
Full profile, evidence and limits →

A profile describes what we read and ran, with dates. It is not a safety rating, an audit or an endorsement, and "not found" is not "not there".

Evidence — listed vs checked · what the words mean

Listed from developers.jup.ag on 2026-09-23. Install: reproduced by Sato Hub on 2026-11-02.

ClaimValueEvidenceSourceChecked
Chains supportedSolanaself-reporteddevelopers.jup.agas of 2026-11-07
Verification statusSelf-Reported — not independently reviewedself-reporteddevelopers.jup.agas of 2026-11-07
Recent activitylast release 2026-06-02 · last commit 2026-10-10observedgithub.com/jup-ag/cli2026-11-07
Install worksreproduced — install and entry both completedshows the install path works as written; not a statement about runtime behaviour✓ reproducedgithub.com/jup-ag/cli2026-11-02
MCP endpoint answersanswered — 77 tools listedobservedmcp.jup.ag2026-11-07
Daily check record40 of 45 daily checks since 2026-09-23 succeededa success rate of our checks, not uptime; the source is this listing's own historyobserved—2026-11-06
Takes your keyno private-key read found in what we readtracedsatohub.ai2026-10-02
Key leaves the machinenot observed during install and start-uplater or triggered code paths are not coveredobservedsatohub.ai2026-10-02
Moves funds on its own27 actions can sign or send fundstracedsatohub.ai2026-10-02
Built byJupiterconfidence 0.80self-reporteddevelopers.jup.agas of 2026-09-30
Deploys asHosted, Local CLIconfidence 0.85self-reporteddevelopers.jup.agas of 2026-09-30
Tagssolana, dex, swap, mcp, cli, skills, dca, lending, limit-orders, prediction-mar…confidence 0.80self-reporteddevelopers.jup.agas of 2026-09-30
Sato Score78/100 (High)how open, active and verifiable — not a safety or quality gradecomputedsatohub.ai2026-11-07

Self-reported rows are the project’s own words, dated when we recorded them — not a check. Only reproduced and reviewed rows carry a mark. None of these rows is a safety or quality rating.

Install — reproduced in a container Nov 2, 2026

Runtime: Node.js (CLI) — Jupiter's MCP server is hosted at https://mcp.jup.ag

npm i -g @jup-ag/cli
jup --help   # every command is non-interactive; add --dry-run to a transacting command to get the unsigned transaction instead of submitting it

You supply: A Solana key for transacting commands (`jup keys add <name>` generates or imports one) — reads need none, Pre-v1 (early alpha) per the README: breaking changes may land without warning

MCP invocation: https://mcp.jup.ag

Read from the project’s own docs as of 2026-11-02. What a deploy spec is →

Tool inventory — 77 tools, probed live 2026-11-07

  • tokens_search — Search for Solana tokens by name, symbol, or mint address. Returns token metadata including mint address, symbol, decimals, and logo. Use this when the user wants to look up, discover, or identify a t
  • tokens_list_by_tag — List tokens filtered by tag: 'lst' (liquid staking tokens) or 'verified' (Jupiter-verified tokens). Returns the full set of matching tokens with metadata.
  • tokens_list_by_category — List trending or top-performing tokens by category and time window. Categories: 'toporganicscore', 'toptraded', 'toptrending'. Intervals: '5m', '1h', '6h', '24h'. Returns up to 100 tokens ranked by th
  • tokens_list_recent — List the most recently added tokens on Jupiter. Useful for discovering newly launched tokens.
  • tokens_get_verification_eligibility — Check whether a token is eligible for Jupiter VRFD express verification and metadata updates. Returns whether the token exists on-chain, is already verified, and whether a verification request or meta
  • tokens_build_verification_payment — Build the unsigned Solana transaction that pays 1000 JUP for Jupiter VRFD express verification, either directly in JUP or by swapping from SOL, USDC, or JUPUSD (paymentCurrency). Use this after confir
  • tokens_execute_verification — Submit the signed 1000 JUP payment transaction (paid in JUP, SOL, USDC, or JUPUSD) to complete Jupiter VRFD express verification. Records the payment, creates a verification request, and optionally su
  • price_get — Fetch current USD prices for one or more Solana tokens by their mint addresses (comma-separated, max 50). Returns price, liquidity, and 24h change. Use this when the user asks how much a token is wort
  • trigger_get_challenge — Step 1 of Trigger Order authentication: request a challenge to sign with the user's wallet. Returns a message (standard wallets) or a base64 transaction (hardware wallets) that expires in 5 minutes. W
  • trigger_verify_challenge — Step 2 of Trigger Order authentication: submit the signed challenge from trigger_get_challenge to receive a JWT. By default the response holds a single token valid for 24 hours. With authMode access_r
  • trigger_refresh_token — Exchange a Trigger refresh token for a new 15-minute accessToken and a new refreshToken, without asking the wallet to sign again. Use this when a Trigger access token from authMode access_refresh has
  • trigger_get_vault — Retrieve the Privy-managed vault associated with the authenticated wallet. The vault holds deposits for trigger orders. Returns 'Vault not found' if none exists yet; call trigger_register_vault to cre
  • trigger_register_vault — Create a Privy-managed vault wallet for the authenticated account. Call this once per wallet before depositing; it is idempotent (subsequent calls return the existing vault), so there is no need to ch
  • trigger_build_deposit — Build an unsigned transaction to deposit tokens from the wallet into its trigger vault: the first step of creating a trigger order. The orderSubType must match the order you will create (single, oco,
  • trigger_create_order — Create a price trigger (limit) order. Submits the signed deposit on-chain and activates the order. Use this when the user wants a limit order, take-profit, stop-loss, or trailing stop. Required for si
  • trigger_update_order — Update the trigger price, trailing stop distance, slippage, or take-profit/stop-loss of an existing open trigger order in place. No new deposit is needed. Only valid while the order is open.
  • trigger_build_cancel — Step 1 of cancelling a trigger order: returns an unsigned withdrawal transaction and a requestId. The order immediately stops filling. WORKFLOW: Sign the returned transaction, then pass it and the req
  • trigger_confirm_cancel — Step 2 of cancelling a trigger order: submit the signed withdrawal transaction from trigger_build_cancel to complete the cancellation and return the funds to the wallet. If the step is interrupted, re
  • trigger_list_orders — List the authenticated wallet's trigger (limit) orders, active or past, with their state and event history. Use this when the user wants to see their limit orders or check an order's status. Filter by
  • recurring_build_order — Set up a recurring DCA (Dollar Cost Average) order using the latest Trigger V2 DCA deposit flow. Use this when the user wants to auto-buy, schedule recurring purchases, DCA into a token, or dollar cos
  • recurring_build_cancel — Initiate cancellation of an active recurring DCA order using the latest Trigger V2 DCA flow. This first step is one-way: it moves the order into withdrawal, stops future fills immediately, and cannot
  • recurring_execute — Finalize a signed recurring DCA transaction using the latest Trigger V2 DCA flow. For order creation, pass jwt, requestId, signedTransaction, and the same DCA parameters used in recurring_build_order.
  • recurring_list_orders — List a wallet's recurring DCA orders using the latest Trigger V2 DCA history endpoint. Use this when the user wants to see their active DCA orders, recurring buy history, or check what they're dollar
  • recurring_get_order — Retrieve one recurring DCA order by id with its full fill history: rounds filled and remaining, amount per round, output received so far, next and last fill times, state, Earn While You Wait yield (jl
  • lend_build_deposit — Deposit tokens into Jupiter Lend/Earn to earn yield (token-denominated). Use this when the user wants to lend tokens, earn interest, earn yield, or deposit into Jupiter lending. Well-known mints — SOL
  • lend_build_withdraw — Withdraw tokens from Jupiter Lend/Earn (token-denominated). Use this when the user wants to withdraw, pull out, or remove tokens from Jupiter lending. Well-known mints — SOL: So11111111111111111111111
  • lend_build_mint_shares — Deposit into Jupiter Lend/Earn by specifying a number of vault shares to mint (share-denominated). Use this when the user wants to deposit by share count rather than token amount. For depositing by to
  • lend_build_redeem_shares — Withdraw from Jupiter Lend/Earn by redeeming vault shares (share-denominated). Use this when the user wants to withdraw by share count rather than token amount. For withdrawing by token amount, use le
  • lend_get_deposit_instructions — Advanced: get raw Solana instructions for a Jupiter Lend/Earn deposit so you can assemble a custom transaction. Only use this when the caller explicitly needs individual instructions rather than a rea
  • lend_get_withdraw_instructions — Advanced: get raw Solana instructions for a Jupiter Lend/Earn withdrawal so you can assemble a custom transaction. Only use this when the caller explicitly needs individual instructions rather than a
  • lend_get_mint_instructions — Advanced: get raw Solana instructions for a share-denominated Jupiter Lend/Earn deposit (mint) so you can assemble a custom transaction. Only use this when the caller explicitly needs individual instr
  • lend_get_redeem_instructions — Advanced: get raw Solana instructions for a share-denominated Jupiter Lend/Earn withdrawal (redeem) so you can assemble a custom transaction. Only use this when the caller explicitly needs individual
  • lend_list_tokens — List all tokens available for Jupiter Lend/Earn with their current APY rates, supply limits, and conversion rates. Use this when the user wants to browse lending options, compare APY rates, see what t
  • lend_get_positions — Retrieve active Jupiter Lend/Earn positions for one or more wallets. Use this when the user wants to see what they have deposited in Jupiter lending, their lending positions, or lending balances. Retu
  • lend_get_earnings — Calculate accumulated earnings and yield from Jupiter Lend/Earn positions. Use this when the user wants to see how much interest or yield they've earned from lending. Returns net earnings per position
  • lend_list_borrow_vaults — List Jupiter Lend Borrow vaults: each pairs a collateral (supply) token with a debt (borrow) token, with max LTV, liquidation threshold, rates, and available liquidity. Use this when the user wants to
  • lend_get_borrow_positions — Retrieve Jupiter Lend Borrow positions (collateralized loans) for one or more wallets. Use this when the user wants to see their loans, debt, collateral, or liquidation status on Jupiter Lend. Each po
  • lend_build_borrow_operate — Build an unsigned transaction to open or manage a Jupiter Lend Borrow position: deposit collateral, borrow, repay debt, or withdraw collateral. Use this when the user wants to borrow against their tok
  • lend_get_borrow_operate_instructions — Advanced: get raw Solana instructions and address lookup tables for a Jupiter Lend Borrow action (deposit collateral, borrow, repay, withdraw) so you can compose a custom v0 transaction. Only use this
  • prediction_search_events — Search prediction market events by keyword query (e.g., 'bitcoin price', 'election'). Returns matching events. Use this when looking for a specific topic rather than browsing with prediction_list_even
  • prediction_list_events — List prediction market events (questions/topics users can bet on). Filter by provider (bisonfi for Jupiter Forecast), category, subcategory, tags, or a named filter (new, live, trending, upcoming), an
  • prediction_get_event — Retrieve full details for a single prediction market event including its category, trading volume, close condition, timing, and rules. Set includeMarkets to also return its yes/no markets in the same
  • prediction_list_markets — List the yes/no betting markets within a specific prediction event. Each event can have multiple markets with different outcomes. Use this when the user wants to see what markets are available under a
  • prediction_get_market — Retrieve details for a single prediction market including its status, result (if resolved), open/close times, and resolution timestamp.
  • prediction_get_orderbook — Retrieve the current orderbook (bid/ask depth) for a prediction market. Use this when the user wants to see current prices, spread, or liquidity for a prediction market. Available for Polymarket and K
  • prediction_build_order — Place a bet on a prediction market outcome (YES or NO). Use this when the user wants to bet, wager, or take a position on a prediction market. To BUY: set isBuy true and specify the marketId, the side
  • prediction_execute_order — Submit a signed prediction market order transaction (buy, sell, or close) for on-chain execution and return its status and signature. PREREQUISITE: Call prediction_build_order, prediction_build_close_
  • prediction_list_orders — List prediction market orders placed by a wallet. Paginated with start/end. Each order includes its market and status. Returns order public keys usable with prediction_get_order or prediction_get_orde
  • prediction_get_order — Retrieve full details for a single prediction market order including fill status, side (yes/no), buy/sell direction, contracts, average fill price, and settlement status.
  • prediction_get_order_status — Check the on-chain execution status of a prediction market order. Returns the latest status, transaction signatures, and a chronological history of status changes. Use this to track whether an order h
  • prediction_list_positions — List all prediction market positions held by a wallet. Use this when the user wants to see their prediction bets, holdings, or active positions. Returns position public keys, side, contract count, cos
  • prediction_get_position — Retrieve detailed information for a single prediction market position including cost basis, current value, average entry price, potential payout, and claim status.
  • prediction_build_close_position — Close or sell a single prediction market position. Use this when the user wants to exit, close, or sell one specific prediction position. Requires the position public key and owner wallet. Geo-restric
  • prediction_build_close_all_positions — Close all open prediction market positions for a wallet at once. Use this when the user wants to exit everything, close all bets, or cash out all prediction positions. Geo-restricted: not available fr
  • prediction_build_claim_payout — Claim the payout for a winning prediction market bet after the market has resolved. Use this when the user won a bet and wants to claim, collect, or withdraw their winnings. Only works for positions o
  • prediction_get_trade_history — Retrieve a specific wallet's personal prediction market trade history. Requires an owner wallet address. Use this when the user wants to see their own past bets, trades, or betting history. Shows orde
  • prediction_get_profile — Retrieve a wallet's prediction market stats and track record. Use this when the user wants to see their win/loss record, total P&L, betting statistics, or overall prediction performance.
  • prediction_get_leaderboard — Retrieve prediction market leaderboard rankings. Rank by metric (pnl, volume, or win_rate) over a period (all_time, weekly, or monthly). Includes summary statistics for all-time, weekly, and monthly p
  • prediction_list_trades — List recent trades across all prediction markets: a global activity feed, no wallet address needed. Takes no parameters and returns the latest fills across the exchange. Returns trade details includin
  • prediction_get_trading_status — Check whether prediction market trading is currently enabled. Use this when the user asks whether prediction trading is open, or to diagnose a failed order. There is no need to call it before every or
  • prediction_get_live_scores — Fetch the latest live scores for one or more prediction market events by their IDs. Use this for sports events to see current score, period, and game status. Events without a score row are omitted.
  • prediction_get_event_score — Retrieve the latest live score for a single prediction market event. Use this for a sports event to see its current score, period, and whether the game is live or ended. Returns null when the event ha
  • prediction_get_event_market — Retrieve a single market within a specific prediction event, including its status, result, pricing, outcomes, and timing. Use this when you know both the event ID and the market ID.
  • prediction_get_forecast — Retrieve the forecast time-series for a prediction market, showing how the predicted outcome has evolved over time. Use this when the user wants historical or projected probability trends for a market
  • prediction_get_vault_info — Retrieve the prediction market vault account data, including its public key, raw account fields, and current balance. Use this when the user wants details about the platform's settlement vault.
  • swap_get_order — Get a quote and transaction to swap, trade, exchange, or convert one Solana token for another at the current market price. Returns the best-priced route with price impact and fee breakdown. Well-known
  • swap_execute_order — Submit a signed Swap V2 transaction for on-chain execution with managed landing and confirmation. Returns the transaction signature, final swap amounts, and execution status. PREREQUISITE: Call swap_g
  • swap_get_instructions — Advanced: get raw Solana swap instructions for building a custom transaction. Only use this when the user explicitly needs individual instructions, not a ready-to-sign transaction. They may say 'raw i
  • swap_get_program_labels — Map Solana program IDs to the DEX labels Jupiter's Metis router uses (e.g. Raydium CLMM, Orca Whirlpool, Meteora DLMM). Use this to identify which DEX a program ID in a failed swap transaction or rout
  • transaction_submit — Land any valid signed Solana transaction on-chain through Jupiter's transaction landing infrastructure (Beam) and return the transaction signature. The transaction must include a SOL tip of at least 1
  • send_build_transfer — Build an unsigned transaction that sends tokens via a Jupiter Send invite. The recipient claims the funds later using the invite code. Use this when the user wants to send tokens to someone via an inv
  • send_build_clawback — Build an unsigned transaction that claws back the funds from a previously created, unclaimed Send invite back to the original sender. Use this when the user wants to cancel or reclaim a pending invite
  • send_list_pending_invites — List a sender's pending (unclaimed) Send invites. Use this when the user wants to see invites they created that have not yet been claimed, for example to find an invite to clawback.
  • send_list_invite_history — List the full Send invite history for an address, including created, claimed, and clawed-back invites. The address can be a sender or a recipient. Use this when the user wants to review past sends or
  • studio_get_pool_addresses — Retrieve the Dynamic Bonding Curve (DBC) and migrated DAMM v2 pool addresses, plus the config key, for a given token mint created on Jupiter Studio. Use this to resolve a token mint to its on-chain po
  • studio_get_fees — Retrieve the unclaimed and total creator trading fees (creator share) for a Jupiter Studio Dynamic Bonding Curve (DBC) pool. Amounts are returned in raw quote token units. Use this before claiming fee
  • studio_build_claim_fee — Build an unsigned transaction to claim creator trading fees from a Jupiter Studio Dynamic Bonding Curve (DBC) pool. Handles both direct creator ownership and proxy-based ownership. Use studio_get_fees
Answers a handshake
yes · 2026-11-07
Answers a call
not asked — no tool is named as a read (list_/get_/search_)

Live probe verifies the interface responds — not what the tools do, their safety, or their output quality. The call is one read-only tool named by this server's own list (list_/get_/search_, no mutating verb anywhere in the name, no required arguments and none that look like a key, an address or an amount), asked once a day with no arguments. Not asked is not a failure.

Observed record — 46 daily checks since 2026-09-23

89.1%of 46 checks since 2026-09-23 succeeded
Currently responding for 7 days
Succeeded
41
Failed
5
Their error
0
Unattributed
5

State changed on 2026-10-27 (responding → unreachable from our probe), 2026-10-28 (unreachable from our probe → responding), 2026-10-30 (responding → unreachable from our probe), 2026-11-01 (unreachable from our probe → responding).

This is the share of our daily checks that succeeded — not an availability guarantee. A check can fail because the host was down, because our runner timed out, or because the network in between dropped it, and only the first of those is a fact about this project. Failures are split by what we can attribute; anything we cannot attribute is counted, not hidden.

Last 30 days — to 2026-11-07, one point per UTC day

Share of OUR checks that succeeded
100%
7-day rolling; unattributable days are gaps · 29/30 days
Tools listed
77
from the server's own tools/list · 29/30 days
Sato Score
78
as snapshotted that day · 29/30 days

A gap is a day we have no attributable observation — never a zero. Thirty points is the whole shape the free layer carries; the daily rows behind it stay in the snapshot series.

Tool inventory history — 77 now, peak 77, since 2026-09-23

  • 2026-10-24 75 → 77 +8 (lend_build_borrow_operate, lend_get_borrow_operate_instructions, lend_get_borrow_positions, lend_list_borrow_vaults…) −6 (portfolio_get_positions, portfolio_get_staked_jup, portfolio_list_platforms, prediction_get_pnl_history…)

Recorded from our own daily tools/list handshake. A shrinking toolset is a real signal for an agent choosing a server; a gap in the series means the probe did not succeed that day, not that the tools disappeared.

Details

Chains
Solana
Agent types
MCP Server, Aggregator
Open source
Partial
Deploys as
Hosted, Local CLI
Last checked
2026-11-07

Marketplace Signals

No marketplace signals recorded for this resource yet.

Verification status reflects evidence reviewed by Sato Hub. Self-reported claims are never presented as verified.

#solana#dex#swap#mcp#cli#skills#dca#lending#limit-orders#prediction-markets#perps#portfolio#token-launch
See something inaccurate or outdated?Submit a correction →

Listing History

Recorded changes to Jupiter Trading MCP + CLI's listing — status, verification, Sato Score, and recent releases. Full history is kept in the listing record.

  1. Nov 2, 2026
    Verified: deploy spec
  2. Oct 19, 2026
    Active again — shipped after a quiet spell
  3. Oct 10, 2026
    Sato Score tier: Medium → High
    Score 57 → 78.
  4. Oct 9, 2026
    Sato Score tier: High → Medium
    Score 79 → 57.
  5. Sep 30, 2026
    Auto-enriched: tags, deployment options, creator name
  6. Sep 23, 2026
    Listed on Sato Hub
  7. Sep 23, 2026
    Sato Hub began tracking this listing

Compared with

Appears in

Related Resources

Reference

QuestionsShowHide

Questions people ask about Jupiter Trading MCP + CLI

Is Jupiter Trading MCP + CLI open source?
Partly. Some of Jupiter Trading MCP + CLI is published as source (https://github.com/jup-ag/cli) and some is not. Checked as of 2026-11-07.
Which chains does Jupiter Trading MCP + CLI support?
Jupiter Trading MCP + CLI lists support for Solana as of 2026-11-07.
Is Jupiter Trading MCP + CLI still maintained?
The most recent code activity Sato Hub observed was on 2026-10-10 (last commit 2026-10-10, last release 2026-06-02), which Sato Hub labels "Active". Posts on X are not counted as maintenance. Activity is a recency signal, not a quality judgment.
How do I install or run Jupiter Trading MCP + CLI?
Node.js (CLI) — Jupiter's MCP server is hosted at https://mcp.jup.ag. Install: npm i -g @jup-ag/cli. Entry: jup --help # every command is non-interactive; add --dry-run to a transacting command to get the unsigned transaction instead of submitting it. Sato Hub reproduced this install in a container on 2026-11-02.
Is Jupiter Trading MCP + CLI verified on Sato Hub?
Sato Hub holds one earned check for Jupiter Trading MCP + CLI: Deploy path reproduced — install verified in an isolated container (proves installability, not runtime safety). Its Sato Score is 78 of 100, a measure of how open, active and verifiable the project is, not a safety, quality or returns grade.
Cite this pageShowHide

Cite this page

Sato Hub. "Jupiter Trading MCP + CLI — Sato Hub." Sato Hub, updated 2026-11-07, accessed 2026-11-07. https://satohub.ai/resources/jupiter-trading-mcp

Data last refreshed 2026-11-07; this page is rebuilt daily. Citations carry the date so a reader can tell which snapshot a claim came from. Catalog data is licensed CC-BY-4.0.

Join the Sato Hub Briefing

Sign up for the Briefing: the agents, tools, and infrastructure that actually shipped, and why they matter.