odoo について
odoo は、AI エージェントから Odoo ERP のレコードや設定を扱うための MCP サーバーです。Odoo 17~18 と 19 以降の API に対応し、安全な閲覧向けの読み取り専用モードも備えています。
主な機能
- 01レコードの検索、件数取得、エクスポート
- 02レコードの作成、更新、削除
- 03Odoo モデルメソッドの実行
- 04モデル、フィールド、ビューの確認
- 05デフォルト値とウィンドウアクションの変更
- 06インスタンスの状態診断
活用シーン
- 01販売注文や連絡先の確認
- 02表計算用の商品レコードの出力
- 03必須フィールドやモデルビューの確認
- 04本番データの読み取り専用閲覧
MCP 対応
stdio 経由で、Odoo のデータ、モデル探索、設定、診断ツールを MCP クライアントに公開します。認証済み接続を維持し、読み取り専用モードでは書き込み操作を無効にできます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://mcp.odooconsole.com/mcpclaude mcp add --transport http com-odooconsole-odoo https://mcp.odooconsole.com/mcp{"mcpServers":{"com-odooconsole-odoo":{"type":"http","url":"https://mcp.odooconsole.com/mcp"}}}Cursor で開く{"servers":{"com-odooconsole-odoo":{"type":"http","url":"https://mcp.odooconsole.com/mcp"}}}VS Code で開く{"mcpServers":{"com-odooconsole-odoo":{"type":"http","url":"https://mcp.odooconsole.com/mcp"}}}{"mcpServers":{"com-odooconsole-odoo":{"serverUrl":"https://mcp.odooconsole.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
Odoo MCP Server
AI エージェントを Odoo ERP インスタンスに接続する MCP(Model Context Protocol) サーバーです。Claude Code、Cursor、Windsurf、および MCP 対応のあらゆるクライアントで使用できます。
Odoo 17-18(JSON-RPC)と Odoo 19+(JSON-2 API)に対応し、最適なプロトコルを自動検出します。

