Which agent should
you leverage?

An agent here is three things: a narrow slice of the data plane, a prompt that knows that domain's traps, and a hard budget. Twenty-eight of them ship with the app. This page is the map — what each kind is for, when to reach for it, and one worked example end to end.

21product agents, all free
7ops agents that maintain the platform
13skills they load on demand
1orchestrator that routes for you

The short version: you rarely pick. Ask the orchestrator a question and it routes to whichever specialists fit, runs the independent parts in parallel and synthesises one answer. You pick deliberately when you want a specific desk — or when you're building an agent of your own and need to know what shape it should be.

Six kinds of agent

Not a taxonomy for its own sake. Each kind has a different failure mode, so each one is built differently — different tool surface, different model tier, different budget.

Kind 01 · Router

The orchestrator

Holds no data tools at all. Its whole job is to read your question, decide which specialists it needs, delegate, and stitch the results into one answer. Keeping it toolless is the point — a router that could also fetch odds would fetch odds instead of routing.

Leverage it when: almost always. It is the default front door, and the only agent that can fan a question out across several desks at once.
orchestrator
Kind 02 · Data specialists

One surface, read deeply

Each owns a slice of the data plane and the vocabulary that goes with it — odds specialists know vig removal, racing analysts know how to read a racecard, the news scout knows the difference between a confirmed out and beat-writer chatter.

Leverage them when: you know the shape of the question — "best price across the books", "what's the ladder", "who's out tonight" — and want it answered without a routing hop.
odds_specialiststats_specialistracing_analystprediction_market_analystnews_scout
Kind 03 · Quant & compute

Sandboxed, and made to be checked

These run real Python in an ephemeral sandbox: fit a model, calibrate it on holdout, replay it against captured odds history. The output is a number with an error bar attached, and every one of them persists what it produced so the next run can be scored against it.

Leverage them when: the question is "is this edge real?" rather than "what's the price?". Expect them to be slower and to cost more — they're doing arithmetic, not lookups.
modellingbacktestervalue_scoutarb_hunterdata_analysis
Kind 04 · Ledger & guardrails

Memory and limits

The unglamorous ones, and the ones that make the rest honest. They journal what you did, settle it against results, and gate any recommendation against your bankroll and open exposure. The bet notifier is deliberately denied price tools so it can only format what another agent already found — it cannot go and re-price anything itself.

Leverage them when: you want your record kept straight — P&L, ROI, hit-rate, closing-line value — or a sizing sanity check before you act.
bet_trackerbankroll_managerbet_notifiermarket_stewardconcierge
Kind 05 · Domain agents

One game, one platform

Where a game has its own rulebook, a general agent gives vague answers. FPL has 38 hard deadlines, price changes, four chips and a rolling transfer budget; DFS has salary caps and contest structures. Merging those two prompts would make both worse, so they're separate agents.

Leverage them when: the rules of the competition are the hard part — not the data. This is also the kind most worth building yourself.
fpl_managerfantasy_advisor
Kind 06 · Meta agents

The ones that grow the platform

The generalist catches whatever no specialist covers, solves it in a sandbox, and — only for genuinely repeatable patterns — crystallises the method into a reusable skill. The agent builder goes one step further and turns a recurring need into a versioned agent of its own. Skills are markdown playbooks, never code: they guide the model and cannot grant a tool.

Leverage them when: you've answered the same awkward question three times. Describe the agent you want in plain English and it gets written, scoped and versioned.
generalistagent_builder
And a seventh, which isn't yours to call. Seven ops agents run on a separate plane under the platform's own identity — health checks on the data plane, feed incident triage, eval gates, docs and site drift. They can only ever open a pull request or file an issue; there is no merge tool anywhere in the codebase. A human merges, always.

The full roster

Generated from the spec files in the agents repo. Every agent below ships in the free app — nothing here is held back. "Model" is the class the agent defaults to; you can pin a different model per agent or per conversation.

Product plane — the agents you talk to

