Run typed Python logic in an isolated tool environment.
Create a Custom Code tool for calculations and data processing that do not need
network access. The Python input and output models become the tool contract the
agent sees.
A deterministic Python task that can run without an internet connection.
Vault secrets for any sensitive values the code needs.
1
Create the draft
Dashboard
API
Go to Global Tools, choose New tool, then select Custom Code.
Enter a precise tool name and Instructions. Instructions maps to
the API description field.
Define a Pydantic Input model, an Output model, and a synchronous
handler(input: Input) -> Output function. Add field descriptions so the
model knows which values to supply.Return the declared output model. Keep logs useful for testing, but return
the data the agent needs from the handler.
3
Add dependencies and secrets
List each dependency as an exact version such as pydantic==2.11.7.
Packages with URLs, environment markers, or extras are rejected.Declare Vault secret names separately from the source. Do not place secret
values in code or logs. The environment exposes only the declared secrets.
Dashboard
API
Expand Metadata, select the Vault secrets the tool can access, and
enter the pinned packages in Dependencies.
Configure Vault secrets and Python dependencies
Add the allowed Vault secret names to declared_secrets and the pinned
packages to dependencies in the tool request.
4
Build the tool
Dashboard
API
Save the draft, then choose Build tool.
Build the tool after defining its code and metadata
Save the draft, then send
POST /v1/agents/tools/{tool_id}/introspect.
The build installs the pinned dependencies, imports the declared modules,
and derives the argument schema from the Pydantic models.
5
Test and publish
Run representative input, check the structured output and logs, then
publish. You must have a valid schema, available secrets and dependencies,
and a successful run for the current draft.
Custom Code runs in an isolated environment with no internet access. Use an
API Request tool or
MCP server for network calls.
Avoid unbounded loops, large payloads, and large output objects. A run that
exceeds its time or data limit returns a failure instead of partial output.Code tools can run on call start, first user message, and tool success or
failure. They cannot run on call end. See
Run a tool on call events.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"SLNG: the execution layer for voice - SLNG Documentation","colors":{"primary":"#fbe566","light":"#fbe566","dark":"#000000"},"logo":{"light":"https://mintcdn.com/slng-new-docs/7nMVrKvzTWYOIRbj/images/icon.svg?fit=max\u0026auto=format\u0026n=7nMVrKvzTWYOIRbj\u0026q=85\u0026s=eaa03df4481524b3edce26325e7106a6","dark":"https://mintcdn.com/slng-new-docs/7nMVrKvzTWYOIRbj/images/icon.svg?fit=max\u0026auto=format\u0026n=7nMVrKvzTWYOIRbj\u0026q=85\u0026s=eaa03df4481524b3edce26325e7106a6"},"favicon":{"light":"https://mintcdn.com/slng-new-docs/7nMVrKvzTWYOIRbj/images/icon.svg?fit=max\u0026auto=format\u0026n=7nMVrKvzTWYOIRbj\u0026q=85\u0026s=eaa03df4481524b3edce26325e7106a6","dark":"https://mintcdn.com/slng-new-docs/7nMVrKvzTWYOIRbj/images/icon.svg?fit=max\u0026auto=format\u0026n=7nMVrKvzTWYOIRbj\u0026q=85\u0026s=eaa03df4481524b3edce26325e7106a6"},"background":{"color":{"light":"#ffffff"}},"navbar":{"links":[{"href":"mailto:support@slng.ai","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.slng.ai"}},"footer":{"socials":{"x":"https://x.com/slng_ai","github":"https://github.com/slng-ai","linkedin":"https://linkedin.com/company/slng-ai","discord":"https://discord.gg/kxZactmWj"},"links":[{"header":"Company","items":[{"label":"Team","href":"/team"}]}]},"fonts":{"heading":{"family":"Geist Mono"}},"icons":{"library":"lucide"},"integrations":{"gtm":{"tagId":"GTM-W2STKL7Z"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"slng-new-docs","hasAudioNarration":false,"actualSubdomain":"slng-new-docs","customDomains":["docs.slng.ai"],"gitSource":{"type":"github","owner":"slng-ai","repo":"documentation","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ad773c56e89f16d0373f26f","collectionId":"3e12ce44-97d1-4c8d-8302-6faacc32eba8","liveDeploymentHistoryId":"6ad773c56e89f16d0373f26f","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ad773c56e89f16d0373f26f","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"API Reference","count":158},{"language":"default","tag":"Agents","count":66},{"language":"default","tag":"Guides","count":52},{"language":"default","tag":"Third party","count":27},{"language":"default","tag":"Text to speech","count":27},{"language":"default","tag":"Agent Builder","count":25},{"language":"default","tag":"Models","count":24},{"language":"default","tag":"Speech to text","count":19},{"language":"default","tag":"Tools","count":14},{"language":"default","tag":"SLNG hosted","count":13}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"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":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"@keyframes lp-marquee-scroll{0%{transform:translateX(0)}to{transform:translateX(-50%)}}@keyframes hosting-banner-arrow-bounce{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}:root{--color-brand:#FBE566;--color-brand-10:rgba(251, 229, 102, 0.1);--color-brand-15:rgba(251, 229, 102, 0.15);--color-text-dark:#15120D;--color-text-light:#FBFAF7;--surface:#ffffff;--surface-border:#e2e8f0;--surface-border-hover:#cbd5e1;--surface-shadow:rgba(0, 0, 0, 0.06);--surface-hover:var(--color-brand-10);--text-primary:var(--color-text-dark);--text-body:#374151;--text-strong:#1f2937;--text-secondary:#6b7280;--text-muted:#9ca3af;--pill-bg:#f3f4f6;--pill-text:#374151;--badge-stt-bg:#e8e0ff;--badge-stt-text:#6b4fbb;--badge-tts-bg:#dbeafe;--badge-tts-text:#2563eb}.dark{--surface:#1a1a1a;--surface-border:#2d2d2d;--surface-border-hover:#444444;--surface-shadow:rgba(0, 0, 0, 0.3);--surface-hover:var(--color-brand-15);--text-primary:var(--color-text-light);--text-body:#d1d5db;--text-strong:#d1d5db;--text-secondary:#9ca3af;--text-muted:#6b7280;--pill-bg:#374151;--pill-text:#d1d5db;--badge-stt-bg:rgba(107, 79, 187, 0.25);--badge-stt-text:#c4b5fd;--badge-tts-bg:rgba(37, 99, 235, 0.25);--badge-tts-text:#93c5fd}.hosting-slng{display:inline-block;padding:.05rem .4rem;border-radius:4px;background:var(--color-brand);color:var(--color-text-dark);font-size:.8em;font-weight:600}.model-card__flag,.region-flag{display:inline-block;width:1em;height:1em;flex-shrink:0;border-radius:50%;background-position:center;background-size:cover}.region-flag{margin-right:.3rem;vertical-align:-.15em}.region-item{white-space:nowrap}.model-card__flag{width:1.15rem;height:1.15rem}:root:not(.dark) li[role=tab][aria-selected=true]{background-color:var(--color-brand);border-radius:.375rem .375rem 0 0;margin-bottom:-1px;padding:0 .5rem;border-bottom:1px solid var(--color-brand)}:root:not(.dark) li[role=tab][aria-selected=true] [data-component-part=tab-button]{color:var(--color-text-dark)!important;border-color:transparent!important}:root:not(.dark) li[role=tab][aria-selected=true] [data-component-part=tab-button] svg{background-color:var(--color-text-dark)!important}:root:not(.dark) li[role=tab]:not([aria-selected=true]) [data-component-part=tab-button]:hover{border-color:var(--color-brand)!important}#navigation-items a:hover,#navigation-items a[class*=bg-primary]{color:var(--color-text-dark);background-color:var(--color-brand)}#navigation-items a:hover svg,#navigation-items a[class*=bg-primary] svg{background-color:var(--color-text-dark)!important}#navigation-items button:has(>img),.sidebar-group-header:has(>img){align-items:center!important}.eyebrow{display:inline-flex;align-items:center;width:fit-content;height:auto!important;padding:.125rem .5rem;margin-bottom:.5rem;border-radius:.375rem;background-color:var(--color-brand);color:var(--color-text-dark);text-transform:uppercase;letter-spacing:.05em}.dark .eyebrow{color:#000}.toc-item a[class*=text-primary]{background-color:transparent;color:var(--color-text-dark);text-decoration:underline;text-decoration-color:var(--color-brand);text-decoration-thickness:2px;text-underline-offset:3px}.dark .toc-item a[class*=text-primary]{color:var(--color-text-light);text-decoration-color:var(--color-brand)}[data-component-part=field-info-pill]{word-break:normal;overflow-wrap:break-word}.dark .group:hover [data-component-part=card-cta] button,:root:not(.dark) .group:hover [data-component-part=card-cta] button{color:inherit!important;text-decoration:underline;text-decoration-color:var(--color-brand);text-decoration-thickness:2px;text-underline-offset:3px}:root:not(.dark) [data-component-part=field-name][class*=text-primary],:root:not(.dark) [role=menuitem][class*=text-primary],:root:not(.dark) button[aria-haspopup=menu][class*=text-primary],:root:not(.dark) button[role=tab][aria-selected=true][class*=text-primary]{color:var(--color-text-dark)}:root:not(.dark) [role=menuitem][class*=text-primary][class*=font-medium]{text-decoration:underline;text-decoration-color:var(--color-brand);text-decoration-thickness:2px;text-underline-offset:3px}:root:not(.dark) [role=menuitem][class*=text-primary]:hover,:root:not(.dark) button[role=tab] [class*=peer\\/title]:hover{color:var(--color-text-dark)!important}:root:not(.dark) button[aria-haspopup=menu] [class*=hover\\:text-primary]:hover{color:var(--color-text-dark)!important;background-color:var(--color-brand-10)}.dark button[aria-haspopup=menu] [class*=hover\\:text-primary]:hover{color:var(--color-brand)!important}:root:not(.dark) [data-component-part=code-block-root] .line-highlight{background:rgba(251,229,102,.35)!important}.audio-player{display:flex;flex-direction:column;gap:.5rem;padding:.9rem 1rem;border-radius:12px;border:1px solid var(--surface-border);background:var(--surface)}.audio-player.compact{padding:0;border:0;background:0 0;gap:0}.audio-player .meta{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.audio-player .titles{display:flex;flex-direction:column;gap:.15rem}.audio-player .title{font-weight:600;color:var(--text-primary)}.audio-player .description{color:var(--text-secondary);font-size:.9rem}.audio-player .download{font-size:.85rem;color:var(--text-primary);text-decoration:none;font-weight:600;white-space:nowrap}.audio-player .download:hover{text-decoration:underline;text-decoration-color:var(--color-brand);text-underline-offset:3px;text-decoration-thickness:2px}.audio-player .audio-control{width:100%}.audio-player .controls{display:flex;align-items:center;gap:.6rem}.audio-player .play-button{width:36px;height:36px;border-radius:999px;border:0;background:var(--color-brand);color:var(--color-text-dark);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;padding:0}.audio-player .play-button:hover{filter:brightness(.95)}.audio-player .play-button:focus-visible,.audio-player .scrubber:focus-visible{outline:2px solid var(--color-brand);outline-offset:2px}.audio-player .time{font-size:.8rem;font-variant-numeric:tabular-nums;color:var(--text-secondary);min-width:2.75rem;text-align:center;flex-shrink:0}.audio-player .scrubber{-webkit-appearance:none;appearance:none;flex:1;height:6px;border-radius:999px;cursor:pointer;background:linear-gradient(to right,var(--color-brand) var(--progress, 0%),var(--surface-border) var(--progress, 0%))}.audio-player .scrubber::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:var(--text-primary);border:2px solid var(--surface);cursor:pointer}.audio-player .scrubber::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:var(--text-primary);border:2px solid var(--surface);cursor:pointer}.audio-player .compact-button{width:32px;height:32px;border-radius:999px;border:1px solid var(--surface-border);background:var(--surface);color:var(--text-primary);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;padding:0}.audio-player .compact-button:hover{background:var(--surface-hover)}.audio-player .compact-icon{font-size:12px;line-height:1}@media (max-width:640px){.audio-player .meta{flex-direction:column;align-items:flex-start}}:has(>.model-card){row-gap:.75rem!important}.model-card{display:flex;flex-direction:column;gap:.75rem;padding:1rem 1.25rem;border:1px solid var(--surface-border);border-radius:12px;background:var(--surface);transition:border-color .15s,box-shadow .15s}.model-card:hover{border-color:var(--surface-border-hover);box-shadow:0 2px 8px var(--surface-shadow)}.model-card__footer,.model-card__header,.model-card__meta,.model-card__region,.model-card__regions{display:flex;align-items:center}.model-card__header{gap:.75rem}.model-card__logo{display:flex;width:36px;height:36px;min-width:36px;align-items:center;justify-content:center;border-radius:8px;font-size:.75rem;font-weight:700;line-height:1}.model-card__logo--provider,.model-card__pill{background:var(--pill-bg);color:var(--pill-text)}.model-card__logo-img{width:100%;height:100%;border-radius:6px;object-fit:contain}.model-card__logo--image{box-sizing:border-box;padding:4px;background:var(--surface)}.model-card__identity{min-width:0;flex:1}.model-card__name{overflow:hidden;margin:0;color:var(--text-primary);font-size:1rem;font-weight:600;line-height:1.35;text-overflow:ellipsis;white-space:nowrap}.model-card__name-button{display:inline-flex;align-items:center;gap:.3rem;max-width:100%;min-width:0;padding:0;border:0;background:0 0;font:inherit;color:inherit;cursor:pointer;text-align:left}.model-card__name-text{overflow:hidden;min-width:0;text-overflow:ellipsis;white-space:nowrap}.model-card__copy-icon{display:inline-flex;flex-shrink:0;color:var(--text-muted);opacity:0;transition:opacity .12s}.model-card__copy-icon--copied,.model-card__name-button:focus-visible .model-card__copy-icon,.model-card__name-button:hover .model-card__copy-icon{opacity:1}.model-card__copy-icon--copied{color:var(--text-primary)}.model-card__provider{color:var(--text-secondary);font-size:.8rem}.model-card__meta{flex-wrap:wrap;gap:.35rem;margin-top:.2rem}.model-card__badge,.model-card__hosting{padding:.15rem .5rem;border-radius:4px;font-size:.7rem;font-weight:600;letter-spacing:.03em;white-space:nowrap}.model-card__badge{text-transform:uppercase}.model-card__badge--stt{background:var(--badge-stt-bg);color:var(--badge-stt-text)}.model-card__badge--tts{background:var(--badge-tts-bg);color:var(--badge-tts-text)}.model-card__hosting{background:var(--color-brand);color:var(--color-text-dark)}.model-card__description{display:-webkit-box;overflow:hidden;margin:0;color:var(--text-body);font-size:.9rem;line-height:1.5;-webkit-box-orient:vertical;-webkit-line-clamp:2}.model-card__metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));overflow:hidden;border:1px solid var(--surface-border);border-radius:8px}.model-card__metric{min-width:0;padding:.55rem .65rem;border-right:1px solid var(--surface-border)}.model-card__metric:last-child{border-right:0}.model-card__detail-label,.model-card__metric-label{display:block;margin-bottom:.15rem;color:var(--text-secondary);font-size:.65rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase}.model-card__metric strong{display:block;overflow:hidden;color:var(--text-strong);font-size:.8rem;text-overflow:ellipsis;white-space:nowrap}.model-card__detail-row{color:var(--text-body);font-size:.8rem}.model-card__pills{display:flex;flex-wrap:wrap;gap:.375rem}.model-card__pill{overflow:hidden;padding:.2rem .5rem;border-radius:6px;font-size:.75rem;text-overflow:ellipsis;white-space:nowrap}.model-card__footer{justify-content:space-between;padding-top:.1rem}.model-card__footer,.model-card__regions{flex-wrap:wrap;gap:.5rem}.model-card__region{gap:.25rem;color:var(--text-secondary);font-size:.72rem;font-weight:600}.model-card__region--more{opacity:.75;cursor:help}.model-card__cta{color:var(--text-primary);font-size:.8rem;font-weight:600;text-decoration:none;border-bottom:0!important}.model-card__cta:hover{text-decoration:underline;text-decoration-color:var(--color-brand);text-decoration-thickness:2px;text-underline-offset:3px}@media (max-width:640px){.model-card__metrics{grid-template-columns:1fr}.model-card__metric{border-right:0;border-bottom:1px solid var(--surface-border)}.model-card__metric:last-child{border-bottom:0}}@font-face{font-family:\"Saans\";font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/Saans-Regular.woff2) format(\"woff2\")}@font-face{font-family:\"Saans\";font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/Saans-SemiBold.woff2) format(\"woff2\")}@font-face{font-family:\"Saans\";font-style:normal;font-weight:800;font-display:swap;src:url(/fonts/Saans-Heavy.woff2) format(\"woff2\")}.lp-root{font-family:\"Saans\",var(--font-sans, ui-sans-serif, system-ui, sans-serif);color:var(--color-text-dark)}.dark .lp-root{color:var(--color-text-light)}.lp-root a{text-decoration:none}.lp-wrap{max-width:1080px;margin:0 auto;padding-left:1.5rem;padding-right:1.5rem}.lp-section{padding-top:4rem;padding-bottom:4rem}.lp-section--tight{padding-top:2.5rem;padding-bottom:2.5rem}.lp-section__eyebrow{font-family:\"Geist Mono\",ui-monospace,monospace;text-transform:uppercase;letter-spacing:.08em;font-size:.72rem;color:#8a7a2f;margin-bottom:.5rem}.dark .lp-section__eyebrow{color:#c8b85a}.lp-section__title{font-size:1.7rem;font-weight:600;letter-spacing:-.02em;margin:0 0 .5rem;line-height:1.15}.lp-section__intro{font-size:1rem;color:#5c5648;max-width:48ch;margin:0;line-height:1.55}.dark .lp-section__intro{color:#b9b3a4}.lp-hero{position:relative;text-align:center;padding:5.5rem 1.5rem 4rem;overflow:hidden}.lp-hero::before{content:\"\";position:absolute;inset:0;background-image:radial-gradient(rgba(21,18,13,.06) 1px,transparent 1px);background-size:22px 22px;-webkit-mask-image:radial-gradient(ellipse 70% 65% at 50% 35%,#000 30%,transparent 75%);mask-image:radial-gradient(ellipse 70% 65% at 50% 35%,#000 30%,transparent 75%);pointer-events:none}.dark .lp-hero::before{background-image:radial-gradient(rgba(251,250,247,.07) 1px,transparent 1px)}.lp-hero__inner{position:relative;max-width:760px;margin:0 auto}.lp-hero__eyebrow{display:inline-flex;align-items:center;gap:.5rem;font-family:\"Geist Mono\",ui-monospace,monospace;text-transform:uppercase;letter-spacing:.1em;font-size:.72rem;color:var(--color-text-dark);background-color:var(--color-brand);padding:.25rem .7rem;border-radius:999px;margin-bottom:1.5rem}.lp-hero__title{font-size:3.1rem;line-height:1.04;font-weight:800;letter-spacing:-.03em;margin:0 0 1.1rem}.lp-hero__title .lp-mark{background:linear-gradient(transparent 62%,var(--color-brand) 62%);padding:0 .1em}.lp-hero__sub{font-size:1.18rem;line-height:1.55;color:#5c5648;max-width:38rem;margin:0 auto 2rem}.dark .lp-hero__sub{color:#b9b3a4}.lp-cta-row{display:flex;gap:.75rem;justify-content:center;flex-wrap:wrap}.lp-btn{display:inline-flex;align-items:center;gap:.45rem;font-weight:600;font-size:.95rem;padding:.7rem 1.35rem;border-radius:10px;transition:transform .12s ease,box-shadow .12s ease,background-color .12s ease}.lp-btn:hover{transform:translateY(-1px)}.lp-btn--ghost,.lp-btn--primary{color:var(--color-text-dark)!important}.lp-btn--primary{background-color:var(--color-brand);box-shadow:0 1px 2px rgba(21,18,13,.12)}.lp-btn--primary:hover{box-shadow:0 6px 18px rgba(251,229,102,.5)}.lp-btn--ghost{background-color:transparent;border:1px solid rgba(21,18,13,.18)}.dark .lp-btn--ghost{color:var(--color-text-light)!important;border-color:rgba(251,250,247,.22)}.lp-btn--ghost:hover{border-color:rgba(21,18,13,.4)}.dark .lp-btn--ghost:hover{border-color:rgba(251,250,247,.45)}.lp-stats{border-top:1px solid rgba(21,18,13,.08);border-bottom:1px solid rgba(21,18,13,.08);background:rgba(251,229,102,.05)}.dark .lp-stats{border-color:rgba(251,250,247,.1);background:rgba(251,229,102,.04)}.lp-stats__grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1.5rem;padding:2.25rem 0}.lp-stat__num{font-family:\"Geist Mono\",ui-monospace,monospace;font-size:2rem;font-weight:600;letter-spacing:-.02em;line-height:1}.lp-stat__num small{font-size:1.1rem;font-weight:600}.lp-stat__label{margin-top:.5rem;font-size:.85rem;color:#5c5648;line-height:1.4}.dark .lp-cmd__cap,.dark .lp-stat__label{color:#b9b3a4}.lp-cmd{display:inline-flex;align-items:center;gap:.5rem;font-family:\"Geist Mono\",ui-monospace,monospace;font-size:.9rem;background:#211d15;color:#fbfaf7;border:1px solid rgba(251,250,247,.15);padding:.6rem 1rem;border-radius:10px;margin-top:1.25rem}.lp-cmd__prompt{color:var(--color-brand);user-select:none}.lp-cmd__cap{font-size:.85rem;color:#5c5648;margin-top:.7rem}.lp-split{display:grid;grid-template-columns:1fr 1.15fr;gap:2.5rem;align-items:center}.lp-grid-3,.lp-grid-4{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;margin-top:1.75rem}.lp-grid-4{grid-template-columns:repeat(4,1fr)}.lp-tile{display:block;padding:1.4rem;border-radius:14px;border:1px solid rgba(21,18,13,.1);background:#fff;color:inherit!important;height:100%;transition:border-color .15s,box-shadow .15s,transform .15s}.dark .lp-tile{background:#1a1712;border-color:rgba(251,250,247,.1)}.lp-tile:hover{border-color:var(--color-brand);box-shadow:0 6px 22px rgba(21,18,13,.08);transform:translateY(-2px)}.lp-tile__icon{width:38px;height:38px;border-radius:10px;background:var(--color-brand);color:var(--color-text-dark);display:inline-flex;align-items:center;justify-content:center;margin-bottom:.9rem}.lp-tile__title{font-weight:600;font-size:1.05rem;margin:0 0 .35rem}.lp-tile__desc{font-size:.9rem;color:#5c5648;margin:0;line-height:1.5}.dark .lp-tile__desc{color:#b9b3a4}.lp-tile__step{font-family:\"Geist Mono\",ui-monospace,monospace;font-size:.75rem;color:#8a7a2f;margin-bottom:.6rem}.dark .lp-tile__step{color:#c8b85a}.lp-grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem;margin-top:1.75rem}.lp-integrations{display:flex;flex-wrap:wrap;justify-content:center;gap:1rem;margin-top:1.75rem}.lp-integration{flex:0 0 calc(25% - .75rem);display:flex;align-items:center;gap:.85rem;min-height:76px;padding:1rem 1.1rem;border:1px solid rgba(21,18,13,.1);border-radius:14px;background:#fff;color:inherit!important;transition:border-color .15s,box-shadow .15s,transform .15s}.dark .lp-integration{background:#1a1712;border-color:rgba(251,250,247,.1)}.lp-integration:hover{border-color:var(--color-brand);box-shadow:0 6px 22px rgba(21,18,13,.08);transform:translateY(-2px)}.lp-integration:focus-visible{outline:3px solid var(--color-brand);outline-offset:2px}.lp-integration__mark{display:inline-flex;align-items:center;justify-content:center;width:42px;height:42px;flex:0 0 42px;overflow:hidden;border:1px solid rgba(21,18,13,.08);border-radius:10px;background:#fff}.lp-integration__logo{display:block;width:34px;height:34px;object-fit:contain}.lp-integration__name{font-size:1rem;font-weight:600}.lp-trust{font-family:\"Geist Mono\",ui-monospace,monospace;font-size:.8rem;color:#8a7a2f;margin-top:1.5rem}.dark .lp-trust{color:#c8b85a}.lp-trust a{color:inherit;border-bottom:1px solid currentColor}.lp-logos{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:2.25rem;margin-top:1.75rem}.lp-logos a{display:inline-flex;align-items:center;border-bottom:none!important;box-shadow:none!important}.lp-logos img{height:26px;width:auto;opacity:.7;filter:grayscale(1);transition:opacity .15s,filter .15s}.lp-logos img:hover{opacity:1;filter:grayscale(0)}.dark .lp-logos img{opacity:.85}.lp-cta-band{background:#15120d;color:var(--color-text-light);border-radius:18px;padding:3rem 2rem;text-align:center}.lp-cta-band h2{font-size:1.9rem;font-weight:600;letter-spacing:-.02em;margin:0 0 .6rem;color:var(--color-text-light)}.lp-cta-band p,.lp-cta-band__lead{color:#b9b3a4;margin:0 auto 1.75rem;max-width:40rem}.lp-cta-band__lead{margin-bottom:.35rem}.lp-cta-band__price{color:#b9b3a4;max-width:40rem;margin:0 auto 1.75rem;font-size:.95rem}.lp-nowrap{white-space:nowrap}.lp-cta-band .lp-btn--ghost{color:var(--color-text-light)!important;border-color:rgba(251,250,247,.25)}.lp-cta-band .lp-btn--ghost:hover{border-color:rgba(251,250,247,.5)}.lp-cta-band .lp-cmd{margin-top:0;margin-bottom:1.5rem}@media (max-width:900px){.lp-split{grid-template-columns:1fr}.lp-stats__grid{grid-template-columns:repeat(2,1fr);gap:1.75rem 1rem}.lp-grid-3{grid-template-columns:1fr}.lp-grid-4{grid-template-columns:repeat(2,1fr)}.lp-grid-2{grid-template-columns:1fr}.lp-integration{flex-basis:calc(50% - .5rem)}.lp-hero__title{font-size:2.3rem}.lp-hero{padding-top:3.5rem}}@media (max-width:640px){.lp-integration{flex-basis:100%}.lp-grid-4{grid-template-columns:1fr}}.lp-hero__art{margin:2.75rem auto 0;max-width:480px}.lp-figure img,.lp-hero__art img{width:100%;height:auto;display:block}.lp-figure{border-radius:16px;overflow:hidden;border:1px solid rgba(21,18,13,.1);background:#f3f1ed;line-height:0}.dark .lp-figure{border-color:rgba(251,250,247,.12)}.lp-regions-map .regions-map{margin:0}.lp-hero__grid{max-width:1080px;display:grid;grid-template-columns:1.1fr .9fr;gap:3rem;align-items:center;text-align:left}.lp-hero__grid .lp-hero__sub{margin-left:0;margin-right:0}.lp-hero__grid .lp-cta-row{justify-content:flex-start}.lp-hero--split .lp-hero__art{margin:0 auto;max-width:460px}.lp-hero__getstarted{margin-top:2.75rem}.lp-stat__num{white-space:nowrap}.lp-marquee{margin-top:1.75rem;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent);mask-image:linear-gradient(90deg,transparent,#000 8%,#000 92%,transparent)}.lp-marquee__track{display:flex;width:max-content;animation:lp-marquee-scroll 42s linear infinite;will-change:transform}.lp-marquee:hover .lp-marquee__track{animation-play-state:paused}.lp-marquee__group{display:flex;align-items:center;gap:3rem;padding-right:3rem;flex-shrink:0}.lp-marquee__group img{height:22px;width:auto;opacity:.8;transition:opacity .15s}.lp-marquee:hover .lp-marquee__group img{opacity:1}:root:not(.dark) .lp-marquee__group img{filter:invert(1)}@media (prefers-reduced-motion:reduce){.lp-marquee__track{animation:none}.lp-marquee{-webkit-mask-image:none;mask-image:none}.lp-marquee__track{flex-wrap:wrap;justify-content:center;row-gap:1.5rem}}@media (max-width:900px){.lp-hero__grid{grid-template-columns:1fr;text-align:center;gap:2rem}.lp-hero__grid .lp-hero__sub{margin-left:auto;margin-right:auto}.lp-hero__grid .lp-cta-row{justify-content:center}.lp-hero--split .lp-hero__art{max-width:360px}}.lp-split--reverse{grid-template-columns:1.15fr 1fr}.lp-split--reverse>:first-child{order:2}.lp-split--reverse>:last-child{order:1}@media (max-width:900px){.lp-split--reverse>*{order:0}}.hosting-banner{display:flex;align-items:flex-start;gap:.7rem;padding:.85rem 1rem;border-radius:12px;line-height:1.45;margin-bottom:1rem}.hosting-banner--slng{background-color:var(--color-brand);color:var(--color-text-dark)}.hosting-banner--thirdparty{background-color:#1a3a3a;color:#e8f0f0}.dark .hosting-banner--thirdparty{background-color:#162e2e}.hosting-banner__icon{flex-shrink:0;margin-top:.1rem;opacity:.85}.hosting-banner__body{display:flex;flex-direction:column;gap:.2rem;min-width:0}.hosting-banner__eyebrow{font-size:.7rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;opacity:.72}.hosting-banner__headline{display:inline-flex;align-items:center;gap:.35rem;font-size:1rem;font-weight:700}.hosting-banner__arrow{flex-shrink:0;animation:hosting-banner-arrow-bounce 1.6s ease-in-out infinite}@media (prefers-reduced-motion:reduce){.hosting-banner__arrow{animation:none}}.hosting-banner__sub{font-size:.85rem;opacity:.88}.hosting-banner__foot{display:flex;align-items:center;flex-wrap:wrap;gap:.4rem .6rem;margin-top:.3rem}.hosting-banner__avail{font-size:.7rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;opacity:.7}.hosting-banner__chips{display:inline-flex;flex-wrap:wrap;gap:.35rem}.hosting-banner__chip{display:inline-flex;align-items:center;gap:.35rem;padding:.1rem .55rem .1rem .35rem;border-radius:999px;background-color:rgba(0,0,0,.07);border:1px solid rgba(0,0,0,.14);font-family:inherit;font-size:.8rem;font-weight:600;color:inherit;white-space:nowrap;transition:background-color .12s ease,border-color .12s ease}button.hosting-banner__chip{cursor:pointer}button.hosting-banner__chip:hover{background-color:rgba(0,0,0,.12);border-color:rgba(0,0,0,.28)}.hosting-banner--thirdparty .hosting-banner__chip{background-color:rgba(255,255,255,.1);border-color:rgba(255,255,255,.22)}.hosting-banner--thirdparty button.hosting-banner__chip:hover{background-color:rgba(255,255,255,.17);border-color:rgba(255,255,255,.38)}.hosting-banner--thirdparty .hosting-banner__chip.is-active,.hosting-banner__chip.is-active{border-color:#059669;box-shadow:inset 0 0 0 1px #059669;background-color:rgba(5,150,105,.16)}.hosting-banner__chip.is-active .hosting-banner__chip-name{color:#047857}.hosting-banner--thirdparty .hosting-banner__chip-variant.is-active,.hosting-banner--thirdparty .hosting-banner__chip.is-active .hosting-banner__chip-name{color:#6ee7b7}.hosting-banner__chip-flag{display:inline-block;width:.95rem;height:.95rem;background-size:cover;background-position:center;border-radius:50%;flex-shrink:0}.hosting-banner__chip-variants{display:inline-flex;align-items:center;padding-left:.4rem;margin-left:.1rem;border-left:1px solid currentColor;font-weight:500}.hosting-banner__chip-variant{font-family:inherit;font-size:inherit;font-weight:500;color:inherit;background:0 0;border:0;padding:0 .2rem;border-radius:4px;cursor:pointer;opacity:.7;transition:opacity .12s ease,background-color .12s ease}.hosting-banner__chip-variant:not(:first-child)::before{content:\"ยท\";display:inline-block;padding-right:.3rem;opacity:.6;cursor:default}.hosting-banner__chip-variant:hover{opacity:1;text-decoration:underline;text-underline-offset:2px}.hosting-banner__chip-variant.is-active{opacity:1;font-weight:700;color:#047857}.hosting-banner__request{font-size:.8rem}.hosting-banner a{background-image:none;border-bottom:0;text-underline-offset:2px}.dark .hosting-banner--slng a,.hosting-banner--slng a{color:var(--color-text-dark);font-weight:600;text-decoration:underline;text-decoration-color:var(--color-text-dark);-webkit-text-decoration-color:var(--color-text-dark)}.dark .hosting-banner--thirdparty a,.hosting-banner--thirdparty a{color:#a3d4d4;font-weight:600;text-decoration:underline;text-decoration-color:#a3d4d4;-webkit-text-decoration-color:#a3d4d4}.region-picker-badge{display:inline-flex;align-items:center;gap:.3rem;margin-right:.4rem;padding:.15rem .5rem;border:1.5px solid rgba(5,150,105,.4);background-color:rgba(5,150,105,.12);border-radius:.5rem;line-height:1.25rem;white-space:nowrap;flex-shrink:0;cursor:pointer}.region-picker-flag{display:inline-block;width:1rem;height:1rem;background-size:cover;background-position:center;border-radius:50%;flex-shrink:0}.region-picker-code{font-family:var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:.875rem;line-height:1.25rem;font-weight:600;color:#059669}.dark .region-picker-chevron,.dark .region-picker-code{color:#34d399}.region-picker-chevron{display:inline-flex;align-items:center;color:#059669;opacity:.75;flex-shrink:0}.region-picker-chevron svg{display:block}@media (max-width:640px){.hosting-banner__foot{align-items:flex-start}}"}],"page":{"pagePath":"guides/agents/tools-and-mcp/code-tool","slug":"/guides/agents/tools-and-mcp/code-tool","pageMetadata":{"title":"Write a custom code tool","description":"Run typed Python logic in an isolated tool environment.","href":"/guides/agents/tools-and-mcp/code-tool"},"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: \"Run typed Python logic in an isolated tool environment.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Frame,Heading,OptimizedImage,Step,Steps,Tab,Tabs}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Create a Custom Code tool for calculations and data processing that do not need\nnetwork access. The Python input and output models become the tool contract the\nagent sees.`}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Permission to manage organization tools.`}),`\n`,_jsx(_components.li,{children:`A deterministic Python task that can run without an internet connection.`}),`\n`,_jsx(_components.li,{children:`Vault secrets for any sensitive values the code needs.`}),`\n`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Create the draft`,children:_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Dashboard`,icon:`monitor`,id:`dashboard`,children:[_jsxs(_components.p,{children:[`Go to `,_jsx(_components.strong,{children:`Global Tools`}),`, choose `,_jsx(_components.strong,{children:`New tool`}),`, then select `,_jsx(_components.strong,{children:`Custom Code`}),`.\nEnter a precise tool name and `,_jsx(_components.strong,{children:`Instructions`}),`. `,_jsx(_components.strong,{children:`Instructions`}),` maps to\nthe API `,_jsx(_components.code,{children:`description`}),` field.`]}),_jsx(Frame,{caption:`Select Custom Code from the New tool page`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-select.png?fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=333f5def32ab7980868ecdab2c64245e`,alt:`The New tool page with Custom Code highlighted`,\"data-og-width\":`2560`,width:`2560`,\"data-og-height\":`1600`,height:`1600`,\"data-path\":`heroshots/custom-code-select.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-select.png?w=280\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=a6cc248a26dd44f01593fd3abb0071b7 280w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-select.png?w=560\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=bc5a5c9385804f902efa93241c5d14c3 560w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-select.png?w=840\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=4061b2345fe8e2efa5bb5c405379cf00 840w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-select.png?w=1100\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=1a92b4c7a8a133f1adb8f4047a52a78f 1100w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-select.png?w=1650\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=fd4c20e7a6fa0b01b8584c2fc7244ecd 1650w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-select.png?w=2500\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=876f292b93928dadad18fffe3d284a4c 2500w`})})]}),_jsxs(Tab,{title:`API`,icon:`code`,id:`api`,children:[_jsx(_components.p,{children:`Define the source in a JSON request body.`}),_jsx(CodeBlock,{filename:`tool.json`,numberOfLines:`9`,language:`json`,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:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`9`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"calculate_discount\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"description\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Calculate a percentage discount for an order subtotal.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"tool_type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"code\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"code_src\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"from pydantic import BaseModel, Field`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\n\\\\n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`class Input(BaseModel):`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` subtotal: float = Field(..., ge=0)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` percent: float = Field(..., ge=0, le=100)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\n\\\\n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`class Output(BaseModel):`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` discount: float`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` total: float`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\n\\\\n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`def handler(input: Input) -> Output:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` discount = round(input.subtotal * input.percent / 100, 2)`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:`\\\\n`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` return Output(discount=discount, total=round(input.subtotal - discount, 2))\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"declared_secrets\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"dependencies\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"argument_defaults\"`}),_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(CodeBlock,{filename:`Request`,numberOfLines:`4`,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:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://api.agents.slng.ai/v1/agents/tools`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$SLNG_API_KEY`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` @tool.json`})]}),`\n`]})})})]})]})}),_jsxs(Step,{title:`Define typed input and output`,children:[_jsxs(_components.p,{children:[`Define a Pydantic `,_jsx(_components.code,{children:`Input`}),` model, an `,_jsx(_components.code,{children:`Output`}),` model, and a synchronous\n`,_jsx(_components.code,{children:`handler(input: Input) -> Output`}),` function. Add field descriptions so the\nmodel knows which values to supply.`]}),_jsx(_components.p,{children:`Return the declared output model. Keep logs useful for testing, but return\nthe data the agent needs from the handler.`})]}),_jsxs(Step,{title:`Add dependencies and secrets`,children:[_jsxs(_components.p,{children:[`List each dependency as an exact version such as `,_jsx(_components.code,{children:`pydantic==2.11.7`}),`.\nPackages with URLs, environment markers, or extras are rejected.`]}),_jsx(_components.p,{children:`Declare Vault secret names separately from the source. Do not place secret\nvalues in code or logs. The environment exposes only the declared secrets.`}),_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Dashboard`,icon:`monitor`,id:`dashboard-2`,children:[_jsxs(_components.p,{children:[`Expand `,_jsx(_components.strong,{children:`Metadata`}),`, select the Vault secrets the tool can access, and\nenter the pinned packages in `,_jsx(_components.strong,{children:`Dependencies`}),`.`]}),_jsx(Frame,{caption:`Configure Vault secrets and Python dependencies`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-metadata.png?fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=f2cf41f38c79eeef3f708170c1da8533`,alt:`The Custom Code metadata panel with the Dependencies field highlighted`,\"data-og-width\":`2560`,width:`2560`,\"data-og-height\":`1600`,height:`1600`,\"data-path\":`heroshots/custom-code-metadata.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-metadata.png?w=280\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=a7e465ba3c726cde96f1b5796717c075 280w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-metadata.png?w=560\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=6b9f33ca4590d8512fec0f7375f09861 560w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-metadata.png?w=840\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=47030e290919451181b4c7d03ff9bb36 840w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-metadata.png?w=1100\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=ef3835fb0c180a303465ec58cf6e1b9e 1100w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-metadata.png?w=1650\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=0ebc4b6a80a5befbc28b93a7ebc795ca 1650w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-metadata.png?w=2500\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=7d14890c47ceb7962e7d722e45290cf2 2500w`})})]}),_jsx(Tab,{title:`API`,icon:`code`,id:`api-2`,children:_jsxs(_components.p,{children:[`Add the allowed Vault secret names to `,_jsx(_components.code,{children:`declared_secrets`}),` and the pinned\npackages to `,_jsx(_components.code,{children:`dependencies`}),` in the tool request.`]})})]})]}),_jsxs(Step,{title:`Build the tool`,children:[_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Dashboard`,icon:`monitor`,id:`dashboard-3`,children:[_jsxs(_components.p,{children:[`Save the draft, then choose `,_jsx(_components.strong,{children:`Build tool`}),`.`]}),_jsx(Frame,{caption:`Build the tool after defining its code and metadata`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-build.png?fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=f2f29aa71136d74b45fb537b6aa42003`,alt:`The Custom Code editor with Build tool highlighted`,\"data-og-width\":`2560`,width:`2560`,\"data-og-height\":`1600`,height:`1600`,\"data-path\":`heroshots/custom-code-build.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-build.png?w=280\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=d91db9b11b9938ed3a481284820bf658 280w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-build.png?w=560\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=a14104648b1bd270bb3f1f8e07d8c978 560w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-build.png?w=840\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=581d57e7df3ec26de2b9ccfc35908d61 840w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-build.png?w=1100\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=53befd4563a0bed112c2666cd5cbcf5b 1100w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-build.png?w=1650\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=ccbd1e42efb5b05ec3245ca2c6e2b81c 1650w, https://mintcdn.com/slng-new-docs/_MURdOw87SJsfVag/heroshots/custom-code-build.png?w=2500\u0026fit=max\u0026auto=format\u0026n=_MURdOw87SJsfVag\u0026q=85\u0026s=6048ffce9315c349c6cb85071af7b06e 2500w`})})]}),_jsx(Tab,{title:`API`,icon:`code`,id:`api-3`,children:_jsxs(_components.p,{children:[`Save the draft, then send\n`,_jsx(_components.code,{children:`POST /v1/agents/tools/{tool_id}/introspect`}),`.`]})})]}),_jsx(_components.p,{children:`The build installs the pinned dependencies, imports the declared modules,\nand derives the argument schema from the Pydantic models.`})]}),_jsx(Step,{title:`Test and publish`,children:_jsx(_components.p,{children:`Run representative input, check the structured output and logs, then\npublish. You must have a valid schema, available secrets and dependencies,\nand a successful run for the current draft.`})}),_jsx(Step,{title:`Attach the published version`,children:_jsxs(_components.p,{children:[`Attach the version to an agent and verify it in a test call. See\n`,_jsx(_components.a,{href:`/guides/agents/tools-and-mcp/attach-to-an-agent`,children:`Attach a tool to an agent`}),`.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`environment-limits`,children:`Environment limits`}),`\n`,_jsxs(_components.p,{children:[`Custom Code runs in an isolated environment with no internet access. Use an\n`,_jsx(_components.a,{href:`/guides/agents/tools-and-mcp/api-request-tool`,children:`API Request tool`}),` or\n`,_jsx(_components.a,{href:`/guides/agents/tools-and-mcp/connect-with-mcp`,children:`MCP server`}),` for network calls.\nAvoid unbounded loops, large payloads, and large output objects. A run that\nexceeds its time or data limit returns a failure instead of partial output.`]}),`\n`,_jsxs(_components.p,{children:[`Code tools can run on call start, first user message, and tool success or\nfailure. They cannot run on call end. See\n`,_jsx(_components.a,{href:`/guides/agents/tools-and-mcp/run-on-call-events`,children:`Run a tool on call events`}),`.`]})]})}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":"Write a custom code tool","description":"Run typed Python logic in an isolated tool environment.","href":"/guides/agents/tools-and-mcp/code-tool"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Environment limits","slug":"environment-limits","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/slng-new-docs/79891e058276ac73/region-picker-flag.js"],"subdomain":"slng-new-docs","siteName":"SLNG: the execution layer for voice - SLNG Documentation","title":"Write a custom code tool - SLNG: the execution layer for voice - SLNG Documentation","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-16T14:34:03.287Z","originalFileLocation":"guides/agents/tools-and-mcp/code-tool.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=\"Run typed Python logic in an isolated tool environment.\">\u003cmeta data-mint-head name=\"application-name\" content=\"SLNG: the execution layer for voice - SLNG Documentation\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/svg+xml\" sizes=\"180x180\" href=\"https://mintcdn.com/slng-new-docs/7nMVrKvzTWYOIRbj/images/icon.svg?fit=max\u0026amp;auto=format\u0026amp;n=7nMVrKvzTWYOIRbj\u0026amp;q=85\u0026amp;s=eaa03df4481524b3edce26325e7106a6\">\u003clink data-mint-head rel=\"icon\" type=\"image/svg+xml\" sizes=\"32x32\" href=\"https://mintcdn.com/slng-new-docs/7nMVrKvzTWYOIRbj/images/icon.svg?fit=max\u0026amp;auto=format\u0026amp;n=7nMVrKvzTWYOIRbj\u0026amp;q=85\u0026amp;s=eaa03df4481524b3edce26325e7106a6\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/svg+xml\" sizes=\"16x16\" href=\"https://mintcdn.com/slng-new-docs/7nMVrKvzTWYOIRbj/images/icon.svg?fit=max\u0026amp;auto=format\u0026amp;n=7nMVrKvzTWYOIRbj\u0026amp;q=85\u0026amp;s=eaa03df4481524b3edce26325e7106a6\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/svg+xml\" href=\"https://mintcdn.com/slng-new-docs/7nMVrKvzTWYOIRbj/images/icon.svg?fit=max\u0026amp;auto=format\u0026amp;n=7nMVrKvzTWYOIRbj\u0026amp;q=85\u0026amp;s=eaa03df4481524b3edce26325e7106a6\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/svg+xml\" sizes=\"32x32\" href=\"https://mintcdn.com/slng-new-docs/7nMVrKvzTWYOIRbj/images/icon.svg?fit=max\u0026amp;auto=format\u0026amp;n=7nMVrKvzTWYOIRbj\u0026amp;q=85\u0026amp;s=eaa03df4481524b3edce26325e7106a6\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/svg+xml\" sizes=\"16x16\" href=\"https://mintcdn.com/slng-new-docs/7nMVrKvzTWYOIRbj/images/icon.svg?fit=max\u0026amp;auto=format\u0026amp;n=7nMVrKvzTWYOIRbj\u0026amp;q=85\u0026amp;s=eaa03df4481524b3edce26325e7106a6\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/svg+xml\" href=\"https://mintcdn.com/slng-new-docs/7nMVrKvzTWYOIRbj/images/icon.svg?fit=max\u0026amp;auto=format\u0026amp;n=7nMVrKvzTWYOIRbj\u0026amp;q=85\u0026amp;s=eaa03df4481524b3edce26325e7106a6\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Write a custom code tool - SLNG: the execution layer for voice - SLNG Documentation\">\u003cmeta data-mint-head property=\"og:description\" content=\"Run typed Python logic in an isolated tool environment.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"SLNG: the execution layer for voice - SLNG Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.slng.ai/guides/agents/tools-and-mcp/code-tool\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://slng-new-docs.mintlify.app/_mintlify/api/og/v2?division=Tools+and+inputs\u0026amp;title=Write+a+custom+code+tool\u0026amp;description=Run+typed+Python+logic+in+an+isolated+tool+environment.\u0026amp;theme=058cea2715ea6a0fe652dddf\u0026amp;signature=1b7c29fe6ef6fdddd209e10aa2cc6b36abf362b7877538498146f7bc640946a7\">\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=\"Write a custom code tool - SLNG: the execution layer for voice - SLNG Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Run typed Python logic in an isolated tool environment.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://slng-new-docs.mintlify.app/_mintlify/api/og/v2?division=Tools+and+inputs\u0026amp;title=Write+a+custom+code+tool\u0026amp;description=Run+typed+Python+logic+in+an+isolated+tool+environment.\u0026amp;theme=058cea2715ea6a0fe652dddf\u0026amp;signature=1b7c29fe6ef6fdddd209e10aa2cc6b36abf362b7877538498146f7bc640946a7\">\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=\"https://mintlify.s3.us-west-1.amazonaws.com/slng-new-docs/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"SLNG: the execution layer for voice - SLNG Documentation\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#fbe566\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.slng.ai/guides/agents/tools-and-mcp/code-tool\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/agents/tools-and-mcp/code-tool.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.slng.ai/#organization\",\"name\":\"SLNG: the execution layer for voice - SLNG Documentation\",\"url\":\"https://docs.slng.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/slng-new-docs/7nMVrKvzTWYOIRbj/images/icon.svg?fit=max\u0026auto=format\u0026n=7nMVrKvzTWYOIRbj\u0026q=85\u0026s=eaa03df4481524b3edce26325e7106a6\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.slng.ai#website\",\"name\":\"SLNG: the execution layer for voice - SLNG Documentation\",\"url\":\"https://docs.slng.ai\",\"publisher\":{\"@id\":\"https://docs.slng.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.slng.ai/guides/agents/tools-and-mcp/code-tool#webpage\",\"url\":\"https://docs.slng.ai/guides/agents/tools-and-mcp/code-tool\",\"name\":\"Write a custom code tool\",\"description\":\"Run typed Python logic in an isolated tool environment.\",\"dateModified\":\"2026-09-16T14:34:03.287Z\",\"isPartOf\":{\"@id\":\"https://docs.slng.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.slng.ai/guides/agents/tools-and-mcp/code-tool#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.slng.ai/guides/agents/tools-and-mcp/code-tool#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Agent Builder\",\"item\":\"https://docs.slng.ai/guides/agents/configure/listen\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tools and inputs\",\"item\":\"https://docs.slng.ai/guides/agents/tools-and-mcp/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Write a custom code tool\",\"item\":\"https://docs.slng.ai/guides/agents/tools-and-mcp/code-tool\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.slng.ai/guides/agents/tools-and-mcp/code-tool#article\",\"headline\":\"Write a custom code tool\",\"name\":\"Write a custom code tool\",\"description\":\"Run typed Python logic in an isolated tool environment.\",\"url\":\"https://docs.slng.ai/guides/agents/tools-and-mcp/code-tool\",\"mainEntityOfPage\":{\"@id\":\"https://docs.slng.ai/guides/agents/tools-and-mcp/code-tool#webpage\"},\"dateModified\":\"2026-09-16T14:34:03.287Z\",\"publisher\":{\"@id\":\"https://docs.slng.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.slng.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"SLNG: the execution layer for voice - SLNG Documentation\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"SLNG: the execution layer for voice - SLNG Documentation","nav":{"global":null,"tabs":[{"tab":"Concepts","icon":"lightbulb","pages":[{"title":"Concepts","href":"/concepts/whats-slng/overview"}]},{"tab":"Guides","icon":"book-open","pages":[{"group":"Get started","pages":[{"title":"Quickstart","href":"/guides/get-started/quickstart"},{"group":"Create a project","pages":[{"title":"What's a project","href":"/guides/get-started/create-a-project/whats-a-project"},{"title":"Create an agent","href":"/guides/get-started/create-a-project/create-agent"},{"title":"Improve an existing agent","href":"/guides/get-started/create-a-project/improve-agent"},{"title":"Set up a project for your own code","sidebarTitle":"Set up for your own code","href":"/guides/get-started/create-a-project/your-own-code"},{"title":"Use the API directly","href":"/guides/get-started/create-a-project/api-only"}]}]},{"group":"Regions","pages":[{"title":"Region availability","href":"/guides/regions/regions-map"},{"title":"Using regions in the services","href":"/guides/regions/using-regions-in-services"},{"title":"Agent regions","href":"/guides/regions/agent-regions"}]},{"group":"Execution layer","pages":[{"group":"Listen","pages":[{"title":"Noise cancellation","href":"/guides/execution-layer/stt/noise-cancellation"}]},{"group":"Think","pages":[{"title":"Context Router","href":"/guides/execution-layer/llm/context-router"},{"title":"Context Router regions","sidebarTitle":"Regions","href":"/guides/execution-layer/llm/regions"},{"title":"Integration guide","href":"/guides/execution-layer/llm/integration-guide"}]},{"group":"Speak","pages":[{"title":"TTS caching","href":"/guides/execution-layer/tts/tts-caching"},{"title":"Pronunciation dictionaries","href":"/guides/execution-layer/tts/pronunciation-dictionaries"}]}]},{"group":"Agent Builder","pages":[{"group":"Configure an agent","pages":[{"title":"Listen","href":"/guides/agents/configure/listen"},{"title":"Think","href":"/guides/agents/configure/think"},{"title":"Agent behavior","href":"/guides/agents/configure/agent-behavior"},{"title":"Speak","href":"/guides/agents/configure/speak"},{"title":"Reliability","href":"/guides/agents/configure/reliability"}]},{"group":"Tools and inputs","pages":[{"title":"Choose a tool","href":"/guides/agents/tools-and-mcp/overview"},{"title":"Use built-in tools","href":"/guides/agents/tools-and-mcp/built-in-tools"},{"title":"Create a Send SMS tool","href":"/guides/agents/tools-and-mcp/send-sms-tool"},{"title":"Call an external API","description":"Create an API Request tool that sends one HTTPS request to an existing service.","href":"/guides/agents/tools-and-mcp/api-request-tool"},{"title":"Write a custom code tool","href":"/guides/agents/tools-and-mcp/code-tool"},{"title":"Connect an MCP server","description":"Authenticate an MCP server, discover its tools, and attach one to an agent.","href":"/guides/agents/tools-and-mcp/connect-with-mcp"},{"title":"Use n8n for tools","href":"/guides/agents/tools-and-mcp/n8n-for-tools"},{"title":"Attach a tool to an agent","href":"/guides/agents/tools-and-mcp/attach-to-an-agent"},{"title":"Run a tool on call events","href":"/guides/agents/tools-and-mcp/run-on-call-events"}]},{"group":"Telephony","pages":[{"title":"Connect a phone number","href":"/guides/agents/telephony/overview"},{"title":"Receive calls on a number","href":"/guides/agents/telephony/inbound"},{"title":"Place calls from an agent","href":"/guides/agents/telephony/outbound"},{"title":"Dispatch outbound calls","href":"/guides/agents/telephony/dispatch-calls"}]},{"group":"Go live","pages":[{"title":"Test your agent","href":"/guides/agents/production/test-agent"},{"title":"Embed in website","href":"/guides/agents/production/embed-in-website"}]},{"group":"Manage an agent","pages":[{"title":"Download configuration","href":"/guides/agents/download-configuration"},{"title":"Debug a call","href":"/guides/agents/debug-a-call"}]}]},{"group":"Models","pages":[{"title":"Which models are available?","href":"/guides/models/which-models-are-available"},{"title":"Catalog API","href":"/guides/models/catalog-api"},{"title":"Your first request","href":"/guides/models/your-first-request"},{"title":"WebSockets vs HTTP","href":"/guides/models/websockets-vs-http"},{"title":"Use the Unified API","sidebarTitle":"Unified API","href":"/guides/models/unified-api"},{"title":"Bring your own key","href":"/guides/models/bring-your-own-key"}]},{"group":"Integrate","pages":[{"title":"LiveKit integration guide","sidebarTitle":"LiveKit","icon":"https://mintlify.s3.us-west-1.amazonaws.com/slng-new-docs/images/providers/livekit.svg","href":"/guides/integrate/livekit"},{"title":"Pipecat integration guide","sidebarTitle":"Pipecat","icon":"https://mintlify.s3.us-west-1.amazonaws.com/slng-new-docs/images/providers/pipecat.svg","href":"/guides/integrate/pipecat"},{"title":"ElevenLabs","icon":"https://mintlify.s3.us-west-1.amazonaws.com/slng-new-docs/images/providers/elevenlabs.svg","href":"/guides/integrate/elevenlabs"},{"title":"Vapi","icon":"https://mintlify.s3.us-west-1.amazonaws.com/slng-new-docs/images/providers/vapi.svg","href":"/guides/integrate/vapi"},{"title":"Deepgram","icon":"https://mintlify.s3.us-west-1.amazonaws.com/slng-new-docs/images/providers/deepgram.svg","href":"/guides/integrate/deepgram"},{"title":"Custom LLM","icon":"code","href":"/guides/integrate/custom"},{"title":"n8n integration guide","sidebarTitle":"n8n","icon":"https://mintlify.s3.us-west-1.amazonaws.com/slng-new-docs/images/providers/n8n.svg","href":"/guides/integrate/n8n"},{"title":"Skills","icon":"sparkles","href":"/guides/integrate/skills"}]},{"title":"Usage and billing","href":"/guides/usage-and-billing"}]},{"tab":"API Reference","icon":"code","pages":[{"title":"API Reference","href":"/api-reference/authentication"}]},{"tab":"Models","icon":"cpu","pages":[{"title":"Models","href":"/models/catalog/all-models"}]},{"tab":"Integrations","icon":"plug","pages":[{"title":"Integrations","href":"/unmute"}]},{"tab":"Changelog","icon":"history","pages":[{"title":"Changelog","href":"/changelog"}]}]},"basePath":"","title":"Write a custom code tool - SLNG: the execution layer for voice - SLNG Documentation","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-DXXFP6nH.js","DynamicMarkdown-B54_zNBF.js","zoom-image-lightbox-BG6oD64b.js","lightbox-handle-r17bVUz3.js"]}