MCP Integration
JAOT exposes its optimization capabilities through the Model Context Protocol (MCP), allowing AI agents and LLM-powered applications to discover and use optimization tools without custom integration code.
What is MCP?
The Model Context Protocol is an open standard that lets AI applications discover and call external tools. Instead of writing bespoke API integrations, an MCP client (such as Claude Desktop, Cursor, or any compatible agent) connects to an MCP server and automatically discovers the tools it provides.
For JAOT, this means any MCP-compatible AI assistant can:
- Solve optimization problems by describing them in conversation
- Browse the template library and marketplace
- Author, version, and solve first-class model projects
- Fork marketplace models and execute them with user data
- Check execution results
Connecting to JAOT via MCP
JAOT runs an MCP server at the /mcp endpoint using HTTP (Streamable HTTP) transport.
Endpoint:
https://jaot.io/mcp
The MCP endpoint is publicly accessible — no authentication is needed to connect and discover tools. Individual tools that modify data require a Bearer API key, which is passed as a header on tool invocations.
Self-hosters: replace
https://jaot.io/mcpwithhttp://localhost:8001/mcpor your own domain.
Client setup
Claude Code (CLI)
Use claude mcp add with the --transport http flag:
claude mcp add --transport http jaot https://jaot.io/mcp \
--header "Authorization: Bearer ok_live_your_key_here"To browse templates and the marketplace without authenticating, omit the --header flag — those tools work without a key.
Claude Desktop
Claude Desktop does not support remote HTTP servers via claude_desktop_config.json directly. Add JAOT through the Settings → Connectors UI at claude.ai/settings/connectors:
- Click Add custom connector
- Enter
https://jaot.io/mcp - Complete any authentication prompts
If you prefer to use the config file with the mcp-remote bridge (requires Node.js):
{
"mcpServers": {
"jaot": {
"command": "npx",
"args": [
"mcp-remote",
"https://jaot.io/mcp",
"--header",
"Authorization: Bearer ok_live_your_key_here"
]
}
}
}After saving, restart Claude Desktop.
opencode
Add JAOT to your opencode.json (or opencode.jsonc) config file:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"jaot": {
"type": "remote",
"url": "https://jaot.io/mcp",
"enabled": true,
"headers": {
"Authorization": "Bearer ok_live_your_key_here"
}
}
}
}OpenAI (Responses API)
Pass JAOT as an MCP tool in the tools array of a Responses API request:
{
"model": "gpt-4o",
"tools": [
{
"type": "mcp",
"server_label": "jaot",
"server_url": "https://jaot.io/mcp",
"headers": {
"Authorization": "Bearer ok_live_your_key_here"
},
"require_approval": "never"
}
],
"input": "List the available optimization templates."
}Omit headers (or the Authorization entry) to use only the public catalog and marketplace browse tools.
Cursor
Create or edit .cursor/mcp.json in your project (or ~/.cursor/mcp.json for global):
{
"mcpServers": {
"jaot": {
"url": "https://jaot.io/mcp",
"headers": {
"Authorization": "Bearer ok_live_your_key_here"
}
}
}
}VS Code (GitHub Copilot)
Create or edit .vscode/mcp.json in your workspace. VS Code uses a "servers" root key (not "mcpServers") and requires "type": "http" for remote servers:
{
"servers": {
"jaot": {
"type": "http",
"url": "https://jaot.io/mcp",
"headers": {
"Authorization": "Bearer ok_live_your_key_here"
}
}
}
}Available Tools
JAOT exposes 34 MCP tools organized into eight categories:
Solve Tools
| Tool | Auth | Description |
|---|---|---|
solve_problem | Yes | Solve an optimization problem defined as variables, constraints, and an objective. Optionally choose a solver (scip, highs, cbc, glpk) or auto routing |
validate_problem | Yes | Validate a problem definition without solving |
solve_multi_objective | Yes | Solve a multi-objective problem and return a Pareto front |
list_available_solvers | Yes | List the solvers available to your organization |
Catalog Tools
| Tool | Auth | Description |
|---|---|---|
list_templates | No | List available problem templates with names, categories, and descriptions |
get_template | No | Get a specific template's details, input schema, and example input |
solve_with_template | Yes | Solve a problem using a template and user-provided input data. Optionally choose a solver or auto routing |
File I/O Tools
| Tool | Auth | Description |
|---|---|---|
import_preview | Yes | Preview how a CSV/MPS/LP/CIP file is parsed into an optimization problem before solving |
import_and_solve | Yes | Import data from a CSV/MPS/LP/CIP file and solve it in one step |
export_model | Yes | Export a model (no solve required) to a standard format (MPS, LP, CIP, or flat JSON) |
export_execution | Yes | Export a finished execution's model or solution (MPS/LP/CIP/SOL/CSV/JSON) |
Marketplace Tools
| Tool | Auth | Description |
|---|---|---|
list_catalog_models | No | Browse published models in the marketplace |
get_catalog_model | No | Get a specific marketplace model's details |
get_catalog_model_schema | No | Get the input schema for a marketplace model |
Using a marketplace model is fork-first: create_model_project_from_marketplace (below) forks it into a model project of your organization.
Execution Tools
| Tool | Auth | Description |
|---|---|---|
execute_model | Yes | Execute one of your models (a model project) with input data |
get_execution | Yes | Retrieve execution results and status |
get_execution_insights | Yes | Get auto-generated insights (gap, solve time, quality flags) for a completed execution |
Analysis Tools
Everything the analysis page computes is available to an agent — as facts, not prose. There is no "explain it in words" tool on purpose: an MCP client is already a language model, so it reads the numbers and writes its own explanation.
| Tool | Auth | Description |
|---|---|---|
get_execution_exact_analysis | Yes | Exact, solution-based analysis of a finished run: binding constraints, per-row slack and utilization, objective contributions, and the per-family aggregates |
analyze_infeasibility | Yes | Diagnose an infeasible model: a minimal conflicting set of constraints/bounds (drop any one and it becomes solvable) |
start_execution_scenario_analysis | Yes | Queue the what-if batch: RHS ranging on the binding constraints and regret on key decisions, measured by real re-solves under a time budget |
get_execution_scenario_analysis | Yes | Poll or read that batch — status, the measured scenarios, and the budget accounting |
The what-if batch is asynchronous because each scenario is a full re-solve: start it, then poll until the status leaves running. Starting it twice is safe — a request that arrives while a batch is in flight joins it instead of queueing a second one, and a finished batch is served from the cache.
Solver Comparison Tools
These answer "which solver should I use for this model", not "what is the answer". The same problem goes to every solver you name, with the same time limit, the same gap tolerance and the same thread count, on one machine, one run after another. Seconds measured any other way are not comparable.
| Tool | Auth | Description |
|---|---|---|
compare_solvers | Yes | Queue one problem against several solvers and get the table back, every row pending |
get_solver_comparison | Yes | Poll or read that table: per solver, status, objective, bound, gap, total time, search time, nodes and iterations |
compare_solvers_on_datasets | Yes | Queue a matrix: a model project's JModel source compiled against several datasets, each row run by every solver |
get_solver_comparison_matrix | Yes | Poll or read the grid, one row per dataset and one column per solver |
Both shapes are asynchronous: the launch returns 202 with a table of pending rows, and you poll until the status leaves pending and running. Each solver counts as one execution against the daily quota, so a matrix of 3 datasets and 4 solvers costs 12. A comparison that cannot afford all of its runs is rejected whole.
A solver that cannot express the model gets a row saying so with its reason — never an empty cell, and never a missing row. Read the machine_note field before quoting any timing: it records the machine the runs happened on, and times from two different comparisons cannot be put side by side.
Model Project Tools
Create, version, analyze, and solve a first-class model — the same "Model, Analyze & Solve" workspace an agent can drive over MCP.
| Tool | Auth | Description |
|---|---|---|
create_model_project | Yes | Create a versioned model project from an optimization problem |
create_model_project_from_marketplace | Yes | Fork a marketplace model into your studio (optional custom input for generator-backed models) |
get_model_project | Yes | Retrieve a model project's current draft and metadata |
list_model_projects | Yes | List your organization's model projects |
update_model_project_draft | Yes | Write the project's draft model (agent authoring; optimistic lock via If-Match) |
commit_model_version | Yes | Commit the draft as an immutable version with a "what changed" message |
list_project_versions | Yes | List a model project's committed versions |
get_model_stats | Yes | Get structure stats, problem class, and health for a model project |
solve_model_project | Yes | Solve a model project's draft or a specific committed version (solution_filter="nonzero" for a compact solution) |
Example Workflows
Solving a Problem from Scratch
An AI agent using JAOT's MCP tools might follow this flow:
- User: "I need to optimize my delivery routes for 5 warehouses and 20 customers."
- Agent calls
solve_problemwith a vehicle routing formulation:
{
"name": "delivery_routing",
"variables": [
{"name": "route_1_2", "type": "binary"},
{"name": "route_1_3", "type": "binary"}
],
"objective": {
"sense": "minimize",
"expression": "12*route_1_2 + 8*route_1_3 + ..."
},
"constraints": [
{"name": "visit_customer_2", "expression": "route_1_2 + route_3_2 + route_4_2 = 1"}
],
"options": {"time_limit_seconds": 60}
}- The solver returns the optimal routes with the minimum total distance.
Using a Template
A simpler path for well-known problem types:
- Agent calls
list_templatesto see what is available - Agent calls
get_template("knapsack")to get the input schema - User provides item data
- Agent calls
solve_with_template("knapsack", {"capacity": 50, "items": [...]})to get the solution
Marketplace Path
For pre-built domain-specific models — fork first, then run your copy:
- Agent calls
list_catalog_modelsto browse the marketplace - Agent calls
get_catalog_model("cat_abc123")to check model details - Agent calls
get_catalog_model_schema("cat_abc123")to see the customizable inputs - Agent calls
create_model_project_from_marketplace("cat_abc123", {"user_input": {...}})to fork it into the organization's studio - Agent calls
execute_model("mp_xyz789", {"input_data": {...}})to run the fork - Agent calls
get_executionto retrieve results
Agent Authoring Path
An agent can drive the whole "Model, Analyze & Solve" workspace over MCP — building a versioned model instead of a one-off solve:
- Agent calls
create_model_project({"name": "Line scheduling"})for a fresh versioned project - Agent calls
update_model_project_draft("mp_abc", {"model_json": {...}})to write the model - Agent calls
commit_model_version("mp_abc", {"summary": "v1 — initial model"})to record it - Agent calls
solve_model_project("mp_abc", solution_filter="nonzero")— the compact solution omits near-zero variables (variables_omittedreports how many) - Agent calls
get_execution_insightsfor quality/gap/time insights on the run
Authentication for MCP Tools
Tools marked "Auth: Yes" require a valid API key. Pass your key in the MCP connection headers as shown in the configuration section above. If a tool requiring auth is called without credentials, it returns an error message explaining how to authenticate.
Tools marked "Auth: No" are publicly accessible and can be used without any API key. This allows agents to browse templates and the marketplace catalog before the user decides to authenticate.
AI Discovery: llms.txt
JAOT also provides standardized discovery documents for AI agents at well-known URLs:
| URL | Content |
|---|---|
/.well-known/llms.txt | Concise discovery document with endpoint list and MCP tool names |
/.well-known/llms-full.txt | Comprehensive documentation including authentication guide, full API reference, problem JSON schema, and optimization concepts |
These documents follow the llms.txt specification and allow AI agents to understand JAOT's capabilities without parsing HTML documentation.