AgentKindModelWhat it does
orchestratorRouterbalancedRoutes, delegates, synthesises. Holds no data tools of its own.
odds_specialistDatabalancedCross-book prices: implied probability, fair price, best price, same-game multis.
stats_specialistDatafastFixtures, results, boxscores, game logs, head-to-head, leaders, ladders, injuries.
racing_analystDatabalancedMeetings, racecards, next-to-jump, results and dividends, futures, SRM, cross-book win/place.
prediction_market_analystDatabalancedKalshi and Polymarket contracts, and the exchange-vs-book gap once the vig is removed.
news_scoutDatafastPre-game intel from X and league news: injuries, team news, weather — confirmed vs chatter.
modellingQuantbalancedBuilds and calibrates probability models in the sandbox; persists versions and predictions.
value_scoutQuantfast+EV selections: calibrated model probabilities against vig-removed market prices.
arb_hunterQuantfastCross-book and exchange-vs-book arbitrage; sets standing arb watches.
backtesterQuantfastReplays predictions against captured odds history and results: ROI, hit-rate, CLV, variance.
data_analysisQuantbalancedAd-hoc pandas/matplotlib work in a sandbox: play-by-play, advanced metrics, charts, CSV exports.
bet_trackerLedgerfastJournals your bets (you place them), settles results, reports P&L, ROI, hit-rate, CLV.
bankroll_managerLedgerfastKelly/flat sizing guidance and the exposure gate — caps against bankroll and open bets.
bet_notifierLedgerfastFormats a finding for delivery: selection, book, price, sizing, reasoning, sources.
market_stewardLedgerfastMaintains the canonical market dictionary as data; safe aliases applied, ambiguous ones reported.
conciergeLedgerfastPlain-language explainer — turns the team's findings into jargon-free answers.
fpl_managerDomainbalancedFantasy Premier League: squad review, captaincy, transfers, chip timing. Advisory only — see below.
fantasy_advisorDomainbalancedDFS and season-long fantasy: projections from stats, salary-cap lineup optimisation, player research.
generalistMetabalancedThe catch-all. Solves what no specialist covers, then writes reusable skills from what it learned.
agent_builderMetabalancedBuilds a custom agent from a plain-English goal: drafts the prompt, picks the data and skills, versions it.
slack_managerMetafastSlack workspace housekeeping — channels, naming, topics, alert routing.
The advisory invariant. No product agent places a bet or moves money. Sizing tools return a fraction — never a stake — and money-verb tool names are denied by construction, at spec-validation time. A spec that names one simply fails to load. Everything here is information only, not betting or financial advice, and it's 18+.

Ops plane — maintains the platform itself

AgentModelWhat it does
mcp_healthfastRuns doctor plus the contract suite against the data plane; files issues on real breaks.
incident_triagefastWatches feed health; remediates within an allow-list (retry/disable/enable) or escalates.
eval_benchmarkfastRuns the offline eval gate, records agent metrics, reports regressions.
repo_improverstrongProposes changes from feedback and telemetry; opens CI-gated PRs a human merges.
code_reviewerstrongReviews PRs diff-first: approve, or request changes.
site_managerbalancedKeeps this site honest: uptime, catalogue drift, traffic, badge PRs.
docs_keeperbalancedKeeps the docs in sync with the code; opens a PR when the roster or structure drifts.

Worked example: the FPL Manager

The newest agent in the roster, and the clearest illustration of how a domain agent gets built. It is currently at version 0.1.0 — Phase 0 of a longer plan — and everything below is the real spec, not an illustration of one.

In development · v0.1.0 · advisory only

fpl_manager

Reads a real Fantasy Premier League squad and says what it would do — starting XI and bench order, captain and vice, any transfer worth making, chip timing — and why. It takes no actions. FPL's write endpoints exist and their payloads are known; they are deliberately not wired in.

The spec, in full

# src/sportsdata_agents/specs/fpl_manager.yaml
spec_version: 1
agent:
  id: fpl_manager
  display_name: "FPL Manager"
  version: 0.1.0
  model_tier: balanced
  system_prompt: |
    You advise on a Fantasy Premier
    League squad. You RECOMMEND;
    you never act. …
  tools:
    # groups, not capabilities — see right
    mcp_groups: [fpl.players, fpl.reference,
                 fpl.fixtures, fpl.managers]
    native: [run_python]
  forbidden_capabilities: [sport.transactions]
  sandbox: ephemeral
  context:
    retrieval: jit
    verify: true
  limits:
    max_tool_calls: 25
    max_tokens: 120000
    cost_ceiling_usd: 0.40

Four decisions worth stealing

  • Groups, not capabilities — a measured 38× saving Capability tags are the cross-provider unit, and the old rule was to prefer them. With 63 providers in the catalogue they widen the tool set instead of narrowing it: ref.players alone matches a dozen providers. The thirteen capabilities this agent needs resolve to 289 tools — about 115k tokens of definitions against a 120k budget, before a single question is asked. Naming FPL's four groups gives it all 16 of its tools for roughly 3k.
  • The prompt is mostly a list of traps Not "you are a helpful FPL assistant". It's the five things that make advice silently wrong: selling_price is not now_cost (FPL returns half the rise when you sell); prices are tenths of a million; before the first deadline transfers are unlimited so the 4-point hit doesn't apply; a chip already played is gone; form and ownership come back as strings and compare wrong until converted.
  • Advisory is enforced, not promised forbidden_capabilities hard-denies the transactions surface, so the agent cannot acquire write access by accident later. Actually managing a squad is Phase 1 — behind a policy engine and an approval step.
  • Separate from fantasy_advisor on purpose That one is DFS-shaped: salary caps, contest rules, cash versus GPP. Season-long FPL is a different game, and merging the prompts would make both vaguer.

