Odoo Indexer Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Odoo Indexer Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A lightweight MCP (Model Context Protocol) server for indexing Odoo code elements. Designed to help coding agents quickly look up models, fields, functions, views, and other Odoo components with their exact file locations.
Each element can have multiple file:line references:
# Clone or navigate to the project
cd odoo-index-mcp
# Create .env file
cp .env.example .env
# Edit .env and set your ODOO_PATH
nano .env
# Install dependencies with uv
uv sync# Full indexing
uv run python cli.py --index
# Incremental indexing (skip unchanged files)
uv run python cli.py --index --incremental
# Index specific modules
uv run python cli.py --index --modules sale,account,stock
# Clear database and re-index
uv run python cli.py --clear --index
# Show statistics
uv run python cli.py --stats
# Search from CLI
uv run python cli.py --search "sale.order" --type model
uv run python cli.py --search "partner_id" --type field --module sale
# Search XML IDs
uv run python cli.py --search-xml-id "action_view_%"
uv run python cli.py --search-xml-id "action_view_sale_order" --module sale# Start MCP server
uv run odoo-index-mcpAdd to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"odoo-index": {
"command": "uv",
"args": ["run", "odoo-index-mcp"],
"cwd": "/path/to/odoo-index-mcp",
"env": {
"ODOO_PATH": "/path/to/odoo"
}
}
}
}The server provides 7 MCP tools:
search_odoo_indexSearch for elements by name with wildcard support.
Parameters:
query (str): Search term (supports SQL LIKE with %)item_type (str, optional): Filter by typemodule (str, optional): Filter by moduleparent_name (str, optional): Filter by parent (for fields/methods)limit (int, default=50): Max resultsExample:
search_odoo_index(query="sale.order", item_type="model")
search_odoo_index(query="partner%", item_type="field", module="sale")get_item_detailsGet complete details for a specific element including related items.
Parameters:
item_type (str): Type of itemname (str): Item nameparent_name (str, optional): Parent (for fields/methods)module (str, optional): Module to disambiguateExample:
get_item_details(item_type="model", name="sale.order")
get_item_details(item_type="field", name="partner_id", parent_name="sale.order")list_modulesList all indexed modules with item counts.
Parameters:
pattern (str, optional): Filter by name patternExample:
list_modules()
list_modules(pattern="sale")get_module_statsGet detailed statistics for a module.
Parameters:
module (str): Module nameExample:
get_module_stats(module="sale")find_referencesFind all references to an element across the codebase.
Parameters:
item_type (str): Type of itemname (str): Item namereference_type (str, optional): Filter by type (definition/inheritance/etc)Example:
find_references(item_type="model", name="sale.order")
find_references(item_type="model", name="sale.order", reference_type="inheritance")search_by_attributeAdvanced search by element attributes.
Parameters:
item_type (str): Type to searchattribute_filters (dict): Attribute filtersmodule (str, optional): Filter by modulelimit (int, default=50): Max resultsExample:
# Find all Many2one fields
search_by_attribute(
item_type="field",
attribute_filters={"field_type": "Many2one"}
)
# Find all transient models (wizards)
search_by_attribute(
item_type="model",
attribute_filters={"model_type": "transient"}
)
# Find all form views
search_by_attribute(
item_type="view",
attribute_filters={"view_type": "form"}
)search_xml_idSearch for XML IDs by name pattern.
Parameters:
query (str): Search term (supports SQL LIKE patterns with %)module (str, optional): Filter by modulelimit (int, default=50): Max resultsExample:
# Find all action_view XML IDs
search_xml_id(query="action_view_%")
# Find specific action
search_xml_id(query="action_view_sale_order")
# Find form views in sale module
search_xml_id(query="%_form_view", module="sale")Environment variables in .env:
# Required
ODOO_PATH=/path/to/odoo
# Optional (with defaults)
SQLITE_DB_PATH=./odoo_index.db
LOG_LEVEL=INFO
MAX_CONCURRENT_MODULES=4
MAX_CONCURRENT_FILES=8odoo-index-mcp/
├── pyproject.toml # uv project config
├── .env.example # Environment template
├── .python-version # Python version
├── README.md # This file
├── cli.py # CLI tool
├── odoo_index_mcp/
│ ├── __init__.py
│ ├── config.py # Configuration
│ ├── database.py # SQLite operations
│ ├── indexer.py # Main indexing logic
│ ├── server.py # FastMCP server
│ ├── tools.py # MCP tool implementations
│ └── parsers/
│ ├── __init__.py
│ ├── python_parser.py # AST parsing for Python
│ ├── xml_parser.py # XML parsing for views/data
│ ├── csv_parser.py # CSV parsing for access rights
│ └── manifest_parser.py # Manifest file parsingThe index uses a normalized SQLite schema with 3 main tables:
All queries use proper indexes for fast lookups.
# Install development dependencies
uv sync
# Run tests (TODO: add tests)
uv run pytest
# Format code
uv run black .
# Type checking
uv run mypy .MIT
Contributions welcome! Please:
For issues or questions:
Future enhancements (not in v1):
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.