Confirmations, log and rate limits
How a preview becomes an action, the single-use confirmation token, the audit log and the call limits.
No tool changes data directly: prepare_* tools create a preview and the user decides.
Preview then confirmation
Typical prepare_* response:
{
"status": "preview_ready",
"action": "...",
"summary": "...",
"preview": "...",
"preview_url": "https://web.novadesko.com/ai-connector/preview/...",
"preview_url_expires_in_minutes": 30,
"confirmation_token": "ndk_...",
"next_step": "..."
}- The AI shows the preview and the
preview_urllink (signed page, PDF for documents). - It calls
confirm_actionwith the token only after an explicit yes from the user. The user can also confirm or cancel on the preview page while signed in to Novadesko. - The token is single-use, bound to the user, the company and the channel, and expires after 30 minutes. The preview content is frozen (SHA-256 fingerprint): what is confirmed is exactly what was shown.
- The action goes through the same controllers as the web app: same validations, same numbering. An invoice's legal number is assigned on confirmation.
- To change a preview, the AI calls the
prepare_*tool again: a new preview is created.list_pending_actionslists those waiting.
Tools carry the MCP annotations readOnlyHint and destructiveHint: confirm_action is marked destructive, which makes most clients ask for their own approval too.
Checks on every call
- tool known and allowed on this channel;
- the user is still a member of the company (and not a customer portal account);
- scope granted;
- rate limits;
- arguments: company or user identifiers removed, then strict schema;
- feature included in the plan;
- execution, then entry in the log.
Data returned by reads is flagged as untrusted, and tags that could mimic a tool call are neutralized: a booby-trapped customer name or note cannot command the AI.
Rate limits
| Limit | Value |
|---|---|
| Tool calls per connection | 120 per minute |
| Tool calls per company (all channels) | 400 per minute |
| Confirmations per connection | 30 per hour |
| HTTP requests to the MCP endpoint (per token) | 600 per minute |
| Token and revocation (per IP and client) | 120 per minute |
| Client registration (per IP) | 120 per minute |
| Metadata (per IP) | 600 per minute |
Beyond that, the tool returns an error result (isError: true) saying « Too many calls in a short time, retry in N seconds » (in French); HTTP limits return 429.
Audit log
Each call is logged with the date, event (read, preview, confirmation, cancellation), tool, a summary, the status (ok, refused, denied...) and the platform (claude, chatgpt, gemini, nova). The user sees each integration's log in Novadesko. Conversations themselves are neither received nor stored by Novadesko.