MCP · CLI · HTTP · Agent-ready

DFS Optimizer for AI Agents — MCP Server + CLI

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.

3
interfaces, one engine
8
decoupled pillars
150
lineups per run
MCP serverJSON CLIHTTP APIStructured tool outputsNBA + MLB nativeAny MCP agent
Section · 01

One engine, three interfaces — and they can't drift

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.

Section · 02

Drop V12 into any MCP agent

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.

Section · 03

No agent? The CLI and API hit the same motor

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.

Section · 04

A real engine under the interface, not a wrapper

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.

Built into the engine

Every run ships with the same pillars: pool, projections, ownership, simulation, ranker, and warnings.

MCP server

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.

CLI

JSON in, JSON out

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.

HTTP API

POST /v1/generate

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.

One engine

Three interfaces, one source of truth

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.

Structured output

No brittle scraping

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.

8 pillars

A real engine under the hood

Data, config, projection, matchup, ownership, optimizer, simulator, ranker — decoupled. Pure LP optimizer, MVN simulator, NBA + MLB native, contest-aware presets.

Common questions

01

How do I connect my agent to V12?

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.

02

Does it work with Claude, Gemini, OpenClaw, or custom agents?

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.

03

Can I use V12 without an agent at all?

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.

04

What does the MCP server actually return for a lineup run?

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.

05

Is this a finished product or a roadmap pitch?

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.

Ready to ship your next slate?