[{"data":1,"prerenderedAt":3808},["ShallowReactive",2],{"navigation_docs":3,"docs-page:\u002Fbuild\u002Fparts\u002Ftools":1849,"docs-surround:\u002Fbuild\u002Fparts\u002Ftools":3803},[4,72,214,304,947,1040,1230,1504,1590,1701,1830],{"title":5,"path":6,"stem":7,"children":8,"icon":71},"Get started","\u002Fgetting-started","01.getting-started\u002F00.index",[9,10,15,20,25,36],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","01.getting-started\u002F01.introduction","i-ph-house",{"title":16,"path":17,"stem":18,"icon":19},"Quickstart","\u002Fgetting-started\u002Fquickstart","01.getting-started\u002F02.quickstart","i-ph-rocket-launch",{"title":21,"path":22,"stem":23,"icon":24},"Concepts","\u002Fgetting-started\u002Fconcepts","01.getting-started\u002F03.concepts","i-ph-book-open",{"title":26,"path":27,"stem":28,"children":29,"icon":31},"Install","\u002Fgetting-started\u002Finstall","01.getting-started\u002F04.install\u002F00.index",[30,32],{"title":26,"path":27,"stem":28,"icon":31},"i-ph-download-simple",{"title":33,"path":34,"stem":35},"Prepare the Linux sandbox","\u002Fgetting-started\u002Finstall\u002Flinux-sandbox","01.getting-started\u002F04.install\u002F01.linux-sandbox",{"title":37,"path":38,"stem":39,"children":40,"icon":42},"Web UI","\u002Fgetting-started\u002Fweb-ui","01.getting-started\u002F05.web-ui\u002F00.index",[41,43,47,51,55,59,63,67],{"title":37,"path":38,"stem":39,"icon":42},"i-ph-monitor",{"title":44,"path":45,"stem":46},"Choose a tenant","\u002Fgetting-started\u002Fweb-ui\u002Ftenants","01.getting-started\u002F05.web-ui\u002F01.tenants",{"title":48,"path":49,"stem":50},"Find a page","\u002Fgetting-started\u002Fweb-ui\u002Fnavigation","01.getting-started\u002F05.web-ui\u002F02.navigation",{"title":52,"path":53,"stem":54},"Use the chat drawer","\u002Fgetting-started\u002Fweb-ui\u002Fchats","01.getting-started\u002F05.web-ui\u002F03.chats",{"title":56,"path":57,"stem":58},"Create and edit records","\u002Fgetting-started\u002Fweb-ui\u002Fforms","01.getting-started\u002F05.web-ui\u002F04.forms",{"title":60,"path":61,"stem":62},"Keyboard and accessibility","\u002Fgetting-started\u002Fweb-ui\u002Faccessibility","01.getting-started\u002F05.web-ui\u002F05.accessibility",{"title":64,"path":65,"stem":66},"Accounts and permissions","\u002Fgetting-started\u002Fweb-ui\u002Faccounts","01.getting-started\u002F05.web-ui\u002F06.accounts",{"title":68,"path":69,"stem":70},"Console page directory","\u002Fgetting-started\u002Fweb-ui\u002Fpage-directory","01.getting-started\u002F05.web-ui\u002F07.page-directory",false,{"title":21,"path":73,"stem":74,"children":75,"icon":71},"\u002Fconcepts","02.concepts\u002F00.index",[76,77,82,87,92,123,128,143,166,185,204,209],{"title":21,"path":73,"stem":74},{"title":78,"path":79,"stem":80,"icon":81},"Architecture","\u002Fconcepts\u002Farchitecture","02.concepts\u002F01.architecture","i-ph-planet",{"title":83,"path":84,"stem":85,"icon":86},"Jobs and durability","\u002Fconcepts\u002Fjobs","02.concepts\u002F02.jobs","i-ph-infinity",{"title":88,"path":89,"stem":90,"icon":91},"Routing","\u002Fconcepts\u002Frouting","02.concepts\u002F03.routing","i-ph-path",{"title":93,"path":94,"stem":95,"children":96,"icon":98},"Security model","\u002Fconcepts\u002Fsecurity","02.concepts\u002F04.security\u002F00.index",[97,99,103,107,111,115,119],{"title":93,"path":94,"stem":95,"icon":98},"i-ph-shield-check",{"title":100,"path":101,"stem":102},"Node identity and tenant secrets","\u002Fconcepts\u002Fsecurity\u002Fidentity-and-secrets","02.concepts\u002F04.security\u002F01.identity-and-secrets",{"title":104,"path":105,"stem":106},"Plugin processes and operator exemptions","\u002Fconcepts\u002Fsecurity\u002Fplugins","02.concepts\u002F04.security\u002F02.plugins",{"title":108,"path":109,"stem":110},"Sandbox tiers and routing","\u002Fconcepts\u002Fsecurity\u002Fsandbox-tiers","02.concepts\u002F04.security\u002F03.sandbox-tiers",{"title":112,"path":113,"stem":114},"Sandbox egress rules","\u002Fconcepts\u002Fsecurity\u002Fegress","02.concepts\u002F04.security\u002F04.egress",{"title":116,"path":117,"stem":118},"Protected files and sandbox limits","\u002Fconcepts\u002Fsecurity\u002Fprotected-files","02.concepts\u002F04.security\u002F05.protected-files",{"title":120,"path":121,"stem":122},"Security assurance","\u002Fconcepts\u002Fsecurity\u002Fassurance","02.concepts\u002F04.security\u002F06.assurance",{"title":124,"path":125,"stem":126,"icon":127},"Temporal","\u002Fconcepts\u002Ftemporal","02.concepts\u002F05.temporal","i-ph-clock",{"title":129,"path":130,"stem":131,"children":132,"icon":134},"Limits and scaling","\u002Fconcepts\u002Flimits-and-scaling","02.concepts\u002F06.limits-and-scaling\u002F00.index",[133,135,139],{"title":129,"path":130,"stem":131,"icon":134},"i-ph-gauge",{"title":136,"path":137,"stem":138},"Tenant and queue limits","\u002Fconcepts\u002Flimits-and-scaling\u002Flimits","02.concepts\u002F06.limits-and-scaling\u002F01.limits",{"title":140,"path":141,"stem":142},"Capacity measurements","\u002Fconcepts\u002Flimits-and-scaling\u002Fmeasurements","02.concepts\u002F06.limits-and-scaling\u002F02.measurements",{"title":144,"path":145,"stem":146,"children":147,"icon":149},"Threat model","\u002Fconcepts\u002Fthreat-model","02.concepts\u002F07.threat-model\u002F00.index",[148,150,154,158,162],{"title":144,"path":145,"stem":146,"icon":149},"i-ph-crosshair",{"title":151,"path":152,"stem":153},"Trust boundaries and compromise","\u002Fconcepts\u002Fthreat-model\u002Ftrust-boundaries","02.concepts\u002F07.threat-model\u002F01.trust-boundaries",{"title":155,"path":156,"stem":157},"Harness and tool boundaries","\u002Fconcepts\u002Fthreat-model\u002Fharness-tools","02.concepts\u002F07.threat-model\u002F02.harness-tools",{"title":159,"path":160,"stem":161},"Known security gaps","\u002Fconcepts\u002Fthreat-model\u002Fknown-gaps","02.concepts\u002F07.threat-model\u002F03.known-gaps",{"title":163,"path":164,"stem":165},"Origins, sequences and tool results","\u002Fconcepts\u002Fthreat-model\u002Forigins-and-results","02.concepts\u002F07.threat-model\u002F04.origins-and-results",{"title":167,"path":168,"stem":169,"children":170,"icon":172},"Outbound connections","\u002Fconcepts\u002Foutbound-connections","02.concepts\u002F08.outbound-connections\u002F00.index",[171,173,177,181],{"title":167,"path":168,"stem":169,"icon":172},"i-ph-arrow-square-out",{"title":174,"path":175,"stem":176},"Server outbound connections","\u002Fconcepts\u002Foutbound-connections\u002Fserver","02.concepts\u002F08.outbound-connections\u002F01.server",{"title":178,"path":179,"stem":180},"Node and plugin outbound connections","\u002Fconcepts\u002Foutbound-connections\u002Fnodes-and-plugins","02.concepts\u002F08.outbound-connections\u002F02.nodes-and-plugins",{"title":182,"path":183,"stem":184},"Addresses a model provider fetches","\u002Fconcepts\u002Foutbound-connections\u002Fprovider-fetches","02.concepts\u002F08.outbound-connections\u002F03.provider-fetches",{"title":186,"path":187,"stem":188,"children":189,"icon":191},"Run receipts","\u002Fconcepts\u002Frun-receipts","02.concepts\u002F09.run-receipts\u002F00.index",[190,192,196,200],{"title":186,"path":187,"stem":188,"icon":191},"i-ph-receipt",{"title":193,"path":194,"stem":195},"Authority envelopes and delegation","\u002Fconcepts\u002Frun-receipts\u002Fauthority","02.concepts\u002F09.run-receipts\u002F01.authority",{"title":197,"path":198,"stem":199},"Call bindings and budget charges","\u002Fconcepts\u002Frun-receipts\u002Fcalls-and-charges","02.concepts\u002F09.run-receipts\u002F02.calls-and-charges",{"title":201,"path":202,"stem":203},"Verify run receipts offline","\u002Fconcepts\u002Frun-receipts\u002Fverify","02.concepts\u002F09.run-receipts\u002F03.verify",{"title":205,"path":206,"stem":207,"icon":208},"Delegation and identity","\u002Fconcepts\u002Fdelegation-and-identity","02.concepts\u002F10.delegation-and-identity","i-ph-identification-badge",{"title":210,"path":211,"stem":212,"icon":213},"How a tool call is decided","\u002Fconcepts\u002Fhow-a-tool-call-is-decided","02.concepts\u002F11.how-a-tool-call-is-decided","i-ph-list-checks",{"title":215,"path":216,"stem":217,"children":218,"icon":71},"Run","\u002Fagents","03.agents\u002F00.index",[219,221,226,231,236,240,245,250,268,299],{"title":220,"path":216,"stem":217},"Run agents",{"title":222,"path":223,"stem":224,"icon":225},"Run jobs","\u002Fagents\u002Frun-jobs","03.agents\u002F01.run-jobs","i-ph-play",{"title":227,"path":228,"stem":229,"icon":230},"Job history","\u002Fagents\u002Fhistory","03.agents\u002F02.history","i-ph-clock-counter-clockwise",{"title":232,"path":233,"stem":234,"icon":235},"Long jobs","\u002Fagents\u002Flong-jobs","03.agents\u002F03.long-jobs","i-ph-hourglass-medium",{"title":237,"path":238,"stem":239,"icon":235},"Waiting for events","\u002Fagents\u002Fwaiting-for-events","03.agents\u002F04.waiting-for-events",{"title":241,"path":242,"stem":243,"icon":244},"Delegation","\u002Fagents\u002Fdelegation","03.agents\u002F05.delegation","i-ph-git-fork",{"title":246,"path":247,"stem":248,"icon":249},"Colleagues and the board","\u002Fagents\u002Fcolleagues","03.agents\u002F06.colleagues","i-ph-chats-circle",{"title":251,"path":252,"stem":253,"children":254,"icon":249},"Conversations","\u002Fagents\u002Fconversations","03.agents\u002F07.conversations\u002F00.index",[255,256,260,264],{"title":251,"path":252,"stem":253,"icon":249},{"title":257,"path":258,"stem":259},"Conversation access and history","\u002Fagents\u002Fconversations\u002Faccess-and-history","03.agents\u002F07.conversations\u002F02.access-and-history",{"title":261,"path":262,"stem":263},"Use conversations from an app","\u002Fagents\u002Fconversations\u002Fapps","03.agents\u002F07.conversations\u002F03.apps",{"title":265,"path":266,"stem":267},"Hand off a conversation and use Ask","\u002Fagents\u002Fconversations\u002Fhandoffs-and-ask","03.agents\u002F07.conversations\u002F04.handoffs-and-ask",{"title":269,"path":270,"stem":271,"children":272,"icon":274},"Decide an approval","\u002Fagents\u002Fapprovals","03.agents\u002F08.approvals\u002F00.index",[273,275,279,283,287,291,295],{"title":269,"path":270,"stem":271,"icon":274},"i-ph-hand-palm",{"title":276,"path":277,"stem":278},"Configure approval ownership and deadlines","\u002Fagents\u002Fapprovals\u002Fconfigure","03.agents\u002F08.approvals\u002F02.configure",{"title":280,"path":281,"stem":282},"How approval decisions bind a call","\u002Fagents\u002Fapprovals\u002Fsecurity","03.agents\u002F08.approvals\u002F03.security",{"title":284,"path":285,"stem":286},"Edit an approval or allow repeated calls","\u002Fagents\u002Fapprovals\u002Fedits-and-repeat-calls","03.agents\u002F08.approvals\u002F04.edits-and-repeat-calls",{"title":288,"path":289,"stem":290},"Resolve loop, budget and recovery waits","\u002Fagents\u002Fapprovals\u002Frecovery","03.agents\u002F08.approvals\u002F05.recovery",{"title":292,"path":293,"stem":294},"Review approval statistics and test cards","\u002Fagents\u002Fapprovals\u002Fstatistics","03.agents\u002F08.approvals\u002F06.statistics",{"title":296,"path":297,"stem":298},"Decide approvals from an app","\u002Fagents\u002Fapprovals\u002Fapps","03.agents\u002F08.approvals\u002F07.apps",{"title":300,"path":301,"stem":302,"icon":303},"Asking people","\u002Fagents\u002Fasking-people","03.agents\u002F09.asking-people","i-ph-chat-circle-dots",{"title":305,"path":306,"stem":307,"children":308,"icon":71},"Build","\u002Fbuild","04.build\u002F00.index",[309,310,655,844],{"title":305,"path":306,"stem":307},{"title":311,"path":312,"stem":313,"children":314,"icon":71},"Plugins","\u002Fbuild\u002Fplugins","04.build\u002F01.plugins\u002F00.index",[315,316,321,352,357,362,367,378,397,412,417,422,427,442,447,452,457,472,476,481,492,497,502,640],{"title":311,"path":312,"stem":313},{"title":317,"path":318,"stem":319,"icon":320},"What a plugin is","\u002Fbuild\u002Fplugins\u002Foverview","04.build\u002F01.plugins\u002F01.overview","i-ph-puzzle-piece",{"title":322,"path":323,"stem":324,"children":325,"icon":327},"Install a plugin","\u002Fbuild\u002Fplugins\u002Finstall","04.build\u002F01.plugins\u002F02.install\u002F00.index",[326,328,332,336,340,344,348],{"title":322,"path":323,"stem":324,"icon":327},"i-ph-package",{"title":329,"path":330,"stem":331,"icon":327},"Review an install","\u002Fbuild\u002Fplugins\u002Finstall\u002Freview","04.build\u002F01.plugins\u002F02.install\u002F01.review",{"title":333,"path":334,"stem":335,"icon":327},"Install from a source","\u002Fbuild\u002Fplugins\u002Finstall\u002Fsources","04.build\u002F01.plugins\u002F02.install\u002F02.sources",{"title":337,"path":338,"stem":339,"icon":327},"Update a plugin","\u002Fbuild\u002Fplugins\u002Finstall\u002Fupdate","04.build\u002F01.plugins\u002F02.install\u002F03.update",{"title":341,"path":342,"stem":343,"icon":327},"Roll out a plugin","\u002Fbuild\u002Fplugins\u002Finstall\u002Frollouts","04.build\u002F01.plugins\u002F02.install\u002F04.rollouts",{"title":345,"path":346,"stem":347,"icon":327},"Grant access between plugins","\u002Fbuild\u002Fplugins\u002Finstall\u002Fgrants","04.build\u002F01.plugins\u002F02.install\u002F05.grants",{"title":349,"path":350,"stem":351,"icon":327},"Retire or remove a plugin","\u002Fbuild\u002Fplugins\u002Finstall\u002Fretire-and-remove","04.build\u002F01.plugins\u002F02.install\u002F06.retire-and-remove",{"title":353,"path":354,"stem":355,"icon":356},"Configure an installed plugin","\u002Fbuild\u002Fplugins\u002Fconfigure","04.build\u002F01.plugins\u002F03.configure","i-ph-sliders-horizontal",{"title":358,"path":359,"stem":360,"icon":361},"Sets","\u002Fbuild\u002Fplugins\u002Fsets","04.build\u002F01.plugins\u002F04.sets","i-ph-stack",{"title":363,"path":364,"stem":365,"icon":366},"Your first plugin","\u002Fbuild\u002Fplugins\u002Ffirst-plugin","04.build\u002F01.plugins\u002F05.first-plugin","i-ph-hammer",{"title":368,"path":369,"stem":370,"children":371,"icon":373},"Structure a plugin","\u002Fbuild\u002Fplugins\u002Fstructure","04.build\u002F01.plugins\u002F06.structure\u002F00.index",[372,374],{"title":368,"path":369,"stem":370,"icon":373},"i-ph-tree-structure",{"title":375,"path":376,"stem":377,"icon":373},"Plugin structure rules","\u002Fbuild\u002Fplugins\u002Fstructure\u002Flint-rules","04.build\u002F01.plugins\u002F06.structure\u002F01.lint-rules",{"title":379,"path":380,"stem":381,"children":382,"icon":384},"Develop a plugin","\u002Fbuild\u002Fplugins\u002Fdevelop-and-test","04.build\u002F01.plugins\u002F07.develop-and-test\u002F00.index",[383,385,389,393],{"title":379,"path":380,"stem":381,"icon":384},"i-ph-flask",{"title":386,"path":387,"stem":388,"icon":384},"Check a plugin candidate","\u002Fbuild\u002Fplugins\u002Fdevelop-and-test\u002Fcandidate-checks","04.build\u002F01.plugins\u002F07.develop-and-test\u002F01.candidate-checks",{"title":390,"path":391,"stem":392,"icon":384},"Lint and test a plugin","\u002Fbuild\u002Fplugins\u002Fdevelop-and-test\u002Flint-and-tests","04.build\u002F01.plugins\u002F07.develop-and-test\u002F02.lint-and-tests",{"title":394,"path":395,"stem":396,"icon":384},"Run failure drills","\u002Fbuild\u002Fplugins\u002Fdevelop-and-test\u002Ftests-and-drills","04.build\u002F01.plugins\u002F07.develop-and-test\u002F03.tests-and-drills",{"title":398,"path":399,"stem":400,"children":401,"icon":403},"Build in Studio","\u002Fbuild\u002Fplugins\u002Fstudio","04.build\u002F01.plugins\u002F08.studio\u002F00.index",[402,404,408],{"title":398,"path":399,"stem":400,"icon":403},"i-ph-code",{"title":405,"path":406,"stem":407,"icon":403},"Test and explain a draft","\u002Fbuild\u002Fplugins\u002Fstudio\u002Ftest-and-explain","04.build\u002F01.plugins\u002F08.studio\u002F01.test-and-explain",{"title":409,"path":410,"stem":411,"icon":403},"Release a workspace plugin","\u002Fbuild\u002Fplugins\u002Fstudio\u002Frelease","04.build\u002F01.plugins\u002F08.studio\u002F02.release",{"title":413,"path":414,"stem":415,"icon":416},"The build kit","\u002Fbuild\u002Fplugins\u002Fclaude-code","04.build\u002F01.plugins\u002F09.claude-code","i-ph-sparkle",{"title":418,"path":419,"stem":420,"icon":421},"Example: support triage","\u002Fbuild\u002Fplugins\u002Fexample-support-triage","04.build\u002F01.plugins\u002F10.example-support-triage","i-ph-lifebuoy",{"title":423,"path":424,"stem":425,"icon":426},"Publish and version","\u002Fbuild\u002Fplugins\u002Fpublish","04.build\u002F01.plugins\u002F11.publish","i-ph-tag",{"title":428,"path":429,"stem":430,"children":431,"icon":433},"List a plugin","\u002Fbuild\u002Fplugins\u002Flist-a-plugin","04.build\u002F01.plugins\u002F12.list-a-plugin\u002F00.index",[432,434,438],{"title":428,"path":429,"stem":430,"icon":433},"i-ph-storefront",{"title":435,"path":436,"stem":437,"icon":433},"Hub review checks","\u002Fbuild\u002Fplugins\u002Flist-a-plugin\u002Freview","04.build\u002F01.plugins\u002F12.list-a-plugin\u002F01.review",{"title":439,"path":440,"stem":441,"icon":433},"Maintain a listing","\u002Fbuild\u002Fplugins\u002Flist-a-plugin\u002Fmaintain","04.build\u002F01.plugins\u002F12.list-a-plugin\u002F02.maintain",{"title":443,"path":444,"stem":445,"icon":446},"The catalog","\u002Fbuild\u002Fplugins\u002Fcatalog","04.build\u002F01.plugins\u002F13.catalog","i-ph-books",{"title":448,"path":449,"stem":450,"icon":451},"Folders, bundles and OCI","\u002Fbuild\u002Fplugins\u002Fsources","04.build\u002F01.plugins\u002F14.sources","i-ph-archive",{"title":453,"path":454,"stem":455,"icon":456},"The workspace","\u002Fbuild\u002Fplugins\u002Fworkspace","04.build\u002F01.plugins\u002F15.workspace","i-ph-folder-notch-open",{"title":458,"path":459,"stem":460,"children":461,"icon":463},"Use a plugin index","\u002Fbuild\u002Fplugins\u002Findexes","04.build\u002F01.plugins\u002F16.indexes\u002F00.index",[462,464,468],{"title":458,"path":459,"stem":460,"icon":463},"i-ph-seal-check",{"title":465,"path":466,"stem":467,"icon":463},"Read index version records","\u002Fbuild\u002Fplugins\u002Findexes\u002Fversion-records","04.build\u002F01.plugins\u002F16.indexes\u002F01.version-records",{"title":469,"path":470,"stem":471,"icon":463},"Manage plugin indexes","\u002Fbuild\u002Fplugins\u002Findexes\u002Fmanage","04.build\u002F01.plugins\u002F16.indexes\u002F02.manage",{"title":473,"path":474,"stem":475,"icon":327},"Existing MCP packages","\u002Fbuild\u002Fplugins\u002Fpackages","04.build\u002F01.plugins\u002F17.packages",{"title":477,"path":478,"stem":479,"icon":480},"MCP servers from container images","\u002Fbuild\u002Fplugins\u002Fcontainer-images","04.build\u002F01.plugins\u002F18.container-images","i-ph-cube",{"title":482,"path":483,"stem":484,"children":485,"icon":487},"Import agent plugins","\u002Fbuild\u002Fplugins\u002Fclaude-code-and-agent-plugins","04.build\u002F01.plugins\u002F19.claude-code-and-agent-plugins\u002F00.index",[486,488],{"title":482,"path":483,"stem":484,"icon":487},"i-ph-arrow-square-in",{"title":489,"path":490,"stem":491,"icon":487},"Import from registries","\u002Fbuild\u002Fplugins\u002Fclaude-code-and-agent-plugins\u002Fmarketplaces","04.build\u002F01.plugins\u002F19.claude-code-and-agent-plugins\u002F01.marketplaces",{"title":493,"path":494,"stem":495,"icon":496},"GitHub","\u002Fbuild\u002Fplugins\u002Fgithub","04.build\u002F01.plugins\u002F20.github","i-ph-github-logo",{"title":498,"path":499,"stem":500,"icon":501},"Known vulnerabilities","\u002Fbuild\u002Fplugins\u002Fvulnerabilities","04.build\u002F01.plugins\u002F21.vulnerabilities","i-ph-shield-warning",{"title":503,"path":504,"stem":505,"children":506,"icon":71},"Verified plugins","\u002Fbuild\u002Fplugins\u002Fverified","04.build\u002F01.plugins\u002F22.verified\u002F01.index",[507,508,513,518,523,528,533,538,543,548,553,558,580,585,589,594,599,604,608,612,617,622,626],{"title":503,"path":504,"stem":505,"icon":463},{"title":509,"path":510,"stem":511,"icon":512},"ai.oz0\u002Fweb","\u002Fbuild\u002Fplugins\u002Fverified\u002Fweb","04.build\u002F01.plugins\u002F22.verified\u002F02.web","i-ph-globe",{"title":514,"path":515,"stem":516,"icon":517},"ai.oz0\u002Fnet-diag","\u002Fbuild\u002Fplugins\u002Fverified\u002Fnet-diag","04.build\u002F01.plugins\u002F22.verified\u002F03.net-diag","i-ph-network",{"title":519,"path":520,"stem":521,"icon":522},"ai.oz0\u002Fcve-triage","\u002Fbuild\u002Fplugins\u002Fverified\u002Fcve-triage","04.build\u002F01.plugins\u002F22.verified\u002F04.cve-triage","i-ph-bug",{"title":524,"path":525,"stem":526,"icon":527},"ai.oz0\u002Fhost-health","\u002Fbuild\u002Fplugins\u002Fverified\u002Fhost-health","04.build\u002F01.plugins\u002F22.verified\u002F05.host-health","i-ph-heartbeat",{"title":529,"path":530,"stem":531,"icon":532},"ai.oz0\u002Fpr-reviewer","\u002Fbuild\u002Fplugins\u002Fverified\u002Fpr-reviewer","04.build\u002F01.plugins\u002F22.verified\u002F06.pr-reviewer","i-ph-git-pull-request",{"title":534,"path":535,"stem":536,"icon":537},"Slack","\u002Fbuild\u002Fplugins\u002Fverified\u002Fslack","04.build\u002F01.plugins\u002F22.verified\u002F07.slack","i-ph-slack-logo",{"title":539,"path":540,"stem":541,"icon":542},"Discord","\u002Fbuild\u002Fplugins\u002Fverified\u002Fdiscord","04.build\u002F01.plugins\u002F22.verified\u002F08.discord","i-ph-discord-logo",{"title":544,"path":545,"stem":546,"icon":547},"Microsoft Teams","\u002Fbuild\u002Fplugins\u002Fverified\u002Fteams","04.build\u002F01.plugins\u002F22.verified\u002F09.teams","i-ph-microsoft-teams-logo",{"title":549,"path":550,"stem":551,"icon":552},"ai.oz0\u002Fai-spend","\u002Fbuild\u002Fplugins\u002Fverified\u002Fai-spend","04.build\u002F01.plugins\u002F22.verified\u002F10.ai-spend","i-ph-coins",{"title":554,"path":555,"stem":556,"icon":557},"ai.oz0\u002Fa2a-remote","\u002Fbuild\u002Fplugins\u002Fverified\u002Fa2a-remote","04.build\u002F01.plugins\u002F22.verified\u002F11.a2a-remote","i-ph-arrows-left-right",{"title":559,"path":560,"stem":561,"children":562,"icon":98},"Guardrails","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F00.index",[563,564,568,572,576],{"title":559,"path":560,"stem":561,"icon":98},{"title":565,"path":566,"stem":567,"icon":98},"Configure guardrails","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails\u002Fsettings","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F01.settings",{"title":569,"path":570,"stem":571,"icon":98},"Check classified text","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails\u002Fclassified-text","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F02.classified-text",{"title":573,"path":574,"stem":575,"icon":98},"Check shell commands","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails\u002Fcommands","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F03.commands",{"title":577,"path":578,"stem":579,"icon":98},"Guardrail coverage and limits","\u002Fbuild\u002Fplugins\u002Fverified\u002Fguardrails\u002Fintent-and-limits","04.build\u002F01.plugins\u002F22.verified\u002F12.guardrails\u002F04.intent-and-limits",{"title":581,"path":582,"stem":583,"icon":584},"ai.oz0\u002Fmemory","\u002Fbuild\u002Fplugins\u002Fverified\u002Fmemory","04.build\u002F01.plugins\u002F22.verified\u002F13.memory","i-ph-brain",{"title":586,"path":587,"stem":588,"icon":416},"ai.oz0\u002Fsetup-assistant","\u002Fbuild\u002Fplugins\u002Fverified\u002Fsetup-assistant","04.build\u002F01.plugins\u002F22.verified\u002F14.setup-assistant",{"title":590,"path":591,"stem":592,"icon":593},"ai.oz0\u002Fpublic-access","\u002Fbuild\u002Fplugins\u002Fverified\u002Fpublic-access","04.build\u002F01.plugins\u002F22.verified\u002F15.public-access","i-ph-files",{"title":595,"path":596,"stem":597,"icon":598},"ai.oz0\u002Femail","\u002Fbuild\u002Fplugins\u002Fverified\u002Femail","04.build\u002F01.plugins\u002F22.verified\u002F16.email","i-ph-envelope-simple",{"title":600,"path":601,"stem":602,"icon":603},"Atlassian Cloud","\u002Fbuild\u002Fplugins\u002Fverified\u002Fatlassian","04.build\u002F01.plugins\u002F22.verified\u002F17.atlassian","i-ph-kanban",{"title":605,"path":606,"stem":607,"icon":603},"Atlassian Data Center","\u002Fbuild\u002Fplugins\u002Fverified\u002Fatlassian-dc","04.build\u002F01.plugins\u002F22.verified\u002F18.atlassian-dc",{"title":609,"path":610,"stem":611,"icon":421},"ServiceNow","\u002Fbuild\u002Fplugins\u002Fverified\u002Fservicenow","04.build\u002F01.plugins\u002F22.verified\u002F19.servicenow",{"title":613,"path":614,"stem":615,"icon":616},"GitLab","\u002Fbuild\u002Fplugins\u002Fverified\u002Fgitlab","04.build\u002F01.plugins\u002F22.verified\u002F20.gitlab","i-ph-git-merge",{"title":618,"path":619,"stem":620,"icon":621},"Support triage","\u002Fbuild\u002Fplugins\u002Fverified\u002Fsupport-triage","04.build\u002F01.plugins\u002F22.verified\u002F21.support-triage","i-ph-ticket",{"title":623,"path":624,"stem":625,"icon":361},"Essentials","\u002Fbuild\u002Fplugins\u002Fverified\u002Fessentials","04.build\u002F01.plugins\u002F22.verified\u002F22.essentials",{"title":627,"path":628,"stem":629,"children":630,"icon":532},"Plugin improver","\u002Fbuild\u002Fplugins\u002Fverified\u002Fplugin-improver","04.build\u002F01.plugins\u002F22.verified\u002F23.plugin-improver\u002F00.index",[631,632,636],{"title":627,"path":628,"stem":629,"icon":532},{"title":633,"path":634,"stem":635,"icon":532},"How an improvement runs","\u002Fbuild\u002Fplugins\u002Fverified\u002Fplugin-improver\u002Fjob-lifecycle","04.build\u002F01.plugins\u002F22.verified\u002F23.plugin-improver\u002F01.job-lifecycle",{"title":637,"path":638,"stem":639,"icon":532},"Improver limits and records","\u002Fbuild\u002Fplugins\u002Fverified\u002Fplugin-improver\u002Flimits-and-records","04.build\u002F01.plugins\u002F22.verified\u002F23.plugin-improver\u002F02.limits-and-records",{"title":641,"path":642,"stem":643,"children":644,"icon":646},"Plugin size limits","\u002Fbuild\u002Fplugins\u002Flimits","04.build\u002F01.plugins\u002F23.limits\u002F00.index",[645,647,651],{"title":641,"path":642,"stem":643,"icon":646},"i-ph-ruler",{"title":648,"path":649,"stem":650,"icon":646},"Documentation limits","\u002Fbuild\u002Fplugins\u002Flimits\u002Fdocumentation","04.build\u002F01.plugins\u002F23.limits\u002F01.documentation",{"title":652,"path":653,"stem":654,"icon":646},"Artifact and index limits","\u002Fbuild\u002Fplugins\u002Flimits\u002Fartifacts","04.build\u002F01.plugins\u002F23.limits\u002F02.artifacts",{"title":656,"path":657,"stem":658,"children":659,"icon":71},"Parts","\u002Fbuild\u002Fparts","04.build\u002F02.parts\u002F00.index",[660,662,667,672,690,721,726,730,741,756,761,776,791,814,818,823,828,839],{"title":661,"path":657,"stem":658},"Plugin parts",{"title":663,"path":664,"stem":665,"icon":666},"Agents","\u002Fbuild\u002Fparts\u002Fagents","04.build\u002F02.parts\u002F01.agents","i-ph-robot",{"title":668,"path":669,"stem":670,"icon":671},"What an agent combines","\u002Fbuild\u002Fparts\u002Fwhat-an-agent-combines","04.build\u002F02.parts\u002F02.what-an-agent-combines","i-ph-intersect-three",{"title":673,"path":674,"stem":675,"children":676,"icon":646},"Agent contracts","\u002Fbuild\u002Fparts\u002Fcontracts-and-limits","04.build\u002F02.parts\u002F03.contracts-and-limits\u002F00.index",[677,678,682,686],{"title":673,"path":674,"stem":675,"icon":646},{"title":679,"path":680,"stem":681,"icon":646},"Agent failure kinds","\u002Fbuild\u002Fparts\u002Fcontracts-and-limits\u002Ffailures","04.build\u002F02.parts\u002F03.contracts-and-limits\u002F01.failures",{"title":683,"path":684,"stem":685,"icon":646},"Agent limits","\u002Fbuild\u002Fparts\u002Fcontracts-and-limits\u002Flimits","04.build\u002F02.parts\u002F03.contracts-and-limits\u002F02.limits",{"title":687,"path":688,"stem":689,"icon":646},"Agent budgets","\u002Fbuild\u002Fparts\u002Fcontracts-and-limits\u002Fbudgets","04.build\u002F02.parts\u002F03.contracts-and-limits\u002F03.budgets",{"title":691,"path":692,"stem":693,"children":694,"icon":696},"Write a tool","\u002Fbuild\u002Fparts\u002Ftools","04.build\u002F02.parts\u002F04.tools\u002F00.index",[695,697,701,705,709,713,717],{"title":691,"path":692,"stem":693,"icon":696},"i-ph-wrench",{"title":698,"path":699,"stem":700,"icon":696},"Describe tool functions","\u002Fbuild\u002Fparts\u002Ftools\u002Fdefinitions","04.build\u002F02.parts\u002F04.tools\u002F01.definitions",{"title":702,"path":703,"stem":704,"icon":696},"Return results and files","\u002Fbuild\u002Fparts\u002Ftools\u002Fresults-and-files","04.build\u002F02.parts\u002F04.tools\u002F02.results-and-files",{"title":706,"path":707,"stem":708,"icon":696},"Handle tool call lifecycle","\u002Fbuild\u002Fparts\u002Ftools\u002Fcall-lifecycle","04.build\u002F02.parts\u002F04.tools\u002F03.call-lifecycle",{"title":710,"path":711,"stem":712,"icon":696},"Pin tool definitions","\u002Fbuild\u002Fparts\u002Ftools\u002Fsnapshots","04.build\u002F02.parts\u002F04.tools\u002F04.snapshots",{"title":714,"path":715,"stem":716,"icon":696},"Call a model from a tool","\u002Fbuild\u002Fparts\u002Ftools\u002Fmodel-calls","04.build\u002F02.parts\u002F04.tools\u002F05.model-calls",{"title":718,"path":719,"stem":720,"icon":696},"Tool labels and approvals","\u002Fbuild\u002Fparts\u002Ftools\u002Fpolicy","04.build\u002F02.parts\u002F04.tools\u002F06.policy",{"title":722,"path":723,"stem":724,"icon":725},"TypeScript tools","\u002Fbuild\u002Fparts\u002Ftypescript-tools","04.build\u002F02.parts\u002F05.typescript-tools","i-ph-file-code",{"title":727,"path":728,"stem":729,"icon":725},"Import an OpenAPI document","\u002Fbuild\u002Fparts\u002Fopenapi-import","04.build\u002F02.parts\u002F06.openapi-import",{"title":731,"path":732,"stem":733,"children":734,"icon":736},"Write and load skills","\u002Fbuild\u002Fparts\u002Fskills","04.build\u002F02.parts\u002F07.skills\u002F00.index",[735,737],{"title":731,"path":732,"stem":733,"icon":736},"i-ph-graduation-cap",{"title":738,"path":739,"stem":740,"icon":736},"Review skill use and proposals","\u002Fbuild\u002Fparts\u002Fskills\u002Fusage-and-proposals","04.build\u002F02.parts\u002F07.skills\u002F01.usage-and-proposals",{"title":742,"path":743,"stem":744,"children":745,"icon":747},"Write a flow","\u002Fbuild\u002Fparts\u002Fflows","04.build\u002F02.parts\u002F08.flows\u002F00.index",[746,748,752],{"title":742,"path":743,"stem":744,"icon":747},"i-ph-flow-arrow",{"title":749,"path":750,"stem":751,"icon":747},"Flow steps and expressions","\u002Fbuild\u002Fparts\u002Fflows\u002Fsteps-and-expressions","04.build\u002F02.parts\u002F08.flows\u002F01.steps-and-expressions",{"title":753,"path":754,"stem":755,"icon":747},"Expose and explain flows","\u002Fbuild\u002Fparts\u002Fflows\u002Fflow-tools","04.build\u002F02.parts\u002F08.flows\u002F02.flow-tools",{"title":757,"path":758,"stem":759,"icon":760},"Hooks","\u002Fbuild\u002Fparts\u002Fhooks","04.build\u002F02.parts\u002F09.hooks","i-ph-anchor",{"title":762,"path":763,"stem":764,"children":765,"icon":767},"Declare an event source","\u002Fbuild\u002Fparts\u002Fevent-sources","04.build\u002F02.parts\u002F10.event-sources\u002F00.index",[766,768,772],{"title":762,"path":763,"stem":764,"icon":767},"i-ph-broadcast",{"title":769,"path":770,"stem":771,"icon":767},"Bind and answer deliveries","\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fdelivery-binding","04.build\u002F02.parts\u002F10.event-sources\u002F01.delivery-binding",{"title":773,"path":774,"stem":775,"icon":767},"Use platform events","\u002Fbuild\u002Fparts\u002Fevent-sources\u002Fplatform-events","04.build\u002F02.parts\u002F10.event-sources\u002F02.platform-events",{"title":777,"path":778,"stem":779,"children":780,"icon":782},"Declare a connection","\u002Fbuild\u002Fparts\u002Fconnections","04.build\u002F02.parts\u002F11.connections\u002F00.index",[781,783,787],{"title":777,"path":778,"stem":779,"icon":782},"i-ph-plugs-connected",{"title":784,"path":785,"stem":786,"icon":782},"Connection token lifecycle","\u002Fbuild\u002Fparts\u002Fconnections\u002Ftoken-lifecycle","04.build\u002F02.parts\u002F11.connections\u002F01.token-lifecycle",{"title":788,"path":789,"stem":790,"icon":782},"Connection setup and security","\u002Fbuild\u002Fparts\u002Fconnections\u002Fsetup-and-security","04.build\u002F02.parts\u002F11.connections\u002F02.setup-and-security",{"title":792,"path":793,"stem":794,"children":795,"icon":797},"Choose a harness","\u002Fbuild\u002Fparts\u002Fharnesses","04.build\u002F02.parts\u002F12.harnesses\u002F00.index",[796,798,802,806,810],{"title":792,"path":793,"stem":794,"icon":797},"i-ph-cpu",{"title":799,"path":800,"stem":801,"icon":797},"Harness tool controls","\u002Fbuild\u002Fparts\u002Fharnesses\u002Ftool-controls","04.build\u002F02.parts\u002F12.harnesses\u002F01.tool-controls",{"title":803,"path":804,"stem":805,"icon":797},"Recover a harness session","\u002Fbuild\u002Fparts\u002Fharnesses\u002Frecovery","04.build\u002F02.parts\u002F12.harnesses\u002F02.recovery",{"title":807,"path":808,"stem":809,"icon":797},"Write a harness","\u002Fbuild\u002Fparts\u002Fharnesses\u002Fcustom-harnesses","04.build\u002F02.parts\u002F12.harnesses\u002F03.custom-harnesses",{"title":811,"path":812,"stem":813,"icon":797},"Use an ACP agent","\u002Fbuild\u002Fparts\u002Fharnesses\u002Facp","04.build\u002F02.parts\u002F12.harnesses\u002F04.acp",{"title":815,"path":816,"stem":817,"icon":782},"Bring your own agent","\u002Fbuild\u002Fparts\u002Fbring-your-own-agent","04.build\u002F02.parts\u002F13.bring-your-own-agent",{"title":819,"path":820,"stem":821,"icon":822},"Records and start-up text","\u002Fbuild\u002Fparts\u002Frecords-and-startup","04.build\u002F02.parts\u002F14.records-and-startup","i-ph-database",{"title":824,"path":825,"stem":826,"icon":827},"Addresses","\u002Fbuild\u002Fparts\u002Faddresses","04.build\u002F02.parts\u002F15.addresses","i-ph-signpost",{"title":829,"path":830,"stem":831,"children":832,"icon":834},"Define a routine","\u002Fbuild\u002Fparts\u002Froutines","04.build\u002F02.parts\u002F16.routines\u002F00.index",[833,835],{"title":829,"path":830,"stem":831,"icon":834},"i-ph-clock-clockwise",{"title":836,"path":837,"stem":838,"icon":834},"Routine permissions and outputs","\u002Fbuild\u002Fparts\u002Froutines\u002Foutputs-and-permissions","04.build\u002F02.parts\u002F16.routines\u002F01.outputs-and-permissions",{"title":840,"path":841,"stem":842,"icon":843},"When to split an agent","\u002Fbuild\u002Fparts\u002Fwhen-to-split-an-agent","04.build\u002F02.parts\u002F17.when-to-split-an-agent","i-ph-arrows-split",{"title":845,"path":846,"stem":847,"children":848,"icon":71},"Apps on OZ","\u002Fbuild\u002Fapps","04.build\u002F03.apps\u002F00.index",[849,851,862,867,872,876,880,884,894,908,913,928,942],{"title":850,"path":846,"stem":847},"Applications and clients",{"title":852,"path":853,"stem":854,"children":855,"icon":857},"Use the runtime API","\u002Fbuild\u002Fapps\u002Fruntime-api","04.build\u002F03.apps\u002F01.runtime-api\u002F00.index",[856,858],{"title":852,"path":853,"stem":854,"icon":857},"i-ph-plug",{"title":859,"path":860,"stem":861,"icon":857},"Runtime API authentication","\u002Fbuild\u002Fapps\u002Fruntime-api\u002Fauthentication","04.build\u002F03.apps\u002F01.runtime-api\u002F01.authentication",{"title":863,"path":864,"stem":865,"icon":866},"Python SDK","\u002Fbuild\u002Fapps\u002Fsdk-python","04.build\u002F03.apps\u002F02.sdk-python","i-ph-file-py",{"title":868,"path":869,"stem":870,"icon":871},"TypeScript SDK","\u002Fbuild\u002Fapps\u002Fsdk-typescript","04.build\u002F03.apps\u002F03.sdk-typescript","i-ph-file-ts",{"title":873,"path":874,"stem":875,"icon":725},"Go SDK","\u002Fbuild\u002Fapps\u002Fsdk-go","04.build\u002F03.apps\u002F04.sdk-go",{"title":877,"path":878,"stem":879,"icon":782},"AG-UI for your apps","\u002Fbuild\u002Fapps\u002Fag-ui","04.build\u002F03.apps\u002F05.ag-ui",{"title":881,"path":882,"stem":883,"icon":249},"A chat in your own app","\u002Fbuild\u002Fapps\u002Fchat-app","04.build\u002F03.apps\u002F06.chat-app",{"title":885,"path":886,"stem":887,"children":888,"icon":767},"Follow live jobs","\u002Fbuild\u002Fapps\u002Flive-feeds","04.build\u002F03.apps\u002F07.live-feeds\u002F00.index",[889,890],{"title":885,"path":886,"stem":887,"icon":767},{"title":891,"path":892,"stem":893,"icon":767},"Feed access and browser streams","\u002Fbuild\u002Fapps\u002Flive-feeds\u002Fbrowser-and-access","04.build\u002F03.apps\u002F07.live-feeds\u002F01.browser-and-access",{"title":895,"path":896,"stem":897,"children":898,"icon":782},"Call agents over MCP","\u002Fbuild\u002Fapps\u002Fmcp-server","04.build\u002F03.apps\u002F08.mcp-server\u002F00.index",[899,900,904],{"title":895,"path":896,"stem":897,"icon":782},{"title":901,"path":902,"stem":903,"icon":782},"MCP client OAuth","\u002Fbuild\u002Fapps\u002Fmcp-server\u002Foauth","04.build\u002F03.apps\u002F08.mcp-server\u002F01.oauth",{"title":905,"path":906,"stem":907,"icon":782},"MCP security and limits","\u002Fbuild\u002Fapps\u002Fmcp-server\u002Fsecurity-and-limits","04.build\u002F03.apps\u002F08.mcp-server\u002F02.security-and-limits",{"title":909,"path":910,"stem":911,"icon":912},"A2A agents","\u002Fbuild\u002Fapps\u002Fa2a","04.build\u002F03.apps\u002F09.a2a","i-ph-share-network",{"title":914,"path":915,"stem":916,"children":917,"icon":919},"Run a remote agent","\u002Fbuild\u002Fapps\u002Fremote-agents","04.build\u002F03.apps\u002F10.remote-agents\u002F00.index",[918,920,924],{"title":914,"path":915,"stem":916,"icon":919},"i-ph-cloud-arrow-down",{"title":921,"path":922,"stem":923,"icon":919},"Remote sessions and limits","\u002Fbuild\u002Fapps\u002Fremote-agents\u002Fsessions-and-limits","04.build\u002F03.apps\u002F10.remote-agents\u002F01.sessions-and-limits",{"title":925,"path":926,"stem":927,"icon":919},"Connect an outside A2A agent","\u002Fbuild\u002Fapps\u002Fremote-agents\u002Fa2a","04.build\u002F03.apps\u002F10.remote-agents\u002F02.a2a",{"title":929,"path":930,"stem":931,"children":932,"icon":249},"Connect a chat channel","\u002Fbuild\u002Fapps\u002Fchat-channels","04.build\u002F03.apps\u002F11.chat-channels\u002F00.index",[933,934,938],{"title":929,"path":930,"stem":931,"icon":249},{"title":935,"path":936,"stem":937,"icon":249},"Chat channel conversations","\u002Fbuild\u002Fapps\u002Fchat-channels\u002Fconversations","04.build\u002F03.apps\u002F11.chat-channels\u002F01.conversations",{"title":939,"path":940,"stem":941,"icon":249},"Build a chat channel","\u002Fbuild\u002Fapps\u002Fchat-channels\u002Fbuild","04.build\u002F03.apps\u002F11.chat-channels\u002F02.build",{"title":943,"path":944,"stem":945,"icon":946},"Interop matrix","\u002Fbuild\u002Fapps\u002Finterop","04.build\u002F03.apps\u002F12.interop","i-ph-check-square-offset",{"title":948,"path":949,"stem":950,"children":951,"icon":71},"Improve","\u002Fimprove","05.improve\u002F00.index",[952,953,958,963,968,994,1021,1026,1031,1036],{"title":948,"path":949,"stem":950},{"title":954,"path":955,"stem":956,"icon":957},"Search, compare and fix","\u002Fimprove\u002Fsearch-and-compare","05.improve\u002F01.search-and-compare","i-ph-magnifying-glass",{"title":959,"path":960,"stem":961,"icon":962},"Errors and insights","\u002Fimprove\u002Ferrors-and-insights","05.improve\u002F02.errors-and-insights","i-ph-chart-line",{"title":964,"path":965,"stem":966,"icon":967},"Measured savings","\u002Fimprove\u002Fmeasured-savings","05.improve\u002F03.measured-savings","i-ph-scales",{"title":969,"path":970,"stem":971,"children":972,"icon":463},"Evals and quality gates","\u002Fimprove\u002Fevals","05.improve\u002F04.evals\u002F00.index",[973,974,978,982,986,990],{"title":969,"path":970,"stem":971,"icon":463},{"title":975,"path":976,"stem":977},"Case expectations","\u002Fimprove\u002Fevals\u002Fcases","05.improve\u002F04.evals\u002F01.cases",{"title":979,"path":980,"stem":981},"Record and replay answers","\u002Fimprove\u002Fevals\u002Frecordings","05.improve\u002F04.evals\u002F02.recordings",{"title":983,"path":984,"stem":985},"Check policy paths","\u002Fimprove\u002Fevals\u002Fcoverage","05.improve\u002F04.evals\u002F03.coverage",{"title":987,"path":988,"stem":989},"Gate a plugin update","\u002Fimprove\u002Fevals\u002Fquality-gates","05.improve\u002F04.evals\u002F04.quality-gates",{"title":991,"path":992,"stem":993},"Track quality and regressions","\u002Fimprove\u002Fevals\u002Fregressions","05.improve\u002F04.evals\u002F05.regressions",{"title":995,"path":996,"stem":997,"children":998,"icon":1000},"Outcome checks and patterns","\u002Fimprove\u002Foutcome-checks","05.improve\u002F05.outcome-checks\u002F00.index",[999,1001,1005,1009,1013,1017],{"title":995,"path":996,"stem":997,"icon":1000},"i-ph-gavel",{"title":1002,"path":1003,"stem":1004},"Choose a judge and rubric","\u002Fimprove\u002Foutcome-checks\u002Fjudges","05.improve\u002F05.outcome-checks\u002F01.judges",{"title":1006,"path":1007,"stem":1008},"Measure a judge over time","\u002Fimprove\u002Foutcome-checks\u002Fsampling","05.improve\u002F05.outcome-checks\u002F02.sampling",{"title":1010,"path":1011,"stem":1012},"Use a reviewer agent","\u002Fimprove\u002Foutcome-checks\u002Freviewer","05.improve\u002F05.outcome-checks\u002F03.reviewer",{"title":1014,"path":1015,"stem":1016},"Choose among candidate answers","\u002Fimprove\u002Foutcome-checks\u002Fselection","05.improve\u002F05.outcome-checks\u002F04.selection",{"title":1018,"path":1019,"stem":1020},"Test and roll out judged agents","\u002Fimprove\u002Foutcome-checks\u002Frollouts","05.improve\u002F05.outcome-checks\u002F05.rollouts",{"title":1022,"path":1023,"stem":1024,"icon":1025},"Measured results","\u002Fimprove\u002Fmeasured-results","05.improve\u002F06.measured-results","i-ph-chart-bar",{"title":1027,"path":1028,"stem":1029,"icon":1030},"Comparisons of a changed agent","\u002Fimprove\u002Fcomparisons-of-a-changed-agent","05.improve\u002F07.comparisons-of-a-changed-agent","i-ph-git-diff",{"title":1032,"path":1033,"stem":1034,"icon":1035},"Where a fix belongs","\u002Fimprove\u002Fwhere-a-fix-belongs","05.improve\u002F08.where-a-fix-belongs","i-ph-ladder",{"title":1037,"path":1038,"stem":1039,"icon":957},"Evidence for agents","\u002Fimprove\u002Fevidence-for-agents","05.improve\u002F09.evidence-for-agents",{"title":1041,"path":1042,"stem":1043,"children":1044,"icon":71},"Govern","\u002Fgovern","06.govern\u002F00.index",[1045,1047,1085,1089,1111,1115,1120,1151,1170,1175,1180,1184,1207],{"title":1046,"path":1042,"stem":1043},"Govern agents",{"title":1048,"path":1049,"stem":1050,"children":1051,"icon":98},"Tool policy","\u002Fgovern\u002Ftool-policy","06.govern\u002F01.tool-policy\u002F00.index",[1052,1053,1057,1061,1065,1069,1073,1077,1081],{"title":1048,"path":1049,"stem":1050,"icon":98},{"title":1054,"path":1055,"stem":1056},"Export and apply a tool policy","\u002Fgovern\u002Ftool-policy\u002Ffiles","06.govern\u002F01.tool-policy\u002F02.files",{"title":1058,"path":1059,"stem":1060},"Rules for plugin and remote functions","\u002Fgovern\u002Ftool-policy\u002Fplugin-functions","06.govern\u002F01.tool-policy\u002F03.plugin-functions",{"title":1062,"path":1063,"stem":1064},"Function conditions and action classes","\u002Fgovern\u002Ftool-policy\u002Fconditions","06.govern\u002F01.tool-policy\u002F04.conditions",{"title":1066,"path":1067,"stem":1068},"Rules for taint, origins and sequences","\u002Fgovern\u002Ftool-policy\u002Forigins-and-sequences","06.govern\u002F01.tool-policy\u002F05.origins-and-sequences",{"title":1070,"path":1071,"stem":1072},"How the runtime enforces tool policy","\u002Fgovern\u002Ftool-policy\u002Fruntime","06.govern\u002F01.tool-policy\u002F06.runtime",{"title":1074,"path":1075,"stem":1076},"Preview, review and lint tool policy changes","\u002Fgovern\u002Ftool-policy\u002Freview-changes","06.govern\u002F01.tool-policy\u002F07.review-changes",{"title":1078,"path":1079,"stem":1080},"Assign duties to tool calls","\u002Fgovern\u002Ftool-policy\u002Fduties","06.govern\u002F01.tool-policy\u002F08.duties",{"title":1082,"path":1083,"stem":1084},"Command rules in a tool policy","\u002Fgovern\u002Ftool-policy\u002Fcommand-rules","06.govern\u002F01.tool-policy\u002F09.command-rules",{"title":1086,"path":1087,"stem":1088,"icon":230},"Governance replay","\u002Fgovern\u002Fgovernance-replay","06.govern\u002F02.governance-replay",{"title":1090,"path":1091,"stem":1092,"children":1093,"icon":532},"Reviewed changes","\u002Fgovern\u002Freviewed-changes","06.govern\u002F03.reviewed-changes\u002F00.index",[1094,1095,1099,1103,1107],{"title":1090,"path":1091,"stem":1092,"icon":532},{"title":1096,"path":1097,"stem":1098},"Review assistant and job proposals","\u002Fgovern\u002Freviewed-changes\u002Fproposals","06.govern\u002F03.reviewed-changes\u002F02.proposals",{"title":1100,"path":1101,"stem":1102},"Review plugin configurations","\u002Fgovern\u002Freviewed-changes\u002Fplugin-configurations","06.govern\u002F03.reviewed-changes\u002F03.plugin-configurations",{"title":1104,"path":1105,"stem":1106},"Review and roll back changesets","\u002Fgovern\u002Freviewed-changes\u002Fchangesets","06.govern\u002F03.reviewed-changes\u002F04.changesets",{"title":1108,"path":1109,"stem":1110},"Review changes to protected paths","\u002Fgovern\u002Freviewed-changes\u002Fprotected-paths","06.govern\u002F03.reviewed-changes\u002F05.protected-paths",{"title":1112,"path":1113,"stem":1114,"icon":666},"AI labels","\u002Fgovern\u002Fai-labels","06.govern\u002F04.ai-labels",{"title":1116,"path":1117,"stem":1118,"icon":1119},"Kill switches","\u002Fgovern\u002Fkill-switches","06.govern\u002F05.kill-switches","i-ph-power",{"title":1121,"path":1122,"stem":1123,"children":1124,"icon":1126},"Personal data","\u002Fgovern\u002Fpersonal-data","06.govern\u002F06.personal-data\u002F00.index",[1125,1127,1131,1135,1139,1143,1147],{"title":1121,"path":1122,"stem":1123,"icon":1126},"i-ph-user-minus",{"title":1128,"path":1129,"stem":1130},"Associate people and purposes with jobs","\u002Fgovern\u002Fpersonal-data\u002Fassociate-people","06.govern\u002F06.personal-data\u002F01.associate-people",{"title":1132,"path":1133,"stem":1134},"Find and export personal data","\u002Fgovern\u002Fpersonal-data\u002Fexport","06.govern\u002F06.personal-data\u002F02.export",{"title":1136,"path":1137,"stem":1138},"Restrict processing and record contests","\u002Fgovern\u002Fpersonal-data\u002Frestrictions-and-contests","06.govern\u002F06.personal-data\u002F03.restrictions-and-contests",{"title":1140,"path":1141,"stem":1142},"Erase personal data","\u002Fgovern\u002Fpersonal-data\u002Ferase","06.govern\u002F06.personal-data\u002F04.erase",{"title":1144,"path":1145,"stem":1146},"Retain records and restore backups","\u002Fgovern\u002Fpersonal-data\u002Fretention","06.govern\u002F06.personal-data\u002F05.retention",{"title":1148,"path":1149,"stem":1150},"Personal data held by plugins","\u002Fgovern\u002Fpersonal-data\u002Fplugin-records","06.govern\u002F06.personal-data\u002F06.plugin-records",{"title":1152,"path":1153,"stem":1154,"children":1155,"icon":1157},"Taint and labels","\u002Fgovern\u002Ftaint-and-labels","06.govern\u002F07.taint-and-labels\u002F00.index",[1156,1158,1162,1166],{"title":1152,"path":1153,"stem":1154,"icon":1157},"i-ph-drop-half-bottom",{"title":1159,"path":1160,"stem":1161},"Set rules on taint and labels","\u002Fgovern\u002Ftaint-and-labels\u002Frules","06.govern\u002F07.taint-and-labels\u002F02.rules",{"title":1163,"path":1164,"stem":1165},"Set clearance, egress and content walls","\u002Fgovern\u002Ftaint-and-labels\u002Flabel-policies","06.govern\u002F07.taint-and-labels\u002F03.label-policies",{"title":1167,"path":1168,"stem":1169},"Read outside text in a quarantine child","\u002Fgovern\u002Ftaint-and-labels\u002Fquarantine","06.govern\u002F07.taint-and-labels\u002F04.quarantine",{"title":1171,"path":1172,"stem":1173,"icon":1174},"Works-council mode","\u002Fgovern\u002Fworks-council-mode","06.govern\u002F08.works-council-mode","i-ph-users-three",{"title":1176,"path":1177,"stem":1178,"icon":1179},"Incidents","\u002Fgovern\u002Fincidents","06.govern\u002F09.incidents","i-ph-siren",{"title":1181,"path":1182,"stem":1183,"icon":213},"Inventory","\u002Fgovern\u002Finventory","06.govern\u002F10.inventory",{"title":1185,"path":1186,"stem":1187,"children":1188,"icon":1190},"Audit trail","\u002Fgovern\u002Faudit-trail","06.govern\u002F11.audit-trail\u002F00.index",[1189,1191,1195,1199,1203],{"title":1185,"path":1186,"stem":1187,"icon":1190},"i-ph-scroll",{"title":1192,"path":1193,"stem":1194},"Audit records and run identity","\u002Fgovern\u002Faudit-trail\u002Frecords","06.govern\u002F11.audit-trail\u002F02.records",{"title":1196,"path":1197,"stem":1198},"Verify the audit chain","\u002Fgovern\u002Faudit-trail\u002Fverification","06.govern\u002F11.audit-trail\u002F03.verification",{"title":1200,"path":1201,"stem":1202},"Export and verify evidence bundles","\u002Fgovern\u002Faudit-trail\u002Fevidence-bundles","06.govern\u002F11.audit-trail\u002F04.evidence-bundles",{"title":1204,"path":1205,"stem":1206},"Audit retention, erasure and legal holds","\u002Fgovern\u002Faudit-trail\u002Fretention","06.govern\u002F11.audit-trail\u002F05.retention",{"title":1208,"path":1209,"stem":1210,"children":1211,"icon":1213},"Command rules","\u002Fgovern\u002Fcommand-rules","06.govern\u002F12.command-rules\u002F00.index",[1212,1214,1218,1222,1226],{"title":1208,"path":1209,"stem":1210,"icon":1213},"i-ph-terminal",{"title":1215,"path":1216,"stem":1217},"Command rule patterns","\u002Fgovern\u002Fcommand-rules\u002Fpatterns","06.govern\u002F12.command-rules\u002F02.patterns",{"title":1219,"path":1220,"stem":1221},"What the command reader understands","\u002Fgovern\u002Fcommand-rules\u002Fcommand-reader","06.govern\u002F12.command-rules\u002F03.command-reader",{"title":1223,"path":1224,"stem":1225},"Create a command rule from an approval","\u002Fgovern\u002Fcommand-rules\u002Fallow-from-card","06.govern\u002F12.command-rules\u002F04.allow-from-card",{"title":1227,"path":1228,"stem":1229},"Command rule evaluation and limits","\u002Fgovern\u002Fcommand-rules\u002Fevaluation-and-limits","06.govern\u002F12.command-rules\u002F05.evaluation-and-limits",{"title":1231,"path":1232,"stem":1233,"children":1234,"icon":71},"Fleet","\u002Ffleet","07.fleet\u002F00.index",[1235,1237,1242,1247,1251,1256,1260,1265,1270,1274,1278,1297,1302,1307,1325,1329,1333,1352,1357,1380,1385,1390,1395,1399,1458,1462,1467,1481,1486,1490,1494],{"title":1236,"path":1232,"stem":1233},"Operate a fleet",{"title":1238,"path":1239,"stem":1240,"icon":1241},"Dev mode","\u002Ffleet\u002Fdev-mode","07.fleet\u002F01.dev-mode","i-ph-laptop",{"title":1243,"path":1244,"stem":1245,"icon":1246},"Run a cluster","\u002Ffleet\u002Fcluster","07.fleet\u002F02.cluster","i-ph-hard-drives",{"title":1248,"path":1249,"stem":1250,"icon":782},"Join nodes","\u002Ffleet\u002Fjoin-nodes","07.fleet\u002F03.join-nodes",{"title":1252,"path":1253,"stem":1254,"icon":1255},"Manage nodes","\u002Ffleet\u002Fmanage-nodes","07.fleet\u002F04.manage-nodes","i-ph-list-bullets",{"title":1257,"path":1258,"stem":1259,"icon":527},"Node health","\u002Ffleet\u002Fnodes","07.fleet\u002F05.nodes",{"title":1261,"path":1262,"stem":1263,"icon":1264},"Nodes as services","\u002Ffleet\u002Fservices","07.fleet\u002F06.services","i-ph-gear-six",{"title":1266,"path":1267,"stem":1268,"icon":1269},"Doctor","\u002Ffleet\u002Fdoctor","07.fleet\u002F07.doctor","i-ph-stethoscope",{"title":1271,"path":1272,"stem":1273,"icon":421},"Troubleshooting","\u002Ffleet\u002Ftroubleshooting","07.fleet\u002F08.troubleshooting",{"title":1275,"path":1276,"stem":1277,"icon":962},"Tracing and metrics","\u002Ffleet\u002Fobservability","07.fleet\u002F09.observability",{"title":1279,"path":1280,"stem":1281,"children":1282,"icon":1284},"Choose sandbox tier 2","\u002Ffleet\u002Fsandbox-tier-2","07.fleet\u002F10.sandbox-tier-2\u002F00.index",[1283,1285,1289,1293],{"title":1279,"path":1280,"stem":1281,"icon":1284},"i-ph-shield-chevron",{"title":1286,"path":1287,"stem":1288,"icon":1284},"Set up gVisor","\u002Ffleet\u002Fsandbox-tier-2\u002Fgvisor","07.fleet\u002F10.sandbox-tier-2\u002F01.gvisor",{"title":1290,"path":1291,"stem":1292,"icon":1284},"Set up microVM isolation","\u002Ffleet\u002Fsandbox-tier-2\u002Fmicrovms","07.fleet\u002F10.sandbox-tier-2\u002F02.microvms",{"title":1294,"path":1295,"stem":1296,"icon":1284},"Configure remote sandboxes","\u002Ffleet\u002Fsandbox-tier-2\u002Fremote","07.fleet\u002F10.sandbox-tier-2\u002F03.remote",{"title":1298,"path":1299,"stem":1300,"icon":1301},"Sandbox on macOS","\u002Ffleet\u002Fsandbox-on-macos","07.fleet\u002F11.sandbox-on-macos","i-ph-apple-logo",{"title":1303,"path":1304,"stem":1305,"icon":1306},"Sandbox on Windows","\u002Ffleet\u002Fsandbox-on-windows","07.fleet\u002F12.sandbox-on-windows","i-ph-windows-logo",{"title":1308,"path":1309,"stem":1310,"children":1311,"icon":797},"Configure local models","\u002Ffleet\u002Flocal-models","07.fleet\u002F13.local-models\u002F00.index",[1312,1313,1317,1321],{"title":1308,"path":1309,"stem":1310,"icon":797},{"title":1314,"path":1315,"stem":1316,"icon":797},"Share a local model with the fleet","\u002Ffleet\u002Flocal-models\u002Ffleet","07.fleet\u002F13.local-models\u002F01.fleet",{"title":1318,"path":1319,"stem":1320,"icon":797},"Review local-model safety checks","\u002Ffleet\u002Flocal-models\u002Ftrust","07.fleet\u002F13.local-models\u002F02.trust",{"title":1322,"path":1323,"stem":1324,"icon":797},"Size and price local models","\u002Ffleet\u002Flocal-models\u002Fsizing-and-cost","07.fleet\u002F13.local-models\u002F03.sizing-and-cost",{"title":1326,"path":1327,"stem":1328,"icon":1241},"Agents on a Mac with MLX","\u002Ffleet\u002Flocal-models-on-a-mac","07.fleet\u002F14.local-models-on-a-mac",{"title":1330,"path":1331,"stem":1332,"icon":127},"Queues","\u002Ffleet\u002Fqueues","07.fleet\u002F15.queues",{"title":1334,"path":1335,"stem":1336,"children":1337,"icon":1339},"Choose a Temporal backend","\u002Ffleet\u002Ftemporal-backends","07.fleet\u002F16.temporal-backends\u002F00.index",[1338,1340,1344,1348],{"title":1334,"path":1335,"stem":1336,"icon":1339},"i-ph-cloud",{"title":1341,"path":1342,"stem":1343},"Set retention and move tenants","\u002Ffleet\u002Ftemporal-backends\u002Fretention-and-migration","07.fleet\u002F16.temporal-backends\u002F01.retention-and-migration",{"title":1345,"path":1346,"stem":1347},"Encrypt Temporal payloads","\u002Ffleet\u002Ftemporal-backends\u002Fencryption","07.fleet\u002F16.temporal-backends\u002F02.encryption",{"title":1349,"path":1350,"stem":1351},"Read payloads in Temporal UI","\u002Ffleet\u002Ftemporal-backends\u002Fcodec","07.fleet\u002F16.temporal-backends\u002F03.codec",{"title":1353,"path":1354,"stem":1355,"icon":1356},"Regions","\u002Ffleet\u002Fregions","07.fleet\u002F17.regions","i-ph-globe-hemisphere-east",{"title":1358,"path":1359,"stem":1360,"children":1361,"icon":1363},"Run the roles separately","\u002Ffleet\u002Fseparate-roles","07.fleet\u002F18.separate-roles\u002F00.index",[1362,1364,1368,1372,1376],{"title":1358,"path":1359,"stem":1360,"icon":1363},"i-ph-squares-four",{"title":1365,"path":1366,"stem":1367},"Prepare database rights","\u002Ffleet\u002Fseparate-roles\u002Fdatabase-rights","07.fleet\u002F18.separate-roles\u002F01.database-rights",{"title":1369,"path":1370,"stem":1371},"Keep plaintext secrets on edges","\u002Ffleet\u002Fseparate-roles\u002Fsecrets","07.fleet\u002F18.separate-roles\u002F02.secrets",{"title":1373,"path":1374,"stem":1375},"Operate through role outages","\u002Ffleet\u002Fseparate-roles\u002Foutages","07.fleet\u002F18.separate-roles\u002F03.outages",{"title":1377,"path":1378,"stem":1379},"Use Temporal UI with separate roles","\u002Ffleet\u002Fseparate-roles\u002Ftemporal-ui","07.fleet\u002F18.separate-roles\u002F04.temporal-ui",{"title":1381,"path":1382,"stem":1383,"icon":1384},"High availability","\u002Ffleet\u002Fhigh-availability","07.fleet\u002F19.high-availability","i-ph-copy",{"title":1386,"path":1387,"stem":1388,"icon":1389},"Management over a WAN","\u002Ffleet\u002Fmanagement-over-a-wan","07.fleet\u002F20.management-over-a-wan","i-ph-globe-hemisphere-west",{"title":1391,"path":1392,"stem":1393,"icon":1394},"Cloud federation","\u002Ffleet\u002Fcloud-federation","07.fleet\u002F21.cloud-federation","i-ph-cloud-check",{"title":1396,"path":1397,"stem":1398,"icon":451},"Payload storage","\u002Ffleet\u002Fpayload-storage","07.fleet\u002F22.payload-storage",{"title":1400,"path":1401,"stem":1402,"children":1403,"icon":1405},"Upgrade a cluster","\u002Ffleet\u002Fupgrades","07.fleet\u002F23.upgrades\u002F00.index",[1404,1406,1410,1414,1418,1422,1426,1430,1434,1438,1442,1446,1450,1454],{"title":1400,"path":1401,"stem":1402,"icon":1405},"i-ph-arrows-clockwise",{"title":1407,"path":1408,"stem":1409},"Prepare for sandbox changes","\u002Ffleet\u002Fupgrades\u002Fsandbox-changes","07.fleet\u002F23.upgrades\u002F01.sandbox-changes",{"title":1411,"path":1412,"stem":1413},"Review policy changes","\u002Ffleet\u002Fupgrades\u002Fpolicy-changes","07.fleet\u002F23.upgrades\u002F02.policy-changes",{"title":1415,"path":1416,"stem":1417},"Review data and privacy migrations","\u002Ffleet\u002Fupgrades\u002Fdata-migrations","07.fleet\u002F23.upgrades\u002F03.data-migrations",{"title":1419,"path":1420,"stem":1421},"Prepare storage and identity migrations","\u002Ffleet\u002Fupgrades\u002Fstorage-and-identity","07.fleet\u002F23.upgrades\u002F04.storage-and-identity",{"title":1423,"path":1424,"stem":1425},"Prepare plugins for an upgrade","\u002Ffleet\u002Fupgrades\u002Fplugin-changes","07.fleet\u002F23.upgrades\u002F05.plugin-changes",{"title":1427,"path":1428,"stem":1429},"Keep calls compatible during upgrades","\u002Ffleet\u002Fupgrades\u002Fcall-compatibility","07.fleet\u002F23.upgrades\u002F06.call-compatibility",{"title":1431,"path":1432,"stem":1433},"Review model and budget migrations","\u002Ffleet\u002Fupgrades\u002Fmodel-and-budget-changes","07.fleet\u002F23.upgrades\u002F07.model-and-budget-changes",{"title":1435,"path":1436,"stem":1437},"Migrate to shared worker pools","\u002Ffleet\u002Fupgrades\u002Fshared-pools","07.fleet\u002F23.upgrades\u002F08.shared-pools",{"title":1439,"path":1440,"stem":1441},"Upgrade node binaries and runtimes","\u002Ffleet\u002Fupgrades\u002Fnodes","07.fleet\u002F23.upgrades\u002F09.nodes",{"title":1443,"path":1444,"stem":1445},"Understand runtime shutdown","\u002Ffleet\u002Fupgrades\u002Fruntime-shutdown","07.fleet\u002F23.upgrades\u002F10.runtime-shutdown",{"title":1447,"path":1448,"stem":1449},"Review runtime behaviour changes","\u002Ffleet\u002Fupgrades\u002Fruntime-changes","07.fleet\u002F23.upgrades\u002F11.runtime-changes",{"title":1451,"path":1452,"stem":1453},"Verify releases and switch channels","\u002Ffleet\u002Fupgrades\u002Frelease-verification","07.fleet\u002F23.upgrades\u002F12.release-verification",{"title":1455,"path":1456,"stem":1457},"Roll a runtime out in steps","\u002Ffleet\u002Fupgrades\u002Fruntime-rollouts","07.fleet\u002F23.upgrades\u002F13.runtime-rollouts",{"title":1459,"path":1460,"stem":1461,"icon":463},"Releases","\u002Ffleet\u002Freleases","07.fleet\u002F24.releases",{"title":1463,"path":1464,"stem":1465,"icon":1466},"Docker","\u002Ffleet\u002Fdocker","07.fleet\u002F25.docker","i-ph-shipping-container",{"title":1468,"path":1469,"stem":1470,"children":1471,"icon":480},"Deploy with Kubernetes","\u002Ffleet\u002Fkubernetes","07.fleet\u002F26.kubernetes\u002F00.index",[1472,1473,1477],{"title":1468,"path":1469,"stem":1470,"icon":480},{"title":1474,"path":1475,"stem":1476,"icon":480},"Helm objects and values","\u002Ffleet\u002Fkubernetes\u002Fvalues","07.fleet\u002F26.kubernetes\u002F01.values",{"title":1478,"path":1479,"stem":1480,"icon":480},"Maintain a Kubernetes deployment","\u002Ffleet\u002Fkubernetes\u002Fmaintenance","07.fleet\u002F26.kubernetes\u002F02.maintenance",{"title":1482,"path":1483,"stem":1484,"icon":1485},"Offline install","\u002Ffleet\u002Foffline-install","07.fleet\u002F27.offline-install","i-ph-airplane-tilt",{"title":1487,"path":1488,"stem":1489,"icon":98},"FIPS builds","\u002Ffleet\u002Ffips","07.fleet\u002F28.fips",{"title":1491,"path":1492,"stem":1493,"icon":249},"Run Orchestrator Zero from an MCP client","\u002Ffleet\u002Fmcp-client","07.fleet\u002F29.mcp-client",{"title":1495,"path":1496,"stem":1497,"children":1498,"icon":451},"Back up a cluster","\u002Ffleet\u002Fbackups","07.fleet\u002F30.backups\u002F00.index",[1499,1500],{"title":1495,"path":1496,"stem":1497,"icon":451},{"title":1501,"path":1502,"stem":1503},"Restore a cluster","\u002Ffleet\u002Fbackups\u002Frestore","07.fleet\u002F30.backups\u002F01.restore",{"title":1505,"path":1506,"stem":1507,"children":1508,"icon":71},"Spend","\u002Fspend","08.spend\u002F00.index",[1509,1511,1533,1547,1585],{"title":1510,"path":1506,"stem":1507},"Manage model access and spending",{"title":1512,"path":1513,"stem":1514,"children":1515,"icon":552},"Read cost and usage","\u002Fspend\u002Fcost-and-usage","08.spend\u002F01.cost-and-usage\u002F00.index",[1516,1517,1521,1525,1529],{"title":1512,"path":1513,"stem":1514,"icon":552},{"title":1518,"path":1519,"stem":1520},"Understand recorded charges","\u002Fspend\u002Fcost-and-usage\u002Faccounting","08.spend\u002F01.cost-and-usage\u002F01.accounting",{"title":1522,"path":1523,"stem":1524},"Read model call timings","\u002Fspend\u002Fcost-and-usage\u002Ftimings","08.spend\u002F01.cost-and-usage\u002F02.timings",{"title":1526,"path":1527,"stem":1528},"Export usage","\u002Fspend\u002Fcost-and-usage\u002Fexports","08.spend\u002F01.cost-and-usage\u002F03.exports",{"title":1530,"path":1531,"stem":1532},"Explain prices and cache costs","\u002Fspend\u002Fcost-and-usage\u002Fprices-and-cache","08.spend\u002F01.cost-and-usage\u002F04.prices-and-cache",{"title":1534,"path":1535,"stem":1536,"children":1537,"icon":134},"Set budgets and quotas","\u002Fspend\u002Fbudgets-and-quotas","08.spend\u002F02.budgets-and-quotas\u002F00.index",[1538,1539,1543],{"title":1534,"path":1535,"stem":1536,"icon":134},{"title":1540,"path":1541,"stem":1542,"icon":134},"Understand quota charging and refusals","\u002Fspend\u002Fbudgets-and-quotas\u002Fcharging","08.spend\u002F02.budgets-and-quotas\u002F01.charging",{"title":1544,"path":1545,"stem":1546,"icon":134},"Request and review budget","\u002Fspend\u002Fbudgets-and-quotas\u002Frequests","08.spend\u002F02.budgets-and-quotas\u002F02.requests",{"title":1548,"path":1549,"stem":1550,"children":1551,"icon":416},"Connect a model provider","\u002Fspend\u002Fmodels-and-keys","08.spend\u002F03.models-and-keys\u002F00.index",[1552,1553,1557,1561,1565,1569,1573,1577,1581],{"title":1548,"path":1549,"stem":1550,"icon":416},{"title":1554,"path":1555,"stem":1556},"Choose model aliases","\u002Fspend\u002Fmodels-and-keys\u002Faliases","08.spend\u002F03.models-and-keys\u002F01.aliases",{"title":1558,"path":1559,"stem":1560},"Map a plugin's models","\u002Fspend\u002Fmodels-and-keys\u002Fmapping","08.spend\u002F03.models-and-keys\u002F02.mapping",{"title":1562,"path":1563,"stem":1564},"Set reasoning effort and cascades","\u002Fspend\u002Fmodels-and-keys\u002Feffort-and-cascades","08.spend\u002F03.models-and-keys\u002F03.effort-and-cascades",{"title":1566,"path":1567,"stem":1568},"Authenticate model calls","\u002Fspend\u002Fmodels-and-keys\u002Fauthentication","08.spend\u002F03.models-and-keys\u002F04.authentication",{"title":1570,"path":1571,"stem":1572},"Control what model calls can reach","\u002Fspend\u002Fmodels-and-keys\u002Fdata-rules","08.spend\u002F03.models-and-keys\u002F05.data-rules",{"title":1574,"path":1575,"stem":1576},"Pool model deployments","\u002Fspend\u002Fmodels-and-keys\u002Fdeployment-pools","08.spend\u002F03.models-and-keys\u002F06.deployment-pools",{"title":1578,"path":1579,"stem":1580},"Configure caches and server tools","\u002Fspend\u002Fmodels-and-keys\u002Fcache-and-tools","08.spend\u002F03.models-and-keys\u002F07.cache-and-tools",{"title":1582,"path":1583,"stem":1584},"Check model changes and retirement","\u002Fspend\u002Fmodels-and-keys\u002Fcanaries-and-retirement","08.spend\u002F03.models-and-keys\u002F08.canaries-and-retirement",{"title":1586,"path":1587,"stem":1588,"icon":1589},"Translating providers","\u002Fspend\u002Ftranslating-providers","08.spend\u002F04.translating-providers","i-ph-translate",{"title":1591,"path":1592,"stem":1593,"children":1594,"icon":71},"Admin","\u002Fadmin","09.admin\u002F00.index",[1595,1597,1623,1650,1654,1658,1680,1685,1696],{"title":1596,"path":1592,"stem":1593},"Administer access and credentials",{"title":1598,"path":1599,"stem":1600,"children":1601,"icon":98},"Configure sign-in","\u002Fadmin\u002Fsign-in","09.admin\u002F01.sign-in\u002F00.index",[1602,1603,1607,1611,1615,1619],{"title":1598,"path":1599,"stem":1600,"icon":98},{"title":1604,"path":1605,"stem":1606},"Configure an identity provider","\u002Fadmin\u002Fsign-in\u002Fidentity-providers","09.admin\u002F01.sign-in\u002F01.identity-providers",{"title":1608,"path":1609,"stem":1610},"Provision accounts from a directory","\u002Fadmin\u002Fsign-in\u002Fprovisioning","09.admin\u002F01.sign-in\u002F02.provisioning",{"title":1612,"path":1613,"stem":1614},"Manage passwords and second factors","\u002Fadmin\u002Fsign-in\u002Fpasswords","09.admin\u002F01.sign-in\u002F03.passwords",{"title":1616,"path":1617,"stem":1618},"Sign in from the CLI and MCP clients","\u002Fadmin\u002Fsign-in\u002Fclients","09.admin\u002F01.sign-in\u002F04.clients",{"title":1620,"path":1621,"stem":1622},"End sessions and inspect sign-in events","\u002Fadmin\u002Fsign-in\u002Fsessions","09.admin\u002F01.sign-in\u002F05.sessions",{"title":1624,"path":1625,"stem":1626,"children":1627,"icon":1629},"Manage tenant secrets","\u002Fadmin\u002Fsecrets","09.admin\u002F02.secrets\u002F00.index",[1628,1630,1634,1638,1642,1646],{"title":1624,"path":1625,"stem":1626,"icon":1629},"i-ph-key",{"title":1631,"path":1632,"stem":1633},"Bind secrets to destination hosts","\u002Fadmin\u002Fsecrets\u002Fhost-bindings","09.admin\u002F02.secrets\u002F01.host-bindings",{"title":1635,"path":1636,"stem":1637},"Test and rotate secrets","\u002Fadmin\u002Fsecrets\u002Frotation","09.admin\u002F02.secrets\u002F02.rotation",{"title":1639,"path":1640,"stem":1641},"Use an external secret store","\u002Fadmin\u002Fsecrets\u002Fexternal-stores","09.admin\u002F02.secrets\u002F03.external-stores",{"title":1643,"path":1644,"stem":1645},"Deliver and scan plugin secrets","\u002Fadmin\u002Fsecrets\u002Fplugin-secrets","09.admin\u002F02.secrets\u002F04.plugin-secrets",{"title":1647,"path":1648,"stem":1649},"Configure plugin settings","\u002Fadmin\u002Fsecrets\u002Fsettings","09.admin\u002F02.secrets\u002F05.settings",{"title":1651,"path":1652,"stem":1653,"icon":1629},"Credential injection","\u002Fadmin\u002Fcredential-injection","09.admin\u002F03.credential-injection",{"title":1655,"path":1656,"stem":1657,"icon":1629},"Key commands","\u002Fadmin\u002Fkey-commands","09.admin\u002F04.key-commands",{"title":1659,"path":1660,"stem":1661,"children":1662,"icon":782},"Connect a plugin to another system","\u002Fadmin\u002Fconnections","09.admin\u002F05.connections\u002F00.index",[1663,1664,1668,1672,1676],{"title":1659,"path":1660,"stem":1661,"icon":782},{"title":1665,"path":1666,"stem":1667,"icon":782},"Renew and reconnect credentials","\u002Fadmin\u002Fconnections\u002Frenewal","09.admin\u002F05.connections\u002F01.renewal",{"title":1669,"path":1670,"stem":1671,"icon":782},"Restrict connection destinations","\u002Fadmin\u002Fconnections\u002Fdestinations","09.admin\u002F05.connections\u002F02.destinations",{"title":1673,"path":1674,"stem":1675,"icon":782},"Diagnose connection failures","\u002Fadmin\u002Fconnections\u002Ftroubleshooting","09.admin\u002F05.connections\u002F03.troubleshooting",{"title":1677,"path":1678,"stem":1679,"icon":782},"Understand connection security","\u002Fadmin\u002Fconnections\u002Fsecurity","09.admin\u002F05.connections\u002F04.security",{"title":1681,"path":1682,"stem":1683,"icon":1684},"Tenants","\u002Fadmin\u002Ftenants","09.admin\u002F06.tenants","i-ph-buildings",{"title":1686,"path":1687,"stem":1688,"children":1689,"icon":1691},"Export and verify a tenant","\u002Fadmin\u002Ftenant-export","09.admin\u002F07.tenant-export\u002F00.index",[1690,1692],{"title":1686,"path":1687,"stem":1688,"icon":1691},"i-ph-export",{"title":1693,"path":1694,"stem":1695,"icon":1691},"Tenant export format","\u002Fadmin\u002Ftenant-export\u002Fformat","09.admin\u002F07.tenant-export\u002F01.format",{"title":1697,"path":1698,"stem":1699,"icon":1700},"Notifications","\u002Fadmin\u002Fnotifications","09.admin\u002F08.notifications","i-ph-bell-ringing",{"title":1702,"path":1703,"stem":1704,"children":1705,"icon":71},"Reference","\u002Freference","10.reference\u002F00.index",[1706,1707,1726,1760,1794,1798,1803,1807,1812,1817,1822,1826],{"title":1702,"path":1703,"stem":1704},{"title":1708,"path":1709,"stem":1710,"children":1711,"icon":1725},"CLI","\u002Freference\u002Fcli","10.reference\u002F01.cli\u002F00.index",[1712,1713,1719],{"title":1708,"path":1709,"stem":1710},{"title":1714,"path":1715,"stem":1716,"children":1717},"oz0","\u002Freference\u002Fcli\u002Foz0","10.reference\u002F01.cli\u002F01.oz0\u002F00.index",[1718],{"title":1714,"path":1715,"stem":1716},{"title":1720,"path":1721,"stem":1722,"children":1723},"oz0-node","\u002Freference\u002Fcli\u002Foz0-node","10.reference\u002F01.cli\u002F02.oz0-node\u002F00.index",[1724],{"title":1720,"path":1721,"stem":1722},"i-ph-terminal-window",{"title":1727,"path":1728,"stem":1729,"children":1730,"icon":725},"oz0-plugin.yaml","\u002Freference\u002Fplugin-manifest","10.reference\u002F02.plugin-manifest\u002F00.index",[1731,1732,1736,1740,1744,1748,1752,1756],{"title":1727,"path":1728,"stem":1729,"icon":725},{"title":1733,"path":1734,"stem":1735},"Dependencies and cross-plugin access","\u002Freference\u002Fplugin-manifest\u002Fdependencies","10.reference\u002F02.plugin-manifest\u002F01.dependencies",{"title":1737,"path":1738,"stem":1739},"Tool declarations","\u002Freference\u002Fplugin-manifest\u002Ftools","10.reference\u002F02.plugin-manifest\u002F02.tools",{"title":1741,"path":1742,"stem":1743},"Harnesses, events and channels","\u002Freference\u002Fplugin-manifest\u002Fruntimes","10.reference\u002F02.plugin-manifest\u002F03.runtimes",{"title":1745,"path":1746,"stem":1747},"Connections and hooks","\u002Freference\u002Fplugin-manifest\u002Fconnections","10.reference\u002F02.plugin-manifest\u002F04.connections",{"title":1749,"path":1750,"stem":1751},"Plugin sets and policies","\u002Freference\u002Fplugin-manifest\u002Fsets-policy","10.reference\u002F02.plugin-manifest\u002F05.sets-policy",{"title":1753,"path":1754,"stem":1755},"Data, evidence and mail","\u002Freference\u002Fplugin-manifest\u002Fdata","10.reference\u002F02.plugin-manifest\u002F06.data",{"title":1757,"path":1758,"stem":1759},"Generated OpenAPI manifests","\u002Freference\u002Fplugin-manifest\u002Fopenapi","10.reference\u002F02.plugin-manifest\u002F07.openapi",{"title":1761,"path":1762,"stem":1763,"children":1764,"icon":666},"Agent definition","\u002Freference\u002Fagent-definition","10.reference\u002F03.agent-definition\u002F00.index",[1765,1766,1770,1774,1778,1782,1786,1790],{"title":1761,"path":1762,"stem":1763,"icon":666},{"title":1767,"path":1768,"stem":1769},"Identity, instructions and tools","\u002Freference\u002Fagent-definition\u002Fidentity","10.reference\u002F03.agent-definition\u002F01.identity",{"title":1771,"path":1772,"stem":1773},"Models and placement","\u002Freference\u002Fagent-definition\u002Fmodels","10.reference\u002F03.agent-definition\u002F02.models",{"title":1775,"path":1776,"stem":1777},"Limits and spend","\u002Freference\u002Fagent-definition\u002Flimits","10.reference\u002F03.agent-definition\u002F03.limits",{"title":1779,"path":1780,"stem":1781},"Judges and candidate selection","\u002Freference\u002Fagent-definition\u002Fquality","10.reference\u002F03.agent-definition\u002F04.quality",{"title":1783,"path":1784,"stem":1785},"Delegation and human decisions","\u002Freference\u002Fagent-definition\u002Fcoordination","10.reference\u002F03.agent-definition\u002F05.coordination",{"title":1787,"path":1788,"stem":1789},"History and recovery","\u002Freference\u002Fagent-definition\u002Fhistory","10.reference\u002F03.agent-definition\u002F06.history",{"title":1791,"path":1792,"stem":1793},"Sandbox, data and retention","\u002Freference\u002Fagent-definition\u002Fsecurity","10.reference\u002F03.agent-definition\u002F07.security",{"title":1795,"path":1796,"stem":1797,"icon":517},"Ports","\u002Freference\u002Fports","10.reference\u002F04.ports",{"title":1799,"path":1800,"stem":1801,"icon":1802},"Environment variables","\u002Freference\u002Fenvironment","10.reference\u002F05.environment","i-ph-brackets-curly",{"title":1804,"path":1805,"stem":1806,"icon":373},"Files and directories","\u002Freference\u002Ffiles","10.reference\u002F06.files",{"title":1808,"path":1809,"stem":1810,"icon":1811},"Lists and pages","\u002Freference\u002Flist-pages","10.reference\u002F07.list-pages","i-ph-list-numbers",{"title":1813,"path":1814,"stem":1815,"icon":1816},"Spend refusals","\u002Freference\u002Fspend-refusals","10.reference\u002F08.spend-refusals","i-ph-hand-coins",{"title":1818,"path":1819,"stem":1820,"icon":1821},"Admin API","\u002Freference\u002Fadmin-api","10.reference\u002F09.admin-api","i-ph-repeat",{"title":1823,"path":1824,"stem":1825},"Compatibility","\u002Freference\u002Fcompatibility","10.reference\u002F10.compatibility",{"title":1827,"path":1828,"stem":1829},"Known issues","\u002Freference\u002Fknown-issues","10.reference\u002F11.known-issues",{"title":1831,"path":1832,"stem":1833,"children":1834,"icon":71},"About","\u002Fabout","11.about\u002F00.index",[1835,1836,1840,1845],{"title":1831,"path":1832,"stem":1833},{"title":1837,"path":1838,"stem":1839,"icon":967},"Licensing","\u002Fabout\u002Flicensing","11.about\u002F01.licensing",{"title":1841,"path":1842,"stem":1843,"icon":1844},"About these docs","\u002Fabout\u002Fcontributing-docs","11.about\u002F02.contributing-docs","i-ph-pencil-simple",{"title":1846,"path":1847,"stem":1848,"icon":42},"A local environment","\u002Fabout\u002Flocal-environment","11.about\u002F03.local-environment",{"id":1850,"title":691,"body":1851,"description":3794,"extension":3795,"links":3796,"meta":3797,"navigation":3800,"path":692,"seo":3801,"stem":693,"__hash__":3802},"docs\u002F04.build\u002F02.parts\u002F04.tools\u002F00.index.md",{"type":1852,"value":1853,"toc":3780},"minimark",[1854,1858,1870,1878,1884,1889,1892,2070,2088,2104,2109,2115,2145,2163,2167,2170,2252,2311,2314,2329,2333,2339,2710,2715,2726,2730,2737,2766,2770,2776,2783,2816,2820,2837,2851,2855,2889,2916,2920,2923,3021,3111,3118,3149,3153,3175,3182,3230,3233,3237,3240,3274,3281,3285,3294,3298,3350,3354,3360,3424,3471,3480,3504,3523,3530,3534,3566,3776],[1855,1856,1857],"p",{},"For: plugin authors.",[1855,1859,1860,1861,1865,1866,1869],{},"Write a tool to expose actions that agents and flows can call. Configuration names those actions functions and addresses each one as ",[1862,1863,1864],"code",{},"\u003Ctool>.\u003Cfunction>",", using the tool's manifest ",[1862,1867,1868],{},"id",".",[1855,1871,1872,1873,1877],{},"A tool call invokes one function with specific arguments. See ",[1874,1875,1876],"a",{"href":22},"core terms"," for the terms used throughout the build guides.",[1855,1879,1880],{},[1881,1882],"span",{"id":1883},"three-kinds",[1885,1886,1888],"h2",{"id":1887},"mcp-servers-and-flows","MCP servers and flows",[1855,1890,1891],{},"A plugin can connect a tool to an MCP server in three ways:",[1893,1894,1899],"pre",{"className":1895,"code":1896,"filename":1727,"language":1897,"meta":1898,"style":1898},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: acme-github\ntools:\n  # Your own code, started in the plugin's environment\n  - id: acme_github\n    mcp: [\"python\", \"-m\", \"acme_github.mcp\"]\n\n  # An existing package, in an environment of its own\n  - id: acme_fetch\n    package: pypi:mcp-server-fetch==2026.8.18\n    affinity: any\n\n  # A remote server over Streamable HTTP\n  - id: acme_search\n    url: https:\u002F\u002Fmcp.example.com\u002Fmcp\n","yaml","",[1862,1900,1901,1917,1926,1933,1947,1989,1996,2002,2014,2025,2036,2041,2047,2059],{"__ignoreMap":1898},[1881,1902,1905,1909,1913],{"class":1903,"line":1904},"line",1,[1881,1906,1908],{"class":1907},"swJcz","name",[1881,1910,1912],{"class":1911},"sMK4o",":",[1881,1914,1916],{"class":1915},"sfazB"," acme-github\n",[1881,1918,1920,1923],{"class":1903,"line":1919},2,[1881,1921,1922],{"class":1907},"tools",[1881,1924,1925],{"class":1911},":\n",[1881,1927,1929],{"class":1903,"line":1928},3,[1881,1930,1932],{"class":1931},"sHwdD","  # Your own code, started in the plugin's environment\n",[1881,1934,1936,1939,1942,1944],{"class":1903,"line":1935},4,[1881,1937,1938],{"class":1911},"  -",[1881,1940,1941],{"class":1907}," id",[1881,1943,1912],{"class":1911},[1881,1945,1946],{"class":1915}," acme_github\n",[1881,1948,1950,1953,1955,1958,1961,1964,1966,1969,1972,1975,1977,1979,1981,1984,1986],{"class":1903,"line":1949},5,[1881,1951,1952],{"class":1907},"    mcp",[1881,1954,1912],{"class":1911},[1881,1956,1957],{"class":1911}," [",[1881,1959,1960],{"class":1911},"\"",[1881,1962,1963],{"class":1915},"python",[1881,1965,1960],{"class":1911},[1881,1967,1968],{"class":1911},",",[1881,1970,1971],{"class":1911}," \"",[1881,1973,1974],{"class":1915},"-m",[1881,1976,1960],{"class":1911},[1881,1978,1968],{"class":1911},[1881,1980,1971],{"class":1911},[1881,1982,1983],{"class":1915},"acme_github.mcp",[1881,1985,1960],{"class":1911},[1881,1987,1988],{"class":1911},"]\n",[1881,1990,1992],{"class":1903,"line":1991},6,[1881,1993,1995],{"emptyLinePlaceholder":1994},true,"\n",[1881,1997,1999],{"class":1903,"line":1998},7,[1881,2000,2001],{"class":1931},"  # An existing package, in an environment of its own\n",[1881,2003,2005,2007,2009,2011],{"class":1903,"line":2004},8,[1881,2006,1938],{"class":1911},[1881,2008,1941],{"class":1907},[1881,2010,1912],{"class":1911},[1881,2012,2013],{"class":1915}," acme_fetch\n",[1881,2015,2017,2020,2022],{"class":1903,"line":2016},9,[1881,2018,2019],{"class":1907},"    package",[1881,2021,1912],{"class":1911},[1881,2023,2024],{"class":1915}," pypi:mcp-server-fetch==2026.8.18\n",[1881,2026,2028,2031,2033],{"class":1903,"line":2027},10,[1881,2029,2030],{"class":1907},"    affinity",[1881,2032,1912],{"class":1911},[1881,2034,2035],{"class":1915}," any\n",[1881,2037,2039],{"class":1903,"line":2038},11,[1881,2040,1995],{"emptyLinePlaceholder":1994},[1881,2042,2044],{"class":1903,"line":2043},12,[1881,2045,2046],{"class":1931},"  # A remote server over Streamable HTTP\n",[1881,2048,2050,2052,2054,2056],{"class":1903,"line":2049},13,[1881,2051,1938],{"class":1911},[1881,2053,1941],{"class":1907},[1881,2055,1912],{"class":1911},[1881,2057,2058],{"class":1915}," acme_search\n",[1881,2060,2062,2065,2067],{"class":1903,"line":2061},14,[1881,2063,2064],{"class":1907},"    url",[1881,2066,1912],{"class":1911},[1881,2068,2069],{"class":1915}," https:\u002F\u002Fmcp.example.com\u002Fmcp\n",[1855,2071,2072,2073,2076,2077,2080,2081,2083,2084,2087],{},"For a local MCP server, use ",[1862,2074,2075],{},"mcp"," to name its command. Use ",[1862,2078,2079],{},"package"," to install an existing package in its own environment; it can also specify ",[1862,2082,2075],{}," when its command differs from the package's name. Use ",[1862,2085,2086],{},"url"," for a remote MCP server.",[1855,2089,2090,2091,2094,2095,2099,2100,2103],{},"A tool can also run without an MCP server: ",[1862,2092,2093],{},"flow: \u003Cflow>"," exposes one of the plugin's ",[1874,2096,2098],{"href":2097},"\u002Fbuild\u002Fparts\u002Fflows\u002Fflow-tools#flows-as-tools","flows as a tool",", whose one function is ",[1862,2101,2102],{},"\u003Cid>.\u003Cflow>",". An agent decides whether to call it; the flow's steps run as they always do, each through its own policy and approvals, and the tool's annotations are derived from them.",[2105,2106,2108],"h3",{"id":2107},"name-tools-after-your-plugin","Name tools after your plugin",[1855,2110,2111,2112,2114],{},"Agents call a function as ",[1862,2113,1864],{}," without naming the plugin, so a tool ID belongs to one plugin per tenant: an install whose tool ID another plugin of the tenant has is refused.",[1855,2116,2117,2118,2121,2122,2125,2126,2129,2130,2133,2134,2125,2137,2140,2141,2144],{},"Start every tool ID with the plugin's name, dashes as underscores, or with its first dash-separated segment: the plugin ",[1862,2119,2120],{},"acme-github"," has ",[1862,2123,2124],{},"acme_github",", ",[1862,2127,2128],{},"acme_fetch"," and ",[1862,2131,2132],{},"acme_search",", never ",[1862,2135,2136],{},"github",[1862,2138,2139],{},"fetch"," or ",[1862,2142,2143],{},"search",", which another plugin or a verified one would want too.",[1855,2146,2147,2148,2151,2152,2129,2155,2158,2159,2162],{},"Agent names follow the same rule with dashes (",[1862,2149,2150],{},"acme-reviewer","). The prefixes ",[1862,2153,2154],{},"oz0_",[1862,2156,2157],{},"oz0-"," belong to Orchestrator Zero's verified plugins. ",[1862,2160,2161],{},"plugin new"," writes names that keep the rule.",[2105,2164,2166],{"id":2165},"headers-of-a-remote-server","Headers of a remote server",[1855,2168,2169],{},"A remote server that wants a token gets it in a header whose value names a tenant secret the plugin declares:",[1893,2171,2173],{"className":1895,"code":2172,"filename":1727,"language":1897,"meta":1898,"style":1898},"requires:\n  secrets: [SEARCH_TOKEN]\ntools:\n  - id: acme_search\n    url: https:\u002F\u002Fmcp.example.com\u002Fmcp\n    headers:\n      Authorization: \"Bearer ${SEARCH_TOKEN}\"\n      X-Team: platform\n",[1862,2174,2175,2182,2196,2202,2212,2220,2227,2242],{"__ignoreMap":1898},[1881,2176,2177,2180],{"class":1903,"line":1904},[1881,2178,2179],{"class":1907},"requires",[1881,2181,1925],{"class":1911},[1881,2183,2184,2187,2189,2191,2194],{"class":1903,"line":1919},[1881,2185,2186],{"class":1907},"  secrets",[1881,2188,1912],{"class":1911},[1881,2190,1957],{"class":1911},[1881,2192,2193],{"class":1915},"SEARCH_TOKEN",[1881,2195,1988],{"class":1911},[1881,2197,2198,2200],{"class":1903,"line":1928},[1881,2199,1922],{"class":1907},[1881,2201,1925],{"class":1911},[1881,2203,2204,2206,2208,2210],{"class":1903,"line":1935},[1881,2205,1938],{"class":1911},[1881,2207,1941],{"class":1907},[1881,2209,1912],{"class":1911},[1881,2211,2058],{"class":1915},[1881,2213,2214,2216,2218],{"class":1903,"line":1949},[1881,2215,2064],{"class":1907},[1881,2217,1912],{"class":1911},[1881,2219,2069],{"class":1915},[1881,2221,2222,2225],{"class":1903,"line":1991},[1881,2223,2224],{"class":1907},"    headers",[1881,2226,1925],{"class":1911},[1881,2228,2229,2232,2234,2236,2239],{"class":1903,"line":1998},[1881,2230,2231],{"class":1907},"      Authorization",[1881,2233,1912],{"class":1911},[1881,2235,1971],{"class":1911},[1881,2237,2238],{"class":1915},"Bearer ${SEARCH_TOKEN}",[1881,2240,2241],{"class":1911},"\"\n",[1881,2243,2244,2247,2249],{"class":1903,"line":2004},[1881,2245,2246],{"class":1907},"      X-Team",[1881,2248,1912],{"class":1911},[1881,2250,2251],{"class":1915}," platform\n",[1855,2253,2254,2255,2258,2259,2262,2263,2125,2266,2269,2270,2125,2273,2125,2276,2140,2279,2282,2283,2286,2287,2290,2291,2293,2294,2297,2298,2125,2301,2125,2304,2125,2307,2310],{},"Each node fills in ",[1862,2256,2257],{},"${SEARCH_TOKEN}"," from the tenant's secret when it connects, and sends the headers with every request; a node without the secret does not start the tool. The manifest never holds the credential itself: ",[1862,2260,2261],{},"plugin lint"," refuses a header that carries one (",[1862,2264,2265],{},"Authorization",[1862,2267,2268],{},"Cookie",", a name with ",[1862,2271,2272],{},"token",[1862,2274,2275],{},"key",[1862,2277,2278],{},"secret",[1862,2280,2281],{},"auth",") without a ",[1862,2284,2285],{},"${SECRET}",", a ",[1862,2288,2289],{},"${...}"," that names no declared secret, credentials (a header named like one, or any header whose value holds a ",[1862,2292,2285],{},") over plain ",[1862,2295,2296],{},"http:\u002F\u002F"," to another machine, and the headers the MCP transport sets itself (",[1862,2299,2300],{},"Host",[1862,2302,2303],{},"Content-Type",[1862,2305,2306],{},"Accept",[1862,2308,2309],{},"Mcp-Session-Id"," and the like).",[1855,2312,2313],{},"At most 16 headers, each one line of at most 4 KB.",[1855,2315,2316,2317,2320,2321,2324,2325,2328],{},"Bind the secret to the server's host (",[1862,2318,2319],{},"requires.inject",", or a tenant admin's binding) and the node sends its placeholder instead, and its credential proxy puts the value on requests to that host only; a ",[1874,2322,2323],{"href":1660},"connection"," bound to the server's host gets its token into the binding's header the same way, call by call (",[1874,2326,1651],{"href":2327},"\u002Fadmin\u002Fcredential-injection#remote-tools",").",[2105,2330,2332],{"id":2331},"remote-servers-on-connections","Remote servers on connections",[1855,2334,2335,2336,2338],{},"A remote server that takes OAuth, such as a vendor's official MCP server, signs in through a ",[1874,2337,2323],{"href":778},": the customer's own OAuth app, connected once by a tenant admin. Name the connection on the tool, and each call gets the token the edge mints for that call:",[1893,2340,2342],{"className":1895,"code":2341,"filename":1727,"language":1897,"meta":1898,"style":1898},"tools:\n  - id: tracker\n    url: https:\u002F\u002F{params.host}\u002Fapi\u002Fv4\u002Fmcp   # or a literal https:\u002F\u002F URL\n    connection: tracker\n    functions:                              # overrides of what the server lists, by its function names\n      list_issues:\n        annotations: {readOnlyHint: true}\n      update_issue:\n        annotations: {destructiveHint: true}\n      get_issue:\n        output_schema: {type: object, properties: {id: {type: integer}}, required: [id]}\n        usage: {service: tracker-ai, unit: credit, units: 1, cost_usd: 0}\nconnections:\n  - name: tracker\n    tools: [tracker]\n    params:\n      - {name: host, description: \"The instance, such as gitlab.example.com\", default: gitlab.com}\n      - {name: client_id, description: The OAuth app's client ID, required: true}\n    # steps, token and token.refresh: see Connections\n    scopes:\n      - functions: [\"tracker.*\"]               # every function the server lists\n",[1862,2343,2344,2350,2361,2373,2382,2392,2399,2421,2428,2445,2452,2506,2556,2563,2574,2589,2597,2638,2671,2677,2685],{"__ignoreMap":1898},[1881,2345,2346,2348],{"class":1903,"line":1904},[1881,2347,1922],{"class":1907},[1881,2349,1925],{"class":1911},[1881,2351,2352,2354,2356,2358],{"class":1903,"line":1919},[1881,2353,1938],{"class":1911},[1881,2355,1941],{"class":1907},[1881,2357,1912],{"class":1911},[1881,2359,2360],{"class":1915}," tracker\n",[1881,2362,2363,2365,2367,2370],{"class":1903,"line":1928},[1881,2364,2064],{"class":1907},[1881,2366,1912],{"class":1911},[1881,2368,2369],{"class":1915}," https:\u002F\u002F{params.host}\u002Fapi\u002Fv4\u002Fmcp",[1881,2371,2372],{"class":1931},"   # or a literal https:\u002F\u002F URL\n",[1881,2374,2375,2378,2380],{"class":1903,"line":1935},[1881,2376,2377],{"class":1907},"    connection",[1881,2379,1912],{"class":1911},[1881,2381,2360],{"class":1915},[1881,2383,2384,2387,2389],{"class":1903,"line":1949},[1881,2385,2386],{"class":1907},"    functions",[1881,2388,1912],{"class":1911},[1881,2390,2391],{"class":1931},"                              # overrides of what the server lists, by its function names\n",[1881,2393,2394,2397],{"class":1903,"line":1991},[1881,2395,2396],{"class":1907},"      list_issues",[1881,2398,1925],{"class":1911},[1881,2400,2401,2404,2406,2409,2412,2414,2418],{"class":1903,"line":1998},[1881,2402,2403],{"class":1907},"        annotations",[1881,2405,1912],{"class":1911},[1881,2407,2408],{"class":1911}," {",[1881,2410,2411],{"class":1907},"readOnlyHint",[1881,2413,1912],{"class":1911},[1881,2415,2417],{"class":2416},"sfNiH"," true",[1881,2419,2420],{"class":1911},"}\n",[1881,2422,2423,2426],{"class":1903,"line":2004},[1881,2424,2425],{"class":1907},"      update_issue",[1881,2427,1925],{"class":1911},[1881,2429,2430,2432,2434,2436,2439,2441,2443],{"class":1903,"line":2016},[1881,2431,2403],{"class":1907},[1881,2433,1912],{"class":1911},[1881,2435,2408],{"class":1911},[1881,2437,2438],{"class":1907},"destructiveHint",[1881,2440,1912],{"class":1911},[1881,2442,2417],{"class":2416},[1881,2444,2420],{"class":1911},[1881,2446,2447,2450],{"class":1903,"line":2027},[1881,2448,2449],{"class":1907},"      get_issue",[1881,2451,1925],{"class":1911},[1881,2453,2454,2457,2459,2461,2464,2466,2469,2471,2474,2476,2478,2480,2482,2484,2486,2488,2491,2494,2497,2499,2501,2503],{"class":1903,"line":2038},[1881,2455,2456],{"class":1907},"        output_schema",[1881,2458,1912],{"class":1911},[1881,2460,2408],{"class":1911},[1881,2462,2463],{"class":1907},"type",[1881,2465,1912],{"class":1911},[1881,2467,2468],{"class":1915}," object",[1881,2470,1968],{"class":1911},[1881,2472,2473],{"class":1907}," properties",[1881,2475,1912],{"class":1911},[1881,2477,2408],{"class":1911},[1881,2479,1868],{"class":1907},[1881,2481,1912],{"class":1911},[1881,2483,2408],{"class":1911},[1881,2485,2463],{"class":1907},[1881,2487,1912],{"class":1911},[1881,2489,2490],{"class":1915}," integer",[1881,2492,2493],{"class":1911},"}},",[1881,2495,2496],{"class":1907}," required",[1881,2498,1912],{"class":1911},[1881,2500,1957],{"class":1911},[1881,2502,1868],{"class":1915},[1881,2504,2505],{"class":1911},"]}\n",[1881,2507,2508,2511,2513,2515,2518,2520,2523,2525,2528,2530,2533,2535,2538,2540,2544,2546,2549,2551,2554],{"class":1903,"line":2043},[1881,2509,2510],{"class":1907},"        usage",[1881,2512,1912],{"class":1911},[1881,2514,2408],{"class":1911},[1881,2516,2517],{"class":1907},"service",[1881,2519,1912],{"class":1911},[1881,2521,2522],{"class":1915}," tracker-ai",[1881,2524,1968],{"class":1911},[1881,2526,2527],{"class":1907}," unit",[1881,2529,1912],{"class":1911},[1881,2531,2532],{"class":1915}," credit",[1881,2534,1968],{"class":1911},[1881,2536,2537],{"class":1907}," units",[1881,2539,1912],{"class":1911},[1881,2541,2543],{"class":2542},"sbssI"," 1",[1881,2545,1968],{"class":1911},[1881,2547,2548],{"class":1907}," cost_usd",[1881,2550,1912],{"class":1911},[1881,2552,2553],{"class":2542}," 0",[1881,2555,2420],{"class":1911},[1881,2557,2558,2561],{"class":1903,"line":2049},[1881,2559,2560],{"class":1907},"connections",[1881,2562,1925],{"class":1911},[1881,2564,2565,2567,2570,2572],{"class":1903,"line":2061},[1881,2566,1938],{"class":1911},[1881,2568,2569],{"class":1907}," name",[1881,2571,1912],{"class":1911},[1881,2573,2360],{"class":1915},[1881,2575,2577,2580,2582,2584,2587],{"class":1903,"line":2576},15,[1881,2578,2579],{"class":1907},"    tools",[1881,2581,1912],{"class":1911},[1881,2583,1957],{"class":1911},[1881,2585,2586],{"class":1915},"tracker",[1881,2588,1988],{"class":1911},[1881,2590,2592,2595],{"class":1903,"line":2591},16,[1881,2593,2594],{"class":1907},"    params",[1881,2596,1925],{"class":1911},[1881,2598,2600,2603,2605,2607,2609,2612,2614,2617,2619,2621,2624,2626,2628,2631,2633,2636],{"class":1903,"line":2599},17,[1881,2601,2602],{"class":1911},"      -",[1881,2604,2408],{"class":1911},[1881,2606,1908],{"class":1907},[1881,2608,1912],{"class":1911},[1881,2610,2611],{"class":1915}," host",[1881,2613,1968],{"class":1911},[1881,2615,2616],{"class":1907}," description",[1881,2618,1912],{"class":1911},[1881,2620,1971],{"class":1911},[1881,2622,2623],{"class":1915},"The instance, such as gitlab.example.com",[1881,2625,1960],{"class":1911},[1881,2627,1968],{"class":1911},[1881,2629,2630],{"class":1907}," default",[1881,2632,1912],{"class":1911},[1881,2634,2635],{"class":1915}," gitlab.com",[1881,2637,2420],{"class":1911},[1881,2639,2641,2643,2645,2647,2649,2652,2654,2656,2658,2661,2663,2665,2667,2669],{"class":1903,"line":2640},18,[1881,2642,2602],{"class":1911},[1881,2644,2408],{"class":1911},[1881,2646,1908],{"class":1907},[1881,2648,1912],{"class":1911},[1881,2650,2651],{"class":1915}," client_id",[1881,2653,1968],{"class":1911},[1881,2655,2616],{"class":1907},[1881,2657,1912],{"class":1911},[1881,2659,2660],{"class":1915}," The OAuth app's client ID",[1881,2662,1968],{"class":1911},[1881,2664,2496],{"class":1907},[1881,2666,1912],{"class":1911},[1881,2668,2417],{"class":2416},[1881,2670,2420],{"class":1911},[1881,2672,2674],{"class":1903,"line":2673},19,[1881,2675,2676],{"class":1931},"    # steps, token and token.refresh: see Connections\n",[1881,2678,2680,2683],{"class":1903,"line":2679},20,[1881,2681,2682],{"class":1907},"    scopes",[1881,2684,1925],{"class":1911},[1881,2686,2688,2690,2693,2695,2697,2699,2702,2704,2707],{"class":1903,"line":2687},21,[1881,2689,2602],{"class":1911},[1881,2691,2692],{"class":1907}," functions",[1881,2694,1912],{"class":1911},[1881,2696,1957],{"class":1911},[1881,2698,1960],{"class":1911},[1881,2700,2701],{"class":1915},"tracker.*",[1881,2703,1960],{"class":1911},[1881,2705,2706],{"class":1911},"]",[1881,2708,2709],{"class":1931},"               # every function the server lists\n",[2711,2712,2714],"h4",{"id":2713},"a-token-per-call","A token per call",[1855,2716,2717,2718,2721,2722,2725],{},"Each call opens an MCP session of its own with the call's token in its ",[1862,2719,2720],{},"Authorization: Bearer"," header, as MCP's authorization asks of every request, and closes it. Two calls never share a session, so two jobs' calls at once never see each other's token. The token is never in the call's ",[1862,2723,2724],{},"_meta",", the model's view, the job's history, a log or a trace. The node lists the server's tools with a token of the connection too, so a server that answers its listing only to signed-in clients is listed.",[2711,2727,2729],{"id":2728},"connect-first","Connect first",[1855,2731,2732,2733,2736],{},"Installed before its connection is connected, the tool is not ready (the plugin is), and the node lists it once the connection is; the runtime then starts again to offer its functions. Its connection's scope names its functions, or ",[1862,2734,2735],{},"\u003Ctool>.*"," for every one; the listing gets the token of the first scope that names any of them, so put the scope with the least access (a read-only one) first: the node holds the listing's token whenever its runtime starts.",[1855,2738,2739,2740,2125,2742,2140,2745,2748,2749,2129,2752,2755,2756,2759,2760,2762,2763,2765],{},"The connection's token is one the edge has without a call (kind ",[1862,2741,2278],{},[1862,2743,2744],{},"client-credentials",[1862,2746,2747],{},"jwt-exchange","): lint refuses ",[1862,2750,2751],{},"identity",[1862,2753,2754],{},"on_behalf_of",", whose tokens are minted for one call, so the tool could never be listed, and ",[1862,2757,2758],{},"federated",", which gives a cloud's credentials rather than a bearer token. The tool sends no ",[1862,2761,2265],{}," header of its own and needs no ",[1862,2764,2319],{}," binding.",[2711,2767,2769],{"id":2768},"a-host-per-tenant","A host per tenant",[1855,2771,2772,2775],{},[1862,2773,2774],{},"https:\u002F\u002F{params.host}\u002F\u003Cpath>"," takes only the host and port from the connection's param, for self-managed instances (GitLab, Jira Data Center, a ServiceNow instance); the path stays literal and the scheme is https. That host is the only place the tool's calls go: the edge resolves it and checks every address, the node connects only to the addresses the edge checked (it never resolves the name again, so a name cannot point elsewhere between the check and the call), and its client follows no redirect and refuses any other origin.",[1855,2777,2778,2779,2782],{},"A host that resolves to a private address is refused unless the cluster's admin lists its network (",[1862,2780,2781],{},"server start --connect-allow-net","); one that resolves to an address of the node itself, its link or a cloud's metadata service is refused whatever is listed, except on a dev server. The connection needs steps: they record the host when it is connected, and changing the param gets no token until it is connected again, so a token issued for one host never reaches another. Lint refuses such a URL on a connection without steps, whose token would follow the param anywhere.",[2784,2785,2786,2801],"ul",{},[2787,2788,2789,2790,2793,2794,2797,2798,2800],"li",{},"Headers of the tool's own. A header that is no credential, such as the toolsets a vendor's server lists (GitLab's ",[1862,2791,2792],{},"X-Gitlab-Enabled-Mcp-Server-Toolsets","), is written in ",[1862,2795,2796],{},"headers:"," as it is, and goes with the listing and every call beside the token. The edge's ",[1862,2799,2265],{}," header always wins; a header named like a credential must come from a tenant secret.",[2787,2802,2803,2804,2808,2809,2812,2813,2328],{},"Listed late. A remote tool on a connection lists nothing until the connection is connected, so its part of the version's ",[1874,2805,2807],{"href":2806},"\u002Fbuild\u002Fparts\u002Ftools\u002Fsnapshots#snapshots-a-tool-may-not-change-what-it-says-it-does","snapshot"," is set when it first lists, not by the plugin's first report: a plugin with a local tool beside it (an event source's normaliser) does not wait for approval of its first listing. A change after that waits as any tool's does. ",[1862,2810,2811],{},"plugin test"," writes the local tools' measured listing while the remote one waits for its connection, when its snapshot is committed (",[1862,2814,2815],{},"snapshots\u002F\u003Ctool>.json",[2711,2817,2819],{"id":2818},"the-servers-annotations-count-once-approved","The server's annotations count once approved",[1855,2821,2822,2125,2824,2129,2826,2829,2830,2833,2834,2836],{},[1862,2823,2411],{},[1862,2825,2438],{},[1862,2827,2828],{},"openWorldHint"," count under the tenant's ",[1874,2831,2832],{"href":1049},"tool policy"," as a local server's do, but only while the server's listing is its ",[1874,2835,2807],{"href":2806},": a server that changes them waits for approval again. Until the first snapshot reaches a node they are hints only. From then on a failed call of a function the snapshot says is read-only (or idempotent, with a server that honours the key) is made again, as a local server's is. A remote server's results still count as outside text, and its calls as outbound, whatever it says.",[2784,2838,2839],{},[2787,2840,2841,2842,2846,2847,2850],{},"Long calls hold no slot. A server that speaks MCP's Tasks extension may answer a long call with a task, which the job follows from timers in its history while the node's slot serves other calls, where the tenant names the connection (",[1874,2843,2845],{"href":2844},"\u002Fbuild\u002Fparts\u002Fconnections\u002Ftoken-lifecycle#long-calls-as-tasks","Long calls as tasks","). A call that waits for its answer reads it as long as the tool's ",[1862,2848,2849],{},"timeout"," allows, however quiet the server is meanwhile.",[2711,2852,2854],{"id":2853},"overrides","Overrides",[1855,2856,2857,2860,2861,2125,2864,2125,2867,2870,2871,2873,2874,2877,2878,2881,2882,2884,2885,2888],{},[1862,2858,2859],{},"annotations"," sets a hint the server does not give, and tightens one it gives (",[1862,2862,2863],{},"readOnlyHint: false",[1862,2865,2866],{},"destructiveHint: true",[1862,2868,2869],{},"openWorldHint: true","; ",[1862,2872,2866],{}," also clears the server's ",[1862,2875,2876],{},"readOnlyHint: true",", which the policy reads first); only a plugin installed from OZ's own index as an ",[1862,2879,2880],{},"ai.oz0"," listing, whose manifest was reviewed, may loosen one (an ",[1862,2883,2880],{}," name in any other index counts as any other plugin). ",[1862,2886,2887],{},"output_schema"," (an object schema) is what the node validates the server's structured result against: a result that does not match is an error the model reads, and a result with text only stays text.",[1855,2890,2891,2892,2895,2896,2900,2901,2904,2905,2908,2909,2911,2912,2915],{},"Cards of the function's results are drawn from it. ",[1862,2893,2894],{},"usage"," is what each successful call spends, in the ",[1874,2897,2899],{"href":2898},"\u002Fbuild\u002Fparts\u002Ftools\u002Fmodel-calls#report-what-your-own-services-cost","usage report's"," shape, for a vendor that charges credits per call and reports none. ",[1862,2902,2903],{},"ai_label"," is a JSON pointer to the string argument people read what the call writes in, such as ",[1862,2906,2907],{},"\u002Fbody"," of a comment: a vendor's server never reads the label a local tool gets in ",[1862,2910,2724],{},", so the node puts the tenant's AI label (",[1862,2913,2914],{},"[AI agent] ",") at the start of that string, once, after the tool policy and any approval; with the label turned off it adds nothing.",[2105,2917,2919],{"id":2918},"wrap-a-vendors-remote-server","Wrap a vendor's remote server",[1855,2921,2922],{},"A connector that wraps a vendor's own remote MCP server starts from a template that holds every piece above:",[1893,2924,2929],{"className":2925,"code":2926,"filename":2927,"language":2928,"meta":1898,"style":1898},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","oz0 plugin new tracker --template mcp-connector --name tracker \\\n  --description \"An issue system's own MCP server, on the customer's own OAuth app\"\ncd tracker && uv lock && uv sync && uv run pytest\noz0 plugin lint --verified .\n","Terminal","bash",[1862,2930,2931,2960,2972,3006],{"__ignoreMap":1898},[1881,2932,2933,2936,2939,2942,2945,2948,2951,2954,2956],{"class":1903,"line":1904},[1881,2934,1714],{"class":2935},"sBMFI",[1881,2937,2938],{"class":1915}," plugin",[1881,2940,2941],{"class":1915}," new",[1881,2943,2944],{"class":1915}," tracker",[1881,2946,2947],{"class":1915}," --template",[1881,2949,2950],{"class":1915}," mcp-connector",[1881,2952,2953],{"class":1915}," --name",[1881,2955,2944],{"class":1915},[1881,2957,2959],{"class":2958},"sTEyZ"," \\\n",[1881,2961,2962,2965,2967,2970],{"class":1903,"line":1919},[1881,2963,2964],{"class":1915},"  --description",[1881,2966,1971],{"class":1911},[1881,2968,2969],{"class":1915},"An issue system's own MCP server, on the customer's own OAuth app",[1881,2971,2241],{"class":1911},[1881,2973,2974,2978,2980,2983,2986,2989,2991,2993,2996,2998,3000,3003],{"class":1903,"line":1928},[1881,2975,2977],{"class":2976},"s2Zo4","cd",[1881,2979,2944],{"class":1915},[1881,2981,2982],{"class":1911}," &&",[1881,2984,2985],{"class":2935}," uv",[1881,2987,2988],{"class":1915}," lock",[1881,2990,2982],{"class":1911},[1881,2992,2985],{"class":2935},[1881,2994,2995],{"class":1915}," sync",[1881,2997,2982],{"class":1911},[1881,2999,2985],{"class":2935},[1881,3001,3002],{"class":1915}," run",[1881,3004,3005],{"class":1915}," pytest\n",[1881,3007,3008,3010,3012,3015,3018],{"class":1903,"line":1935},[1881,3009,1714],{"class":2935},[1881,3011,2938],{"class":1915},[1881,3013,3014],{"class":1915}," lint",[1881,3016,3017],{"class":1915}," --verified",[1881,3019,3020],{"class":1915}," .\n",[2784,3022,3023,3037,3050,3082,3093,3108],{},[2787,3024,3025,3026,3029,3030,3033,3034,1869],{},"One ",[1862,3027,3028],{},"url:"," tool on a connection with the customer's own public OAuth app: authorization code with PKCE, refresh tokens that rotate, the host from the connection's ",[1862,3031,3032],{},"host"," param, no client secret and no ",[1862,3035,3036],{},"requires.secrets",[2787,3038,3039,3040,3043,3044,2125,3047,2328],{},"Overrides that tighten the server's hints and declare an output schema, and every write under ",[1862,3041,3042],{},"requires_approval"," with the default deciders a plugin may ship (",[1862,3045,3046],{},"role: operator",[1862,3048,3049],{},"not_starter: true",[2787,3051,3052,3053,3055,3056,3058,3059,3062,3063,3065,3066,3069,3070,3074,3075,3078,3079,1869],{},"A pin: ",[1862,3054,2815],{},", the functions the server is expected to list, each with the hash a node's ",[1874,3057,2807],{"href":2806}," gives its listing, and ",[1862,3060,3061],{},"\"answers\": \"text\""," for a function the vendor answers in text only. ",[1862,3064,2261],{}," reads a remote tool's functions from it, with the overrides merged, and ",[1862,3067,3068],{},"--verified"," checks it (",[1874,3071,3073],{"href":3072},"\u002Fbuild\u002Fplugins\u002Fstructure\u002Flint-rules#oz-s015","OZ-S015","). When the vendor's server changes, save its ",[1862,3076,3077],{},"tools\u002Flist"," answer and write the snapshot again: ",[1862,3080,3081],{},"uv run python tests\u002Fsnapshot.py --write --from listing.json --listed-from \"\u003CURL>, read \u003Cdate>\"",[2787,3083,3084,3085,3088,3089,3092],{},"A fake of the vendor's server (",[1862,3086,3087],{},"tests\u002Ffake_server.py",", MCP over HTTP with a bearer token) and contract tests (",[1862,3090,3091],{},"tests\u002Ftest_contract.py","): the fake lists the snapshot, overrides and approvals name listed functions, every write waits for a person, each result fits its declared schema.",[2787,3094,3095,3096,3099,3100,3103,3104,3107],{},"A delegate agent tagged ",[1862,3097,3098],{},"delegate"," on the alias ",[1862,3101,3102],{},"default",", with an eval whose answer is recorded, so ",[1862,3105,3106],{},"oz0 plugin test"," replays it offline while the tool waits for its connection.",[2787,3109,3110],{},"README.md as the docs page, with a Limits section.",[1855,3112,3113,3114,3117],{},"The build kit's ",[1862,3115,3116],{},"oz0-connector"," skill takes a coding agent through it, from the choice between wrapping the vendor's server and building on its API to the docs page.",[3119,3120,3121,3122,3124,3125,3128,3129,3132,3133,3136,3137,3140,3141,3144,3145,3148],"note",{},"A vendor's server never reads the AI label Orchestrator Zero sends in a call's ",[1862,3123,2724],{},". For every function that posts something people read, name the argument they read with ",[1862,3126,3127],{},"functions.\u003Cname>.ai_label"," (the template gives ",[1862,3130,3131],{},"add_comment"," ",[1862,3134,3135],{},"ai_label: \u002Fbody","): the node puts the tenant's label at its start, after the approval, and ",[1862,3138,3139],{},"plugin lint --verified"," checks that the snapshot's input schema gives that argument as a string, or as a member of an object that takes any key (such as ",[1862,3142,3143],{},"\u002Ffields\u002Fdescription"," of an issue's open ",[1862,3146,3147],{},"fields","). Keep such functions behind approval as well, and say under Limits where the label goes.",[1885,3150,3152],{"id":3151},"your-own-code-in-python","Your own code in Python",[1855,3154,3155,3156,3159,3160,3163,3164,3167,3168,3171,3172,3174],{},"With ",[1862,3157,3158],{},"runtime: python"," and a ",[1862,3161,3162],{},"pyproject.toml",", the node builds the plugin's own environment with ",[1862,3165,3166],{},"uv sync --frozen"," from your ",[1862,3169,3170],{},"uv.lock",", so every node runs exactly the versions you locked. A command starting with ",[1862,3173,1963],{}," runs that environment's Python; any other command is looked up in the environment first.",[1855,3176,3177,3178,3181],{},"The templates use the official MCP SDK (",[1862,3179,3180],{},"mcp==2.2.0","):",[1893,3183,3186],{"className":3184,"code":3185,"language":1963,"meta":1898,"style":1898},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from mcp.server import MCPServer\n\nserver = MCPServer(\"acme-github\")\n\n\n@server.tool()\ndef get_pr(repo: str, number: int) -> dict:\n    \"\"\"Title, author, state and changed files of a pull request.\"\"\"\n    ...\n",[1862,3187,3188,3193,3197,3202,3206,3210,3215,3220,3225],{"__ignoreMap":1898},[1881,3189,3190],{"class":1903,"line":1904},[1881,3191,3192],{},"from mcp.server import MCPServer\n",[1881,3194,3195],{"class":1903,"line":1919},[1881,3196,1995],{"emptyLinePlaceholder":1994},[1881,3198,3199],{"class":1903,"line":1928},[1881,3200,3201],{},"server = MCPServer(\"acme-github\")\n",[1881,3203,3204],{"class":1903,"line":1935},[1881,3205,1995],{"emptyLinePlaceholder":1994},[1881,3207,3208],{"class":1903,"line":1949},[1881,3209,1995],{"emptyLinePlaceholder":1994},[1881,3211,3212],{"class":1903,"line":1991},[1881,3213,3214],{},"@server.tool()\n",[1881,3216,3217],{"class":1903,"line":1998},[1881,3218,3219],{},"def get_pr(repo: str, number: int) -> dict:\n",[1881,3221,3222],{"class":1903,"line":2004},[1881,3223,3224],{},"    \"\"\"Title, author, state and changed files of a pull request.\"\"\"\n",[1881,3226,3227],{"class":1903,"line":2016},[1881,3228,3229],{},"    ...\n",[1855,3231,3232],{},"Write good docstrings and type hints: they are what the model sees when it decides whether to call a function.",[1885,3234,3236],{"id":3235},"other-languages","Other languages",[1855,3238,3239],{},"Tools speak MCP, so any language with an MCP SDK works:",[2784,3241,3242,3262,3268],{},[2787,3243,3244,3245,3159,3248,3251,3252,3255,3256,3259,3260,1869],{},"TypeScript or JavaScript in the plugin itself, with ",[1862,3246,3247],{},"runtime: node",[1862,3249,3250],{},"package.json",": the node installs its dependencies from your ",[1862,3253,3254],{},"package-lock.json"," and runs it on its own Node.js 24 LTS, TypeScript without a build step. ",[1862,3257,3258],{},"oz0 plugin new --template ts-tool"," writes one; see ",[1874,3261,722],{"href":723},[2787,3263,3264,3265,1869],{},"Publish it to npm and use ",[1862,3266,3267],{},"package: npm:\u003Cname>@\u003Cversion>",[2787,3269,3270,3271,3273],{},"Run it as a remote server and use ",[1862,3272,3028],{},". That works for Go, Rust or anything else.",[1855,3275,3276,3277,3280],{},"Building your own Go or binary code on the node, from the plugin's repository, is planned; the manifest's ",[1862,3278,3279],{},"runtime: go | binary"," values are there for it.",[1885,3282,3284],{"id":3283},"from-an-openapi-document","From an OpenAPI document",[1855,3286,3287,3288,3291,3292,1869],{},"An API with an OpenAPI 3.0 or 3.1 document needs no hand-written server: ",[1862,3289,3290],{},"oz0 plugin import openapi \u003Cfile|url> --name NAME --out DIR"," writes a plugin with one function per operation, marked read-only, writing or destructive from its HTTP method, calling only the API's host, with the API's key injected by the node. See ",[1874,3293,727],{"href":728},[1885,3295,3297],{"id":3296},"affinity-where-a-tool-runs","Affinity: where a tool runs",[3299,3300,3301,3319],"table",{},[3302,3303,3304],"thead",{},[3305,3306,3307,3313,3316],"tr",{},[3308,3309,3310],"th",{},[1862,3311,3312],{},"affinity",[3308,3314,3315],{},"Runs on",[3308,3317,3318],{},"Use for",[3320,3321,3322,3337],"tbody",{},[3305,3323,3324,3331,3334],{},[3325,3326,3327,3330],"td",{},[1862,3328,3329],{},"node"," (default)",[3325,3332,3333],{},"The job's home node",[3325,3335,3336],{},"Tools that touch the machine: files, devices, local models, local services",[3305,3338,3339,3344,3347],{},[3325,3340,3341],{},[1862,3342,3343],{},"any",[3325,3345,3346],{},"Any node that has the plugin",[3325,3348,3349],{},"Stateless tools: web fetchers, API clients",[1885,3351,3353],{"id":3352},"environment","Environment",[1855,3355,3356,3357,1912],{},"Tool processes get a minimal environment, not the runtime's, so they cannot read the node's local proxy tokens. Add variables with ",[1862,3358,3359],{},"env",[1893,3361,3363],{"className":1895,"code":3362,"language":1897,"meta":1898,"style":1898},"  - id: acme_github\n    mcp: [\"python\", \"-m\", \"acme_github.mcp\"]\n    env:\n      GITHUB_API_URL: https:\u002F\u002Fapi.github.com\n",[1862,3364,3365,3375,3407,3414],{"__ignoreMap":1898},[1881,3366,3367,3369,3371,3373],{"class":1903,"line":1904},[1881,3368,1938],{"class":1911},[1881,3370,1941],{"class":1907},[1881,3372,1912],{"class":1911},[1881,3374,1946],{"class":1915},[1881,3376,3377,3379,3381,3383,3385,3387,3389,3391,3393,3395,3397,3399,3401,3403,3405],{"class":1903,"line":1919},[1881,3378,1952],{"class":1907},[1881,3380,1912],{"class":1911},[1881,3382,1957],{"class":1911},[1881,3384,1960],{"class":1911},[1881,3386,1963],{"class":1915},[1881,3388,1960],{"class":1911},[1881,3390,1968],{"class":1911},[1881,3392,1971],{"class":1911},[1881,3394,1974],{"class":1915},[1881,3396,1960],{"class":1911},[1881,3398,1968],{"class":1911},[1881,3400,1971],{"class":1911},[1881,3402,1983],{"class":1915},[1881,3404,1960],{"class":1911},[1881,3406,1988],{"class":1911},[1881,3408,3409,3412],{"class":1903,"line":1928},[1881,3410,3411],{"class":1907},"    env",[1881,3413,1925],{"class":1911},[1881,3415,3416,3419,3421],{"class":1903,"line":1935},[1881,3417,3418],{"class":1907},"      GITHUB_API_URL",[1881,3420,1912],{"class":1911},[1881,3422,3423],{"class":1915}," https:\u002F\u002Fapi.github.com\n",[1855,3425,3426,3427,2125,3430,2125,3433,2125,3436,3439,3440,3443,3444,3447,3448,2129,3451,3454,3455,3458,3459,2125,3462,2125,3465,2140,3468,1869],{},"The dynamic loader's variables (",[1862,3428,3429],{},"LD_*",[1862,3431,3432],{},"DYLD_*",[1862,3434,3435],{},"GLIBC_TUNABLES",[1862,3437,3438],{},"GCONV_PATH","), ",[1862,3441,3442],{},"PATH"," and the node's own (",[1862,3445,3446],{},"OZ0_*",") cannot be set here, nor can a secret have those names, and ",[1862,3449,3450],{},"OPENAI_BASE_URL",[1862,3452,3453],{},"ANTHROPIC_BASE_URL"," cannot name the node's loopback: they would change what runs outside the sandbox or open the node's own ports to it. A tool that asks a model says ",[1862,3456,3457],{},"uses_model",", and the runtime gives it the address. A tool from an OCI image also cannot name what its container runtime reads on the host, such as ",[1862,3460,3461],{},"DOCKER_HOST",[1862,3463,3464],{},"CONTAINERS_CONF",[1862,3466,3467],{},"HOME",[1862,3469,3470],{},"XDG_*",[1855,3472,3473,3474,3476,3477,3479],{},"Secrets do not belong in ",[1862,3475,3359],{},". Declare them in ",[1862,3478,3036],{},", and the tool gets each one as an environment variable of the same name, from the tenant's secrets:",[1893,3481,3483],{"className":1895,"code":3482,"language":1897,"meta":1898,"style":1898},"requires:\n  secrets: [JEV_API_KEY]\n",[1862,3484,3485,3491],{"__ignoreMap":1898},[1881,3486,3487,3489],{"class":1903,"line":1904},[1881,3488,2179],{"class":1907},[1881,3490,1925],{"class":1911},[1881,3492,3493,3495,3497,3499,3502],{"class":1903,"line":1919},[1881,3494,2186],{"class":1907},[1881,3496,1912],{"class":1911},[1881,3498,1957],{"class":1911},[1881,3500,3501],{"class":1915},"JEV_API_KEY",[1881,3503,1988],{"class":1911},[1893,3505,3507],{"className":3184,"code":3506,"language":1963,"meta":1898,"style":1898},"import os\n\napi_key = os.environ[\"JEV_API_KEY\"]\n",[1862,3508,3509,3514,3518],{"__ignoreMap":1898},[1881,3510,3511],{"class":1903,"line":1904},[1881,3512,3513],{},"import os\n",[1881,3515,3516],{"class":1903,"line":1919},[1881,3517,1995],{"emptyLinePlaceholder":1994},[1881,3519,3520],{"class":1903,"line":1928},[1881,3521,3522],{},"api_key = os.environ[\"JEV_API_KEY\"]\n",[1855,3524,3525,3526,1869],{},"Only this plugin's processes get them, on the nodes that run it, and never from disk. See ",[1874,3527,3529],{"href":3528},"\u002Fadmin\u002Fsecrets\u002Fplugin-secrets#secrets-for-plugins","Secrets",[1885,3531,3533],{"id":3532},"related-tasks","Related tasks",[2784,3535,3536,3541,3546,3551,3556,3561],{},[2787,3537,3538,3540],{},[1874,3539,698],{"href":699},": Control what the model sees and document function behaviour.",[2787,3542,3543,3545],{},[1874,3544,702],{"href":703},": Fit results to a model budget and pass large data between tools.",[2787,3547,3548,3550],{},[1874,3549,706],{"href":707},": Handle cancellation, timeouts, idempotency and a busy service.",[2787,3552,3553,3555],{},[1874,3554,710],{"href":711},": Verify tool snapshots and publish a measured function listing.",[2787,3557,3558,3560],{},[1874,3559,714],{"href":715},": Use sampling or a gateway token and report outside service cost.",[2787,3562,3563,3565],{},[1874,3564,718],{"href":719},": Carry labels and argument origins through tool policy checks.",[3567,3568,3569],"legacy-sections",{},[2784,3570,3571,3582,3590,3599,3608,3617,3625,3634,3643,3652,3661,3670,3678,3687,3696,3705,3713,3722,3731,3740,3749,3758,3767],{},[2787,3572,3573,3577,3578],{},[1881,3574,3576],{"id":3575},"a-gateway-token-for-what-sampling-cannot-express","Section",": ",[1874,3579,3581],{"href":3580},"\u002Fbuild\u002Fparts\u002Ftools\u002Fmodel-calls#a-gateway-token-for-what-sampling-cannot-express","a gateway token for what sampling cannot express",[2787,3583,3584,3577,3587],{},[1881,3585,3576],{"id":3586},"approvals",[1874,3588,3586],{"href":3589},"\u002Fbuild\u002Fparts\u002Ftools\u002Fpolicy#approvals",[2787,3591,3592,3577,3595],{},[1881,3593,3576],{"id":3594},"cancels-time-limits-and-the-idempotency-key",[1874,3596,3598],{"href":3597},"\u002Fbuild\u002Fparts\u002Ftools\u002Fcall-lifecycle#cancels-time-limits-and-the-idempotency-key","cancels time limits and the idempotency key",[2787,3600,3601,3577,3604],{},[1881,3602,3576],{"id":3603},"files-between-tools",[1874,3605,3607],{"href":3606},"\u002Fbuild\u002Fparts\u002Ftools\u002Fresults-and-files#files-between-tools","files between tools",[2787,3609,3610,3577,3613],{},[1881,3611,3576],{"id":3612},"its-manual",[1874,3614,3616],{"href":3615},"\u002Fbuild\u002Fparts\u002Ftools\u002Fdefinitions#its-manual","its manual",[2787,3618,3619,3577,3622],{},[1881,3620,3576],{"id":3621},"labels",[1874,3623,3621],{"href":3624},"\u002Fbuild\u002Fparts\u002Ftools\u002Fpolicy#labels",[2787,3626,3627,3577,3630],{},[1881,3628,3576],{"id":3629},"large-results",[1874,3631,3633],{"href":3632},"\u002Fbuild\u002Fparts\u002Ftools\u002Fresults-and-files#large-results","large results",[2787,3635,3636,3577,3639],{},[1881,3637,3576],{"id":3638},"mcp-sampling",[1874,3640,3642],{"href":3641},"\u002Fbuild\u002Fparts\u002Ftools\u002Fmodel-calls#mcp-sampling","mcp sampling",[2787,3644,3645,3577,3648],{},[1881,3646,3576],{"id":3647},"progress-and-retries-that-resume",[1874,3649,3651],{"href":3650},"\u002Fbuild\u002Fparts\u002Ftools\u002Fcall-lifecycle#progress-and-retries-that-resume","progress and retries that resume",[2787,3653,3654,3577,3657],{},[1881,3655,3576],{"id":3656},"remote-endpoints-are-pinned",[1874,3658,3660],{"href":3659},"\u002Fbuild\u002Fparts\u002Ftools\u002Fsnapshots#remote-endpoints-are-pinned","remote endpoints are pinned",[2787,3662,3663,3577,3666],{},[1881,3664,3576],{"id":3665},"report-a-busy-service-never-retry-it",[1874,3667,3669],{"href":3668},"\u002Fbuild\u002Fparts\u002Ftools\u002Fcall-lifecycle#report-a-busy-service-never-retry-it","report a busy service never retry it",[2787,3671,3672,3577,3675],{},[1881,3673,3576],{"id":3674},"report-what-your-own-services-cost",[1874,3676,3677],{"href":2898},"report what your own services cost",[2787,3679,3680,3577,3683],{},[1881,3681,3576],{"id":3682},"results-that-fit-a-budget",[1874,3684,3686],{"href":3685},"\u002Fbuild\u002Fparts\u002Ftools\u002Fresults-and-files#results-that-fit-a-budget","results that fit a budget",[2787,3688,3689,3577,3692],{},[1881,3690,3576],{"id":3691},"retry-safe-functions",[1874,3693,3695],{"href":3694},"\u002Fbuild\u002Fparts\u002Ftools\u002Fdefinitions#retry-safe-functions","retry safe functions",[2787,3697,3698,3577,3701],{},[1881,3699,3576],{"id":3700},"say-what-a-tool-does",[1874,3702,3704],{"href":3703},"\u002Fbuild\u002Fparts\u002Ftools\u002Fdefinitions#say-what-a-tool-does","say what a tool does",[2787,3706,3707,3577,3710],{},[1881,3708,3576],{"id":3709},"snapshots-a-tool-may-not-change-what-it-says-it-does",[1874,3711,3712],{"href":2806},"snapshots a tool may not change what it says it does",[2787,3714,3715,3577,3718],{},[1881,3716,3576],{"id":3717},"the-measured-listing",[1874,3719,3721],{"href":3720},"\u002Fbuild\u002Fparts\u002Ftools\u002Fsnapshots#the-measured-listing","the measured listing",[2787,3723,3724,3577,3727],{},[1881,3725,3576],{"id":3726},"the-size-budget",[1874,3728,3730],{"href":3729},"\u002Fbuild\u002Fparts\u002Ftools\u002Fdefinitions#the-size-budget","the size budget",[2787,3732,3733,3577,3736],{},[1881,3734,3576],{"id":3735},"tools-that-need-a-model",[1874,3737,3739],{"href":3738},"\u002Fbuild\u002Fparts\u002Ftools\u002Fmodel-calls#tools-that-need-a-model","tools that need a model",[2787,3741,3742,3577,3745],{},[1881,3743,3576],{"id":3744},"what-a-definition-costs",[1874,3746,3748],{"href":3747},"\u002Fbuild\u002Fparts\u002Ftools\u002Fdefinitions#what-a-definition-costs","what a definition costs",[2787,3750,3751,3577,3754],{},[1881,3752,3576],{"id":3753},"what-the-model-sees",[1874,3755,3757],{"href":3756},"\u002Fbuild\u002Fparts\u002Ftools\u002Fdefinitions#what-the-model-sees","what the model sees",[2787,3759,3760,3577,3763],{},[1881,3761,3576],{"id":3762},"what-the-snapshot-shows",[1874,3764,3766],{"href":3765},"\u002Fbuild\u002Fparts\u002Ftools\u002Fsnapshots#what-the-snapshot-shows","what the snapshot shows",[2787,3768,3769,3577,3772],{},[1881,3770,3576],{"id":3771},"where-arguments-came-from",[1874,3773,3775],{"href":3774},"\u002Fbuild\u002Fparts\u002Ftools\u002Fpolicy#where-arguments-came-from","where arguments came from",[3777,3778,3779],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":1898,"searchDepth":1919,"depth":1919,"links":3781},[3782,3788,3789,3790,3791,3792,3793],{"id":1887,"depth":1919,"text":1888,"children":3783},[3784,3785,3786,3787],{"id":2107,"depth":1928,"text":2108},{"id":2165,"depth":1928,"text":2166},{"id":2331,"depth":1928,"text":2332},{"id":2918,"depth":1928,"text":2919},{"id":3151,"depth":1919,"text":3152},{"id":3235,"depth":1919,"text":3236},{"id":3283,"depth":1919,"text":3284},{"id":3296,"depth":1919,"text":3297},{"id":3352,"depth":1919,"text":3353},{"id":3532,"depth":1919,"text":3533},"Expose functions through an MCP server or a flow.","md",null,{"audience":3798,"doc_type":3799},"plugin authors","how-to",{"icon":696},{"title":691,"description":3794},"F1zQHY7uk9aWkLTqZDyGKCv8o8K98-mpzGEaYfP7nIA",[3804,3806],{"title":687,"path":688,"stem":689,"description":3805,"icon":646,"children":-1},"Reserve spending before calls and configure budget exhaustion behaviour.",{"title":698,"path":699,"stem":700,"description":3807,"icon":696,"children":-1},"Control what the model sees and document function behaviour.",1794442973581]