Typed tools for any agent
Expose the engine over the Model Context Protocol. Your agent gets tools — list slates, read the pool, check readiness, generate lineups — with structured results instead of text it has to parse.
V12's lineup engine is one motor behind three interfaces: an MCP server, a JSON CLI, and an HTTP API. Any agent — Claude, Gemini, OpenClaw, or your own — can list slates, read the player pool, run a readiness pre-flight, and generate ranked, contest-ready NBA + MLB lineups through typed tool calls.
Most optimizers are a GUI you click. V12 is a motor you call. The same v12.core pipeline is exposed three ways: an MCP server for agents, a JSON CLI for shells and cron, and an HTTP API for services. There is no second implementation to fall out of sync — the dashboard, your agent, and a one-line shell command all generate the exact same lineups from the exact same code. Build on whichever interface fits your stack and trust they agree.
Point a Claude, Gemini, OpenClaw, or custom agent at the V12 MCP server and it discovers the tools automatically: list slates with lock times, pull the player pool with salaries and projections, run a readiness pre-flight that surfaces blockers and warnings before a run, generate ranked lineups with locks/avoids and contest-aware presets, and assemble the FanDuel entry-template CSV. Every tool returns a structured result, so the agent acts on data — not on a prose blob it has to scrape and hope it parsed right.
You don't need an LLM in the loop. `python -m v12.core.cli <subcommand>` prints JSON to stdout for slates, odds, projections, ownership, simulation, and full lineup generation — pipe it to jq, schedule it in cron, or shell out from any language. The HTTP API (POST /v1/generate) does the same over the network with an API key. The agent path is a convenience layer on top of a CLI and API that stand on their own.
Behind every interface is an 8-pillar modular engine — data, config, projection, matchup, ownership, optimizer, simulator, ranker — each decoupled. A pure LP optimizer scales from a single lineup to 150 with injectable objectives; an MVN simulator with a PSD-corrected covariance matrix feeds the ranker. NBA and MLB are native today. We're deliberate about what's claimed: DraftKings and single-game/showdown formats are in progress and labeled honestly, not implied as finished.
Every run ships with the same pillars: pool, projections, ownership, simulation, ranker, and warnings.
Expose the engine over the Model Context Protocol. Your agent gets tools — list slates, read the pool, check readiness, generate lineups — with structured results instead of text it has to parse.
python -m v12.core.cli <subcommand> prints JSON to stdout. Pipe to jq, drop it in a cron, or call it from any language. No agent required to run the same engine.
The same pipeline behind a FastAPI app. Send a slate, preset, contest, and lineup count; get a ranked portfolio and a contest-ready upload back. API-key gated.
MCP, CLI, and HTTP all call v12.core.pipeline. They can't drift — the dashboard, an agent, and a shell script all get the exact same lineups from the exact same motor.
Tools return typed objects: slates with lock times, players with salary/position/projection, lineups with player IDs and salaries. The agent acts on data, not on a prose blob.
Data, config, projection, matchup, ownership, optimizer, simulator, ranker — decoupled. Pure LP optimizer, MVN simulator, NBA + MLB native, contest-aware presets.
Point your MCP client at the V12 MCP server. The agent discovers the available tools automatically and can immediately list today's slates, pull the player pool, run a readiness pre-flight, and generate lineups. Generation is API-key gated, so only your authenticated agent can spend a run.
Any agent that speaks MCP works — V12 doesn't care which model is driving. Claude, Gemini, OpenClaw, or a custom in-house agent all get the same typed tools. If your stack isn't agent-based at all, the CLI and HTTP API hit the identical engine.
Yes. The CLI (python -m v12.core.cli) prints JSON for every subcommand — slates, odds, projections, ownership, simulation, lineups, full generate — so you can wire it into a cron job or a pipeline with no LLM in the loop. The HTTP API does the same over the network.
A ranked portfolio: each lineup carries the player IDs, salaries, total projection, stack shape, and the FanDuel entry-template rows when a contest is selected — already structured so the agent can assemble an upload or reason about exposure without parsing text.
Finished and running in production today for NBA and MLB on FanDuel, across MCP, CLI, and HTTP. We're honest about scope: DraftKings and single-game/showdown formats are in progress and labeled as such rather than implied as done.