In these docs

Context Layer for Odoo

Use the live runtime.

The verified runtime is live at api.context.nanti.ai. Try a decision with no login, then get a free 7-day universal key from one email and point Claude Code, Codex, a remote MCP client, REST, or Python at it. One key answers all five operations and never touches your Odoo database.

Early access · Odoo 19 Updated 13 August 2026

The Quickstart runs the open standard locally over ten public examples, with no key. This page is the other half: the verified 171-entry runtime, live at api.context.nanti.ai, that answers real Odoo 19 questions and that your AI reaches over MCP or REST. It is self-serve on a free 7-day trial.

Two things, kept separate

The open standard on GitHub is the format plus ten candidate examples: adopt it freely, no account. The verified runtime is the commercial product: 171 verified entries, reached with a free universal trial key. This page is about the runtime.

1. Try a decision, no login

Open the fixed demo and watch the runtime resolve one genuinely ambiguous question against verified Odoo 19 meaning, rather than guessing a formula:

There is nothing to install and no account. It is the fastest way to see what a verified answer looks like before you wire anything up.

2. Get your universal key

The trial is self-serve and low-friction. Enter one email, with no verification step and no sales call, and an active seven-day key appears on the next screen:

The key is universal: a single Bearer token that already covers both Odoo 19 editions, all released modules, every operation, and every interface below (MCP, REST, Codex, Claude Code, Python). There is nothing to scope or configure, and it asks for no Odoo credentials and no customer data. The token is shown once, so copy it and keep it somewhere safe.

Copy the token when it appears

The trial token is displayed a single time and cannot be recovered afterward (the runtime stores only its hash). If you lose it, request a new trial after 24 hours. Treat it like any other secret: never commit it or paste it into shared configuration.

Set it once in your shell and every example below reads it from the environment:

shell
export OCL_URL="https://api.context.nanti.ai"
export OCL_TOKEN="<your-issued-token>"

3. Point your AI at the runtime

The runtime speaks MCP and REST. Wire it in beside the connector your AI already uses to reach Odoo. Your AI calls the context layer first for meaning, then reads the real records the way it always has.

Claude Code

Claude Code
claude mcp add --scope user --transport http ocl \
https://api.context.nanti.ai/mcp \
--header "Authorization: Bearer $OCL_TOKEN"

Claude Code stores the header in your user configuration. Treat that file as a secret.

Codex CLI

Codex CLI
codex mcp add ocl \
--url https://api.context.nanti.ai/mcp \
--bearer-token-env-var OCL_TOKEN

Launch Codex from the same shell so it can read OCL_TOKEN from the environment.

Any remote-MCP client

Most MCP hosts take a URL and a header. The shape is the same everywhere:

mcp config
{
"mcpServers": {
"ocl": {
"url": "https://api.context.nanti.ai/mcp",
"headers": { "Authorization": "Bearer ${OCL_TOKEN}" }
}
}
}

Use your host’s supported method for secret environment variables rather than pasting the token into a file under source control.

REST

Every operation is a POST under /v1/. The question plus the Odoo scope (version, edition, modules) is all get_context needs:

curl
curl "$OCL_URL/v1/get-context" \
-H "Authorization: Bearer $OCL_TOKEN" \
-H "Content-Type: application/json" \
--data '{
"question": "Which invoices are unpaid?",
"odoo_version": "19.0",
"edition": "community",
"modules": ["account"]
}'

Python

The reference client wraps the same REST operations:

python
import os
from ocl_spec import OCLClient
ocl = OCLClient(os.environ["OCL_URL"], os.environ["OCL_TOKEN"])
pack = ocl.get_context(
"Which invoices are unpaid?",
odoo_version="19.0",
edition="community",
modules=["account"],
)

The reference clients ship as source in the open standard; they are not published PyPI or npm packages yet.

What you can call

The runtime answers all five operations. get_context is the one to reach for first; the other four are focused lookups an agent can call mid-reasoning.

OperationWhat it answers
get_contextFor this question, the smallest applicable, verified context pack.
resolve_nounWhat model and record population does this business noun map to?
explain_fieldWhat does this field actually mean, beyond its label?
get_join_pathWhat is the correct typed path from this model to that one?
validate_write_intentIs this intended write risky, and what is the safe way to do it?

validate_write_intent is advisory. It can warn and point at the safe method, but it never authorizes an action. Odoo remains the authority for what is permitted and how it runs. For the full picture of the operations and surfaces, see Consuming the layer.

Tell your agent to ask OCL first

The pattern that works: instruct the agent to call get_context before it interprets or plans any Odoo work, and to carry every warning and required clarification from the returned pack into its answer. The context layer can withhold a single answer and ask which definition you mean; that refusal is the feature, not a gap.

The trial key, and its bounds

The key is universal and expiring. It covers both Odoo 19 editions, all released modules, and every operation and interface, and it is meant for evaluation:

  • it expires after seven days;
  • the trial runs without a request-count meter, but burst, context-size, and distinct-entry limits stay active to prevent misuse and registry reconstruction;
  • the 171-entry registry is not downloadable or enumerable through it, and there is no bulk export;
  • there is no production SLA during early access.

When the seven days are up, authenticated calls return 401 with expired_token. There is no grace period, no renewal, and no way to recover a lost token: you simply start a new trial. The runtime returns the smallest safe context for each request; it has no registry-listing or bulk-extraction operation, and wildcard or out-of-scope requests are rejected. If you need more than evaluation, production embedding and redistribution are a separate licensed conversation, not part of the trial. See Current limitations.

It does not touch your Odoo database

Meaning, not access

The hosted runtime asks for no Odoo credentials and never reads your database. It returns verified meaning about Odoo 19: which records count, which fields mislead, how they join, and whether an action is safe. Your own AI still reads the real records the way it already does, through its connector, under your real permissions.

Meaning is verified against Odoo 19, not against your specific instance, so custom modules, localizations, company, and currency can still change the answer for your database. There is an optional local metadata collector, opt-in and separate, that reads allowlisted Odoo metadata to tune context for your instance; if you use it, its Odoo credential stays on your side. See Security and boundaries.

Where to go next