# InvenTree

Open-source inventory and parts system with a REST API, Python SDK and read-only MCP plugin.

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
- Shape: business-app
- Form factor: web-app
- Execution model: deterministic
- Provenance: unknown (recorded, never ranked)
- Repo: https://github.com/inventree/InvenTree (MIT), 7824 stars, last commit 2026-11-06
- Last activity: 2026-11-06
- Page: apps/inventree--InvenTree.html
- JSON: apps/inventree--InvenTree.json

## Use it when

- 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

## 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

## Editions

- Free: Free, open source
  - source: https://github.com/inventree/InvenTree
  - one-click: wget -qO install.sh https://get.inventree.org && bash install.sh
  - container: https://docs.inventree.org/en/latest/start/docker/

## Adaptable: make it yours

Effort: config-only (18 things to edit)

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.

- Env vars: 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
- Config files: config.yaml
- Prompt files: none
- Accounts you'll need: none

## Operable: what an agent can drive

Operability: official. Interface: api at https://docs.inventree.org/en/latest/api/ (published by the builder, local).

### Reach (partial coverage)

- Organize parts and categories: reachable. OpenAPI schema v571: /api/part/, /api/part/category/, both with POST
- Manage suppliers, manufacturers and customers: reachable. OpenAPI schema: /api/company/, /api/company/part/, /api/company/contact/
- Track stock items and locations: reachable. OpenAPI schema: /api/stock/, /api/stock/location/, /api/stock/{id}/install/
- Manage bills of materials: reachable. OpenAPI schema: /api/bom/, /api/bom/{id}/validate/, /api/part/{id}/bom-copy/
- Run build orders: reachable. OpenAPI schema: /api/build/, /api/build/{id}/allocate/, /api/build/{id}/complete/
- Purchase, sales and return orders: reachable. OpenAPI schema: /api/order/po/, /api/order/so/, /api/order/ro/, each with complete, cancel and hold actions
- Generate reports and labels: reachable. OpenAPI schema: /api/report/print/, /api/label/print/, /api/report/template/
- Scan and link barcodes: reachable. OpenAPI schema: /api/barcode/, /api/barcode/link/
- Change system settings and plugins: reachable. OpenAPI schema: /api/settings/global/, /api/plugins/{plugin}/activate/; permissions follow the token's user
- Install, migrate and upgrade the server: not reachable. No upgrade or migration path in schema v571; these run through invoke, docker and the installer script

## Code stack

- Languages: Python, TypeScript
- Frameworks: Django, Django REST Framework, React
- Package manager: pip, npm
- Database: PostgreSQL, MySQL, MariaDB, SQLite
- Hosting target: docker, bare metal, installer script

## Evidence and confidence

- formFactor: README: Django backend with web admin and React client, REST API, plugin system (confidence 0.95)
- executionModel: no model in the stack (confidence 0.95)
- 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 (confidence 0.9)
- 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 (confidence 0.85)
- 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. (confidence 0.75)
- active: gh api: pushed 2026-11-06, feature and bug fix commits this week, release 1.7.0 on 2026-11-03
- reach:  (confidence 0.9)
- provenance:  (confidence 0.3)

## Open questions

- Write tools in the MCP plugin: not landed in v0.4.1. Check before relying on it.

## Sources

- https://inventree.org (sourcing:ecommerce:github)
- https://github.com/inventree/InvenTree (analysis)
- https://github.com/inventree/inventree-mcp (analysis)