Why the tool budget is the whole ballgame

13 capabilities 289 tools
4 groups 16 tools
context budget 120k tokens

Every tool schema rides on every single call. The capability route spends ~115k of a 120k budget describing tools the agent will never use; the group route spends ~3k. Rule of thumb: if the agent plays one game on one platform, name the groups. If it genuinely spans providers, name capabilities.

What an answer looks like

sportsdata · fpl_manager v0.1.0

Should I captain Haaland this week, and is my bench order right?

fpl_gameweeks fpl_my_team fpl_fixtures fpl_players run_python

Deadline is Sat 02:30 AEST — everything below is relative to that. Your squad reads 3-4-3 with one change needed: Mbeumo starts ahead of Rogers (home, difficulty 2, versus an away trip at difficulty 4). Captain Haaland — he is the highest-projected option and at 62.4% ownership the armband elsewhere is a differential play, not a safety play. Name which you're optimising for: against a mini-league you're chasing, the differential is defensible; from in front it isn't. Vice on Salah, not your current pick — a benched vice wastes the armband when the captain doesn't play. Bench order 1–3: Rogers, Muric, Van den Berg. No transfer worth making; hold the free one. Two flags: Gvardiol is a 75% doubt (news 18:20), and your two Arsenal players face each other in GW17.

5 tool calls · $0.11 of a $0.40 ceiling · verified ✓ · advisory only — this agent takes no actions

Phase 0 exists to answer one question. Are the agent's decisions actually better than the owner's? That is cheaper and safer to answer with advice than with execution. If the recommendations don't beat the human, automating them would only be automating worse decisions faster — so the write layer stays unbuilt until the advice earns it.

Anatomy of a spec

Every agent in the roster — and every one you build — is this same YAML document. The schema is strict: an unknown field is an error, not a shrug, so a typo fails loudly at load time instead of being silently ignored.

id · display_name · version
Identity, and semver. Pinning matters: a workspace can pin an agent version, and loading a deprecated one still works — it warns rather than breaking.
plane: product | ops
The hard split. Product agents serve you through the gateway; ops agents run under the platform's identity with platform credentials and are reachable only from the operator CLI.
model_tier
fast, balanced, strong — or an explicit provider/model. Most desks are fast; only review and repo work justifies strong.
system_prompt
Where the domain knowledge lives. The good ones read as a list of the specific ways this domain makes an answer wrong, not as a personality.
tools: mcp_capabilities | mcp_groups | native
Capabilities span providers; groups scope to one. Native tools are deterministic in-process helpers — vig removal, Kelly fractions, lineup optimisation — that should never be an LLM's guess.
skills
Markdown playbooks loaded just in time. They guide the model; they cannot grant a tool or bypass a rule.
forbidden_capabilities
A hard deny-list, checked against the allow-list at validation. Defence in depth: it stops an agent quietly acquiring reach in a later edit.
can_delegate_to
Which other agents become callable tools. In practice only the orchestrator uses it.
sandbox: none | ephemeral
Whether the agent can execute code. Ephemeral means a fresh sandbox per run, discarded after.
context · limits
Retrieval policy, compaction on long runs, verification — and the ceilings: tool calls, steps, tokens, wall-clock, dollars. Every run is capped. There is no unbounded agent.

How to pick, in practice

"What's the best price on tonight's game?"
Just ask the orchestrator. It'll pull odds_specialist and be done in one hop.
"Is my model actually beating the close?"
backtester directly — it wants your prediction history and the captured odds, and a routing hop adds nothing.
"Who do I captain this week?"
fpl_manager. A general fantasy agent would answer, but vaguely — the FPL rulebook is the hard part, not the data.
"Draw me the shot chart for this series."
data_analysis — sandboxed pandas and matplotlib, artifacts saved to your machine.
"Nothing here does what I need."
generalist solves it now; agent_builder turns it into a permanent agent if it's going to recur.
"I want it to place the bet too."
No agent does that, by construction — not a setting, not a flag. Money-verb tools are denied at spec-validation time.

Build your own

The FPL Manager started as a plain-English description of a recurring need. That's the intended path: describe the agent, let the builder draft the prompt, pick the data groups and set the budgets, then version it. It persists locally and runs with agents run --agent <id>. Nothing leaves your machine.

Download the app — free Watch the agents work Specs on GitHub ↗