Every released version, what changed in it, and the date it went out. This page is generated from the module’s own changelog, which is the same file shipped inside technovision_ai_mcp and rendered on its Odoo Apps Store listing.
ai.tool.call.conversation_id is loosened to optional here. A read made over MCP belongs to no conversation — there is no transcript, because there is no Odoo screen — and one audit trail holding both kinds of read is worth more than two that each hold half.
Added
One endpoint, /mcp/v1, speaking JSON-RPC 2.0 and implementing the parts of the Model Context Protocol a client needs to discover and call tools: initialize, tools/list, tools/call, ping. Batched requests are answered in turn; notifications get no reply, as the specification says.
Per-person tokens. A token is bound to one user, and every request it authenticates runs through env[model].with_user(that person) — the same scope and tool layer the Odoo screens use, not a parallel path.
The secret is never stored: a SHA-256 digest and a short non-secret prefix, compared in constant time. Shown once, at issue, and unrecoverable afterwards.
A generated client configuration — the URL and Authorization header already correct — because the commonest failure is a token pasted into the wrong field.
Expiry and one-click revocation, effective on the next request. Audit rows outlive the token, because the interesting question is usually asked after it is revoked.
tools/list scoped per request, so a client is never told that a tool it could not use exists.
The same audit trail as the app, with three columns this module makes meaningful: the source, the token, and the client's self-reported name.
Security
The route is auth="none" and every request begins as nobody. The bearer token is the only thing that narrows it to a user, and su=False is passed explicitly when it does.
A tool name arrives from the client, so it is re-resolved against that person's scope on every call rather than trusted from tools/list.
A malformed or out-of-scope tool call is returned as an MCP tool result with isError, not a JSON-RPC protocol error: the model is meant to read it and correct itself, and a protocol error would end the session instead.
Internal failures return an unspecific message. The traceback goes to the server log, where the administrator can read it and the client cannot.
Request bodies above 256 KB are refused unread.
An owner and a digest are frozen after issue, so revocation cannot be downgraded to a rename and a token cannot quietly change whose data it reaches.