CraftGenie for developers and AI assistants

CraftGenie is a free crafting database and factory planner for crafting and automation games. Its data and its planner are open to your code and your AI assistant in two ways: a remote MCP server, and a JSON REST API. Neither needs a key to read or to plan.

An assistant with no tools, or one that can only fetch a page, can still hand its user a whole planned factory: write a plan link. Opening it runs the same planner as POST /api/v1/plan, keeps the plan, and redirects to its short /p/… page, read-only with its graph, production and power, ready to copy into the user’s own factory.

https://craftgenie.io/plan/{game}?make={item}:{amount},{item}:{amount}

A working one, ready to copy (several targets in one link):

https://craftgenie.io/plan/satisfactory?make=heavy-modular-frame:10/min,computer:10/min,supercomputer:4/min

Each game’s page (/games/{game}/factory) and its markdown (/games/{game}.md) list item slugs to plan, with a working link for that game, under “For AI assistants”.

Names are forgiving, so a link written from memory usually works: Electronic Circuits, electronic_circuit and electronic-circuit are the same item, and Factorio the same game as factorio. Use slugs where you have them. The same link is always the same plan, plans count against the plan limit below, and plan links are never indexed. Examples:

Quick start for AI assistants

MCP server

CraftGenie is a remote MCP server, so an assistant can look up recipes and plan factories itself, and hand you a link to the interactive graph. It speaks Streamable HTTP at:

https://craftgenie.io/mcp
ToolWhat it does
list_gamesThe games, their slugs and data licenses.
search_itemsFind an item’s slug by name.
get_itemAn item, how to get it (when there is a guide, with sources), what makes it and what uses it.
get_recipeA recipe’s outputs, inputs, station and time.
plan_factoryA whole production chain for targets: machines, raw inputs, surplus, power, and a short open_url that opens it as an interactive factory.
create_share_link (API key)The same plan saved as a permanent share page on the key’s account.

Every tool works without a key except create_share_link, which saves to the account a key belongs to. Clients that cannot send a header (Claude.ai and ChatGPT connectors) get every other tool, and plan_factory’s open_url still hands you the interactive factory.

Claude Code

claude mcp add --transport http craftgenie https://craftgenie.io/mcp

With a key, for saved share links:

claude mcp add --transport http craftgenie https://craftgenie.io/mcp \
  --header "Authorization: Bearer cg_…"

Claude.ai and Claude Desktop

Settings → Connectors → Add custom connector. Name it CraftGenie and give the URL https://craftgenie.io/mcp.

ChatGPT

Settings → Apps & Connectors → Advanced settings → turn on Developer mode, then Create a connector with the URL https://craftgenie.io/mcp and no authentication.

Cursor

In .cursor/mcp.json (or ~/.cursor/mcp.json):

{
  "mcpServers": {
    "craftgenie": {
      "url": "https://craftgenie.io/mcp",
      "headers": {
        "Authorization": "Bearer cg_…"
      }
    }
  }
}

Leave out headers to use it without a key.

The REST API

A read-only JSON API over every game’s items and recipes, and the planner that fills a whole production chain. It is versioned at /api/v1: nothing in it changes in a way that breaks a client, and a breaking change would be /api/v2. The full contract is the OpenAPI document.

Games and items are named by slug, as the site’s addresses name them. Recipes are named by id, or by their key where the game’s data gives one. Lists take page and limit (up to 100). No key is needed to read.

EndpointWhat it answers
GET /api/v1/gamesEvery game the API serves, with its slug and data license.
GET /api/v1/games/{game}One game, and what the planner supports there.
GET /api/v1/games/{game}/items?q=Search a game’s items by name.
GET /api/v1/games/{game}/items/{item}An item, how to get it (when there is a guide, with sources), what makes it and what uses it.
GET /api/v1/games/{game}/recipes?item=&role=Recipes that make (output), use (input) or are made at (station) an item.
GET /api/v1/games/{game}/recipes/{recipe}One recipe, by id or key: outputs, inputs, station and time.
POST /api/v1/planPlan a whole factory for targets, with a short open_url.
GET /api/v1/plans?sort=popular|new&game=Plans people have opened.
GET /api/v1/plans/{slug}One generated plan, by its open_url’s slug.
POST /api/v1/shares (API key)Save a plan as a permanent share page on the key’s account.

List the games

curl 'https://craftgenie.io/api/v1/games'

Find an item

curl 'https://craftgenie.io/api/v1/games/factorio/items?q=circuit'

What makes an item, and what uses it

curl 'https://craftgenie.io/api/v1/games/factorio/items/electronic-circuit'

One recipe, by key or id

curl 'https://craftgenie.io/api/v1/games/factorio/recipes/advanced-oil-processing'

Planning a factory: POST /api/v1/plan

POST /api/v1/plan runs CraftGenie’s own planner, the one behind every factory on the site: it picks a recipe for each part of the chain (or uses the ones you prefer), sizes every machine, powers each grid and balances by-products. The body is JSON:

Example: 60 electronic circuits a minute

curl -X POST 'https://craftgenie.io/api/v1/plan' \
  -H 'Content-Type: application/json' \
  -d '{"game":"factorio","targets":[{"item":"electronic-circuit","rate":60}]}'

The request body:

{
  "game": "factorio",
  "targets": [
    {
      "item": "electronic-circuit",
      "rate": 60
    }
  ]
}

The answer, abbreviated (entries, machines and license hold more than shown):

