blog: 3 Ways to Integrate Odoo and Hermes Agent

This commit is contained in:
Oliver
2026-06-20 11:18:03 -03:00
parent 646891bcda
commit 7a0016d08e
2 changed files with 350 additions and 0 deletions
@@ -0,0 +1,341 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="robots" content="index, follow" />
<link rel="canonical" href="https://derez.ai/blog/posts/three-ways-integrate-odoo-hermes.html" />
<title>3 Ways to Integrate Odoo and Hermes Agent — derez.ai Blog</title>
<meta name="description" content="Direct XML-RPC, MCP server, or custom Hermes skill — three proven approaches to connect Odoo with Hermes Agent. Setup time, trade-offs, and when to use each." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://derez.ai/blog/posts/three-ways-integrate-odoo-hermes.html" />
<meta property="og:title" content="3 Ways to Integrate Odoo and Hermes Agent" />
<meta property="og:description" content="Direct XML-RPC, MCP server, or custom Hermes skill — three proven approaches to connect Odoo with Hermes Agent. Setup time, trade-offs, and when to use each." />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="3 Ways to Integrate Odoo and Hermes Agent" />
<script defer data-domain="derez.ai" src="https://plausible.odoo4projects.com/js/script.file-downloads.outbound-links.tagged-events.js"></script>
<script>window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) }</script>
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,400;14..32,500;14..32,600;14..32,700&display=swap" rel="stylesheet" />
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { background: #08080c; color: #e8e8f0; font-family: 'Inter', sans-serif; line-height: 1.7; padding: 40px 20px; }
.container { max-width: 720px; margin: 0 auto; }
a { color: #00f5ff; text-decoration: none; }
a:hover { text-decoration: underline; }
.back { margin-bottom: 32px; display: inline-block; font-size: 0.9rem; color: #888; }
.back:hover { color: #00f5ff; }
h1 { font-size: 1.9rem; font-weight: 700; line-height: 1.3; margin-bottom: 12px; }
.meta { font-size: 0.85rem; color: #888; margin-bottom: 40px; display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
.area-tag { display: inline-block; background: #a78bfa; color: #000; font-size: 0.75rem; font-weight: 700; padding: 2px 10px; border-radius: 20px; text-transform: uppercase; letter-spacing: 0.5px; }
.chip-tag { display: inline-block; background: rgba(0,245,255,0.1); color: #00f5ff; border: 1px solid rgba(0,245,255,0.3); font-size: 0.75rem; font-weight: 600; padding: 2px 10px; border-radius: 20px; text-transform: uppercase; letter-spacing: 0.5px; }
h2 { font-size: 1.3rem; font-weight: 600; margin: 36px 0 12px; color: #f0f0ff; }
h3 { font-size: 1.1rem; font-weight: 600; margin: 24px 0 8px; color: #e0e0f0; }
p { margin-bottom: 16px; color: #c8c8d8; }
ul, ol { margin: 0 0 16px 24px; color: #c8c8d8; }
li { margin-bottom: 6px; }
code { background: #0e0e14; padding: 2px 6px; border-radius: 4px; font-size: 0.9em; color: #00f5ff; }
pre { background: #0e0e14; border: 1px solid #1a1a24; border-radius: 10px; padding: 16px 20px; margin: 0 0 20px; overflow-x: auto; font-size: 0.85rem; color: #c8f0ff; }
pre code { background: none; padding: 0; color: inherit; }
strong { color: #f0f0ff; }
.pro-tip { background: rgba(0,245,255,0.06); border-left: 3px solid #00f5ff; border-radius: 8px; padding: 16px 20px; margin: 20px 0; font-size: 0.92rem; color: #d0d0e0; }
.pro-tip strong { color: #00f5ff; }
.method-card { background: #0e0e14; border: 1px solid #1a1a24; border-radius: 14px; padding: 24px 28px; margin: 20px 0; }
.method-card h3 { margin-top: 0; }
.method-badge { display: inline-block; font-size: 0.7rem; font-weight: 700; padding: 2px 8px; border-radius: 4px; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 8px; }
.badge-fast { background: #00ff88; color: #000; }
.badge-standard { background: #f472b6; color: #000; }
.badge-flexible { background: #ffaa00; color: #000; }
.method-stats { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin: 12px 0; }
.method-stat { font-size: 0.85rem; color: #999; }
.method-stat span { color: #e0e0f0; font-weight: 600; }
.data-table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 0.88rem; }
.data-table th, .data-table td { text-align: left; padding: 8px 12px; border-bottom: 1px solid #1a1a24; }
.data-table th { color: #00f5ff; font-weight: 600; }
.data-table td { color: #c8c8d8; }
.data-table tr:last-child td { border-bottom: none; }
.cta-box { background: #12121c; border: 1px solid rgba(0,245,255,0.2); border-radius: 14px; padding: 28px 32px; margin: 32px 0; text-align: center; }
.cta-box h3 { font-size: 1.2rem; margin-bottom: 8px; color: #f0f0ff; }
.cta-box p { color: #999; margin-bottom: 16px; }
.btn { display: inline-block; background: transparent; border: 1px solid #00f5ff; color: #00f5ff; padding: 10px 28px; border-radius: 8px; font-weight: 600; font-size: 0.95rem; transition: all .2s; }
.btn:hover { background: rgba(0,245,255,0.1); text-decoration: none; }
@media (max-width: 600px) { body { padding: 24px 16px; } h1 { font-size: 1.5rem; } .cta-box { padding: 20px 16px; } .method-stats { grid-template-columns: 1fr; } }
</style>
</head>
<body>
<div class="container">
<a class="back" href="https://derez.ai/#blog">&larr; Back to Blog</a>
<h1>3 Ways to Integrate Odoo and Hermes Agent</h1>
<div class="meta">
<span>June 20, 2026</span>
<span class="area-tag">guide</span>
<span class="chip-tag">odoo</span>
<span class="chip-tag">hermes</span>
</div>
<p>
Odoo is the most popular open-source ERP in the world — CRM, sales, inventory, accounting, all in one system.
Hermes Agent is an open-source AI agent framework. Put them together and your agent can query customer records,
check inventory levels, create leads, generate invoices, and pull sales reports — all through natural language.
</p>
<p>
There are <strong>three proven ways</strong> to connect the two. Each has different trade-offs in setup speed,
flexibility, and ongoing maintenance. This guide walks through all three so you can pick the right one.
</p>
<div class="pro-tip">
<p><strong>Already know which approach you want?</strong> The detailed speed runs are here:
<a href="https://derez.ai/blog/posts/speed-run-odoo-community-agent.html">Direct API</a>,
<a href="https://derez.ai/blog/posts/speed-run-odoo-mcp.html">MCP server</a>, and
<a href="https://derez.ai/blog/posts/direct-odoo-api-vs-mcp.html">Direct vs MCP comparison</a>.</p>
</div>
<h2>At a Glance</h2>
<table class="data-table">
<tr>
<th>Approach</th>
<th>Setup Time</th>
<th>Best For</th>
<th>Components</th>
</tr>
<tr>
<td><strong>1. Direct API</strong></td>
<td>~3 minutes</td>
<td>Single-ERP setups, production</td>
<td>Hermes + Odoo only</td>
</tr>
<tr>
<td><strong>2. MCP Server</strong></td>
<td>~5 minutes</td>
<td>Multi-tool agents, standardization</td>
<td>Hermes + mcp-server-odoo + Odoo</td>
</tr>
<tr>
<td><strong>3. Custom Skill</strong></td>
<td>~15 minutes</td>
<td>Complex workflows, custom logic</td>
<td>Hermes + custom SKILL.md + Odoo</td>
</tr>
</table>
<!-- METHOD 1 -->
<div class="method-card">
<div class="method-badge badge-fast">⚡ Fastest — 3 min</div>
<h3>Method 1: Direct API Integration (XML-RPC)</h3>
<div class="method-stats">
<div class="method-stat">Setup: <span>~3 minutes</span></div>
<div class="method-stat">Latency: <span>1 hop (agent → Odoo)</span></div>
<div class="method-stat">Security: <span>Dedicated Odoo user</span></div>
<div class="method-stat">Maintenance: <span>None</span></div>
</div>
<p>The simplest approach. You create a dedicated Odoo user with restricted permissions, paste the connection details into Hermes, and your agent calls the Odoo XML-RPC API directly.</p>
<p><strong>How it works:</strong> Hermes Agent has built-in Odoo tool support. When you configure the connection once, the agent can <code>search</code>, <code>read</code>, <code>create</code>, <code>write</code>, and <code>unlink</code> records on any Odoo model — CRM leads, partners, products, sales orders, invoices, and more.</p>
<h4>Setup</h4>
<ol>
<li><strong>Create an Odoo API key</strong> — in your Odoo instance, generate a new API key under Settings → Users → Technical</li>
<li><strong>Set the Hermes Odoo config</strong> — Add your Odoo URL, database, username, and API key to Hermes' <code>config.yaml</code></li>
<li><strong>Start Hermes</strong> — The Odoo tools are automatically available in every session</li>
</ol>
<pre><code># Hermes config.yaml snippet
odoo:
url: "https://your-instance.odoo4projects.com"
db: "your-database"
user: "agent@company.com"
api_key: "your-api-key"
readonly: true</code></pre>
<h4>When to use this</h4>
<ul>
<li>Hermes Agent is your only tool and Odoo is your only backend</li>
<li>You want the fastest possible setup</li>
<li>Lowest latency — the agent talks directly to Odoo</li>
<li>Full model access — the agent can work with any Odoo model your user has permissions for</li>
</ul>
<p><strong>Deep dive:</strong> <a href="https://derez.ai/blog/posts/speed-run-odoo-community-agent.html">Speed Run: Create an Odoo Community Agent from Zero</a></p>
</div>
<!-- METHOD 2 -->
<div class="method-card">
<div class="method-badge badge-standard">🚀 Standard — 5 min</div>
<h3>Method 2: MCP Server (Model Context Protocol)</h3>
<div class="method-stats">
<div class="method-stat">Setup: <span>~5 minutes</span></div>
<div class="method-stat">Latency: <span>2 hops (agent → MCP → Odoo)</span></div>
<div class="method-stat">Security: <span>MCP transport layer</span></div>
<div class="method-stat">Maintenance: <span>Server process</span></div>
</div>
<p>The MCP approach inserts a translation layer between Hermes and Odoo. The <a href="https://github.com/ivnvxd/mcp-server-odoo">mcp-server-odoo</a> project (315+ GitHub stars, actively maintained) exposes Odoo models as MCP tools that Hermes can discover and call.</p>
<p><strong>How it works:</strong> You run the MCP server locally on the same machine as Hermes. It listens on an HTTP port and translates MCP tool calls into Odoo XML-RPC requests. Hermes discovers the available tools automatically when you register the server.</p>
<h4>Setup</h4>
<ol>
<li><strong>Clone the server</strong><code>git clone https://github.com/ivnvxd/mcp-server-odoo.git</code></li>
<li><strong>Set environment variables</strong> — URL, database, username, API key</li>
<li><strong>Start the server</strong><code>uvx mcp-server-odoo</code> (port 8000, streamable-http transport)</li>
<li><strong>Register with Hermes</strong><code>hermes mcp add odoo --url http://localhost:8000/mcp</code></li>
<li><strong>Start Hermes</strong> — Odoo tools appear automatically</li>
</ol>
<pre><code>#!/usr/bin/env bash
export ODOO_URL="https://your-instance.odoo4projects.com"
export ODOO_DB="your-database"
export ODOO_USER="agent@company.com"
export ODOO_API_KEY="your-api-key"
export ODOO_READONLY=1
export ODOO_MCP_TRANSPORT=streamable-http
export ODOO_MCP_PORT=8000
export ODOO_YOLO=read
uvx mcp-server-odoo</code></pre>
<h4>When to use this</h4>
<ul>
<li>Your agent connects to multiple tools (Odoo + GitHub + Slack + Notion)</li>
<li>You want a standardized protocol for all tool connections</li>
<li>You're already using MCP with other tools and want consistency</li>
<li>You need to connect Hermes to Odoo without modifying Hermes configuration</li>
</ul>
<p><strong>Deep dive:</strong> <a href="https://derez.ai/blog/posts/speed-run-odoo-mcp.html">Speed Run: Connect Hermes Agent to Odoo via MCP</a></p>
</div>
<!-- METHOD 3 -->
<div class="method-card">
<div class="method-badge badge-flexible">🔧 Flexible — 15 min</div>
<h3>Method 3: Custom Hermes Skill</h3>
<div class="method-stats">
<div class="method-stat">Setup: <span>~15 minutes</span></div>
<div class="method-stat">Latency: <span>1 hop (skill → Odoo)</span></div>
<div class="method-stat">Security: <span>Full control</span></div>
<div class="method-stat">Maintenance: <span>As needed</span></div>
</div>
<p>The most flexible approach. You write a custom Hermes skill — a <code>SKILL.md</code> file — that defines exactly how the agent communicates with Odoo. This gives you full control over the tools, prompts, and error handling.</p>
<p><strong>How it works:</strong> Hermes skills are markdown files with YAML frontmatter and a structured body. Your Odoo skill defines tools like <code>search_leads</code>, <code>create_invoice</code>, or <code>check_inventory</code>. Each tool uses <code>terminal()</code> to make curl calls to the Odoo XML-RPC endpoint, and the agent calls these tools by name during the conversation.</p>
<h4>Setup</h4>
<ol>
<li><strong>Create <code>SKILL.md</code></strong> — in <code>~/.hermes/skills/odoo/SKILL.md</code></li>
<li><strong>Define tools</strong> — Each tool has a name, description, parameter schema, and command template</li>
<li><strong>Load the skill</strong> — Add it to your Hermes profile or load it in a session</li>
</ol>
<pre><code># Odoo Hermes Skill
## Tools
### search_leads
Search CRM leads with filters.
Parameters: domain (list), limit (int, optional)
Command: `curl -s "$ODOO_URL" -d '{"params": {"model": "crm.lead", "method": "search_read", "args": [{{domain}}], "kwargs": {"limit": {{limit|5}}}}}'`
### create_lead
Create a new CRM lead.
Parameters: name (string), email (string, optional), phone (string, optional)
Command: `curl -s "$ODOO_URL" -d '{"params": {"model": "crm.lead", "method": "create", "args": [{"name": "{{name}}", "email_from": "{{email}}", "phone": "{{phone}}"}]}}'`</code></pre>
<h4>When to use this</h4>
<ul>
<li>You need custom validation or business logic before/after Odoo calls</li>
<li>You want specific tool names and descriptions tailored to your workflow</li>
<li>You're building a specialized agent (e.g., "Odoo sales assistant")</li>
<li>You want to combine Odoo calls with processing steps (e.g., search → analyze → summarize)</li>
</ul>
<div class="pro-tip">
<p><strong>Pro Tip:</strong> The skill approach gives you the most control but also the most responsibility. You handle authentication, error handling, rate limiting, and API versioning yourself. For simpler setups, start with Method 1 or 2.</p>
</div>
</div>
<h2>Decision Guide</h2>
<p>Not sure which to pick? Here's a quick flowchart:</p>
<ul>
<li><strong>New to Hermes + Odoo?</strong> → Start with <strong>Direct API</strong>. It's the fastest, simplest path.</li>
<li><strong>Already using MCP for other tools?</strong> → Use the <strong>MCP Server</strong>. One protocol, one mental model.</li>
<li><strong>Need custom business logic?</strong> → Write a <strong>Custom Skill</strong>. Full control, no compromises.</li>
<li><strong>Running in production?</strong><strong>Direct API</strong> with a dedicated read-only Odoo user. Fewest moving parts, best reliability.</li>
<li><strong>Building a demo or PoC?</strong><strong>Direct API</strong>. Three minutes from start to first query.</li>
</ul>
<h2>Security Best Practices</h2>
<p>Whichever approach you choose, these rules apply:</p>
<ul>
<li><strong>Create a dedicated Odoo user</strong> for the agent — never use an admin or shared account</li>
<li><strong>Use read-only access</strong> unless the agent needs to create or modify records</li>
<li><strong>Restrict model access</strong> to only the Odoo models the agent needs (e.g., <code>crm.lead</code>, <code>res.partner</code>)</li>
<li><strong>Rotate API keys</strong> periodically and revoke them if they leak</li>
<li><strong>Run the MCP server locally</strong> — never expose it to the public internet</li>
</ul>
<h2>Comparison Table</h2>
<table class="data-table">
<tr>
<th>Feature</th>
<th>Direct API</th>
<th>MCP Server</th>
<th>Custom Skill</th>
</tr>
<tr>
<td>Setup time</td>
<td>~3 min</td>
<td>~5 min</td>
<td>~15 min</td>
</tr>
<tr>
<td>Extra processes</td>
<td>None</td>
<td>MCP server daemon</td>
<td>None</td>
</tr>
<tr>
<td>Tool discovery</td>
<td>Built-in</td>
<td>Automatic (MCP list)</td>
<td>Defined in SKILL.md</td>
</tr>
<tr>
<td>Custom workflows</td>
<td>Limited</td>
<td>Limited</td>
<td>Full control</td>
</tr>
<tr>
<td>Multi-tool agent</td>
<td>Requires per-tool setup</td>
<td>One protocol for all</td>
<td>Per-skill setup</td>
</tr>
<tr>
<td>Security model</td>
<td>Odoo user permissions</td>
<td>MCP transport + Odoo perms</td>
<td>Odoo user + skill code</td>
</tr>
<tr>
<td>Best for</td>
<td>Production single-ERP</td>
<td>Multi-tool MCP stacks</td>
<td>Custom agent products</td>
</tr>
</table>
<h2>Can You Run Multiple Methods?</h2>
<p>Yes. Hermes Agent supports mixed setups — you can use the direct API for Odoo while connecting GitHub and Slack through MCP, <em>and</em> load a custom skill for Odoo-specific workflows on top of that. The methods are not mutually exclusive. Choose the right connection for each backend.</p>
<div class="cta-box">
<h3>Try It Yourself — First Month Free</h3>
<p>Deploy a Hermes Agent with any of these Odoo integrations. Use coupon code <strong>blog950</strong> for your first month free.</p>
<a class="btn" href="https://derez.ai/#pricing">Get Your Agent →</a>
</div>
<p style="margin-top:48px;padding-top:24px;border-top:1px solid #1a1a2e;font-size:0.85rem;color:#666;">
<a href="https://derez.ai" style="color:#00f5ff">derez.ai</a> — Deploy your AI agent in 5 minutes. &middot;
<a href="https://derez.ai/blog/posts/speed-run-odoo-community-agent.html">Direct Odoo Speed Run</a> &middot;
<a href="https://derez.ai/blog/posts/speed-run-odoo-mcp.html">MCP Speed Run</a> &middot;
<a href="https://derez.ai/blog/posts/direct-odoo-api-vs-mcp.html">Direct vs MCP</a>
</p>
</div>
</body>
</html>