クイックスタート
# Run directly (uv handles dependencies automatically)
ODOO_URL=https://my.odoo.com ODOO_DB=mydb ODOO_USER=admin ODOO_PASSWORD=secret \
uv run odoo_mcp_server.py
仮想環境や pip install は不要です。このスクリプトには インラインメタデータ が含まれており、uv が自動的に解決します。
Claude Code で設定する
プロジェクトの .mcp.json に追加します。
{
"mcpServers": {
"odoo": {
"type": "stdio",
"command": "uv",
"args": ["run", "--python", "3.11", "--script", "/path/to/odoo_mcp_server.py"],
"env": {
"ODOO_URL": "https://your-instance.odoo.com",
"ODOO_DB": "your-database",
"ODOO_USER": "admin",
"ODOO_PASSWORD": "your-password"
}
}
}
}
または、API キー認証を使用する Odoo 19+ の場合:
{
"mcpServers": {
"odoo": {
"type": "stdio",
"command": "uv",
"args": ["run", "--python", "3.11", "--script", "/path/to/odoo_mcp_server.py"],
"env": {
"ODOO_URL": "https://your-instance.odoo.com",
"ODOO_DB": "your-database",
"ODOO_USER": "admin",
"ODOO_API_KEY": "your-api-key"
}
}
}
}
Cursor / Windsurf で設定する
~/.cursor/mcp.json または同等のファイルに追加します。
{
"mcpServers": {
"odoo": {
"command": "uv",
"args": ["run", "--python", "3.11", "--script", "/path/to/odoo_mcp_server.py"],
"env": {
"ODOO_URL": "https://your-instance.odoo.com",
"ODOO_DB": "your-database",
"ODOO_USER": "admin",
"ODOO_PASSWORD": "your-password"
}
}
}
}
環境変数
| 変数 | 必須 | 説明 |
|---|---|---|
ODOO_URL | はい | Odoo インスタンスの URL |
ODOO_DB | はい | データベース名 |
ODOO_USER | はい | ログインユーザー名 |
ODOO_PASSWORD | いずれか一方 | パスワード(Odoo 17-18) |
ODOO_API_KEY | 必須 | API キー(Odoo 19+、推奨) |
ODOO_READONLY | いいえ | true に設定すると、すべての書き込み操作が無効になります |
読み取り専用モード
ODOO_READONLY=true に設定すると、create、update、delete、および execute ツールが無効になります。本番インスタンスを安全に閲覧する場合に便利です。
{
"mcpServers": {
"odoo": {
"type": "stdio",
"command": "uv",
"args": ["run", "--python", "3.11", "--script", "/path/to/odoo_mcp_server.py"],
"env": {
"ODOO_URL": "https://production.odoo.com",
"ODOO_DB": "prod",
"ODOO_USER": "readonly-user",
"ODOO_PASSWORD": "secret",
"ODOO_READONLY": "true"
}
}
}
}
利用可能なツール
基本的な CRUD
| ツール | 説明 |
|---|---|
odoo_search_read | ドメインフィルター、フィールド選択、ページネーションを使ってレコードを検索 |
odoo_search_count | データを取得せずに一致するレコード数をカウント |
odoo_export | スプレッドシート用に、1 回の呼び出しで最大 2000 件のレコードを一括エクスポート |
odoo_create | 新しいレコードを作成 |
odoo_update | ID を指定して既存のレコードを更新 |
odoo_delete | ID を指定してレコードを削除 |
odoo_execute | 任意のモデルメソッドを実行(action_confirm、action_post など) |
検出
| ツール | 説明 |
|---|---|
odoo_list_models | キーワードフィルターを使って利用可能なモデルを検出 |
odoo_get_fields | 任意のモデルのフィールド定義を確認 |
odoo_doctor | ヘルス診断(バージョン、モジュール、ユーザー、cron、エラー) |
odoo_connection_info | 現在の接続情報を表示 |
モデルのカスタマイズ
| ツール | 説明 |
|---|---|
odoo_model_info | フィールド、ビュー、アクション、デフォルト値、並び順など、モデルの包括的なメタデータを 1 回の呼び出しで取得 |
odoo_set_default | フィールドのデフォルト値を設定、更新、またはクリア(ir.default と JSON エンコーディングに対応) |
odoo_get_view | 完全にレンダリングされた(マージ済みの)フォーム/ツリー/検索ビュー XML を取得 |
odoo_modify_action | ウィンドウアクションのドメイン、コンテキスト、並び順、上限、またはビューのモードを変更 |
使用例
設定したら、AI エージェントに次のように依頼します。
- 「今月のすべての販売注文を一覧表示して」
- 「res.partner のフィールドを表示して」
- 「Acme Corp という名前の新しい連絡先を作成して」
- 「Odoo インスタンスのヘルスチェックを実行して」
- 「すべての商品をスプレッドシートにエクスポートして」
- 「販売注文 42 を確定して」
モデルカスタマイズの例
- 「sale.order のデフォルトの並び順は?」
- 「商品のデフォルトの請求ポリシーを 'delivery' に変更して」
- 「res.partner のフォームビューを表示して」
- 「account.move にはどのようなウィンドウアクションがある?デフォルトの並び順を date desc に変更して」
- 「res.partner のカスタムフィールドをすべて一覧表示して」
- 「sale.order で必須のフィールドは?」
モデルカスタマイズツール — 詳細リファレンス
odoo_model_info
1 回の呼び出しですべてのモデル情報を返すため、複数回の調査クエリが不要になります。
odoo_model_info(model="sale.order")
返される情報:
default_order— モデルの_order属性(例:"date_order desc, id desc")rec_name— ドロップダウンで表示名に使用されるフィールドfield_count— フィールドの総数fields_by_type— 型ごとに分類したフィールド数(many2one: 12, char: 8, ...)custom_fields— ユーザーが作成したフィールド(x_ プレフィックスまたは state=manual)relational_fields— 対象を含む、すべての Many2one、One2many、Many2manyrequired_fields— 入力必須のフィールドviews— ID と優先度を含むベースビュー(form、tree、search)actions— ドメイン、コンテキスト、ビューのモードを含むウィンドウアクションdefaults— このモデルのフィールドに設定されている現在の ir.default 値
odoo_set_default
適切な JSON エンコードを行い、ir.default を使ってフィールドのデフォルト値を管理します。手動で設定する際に、エージェントが最もよくエラーを起こす原因です。
# Set global default
odoo_set_default(model="product.template", field_name="invoice_policy", value="delivery")
# Set user-specific default
odoo_set_default(model="sale.order", field_name="warehouse_id", value=2, user_id=5)
# Remove a default
odoo_set_default(model="product.template", field_name="invoice_policy", value=null)
このツールは以下を行います。
- ir.model.fields から field_id を検索します(フィールドが存在することを検証します)
- 値を自動的に JSON エンコードします
- ir.default レコードを作成または更新します
- 確認のため、変更前と変更後の値を返します
odoo_get_view
継承がすべて適用された、完全にレンダリング済みのビュー XML を返します。ir.ui.view に保存された未加工の断片ではなく、ユーザーが実際に目にする内容です。
odoo_get_view(model="sale.order", view_type="form")
odoo_get_view(model="res.partner", view_type="tree")
odoo_get_view(model="account.move", view_type="search")
返される情報:
arch— 結合後の完全な XMLview_id— ベースビューの IDfields_in_view— ビューに含まれるフィールド名の一覧
odoo_modify_action
ウィンドウアクション(ir.actions.act_window)を変更して、モデルが UI 上でどのように表示されるかを変更します。
# List actions for a model (read-only)
odoo_modify_action(model="sale.order")
# Change default sort order
odoo_modify_action(action_id=42, order="date_order desc")
# Change default filter and page size
odoo_modify_action(action_id=42, domain="[['state','=','sale']]", limit=200)
# Add default grouping via context
odoo_modify_action(action_id=42, context="{'group_by': 'partner_id'}")
このツールは変更前と変更後の値を返すため、変更内容を確認できます。
仕組み
AI Agent (Claude, Cursor, etc.)
↕ MCP Protocol (stdio)
Odoo MCP Server
↕ JSON-RPC / JSON-2 API
Odoo Instance
サーバーは起動時に一度だけ認証を行い、永続的な接続を維持します。すべてのツールが同じ認証済みセッションを使用します。
要件
- Python 3.11+
- uv(推奨)、または
pip install fastmcp httpx
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。