How Xenovia traces tool calls and how to govern them with policy.
Most agent risk comes from tool use, not text generation. Xenovia sees the tools an agent declares and the calls a model makes, and lets you govern them with policy.
Tool definitions and model tool calls (agent endpoint)
When your app sends a chat/completions or responses request, the tool definitions you pass are visible to policy as input.tools and input.tool_names, and are recorded on the trace. When the model decides to call a tool, the tool calls it returns are captured on the turn as output.tool_calls (name, arguments, and call ID).In the common pattern, your own code executes the tool and sends the result back as a tool-role message on the next request. That result is visible to the next request’s policy as input.tool_results and is recorded on that turn. Client-executed tools are not separate child runs — they live in the turn’s messages and output.
When a tool is executed through the Model Context Protocol by the runtime itself, Xenovia records it as its own child run with the tool name, arguments, result, status, and latency, alongside the model runs.
Tool governance is ordinary policy. The request-stage Rego sees the declared tools before the model is called, so a matching rule returns 403 before any tokens are spent. Read Policies and Enforcement first for the decision contract.
input.tool_names lists the declared tool names exactly as your app sent them; comparisons are case-sensitive. input.tools carries the full schemas as input.tools[_].name, .description, and .parameters_schema; the keys of every tool object are lowercase. Use tool_names for allow/deny lists.
Several shipped policy templates cover tool access directly — for example an approved-tool allowlist, tool-argument PII blocking, and tool-argument size caps. Instantiate one from the dashboard or the management API rather than writing Rego from scratch.
Tool governance here covers tools the model requests through the agent endpoint. To gate actions your code takes on its own — tool calls and results, memory writes, database writes, outbound API calls — use the Xenovia Python SDK.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Xenovia","colors":{"primary":"#37AEA0","light":"#37AEA0","dark":"#5CACA0"},"logo":{"light":"https://mintcdn.com/xenovia/fXYbfbUZbT5Ajr9c/logo/xenovia-logo.svg?fit=max\u0026auto=format\u0026n=fXYbfbUZbT5Ajr9c\u0026q=85\u0026s=35e1d4d64610ecc78b840c284519c509","dark":"https://mintcdn.com/xenovia/fXYbfbUZbT5Ajr9c/logo/xenovia-logo.svg?fit=max\u0026auto=format\u0026n=fXYbfbUZbT5Ajr9c\u0026q=85\u0026s=35e1d4d64610ecc78b840c284519c509","href":"https://xenovia.io"},"favicon":"https://mintcdn.com/xenovia/fXYbfbUZbT5Ajr9c/logo/xenovia-logo.svg?fit=max\u0026auto=format\u0026n=fXYbfbUZbT5Ajr9c\u0026q=85\u0026s=35e1d4d64610ecc78b840c284519c509","navbar":{"links":[{"href":"mailto:richard.loomis@xenovia.io","label":"Contact"}],"primary":{"type":"button","label":"Open Platform","href":"https://app.xenovia.io/"}},"footer":{"socials":{"x":"https://x.com/xenovia_io","linkedin":"https://www.linkedin.com/company/xenovia"}},"integrations":{"posthog":{"apiKey":"phc_q4nUtwYn8CNyQYTfZChzYhYWhAVBWA7sYP5sTCcUbfMQ","sessionRecording":false}},"styling":{"latex":false},"navigation":{"global":{"anchors":[]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"xenovia","hasAudioNarration":false,"actualSubdomain":"xenovia","customDomains":["docs.xenovia.io"],"gitSource":{"type":"github","owner":"richardloomis","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"entitlements":{},"buildId":"6ac27362b6284a46ecf4b987","clientVersion":"0.0.4087","searchFilterCounts":[{"language":"default","tag":"API Reference","count":81},{"language":"default","tag":"Docs","count":19},{"language":"default","tag":"Alerts","count":12},{"language":"default","tag":"Providers","count":12},{"language":"default","tag":"Policies","count":11},{"language":"default","tag":"Agents","count":10},{"language":"default","tag":"Integrations","count":8},{"language":"default","tag":"Platform","count":8},{"language":"default","tag":"Organization","count":8},{"language":"default","tag":"Sessions and traces","count":8}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"platform/tools-and-access","slug":"/platform/tools-and-access","pageMetadata":{"title":"Tools and Access","description":"How Xenovia traces tool calls and how to govern them with policy.","icon":"toolbox","href":"/platform/tools-and-access"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How Xenovia traces tool calls and how to govern them with policy.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Note}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Most agent risk comes from tool use, not text generation. Xenovia sees the tools an agent declares and the calls a model makes, and lets you govern them with policy.`}),`\n`,_jsx(Heading,{level:`2`,id:`how-tool-calls-appear-in-traces`,children:`How tool calls appear in traces`}),`\n`,_jsx(Heading,{level:`3`,id:`tool-definitions-and-model-tool-calls-agent-endpoint`,children:`Tool definitions and model tool calls (agent endpoint)`}),`\n`,_jsxs(_components.p,{children:[`When your app sends a `,_jsx(_components.code,{children:`chat/completions`}),` or `,_jsx(_components.code,{children:`responses`}),` request, the tool `,_jsx(_components.strong,{children:`definitions`}),` you pass are visible to policy as `,_jsx(_components.code,{children:`input.tools`}),` and `,_jsx(_components.code,{children:`input.tool_names`}),`, and are recorded on the trace. When the model decides to call a tool, the `,_jsx(_components.strong,{children:`tool calls`}),` it returns are captured on the turn as `,_jsx(_components.code,{children:`output.tool_calls`}),` (name, arguments, and call ID).`]}),`\n`,_jsxs(_components.p,{children:[`In the common pattern, your own code executes the tool and sends the result back as a `,_jsx(_components.code,{children:`tool`}),`-role message on the next request. That result is visible to the next request’s policy as `,_jsx(_components.code,{children:`input.tool_results`}),` and is recorded on that turn. Client-executed tools are not separate child runs — they live in the turn’s messages and output.`]}),`\n`,_jsx(Heading,{level:`3`,id:`mcp-tools-executed-by-the-runtime`,children:`MCP tools executed by the runtime`}),`\n`,_jsx(_components.p,{children:`When a tool is executed through the Model Context Protocol by the runtime itself, Xenovia records it as its own child run with the tool name, arguments, result, status, and latency, alongside the model runs.`}),`\n`,_jsx(Heading,{level:`2`,id:`governing-tools-with-policy`,children:`Governing tools with policy`}),`\n`,_jsxs(_components.p,{children:[`Tool governance is ordinary policy. The request-stage Rego sees the declared tools before the model is called, so a matching rule returns `,_jsx(_components.code,{children:`403`}),` before any tokens are spent. Read `,_jsx(_components.a,{href:`/platform/policies-and-approvals`,children:`Policies and Enforcement`}),` first for the decision contract.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`input.tool_names`}),` lists the declared tool names exactly as your app sent them; comparisons are case-sensitive. `,_jsx(_components.code,{children:`input.tools`}),` carries the full schemas as `,_jsx(_components.code,{children:`input.tools[_].name`}),`, `,_jsx(_components.code,{children:`.description`}),`, and `,_jsx(_components.code,{children:`.parameters_schema`}),`; the keys of every tool object are lowercase. Use `,_jsx(_components.code,{children:`tool_names`}),` for allow/deny lists.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`block-a-tool-by-name`,children:`Block a tool by name`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`package xenovia`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`import future.keywords.if`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`import future.keywords.in`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`default decision = {\"action\": \"allow\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`decision = {\"action\": \"block\", \"rule\": \"no-db-writes\"} if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` some tool in input.tool_names`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` startswith(tool, \"db_write_\")`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`allow-only-known-safe-tools`,children:`Allow only known-safe tools`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`13`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`13`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`package xenovia`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`import future.keywords.if`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`import future.keywords.in`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`default decision = {\"action\": \"allow\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`safe := {\"db_read\", \"get_user_profile\", \"list_records\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`decision = {\"action\": \"block\", \"rule\": \"tool-allowlist\"} if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` some tool in input.tool_names`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` not safe[tool]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`3`,id:`escalate-a-destructive-tool-for-human-attention`,children:`Escalate a destructive tool for human attention`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`package xenovia`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`import future.keywords.if`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`import future.keywords.in`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`default decision = {\"action\": \"allow\"}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`decision = {\"action\": \"escalate\", \"rule\": \"destructive-tool-review\"} if {`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` some tool in input.tool_names`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` tool == \"delete_account\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`recommended-controls`,children:`Recommended controls`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Least privilege.`}),` Blocklist high-risk tools explicitly rather than trusting a broad allowlist.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Separate by environment.`}),` Use different agents, or different policies on one agent, for `,_jsx(_components.code,{children:`dev`}),`, `,_jsx(_components.code,{children:`staging`}),`, and `,_jsx(_components.code,{children:`prod`}),`. Never share production credentials.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Escalate irreversible actions.`}),` Use `,_jsx(_components.code,{children:`escalate`}),` for deletions, financial writes, and cross-system state changes so they surface in Sessions and Alerts.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Review from evidence.`}),` Traces show which tools are actually called. Remove rules for tools that no longer appear.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`starting-from-a-template`,children:`Starting from a template`}),`\n`,_jsxs(_components.p,{children:[`Several shipped policy templates cover tool access directly — for example an approved-tool allowlist, tool-argument PII blocking, and tool-argument size caps. Instantiate one from the dashboard or the `,_jsx(_components.a,{href:`/api-reference/introduction`,children:`management API`}),` rather than writing Rego from scratch.`]}),`\n`,_jsx(Heading,{level:`2`,id:`governing-actions-outside-the-model-call`,children:`Governing actions outside the model call`}),`\n`,_jsxs(_components.p,{children:[`Tool governance here covers tools the model requests through the agent endpoint. To gate actions your code takes on its own — tool calls and results, memory writes, database writes, outbound API calls — use the `,_jsx(_components.a,{href:`/integrations/xenovia-sdk`,children:`Xenovia Python SDK`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Tools and Access","description":"How Xenovia traces tool calls and how to govern them with policy.","icon":"toolbox","href":"/platform/tools-and-access"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"How tool calls appear in traces","slug":"how-tool-calls-appear-in-traces","depth":2,"children":[{"title":"Tool definitions and model tool calls (agent endpoint)","slug":"tool-definitions-and-model-tool-calls-agent-endpoint","depth":3,"children":[]},{"title":"MCP tools executed by the runtime","slug":"mcp-tools-executed-by-the-runtime","depth":3,"children":[]}]},{"title":"Governing tools with policy","slug":"governing-tools-with-policy","depth":2,"children":[{"title":"Block a tool by name","slug":"block-a-tool-by-name","depth":3,"children":[]},{"title":"Allow only known-safe tools","slug":"allow-only-known-safe-tools","depth":3,"children":[]},{"title":"Escalate a destructive tool for human attention","slug":"escalate-a-destructive-tool-for-human-attention","depth":3,"children":[]}]},{"title":"Recommended controls","slug":"recommended-controls","depth":2,"children":[]},{"title":"Starting from a template","slug":"starting-from-a-template","depth":2,"children":[]},{"title":"Governing actions outside the model call","slug":"governing-actions-outside-the-model-call","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"xenovia","siteName":"Xenovia","title":"Tools and Access - Xenovia","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-02T07:50:30.835Z","originalFileLocation":"platform/tools-and-access.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"How Xenovia traces tool calls and how to govern them with policy.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Xenovia\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/xenovia/2Fmh5_i0_9gaYJ4N/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/xenovia/2Fmh5_i0_9gaYJ4N/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/xenovia/2Fmh5_i0_9gaYJ4N/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/xenovia/2Fmh5_i0_9gaYJ4N/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/xenovia/2Fmh5_i0_9gaYJ4N/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/xenovia/2Fmh5_i0_9gaYJ4N/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/xenovia/2Fmh5_i0_9gaYJ4N/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/xenovia/2Fmh5_i0_9gaYJ4N/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/xenovia/2Fmh5_i0_9gaYJ4N/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Tools and Access - Xenovia\">\u003cmeta data-mint-head property=\"og:description\" content=\"How Xenovia traces tool calls and how to govern them with policy.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Xenovia\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.xenovia.io/platform/tools-and-access\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://xenovia.mintlify.site/_mintlify/api/og/v2?division=Platform\u0026amp;title=Tools+and+Access\u0026amp;description=How+Xenovia+traces+tool+calls+and+how+to+govern+them+with+policy.\u0026amp;theme=0315e521ec01a743eadd0fdc\u0026amp;signature=a87c26c1d12b0d09339fb8c43f7b7972b01423a4ea7c97d78345f3778793c10a\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Tools and Access - Xenovia\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How Xenovia traces tool calls and how to govern them with policy.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://xenovia.mintlify.site/_mintlify/api/og/v2?division=Platform\u0026amp;title=Tools+and+Access\u0026amp;description=How+Xenovia+traces+tool+calls+and+how+to+govern+them+with+policy.\u0026amp;theme=0315e521ec01a743eadd0fdc\u0026amp;signature=a87c26c1d12b0d09339fb8c43f7b7972b01423a4ea7c97d78345f3778793c10a\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/xenovia/2Fmh5_i0_9gaYJ4N/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Xenovia\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#37AEA0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.xenovia.io/platform/tools-and-access\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/platform/tools-and-access.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.xenovia.io/#organization\",\"name\":\"Xenovia\",\"url\":\"https://docs.xenovia.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/xenovia/fXYbfbUZbT5Ajr9c/logo/xenovia-logo.svg?fit=max\u0026auto=format\u0026n=fXYbfbUZbT5Ajr9c\u0026q=85\u0026s=35e1d4d64610ecc78b840c284519c509\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.xenovia.io#website\",\"name\":\"Xenovia\",\"url\":\"https://docs.xenovia.io\",\"publisher\":{\"@id\":\"https://docs.xenovia.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.xenovia.io/platform/tools-and-access#webpage\",\"url\":\"https://docs.xenovia.io/platform/tools-and-access\",\"name\":\"Tools and Access\",\"description\":\"How Xenovia traces tool calls and how to govern them with policy.\",\"dateModified\":\"2026-10-02T07:50:30.835Z\",\"isPartOf\":{\"@id\":\"https://docs.xenovia.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.xenovia.io/platform/tools-and-access#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.xenovia.io/platform/tools-and-access#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Platform\",\"item\":\"https://docs.xenovia.io/platform/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tools and Access\",\"item\":\"https://docs.xenovia.io/platform/tools-and-access\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.xenovia.io/platform/tools-and-access#article\",\"headline\":\"Tools and Access\",\"name\":\"Tools and Access\",\"description\":\"How Xenovia traces tool calls and how to govern them with policy.\",\"url\":\"https://docs.xenovia.io/platform/tools-and-access\",\"mainEntityOfPage\":{\"@id\":\"https://docs.xenovia.io/platform/tools-and-access#webpage\"},\"dateModified\":\"2026-10-02T07:50:30.835Z\",\"publisher\":{\"@id\":\"https://docs.xenovia.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.xenovia.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Xenovia\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Xenovia","nav":{"global":{"anchors":[]},"tabs":[{"tab":"Docs","groups":[{"group":"Start Here","pages":[{"title":"Xenovia Docs","icon":"sparkles","href":"/introduction"},{"title":"Getting Started","icon":"flag-checkered","href":"/getting-started/overview"},{"title":"Quickstart","icon":"bolt","href":"/getting-started/quickstart"}]},{"group":"Integrations","pages":[{"title":"Integrations Overview","icon":"plug","href":"/integrations/overview"},{"title":"Xenovia Python SDK","icon":"python","href":"/integrations/xenovia-sdk"},{"title":"OpenAI SDK","icon":"python","href":"/integrations/openai-sdk"},{"title":"LangChain","icon":"link","href":"/integrations/langchain"},{"title":"LlamaIndex","icon":"database","href":"/integrations/llamaindex"},{"title":"OpenAI Agents SDK","icon":"robot","href":"/integrations/openai-agents-sdk"},{"title":"Vercel AI SDK","icon":"triangle","href":"/integrations/vercel-ai-sdk"},{"title":"AutoGen \u0026 CrewAI","icon":"users","href":"/integrations/autogen-crewai"}]},{"group":"Platform","pages":[{"title":"Platform Overview","icon":"layer-group","href":"/platform/overview"},{"title":"Runtime Architecture","icon":"sitemap","href":"/platform/runtime-architecture"},{"title":"Supported providers","href":"/platform/providers"},{"title":"Fallback providers","icon":"life-ring","href":"/platform/fallback-providers"},{"title":"Policies and Enforcement","description":"Write Rego policies evaluated by OPA against the full request and response context.","icon":"scale-balanced","href":"/platform/policies-and-approvals"},{"title":"Tools and Access","icon":"toolbox","href":"/platform/tools-and-access"},{"title":"Traces and Remediation","description":"What Xenovia records per request, how to enrich it, and how to investigate.","icon":"route","href":"/platform/traces-and-remediation"},{"title":"Simulation","icon":"flask","href":"/platform/simulation"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference/introduction"}]}]},"basePath":"","title":"Tools and Access - Xenovia","buildId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","deploymentId":"dpl_FWZhTb2vab28gFGFH4ojka6qEznQ","dynamics":[],"chunks":[]}