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.
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:
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 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 mcp add ocl \ --url https://api.context.nanti.ai/mcp \ --bearer-token-env-var OCL_TOKENLaunch 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:
{ "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 "$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:
import osfrom 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.
| Operation | What it answers |
|---|---|
get_context | For this question, the smallest applicable, verified context pack. |
resolve_noun | What model and record population does this business noun map to? |
explain_field | What does this field actually mean, beyond its label? |
get_join_path | What is the correct typed path from this model to that one? |
validate_write_intent | Is 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
- Consuming the layer: the five operations and every surface in detail.
- Context packs and offline: assemble a pack ahead of time, or serve a signed offline cache.
- Coverage and release status: what the 171 entries cover, and what they do not.
- Current limitations: the honest edges before you build on it.