Odoo 索引 MCP
一个轻量级的MCP(模型上下文协议)服务器,用于索引Odoo代码元素。其设计旨在帮助编码人员快速查找模型、字段、函数、视图以及其他Odoo组件,并提供它们的确切文件位置。
特点/特性
- 快速索引使用Python的AST解析和lxml处理XML
- 增量更新仅对更改过的文件重新索引(使用MD5哈希跟踪)
- 全面覆盖索引模型、字段、方法、视图、菜单、操作、访问权限、规则、计划任务、报告模板、控制器路由等
- 多个参考文献追踪所有出现情况(定义、继承、覆盖等)
- 轻便的纯SQLite,无向量数据库,无嵌入(或无向量嵌入)
- 与MCP兼容与Claude Desktop及其他MCP客户端兼容
什么是被索引的
核心要素
- 模型名称、类型(常规/瞬时/抽象)、继承
- 字段名称、类型、属性(必填、只读、计算、相关联等)
- 函数/方法名称、装饰器(@api.depends, @api.onchange 等)
- 观点类型(表单/树形结构/看板/搜索)、模型、继承
- 菜单层级、操作、安全组
- 行动类型(act_window/server/report)、模型、域
- 访问权限通过安全组管理模型权限
- 记录规则基于域的访问规则
- 控制器路由带有认证类型的HTTP/JSON路由
- 计划中的操作带有间隔时间的计划任务(Cron jobs)
- 报告模板QWeb 模板
- 模块元数据依赖项、版本、描述
多个参考文献
每个元素可以有多个文件:行号引用:
- 定义它最初被定义的地方
- 继承模型得以扩展的地方
- 以(权力)否决在方法/字段被重写的地方
- 参考;引用它被引用的地方
- 修改;变更使用XPath修改视图
安装
先决条件
- Python 3.10及以上版本
- UV包管理器
设置
# 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使用
命令行界面工具(CLI Tool)
# 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 saleMCP服务器
# Start MCP server
uv run odoo-index-mcpClaude 桌面集成
添加到您的Claude桌面配置中(~/Library/Application Support/Claude/claude_desktop_config.json (在 macOS 上):
{
"mcpServers": {
"odoo-index": {
"command": "uv",
"args": ["run", "odoo-index-mcp"],
"cwd": "/path/to/odoo-index-mcp",
"env": {
"ODOO_PATH": "/path/to/odoo"
}
}
}
}MCP 工具
服务器提供了7种MCP工具:
1. search_odoo_index
支持通配符的元素名称搜索。
参数:
query(str): 搜索词(支持SQL LIKE语法,使用%作为通配符)item_type(str, 可选):按类型过滤module(字符串,可选):按模块过滤parent_name(str,可选):按父级过滤(针对字段/方法)limit(int, default=50): 最大结果数
示例:
search_odoo_index(query="sale.order", item_type="model")
search_odoo_index(query="partner%", item_type="field", module="sale")2. get_item_details
获取特定元素的完整详细信息,包括相关项目。
参数:
item_type(字符串): 项目类型name(str): 项目名称parent_name(字符串, 可选): 父类(对于字段/方法而言)module(str,可选):用于消除歧义的模块
示例:
get_item_details(item_type="model", name="sale.order")
get_item_details(item_type="field", name="partner_id", parent_name="sale.order")3. list_modules
列出所有已索引的模块及其条目数。
参数:
pattern(str, 可选): 按名称模式过滤
示例:
list_modules()
list_modules(pattern="sale")4. get_module_stats
获取模块的详细统计数据。
参数:
module(字符串): 模块名称
示例:
get_module_stats(module="sale")5. find_references
在代码库中查找所有对该元素的引用。
参数:
item_type(str): 项目类型name(字符串): 项目名称reference_type(字符串,可选):按类型过滤(定义/继承/等)
示例:
find_references(item_type="model", name="sale.order")
find_references(item_type="model", name="sale.order", reference_type="inheritance")6. search_by_attribute
按元素属性进行高级搜索。
参数:
item_type(字符串): 输入要搜索的内容attribute_filters(字典): 属性过滤器module(str, 可选): 按模块过滤limit(int, 默认=50): 最大结果数
示例:
# 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"}
)7. search_xml_id
按名称模式搜索XML ID。
参数:
query(str): 搜索词(支持带有%的SQL LIKE模式)module(字符串,可选):按模块过滤limit(int, 默认值=50):最大结果数
示例:
# 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")演出
- 索引速度~500-1000个文件/秒,支持并发处理和异步数据库操作
- 数据库大小典型的Odoo安装大约需要50-100MB的空间
- 搜索速度精确匹配\<50毫秒,模式搜索\<200毫秒
- 内存使用情况索引时小于500MB,服务时小于100MB
- 数据库使用aiosqlite实现异步连接池以进行高效并发写入
配置
环境变量在 .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=8项目结构
odoo-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 parsing数据库模式
该索引使用了一个标准化的SQLite架构,包含3个主要表:
- 索引项核心项目数据(类型、名称、模块、属性JSON)
- 项目引用文件位置(与项目为多对一关系)
- 文件元数据用于增量索引的文件哈希值
所有查询都使用了适当的索引以实现快速查找。
发展
# Install development dependencies
uv sync
# Run tests (TODO: add tests)
uv run pytest
# Format code
uv run black .
# Type checking
uv run mypy .许可证
麻省理工学院(MIT)
贡献;做出贡献
欢迎投稿!请:
- 为仓库创建分支(或“克隆仓库”)
- 创建一个特性分支
- 为新功能添加测试
- 提交拉取请求
支持
对于问题或疑问:
- 在GitHub上打开一个议题(或问题)
- 查看 ODOO_CODE_INDEXER.md 中的文档
路线图
未来的增强功能(v1中未包含):
- \[ \] 调用图分析
- \[ \] 在方法体中进行全文搜索
- \[ \] 依赖关系图可视化
- \[ \] 监视模式(更改时自动重新索引)
- \[ \] 用于浏览的网页用户界面
- \[ \] 导出为其他格式