{
  "game": "factorio",
  "open_url": "https://craftgenie.io/p/abc123defg",
  "mode": "perMinute",
  "per": "per minute",
  "targets": [
    {
      "item": "electronic-circuit",
      "name": "Electronic Circuit",
      "asked": 60,
      "amount": 60
    }
  ],
  "summary": {
    "text": "Electronic Circuit 60/min in Factorio: 10 recipes on 28 machines. Raw inputs: none. Power: Main 195 / 900 kW.",
    "met": true,
    "scale": null,
    "recipes": 10,
    "machines": 28,
    "problems": []
  },
  "entries": [
    {
      "recipe": {
        "id": "…",
        "key": "electronic-circuit",
        "name": "Electronic Circuit"
      },
      "station": {
        "item": "assembling-machine-1",
        "name": "Assembling Machine 1"
      },
      "machines": 1,
      "built": 1,
      "crafts": 60,
      "seconds": 1,
      "grid": "Main",
      "outputs": [
        {
          "item": "electronic-circuit",
          "name": "Electronic Circuit",
          "amount": 60
        }
      ],
      "inputs": [
        {
          "item": "iron-plate",
          "name": "Iron Plate",
          "amount": 60,
          "consumed": true
        },
        {
          "item": "copper-cable",
          "name": "Copper Cable",
          "amount": 180,
          "consumed": true
        }
      ],
      "power": 0.075
    }
  ],
  "machines": [
    {
      "item": "burner-mining-drill",
      "name": "Burner Mining Drill",
      "count": 13
    },
    {
      "item": "stone-furnace",
      "name": "Stone Furnace",
      "count": 9
    }
  ],
  "raw_inputs": [],
  "surplus": [],
  "power": [
    {
      "grid": "Main",
      "unit": "MW",
      "text": "195 / 900 kW",
      "used": 0.195,
      "capacity": 0.9
    }
  ],
  "license": {
    "game": "factorio",
    "commercial_use": true,
    "license": "MIT",
    "attribution": "…"
  }
}

The answer holds a summary (one line of text, whether the targets are met, and any problems), every recipe in the chain with its machines, crafts, inputs and outputs, the machines to build, the raw inputs, the surplus, the power on each grid, and the game’s license.

It also holds open_url, a short link (/p/…) that opens this exact factory in CraftGenie as a read-only page, with its graph, production and power, that the visitor can explore and copy into their own factory to change and save. It needs no key and belongs to no account. The same plan always gets the same link, and a link nobody opens for 90 days expires. POST /api/v1/shares takes the same body (and a name) and saves the plan as a permanent share page on your account instead.

Plans that people open from their link may be listed publicly among the factories people are planning (GET /api/v1/plans?sort=popular|new&game=). Only an open of the /p/… page in a browser counts, once per visitor a day; reading a plan through the API does not. A plan holds only game data (items, recipes and rates), never your users’ words.

Keys and limits

Reads and plans need no key. A key raises your limits and lets you save share links. Make one on your account page and send it as Authorization: Bearer cg_…. A wrong or revoked key is refused (401), never treated as anonymous.

LimitAnonymousWith a key
Reads and MCP requests60/min600/min
Plans10/min60/min
Share linksnone30/hour

A plan’s body is at most 32 KB, with up to 8 grids, and runs for at most 10 seconds. Anonymous limits count per address, keyed ones per key; every answer says how much is left in X-RateLimit-Remaining.

Licensing

Each game has its own data license. Every answer about a game carries it in license: credit the data with attribution, and where commercial_use is false, use the data for non-commercial purposes only, under terms.

Non-commercial use only means you may not use the data in anything primarily meant for commercial advantage or money. Where share_alike is true, share what you build from the data under the same license.

GameSlugData licenseUse
Age of Empires IVage-of-empires-ivMicrosoft Game Content Usage RulesNon-commercial only
ARC Raidersarc-raidersMITAny, with attribution
AstroneerastroneerCC BY-NC-SA 3.0Non-commercial only
Captain of Industrycaptain-of-industryMITAny, with attribution
Core Keepercore-keeperCC BY-NC-SA 4.0Non-commercial only
Dyson Sphere Programdyson-sphere-programMIT; CC BY-SA 4.0Any, with attribution
EnshroudedenshroudedCC BY-SA 4.0Any, with attribution
EVE Onlineeve-onlineCCP Developer License AgreementNon-commercial only
FactoriofactorioMITAny, with attribution
MindustrymindustryGPL-3.0Any, with attribution
MinecraftminecraftMIT; CC BY-NC-SA 3.0Non-commercial only
No Man's Skyno-mans-skyGPL-3.0; CC BY-SA 3.0Any, with attribution
Oxygen Not Includedoxygen-not-includedCC BY-NC-SA 4.0Non-commercial only
PalworldpalworldCC BY-SA 4.0Any, with attribution
SatisfactorysatisfactoryMIT; CC BY-NC-SA 4.0Non-commercial only
SubnauticasubnauticaCC BY-SA 3.0Any, with attribution
ValheimvalheimMIT; CC BY-SA 3.0Any, with attribution
WarframewarframeWarframe Content PolicyNon-commercial only

Some games on the site are not available through the API or the MCP server, because their data cannot be licensed for reuse. Game names and content are trademarks and copyrights of their owners; CraftGenie is an unofficial fan tool. The site’s attributions list every game’s owners and sources.

Errors and caching

Every error has one shape: { "error": { "code", "message", "issues"? } }. The codes are NOT_FOUND (also for a game the API does not serve), VALIDATION (400, with issues naming each problem), UNAUTHENTICATED (401), RATE_LIMITED (429, with Retry-After), PAYLOAD_TOO_LARGE (413), and PLAN_BUSY or PLAN_TIMEOUT (503, with Retry-After).

Reads are cacheable for five minutes and carry an ETag: send it back in If-None-Match for a 304. CORS is open to every origin, and no request uses cookies, so the API works from a browser page as well as a server.