mcp-odoo について
mcp-odoo は、Community および Enterprise 16 以降の Odoo データベースを MCP クライアントに公開する MCP サーバーです。オープンソースの Python 版はローカルや Docker で動作し、同じメンテナーによるホスト型のゲートウェイ ERPipe も提供されています。
主な機能
- 01Odoo 16-18 向け XML-RPC と Odoo 19 以降向け JSON-2 に対応
- 02承認トークンと環境変数による書き込みの制御
- 031 つのサーバーで複数の名前付き Odoo インスタンスを扱う
- 04ローカル版に 41 のツールと 11 のプロンプトを搭載
- 05オプトインのフィールドレベルアクセス制御と JSONL 監査ログ
活用シーン
- 01Odoo の顧客、在庫、請求書データの照会
- 02Odoo 19 への移行前にカスタムアドオンのリスクを確認
- 03複数の顧客データベースに対する読み取り専用の問い合わせ
MCP 対応
本プロジェクトは MCP サーバーであり、Odoo の読み取り、診断、スキーマ参照、制御された書き込みを、ツールおよびプロンプトとして MCP クライアントに提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
41掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| model | string | はい | |
| checks | any | いいえ | |
| instance | any | いいえ | |
| key_fields | any | いいえ | |
| sample_limit | integer | いいえ |
詳細
Odoo MCP
ERPipe は、erpipe-org/mcp-odoo(旧 tuanle96/mcp-odoo)のメンテナーが提供する、マネージド Odoo MCP ゲートウェイです。Python プロジェクトは引き続き、セルフホスト可能なサーバーとして利用できます。
Odoo 向けの無料 AI レイヤー — すべてのエディション、すべてのバージョンに対応。
Odoo に組み込みの AI 機能は Enterprise 限定です。Odoo MCP を使えば、Community と Enterprise 16 以降で、すでにお使いの LLM(Claude、GPT、Gemini、DeepSeek、Ollama)を利用して、同等の機能を無料で使えます。
インストールは 5 分。Odoo 側のセットアップは不要です。安全な書き込み、実際の診断機能、Odoo 22 での XML-RPC 廃止より何年も前から JSON-2 に対応しています。
🚀 ERPipe ホスティング版 — v1 は無料 · erpipe.com で稼働中 · TypeScript オープンコア · 🔍 定額監査
プロセスを実行せずに、安定したリモート URL で ChatGPT / Claude を使いたいですか?
ERPipe は同じ作者が提供するホスティング製品です。v1 のパブリックベータは無料で、本番環境で稼働しています。
サインアップ → HTTPS の Odoo インスタンスを追加 →https://mcp.erpipe.com/mcpに一度接続(ワークスペース OAuth、複数インスタンス、制御された書き込み、監査ダッシュボード)。
このリポジトリは、ローカル/セルフホスト型 Python サーバー(全 41 ツール、stdio、Docker)として提供されます。TypeScript のビルディングブロック:erpipe。
このリポジトリ(odoo-mcp) | ERPipe ホスティング版 | |
|---|---|---|
| 実行場所 | お使いのラップトップ/Docker/CI | Cloudflare(マネージド) |
| インストール | uvx odoo-mcp --setup | erpipe.com でサインアップ |
| MCP URL | stdio またはローカル HTTP | https://mcp.erpipe.com/mcp |
| クライアント | Claude Code、Cursor、ローカルエージェント | ChatGPT(メイン)、Claude、Cursor、あらゆるリモート MCP クライアント |
| ツールの構成 | 41 個のツール + 11 個のプロンプト(ローカル向け完全パック) | 43 個のツール + 7 個のプロンプト(ワークスペースでの複数インスタンス対応とガバナンス、カタログ) |
| 複数インスタンス | お使いのマシン上の設定ファイル/環境変数 | ダッシュボード + 各ツールに明示的な instance キー |
| 書き込み | 環境変数によるゲート + 承認トークン(+ オプションの MCP エリシテーション) | デフォルトで OFF · HITL インボックス · ジャーナル · フィールドポリシー |
| 監査 | オプションの JSONL ファイル | ダッシュボード + D1 監査証跡 |
| 費用 | 永久に無料(MIT) | v1 ベータは無料(公正利用上限あり) |
Odoo MCP は、既存の認証情報だけを使用して、あらゆる Odoo 16 以降のデータベースを Model Context Protocol サーバーに変換します。App Store モジュールも、権限の設定も、管理者アクセスも必要ありません。 手作業のスクリプトや安全でない直接書き込みアクセスに頼らず、実際の Odoo コンテキストを必要とするローカルエージェント、IDE、自動化ツール向けに構築されています。 Odoo 16~18 では XML-RPC、Odoo 19 以降では External JSON-2 を使用します。読み取りツール、診断、スキーマ検出、移行ヘルパー、ローカルアドオンのスキャン、制限付きの書き込みワークフローを備えたコンパクトな MCP インターフェースを公開します。1 つのサーバーで、複数の名前付き Odoo インスタンスを同時に利用できます。
30 秒で試す
設定が完了したら(セットアップを参照)、エージェントに次のように尋ねてみましょう。
「スペインにいる、未払い請求書のある顧客をすべて表示してください。」
「メイン倉庫の在庫が 10 個未満の商品を探してください。」
「Odoo 19 への移行前に、アップグレード時のリスクがないか
custom_billingアドオンを監査してください。」
主な機能
| 機能 | 提供する内容 |
|---|---|
| 41 個の MCP ツール | レコードや添付ファイルの読み取り、サーバー側での集計、チャターへの投稿、スキーマの調査、ドメインの構築、アドオンのスキャン、呼び出しやアップグレードログの診断、データ品質やアクセスルールの確認、モデル名変更の解決、書き込みの検証、複数インスタンスへの一括実行ができます。 |
| フィールドレベル ACL | インスタンスごと、モデルごとに任意で設定できるフィールド単位の許可/拒否を、あらゆる読み取り経路(レコード、集計、ナレッジインデックス、リソース)で適用します。この機能を備えた最初のオープンソース Odoo MCP です。docs/field-acl.md を参照してください。 |
| インスタンス横断クエリ | 多数のクライアント DB に対して読み取り専用で一括実行し、マージ済みで出所が明示され、部分的な失敗にも対応する結果を返します。データウェアハウスも同期も不要です。docs/partner-playbook.md を参照してください。 |
| ワークフロープロンプト | 書き込みをゲート経由で実行する、請求書承認、発注書照合、オンボーディング、経費審査、月次締め、移行前データ品質確認など、エンドツーエンドの業務ワークフロー 6 件を含む 11 件のプロンプトです。 |
| バックグラウンドタスク | submit_async_task は、アドオンのスキャン、ナレッジのインデックス作成、売掛金/買掛金のエイジングなどの長時間かかる読み取り操作を、上限付きワーカープールで実行します。エージェントが推論を続ける間、get_async_task で状態を確認できます。 |
| ローカル優先のナレッジ検索 | index_knowledge と search_knowledge により、上限付きレコード範囲を対象に BM25 関連度ランキングを実行できます。アクセント記号を区別せず、プロセス内で動作し、埋め込みサービスを必要とせず、データがマシンの外に出ることもありません。 |
| 会計パック | receivable_payable_aging と accounting_health_summary を使えば、よくある財務上の質問に、自分でドメインを組み立てることなく 1 回の呼び出しで回答できます。 |
| エージェントスキルパック | 業務ワークフローのスキル 4 件(データ品質ゲート、移行コパイロット、月次締め、エージェンシー全体のレビュー)を提供します — npx skills add erpipe-org/mcp-odoo。シェルアクセスを使って Odoo の開発をしていますか? 開発用の 21 スキルのコンパニオンスイート odoo-ai-skills を追加してください。skills/ を参照してください。 |
| ツールプラグイン | 独自のツールを pip パッケージ(odoo_mcp.tools エントリーポイント)として提供できます — ODOO_MCP_PLUGINS で任意に有効化でき、障害は分離され、フォークも不要です。ODOO_MCP_TOOLS_INCLUDE/EXCLUDE を使って、デプロイごとにツールの範囲を絞り込めます。docs/plugins.md を参照してください。 |
| レート制限 | インスタンスごと、ツールごとに任意で設定できるスライディングウィンドウ予算(ODOO_MCP_RATE_LIMIT_MODE=warn|block)を health_check に表示します。 |
| マルチインスタンス | 1 台のサーバーで、名前付きの複数の Odoo インスタンスを扱えます。すべてのツールで任意の instance パラメーターを使用でき、list_instances で検出できるほか、承認トークンはインスタンスに紐付けられ、スキーマキャッシュもインスタンスごとに保持されます。 |
| エージェントプロンプト 5 件 | 呼び出し失敗、適合性/ギャップ分析ワークショップ、JSON-2 移行、安全な書き込み、モジュール監査のための再利用可能なワークフローです。 |
| Odoo 16-19 対応 | デフォルトでは XML-RPC を使用し、Odoo 19 では JSON-2 を任意で有効にできます。 |
| MCP 2026-07-28 | server/discover を備えたステートレスな最新プロトコルです。同じエンドポイント上で、従来の 2025-11-25 クライアントとの互換性も自動的に確保します。 |
| Streamable HTTP | stdio を使用しないクライアント向けに、ローカル HTTP/SSE をサポートします。 |
| スマートなフィールド選択 | search_records と read_record は、fields 引数が指定されていない場合、業務に関連するフィールドを選びます。監査、メッセージ、バイナリ、未保存の計算フィールドによるノイズを除外します。無効にするには fields=["*"] を渡してください。 |
| サーバー側集計 | aggregate_records は formatted_read_group(Odoo 19 以降)または read_group(16-18)を介して、groupby/sum/count/avg を Postgres 側で実行します。 |
| チャター連携 | chatter_post は、書き込みと同じ承認トークンゲートを通じて、任意の mail.thread レコードにメッセージを追加します — または MCP_CHATTER_DIRECT=1 で直接追加できます。 |
| ロケール設定 | ODOO_LOCALE はすべての Odoo 呼び出しに context.lang を自動設定します(呼び出し元による上書きも可能です)。 |
| 構造化ログ | ODOO_MCP_LOG_LEVEL、ODOO_MCP_LOG_JSON、ODOO_MCP_LOG_FILE により、JSON フォーマッターとローテーション対応のファイルハンドラーを利用できます。 |
| 安全な書き込み | 直接の create、write、unlink はブロックされます。承認済みの書き込みには、最新のメタデータ、同一セッション内のトークン、明示的な確認、環境ゲートが必要です。 |
| 人間が介在する承認 | ODOO_MCP_ELICIT_WRITES=1 にすると、承認済みの書き込みを実行する前に、ネイティブの MCP 確認フォーム(差分の要約付き)が表示されます — トークンフローはフォールバックとして引き続き利用できます。 |
| 監査証跡 | ODOO_MCP_AUDIT_LOG は、書き込み経路のイベント(プレビュー、検証、実行、チャター)ごとに、インスタンスとトークンダイジェストを含む JSONL 行を 1 行追記します。 |
| 耐障害性 | 読み取り専用の呼び出しでは、接続エラー時に指数バックオフで再試行します。スキーマキャッシュは TTL と LRU で上限を管理し、health_check は N+1 読み取りループを検出します。 |
| 実際のスモークテスト | Docker Compose による検証では、制限付きユーザー、カスタムレコードルール、パッケージ化されたアドオンの XML インストール/更新を含む、使い捨ての Odoo 16.0、17.0、18.0、19.0 環境を起動します。 |
Odoo MCP を選ぶ理由
| 特徴 | Odoo MCP | その他の MCP-Odoo ブリッジ |
|---|---|---|
| Odoo 側でのセットアップ手順 | 0 — すでにお持ちの認証情報を使って、あらゆる Odoo 16+ インスタンスで動作します。 | 多くの場合、App Store モジュールのインストール、有効にするモデルの設定、ツールごとの権限付与が必要です。 |
| 安全な書き込みワークフロー | 承認トークン + 実行時の fields_get 検証 + 明示的な確認 + 環境ゲート。 | 多くの場合、直接の create/write/unlink や「何でも実行する」バイパス機能を公開しています。 |
| 診断機能 | diagnose_odoo_call、diagnose_access、inspect_model_relationships、upgrade_risk_report、fit_gap_report、business_pack_report、scan_addons_source。 | 通常は CRUD のみです。 |
| トランスポート | XML-RPC(16+)および External JSON-2(Odoo 19+)。Odoo 22 での XML-RPC 廃止に何年も先駆けて対応済みです。 | 通常は XML-RPC のみです。Odoo 19 から非推奨となり、Odoo 22 で廃止されます。 |
| 移行ヘルパー | generate_json2_payload は、移行前にあらゆる XML-RPC 呼び出しの JSON-2 ボディをプレビューします。 | ありません。 |
| 複数インスタンス | 1 つの設定ファイルで名前付きインスタンスを設定でき、ツールごとのルーティングに対応。トークンとキャッシュはインスタンスごとに分離されます。 | 通常はサーバープロセスごとに 1 つのグローバル接続を使用します。 |
| エージェント用プロンプト | 診断/適合性ギャップ分析/JSON-2 移行/安全な書き込み/モジュール監査用のすぐに使えるプロンプトが 5 つあります。 | 通常はありません。 |
| HTTP トランスポートのセキュリティ | DNS リバインディング対策、ホスト/オリジンの許可リスト、デフォルトでローカルにバインド。 | 多くの場合、備わっていません。 |
| 実際の Odoo スモークテスト | Docker Compose のハーネスが、リリースごとに使い捨ての Odoo 16/17/18/19 スタックを起動します。 | 多くの場合、モックベースのみです。 |
| フレームワークの例 | Cursor、Claude Code、OpenAI Agents、LangGraph、CrewAI、n8n 用のコピー&ペースト可能なアダプターが examples/ にあります。 | ありません。 |
| 監査と承認の UX | JSONL 監査証跡 + ネイティブの elicitation 確認フォーム。Odoo へのインストールは不要です。 | 監査機能には通常、Odoo 側のモジュールが必要です。 |
特定のプロジェクトと比較していますか?プロジェクトごとの内訳は docs/comparison.md をご覧ください。
セットアップ
サーバーを使い始める方法は 2 つあります。自分でセットアップするか、プロンプトを 1 つ貼り付けてコーディングエージェントに任せます。
人間向け
最も手早く使い始めるには、uvx から対話型ウィザードを実行します。パッケージは必要に応じて取得されます。
uvx odoo-mcp --setup
ウィザードでは、Odoo の URL、データベース、認証情報を入力します。接続をその場でテストし、設定ファイルを書き込み、Claude Code、Cursor、Claude Desktop にそのまま貼り付けられるスニペットを表示します。手早くスモークチェックを行う場合は、uvx odoo-mcp --health を実行してください。
macOS で Claude Desktop をお使いですか?MCP の設定は次の場所から読み込まれます。
~/Library/Application Support/Claude/claude_desktop_config.json
GUI アプリではシェルの PATH が引き継がれない場合があるため、Python の絶対パスを使用してください。
{
"mcpServers": {
"odoo": {
"command": "/opt/homebrew/bin/python3",
"args": ["-m", "odoo_mcp"],
"env": {
"ODOO_URL": "https://your-odoo-instance.com",
"ODOO_DB": "your-database",
"ODOO_USERNAME": "your-user",
"ODOO_PASSWORD": "your-password-or-api-key",
"ODOO_TRANSPORT": "xmlrpc"
}
}
}
}
その他のクライアント設定(Windsurf、VS Code、Zed、Continue.dev、Streamable HTTP)については、docs/client-configs.md をご覧ください。
その他のインストール方法:
pip install odoo-mcp
# or: pipx install odoo-mcp
コンテナを使用しますか?Docker をご覧ください。ローカル開発の場合:
git clone https://github.com/erpipe-org/mcp-odoo.git
cd mcp-odoo
uv sync --extra dev
AI エージェント向け
これを Claude Code、Cursor、Codex、または任意のコーディングエージェントに貼り付けると、サーバーがインストールされます。
Install the odoo-mcp MCP server (https://github.com/erpipe-org/mcp-odoo) in this environment:
1. Ask me for my Odoo URL, database name, username, and password or API key.
Treat them as secrets: never echo, print, or log these values.
2. Register the server as a stdio MCP server:
- Claude Code: claude mcp add odoo --env ODOO_URL=<url> --env ODOO_DB=<db>
--env ODOO_USERNAME=<user> --env ODOO_PASSWORD=<secret> -- uvx odoo-mcp
- Any other client: write the equivalent config with "command": "uvx",
"args": ["odoo-mcp"], and the same four env vars.
3. Verify the install: run `uvx odoo-mcp --health`, then call the health_check
MCP tool and confirm the Odoo connection is reachable.
4. Leave writes disabled (do not set ODOO_MCP_ENABLE_WRITES) unless I
explicitly ask you to enable them.
Full machine-readable instructions: https://github.com/erpipe-org/mcp-odoo/blob/main/llms-install.md
使用するクライアントがすでに決まっていますか?ワンライナーと設定スニペットはこちらです。
claude mcp add odoo --env ODOO_URL=https://mycompany.odoo.com --env ODOO_DB=mycompany \
--env [email protected] --env ODOO_PASSWORD=your-api-key -- uvx odoo-mcp
- Claude Code の
.mcp.jsonと Codex CLI のconfig.toml:examples/README.md - Cursor の
.cursor/mcp.json+ エージェントルール:examples/cursor/ - Windsurf、VS Code、Zed、Continue.dev、Cline、Streamable HTTP、Docker:
docs/client-configs.md - エージェント向けの機械可読なインストールガイド(Cline 形式):
llms-install.md
フレームワーク SDK
コピーしてすぐに実行できる連携例は examples/ にあります。
| クライアント | 例 |
|---|---|
| Cursor | examples/cursor/ — .cursor/mcp.json + エージェントのルール |
| Claude Code / Codex CLI | examples/README.md のスニペット |
| OpenAI Agents SDK | examples/openai-agents/ — ローカル版とホスト版 |
| LangGraph | examples/langgraph/ — langchain-mcp-adapters |
| CrewAI | examples/crewai/ — ネイティブの mcps=[...] エージェント |
| n8n | examples/n8n/ — インポート可能なワークフロー JSON |
設定リファレンス
接続値は環境変数に設定します。
export ODOO_URL="https://your-odoo-instance.com"
export ODOO_DB="your-database"
export ODOO_USERNAME="your-user"
export ODOO_PASSWORD="your-password-or-api-key"
export ODOO_TRANSPORT="xmlrpc"
Odoo 19 JSON-2 の場合:
export ODOO_TRANSPORT="json2"
export ODOO_API_KEY="your-odoo-api-key"
export ODOO_JSON2_DATABASE_HEADER="1"
ODOO_JSON2_DATABASE_HEADER=1 を設定すると、JSON-2 の呼び出しで X-Odoo-Database が送信されます。ホストまたは dbfilter によるルーティングですでに対象のデータベースが選択される場合に限り、0 に設定してください。
任意の環境変数:
| 変数 | デフォルト | 効果 |
|---|---|---|
ODOO_CONFIG_FILE | unset | 標準の場所より先に確認される、設定ファイルの明示的なパスです。 |
ODOO_LOCALE | unset | すべての Odoo 呼び出しに context.lang を設定します。呼び出し元が指定した context.lang が常に優先されます。 |
ODOO_MCP_MAX_SMART_FIELDS | 15 | 呼び出し元が fields を省略した場合の、スマートフィールド選択の上限です。 |
ODOO_MCP_LOG_LEVEL | INFO | プロセスのロガーレベル(DEBUG/INFO/WARNING/ERROR/CRITICAL)です。 |
ODOO_MCP_LOG_JSON | 0 | 真の場合、JSON 形式のログ行を出力します。 |
ODOO_MCP_LOG_FILE | unset | パスを指定すると、ローテーションするファイルハンドラーを有効にします(10MB × 3 個のバックアップ)。 |
ODOO_MCP_ENABLE_WRITES | 0 | execute_approved_write に必要です。 |
ODOO_MCP_ALLOWED_SIDE_EFFECT_METHODS | empty | 正確な model.method の許可リスト(例:sale.order.action_confirm)です。 |
ODOO_MCP_POLICY_FILE | 存在する場合は ./odoo_mcp_policy.json | レビュー用メタデータを含む、バージョン管理可能な副作用の許可リスト(odoo_mcp_policy.json.example を参照)です。環境変数の許可リストと統合されます。 |
ODOO_MCP_ALLOW_UNKNOWN_METHODS | 0 | execute_method の広範なモードです。上記の正確な許可リストを推奨します。 |
ODOO_MCP_AUDIT_LOG | unset | パスを指定すると、書き込み処理のイベント(プレビュー/検証/実行/チャター)ごとに JSONL 行を追記します。トークンはダイジェストとして保存されます。 |
ODOO_MCP_ELICIT_WRITES | 0 | 真の場合、execute_approved_write は実行前に MCP elicitation を介して人間に確認します(差分の概要を含むネイティブの確認フォーム)。クライアントが elicitation に対応していない場合は、トークンフローにフォールバックします。 |
ODOO_MCP_RETRY_ATTEMPTS | 2 | 接続エラー時に読み取り専用呼び出しを再試行する回数(追加分、0~5)です。書き込みは再試行されません。 |
ODOO_MCP_RETRY_BACKOFF | 0.5 | 再試行の基本バックオフ秒数です。再試行ごとに倍増します。 |
ODOO_MCP_SCHEMA_CACHE_TTL | 600 | スキーマキャッシュ項目の有効期間(秒)です。 |
ODOO_MCP_SCHEMA_CACHE_MAX | 256 | スキーマキャッシュ項目の最大数です(LRU 方式で削除)。 |
ODOO_MCP_RATE_LIMIT_MODE | off | warn は health_check で instance:tool ごとの呼び出しレートを追跡します。block は、ホット読み取りツールと execute_method で予算を超過した呼び出しを拒否します。 |
ODOO_MCP_RATE_LIMIT_WINDOW | 60 | レート追跡のスライディングウィンドウの長さ(秒)です。 |
ODOO_MCP_RATE_LIMIT_MAX_CALLS | 120 | instance:tool ごとに、ウィンドウ内で許可される呼び出し数です。 |
ODOO_MCP_ASYNC_MAX_WORKERS | 2 | submit_async_task のワーカースレッド数です。 |
ODOO_MCP_ASYNC_MAX_TASKS | 50 | 保持するバックグラウンドタスクの最大数です(完了したタスクは古いものから削除)。 |
ODOO_MCP_ASYNC_RESULT_TTL | 3600 | 完了したバックグラウンドタスクの結果をポーリング可能な状態で保持する秒数です。 |
ODOO_MCP_KNOWLEDGE_MAX_DOCS | 5000 | すべてのローカル BM25 ナレッジインデックスで許可されるドキュメントの合計数です。 |
ODOO_MCP_FIELD_POLICY_FILE | 共有ポリシーファイル | フィールド ACL ポリシーです(ポリシーファイルの field_acl キー、またはここで指定する専用ファイル)。拒否されたフィールドは、すべての読み取り処理から除外されます。docs/field-acl.md を参照してください。 |
ODOO_MCP_CROSS_INSTANCE_WORKERS | 4 | インスタンス間のファンアウトツールにおける、同時実行数の上限です。 |
MCP_CHATTER_DIRECT | 0 | 真の場合、chatter_post は承認トークンのゲートを省略し、ただちに投稿します。 |
MCP_ALLOW_REMOTE_HTTP | 0 | 真の場合、ローカル以外の HTTP バインドを許可します(外部認証/TLS は引き続き必要です)。 |
MCP_ALLOWED_HOSTS / MCP_ALLOWED_ORIGINS | local | HTTP トランスポート用の CSV 形式の許可リストです。 |
ODOO_MCP_MAX_ATTACHMENT_BYTES | 1048576 | read_attachment のコンテンツのダウンロード上限です(ハード上限は 16 MiB)。 |
ODOO_MCP_ATTACHMENT_UPLOAD_ROOTS | unset | コロン区切りのローカルディレクトリです。validate_write が <field>_from_path のアップロード元として読み取ることができます(ODOO_ADDONS_PATHS と同様)。必須です。ルートが設定されていない場合は、フェイルクローズします。 |
ODOO_MCP_MAX_ATTACHMENT_UPLOAD_BYTES | 10485760 | <field>_from_path によるローカルファイルアップロードのサイズ上限です(ハード上限は 16 MiB)。 |
ODOO_MCP_AUTH_ISSUER_URL | unset | OAuth 2.1:認可サーバーの発行者です。以下の 2 つの変数と併用すると、HTTP トランスポートが保護されたリソースサーバーになります(RFC 9728 メタデータとベアラートークン検証)。 |
ODOO_MCP_AUTH_INTROSPECTION_URL | unset | 認可サーバーの RFC 7662 トークンイントロスペクションエンドポイントです。 |
ODOO_MCP_AUTH_RESOURCE_URL | unset | この MCP サーバーの正規 URL です(AS がトークンをバインドする場合の RFC 8707 オーディエンスチェックに使用)。 |
ODOO_MCP_AUTH_REQUIRED_SCOPES | empty | すべてのリクエストで必要な CSV 形式のスコープです。 |
ODOO_MCP_AUTH_CLIENT_ID / _CLIENT_SECRET | unset | AS でクライアント認証が必要な場合の、イントロスペクション呼び出し用の認証情報です。 |
ODOO_MCP_AUTH_REQUIRE_AUD | 0 | 真の場合、イントロスペクション応答に aud クレームがないトークンを拒否します(デフォルトでは、aud がある場合のみチェックします)。 |
ODOO_MCP_AUTH_REQUIRE_ISS | 0 | 真の場合、iss クレームのないイントロスペクション応答を拒否します。iss が存在する場合は、常に ODOO_MCP_AUTH_ISSUER_URL と一致する必要があります(取り違え攻撃への対策)。 |
ODOO_MCP_AUTH_CACHE_TTL | 60 | イントロスペクション判定をキャッシュする秒数です(0 で無効)。AS の負荷と失効の反映遅延の両方を抑えます。 |
ODOO_MCP_PLUGINS | unset | サードパーティ製ツールプラグインとして読み込むエントリーポイント名の CSV です(グループ odoo_mcp.tools)。インストールしただけでは有効になりません。失敗は個別に処理され、health_check で報告されます。docs/plugins.md を参照してください。 |
ODOO_MCP_TOOLS_INCLUDE / _EXCLUDE | unset | デプロイごとに登録ツールの範囲を絞り込む CSV 形式の fnmatch グロブです(小規模なエージェントは 41 個のツールで圧倒されてしまいます)。削除された名前は health_check に一覧表示されます。 |
ODOO_MCP_INSTRUCTIONS_FILE | unset | サーバーレベルの MCP instructions に追加するプレーンテキストファイルです。ツールの説明には手を加えずに、デプロイ固有のガイダンス(会計年度のルール、命名規則など)をすべてのクライアントに提供します。 |
odoo_config.jsonも使用できます: |
{
"url": "https://your-odoo-instance.com",
"db": "your-database",
"username": "your-user",
"password": "your-password-or-api-key"
}
複数のOdooインスタンス
1つのサーバーから複数のOdooデータベースに接続できます。設定ファイルにinstancesマップを追加してください(自動検出されます。instancesのないファイルは、上記のフラットな単一インスタンス形式として扱われます):
{
"default": "acme",
"instances": {
"acme": {
"url": "https://acme.odoo.com",
"db": "acme",
"username": "bot",
"api_key": "...",
"transport": "json2"
},
"globex": {
"url": "https://globex.odoo.com",
"db": "globex",
"username": "bot",
"password": "...",
"lang": "fr_FR",
"timeout": 60
}
}
}
- すべての読み取り/書き込みツールは、オプションの
instanceパラメーターを受け取ります。省略した場合は、defaultインスタンスが使われます。インスタンスが1つだけ定義されている場合は、default自体を省略できます。 - 各エントリーでは、フラットな設定と同じキー(
url、db、username、password、api_key、transport、json2_database_header、lang)に加えて、timeoutとverify_sslを指定できます。インスタンスのエントリーは自己完結しており、認証情報やトランスポートが環境変数にフォールバックすることはありません(そのため、あるインスタンスが別のデプロイメントのODOO_API_KEYを引き継ぐことはありません)。エントリーで省略された場合にフォールバックのデフォルトとして機能するのは、認証情報以外の設定(ODOO_TIMEOUT、ODOO_VERIFY_SSL、ODOO_LOCALE)だけです。ODOO_TRANSPORT/ODOO_API_KEYなどの環境変数による上書きは、従来どおり従来形式のフラット設定に適用されます。 ODOO_CONFIG_FILE=/path/to/config.jsonを指定すると、明示した設定ファイルが./odoo_config.json、~/.config/odoo/config.json、~/.odoo_config.jsonより先に確認されます。- 優先順位:
ODOO_URL/ODOO_DB/ODOO_USERNAME/ODOO_PASSWORDがすべて設定されている場合は、環境変数が優先され、defaultという名前の単一インスタンスが定義されます。複数インスタンスのファイルを使うには、これらの環境変数の設定を解除してください。 - インスタンス名は
[A-Za-z0-9_-]{1,64}に一致する必要があります。クライアントは遅延接続するため、ツールから指定されたときにのみインスタンスへ接続します。 - 検出:
list_instancesツールは、設定済みの名前、URL、データベース、トランスポートを返します。認証情報は返しません。 - 書き込み承認トークンにはインスタンス名が含まれるため、あるインスタンスに対して検証されたトークンが別のインスタンスで実行されることはありません。
- MCPリソース(
odoo://…)は、このリリースでは常にデフォルトのインスタンスを使用します。複数インスタンスにアクセスするには、ツールを使用してください。
実行
stdioでMCPサーバーを起動します:
odoo-mcp
または:
python -m odoo_mcp
ローカルクライアント向けにStreamable HTTPを起動します:
odoo-mcp --transport streamable-http --host 127.0.0.1 --port 8000 --path /mcp
--allow-remote-httpを渡すか、MCP_ALLOW_REMOTE_HTTP=1を設定しない限り、ローカル以外へのHTTPバインドは拒否されます。このサーバーにはHTTP認証機能が組み込まれていません。リモートHTTPでデプロイする場合は、独自の認証、TLS、ネットワークポリシーの背後に配置してください。
サーバーループを起動せずに、実行時の状態を確認します:
odoo-mcp --health
MCPツール
用途別に分類された41個のツールがあります。各ツール名は、エージェントが呼び出せる単一目的のハンドルです。Odooと通信するツールは、複数のインスタンスが設定されている場合、オプションのinstanceパラメーターを受け取ります(複数のOdooインスタンスを参照)。
読み取りと検出(11)
| ツール | 用途 |
|---|---|
list_models | Odooモデルの技術名とラベルを一覧表示します。 |
get_model_fields | 1つのモデルのフィールドメタデータを読み取ります。 |
search_records | 範囲が制限された読み取り専用のsearch_readを実行します。呼び出し元がfieldsを省略した場合は、スマートフィールド選択を行います。 |
read_record | モデルとIDを指定して、1つのレコードを読み取ります。呼び出し元がfieldsを省略した場合は、スマートフィールド選択を行います。 |
aggregate_records | サーバー側でformatted_read_group(Odoo 19以降)またはread_group(16~18)を使ってグループ化/集計します。 |
search_employee | 名前で従業員を検索します。 |
search_holidays | 日付範囲で休暇レコードを検索します。 |
get_odoo_profile | サーバーのバージョン、ユーザーコンテキスト、トランスポート、データベース、インストール済みモジュールの概要を読み取ります。 |
schema_catalog | オプションのフィールドメタデータを含む、範囲が制限されたモデルカタログを作成します。 |
build_domain | 構造化された条件からOdooドメインを作成し、検証します。 |
read_attachment | ir.attachmentのメタデータと、サイズ上限付きのbase64コンテンツ(ODOO_MCP_MAX_ATTACHMENT_BYTES、デフォルトは1 MiB)を読み取ります。 |
書き込みと操作(5)
| ツール | 目的 |
|---|---|
preview_write | create、write、unlink 用の、実行されない承認ペイロードを生成します。 |
validate_write | 信頼できる最新の fields_get メタデータに照らして、書き込みペイロードを検証します。 |
execute_approved_write | ODOO_MCP_ENABLE_WRITES=1 の場合に、同一セッション内で最新の検証を受け、確認済みの書き込みのみを実行します。 |
execute_method | レビュー済みのモデルメソッドを実行します。直接の create、write、unlink はブロックされます。副作用を伴うメソッドには、正確な許可リストまたは ODOO_MCP_ALLOW_UNKNOWN_METHODS=1 が必要です。 |
chatter_post | mail.thread レコードにチャターのメッセージを投稿します。デフォルトモードでは、承認トークンのプレビュー/実行フローが必要です。 |
診断(3)
| ツール | 目的 |
|---|---|
diagnose_odoo_call | モデル呼び出しを実行せずに診断します。 |
diagnose_access | 現在の Odoo 認証情報に対する ACL とレコードルールの可視性を診断します。 |
inspect_model_relationships | 関連フィールド、必須フィールド、作成/書き込みのヒントをグループ化します。 |
移行(3)
| ツール | 目的 |
|---|---|
generate_json2_payload | XML-RPC 形式の入力を、JSON-2 エンドポイント、ヘッダー、名前付きボディに変換します。 |
upgrade_risk_report | Odoo のバージョン間におけるトランスポート、メソッド、移行のリスクを明らかにします。 |
lookup_model_history | 厳選されたバージョン別の名称変更カタログを参照し、古いモデル名(account.invoice → account.move)を解決します。 |
監査と計画(3)
| ツール | 目的 |
|---|---|
scan_addons_source | アドオンのコードをインポートせずに、ローカルのアドオンソースをスキャンします。 |
fit_gap_report | 要件を標準、設定、Studio、カスタムモジュール、回避、未知に分類します。 |
business_pack_report | 販売、CRM、在庫、会計、人事について、想定されるモジュール、モデル、探索呼び出しをレポートします。 |
ナレッジ検索 — ローカル優先(3)
| ツール | 目的 |
|---|---|
index_knowledge | 件数を制限したレコードの一部を一度取得し、ローカルの BM25 インデックスを構築します(アクセント記号を区別しません。データがマシンの外部に送信されることはありません)。 |
search_knowledge | インデックス化されたレコードを、追加の RPC 呼び出しなしで関連度順にフリーテキスト検索します。 |
knowledge_stats | モデルごとのインデックスサイズと ODOO_MCP_KNOWLEDGE_MAX_DOCS の上限をレポートします。 |
会計(2)
| ツール | 目的 |
|---|---|
receivable_payable_aging | 支払期日超過日数別(未払い/1~30/31~60/61~90/90日超)に分類した、取引先ごとの合計付き売掛金/買掛金の滞留期間レポートです。 |
accounting_health_summary | 未決済の売掛金/買掛金の件数と、下書き請求書の滞留件数を表示します。 |
バックグラウンドタスク(4)
| ツール | 目的 |
|---|---|
submit_async_task | 許可リストに登録された長時間の読み取り操作(scan_addons_source、index_knowledge、receivable_payable_aging)を、上限付きワーカープールで実行します。書き込みは一切受け付けません。 |
get_async_task | タスクのステータスと結果を確認します。 |
cancel_async_task | 保留中または実行中のタスクをキャンセルします。 |
list_async_tasks | 実行中および最近完了したタスクを一覧表示します。 |
インスタンス間のファンアウト — 読み取り専用(3)
設定済みの多数のインスタンスに対して1つの質問を実行し、結果を統合して出所を明示します。パートナープレイブックを参照してください。
| ツール | 目的 |
|---|---|
search_across_instances | オプトインしたすべてのインスタンス(またはリスト/タグによる選択)を検索します。行には _instance タグが付与され、インスタンスごとの障害が発生した場合も部分的な結果を返します。 |
aggregate_across_instances | インスタンスごとにグループ化/集計し、フリート全体の加算可能な総計も表示します。 |
accounting_health_across_instances | すべてのクライアント DB にわたる売掛金/買掛金の滞留期間を、統合した分類で表示します。パートナーネットワーク全体の一括調査に利用できます。 |
ユーティリティ(2)
| ツール | 目的 |
|---|---|
health_check | レート制限カウンターや、有効な場合のフィールド ACL ステータスなど、秘密情報を含まない MCP ランタイムの状態をレポートします。 |
list_instances | 設定済みの Odoo インスタンス名、URL、データベース、トランスポート、インスタンス間タグを一覧表示します。認証情報は表示しません。 |
リソース
| URI | 説明 |
|---|---|
odoo://models | 利用可能なモデルを一覧表示します。 |
odoo://model/{model_name} | モデルのメタデータとフィールドを読み取ります。 |
odoo://record/{model_name}/{record_id} | 1件のレコードを読み取ります。 |
odoo://search/{model_name}/{domain} | 範囲を制限したドメインでレコードを検索します。 |
プロンプト
11個のプロンプト:5個の診断用に加え、エンドツーエンドの業務プロセスを定義し、すべての書き込みを承認ゲート経由で実行する6個の運用ワークフロー用プロンプトです。
| プロンプト | 用途 |
|---|---|
diagnose_failed_odoo_call | 再試行する前に、失敗したOdoo呼び出しの根本原因を特定します。 |
fit_gap_workshop | 生の要件をOdooの適合・ギャップの分類に整理します。 |
json2_migration_plan | XML-RPCまたはJSON-RPCからExternal JSON-2への移行を計画します。 |
safe_write_review | 提案されたcreate、write、またはunlinkをレビューします。 |
custom_module_audit | スキャン、リスク、業務上の根拠に基づいて、ローカルのアドオンソースを監査します。 |
invoice_approval_chain | 下書き請求書を仕分けし、人による確認ポイントを設けて、書き込みゲート経由でそれぞれを確定します。 |
po_to_receipt | 発注書を入荷と請求書に照合し、不一致にフラグを付けます(読み取り専用)。 |
customer_onboarding | 重複を確認してから、連絡先と支払条件を含む顧客の作成をゲート経由で行います。 |
expense_claim_review | 保留中の経費精算申請をポリシーに照らして確認し、ゲート経由で承認または却下します。 |
accounting_close_checklist | 読み取り専用の月末チェックリスト:滞留状況、未照合項目、下書きの滞留状況を確認します。 |
安全な書き込みモデル
書き込み処理は意図的にシンプルにしています。
preview_writeは、実行されない正規化済みのペイロードを作成します。validate_writeは、モデルのメタデータ、必須フィールド、読み取り専用フィールド、リレーションのヒント、レコードID、ペイロードの形式を確認します。execute_approved_writeは、すべてのゲートを通過した場合にのみ実行されます。- 承認が同じサーバープロセス内の
validate_writeから取得されていること。 - 検証に、信頼できる空ではないライブのOdoo
fields_getメタデータが使用されていること。 - トークンが期限切れでも、消費済みでもないこと。
confirm=trueが渡されていること。ODOO_MCP_ENABLE_WRITES=1が設定されていること。
- 承認が同じサーバープロセス内の
最終的な結果は、引き続きOdooのアクセスルール、レコードルール、サーバー側の制約によって決まります。
一括作成も同じゲートを通ります。values_list(レコードごとの辞書、最大100件)をpreview_write/validate_writeに渡すと、実行時に単一のアトミックなOdoo create(vals_list)呼び出しにマッピングされます。レコードごとに異なるwrite値には意図的に対応していません(レコードごとに非アトミックなRPCが必要になるためです)。オプション機能として、ODOO_MCP_ELICIT_WRITES=1を設定するとネイティブの人間による確認フォームが追加され、ODOO_MCP_AUDIT_LOGを設定すると書き込み経路で発生したすべてのイベントが記録されます。
大きなバイナリフィールド(ir.attachment.datasに添付された履歴書、商品画像など)は、ツール呼び出しでbase64としてインライン化する必要はありません。代わりに<field>_from_path(例:datas_from_path: "/local/path/cv.pdf")をvalidate_writeに渡してください。サーバーがファイルを読み取ります。承認には、そのフィールドのsha256:<hex>:<size>フィンガープリントのみが含まれ、実際のコンテンツが含まれることはないため、大きなデータを呼び出し元エージェントのコンテキスト経由で往復させる必要はありません。ODOO_MCP_ATTACHMENT_UPLOAD_ROOTSが必要です(設定されていない場合は安全側に倒して失敗します)。また、ODOO_MCP_MAX_ATTACHMENT_UPLOAD_BYTESに従います。新しいツールは不要です。他のすべての書き込みと同じpreview_write → validate_write → execute_approved_writeゲートを使用します。
sale.order.action_confirmなどのレビュー済み副作用メソッドは、1つずつ有効にできます。
export ODOO_MCP_ALLOWED_SIDE_EFFECT_METHODS="sale.order.action_confirm,res.partner.message_post"
ODOO_MCP_ALLOW_UNKNOWN_METHODS=1は信頼できるデプロイメント向けに引き続きサポートされていますが、health_checkでは広範なモードとして報告されます。レビュー済みメソッドが少数のみ必要な場合は、個別の許可リスト項目を使用してください。
Docker
事前ビルド済みのGHCRイメージを使用します。
docker pull ghcr.io/erpipe-org/mcp-odoo:latest
または、ローカルでビルドします。
docker build -t mcp/odoo:latest -f Dockerfile .
MCPクライアントからstdio経由で実行します(事前ビルド済みのイメージを使用するには、mcp/odoo:latestをghcr.io/erpipe-org/mcp-odoo:latestに置き換えてください)。
{
"mcpServers": {
"odoo": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "ODOO_URL",
"-e", "ODOO_DB",
"-e", "ODOO_USERNAME",
"-e", "ODOO_PASSWORD",
"-e", "ODOO_TRANSPORT",
"-e", "ODOO_API_KEY",
"mcp/odoo:latest"
]
}
}
}
Streamable HTTPをローカルで実行します。
docker run --rm \
-p 127.0.0.1:8000:8000 \
-e ODOO_URL \
-e ODOO_DB \
-e ODOO_USERNAME \
-e ODOO_PASSWORD \
-e ODOO_TRANSPORT \
-e ODOO_API_KEY \
mcp/odoo:latest \
--transport streamable-http \
--host 0.0.0.0 \
--port 8000 \
--allow-remote-http
テスト
通常の品質チェックを実行します。
uv run python -m ruff check .
uv run python -m mypy src
uv run python -m pytest
実際の Odoo スモークテストを実行します。
uv run --python 3.12 --with-editable . scripts/odoo_compose_smoke.py \
--versions 16.0 17.0 18.0 19.0 \
--timeout 360 \
--inspector-smoke
スモークテストハーネスは使い捨ての Docker Compose スタックを起動し、Odoo への直接アクセスと MCP stdio を検証します。また、Odoo 19 では JSON-2 と Streamable HTTP も検証します。
マルチインスタンスのスモークテストを実行します(1 つのスタック、3 つのデータベース、1 つのインスタンス上の 2 つのアカウント)。
uv run --python 3.12 --with-editable . scripts/odoo_multi_instance_smoke.py
互換性
幅広い互換性を保つため、デフォルトのトランスポートには XML-RPC を使用します。Odoo 19 では ODOO_TRANSPORT=json2 を指定すると External JSON-2 を利用できます。XML-RPC と JSON-RPC は Odoo 19 から非推奨となり、Odoo 22(2028 年秋)で削除される予定のため、新しい統合では JSON-2 を利用する計画を立ててください。
ドキュメント
| ガイド | 内容 |
|---|---|
| docs/comparison.md | Odoo MCP と他の Odoo MCP ブリッジとの比較 |
| docs/architecture.md | システム構成、トランスポート、安全性の境界 |
| docs/multi-instance.md | マルチデータベースの設定、ルーティング、分離モデル |
| docs/troubleshooting.md | エラーメッセージから根本原因を特定する方法(ACL、レコードルール、ルーティング) |
| docs/performance.md | キャッシュ/再試行の設定、バッチ処理のパターン、N+1 の検出 |
| docs/client-configs.md | Claude Desktop、Docker、Streamable HTTP の設定 |
| docs/testing.md | ローカルのチェックと Docker Compose スモークテストハーネス |
コントリビューション
イシュー、プルリクエスト、互換性に関する報告を歓迎します。CONTRIBUTING.md をご確認のうえ、Odoo のバージョン、トランスポート、クライアントの種類、実施した検証内容を含めてください。
セキュリティ
Odoo の認証情報、API キー、非公開環境のデータベース名、または Odoo のデバッグログ全体を含むログを公開しないでください。脆弱性は SECURITY.md を通じて報告してください。
ライセンス
MIT。LICENSE をご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。