In these docs

Execution Layer for Odoo

Connecting an AI client.

The Execution Layer is an MCP server at /nanti/mcp on your Odoo. Any MCP client connects: Claude, ChatGPT, Cursor, or your own stack. This is the endpoint, the per-client steps, the reachability rules, and how authentication works.

Available now · Odoo 19 Updated 19 September 2026

The Execution Layer exposes a standard MCP endpoint. Any MCP client points at it, authenticates as a real Odoo user, and gets exactly the tools that user’s bundle allows. The built-in Setup guide shows the same steps as copy-paste snippets, per client.

The endpoint

POST https://<your-odoo>/nanti/mcp

It is MCP Streamable HTTP, stateless, with JSON responses. GET and DELETE on the endpoint return 405. On a local install the endpoint is http://localhost:8069/nanti/mcp (or your configured port).

Why /nanti/ and not /mcp

The endpoint and the OAuth routes are vendor-namespaced under /nanti/ so the Execution Layer coexists with any other MCP module on the same database. Generic /mcp and /oauth/* routes collide between vendors; ours never does.

Reachability

Where the client runs decides whether your Odoo needs to be reachable from the public internet.

ClientWhere it runsNeeds public HTTPS
Claude CodeYour machineNo, LAN or VPN is fine
Claude DesktopYour machineNo, LAN or VPN is fine
CursorYour machineNo, LAN or VPN is fine
ChatGPTOpenAI’s cloudYes, internet-reachable HTTPS
Claude web appAnthropic’s cloudYes, internet-reachable HTTPS

HTTPS is your responsibility, exactly as with any Odoo web endpoint: terminate TLS at your proxy or on Odoo.sh.

Claude Code

Add the server
claude mcp add --transport http odoo https://<your-odoo>/nanti/mcp

Then in Claude Code run /mcp, choose odoo, and Authenticate. A browser opens the Odoo login, you sign in as yourself and click Allow, and Claude Code is connected under your Odoo identity. For local development the URL is http://localhost:8069/nanti/mcp.

Claude Desktop

Settings, then Connectors, then Add custom connector. Set the URL to https://<your-odoo>/nanti/mcp and Connect. The client registers itself (dynamic client registration), the Odoo login opens, and you click Allow.

ChatGPT

Settings, then Connectors (developer mode), then Create. Set the MCP server URL to https://<your-odoo>/nanti/mcp, choose OAuth for authentication, and Connect. ChatGPT runs in the cloud, so your Odoo must be reachable over the public internet on HTTPS.

Cursor

Add the server to ~/.cursor/mcp.json:

~/.cursor/mcp.json
{
"mcpServers": {
"odoo": { "url": "https://<your-odoo>/nanti/mcp" }
}
}

Then open Settings, then MCP, select odoo, and Login.

Any client, and unattended jobs

The server is a standard OAuth 2.1 resource. Clients discover it and register automatically:

/.well-known/oauth-protected-resource/nanti/mcp resource discovery (RFC 9728)
/.well-known/oauth-authorization-server/nanti authorization server metadata (RFC 8414)
/nanti/oauth/register dynamic client registration (RFC 7591)

Authentication is OAuth with PKCE (S256) and refresh-token rotation. For a script or an unattended job, use a scoped API key instead:

Call with an API key
curl -X POST https://<your-odoo>/nanti/mcp \
-H "Authorization: Bearer nmk_your_scoped_key" \
-H "Content-Type: application/json" \
-d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }'

API keys act as the user who created them, are scoped per operation (read, create, update, delete, execute, export), can carry an expiry, an IP allowlist, and a per-key rate limit, and can be revoked at any time.

Multiple databases

If a host serves more than one database, send the database name in a header: X-Odoo-Database: <db>. The supported deployment is one database per host, so most installs do not need this.

Once connected, every call the client makes runs the full pipeline, and the connection appears under Connections, where it can be inspected, narrowed, or revoked. Next: what a verified write looks like.