Contributing and license¶
Thank you for helping to improve MCP-Odoo-Tools.
New in v1.6.0
- Each command on its surface: in the repository's guides, a
/plugincommand goes in atextblock (it is typed inside Claude Code) and never in a terminal block, andclaude plugingoes in the terminal. A test checks it (server/tests/test_install_surfaces.py). CLAUDE.mdlives in.claude/CLAUDE.md, soclaude plugin validate --strictpasses without a warning.
New in v1.5.1
- Product rules: read
docs/product-rules.mdbefore a change that affects where the plugin installs, what it says on a surface where its tools cannot run, credentials or diagnostics. - This manual: every pull request says what changes here, or why nothing does.
New in v1.5.0
- Scope: a generic, declarative permission policy is part of the public core.
- New tools: each one must declare what it touches for the permission policy, with its internal calls and a test row (see Server below).
New in v1.4.1
The clean-room rule now also covers proprietary Odoo modules (Odoo Proprietary License, OPL-1) and any code whose license does not allow redistribution under MIT, and a test checks that no file in the repository declares a license that MIT cannot absorb.
Ground rules¶
- License: contributions are accepted under the MIT license.
- Clean-room: do not copy code from AGPL-licensed Odoo MCP projects, nor from proprietary ones: Odoo Apps modules under the Odoo Proprietary License (OPL-1), or any code whose license does not allow redistribution under MIT. Such projects may inform ideas, read from their public documentation; never their code, tests, prompts or tool descriptions. Interoperate with them only over the network. Rely only on Odoo's public XML-RPC/JSON-RPC/JSON-2 interfaces and on the public model/field names.
- Product rules: read
docs/product-rules.mdbefore a change that affects where the plugin installs, what it says on a surface where its tools cannot run, credentials or diagnostics. The plugin installs on every surface Anthropic allows and is never blocked on one. - Scope: this repository is the public generic core. A generic, declarative permission policy is part of the public core; approval workflows, localization engines (CFDI and the like), backups and other client-specific engines are not, and live elsewhere.
Server (Python)¶
cd server
python3 -m venv .venv && . .venv/bin/activate
pip install -e ".[dev,cache]"
ruff check src tests
pytest -q -m "not live"
- No runtime dependencies (
dependencies = []): the plugin runs the source as-is withpython3and installs nothing, so a mandatory import of a third-party package would break its start. Optional capabilities must degrade gracefully, like the existing extras. The code must stay compatible with Python 3.9 (CI tests 3.9, 3.11, 3.12 and 3.13; ruff targetspy39), andrun_stdio.pymust stay readable by older interpreters so it can show its version error. Thedevextra includes the officialmcpSDK (Python ≥ 3.10) only for an interoperability test; the server never imports it. - Tests marked
live(-m live) run against a real Odoo sandbox and are optional. tests/test_license_hygiene.pyfails CI if a file in the repository, tracked or not, declares a license that MIT cannot absorb (for example an OPL-1 or (L/A)GPLlicensein an Odoo manifest, the OPL-1 or AGPL title in a file that is not Markdown, or an SPDX expression with such an id). Mentions in Markdown documentation stay allowed.- Changing a cross-version behavior? Edit
src/odoo_mcp/compat/deltas.py(data) and add a row totests/test_compat_resolve.py. The boundaries you cannot verify live are commented as "best-effort". - New tool? Register it in
src/odoo_mcp/tools/with theregistrydecorator and route the model/field names throughcompatbefore the ORM. Since v1.5.0 it must passaccess=(what it touches, for the permission policy), declare its internal calls with predicates (registry.Internal(model, methods, check=..., reason=...), with one positive and one negative test) and add aGOLDENrow totests/test_policy_mapping.py; the mapping and coverage tests explain what is missing when they fail. A write tool also statesdestructive=. Then refresh the tables ofdocs/policy.mdwithpython3 scripts/policy_docs.py --write(CI checks them). See Tool mapping.
CLI (TypeScript)¶
Pull requests¶
- Keep changes focused; include tests for the logic.
- Say in the pull request what changes in the manual at docs.transgenia.org, or why nothing does (product rule 8). Transgenia's maintainers update the manual in Spanish, English and Chinese in the same release.
- Update
docs/compat-matrix.mdwhen the delta map changes. - Note any new Odoo version/edition you have verified against.
License¶
MIT © Transgenia (Centrum Transgenia SAS). See
LICENSE
and NOTICE
for the third-party attributions.
Attributions¶
- odoo-agent (MIT): by Francisco Ramírez. The TypeScript XML-RPC CLI
(
cli/), the generic Odoo agent definition (agents/odoo.md, adapted), the domain-knowledge context and the SessionStart hook pattern (adapted) are reused.
Clean-room declaration¶
The Python MCP server (server/) is an original, independent
implementation. It does not copy or adapt code from any AGPL-licensed
Odoo MCP project (or its forks), nor from any proprietary Odoo module,
including modules distributed under the Odoo Proprietary License (OPL-1) on
Odoo Apps (which are not part of Odoo). Where it works with such a module, it
does so only over the network, as a client. It relies solely on Odoo's
publicly documented XML-RPC/JSON-RPC/JSON-2 interfaces and on the public
model/field nomenclature, which are not subject to copyright. Any similarity in behavior reflects those public interfaces, not
shared code.
Odoo trademark
"Odoo" is a registered trademark of Odoo S.A. This project is an independent, community-oriented tool, not affiliated with or endorsed by Odoo S.A.