Register typed Python functions as governed tools over an outbound-only worker connection.
Workers keep database and API access inside your infrastructure. They make
outbound HTTPS requests to AIR; you do not expose an inbound worker port.
1
Install the SDK
python -m pip install papermap-air
2
Declare a typed tool
Create tools.py:
from air import tool@tool(timeout=30)def lookup_order(order_id: str, context: dict) -> dict: """Look up an order for the current tenant.""" tenant_id = context["tenant_id"] # Query your system and verify the order belongs to tenant_id. return { "order_id": order_id, "tenant_id": tenant_id, "status": "shipped", }
Type annotations become the JSON input schema. The first docstring line is
the description shown during review. Every tool must return a dictionary.
3
Issue a worker key
Open Settings, select Issue worker key, and store the value in an
environment variable or secret manager.
Worker credentials are separate from application credentials.
The process registers its manifest and begins long-polling for tool calls.
5
Review the discovered tool
Open Tools. A newly discovered capability starts awaiting approval;
registration never grants permission by itself.
AIR has discovered one worker tool but no agent can call it yet.
6
Inspect and enable it
Select Review. Confirm the source, description, timeout, generated input
schema, and whether it needs write access. Then select Enable tool.
Review the generated schema and explicitly grant write capability only when required.
7
Allow it on an agent version
Create a new agent version, open Advanced — fallback models, tools, and
limits, add lookup_order, test the version, and activate it. Enabling a
project tool does not automatically add it to existing agent versions.
Registration answers “what can this worker do?” Tool approval answers “does
this project trust it?” The agent version answers “may this agent call it?”
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Papermap","colors":{"primary":"#16A34A","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/papermap/8hXnlJ8qeTMpHWXU/logo/light.png?fit=max\u0026auto=format\u0026n=8hXnlJ8qeTMpHWXU\u0026q=85\u0026s=a982bbb381d342be222ed1a362cb948b","dark":"https://mintcdn.com/papermap/8hXnlJ8qeTMpHWXU/logo/dark.png?fit=max\u0026auto=format\u0026n=8hXnlJ8qeTMpHWXU\u0026q=85\u0026s=5f67486055f4d67be5e4fd9716fe98c8"},"favicon":"https://mintcdn.com/papermap/U6wjzYF3zubg06mn/favicon.ico?fit=max\u0026auto=format\u0026n=U6wjzYF3zubg06mn\u0026q=85\u0026s=5ed2d4f8cb3791772fabccfff5a3e763","navbar":{"links":[{"href":"https://calendly.com/admin-pappermap/30min","label":"Support"}],"primary":{"type":"button","label":"Workspaces","href":"https://www.papermap.ai/auth/login"}},"footer":{"socials":{"x":"https://x.com/PapermapAI","instagram":"https://www.instagram.com/papermap.ai","linkedin":"https://www.linkedin.com/company/papermap"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Your Workspaces","icon":"book-open-cover","href":"https://www.papermap.ai/auth/login"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"papermap","hasAudioNarration":false,"actualSubdomain":"papermap","customDomains":["docs.papermap.ai"],"gitSource":{"type":"github","owner":"papermap-ai","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6a5ab602cc82a0c5133c1b29","collectionId":"a21f9324-e069-46af-b751-f3b5ca51faea","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6a5ab602cc82a0c5133c1b29"},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6a5ab602cc82a0c5133c1b29:success","clientVersion":"0.0.3926","searchFilterCounts":[{"language":"default","tag":"Documentation","count":26},{"language":"default","tag":"AIR","count":13},{"language":"default","tag":"Multi-Tenancy","count":11},{"language":"default","tag":"Embedding","count":8},{"language":"default","tag":"Terminal UI","count":7},{"language":"default","tag":"Start here","count":4},{"language":"default","tag":"Features","count":4},{"language":"default","tag":"API Reference","count":4},{"language":"default","tag":"Connect private tools","count":3},{"language":"default","tag":"Build agents and apps","count":2}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"air/workers/create-worker","slug":"/air/workers/create-worker","pageMetadata":{"title":"Create a private worker","sidebarTitle":"Create a worker","description":"Register typed Python functions as governed tools over an outbound-only worker connection.","icon":"server","href":"/air/workers/create-worker"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Register typed Python functions as governed tools over an outbound-only worker connection.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,Frame,Note,OptimizedImage,Step,Steps}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Workers keep database and API access inside your infrastructure. They make\noutbound HTTPS requests to AIR; you do not expose an inbound worker port.`}),`\n`,_jsxs(Steps,{titleSize:`h2`,children:[_jsx(Step,{title:`Install the SDK`,id:`install-the-sdk`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`python`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -m`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` pip`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` install`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` papermap-air`})]}),`\n`]})})})}),_jsxs(Step,{title:`Declare a typed tool`,id:`declare-a-typed-tool`,children:[_jsxs(_components.p,{children:[`Create `,_jsx(_components.code,{children:`tools.py`}),`:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`14`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`14`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` air `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` tool`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`@tool`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`timeout`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`30`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` lookup_order`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`order_id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`context`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`dict`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`dict`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"\"\"Look up an order for the current tenant.\"\"\"`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` tenant_id `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` context[`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"tenant_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Query your system and verify the order belongs to tenant_id.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"order_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: order_id,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"tenant_id\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: tenant_id,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"status\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"shipped\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`]})})}),_jsx(_components.p,{children:`Type annotations become the JSON input schema. The first docstring line is\nthe description shown during review. Every tool must return a dictionary.`})]}),_jsxs(Step,{title:`Issue a worker key`,id:`issue-a-worker-key`,children:[_jsxs(_components.p,{children:[`Open `,_jsx(_components.strong,{children:`Settings`}),`, select `,_jsx(_components.strong,{children:`Issue worker key`}),`, and store the value in an\nenvironment variable or secret manager.`]}),_jsx(Frame,{caption:`Worker credentials are separate from application credentials.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/project-keys.png?fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=3ad49dcce41c9d8e1ba75fbda5fa6d85`,alt:`AIR settings showing separate app and worker key controls`,\"data-og-width\":`2880`,width:`2880`,\"data-og-height\":`1800`,height:`1800`,\"data-path\":`air/images/project-keys.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/project-keys.png?w=280\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=93716428ad529706a37afd0a4cf06f36 280w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/project-keys.png?w=560\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=e09118038a610286b0d9991216a89fd1 560w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/project-keys.png?w=840\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=98b7bffd36aebc77f803d709cd2a2ed9 840w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/project-keys.png?w=1100\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=c392ecbdc956b22ce02e6729928b0925 1100w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/project-keys.png?w=1650\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=cc68fd41d5e02ebc9dd108e20a48febc 1650w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/project-keys.png?w=2500\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=c5bc2119819e8cc15c36c7592d72b460 2500w`})})]}),_jsxs(Step,{title:`Start the worker`,id:`start-the-worker`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` AIR_BASE_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://dev.airapi.papermap.ai\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` AIR_WORKER_KEY`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"\u003cyour-worker-key>\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` AIR_WORKER_ENV`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"staging\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`air`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` worker`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` start`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --module`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` tools`})]}),`\n`]})})}),_jsx(_components.p,{children:`The process registers its manifest and begins long-polling for tool calls.`})]}),_jsxs(Step,{title:`Review the discovered tool`,id:`review-the-discovered-tool`,children:[_jsxs(_components.p,{children:[`Open `,_jsx(_components.strong,{children:`Tools`}),`. A newly discovered capability starts `,_jsx(_components.strong,{children:`awaiting approval`}),`;\nregistration never grants permission by itself.`]}),_jsx(Frame,{caption:`AIR has discovered one worker tool but no agent can call it yet.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/pending-tool.png?fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=97c1d6ff4df604774baa2f43e5b76217`,alt:`AIR Tools screen showing lookup_order awaiting approval`,\"data-og-width\":`2880`,width:`2880`,\"data-og-height\":`1800`,height:`1800`,\"data-path\":`air/images/pending-tool.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/pending-tool.png?w=280\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=5636ac7ced1ccbbd57f1c945b7e4de63 280w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/pending-tool.png?w=560\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=ebed384bd8807d6dfc78b20486b57ccd 560w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/pending-tool.png?w=840\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=4ee9e2c18b9d12ddaf81f2a76410e726 840w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/pending-tool.png?w=1100\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=75b9d02c82f6c51ab9887b58809cb499 1100w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/pending-tool.png?w=1650\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=3e81fbca6aa57e0faefb06464846eb12 1650w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/pending-tool.png?w=2500\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=d4e944f6ff2ebf12a9005eb351a6edca 2500w`})})]}),_jsxs(Step,{title:`Inspect and enable it`,id:`inspect-and-enable-it`,children:[_jsxs(_components.p,{children:[`Select `,_jsx(_components.strong,{children:`Review`}),`. Confirm the source, description, timeout, generated input\nschema, and whether it needs write access. Then select `,_jsx(_components.strong,{children:`Enable tool`}),`.`]}),_jsx(Frame,{caption:`Review the generated schema and explicitly grant write capability only when required.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/approve-tool.png?fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=480fa2c146f0efe5a0e0e0c593f05654`,alt:`AIR tool review dialog showing lookup_order schema and read-only approval`,\"data-og-width\":`2880`,width:`2880`,\"data-og-height\":`1800`,height:`1800`,\"data-path\":`air/images/approve-tool.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/approve-tool.png?w=280\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=f46eed0d01109e879c620dd19e1a0bea 280w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/approve-tool.png?w=560\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=87c383d5fcdab54ca0ed59a55d0d77c9 560w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/approve-tool.png?w=840\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=f9dadf3bf3c9b3095bffcba536f8a912 840w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/approve-tool.png?w=1100\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=16d26c95a32bdc15275d78bf2a5457a2 1100w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/approve-tool.png?w=1650\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=10bb0e87f23efd10ace15e952b5c4ab0 1650w, https://mintcdn.com/papermap/6FYSF5TTvsKzeVI6/air/images/approve-tool.png?w=2500\u0026fit=max\u0026auto=format\u0026n=6FYSF5TTvsKzeVI6\u0026q=85\u0026s=49e1e04ecb88296486f12d295ac65b3a 2500w`})})]}),_jsx(Step,{title:`Allow it on an agent version`,id:`allow-it-on-an-agent-version`,children:_jsxs(_components.p,{children:[`Create a new agent version, open `,_jsx(_components.strong,{children:`Advanced — fallback models, tools, and\nlimits`}),`, add `,_jsx(_components.code,{children:`lookup_order`}),`, test the version, and activate it. Enabling a\nproject tool does not automatically add it to existing agent versions.`]})})]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Registration answers “what can this worker do?” Tool approval answers “does\nthis project trust it?” The agent version answers “may this agent call it?”`})})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create a private worker","sidebarTitle":"Create a worker","description":"Register typed Python functions as governed tools over an outbound-only worker connection.","icon":"server","href":"/air/workers/create-worker"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Install the SDK","slug":"install-the-sdk","depth":2,"children":[]},{"title":"Declare a typed tool","slug":"declare-a-typed-tool","depth":2,"children":[]},{"title":"Issue a worker key","slug":"issue-a-worker-key","depth":2,"children":[]},{"title":"Start the worker","slug":"start-the-worker","depth":2,"children":[]},{"title":"Review the discovered tool","slug":"review-the-discovered-tool","depth":2,"children":[]},{"title":"Inspect and enable it","slug":"inspect-and-enable-it","depth":2,"children":[]},{"title":"Allow it on an agent version","slug":"allow-it-on-an-agent-version","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"papermap","siteName":"Papermap","title":"Create a private worker - Papermap","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-07-12T22:05:57.653Z","originalFileLocation":"air/workers/create-worker.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Register typed Python functions as governed tools over an outbound-only worker connection.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Papermap\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/papermap/FPEoIUb7lWB8Iajh/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/papermap/FPEoIUb7lWB8Iajh/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/papermap/FPEoIUb7lWB8Iajh/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/papermap/FPEoIUb7lWB8Iajh/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/papermap/FPEoIUb7lWB8Iajh/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/papermap/FPEoIUb7lWB8Iajh/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/papermap/FPEoIUb7lWB8Iajh/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/papermap/FPEoIUb7lWB8Iajh/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/papermap/FPEoIUb7lWB8Iajh/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create a private worker - Papermap\">\u003cmeta data-mint-head property=\"og:description\" content=\"Register typed Python functions as governed tools over an outbound-only worker connection.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Papermap\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.papermap.ai/air/workers/create-worker\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://papermap.mintlify.app/_mintlify/api/og/v2?division=Connect+private+tools\u0026amp;title=Create+a+private+worker\u0026amp;description=Register+typed+Python+functions+as+governed+tools+over+an+outbound-only+worker+connection.\u0026amp;theme=a7e1f4a409916cd117b22aae\u0026amp;signature=69812c96a8a7f1431a80c8072ecdb2c6021c48cfa99c7ff60764638088077dcb\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create a private worker - Papermap\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Register typed Python functions as governed tools over an outbound-only worker connection.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://papermap.mintlify.app/_mintlify/api/og/v2?division=Connect+private+tools\u0026amp;title=Create+a+private+worker\u0026amp;description=Register+typed+Python+functions+as+governed+tools+over+an+outbound-only+worker+connection.\u0026amp;theme=a7e1f4a409916cd117b22aae\u0026amp;signature=69812c96a8a7f1431a80c8072ecdb2c6021c48cfa99c7ff60764638088077dcb\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/papermap/FPEoIUb7lWB8Iajh/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Papermap\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#16A34A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.papermap.ai/air/workers/create-worker\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/air/workers/create-worker.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.papermap.ai/#organization\",\"name\":\"Papermap\",\"url\":\"https://docs.papermap.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/papermap/8hXnlJ8qeTMpHWXU/logo/light.png?fit=max\u0026auto=format\u0026n=8hXnlJ8qeTMpHWXU\u0026q=85\u0026s=a982bbb381d342be222ed1a362cb948b\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.papermap.ai#website\",\"name\":\"Papermap\",\"url\":\"https://docs.papermap.ai\",\"publisher\":{\"@id\":\"https://docs.papermap.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.papermap.ai/air/workers/create-worker#webpage\",\"url\":\"https://docs.papermap.ai/air/workers/create-worker\",\"name\":\"Create a private worker\",\"description\":\"Register typed Python functions as governed tools over an outbound-only worker connection.\",\"dateModified\":\"2026-07-12T22:05:57.653Z\",\"isPartOf\":{\"@id\":\"https://docs.papermap.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.papermap.ai/air/workers/create-worker#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.papermap.ai/air/workers/create-worker#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Papermap\",\"item\":\"https://docs.papermap.ai\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create a private worker\",\"item\":\"https://docs.papermap.ai/air/workers/create-worker\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.papermap.ai/air/workers/create-worker#article\",\"headline\":\"Create a private worker\",\"name\":\"Create a private worker\",\"description\":\"Register typed Python functions as governed tools over an outbound-only worker connection.\",\"url\":\"https://docs.papermap.ai/air/workers/create-worker\",\"mainEntityOfPage\":{\"@id\":\"https://docs.papermap.ai/air/workers/create-worker#webpage\"},\"dateModified\":\"2026-07-12T22:05:57.653Z\",\"publisher\":{\"@id\":\"https://docs.papermap.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.papermap.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Papermap\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Papermap","nav":{"global":{"anchors":[{"anchor":"Your Workspaces","icon":"book-open-cover","href":"https://www.papermap.ai/auth/login"}]},"tabs":[{"tab":"Documentation","icon":"book","pages":[{"title":"Documentation","href":""}]},{"tab":"AIR","icon":"send","groups":[{"group":"Start here","pages":[{"title":"Papermap AIR","icon":"bot","href":"/air"},{"title":"Visual quickstart","sidebarTitle":"Quickstart","icon":"rocket","href":"/air/quickstart"},{"title":"How AIR works","icon":"diagram-project","href":"/air/concepts/how-air-works"},{"title":"Projects and keys","icon":"key","href":"/air/concepts/projects-and-keys"}]},{"group":"Build agents and apps","pages":[{"title":"Create and version an agent","sidebarTitle":"Create an agent","icon":"bot","href":"/air/agents/create-agent"},{"title":"Create and manage runs","sidebarTitle":"Create runs","description":"Start, stream, inspect, wait for, and cancel AIR runs from an application.","icon":"play","href":"/air/applications/create-runs"}]},{"group":"Connect private tools","pages":[{"title":"Create a private worker","sidebarTitle":"Create a worker","icon":"server","href":"/air/workers/create-worker"},{"title":"Deploy a worker","description":"Package and operate AIR workers safely in containers and Kubernetes.","icon":"container-storage","href":"/air/workers/deploy-worker"},{"title":"Connect MCP tools","icon":"plug","href":"/air/workers/mcp"}]},{"group":"Operate safely","pages":[{"title":"Security","icon":"shield-check","href":"/air/guides/security"},{"title":"Troubleshooting","icon":"wrench","href":"/air/guides/troubleshooting"}]},{"group":"SDK reference","pages":[{"title":"Python SDK","icon":"python","href":"/air/reference/python-sdk"},{"title":"Environment variables","icon":"rectangle-terminal","href":"/air/reference/environment-variables"}]}]},{"tab":"Features","icon":"sparkles","pages":[{"title":"Features","href":"/features/overview"}]},{"tab":"API Reference","icon":"code","pages":[{"title":"API Reference","href":"/api-reference/generate-embed-token"}]},{"tab":"Changelog","icon":"list","pages":[{"title":"Changelog","href":"/changelog/release-notes"}]}]},"title":"Create a private worker - Papermap","buildId":"dpl_9DauxEjb9gzCtcuhPQFbquJvx7FJ","deploymentId":"dpl_9DauxEjb9gzCtcuhPQFbquJvx7FJ","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-DpBmNN95.js","DynamicMarkdown-BY_qDhTn.js","zoom-image-lightbox-D4WcYaf4.js","PlusIcon-CwhPVjTe.js","lightbox-handle-r17bVUz3.js"]}