0.9.0 — async tasks, local knowledge search, accounting pack, rate limiting
Highlights
Tool surface: 27 → 36. This release ships the three capabilities no other Odoo MCP bridge has, plus an internal re-architecture.
Background tasks
submit_async_task runs allowlisted long read operations (addon scans, knowledge indexing, AR/AP aging) on a bounded worker pool — the agent keeps reasoning and polls with get_async_task. Results are TTL'd and size-capped; writes are never accepted on the async path.
Local-first knowledge search
index_knowledge fetches a bounded record slice once and builds an in-process BM25 index; search_knowledge answers free-text queries with relevance ranking and zero further RPC calls. Accent-insensitive ("hoa don" matches "hóa đơn"), no embeddings service, no new dependencies, no data leaving the machine.
Accounting pack (read-only)
receivable_payable_aging buckets open posted items by days overdue (not due / 1-30 / 31-60 / 61-90 / 90+) with per-partner totals; accounting_health_summary reports open AR/AP counts and the draft invoice backlog. Odoo 16+.
Rate limiting (opt-in)
ODOO_MCP_RATE_LIMIT_MODE=warn|block tracks per-instance:tool call volume in a sliding window; block refuses over-budget calls on the hot tools. Default off.
Architecture
server.py (2,553 lines) is now a thin re-export surface over domain modules (server_core, tools_read/write/diagnostics/knowledge/accounting/async, prompts). Full backward compatibility — every public symbol still imports from odoo_mcp.server. .importlinter enforces the layering (2 contracts kept).
Also
- Benchmark harness:
scripts/benchmark_tools.py+ docs/benchmarks.md — measured p50 12–25 ms per read tool over MCP stdio against a local Odoo 19 stack. - Claude Desktop Custom Connector guide over Streamable HTTP + OAuth 2.1.
- 804 tests (up from 497), real Docker smoke on Odoo 19 before this release.
Full changelog: CHANGELOG.md