{
  "version": "2",
  "generatedAt": "2026-11-06T20:51:57.517Z",
  "listing": {
    "slug": "inventree--InvenTree",
    "name": "InvenTree",
    "tagline": "Open-source inventory and parts system with a REST API, Python SDK and read-only MCP plugin.",
    "shortTagline": "Inventory and stock control",
    "description": "InvenTree is a Python and Django inventory system for parts, stock, suppliers, bills of materials, build orders, and purchase, sales and return orders. The same organization publishes a documented REST API with an OpenAPI schema, a Python SDK, and an MCP plugin that is read-only for now. Global settings and branding can be set in config.yaml or env vars; report templates and plugins cover the rest.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "ecommerce",
    "alternativeTo": [],
    "shape": "business-app",
    "formFactor": "web-app",
    "executionModel": "deterministic",
    "provenance": "unknown",
    "codeStack": {
      "languages": [
        "Python",
        "TypeScript"
      ],
      "frameworks": [
        "Django",
        "Django REST Framework",
        "React"
      ],
      "packageManager": "pip, npm",
      "database": [
        "PostgreSQL",
        "MySQL",
        "MariaDB",
        "SQLite"
      ],
      "hostingTarget": [
        "docker",
        "bare metal",
        "installer script"
      ]
    },
    "modelStack": null,
    "repos": [
      {
        "url": "https://github.com/inventree/InvenTree",
        "owner": "inventree",
        "name": "InvenTree",
        "license": "MIT",
        "stars": 7824,
        "lastCommit": "2026-11-06"
      }
    ],
    "interface": {
      "kind": "api",
      "url": "https://docs.inventree.org/en/latest/api/",
      "official": true,
      "hosted": "local"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Organize parts and categories",
        "reachable": true,
        "evidence": "OpenAPI schema v571: /api/part/, /api/part/category/, both with POST"
      },
      {
        "job": "Manage suppliers, manufacturers and customers",
        "reachable": true,
        "evidence": "OpenAPI schema: /api/company/, /api/company/part/, /api/company/contact/"
      },
      {
        "job": "Track stock items and locations",
        "reachable": true,
        "evidence": "OpenAPI schema: /api/stock/, /api/stock/location/, /api/stock/{id}/install/"
      },
      {
        "job": "Manage bills of materials",
        "reachable": true,
        "evidence": "OpenAPI schema: /api/bom/, /api/bom/{id}/validate/, /api/part/{id}/bom-copy/"
      },
      {
        "job": "Run build orders",
        "reachable": true,
        "evidence": "OpenAPI schema: /api/build/, /api/build/{id}/allocate/, /api/build/{id}/complete/"
      },
      {
        "job": "Purchase, sales and return orders",
        "reachable": true,
        "evidence": "OpenAPI schema: /api/order/po/, /api/order/so/, /api/order/ro/, each with complete, cancel and hold actions"
      },
      {
        "job": "Generate reports and labels",
        "reachable": true,
        "evidence": "OpenAPI schema: /api/report/print/, /api/label/print/, /api/report/template/"
      },
      {
        "job": "Scan and link barcodes",
        "reachable": true,
        "evidence": "OpenAPI schema: /api/barcode/, /api/barcode/link/"
      },
      {
        "job": "Change system settings and plugins",
        "reachable": true,
        "evidence": "OpenAPI schema: /api/settings/global/, /api/plugins/{plugin}/activate/; permissions follow the token's user"
      },
      {
        "job": "Install, migrate and upgrade the server",
        "reachable": false,
        "evidence": "No upgrade or migration path in schema v571; these run through invoke, docker and the installer script"
      }
    ],
    "editions": [
      {
        "name": "Free",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/inventree/InvenTree"
          },
          {
            "kind": "one-click",
            "url": "https://docs.inventree.org/en/latest/start/installer/",
            "command": "wget -qO install.sh https://get.inventree.org && bash install.sh"
          },
          {
            "kind": "container",
            "url": "https://docs.inventree.org/en/latest/start/docker/"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "AGENTS.md and CLAUDE.md in the repo are contributor guidance; no adopter-facing SKILL.md found."
    },
    "customization": {
      "summary": "config.yaml or INVENTREE_* env vars set deployment (site URL, database, email) and also business behavior: INVENTREE_GLOBAL_SETTINGS overrides any global setting and locks it in the UI, INVENTREE_PLUGIN_SETTINGS does the same for plugins, and INVENTREE_CUSTOM_LOGO, INVENTREE_CUSTOM_SPLASH and INVENTREE_CUSTOMIZE set branding and login messages. The same settings can be changed in the admin, and report and label templates are edited in the app. Custom behavior beyond settings means writing a Python plugin.",
      "envVars": [
        "INVENTREE_GLOBAL_SETTINGS",
        "INVENTREE_PLUGIN_SETTINGS",
        "INVENTREE_CUSTOMIZE",
        "INVENTREE_CUSTOM_LOGO",
        "INVENTREE_CUSTOM_SPLASH",
        "INVENTREE_SITE_URL",
        "INVENTREE_TIMEZONE",
        "INVENTREE_LANGUAGE",
        "INVENTREE_DB_ENGINE",
        "INVENTREE_DB_NAME",
        "INVENTREE_DB_HOST",
        "INVENTREE_EMAIL_HOST",
        "INVENTREE_EMAIL_SENDER",
        "INVENTREE_AUTO_UPDATE",
        "INVENTREE_PLUGINS_ENABLED",
        "INVENTREE_CONFIG_FILE",
        "INVENTREE_BACKUP_DIR"
      ],
      "configFiles": [
        "config.yaml"
      ],
      "promptFiles": [],
      "effort": "config-only",
      "editCount": 18
    },
    "useWhen": [
      "you track parts, stock and BOMs for a small manufacturing or electronics shop and want your agent to log and query it",
      "you want purchase and sales orders handled through an API instead of a spreadsheet"
    ],
    "accounts": [],
    "active": true,
    "lastActivity": "2026-11-06",
    "gotchas": [
      "The MCP plugin (inventree/inventree-mcp, 5 stars, created 2026-07) is read-only; the README says write tools have not landed, and plugin support must be turned on first",
      "API access follows the token user's roles; basic auth is refused for users with MFA",
      "It is an inventory system. Storefront and checkout come from separate plugins or an outside shop",
      "AGENTS.md says no pull request without manual human review, and no AI-generated issues"
    ],
    "fit": {
      "adaptable": 3,
      "operable": 3
    },
    "evidence": {
      "formFactor": "README: Django backend with web admin and React client, REST API, plugin system",
      "executionModel": "no model in the stack",
      "operability": "docs.inventree.org/en/latest/api (token, basic and OAuth2 auth); schema at inventree/schema export/571/api.yaml (326 paths, generated from source by the lead developer); inventree-python (MIT, org repo); inventree/inventree-mcp README",
      "effort": "docs/docs/start/config.md sections Customization Options and Override Global Settings; read in src/backend/InvenTree/InvenTree/settings.py as INVENTREE_GLOBAL_SETTINGS and INVENTREE_CUSTOMIZE; docs/docs/settings/global.md says an override makes the setting read-only in the UI",
      "editions": "README and docs describe a self-hosted MIT edition; inventree.org and inventree.org/deploy.html list no paid edition or price. The DigitalOcean app comes from a team member and has no price there.",
      "active": "gh api: pushed 2026-11-06, feature and bug fix commits this week, release 1.7.0 on 2026-11-03"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.95,
      "operability": 0.9,
      "effort": 0.85,
      "reach": 0.9,
      "editions": 0.75,
      "provenance": 0.3
    },
    "openQuestions": [
      "Write tools in the MCP plugin: not landed in v0.4.1. Check before relying on it."
    ],
    "sources": [
      {
        "url": "https://inventree.org",
        "foundBy": "sourcing:ecommerce:github"
      },
      {
        "url": "https://github.com/inventree/InvenTree",
        "foundBy": "analysis"
      },
      {
        "url": "https://github.com/inventree/inventree-mcp",
        "foundBy": "analysis"
      }
    ],
    "published": true,
    "lastCheckedAt": "2026-11-06",
    "research": {
      "stage": "verified",
      "verdict": "approve",
      "reason": "Verified: MIT, 7.8k stars, commits this week, token-auth REST API from the same org. Interface stays api because the MCP plugin is read-only; it is recorded in mcpServer. Schema v571 was read directly and write methods confirmed. Effort moved to config-only: the analyst missed INVENTREE_GLOBAL_SETTINGS and the branding options, which change business behavior. Ecommerce is kept on precedent, since UnoPim and Karrio are back-office listings there.",
      "disputed": []
    },
    "mcpServer": {
      "url": "https://github.com/inventree/inventree-mcp",
      "evidence": "Plugin from the InvenTree org, v0.4.1 on PyPI. Its README says it is currently read-only and wraps the REST API views, so Reach is recorded through the API."
    },
    "url": "apps/inventree--InvenTree.html",
    "coverage": "partial",
    "paid": false,
    "source": "research/verified/inventree--InvenTree.json"
  }
}
