Freestyle gives the user cloud Linux VMs: for hosting things (a website, a game server, a bot) and for developer sandboxes. Freestyle's docs and guides are the source of truth: before setting something up or answering about pricing, limits, domains, snapshots or networking, read the relevant page with read_docs (no arguments lists every page; search finds one) instead of answering from memory. Many users are not developers. Do the work yourself with the tools (create_vm, exec_vm, write_file, publish_port) and tell them the outcome in plain words; never ask them to run commands. Mention IDs, ports and commands only when they want detail. Teams: call list_teams first and never infer a team from a dashboard selection or a previous conversation. If there is exactly one team, or one marked always, say which ("I'll use your Personal workspace") and use it. Otherwise ask which to use. Ask before allowing a team, offering this conversation or always; only call allow_team after the user chooses. Each resource call needs the exact teamId, plus approvalId for a conversation choice; never reuse an approvalId in another conversation. When changing teams, name the new team before acting. Costs: a running VM is billed; tell the user once, plainly, before creating or starting one (read_docs page vms/pricing-and-limits has the rates). Paused VMs keep their data. Domains: every user shares the style.dev namespace, so default to a distinctive name (the project or user's name plus a short random suffix, like jamies-bakery-7f3k.style.dev); use a short or generic name only when the user asks for it. Hosting recipes. Website: write the files, run a small web server on the VM's interface, publish_port http on an unused name.style.dev. Minecraft: Java Edition server: follow read_docs page guides/run-a-minecraft-server-in-a-sandbox (Paper, the Java version the game needs, prevent-proxy-connections=false or every login fails through the edge), with allowInternet true; ask the user to accept M
Discoverability
0/6 passed0 of 6 passed0/100
Client listings and public setup information.
mcp.json or server-card.json
Either mcp.json or an MCP Server Card declaring this endpoint passes.
No matching mcp.json manifest or MCP Server Card was found at the checked URLs.
How to fix: Set the top-level tool.title to a short human-readable label (for example, "Search catalog"). Claude directory submission requires tool titles; annotations.title remains accepted only as a legacy fallback.
How to fix: For tools that render a UI resource, add openai/toolInvocation with string fields invoking and invoked (present-tense labels shown while the tool runs and after it finishes, e.g. "Searching…" / "Searched").
How to fix: For ChatGPT submission, set one exact HTTPS origin such as "https://app.example.com" on every view via _meta.ui.domain (or openai/widgetDomain). Paths are not valid and all views in one app must share the origin.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Read Freestyle's documentation and guides. With no arguments it returns the index of every page. Pass page (a path from the index, like guides/run-a-minecraft-server-in-a-sandbox or vms/pricing-and-limits) to read one, or search to find pages mentioning a word. Read the relevant guide before setting something up, and before answering questions about pricing, limits, domains, snapshots or networking.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
page
Not provided
Missing description. Explain what this value means and how to supply it.
search
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "read_docs",
"title": "Read Freestyle Docs",
"description": "Read Freestyle's documentation and guides. With no arguments it returns the index of every page. Pass page (a path from the index, like guides/run-a-minecraft-server-in-a-sandbox or vms/pricing-and-limits) to read one, or search to find pages mentioning a word. Read the relevant guide before setting something up, and before answering questions about pricing, limits, domains, snapshots or networking.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"page": {
"type": "string",
"pattern": "^\\/?(docs\\/?)?[a-z0-9][a-z0-9/-]*$",
"maxLength": 200
},
"search": {
"type": "string",
"pattern": "^[A-Za-z0-9 ._-]+$",
"maxLength": 60,
"minLength": 2
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"destructiveHint": false
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_teams",
"description": "List available teams and remembered choices. Ask which team when ambiguous. Does not select or approve any team.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description85/100
Record the user's explicit choice to allow a team in this conversation or always. Ask the user BEFORE calling. This is an accident-prevention preference, not a security boundary. Always applies across this user's Freestyle MCP connections.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
teamId
Not provided
Missing description. Explain what this value means and how to supply it.
duration
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
Add a human-readable title so users do not have to interpret the tool identifier.
Description95/100
At the user's request, reset a team's saved selection preference and clear its conversation approvals. Future use asks again; the user can restore the choice with allow_team. Does not delete resources, remove membership, or revoke account access.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 1 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
teamId
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Create a billable VM. Choose a snapshot and explicitly decide whether to allow outbound Internet access. Defaults to the platform's Ubuntu image; no public inbound access is added.
The description explains the capability, when to use it, and what to expect.
Inputs31/100
3 of 8 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
snapshotId
Not provided
Missing description. Explain what this value means and how to supply it.
slug
Not provided
Missing description. Explain what this value means and how to supply it.
displayName
Not provided
Missing description. Explain what this value means and how to supply it.
allowInternet
Not provided
Missing description. Explain what this value means and how to supply it.
idleTimeoutSeconds
Seconds without network activity before the VM pauses; omit to never pause
Clear enough to supply this argument.
ttlSeconds
Not provided
Missing description. Explain what this value means and how to supply it.
teamId
Exact team ID from list_teams; never use the dashboard active team implicitly
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval returned by allow_team; omit only for a remembered team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "delete_vm",
"title": "Delete VM",
"description": "Permanently delete a VM and its data. Confirm the target with the user first.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmId",
"teamId"
],
"properties": {
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "VM ID or slug in the explicitly selected Freestyle team"
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID from list_teams; never use the dashboard active team implicitly"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval returned by allow_team; omit only for a remembered team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Run a shell command inside a remote VM. Can change/delete data and access the network. Check statusCode for command failure. For long jobs, start a background process and inspect its log with later calls.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs38/100
3 of 8 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmId
VM ID or slug in the explicitly selected Freestyle team
Clear enough to supply this argument.
command
Not provided
Missing description. Explain what this value means and how to supply it.
timeoutMs
Not provided
Missing description. Explain what this value means and how to supply it.
linuxUser
Not provided
Missing description. Explain what this value means and how to supply it.
env
Not provided
Missing description. Explain what this value means and how to supply it.
stdin
Not provided
Missing description. Explain what this value means and how to supply it.
teamId
Exact team ID from list_teams; never use the dashboard active team implicitly
Clear enough to supply this argument.
approvalId
Conversation approval returned by allow_team; omit only for a remembered team
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Put a file the user attached in ChatGPT onto a VM. Use it when they share a file (a photo, a dataset, a config, a world save, a zip) and want it on their machine; pass the attachment as file. path is where it goes: a directory ending in / keeps the file's own name, anything else is the full destination path. Files up to 100 MiB; an existing file at that path is replaced. Unpack archives afterwards with exec_vm if needed.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
4 of 8 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmId
VM ID or slug in the explicitly selected Freestyle team
Clear enough to supply this argument.
file › download_url
Not provided
Missing description. Explain what this value means and how to supply it.
file › file_id
Not provided
Missing description. Explain what this value means and how to supply it.
file › mime_type
Not provided
Missing description. Explain what this value means and how to supply it.
file › file_name
Not provided
Missing description. Explain what this value means and how to supply it.
path
Destination: a directory ending in / (keeps the file name) or a full file path
Clear enough to supply this argument.
teamId
Exact team ID from list_teams; never use the dashboard active team implicitly
Clear enough to supply this argument.
approvalId
Conversation approval returned by allow_team; omit only for a remembered team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "upload_file",
"title": "Upload File",
"description": "Put a file the user attached in ChatGPT onto a VM. Use it when they share a file (a photo, a dataset, a config, a world save, a zip) and want it on their machine; pass the attachment as file. path is where it goes: a directory ending in / keeps the file's own name, anything else is the full destination path. Files up to 100 MiB; an existing file at that path is replaced. Unpack archives afterwards with exec_vm if needed.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmId",
"file",
"path",
"teamId"
],
"properties": {
"file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"maxLength": 512,
"minLength": 1
},
"file_name": {
"type": "string",
"maxLength": 255
},
"mime_type": {
"type": "string",
"maxLength": 255
},
"download_url": {
"type": "string",
"format": "uri",
"maxLength": 8192
}
},
"description": "The file the user attached",
"additionalProperties": false
},
"path": {
"type": "string",
"maxLength": 4096,
"minLength": 1,
"description": "Destination: a directory ending in / (keeps the file name) or a full file path"
},
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "VM ID or slug in the explicitly selected Freestyle team"
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID from list_teams; never use the dashboard active team implicitly"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval returned by allow_team; omit only for a remembered team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Give a service on a VM a public address. For an HTTPS service, set freestyleAuth to require sign-in and allow any matching team, public, emails or domains criterion. Confirm public exposure first. protocol http (default) serves a web app over HTTPS at https://domain; minecraft routes Minecraft: Java Edition players who join domain (edge port 25565, works over IPv4; a status ping never wakes a paused VM, a join does); tcp passes TLS on 443 through untouched to a service that terminates its own TLS. Use an owned, verified custom domain, or a *.style.dev hostname. style.dev is shared by every Freestyle user, so unless the user asked for a specific name, choose a distinctive one (for example jamies-bakery-7f3k.style.dev, not bakery.style.dev or mc.style.dev); short generic names are likely taken and would read as someone else's. If the name is taken, pick another distinctive one. The service must listen on the VM's network interface. Returns the address to share and how to use it.
Resolve contradictions between the description, input schema, and annotations.
Inputs70/100
7 of 10 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmId
VM ID or slug in the explicitly selected Freestyle team
Clear enough to supply this argument.
domain
Not provided
Missing description. Explain what this value means and how to supply it.
port
Not provided
Missing description. Explain what this value means and how to supply it.
protocol
Not provided
Missing description. Explain what this value means and how to supply it.
freestyleAuth › team
Allow members of the owning team
Clear enough to supply this argument.
freestyleAuth › public
Allow any signed-in Freestyle user
Clear enough to supply this argument.
freestyleAuth › emails
Exact verified emails
Clear enough to supply this argument.
freestyleAuth › domains
Exact verified email domains
Clear enough to supply this argument.
teamId
Exact team ID from list_teams; never use the dashboard active team implicitly
Clear enough to supply this argument.
approvalId
Conversation approval returned by allow_team; omit only for a remembered team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "publish_port",
"title": "Publish Port",
"description": "Give a service on a VM a public address. For an HTTPS service, set freestyleAuth to require sign-in and allow any matching team, public, emails or domains criterion. Confirm public exposure first. protocol http (default) serves a web app over HTTPS at https://domain; minecraft routes Minecraft: Java Edition players who join domain (edge port 25565, works over IPv4; a status ping never wakes a paused VM, a join does); tcp passes TLS on 443 through untouched to a service that terminates its own TLS. Use an owned, verified custom domain, or a *.style.dev hostname. style.dev is shared by every Freestyle user, so unless the user asked for a specific name, choose a distinctive one (for example jamies-bakery-7f3k.style.dev, not bakery.style.dev or mc.style.dev); short generic names are likely taken and would read as someone else's. If the name is taken, pick another distinctive one. The service must listen on the VM's network interface. Returns the address to share and how to use it.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmId",
"domain",
"port",
"teamId"
],
"properties": {
"port": {
"type": "integer",
"maximum": 65535,
"minimum": 1
},
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "VM ID or slug in the explicitly selected Freestyle team"
},
"domain": {
"type": "string",
"pattern": "^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}$",
"maxLength": 253,
"minLength": 1
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID from list_teams; never use the dashboard active team implicitly"
},
"protocol": {
"enum": [
"http",
"minecraft",
"tcp"
],
"type": "string",
"default": "http"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval returned by allow_team; omit only for a remembered team"
},
"freestyleAuth": {
"type": "object",
"properties": {
"team": {
"type": "boolean",
"description": "Allow members of the owning team"
},
"emails": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 100,
"description": "Exact verified emails"
},
"public": {
"type": "boolean",
"description": "Allow any signed-in Freestyle user"
},
"domains": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 100,
"description": "Exact verified email domains"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Send a VM's outbound connections through Freestyle's residential proxy, so sites see a home Internet address, optionally in a chosen country. Only use it when the task needs one: a site blocks, captchas or rate-limits cloud and datacenter addresses, or the user asks for a residential or country-specific IP. Do not use it for ordinary Internet access; it is slower and metered. The proxy account is built in: never ask the user for proxy credentials, and the VM never sees them. With domain * every connection goes through it (ALL_PROXY is set for new shells); with a hostname or *.example.com only those do, and clients must use socks5h://socks5.freestyle.internal:1080. Set sessionMinutes (1–30, usually 10) for a fresh sticky session across browser connections; omit for rotating exits. The provider can change the IP if an exit goes offline. This internal endpoint cannot be passed to external services such as CapSolver. Check with curl https://ip.oxylabs.io/location. Remove it with remove_residential_proxy when done.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
vmId
VM ID or slug in the explicitly selected Freestyle team
Clear enough to supply this argument.
sessionMinutes
Request a fresh sticky exit session for 1–30 minutes (use 10 for browsing or challenges). Omit for rotating exits. The provider may change the IP early if the exit goes offline; this does not expire or remove the proxy rule.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
country
Two-letter country the exit address is in (US, GB, DE…), or any
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
domain
Which destinations go through the proxy: * for everything the VM opens (sets ALL_PROXY in new shells), or a hostname or *.example.com
Clear enough to supply this argument.
teamId
Exact team ID from list_teams; never use the dashboard active team implicitly
Clear enough to supply this argument.
approvalId
Conversation approval returned by allow_team; omit only for a remembered team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "add_residential_proxy",
"title": "Add Residential Proxy",
"description": "Send a VM's outbound connections through Freestyle's residential proxy, so sites see a home Internet address, optionally in a chosen country. Only use it when the task needs one: a site blocks, captchas or rate-limits cloud and datacenter addresses, or the user asks for a residential or country-specific IP. Do not use it for ordinary Internet access; it is slower and metered. The proxy account is built in: never ask the user for proxy credentials, and the VM never sees them. With domain * every connection goes through it (ALL_PROXY is set for new shells); with a hostname or *.example.com only those do, and clients must use socks5h://socks5.freestyle.internal:1080. Set sessionMinutes (1–30, usually 10) for a fresh sticky session across browser connections; omit for rotating exits. The provider can change the IP if an exit goes offline. This internal endpoint cannot be passed to external services such as CapSolver. Check with curl https://ip.oxylabs.io/location. Remove it with remove_residential_proxy when done.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmId",
"teamId"
],
"properties": {
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "VM ID or slug in the explicitly selected Freestyle team"
},
"domain": {
"type": "string",
"default": "*",
"pattern": "^(\\*|(\\*\\.)?(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,})$",
"maxLength": 253,
"description": "Which destinations go through the proxy: * for everything the VM opens (sets ALL_PROXY in new shells), or a hostname or *.example.com"
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID from list_teams; never use the dashboard active team implicitly"
},
"country": {
"type": "string",
"default": "US",
"pattern": "^([A-Za-z]{2}|any)$",
"description": "Two-letter country the exit address is in (US, GB, DE…), or any"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval returned by allow_team; omit only for a remembered team"
},
"sessionMinutes": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "Request a fresh sticky exit session for 1–30 minutes (use 10 for browsing or challenges). Omit for rotating exits. The provider may change the IP early if the exit goes offline; this does not expire or remove the proxy rule."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description81/100
Experimental, Personal VMs only. List a running VM's displays. Each display is an independent screen with its own frames: the session display is main, and in the Personal desktop every app window gets its own display, with its app and title under window. Use the id with computer, open_display or resize_display. Never starts the VM.
Describe the returned information so the agent knows whether it will answer the request.
Inputs78/100
7 of 9 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmId
VM ID or slug of a running Personal VM
Clear enough to supply this argument.
waitFor › oneOf › 0 › kind
Not provided
Missing description. Explain what this value means and how to supply it.
waitFor › oneOf › 0 › knownIds
IDs from a previous observation; otherwise baseline at the start of this call
Clear enough to supply this argument.
waitFor › oneOf › 0 › windowApp
Optional exact window app class, case insensitive
Clear enough to supply this argument.
waitFor › oneOf › 1 › kind
Not provided
Missing description. Explain what this value means and how to supply it.
waitFor › oneOf › 1 › displayId
Display ID, as listed by list_displays (main is the session display)
Clear enough to supply this argument.
waitMs
Maximum polling time, default 2000 ms
Clear enough to supply this argument.
teamId
Exact team ID from list_teams; never use the dashboard active team implicitly
Clear enough to supply this argument.
approvalId
Conversation approval returned by allow_team; omit only for a remembered team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_displays",
"title": "List Displays",
"description": "Experimental, Personal VMs only. List a running VM's displays. Each display is an independent screen with its own frames: the session display is main, and in the Personal desktop every app window gets its own display, with its app and title under window. Use the id with computer, open_display or resize_display. Never starts the VM.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmId",
"teamId"
],
"properties": {
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "VM ID or slug of a running Personal VM"
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID from list_teams; never use the dashboard active team implicitly"
},
"waitMs": {
"type": "integer",
"maximum": 10000,
"minimum": 0,
"description": "Maximum polling time, default 2000 ms"
},
"waitFor": {
"oneOf": [
{
"type": "object",
"required": [
"kind"
],
"properties": {
"kind": {
"type": "string",
"const": "newDisplay"
},
"knownIds": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,64}$",
"description": "Display ID, as listed by list_displays (main is the session display)"
},
"maxItems": 16,
"description": "IDs from a previous observation; otherwise baseline at the start of this call"
},
"windowApp": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Optional exact window app class, case insensitive"
}
}
},
{
"type": "object",
"required": [
"kind",
"displayId"
],
"properties": {
"kind": {
"type": "string",
"const": "closed"
},
"displayId": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,64}$",
"description": "Display ID, as listed by list_displays (main is the session display)"
}
}
}
]
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval returned by allow_team; omit only for a remembered team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
Launch an installed GUI executable on a running Personal desktop without opening a viewer. Use google-chrome for Chrome. Look at the returned displays; apps can reuse windows or open several. If no new window appeared, use list_displays to wait again before considering another launch.
Describe the returned information so the agent knows whether it will answer the request.
Inputs86/100
6 of 7 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmId
VM ID or slug of a running Personal VM
Clear enough to supply this argument.
app
Installed executable name
Clear enough to supply this argument.
args
Not provided
Missing description. Explain what this value means and how to supply it.
windowApp
Expected window app class, defaults to the executable name
Clear enough to supply this argument.
waitMs
Maximum polling time, default 2000 ms
Clear enough to supply this argument.
teamId
Exact team ID from list_teams; never use the dashboard active team implicitly
Clear enough to supply this argument.
approvalId
Conversation approval returned by allow_team; omit only for a remembered team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "launch_app",
"title": "Launch App",
"description": "Launch an installed GUI executable on a running Personal desktop without opening a viewer. Use google-chrome for Chrome. Look at the returned displays; apps can reuse windows or open several. If no new window appeared, use list_displays to wait again before considering another launch.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmId",
"app",
"teamId"
],
"properties": {
"app": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._+-]{0,127}$",
"description": "Installed executable name"
},
"args": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[^\\0]*$",
"maxLength": 2048
},
"maxItems": 32
},
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "VM ID or slug of a running Personal VM"
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID from list_teams; never use the dashboard active team implicitly"
},
"waitMs": {
"type": "integer",
"maximum": 10000,
"minimum": 0,
"description": "Maximum polling time, default 2000 ms"
},
"windowApp": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Expected window app class, defaults to the executable name"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval returned by allow_team; omit only for a remembered team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
Shorten the title to an action and subject; move usage details into the description.
Description78/100
Experimental, Personal VMs only. Hot-add a display (up to 16) to a running VM, for example one per app window so each streams on its own. Width should be a multiple of 8. accelerated uses the VM's GPU when it has one.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs57/100
4 of 7 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmId
VM ID or slug of a running Personal VM
Clear enough to supply this argument.
displayId
Display ID, as listed by list_displays (main is the session display)
Clear enough to supply this argument.
width
Not provided
Missing description. Explain what this value means and how to supply it.
height
Not provided
Missing description. Explain what this value means and how to supply it.
accelerated
Not provided
Missing description. Explain what this value means and how to supply it.
teamId
Exact team ID from list_teams; never use the dashboard active team implicitly
Clear enough to supply this argument.
approvalId
Conversation approval returned by allow_team; omit only for a remembered team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_display",
"title": "Create Display",
"description": "Experimental, Personal VMs only. Hot-add a display (up to 16) to a running VM, for example one per app window so each streams on its own. Width should be a multiple of 8. accelerated uses the VM's GPU when it has one.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmId",
"displayId",
"width",
"height",
"teamId"
],
"properties": {
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "VM ID or slug of a running Personal VM"
},
"width": {
"type": "integer",
"maximum": 8192,
"minimum": 8
},
"height": {
"type": "integer",
"maximum": 8192,
"minimum": 8
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID from list_teams; never use the dashboard active team implicitly"
},
"displayId": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,64}$",
"description": "Display ID, as listed by list_displays (main is the session display)"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval returned by allow_team; omit only for a remembered team"
},
"accelerated": {
"type": "boolean"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "remove_display",
"title": "Remove Display",
"description": "Experimental, Personal VMs only. Unplug one display from a running VM. Whatever was shown on it loses its screen.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmId",
"displayId",
"teamId"
],
"properties": {
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "VM ID or slug of a running Personal VM"
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID from list_teams; never use the dashboard active team implicitly"
},
"displayId": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,64}$",
"description": "Display ID, as listed by list_displays (main is the session display)"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval returned by allow_team; omit only for a remembered team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Experimental, Personal VMs only. Offer a new size to one display; the guest (and a window on its own display) adopts it within tens of milliseconds. Width is rounded down to a multiple of 8.
The description explains the capability, when to use it, and what to expect.
Inputs67/100
4 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmId
VM ID or slug of a running Personal VM
Clear enough to supply this argument.
displayId
Display ID, as listed by list_displays (main is the session display)
Clear enough to supply this argument.
width
Not provided
Missing description. Explain what this value means and how to supply it.
height
Not provided
Missing description. Explain what this value means and how to supply it.
teamId
Exact team ID from list_teams; never use the dashboard active team implicitly
Clear enough to supply this argument.
approvalId
Conversation approval returned by allow_team; omit only for a remembered team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "resize_display",
"title": "Resize Display",
"description": "Experimental, Personal VMs only. Offer a new size to one display; the guest (and a window on its own display) adopts it within tens of milliseconds. Width is rounded down to a multiple of 8.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmId",
"displayId",
"width",
"height",
"teamId"
],
"properties": {
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "VM ID or slug of a running Personal VM"
},
"width": {
"type": "integer",
"maximum": 8192,
"minimum": 8
},
"height": {
"type": "integer",
"maximum": 8192,
"minimum": 8
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID from list_teams; never use the dashboard active team implicitly"
},
"displayId": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,64}$",
"description": "Display ID, as listed by list_displays (main is the session display)"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval returned by allow_team; omit only for a remembered team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
Name the specific action and subject instead of using a generic label such as ‘manage’ or ‘tool’.
Description78/100
Control a running Personal VM using OpenAI computer-use actions. Use screenshot to see the screen, then send an ordered batch of click, double_click, drag, move, scroll, keypress, type, wait, or screenshot actions. Pointer coordinates are pixels in the returned screenshot. Type uses the US keyboard layout. The tool returns the final screenshot. Use list_displays to choose a display.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs11/100
4 of 33 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmId
ID of a running Personal VM
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
displayId
Display ID, as listed by list_displays (main is the session display)
Clear enough to supply this argument.
actions › items › oneOf › 0 › type
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 1 › type
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 2 › type
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 2 › x
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 2 › y
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 2 › keys
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 2 › button
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 3 › type
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 3 › x
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 3 › y
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 3 › keys
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 4 › type
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 4 › path › items › x
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 4 › path › items › y
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 4 › keys
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 5 › type
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 5 › x
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 5 › y
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 5 › keys
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 6 › type
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 6 › x
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 6 › y
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 6 › keys
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 6 › scroll_x
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 6 › scroll_y
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 7 › type
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 7 › keys
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 8 › type
Not provided
Missing description. Explain what this value means and how to supply it.
actions › items › oneOf › 8 › text
Not provided
Missing description. Explain what this value means and how to supply it.
teamId
Exact team ID from list_teams; never use the dashboard active team implicitly
Clear enough to supply this argument.
approvalId
Conversation approval returned by allow_team; omit only for a remembered team
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Open the Freestyle app, optionally at a location: a team, a VM, and one of its views (terminal, files, snapshots, ports, details), or a directory in files. With no arguments it opens on the team picker. Use this to browse or manage VMs; use open_terminal for just a shell in the chat. A location needs the exact teamId and team approval. Opening Freestyle never wakes a VM; the terminal view attaches only to a running VM.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
teamId
Not provided
Missing description. Explain what this value means and how to supply it.
approvalId
Not provided
Missing description. Explain what this value means and how to supply it.
vmId
Not provided
Missing description. Explain what this value means and how to supply it.
view
Not provided
Missing description. Explain what this value means and how to supply it.
path
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "freestyle_workspace",
"title": "Freestyle",
"description": "Open the Freestyle app, optionally at a location: a team, a VM, and one of its views (terminal, files, snapshots, ports, details), or a directory in files. With no arguments it opens on the team picker. Use this to browse or manage VMs; use open_terminal for just a shell in the chat. A location needs the exact teamId and team approval. Opening Freestyle never wakes a VM; the terminal view attaches only to a running VM.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"path": {
"type": "string",
"maxLength": 4096
},
"view": {
"enum": [
"terminal",
"files",
"snapshots",
"ports",
"details"
],
"type": "string"
},
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Hand the user a secret (a password, API key or token) stored in a file on a VM, as a card where it stays hidden until they choose Show or Copy. Always use this instead of writing a secret into your reply or a credentials block: the value never passes through you, so do not read, print or repeat it. Generate secrets inside the VM, write them to a file (chmod 600) without echoing them, then call this with a clear label, and the username and the URL where it is used when there are any. For a key: value, KEY=value or JSON file, pass field.
The description explains the capability, when to use it, and what to expect.
Inputs47/100
5 of 8 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
teamId
Not provided
Missing description. Explain what this value means and how to supply it.
approvalId
Not provided
Missing description. Explain what this value means and how to supply it.
vmId
Not provided
Missing description. Explain what this value means and how to supply it.
path
The file on the VM that holds the secret
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
field
The entry to take from a key: value, KEY=value or JSON file, like password; omit when the file holds only the secret
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
label
What it is, like NetBox admin password
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
username
The account it signs in, shown in the clear
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
url
Where it is used, like the login page
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "show_secret",
"title": "Show Secret",
"description": "Hand the user a secret (a password, API key or token) stored in a file on a VM, as a card where it stays hidden until they choose Show or Copy. Always use this instead of writing a secret into your reply or a credentials block: the value never passes through you, so do not read, print or repeat it. Generate secrets inside the VM, write them to a file (chmod 600) without echoing them, then call this with a clear label, and the username and the URL where it is used when there are any. For a key: value, KEY=value or JSON file, pass field.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamId",
"vmId",
"path",
"label"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2048,
"description": "Where it is used, like the login page"
},
"path": {
"type": "string",
"maxLength": 4096,
"minLength": 2,
"description": "The file on the VM that holds the secret"
},
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"field": {
"type": "string",
"pattern": "^[A-Za-z0-9_.-]+$",
"maxLength": 64,
"description": "The entry to take from a key: value, KEY=value or JSON file, like password; omit when the file holds only the secret"
},
"label": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "What it is, like NetBox admin password"
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"username": {
"type": "string",
"maxLength": 200,
"description": "The account it signs in, shown in the clear"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Ask the user for a secret (an API key, password or token) and save it straight to a file on a VM, without it passing through you. Use this whenever a setup needs a credential from the user; never ask them to paste one into the chat. It shows a card with a hidden input; when they save, the card writes the file (owner-only) and sends a message saying so. Pass a clear label, a short reason, the path, and envKey to write KEY=value into an env file such as /etc/myapp.env. Afterwards use it from the file (source the env file, or point the app at it) and never read or print it.
The description explains the capability, when to use it, and what to expect.
Inputs43/100
4 of 7 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
teamId
Not provided
Missing description. Explain what this value means and how to supply it.
approvalId
Not provided
Missing description. Explain what this value means and how to supply it.
vmId
Not provided
Missing description. Explain what this value means and how to supply it.
path
The file on the VM that holds the secret
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
envKey
Write KEY=value into an env file, keeping its other lines; omit for a file that holds only the secret
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
label
What to enter, like OpenAI API key
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
reason
Why it is needed, in a sentence
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "request_secret",
"title": "Request Secret",
"description": "Ask the user for a secret (an API key, password or token) and save it straight to a file on a VM, without it passing through you. Use this whenever a setup needs a credential from the user; never ask them to paste one into the chat. It shows a card with a hidden input; when they save, the card writes the file (owner-only) and sends a message saying so. Pass a clear label, a short reason, the path, and envKey to write KEY=value into an env file such as /etc/myapp.env. Afterwards use it from the file (source the env file, or point the app at it) and never read or print it.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamId",
"vmId",
"path",
"label"
],
"properties": {
"path": {
"type": "string",
"maxLength": 4096,
"minLength": 2,
"description": "The file on the VM that holds the secret"
},
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"label": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "What to enter, like OpenAI API key"
},
"envKey": {
"type": "string",
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$",
"maxLength": 128,
"description": "Write KEY=value into an env file, keeping its other lines; omit for a file that holds only the secret"
},
"reason": {
"type": "string",
"maxLength": 300,
"description": "Why it is needed, in a sentence"
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "reveal_secret",
"title": "Reveal Secret",
"description": "Used by the secret card when the user chooses Show or Copy. Not for the model.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamId",
"vmId",
"path"
],
"properties": {
"path": {
"type": "string",
"maxLength": 4096,
"minLength": 2,
"description": "The file on the VM that holds the secret"
},
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"field": {
"type": "string",
"pattern": "^[A-Za-z0-9_.-]+$",
"maxLength": 64,
"description": "The entry to take from a key: value, KEY=value or JSON file, like password; omit when the file holds only the secret"
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Shorten the title to an action and subject; move usage details into the description.
Description95/100
Show the user one VM as a card: its status, its public addresses (to open or copy) and an action or two (start, pause). Call it once when a VM is the answer: after setting something up for the user, or when they ask about a specific VM. Do not call it after every step. Reading it never wakes the VM. The user can expand the card to that VM's terminal and files.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
teamId
Not provided
Missing description. Explain what this value means and how to supply it.
vmId
Not provided
Missing description. Explain what this value means and how to supply it.
approvalId
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "show_vm",
"title": "Freestyle VM",
"description": "Show the user one VM as a card: its status, its public addresses (to open or copy) and an action or two (start, pause). Call it once when a VM is the answer: after setting something up for the user, or when they ask about a specific VM. Do not call it after every step. Reading it never wakes the VM. The user can expand the card to that VM's terminal and files.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamId",
"vmId"
],
"properties": {
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Open a live bash terminal for one VM, fullscreen (beside the chat on desktop), when the user wants to type into a shell themselves. Do not open it to run commands yourself; use exec_vm. It shows only that VM's shell; to browse other VMs or views, use freestyle_workspace. The result does not confirm that the terminal connected; do not claim success until the UI reports Connected. Can wake a VM and incur charges. Ask for team approval first. Reconnecting reuses this user's named shell. Use exec_vm for a one-off command without UI.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
teamId
Not provided
Missing description. Explain what this value means and how to supply it.
vmId
Not provided
Missing description. Explain what this value means and how to supply it.
approvalId
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "open_terminal",
"title": "Terminal",
"description": "Open a live bash terminal for one VM, fullscreen (beside the chat on desktop), when the user wants to type into a shell themselves. Do not open it to run commands yourself; use exec_vm. It shows only that VM's shell; to browse other VMs or views, use freestyle_workspace. The result does not confirm that the terminal connected; do not claim success until the UI reports Connected. Can wake a VM and incur charges. Ask for team approval first. Reconnecting reuses this user's named shell. Use exec_vm for a one-off command without UI.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamId",
"vmId"
],
"properties": {
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Experimental, Personal VMs only. Open one display of a running VM live beside the chat (fullscreen on mobile), where the user can watch and use it with mouse and keyboard. The display is resized to fill the panel. Each app window in the Personal desktop has its own display (see list_displays for ids and window titles), so this can show a single window; several displays can be open at once. The result does not confirm the stream; do not claim it is live until the UI says so. Never starts the VM.
The description explains the capability, when to use it, and what to expect.
Inputs25/100
1 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
teamId
Not provided
Missing description. Explain what this value means and how to supply it.
vmId
Not provided
Missing description. Explain what this value means and how to supply it.
displayId
Display ID, as listed by list_displays (main is the session display)
Clear enough to supply this argument.
approvalId
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "open_display",
"title": "Display",
"description": "Experimental, Personal VMs only. Open one display of a running VM live beside the chat (fullscreen on mobile), where the user can watch and use it with mouse and keyboard. The display is resized to fill the panel. Each app window in the Personal desktop has its own display (see list_displays for ids and window titles), so this can show a single window; several displays can be open at once. The result does not confirm the stream; do not claim it is live until the UI says so. Never starts the VM.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamId",
"vmId"
],
"properties": {
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"displayId": {
"type": "string",
"default": "main",
"pattern": "^[A-Za-z0-9_-]{1,64}$",
"description": "Display ID, as listed by list_displays (main is the session display)"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
End this user's plugin PTY shell on the specified team and VM. Stops commands running in that shell and discards its scrollback. Confirm before calling. Does not affect the separate dashboard shell. All this user's plugin views of this VM share the same shell.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
teamId
Not provided
Missing description. Explain what this value means and how to supply it.
vmId
Not provided
Missing description. Explain what this value means and how to supply it.
approvalId
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "close_terminal",
"title": "End VM Terminal Session",
"description": "End this user's plugin PTY shell on the specified team and VM. Stops commands running in that shell and discards its scrollback. Confirm before calling. Does not affect the separate dashboard shell. All this user's plugin views of this VM share the same shell.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamId",
"vmId"
],
"properties": {
"vmId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description98/100
GET /v5/background-requests/{requestId}. A request started with the `x-freestyle-background-after-secs` header
answers `202 Accepted` with a `requestId` once that many seconds elapse;
poll this route with it. While the request is still running this answers
`202` again; once it finishes, the request's own response — its status,
headers, and body, success or error — is returned exactly as the original
call would have. Results expire ten minutes after completion; a result
that was delivered inline (the original call returned before the window
elapsed) is not kept here.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Input documentation gives an agent enough context to populate the arguments.
requestId
The id from the 202's `requestId` field / `x-freestyle-background-request-id` header
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_background_request",
"description": "GET /v5/background-requests/{requestId}. A request started with the `x-freestyle-background-after-secs` header\nanswers `202 Accepted` with a `requestId` once that many seconds elapse;\npoll this route with it. While the request is still running this answers\n`202` again; once it finishes, the request's own response — its status,\nheaders, and body, success or error — is returned exactly as the original\ncall would have. Results expire ten minutes after completion; a result\nthat was delivered inline (the original call returned before the window\nelapsed) is not kept here.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"requestId",
"teamId"
],
"properties": {
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"requestId": {
"type": "string",
"description": "The id from the 202's `requestId` field / `x-freestyle-background-request-id` header"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description77/100
POST /v5/certificates/wildcard. Request an ongoing `*.domain` certificate. Requires `_acme-challenge.<domain>` to be NS-delegated to Freestyle's nameservers, since wildcards can only be proven over DNS.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
2 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
body › domain
Not provided
Missing description. Explain what this value means and how to supply it.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Add a human-readable title so users do not have to interpret the tool identifier.
Description81/100
POST /v5/customers. Create or update a customer in your account. Omitted fields are preserved; supplied arrays replace previous values. No billing is activated.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs34/100
6 of 14 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
body › countryCode
Not provided
Missing description. Explain what this value means and how to supply it.
body › customerId
Not provided
Missing description. Explain what this value means and how to supply it.
body › emails › anyOf › 0 › items › address
Not provided
Missing description. Explain what this value means and how to supply it.
body › emails › anyOf › 0 › items › verified
The caller's verification assertion, not verification by Freestyle.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › githubId
Not provided
Missing description. Explain what this value means and how to supply it.
body › ip
Not provided
Missing description. Explain what this value means and how to supply it.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
GET /v5/customers/{customerId}. Get the customer record identified by customerId in the selected team's account; returns an error if that customer does not exist in the account.
Describe the returned information so the agent knows whether it will answer the request.
Inputs58/100
2 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
customerId
Not provided
Missing description. Explain what this value means and how to supply it.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Add a human-readable title so users do not have to interpret the tool identifier.
Description77/100
GET /v5/domains. List the domains you hold — those you verified, and any Freestyle subdomain you have taken by publishing it. Full API options; use the shorter convenience tool for common tasks.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "api_list_domains",
"description": "GET /v5/domains. List the domains you hold — those you verified, and any Freestyle subdomain you have taken by publishing it. Full API options; use the shorter convenience tool for common tasks.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamId"
],
"properties": {
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description75/100
GET /v5/domains/placeholder. The branding your placeholder pages wear. A placeholder page is what a browser sees for a hostname under one of your verified domains that none of your TLS rules serve.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_placeholder_branding",
"description": "GET /v5/domains/placeholder. The branding your placeholder pages wear. A placeholder page is what a browser sees for a hostname under one of your verified domains that none of your TLS rules serve.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamId"
],
"properties": {
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
PUT /v5/domains/placeholder. Set the branding for every placeholder page under your verified domains — including domains you verify later. The page keeps its behaviour (a 404 that reloads itself until a route appears); only the logo and the name change. Replaces any earlier setting.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › logoUrl
An https URL of the logo, at most 2048 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › productName
Named on the page in place of Freestyle, at most 64 characters. Omit
for logo only.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "set_placeholder_branding",
"description": "PUT /v5/domains/placeholder. Set the branding for every placeholder page under your verified domains — including domains you verify later. The page keeps its behaviour (a 404 that reloads itself until a route appears); only the logo and the name change. Replaces any earlier setting.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"required": [
"logoUrl"
],
"properties": {
"logoUrl": {
"type": "string",
"example": "https://cdn.example.com/logo.svg",
"description": "An https URL of the logo, at most 2048 characters."
},
"productName": {
"type": [
"string",
"null"
],
"example": "Example Cloud",
"description": "Named on the page in place of Freestyle, at most 64 characters. Omit\nfor logo only."
}
},
"additionalProperties": {}
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description76/100
POST /v5/firewall/evaluate. Ask whether a connection would be allowed by your rules, without changing anything. Useful for checking a rule set before you rely on it. Traffic Freestyle itself delivers — a mapped domain, the SSH proxy — answers `allowedByPlatform`: it is allowed whatever your rules say, and no rule can block it. Outbound mail answers `deniedByPlatform`: a connection to a mail port on the public Internet is closed whatever your rules say, and goes through an `smtp` TLS rule instead.
Describe the returned information so the agent knows whether it will answer the request.
Inputs54/100
10 of 17 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
body › destination › address
The address in use, when there is one — what `cidr` rules are tested against.
Clear enough to supply this argument.
body › destination › platform
Freestyle's own ingress — the web proxy serving a mapped domain, or the
SSH proxy. Always allowed, whatever the rules say.
Clear enough to supply this argument.
body › destination › port
Not provided
Missing description. Explain what this value means and how to supply it.
body › destination › public
Whether that address is publicly routable — what `public: true` matches.
Clear enough to supply this argument.
body › destination › tunnelId
Not provided
Missing description. Explain what this value means and how to supply it.
body › destination › vmId
Not provided
Missing description. Explain what this value means and how to supply it.
body › destination › vpcIds
Every private network this party is on; a rule naming one of them matches.
Clear enough to supply this argument.
body › protocol
Not provided
Missing description. Explain what this value means and how to supply it.
body › source › address
The address in use, when there is one — what `cidr` rules are tested against.
Clear enough to supply this argument.
body › source › platform
Freestyle's own ingress — the web proxy serving a mapped domain, or the
SSH proxy. Always allowed, whatever the rules say.
Clear enough to supply this argument.
body › source › port
Not provided
Missing description. Explain what this value means and how to supply it.
body › source › public
Whether that address is publicly routable — what `public: true` matches.
Clear enough to supply this argument.
body › source › tunnelId
Not provided
Missing description. Explain what this value means and how to supply it.
body › source › vmId
Not provided
Missing description. Explain what this value means and how to supply it.
body › source › vpcIds
Every private network this party is on; a rule naming one of them matches.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "evaluate_firewall",
"description": "POST /v5/firewall/evaluate. Ask whether a connection would be allowed by your rules, without changing anything. Useful for checking a rule set before you rely on it. Traffic Freestyle itself delivers — a mapped domain, the SSH proxy — answers `allowedByPlatform`: it is allowed whatever your rules say, and no rule can block it. Outbound mail answers `deniedByPlatform`: a connection to a mail port on the public Internet is closed whatever your rules say, and goes through an `smtp` TLS rule instead.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"required": [
"destination",
"source"
],
"properties": {
"source": {
"type": "object",
"properties": {
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
]
},
"vmId": {
"type": [
"string",
"null"
]
},
"public": {
"type": "boolean",
"description": "Whether that address is publicly routable — what `public: true` matches."
},
"vpcIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Every private network this party is on; a rule naming one of them matches."
},
"address": {
"type": [
"string",
"null"
],
"description": "The address in use, when there is one — what `cidr` rules are tested against."
},
"platform": {
"type": "boolean",
"description": "Freestyle's own ingress — the web proxy serving a mapped domain, or the\nSSH proxy. Always allowed, whatever the rules say."
},
"tunnelId": {
"type": [
"string",
"null"
]
}
},
"description": "One end of a connection to ask about: everything true about the party, not\na pattern.",
"additionalProperties": false
},
"protocol": {
"oneOf": [
{
"type": "null"
},
{
"enum": [
"tcp",
"udp",
"icmp"
],
"type": "string",
"description": "The transport a matcher is restricted to."
}
]
},
"destination": {
"type": "object",
"properties": {
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
]
},
"vmId": {
"type": [
"string",
"null"
]
},
"public": {
"type": "boolean",
"description": "Whether that address is publicly routable — what `public: true` matches."
},
"vpcIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Every private network this party is on; a rule naming one of them matches."
},
"address": {
"type": [
"string",
"null"
],
"description": "The address in use, when there is one — what `cidr` rules are tested against."
},
"platform": {
"type": "boolean",
"description": "Freestyle's own ingress — the web proxy serving a mapped domain, or the\nSSH proxy. Always allowed, whatever the rules say."
},
"tunnelId": {
"type": [
"string",
"null"
]
}
},
"description": "One end of a connection to ask about: everything true about the party, not\na pattern.",
"additionalProperties": false
}
},
"description": "A connection to decide about.",
"additionalProperties": false
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description79/100
GET /v5/firewall/rules. List your firewall rules, newest first. Filter by `vmId` to get the rules that apply to one VM — those naming it, plus those naming a private network it is attached to — or by `vpcId`/`tunnelId` for the rules naming one of those.
Describe the returned information so the agent knows whether it will answer the request.
Inputs71/100
5 of 7 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmId
Rules that apply to this VM: those naming it, plus those naming a
private network it is attached to. Its id, or your slug for it.
Clear enough to supply this argument.
vpcId
Rules naming this private network. Its id, or your slug for it.
Clear enough to supply this argument.
tunnelId
Rules naming this tunnel, by its id.
Clear enough to supply this argument.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
offset
Not provided
Missing description. Explain what this value means and how to supply it.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_firewall_rules",
"description": "GET /v5/firewall/rules. List your firewall rules, newest first. Filter by `vmId` to get the rules that apply to one VM — those naming it, plus those naming a private network it is attached to — or by `vpcId`/`tunnelId` for the rules naming one of those.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamId"
],
"properties": {
"vmId": {
"type": "string",
"description": "Rules that apply to this VM: those naming it, plus those naming a\nprivate network it is attached to. Its id, or your slug for it."
},
"limit": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"vpcId": {
"type": "string",
"description": "Rules naming this private network. Its id, or your slug for it."
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"tunnelId": {
"type": "string",
"description": "Rules naming this tunnel, by its id."
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description77/100
POST /v5/firewall/rules. Allow traffic from one place to another. Both `source` and `destination` are matchers whose fields intersect; use `public: true` for the public Internet. A rule naming a VM, a private network, or a tunnel is deleted automatically when that resource is.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs65/100
16 of 18 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
body › action
What a rule does with the traffic it matches.
Only `allow` exists today, and it is required on every rule rather than
defaulted: a default would mean that the day `deny` arrives, every rule
written before it silently acquires an action it never stated.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › description
A free-form note, up to 1024 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › destination › cidr
An address range, IPv4 or IPv6, in canonical `network/prefix` form.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › destination › port
A single port, 1–65535. Requires `protocol`.
Resolve the mismatch between this description and its schema constraints.
body › destination › protocol
Not provided
Missing description. Explain what this value means and how to supply it.
body › destination › public
Every publicly routable address, whoever owns it — including another
Freestyle VM reached at its public address. Only `true` is meaningful;
omit the field otherwise. Not combined with `vmId` or `vpcId`.
Clear enough to supply this argument.
body › destination › tunnelId
Whatever is on the far side of one tunnel — the client that dials it,
and any remote range routed over it. Tunnels have no slug, so this is a
tunnel id: `tun-…`, or `wg-…` for one carried over from the per-VPC VPN
records tunnels replaced.
Clear enough to supply this argument.
body › destination › vmId
A single VM, by id or by your slug for it. Answers hold its id.
Clear enough to supply this argument.
body › destination › vpcId
Everything on one private network, by id or by your slug for it.
Answers hold its id.
Clear enough to supply this argument.
body › source › cidr
An address range, IPv4 or IPv6, in canonical `network/prefix` form.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › source › port
A single port, 1–65535. Requires `protocol`.
Resolve the mismatch between this description and its schema constraints.
body › source › protocol
Not provided
Missing description. Explain what this value means and how to supply it.
body › source › public
Every publicly routable address, whoever owns it — including another
Freestyle VM reached at its public address. Only `true` is meaningful;
omit the field otherwise. Not combined with `vmId` or `vpcId`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › source › tunnelId
Whatever is on the far side of one tunnel — the client that dials it,
and any remote range routed over it. Tunnels have no slug, so this is a
tunnel id: `tun-…`, or `wg-…` for one carried over from the per-VPC VPN
records tunnels replaced.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › source › vmId
A single VM, by id or by your slug for it. Answers hold its id.
Clear enough to supply this argument.
body › source › vpcId
Everything on one private network, by id or by your slug for it.
Answers hold its id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_firewall_rule",
"description": "POST /v5/firewall/rules. Allow traffic from one place to another. Both `source` and `destination` are matchers whose fields intersect; use `public: true` for the public Internet. A rule naming a VM, a private network, or a tunnel is deleted automatically when that resource is.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"required": [
"action",
"destination",
"source"
],
"properties": {
"action": {
"type": "string",
"const": "allow",
"description": "What a rule does with the traffic it matches.\n\nOnly `allow` exists today, and it is required on every rule rather than\ndefaulted: a default would mean that the day `deny` arrives, every rule\nwritten before it silently acquires an action it never stated."
},
"source": {
"type": "object",
"properties": {
"cidr": {
"type": [
"string",
"null"
],
"description": "An address range, IPv4 or IPv6, in canonical `network/prefix` form."
},
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "A single port, 1–65535. Requires `protocol`."
},
"vmId": {
"type": [
"string",
"null"
],
"description": "A single VM, by id or by your slug for it. Answers hold its id."
},
"vpcId": {
"type": [
"string",
"null"
],
"description": "Everything on one private network, by id or by your slug for it.\nAnswers hold its id."
},
"public": {
"type": [
"boolean",
"null"
],
"description": "Every publicly routable address, whoever owns it — including another\nFreestyle VM reached at its public address. Only `true` is meaningful;\nomit the field otherwise. Not combined with `vmId` or `vpcId`."
},
"protocol": {
"oneOf": [
{
"type": "null"
},
{
"enum": [
"tcp",
"udp",
"icmp"
],
"type": "string",
"description": "The transport a matcher is restricted to."
}
]
},
"tunnelId": {
"type": [
"string",
"null"
],
"description": "Whatever is on the far side of one tunnel — the client that dials it,\nand any remote range routed over it. Tunnels have no slug, so this is a\ntunnel id: `tun-…`, or `wg-…` for one carried over from the per-VPC VPN\nrecords tunnels replaced."
}
},
"description": "One end of a rule: which traffic this side matches.\n\nFields intersect — `{ vpcId, port, protocol }` is \"traffic in that network,\non that port, over that protocol\". `vmId`/`vpcId`/`tunnelId` select by\nidentity (the VM however it is addressed); `cidr`/`public` select by\naddress. Unknown fields\nare rejected rather than ignored: a matcher is a security statement, and a\ntypo'd `porrt: 22` that quietly became \"every port\" is the wrong failure.",
"additionalProperties": false
},
"description": {
"type": [
"string",
"null"
],
"description": "A free-form note, up to 1024 characters."
},
"destination": {
"type": "object",
"properties": {
"cidr": {
"type": [
"string",
"null"
],
"description": "An address range, IPv4 or IPv6, in canonical `network/prefix` form."
},
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "A single port, 1–65535. Requires `protocol`."
},
"vmId": {
"type": [
"string",
"null"
],
"description": "A single VM, by id or by your slug for it. Answers hold its id."
},
"vpcId": {
"type": [
"string",
"null"
],
"description": "Everything on one private network, by id or by your slug for it.\nAnswers hold its id."
},
"public": {
"type": [
"boolean",
"null"
],
"description": "Every publicly routable address, whoever owns it — including another\nFreestyle VM reached at its public address. Only `true` is meaningful;\nomit the field otherwise. Not combined with `vmId` or `vpcId`."
},
"protocol": {
"oneOf": [
{
"type": "null"
},
{
"enum": [
"tcp",
"udp",
"icmp"
],
"type": "string",
"description": "The transport a matcher is restricted to."
}
]
},
"tunnelId": {
"type": [
"string",
"null"
],
"description": "Whatever is on the far side of one tunnel — the client that dials it,\nand any remote range routed over it. Tunnels have no slug, so this is a\ntunnel id: `tun-…`, or `wg-…` for one carried over from the per-VPC VPN\nrecords tunnels replaced."
}
},
"description": "One end of a rule: which traffic this side matches.\n\nFields intersect — `{ vpcId, port, protocol }` is \"traffic in that network,\non that port, over that protocol\". `vmId`/`vpcId`/`tunnelId` select by\nidentity (the VM however it is addressed); `cidr`/`public` select by\naddress. Unknown fields\nare rejected rather than ignored: a matcher is a security statement, and a\ntypo'd `porrt: 22` that quietly became \"every port\" is the wrong failure.",
"additionalProperties": false
}
},
"additionalProperties": false
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
GET /v5/hardware/{hardwareId}/power. Read a machine's power: whether every cord is live, what it is drawing, and how much of its rate limit is left. Reading is free and never limited.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Explain the meaning of this value, not just its name.
hardwareId
Hardware machine id
Explain the meaning of this value, not just its name.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
POST /v5/hardware/{hardwareId}/power. Switch a physical machine's power.
This is a real power outlet, so it is deliberately narrow. The unit is the whole machine: machines with redundant supplies draw from several cords and all of them are switched together, because cutting one browns the machine out instead of powering it off. `cycle` cuts power, holds a few seconds, and restores it — anything running stops immediately, with no chance to shut down cleanly.
Heavily rate limited: one power-cutting action every few minutes and a small daily budget per machine, both reported by `GET /hardware/{hardwareId}/power`. Turning power back **on** is never rationed, only briefly debounced. Exceeding a limit is a 429 whose message says when to come back.
Describe the returned information so the agent knows whether it will answer the request.
Inputs81/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
hardwareId
Hardware machine id
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
body › action
What to do to a machine's power.
The unit is always the whole machine. A machine with redundant supplies
draws from several cords, and Freestyle switches all of them together —
there is no way to ask for one, because cutting one cord browns a machine
out rather than powering it off.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "set_hardware_power",
"description": "POST /v5/hardware/{hardwareId}/power. Switch a physical machine's power.\n\nThis is a real power outlet, so it is deliberately narrow. The unit is the whole machine: machines with redundant supplies draw from several cords and all of them are switched together, because cutting one browns the machine out instead of powering it off. `cycle` cuts power, holds a few seconds, and restores it — anything running stops immediately, with no chance to shut down cleanly.\n\nHeavily rate limited: one power-cutting action every few minutes and a small daily budget per machine, both reported by `GET /hardware/{hardwareId}/power`. Turning power back **on** is never rationed, only briefly debounced. Exceeding a limit is a 429 whose message says when to come back.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"hardwareId",
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"required": [
"action"
],
"properties": {
"action": {
"enum": [
"cycle",
"on",
"off"
],
"type": "string",
"description": "What to do to a machine's power.\n\nThe unit is always the whole machine. A machine with redundant supplies\ndraws from several cords, and Freestyle switches all of them together —\nthere is no way to ask for one, because cutting one cord browns a machine\nout rather than powering it off."
}
},
"additionalProperties": {}
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"hardwareId": {
"type": "string",
"description": "Hardware machine id"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
DELETE /v5/snapshots/{snapshotIdOrSlug}. Delete a snapshot permanently. VMs already created from it are unaffected — a snapshot is a pointer to the data backing them, not the data itself — and its slug is freed immediately. Full API options; use the shorter convenience tool for common tasks.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
snapshotIdOrSlug
Snapshot id or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "api_delete_snapshot",
"description": "DELETE /v5/snapshots/{snapshotIdOrSlug}. Delete a snapshot permanently. VMs already created from it are unaffected — a snapshot is a pointer to the data backing them, not the data itself — and its slug is freed immediately. Full API options; use the shorter convenience tool for common tasks.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"snapshotIdOrSlug",
"teamId"
],
"properties": {
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"snapshotIdOrSlug": {
"type": "string",
"description": "Snapshot id or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "api_get_snapshot",
"description": "GET /v5/snapshots/{snapshotIdOrSlug}. Fetch a snapshot by its id or its slug. Full API options; use the shorter convenience tool for common tasks.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"snapshotIdOrSlug",
"teamId"
],
"properties": {
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"snapshotIdOrSlug": {
"type": "string",
"description": "Snapshot id, your slug, or `{owner}/{slug}` for a public one"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description69/100
PATCH /v5/snapshots/{snapshotIdOrSlug}. Rename a snapshot or change its slug.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs64/100
5 of 7 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
snapshotIdOrSlug
Snapshot id or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
body › autoDeleteSeconds
Seconds of nothing being created from it before the snapshot is
deleted; -1 removes the window. On a plan that caps it, -1 puts you
back on the cap rather than off it.
Clear enough to supply this argument.
body › displayName
Not provided
Missing description. Explain what this value means and how to supply it.
body › slug
Not provided
Missing description. Explain what this value means and how to supply it.
body › ttlSeconds
Seconds from when the snapshot was taken — not from now — before it is
deleted; -1 removes the deadline.
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update_snapshot",
"description": "PATCH /v5/snapshots/{snapshotIdOrSlug}. Rename a snapshot or change its slug.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"snapshotIdOrSlug",
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"properties": {
"slug": {
"type": [
"string",
"null"
]
},
"ttlSeconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Seconds from when the snapshot was taken — not from now — before it is\ndeleted; -1 removes the deadline."
},
"displayName": {
"type": [
"string",
"null"
]
},
"autoDeleteSeconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Seconds of nothing being created from it before the snapshot is\ndeleted; -1 removes the window. On a plan that caps it, -1 puts you\nback on the cap rather than off it."
}
},
"additionalProperties": false
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"snapshotIdOrSlug": {
"type": "string",
"description": "Snapshot id or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description78/100
GET /v5/tls. List your TLS rules, newest first. Filter by `vmId` to get the rules that apply to one VM — those naming it, plus those naming a private network it is attached to — by `vpcId` for the rules naming a private network, or by `domain` for the rules written on exactly that name.
Describe the returned information so the agent knows whether it will answer the request.
Inputs68/100
5 of 7 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmId
Rules that apply to this VM: those naming it, plus those naming a private
network it is attached to. Its id, or your slug for it.
Clear enough to supply this argument.
vpcId
Rules naming this private network. Its id, or your slug for it.
Clear enough to supply this argument.
domain
Rules for exactly this domain, as written on the rule (e.g.
`app.acme.com` or `*.acme.com`).
Clear enough to supply this argument.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
offset
Not provided
Missing description. Explain what this value means and how to supply it.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_tls_rules",
"description": "GET /v5/tls. List your TLS rules, newest first. Filter by `vmId` to get the rules that apply to one VM — those naming it, plus those naming a private network it is attached to — by `vpcId` for the rules naming a private network, or by `domain` for the rules written on exactly that name.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamId"
],
"properties": {
"vmId": {
"type": "string",
"description": "Rules that apply to this VM: those naming it, plus those naming a private\nnetwork it is attached to. Its id, or your slug for it."
},
"limit": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"vpcId": {
"type": "string",
"description": "Rules naming this private network. Its id, or your slug for it."
},
"domain": {
"type": "string",
"description": "Rules for exactly this domain, as written on the rule (e.g.\n`app.acme.com` or `*.acme.com`)."
},
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description80/100
POST /v5/tls. Allow a named session over a domain: a session addressed to `domain`, from `source`, to `destination`. A `source` says who may open it (`vmId`/`vpcId`/`public: true`); a `destination` says where it lands (`vmId`+`port`, `host`+`port`, or `public: true` for the domain's own origin). A `transform` rewrites the session in flight — setting a header, or completing a Postgres handshake with credentials the guest never holds; its secrets are write-only and read back as `"***"`. A rule naming a VM or private network is deleted automatically when that resource is.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs58/100
38 of 53 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
body › action
What a rule does with the named session it matches.
Only `allow` exists today, and it is required on every rule rather than
defaulted: a default would mean that the day `deny` arrives, every rule
written before it silently acquires an action it never stated.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › description
A free-form note, up to 1024 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › destination › host
**Destination only.** Pin the session to this host instead of resolving
the domain, while still presenting `domain` as the SNI.
Clear enough to supply this argument.
body › destination › port
**Destination only.** The port the session lands on. Required with a
`vmId` or `host` destination; defaults to 443 for a `public` origin.
Clear enough to supply this argument.
body › destination › public
On a source, every publicly routable client — the open Internet dials the
name. On a destination, the domain's own public origin. Only `true` is
meaningful; omit the field otherwise.
Clear enough to supply this argument.
body › destination › vmId
A single VM, by id or by your slug for it. On a source, the VM that may
open the session; on a destination, the VM it lands on. Answers hold its id.
Clear enough to supply this argument.
body › destination › vpcId
Everything on one private network, by id or by your slug for it. **Source
only** — a landing is one place, so a network cannot be a destination.
Answers hold its id.
Clear enough to supply this argument.
body › domain
The name the session is addressed to: exact, `*.suffix`, or `*`.
Clear enough to supply this argument.
body › forwardAuth › oneOf › 1 › id
The configuration id returned by `POST /v5/tls/forward-auth`.
Clear enough to supply this argument.
body › freestyleAuth › oneOf › 1 › domains
Exact verified email domains, without implicit subdomains.
Clear enough to supply this argument.
body › freestyleAuth › oneOf › 1 › emails
Not provided
Missing description. Explain what this value means and how to supply it.
body › freestyleAuth › oneOf › 1 › public
Any signed-in Freestyle user. This never permits anonymous requests.
Clear enough to supply this argument.
body › freestyleAuth › oneOf › 1 › team
Members of the account that owns the TLS rule.
Clear enough to supply this argument.
body › match › oneOf › 1 › method
Case-sensitive HTTP method tokens. Omitted matches any; an empty list matches none.
Clear enough to supply this argument.
body › match › oneOf › 1 › path › oneOf › 1 › exact
Not provided
Missing description. Explain what this value means and how to supply it.
body › protocol
Not provided
Missing description. Explain what this value means and how to supply it.
body › source › host
**Destination only.** Pin the session to this host instead of resolving
the domain, while still presenting `domain` as the SNI.
Resolve the mismatch between this description and its schema constraints.
body › source › port
**Destination only.** The port the session lands on. Required with a
`vmId` or `host` destination; defaults to 443 for a `public` origin.
Resolve the mismatch between this description and its schema constraints.
body › source › public
On a source, every publicly routable client — the open Internet dials the
name. On a destination, the domain's own public origin. Only `true` is
meaningful; omit the field otherwise.
Clear enough to supply this argument.
body › source › vmId
A single VM, by id or by your slug for it. On a source, the VM that may
open the session; on a destination, the VM it lands on. Answers hold its id.
Clear enough to supply this argument.
body › source › vpcId
Everything on one private network, by id or by your slug for it. **Source
only** — a landing is one place, so a network cannot be a destination.
Answers hold its id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › transform › items › oneOf › 0 › headers
Set request headers on an `http` session. Header names are preserved
(they are not secret); values are write-only.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_tls_rule",
"description": "POST /v5/tls. Allow a named session over a domain: a session addressed to `domain`, from `source`, to `destination`. A `source` says who may open it (`vmId`/`vpcId`/`public: true`); a `destination` says where it lands (`vmId`+`port`, `host`+`port`, or `public: true` for the domain's own origin). A `transform` rewrites the session in flight — setting a header, or completing a Postgres handshake with credentials the guest never holds; its secrets are write-only and read back as `\"***\"`. A rule naming a VM or private network is deleted automatically when that resource is.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"required": [
"action",
"domain"
],
"properties": {
"match": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"properties": {
"path": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"required": [
"exact"
],
"properties": {
"exact": {
"type": "string"
}
},
"description": "Exact request path. Prefix and regex matching are not supported yet.",
"additionalProperties": false
}
]
},
"method": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Case-sensitive HTTP method tokens. Omitted matches any; an empty list matches none."
}
},
"description": "Select which HTTP egress requests receive a rule's transforms.\nIncluded dimensions are ANDed; methods are ORed. An empty object matches all.\nA non-match skips every transform, without denying access to the origin.\nSee <https://vercel.com/docs/sandbox/concepts/firewall#matchers>.",
"additionalProperties": false
}
]
},
"action": {
"type": "string",
"const": "allow",
"description": "What a rule does with the named session it matches.\n\nOnly `allow` exists today, and it is required on every rule rather than\ndefaulted: a default would mean that the day `deny` arrives, every rule\nwritten before it silently acquires an action it never stated."
},
"domain": {
"type": "string",
"description": "The name the session is addressed to: exact, `*.suffix`, or `*`."
},
"source": {
"type": "object",
"properties": {
"host": {
"type": [
"string",
"null"
],
"description": "**Destination only.** Pin the session to this host instead of resolving\nthe domain, while still presenting `domain` as the SNI."
},
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "**Destination only.** The port the session lands on. Required with a\n`vmId` or `host` destination; defaults to 443 for a `public` origin."
},
"vmId": {
"type": [
"string",
"null"
],
"description": "A single VM, by id or by your slug for it. On a source, the VM that may\nopen the session; on a destination, the VM it lands on. Answers hold its id."
},
"vpcId": {
"type": [
"string",
"null"
],
"description": "Everything on one private network, by id or by your slug for it. **Source\nonly** — a landing is one place, so a network cannot be a destination.\nAnswers hold its id."
},
"public": {
"type": [
"boolean",
"null"
],
"description": "On a source, every publicly routable client — the open Internet dials the\nname. On a destination, the domain's own public origin. Only `true` is\nmeaningful; omit the field otherwise."
}
},
"description": "One end of a rule: which session this side matches.\n\nA `source` says *who* may open the session (`vmId`/`vpcId`/`public: true`); a\n`destination` says *where it lands* (`vmId`+`port`, `host`+`port`, or\n`public: true` for the domain's own origin). Unknown fields are rejected\nrather than ignored: a rule is a security statement, and a typo that quietly\nwidened it is the wrong failure.",
"additionalProperties": false
},
"protocol": {
"oneOf": [
{
"type": "null"
},
{
"enum": [
"tcp",
"http",
"postgres",
"minecraft",
"imap",
"imaps",
"socks5"
],
"type": "string",
"description": "How the edge treats the session's bytes, and therefore which of its front\ndoors serves the rule.\n\n`http` (443) and `postgres` (5432) terminate the session, so each pairs with\nthe transform kind that speaks it and each needs a certificate for the name.\n`minecraft` (25565) routes on the server address in the client's handshake\nand then splices — no TLS, so no certificate and no transform.\n\nThe other two doors carry a terminating protocol and a splicing one at once,\nand a rule picks which it is. `tcp` shares 443 with `http`: match on SNI,\nsplice the bytes, terminate nothing, so your VM's own certificate answers the\nhandshake. `imap` and `imaps` share 993 for mail clients — `imap` terminates\non a certificate issued for the name and forwards plain IMAP to the port your\nserver listens on (143 by default), `imaps` splices to a server holding its\nown certificate on 993. All three splicing shapes are public ingress only.\n\n`socks5` (1080) goes the other way and is the only egress-only protocol. Your\nVM opens SOCKS5 to the platform edge with no authentication, names its own\ndestination inside the request, and the edge opens the session onward through\nyour proxy provider using the credentials a `socks5` transform carries — so\nthe workload can use the subscription without ever holding it. Nothing is\nterminated: your TLS runs end to end to the real origin. The rule's `domain`\nis an allow-list of destinations rather than a name anything resolves, which\nis why `*` is allowed here and refused everywhere else."
}
]
},
"transform": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"headers"
],
"properties": {
"headers": {
"type": "object",
"properties": {},
"description": "Set request headers on an `http` session. Header names are preserved\n(they are not secret); values are write-only.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
},
"description": "Set request headers on an `http` session. Header names are preserved\n(they are not secret); values are write-only.",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"jsonPatch"
],
"properties": {
"jsonPatch": {
"type": "array",
"items": {
"oneOf": [
{
"allOf": [
{
"type": "object",
"required": [
"path",
"value"
],
"properties": {
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
},
"value": {
"description": "Value to add to the target location."
}
},
"description": "JSON Patch 'add' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "add"
}
},
"additionalProperties": {}
}
],
"description": "'add' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
}
},
"description": "JSON Patch 'remove' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "remove"
}
},
"additionalProperties": {}
}
],
"description": "'remove' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"path",
"value"
],
"properties": {
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
},
"value": {
"description": "Value to replace with."
}
},
"description": "JSON Patch 'replace' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "replace"
}
},
"additionalProperties": {}
}
],
"description": "'replace' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"from",
"path"
],
"properties": {
"from": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nto move value from."
},
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
}
},
"description": "JSON Patch 'move' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "move"
}
},
"additionalProperties": {}
}
],
"description": "'move' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"from",
"path"
],
"properties": {
"from": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nto copy value from."
},
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
}
},
"description": "JSON Patch 'copy' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "copy"
}
},
"additionalProperties": {}
}
],
"description": "'copy' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"path",
"value"
],
"properties": {
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
},
"value": {
"description": "Value to test against."
}
},
"description": "JSON Patch 'test' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "test"
}
},
"additionalProperties": {}
}
],
"description": "'test' operation"
}
],
"description": "JSON Patch single patch operation"
},
"description": "Ordered RFC 6902 operations. Values are write-only and read back as `\"***\"`.\nA rule accepts one patch, with at most 128 operations and 64 KiB of configuration."
}
},
"description": "Apply RFC 6902 operations to JSON HTTP egress request bodies.\nValues are write-only; operation names and JSON Pointer paths remain visible.",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"postgres"
],
"properties": {
"postgres": {
"type": "object",
"required": [
"password",
"username"
],
"properties": {
"database": {
"type": [
"string",
"null"
],
"description": "The database to select. Optional: omitted leaves the guest's choice."
},
"password": {
"type": "string",
"description": "The upstream password. Write-only: sealed at rest, read back as `\"***\"`."
},
"username": {
"type": "string",
"description": "The upstream role to authenticate as."
}
},
"description": "Credentials injected into a Postgres startup handshake. The guest connects\nwith no password; the edge completes the real handshake upstream.",
"additionalProperties": false
}
},
"description": "Inject credentials into a `postgres` handshake.",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"socks5"
],
"properties": {
"socks5": {
"type": "object",
"required": [
"password",
"username"
],
"properties": {
"password": {
"type": "string",
"description": "The password to present to the upstream proxy. Write-only: sealed at\nrest, read back as `\"***\"`."
},
"username": {
"type": "string",
"description": "The username to present to the upstream proxy."
}
},
"description": "Credentials presented to an upstream SOCKS5 proxy. Your VM connects to the\nplatform's SOCKS5 front with no authentication at all; the edge authenticates\nto your provider on its behalf, so the subscription is never inside the VM.",
"additionalProperties": false
}
},
"description": "Authenticate a `socks5` session to your upstream proxy provider.",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"s3"
],
"properties": {
"s3": {
"type": "object",
"required": [
"credentials",
"region",
"scope"
],
"properties": {
"scope": {
"type": "object",
"required": [
"bucket",
"operations",
"prefix"
],
"properties": {
"bucket": {
"type": "string"
},
"prefix": {
"type": "string",
"description": "Literal UTF-8 key prefix, including a trailing slash for a directory boundary."
},
"operations": {
"type": "array",
"items": {
"enum": [
"GetObject",
"HeadObject",
"PutObject",
"DeleteObject",
"ListObjects",
"ListObjectsV2",
"CreateMultipartUpload",
"UploadPart",
"ListParts",
"CompleteMultipartUpload",
"AbortMultipartUpload",
"ListMultipartUploads"
],
"type": "string"
}
}
},
"additionalProperties": false
},
"region": {
"type": "string"
},
"credentials": {
"type": "object",
"required": [
"accessKeyId",
"secretAccessKey"
],
"properties": {
"accessKeyId": {
"type": "string"
},
"sessionToken": {
"type": [
"string",
"null"
]
},
"secretAccessKey": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
},
"description": "Authorize and sign scoped S3 HTTP requests at the edge.",
"additionalProperties": {}
}
],
"description": "The rewrites a rule applies, in order."
},
"description": "Rewrites applied in flight, in order. Secrets here are write-only."
},
"description": {
"type": [
"string",
"null"
],
"description": "A free-form note, up to 1024 characters."
},
"destination": {
"type": "object",
"properties": {
"host": {
"type": [
"string",
"null"
],
"description": "**Destination only.** Pin the session to this host instead of resolving\nthe domain, while still presenting `domain` as the SNI."
},
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "**Destination only.** The port the session lands on. Required with a\n`vmId` or `host` destination; defaults to 443 for a `public` origin."
},
"vmId": {
"type": [
"string",
"null"
],
"description": "A single VM, by id or by your slug for it. On a source, the VM that may\nopen the session; on a destination, the VM it lands on. Answers hold its id."
},
"vpcId": {
"type": [
"string",
"null"
],
"description": "Everything on one private network, by id or by your slug for it. **Source\nonly** — a landing is one place, so a network cannot be a destination.\nAnswers hold its id."
},
"public": {
"type": [
"boolean",
"null"
],
"description": "On a source, every publicly routable client — the open Internet dials the\nname. On a destination, the domain's own public origin. Only `true` is\nmeaningful; omit the field otherwise."
}
},
"description": "One end of a rule: which session this side matches.\n\nA `source` says *who* may open the session (`vmId`/`vpcId`/`public: true`); a\n`destination` says *where it lands* (`vmId`+`port`, `host`+`port`, or\n`public: true` for the domain's own origin). Unknown fields are rejected\nrather than ignored: a rule is a security statement, and a typo that quietly\nwidened it is the wrong failure.",
"additionalProperties": false
},
"forwardAuth": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The configuration id returned by `POST /v5/tls/forward-auth`."
}
},
"description": "A reusable authorization check attached to public HTTP ingress.",
"additionalProperties": false
}
]
},
"freestyleAuth": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"properties": {
"team": {
"type": "boolean",
"description": "Members of the account that owns the TLS rule."
},
"emails": {
"type": "array",
"items": {
"type": "string"
}
},
"public": {
"type": "boolean",
"description": "Any signed-in Freestyle user. This never permits anonymous requests."
},
"domains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Exact verified email domains, without implicit subdomains."
}
},
"description": "Require a Freestyle login. A signed-in visitor is allowed when ANY criterion\nmatches. Email criteria require a verified email and exact domain matching.",
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description70/100
POST /v5/tls/forward-auth. Create a reusable authorization check for public HTTP ingress. Freestyle sends a bodyless GET to the HTTPS endpoint before waking or forwarding to the VM. Static header values are write-only and sealed at rest.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › authResponseHeaders
Headers copied from a successful check onto the VM request.
Clear enough to supply this argument.
body › headers
Static headers added to the check. Values are write-only.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › protectedCookies
Cookie names visible to the check but withheld from the VM.
Clear enough to supply this argument.
body › timeoutMs
Per-check deadline in milliseconds. Defaults to 1500; range 100-5000.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › url
Absolute HTTPS endpoint receiving a bodyless GET before the VM request.
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Add a human-readable title so users do not have to interpret the tool identifier.
Description76/100
PUT /v5/tls/forward-auth/{forwardAuthId}. Replace a reusable authorization check in place, including rotating its static headers. Rules keep referencing the same id.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs75/100
Explain the meaning of this value, not just its name.
forwardAuthId
forwardAuth configuration id
Explain the meaning of this value, not just its name.
body › authResponseHeaders
Headers copied from a successful check onto the VM request.
Clear enough to supply this argument.
body › headers
Static headers added to the check. Values are write-only.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › protectedCookies
Cookie names visible to the check but withheld from the VM.
Clear enough to supply this argument.
body › timeoutMs
Per-check deadline in milliseconds. Defaults to 1500; range 100-5000.
Resolve the mismatch between this description and its schema constraints.
body › url
Absolute HTTPS endpoint receiving a bodyless GET before the VM request.
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Add a human-readable title so users do not have to interpret the tool identifier.
Description83/100
PUT /v5/tls/{ruleId}. Replace a TLS rule in place — the one mutation this API allows, so a rotating secret can change without dropping traffic. The body is a whole rule, exactly as create takes it.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs62/100
39 of 54 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
ruleId
TLS rule id
Explain the meaning of this value, not just its name.
body › action
What a rule does with the named session it matches.
Only `allow` exists today, and it is required on every rule rather than
defaulted: a default would mean that the day `deny` arrives, every rule
written before it silently acquires an action it never stated.
Clear enough to supply this argument.
body › description
A free-form note, up to 1024 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › destination › host
**Destination only.** Pin the session to this host instead of resolving
the domain, while still presenting `domain` as the SNI.
Clear enough to supply this argument.
body › destination › port
**Destination only.** The port the session lands on. Required with a
`vmId` or `host` destination; defaults to 443 for a `public` origin.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › destination › public
On a source, every publicly routable client — the open Internet dials the
name. On a destination, the domain's own public origin. Only `true` is
meaningful; omit the field otherwise.
Clear enough to supply this argument.
body › destination › vmId
A single VM, by id or by your slug for it. On a source, the VM that may
open the session; on a destination, the VM it lands on. Answers hold its id.
Clear enough to supply this argument.
body › destination › vpcId
Everything on one private network, by id or by your slug for it. **Source
only** — a landing is one place, so a network cannot be a destination.
Answers hold its id.
Clear enough to supply this argument.
body › domain
The name the session is addressed to: exact, `*.suffix`, or `*`.
Clear enough to supply this argument.
body › forwardAuth › oneOf › 1 › id
The configuration id returned by `POST /v5/tls/forward-auth`.
Clear enough to supply this argument.
body › freestyleAuth › oneOf › 1 › domains
Exact verified email domains, without implicit subdomains.
Clear enough to supply this argument.
body › freestyleAuth › oneOf › 1 › emails
Not provided
Missing description. Explain what this value means and how to supply it.
body › freestyleAuth › oneOf › 1 › public
Any signed-in Freestyle user. This never permits anonymous requests.
Clear enough to supply this argument.
body › freestyleAuth › oneOf › 1 › team
Members of the account that owns the TLS rule.
Clear enough to supply this argument.
body › match › oneOf › 1 › method
Case-sensitive HTTP method tokens. Omitted matches any; an empty list matches none.
Clear enough to supply this argument.
body › match › oneOf › 1 › path › oneOf › 1 › exact
Not provided
Missing description. Explain what this value means and how to supply it.
body › protocol
Not provided
Missing description. Explain what this value means and how to supply it.
body › source › host
**Destination only.** Pin the session to this host instead of resolving
the domain, while still presenting `domain` as the SNI.
Resolve the mismatch between this description and its schema constraints.
body › source › port
**Destination only.** The port the session lands on. Required with a
`vmId` or `host` destination; defaults to 443 for a `public` origin.
Clear enough to supply this argument.
body › source › public
On a source, every publicly routable client — the open Internet dials the
name. On a destination, the domain's own public origin. Only `true` is
meaningful; omit the field otherwise.
Clear enough to supply this argument.
body › source › vmId
A single VM, by id or by your slug for it. On a source, the VM that may
open the session; on a destination, the VM it lands on. Answers hold its id.
Clear enough to supply this argument.
body › source › vpcId
Everything on one private network, by id or by your slug for it. **Source
only** — a landing is one place, so a network cannot be a destination.
Answers hold its id.
Clear enough to supply this argument.
body › transform › items › oneOf › 0 › headers
Set request headers on an `http` session. Header names are preserved
(they are not secret); values are write-only.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update_tls_rule",
"description": "PUT /v5/tls/{ruleId}. Replace a TLS rule in place — the one mutation this API allows, so a rotating secret can change without dropping traffic. The body is a whole rule, exactly as create takes it.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"ruleId",
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"required": [
"action",
"domain"
],
"properties": {
"match": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"properties": {
"path": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"required": [
"exact"
],
"properties": {
"exact": {
"type": "string"
}
},
"description": "Exact request path. Prefix and regex matching are not supported yet.",
"additionalProperties": false
}
]
},
"method": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Case-sensitive HTTP method tokens. Omitted matches any; an empty list matches none."
}
},
"description": "Select which HTTP egress requests receive a rule's transforms.\nIncluded dimensions are ANDed; methods are ORed. An empty object matches all.\nA non-match skips every transform, without denying access to the origin.\nSee <https://vercel.com/docs/sandbox/concepts/firewall#matchers>.",
"additionalProperties": false
}
]
},
"action": {
"type": "string",
"const": "allow",
"description": "What a rule does with the named session it matches.\n\nOnly `allow` exists today, and it is required on every rule rather than\ndefaulted: a default would mean that the day `deny` arrives, every rule\nwritten before it silently acquires an action it never stated."
},
"domain": {
"type": "string",
"description": "The name the session is addressed to: exact, `*.suffix`, or `*`."
},
"source": {
"type": "object",
"properties": {
"host": {
"type": [
"string",
"null"
],
"description": "**Destination only.** Pin the session to this host instead of resolving\nthe domain, while still presenting `domain` as the SNI."
},
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "**Destination only.** The port the session lands on. Required with a\n`vmId` or `host` destination; defaults to 443 for a `public` origin."
},
"vmId": {
"type": [
"string",
"null"
],
"description": "A single VM, by id or by your slug for it. On a source, the VM that may\nopen the session; on a destination, the VM it lands on. Answers hold its id."
},
"vpcId": {
"type": [
"string",
"null"
],
"description": "Everything on one private network, by id or by your slug for it. **Source\nonly** — a landing is one place, so a network cannot be a destination.\nAnswers hold its id."
},
"public": {
"type": [
"boolean",
"null"
],
"description": "On a source, every publicly routable client — the open Internet dials the\nname. On a destination, the domain's own public origin. Only `true` is\nmeaningful; omit the field otherwise."
}
},
"description": "One end of a rule: which session this side matches.\n\nA `source` says *who* may open the session (`vmId`/`vpcId`/`public: true`); a\n`destination` says *where it lands* (`vmId`+`port`, `host`+`port`, or\n`public: true` for the domain's own origin). Unknown fields are rejected\nrather than ignored: a rule is a security statement, and a typo that quietly\nwidened it is the wrong failure.",
"additionalProperties": false
},
"protocol": {
"oneOf": [
{
"type": "null"
},
{
"enum": [
"tcp",
"http",
"postgres",
"minecraft",
"imap",
"imaps",
"socks5"
],
"type": "string",
"description": "How the edge treats the session's bytes, and therefore which of its front\ndoors serves the rule.\n\n`http` (443) and `postgres` (5432) terminate the session, so each pairs with\nthe transform kind that speaks it and each needs a certificate for the name.\n`minecraft` (25565) routes on the server address in the client's handshake\nand then splices — no TLS, so no certificate and no transform.\n\nThe other two doors carry a terminating protocol and a splicing one at once,\nand a rule picks which it is. `tcp` shares 443 with `http`: match on SNI,\nsplice the bytes, terminate nothing, so your VM's own certificate answers the\nhandshake. `imap` and `imaps` share 993 for mail clients — `imap` terminates\non a certificate issued for the name and forwards plain IMAP to the port your\nserver listens on (143 by default), `imaps` splices to a server holding its\nown certificate on 993. All three splicing shapes are public ingress only.\n\n`socks5` (1080) goes the other way and is the only egress-only protocol. Your\nVM opens SOCKS5 to the platform edge with no authentication, names its own\ndestination inside the request, and the edge opens the session onward through\nyour proxy provider using the credentials a `socks5` transform carries — so\nthe workload can use the subscription without ever holding it. Nothing is\nterminated: your TLS runs end to end to the real origin. The rule's `domain`\nis an allow-list of destinations rather than a name anything resolves, which\nis why `*` is allowed here and refused everywhere else."
}
]
},
"transform": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"headers"
],
"properties": {
"headers": {
"type": "object",
"properties": {},
"description": "Set request headers on an `http` session. Header names are preserved\n(they are not secret); values are write-only.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
},
"description": "Set request headers on an `http` session. Header names are preserved\n(they are not secret); values are write-only.",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"jsonPatch"
],
"properties": {
"jsonPatch": {
"type": "array",
"items": {
"oneOf": [
{
"allOf": [
{
"type": "object",
"required": [
"path",
"value"
],
"properties": {
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
},
"value": {
"description": "Value to add to the target location."
}
},
"description": "JSON Patch 'add' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "add"
}
},
"additionalProperties": {}
}
],
"description": "'add' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
}
},
"description": "JSON Patch 'remove' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "remove"
}
},
"additionalProperties": {}
}
],
"description": "'remove' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"path",
"value"
],
"properties": {
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
},
"value": {
"description": "Value to replace with."
}
},
"description": "JSON Patch 'replace' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "replace"
}
},
"additionalProperties": {}
}
],
"description": "'replace' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"from",
"path"
],
"properties": {
"from": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nto move value from."
},
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
}
},
"description": "JSON Patch 'move' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "move"
}
},
"additionalProperties": {}
}
],
"description": "'move' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"from",
"path"
],
"properties": {
"from": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nto copy value from."
},
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
}
},
"description": "JSON Patch 'copy' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "copy"
}
},
"additionalProperties": {}
}
],
"description": "'copy' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"path",
"value"
],
"properties": {
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
},
"value": {
"description": "Value to test against."
}
},
"description": "JSON Patch 'test' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "test"
}
},
"additionalProperties": {}
}
],
"description": "'test' operation"
}
],
"description": "JSON Patch single patch operation"
},
"description": "Ordered RFC 6902 operations. Values are write-only and read back as `\"***\"`.\nA rule accepts one patch, with at most 128 operations and 64 KiB of configuration."
}
},
"description": "Apply RFC 6902 operations to JSON HTTP egress request bodies.\nValues are write-only; operation names and JSON Pointer paths remain visible.",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"postgres"
],
"properties": {
"postgres": {
"type": "object",
"required": [
"password",
"username"
],
"properties": {
"database": {
"type": [
"string",
"null"
],
"description": "The database to select. Optional: omitted leaves the guest's choice."
},
"password": {
"type": "string",
"description": "The upstream password. Write-only: sealed at rest, read back as `\"***\"`."
},
"username": {
"type": "string",
"description": "The upstream role to authenticate as."
}
},
"description": "Credentials injected into a Postgres startup handshake. The guest connects\nwith no password; the edge completes the real handshake upstream.",
"additionalProperties": false
}
},
"description": "Inject credentials into a `postgres` handshake.",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"socks5"
],
"properties": {
"socks5": {
"type": "object",
"required": [
"password",
"username"
],
"properties": {
"password": {
"type": "string",
"description": "The password to present to the upstream proxy. Write-only: sealed at\nrest, read back as `\"***\"`."
},
"username": {
"type": "string",
"description": "The username to present to the upstream proxy."
}
},
"description": "Credentials presented to an upstream SOCKS5 proxy. Your VM connects to the\nplatform's SOCKS5 front with no authentication at all; the edge authenticates\nto your provider on its behalf, so the subscription is never inside the VM.",
"additionalProperties": false
}
},
"description": "Authenticate a `socks5` session to your upstream proxy provider.",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"s3"
],
"properties": {
"s3": {
"type": "object",
"required": [
"credentials",
"region",
"scope"
],
"properties": {
"scope": {
"type": "object",
"required": [
"bucket",
"operations",
"prefix"
],
"properties": {
"bucket": {
"type": "string"
},
"prefix": {
"type": "string",
"description": "Literal UTF-8 key prefix, including a trailing slash for a directory boundary."
},
"operations": {
"type": "array",
"items": {
"enum": [
"GetObject",
"HeadObject",
"PutObject",
"DeleteObject",
"ListObjects",
"ListObjectsV2",
"CreateMultipartUpload",
"UploadPart",
"ListParts",
"CompleteMultipartUpload",
"AbortMultipartUpload",
"ListMultipartUploads"
],
"type": "string"
}
}
},
"additionalProperties": false
},
"region": {
"type": "string"
},
"credentials": {
"type": "object",
"required": [
"accessKeyId",
"secretAccessKey"
],
"properties": {
"accessKeyId": {
"type": "string"
},
"sessionToken": {
"type": [
"string",
"null"
]
},
"secretAccessKey": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
},
"description": "Authorize and sign scoped S3 HTTP requests at the edge.",
"additionalProperties": {}
}
],
"description": "The rewrites a rule applies, in order."
},
"description": "Rewrites applied in flight, in order. Secrets here are write-only."
},
"description": {
"type": [
"string",
"null"
],
"description": "A free-form note, up to 1024 characters."
},
"destination": {
"type": "object",
"properties": {
"host": {
"type": [
"string",
"null"
],
"description": "**Destination only.** Pin the session to this host instead of resolving\nthe domain, while still presenting `domain` as the SNI."
},
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "**Destination only.** The port the session lands on. Required with a\n`vmId` or `host` destination; defaults to 443 for a `public` origin."
},
"vmId": {
"type": [
"string",
"null"
],
"description": "A single VM, by id or by your slug for it. On a source, the VM that may\nopen the session; on a destination, the VM it lands on. Answers hold its id."
},
"vpcId": {
"type": [
"string",
"null"
],
"description": "Everything on one private network, by id or by your slug for it. **Source\nonly** — a landing is one place, so a network cannot be a destination.\nAnswers hold its id."
},
"public": {
"type": [
"boolean",
"null"
],
"description": "On a source, every publicly routable client — the open Internet dials the\nname. On a destination, the domain's own public origin. Only `true` is\nmeaningful; omit the field otherwise."
}
},
"description": "One end of a rule: which session this side matches.\n\nA `source` says *who* may open the session (`vmId`/`vpcId`/`public: true`); a\n`destination` says *where it lands* (`vmId`+`port`, `host`+`port`, or\n`public: true` for the domain's own origin). Unknown fields are rejected\nrather than ignored: a rule is a security statement, and a typo that quietly\nwidened it is the wrong failure.",
"additionalProperties": false
},
"forwardAuth": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The configuration id returned by `POST /v5/tls/forward-auth`."
}
},
"description": "A reusable authorization check attached to public HTTP ingress.",
"additionalProperties": false
}
]
},
"freestyleAuth": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"properties": {
"team": {
"type": "boolean",
"description": "Members of the account that owns the TLS rule."
},
"emails": {
"type": "array",
"items": {
"type": "string"
}
},
"public": {
"type": "boolean",
"description": "Any signed-in Freestyle user. This never permits anonymous requests."
},
"domains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Exact verified email domains, without implicit subdomains."
}
},
"description": "Require a Freestyle login. A signed-in visitor is allowed when ANY criterion\nmatches. Email criteria require a verified email and exact domain matching.",
"additionalProperties": false
}
]
}
},
"additionalProperties": false
},
"ruleId": {
"type": "string",
"description": "TLS rule id"
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
POST /v5/tunnels. Create a WireGuard tunnel (default) or a managed Tailscale subnet router, optionally attaching VPCs. WireGuard returns a fixed configuration and a one-time client private key. Tailscale enrollment is asynchronous: poll GET for status and authUrl, or provide a write-only auth key. Administrators must approve the advertised VPC routes unless tailnet autoApprovers cover them. DNS and per-VM Tailscale identities are not configured.
Describe the returned information so the agent knows whether it will answer the request.
Inputs73/100
12 of 14 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
body › clientPublicKey
The public key of a keypair you already hold. Omit to have one minted
for you; supply it and the platform never sees a private key at all.
Clear enough to supply this argument.
body › displayName
A free-form label, for telling several tunnels apart.
Clear enough to supply this argument.
body › routes
The ranges your client will route through the tunnel — its
`AllowedIPs`, fixed for the tunnel's life so attaching and detaching
networks never changes your config. Omit for the default
(`10.0.0.0/8` and `fd00::/8`), which covers every network with
default addressing. Only networks whose CIDRs fall inside the routes
can be attached.
Clear enough to supply this argument.
body › slug
A URL-safe handle, unique within your account: 1–63 chars of
`[a-z0-9-]`, no leading, trailing, or repeated hyphens. Address the
tunnel by it instead of by id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › tailscale › oneOf › 1 › authKey
Write-only enrollment key. Omit for browser enrollment.
Clear enough to supply this argument.
body › tailscale › oneOf › 1 › hostname
Not provided
Missing description. Explain what this value means and how to supply it.
body › type
Not provided
Missing description. Explain what this value means and how to supply it.
body › vpcs › items › exit
See the attach request's `exit`.
Explain the meaning of this value, not just its name.
body › vpcs › items › ipv4
The address you want inside it; omit to be assigned one.
Clear enough to supply this argument.
body › vpcs › items › ipv6
An explicit IPv6 address instead; only one may be set.
Explain the meaning of this value, not just its name.
body › vpcs › items › remoteCidrs
Ranges behind your client this network may route to; see the attach
request's `remoteCidrs`.
Clear enough to supply this argument.
body › vpcs › items › vpc
The network to attach: a VPC id, or your slug for it. Also accepted as
`vpcId`.
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_tunnel",
"description": "POST /v5/tunnels. Create a WireGuard tunnel (default) or a managed Tailscale subnet router, optionally attaching VPCs. WireGuard returns a fixed configuration and a one-time client private key. Tailscale enrollment is asynchronous: poll GET for status and authUrl, or provide a write-only auth key. Administrators must approve the advertised VPC routes unless tailnet autoApprovers cover them. DNS and per-VM Tailscale identities are not configured.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"properties": {
"slug": {
"type": [
"string",
"null"
],
"description": "A URL-safe handle, unique within your account: 1–63 chars of\n`[a-z0-9-]`, no leading, trailing, or repeated hyphens. Address the\ntunnel by it instead of by id."
},
"type": {
"oneOf": [
{
"type": "null"
},
{
"enum": [
"wireguard",
"ikev2",
"tailscale"
],
"type": "string"
}
]
},
"vpcs": {
"type": "array",
"items": {
"type": "object",
"required": [
"vpc"
],
"properties": {
"vpc": {
"type": "string",
"description": "The network to attach: a VPC id, or your slug for it. Also accepted as\n`vpcId`."
},
"exit": {
"type": "boolean",
"description": "See the attach request's `exit`."
},
"ipv4": {
"type": [
"string",
"null"
],
"description": "The address you want inside it; omit to be assigned one."
},
"ipv6": {
"type": [
"string",
"null"
],
"description": "An explicit IPv6 address instead; only one may be set."
},
"remoteCidrs": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ranges behind your client this network may route to; see the attach\nrequest's `remoteCidrs`."
}
},
"description": "One network named at create, with the same address choices as an attach.",
"additionalProperties": {}
},
"description": "Networks to attach in the same call, so one request yields a tunnel\nthat already routes somewhere. All-or-nothing: if any attachment is\nrefused, nothing is created."
},
"routes": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "The ranges your client will route through the tunnel — its\n`AllowedIPs`, fixed for the tunnel's life so attaching and detaching\nnetworks never changes your config. Omit for the default\n(`10.0.0.0/8` and `fd00::/8`), which covers every network with\ndefault addressing. Only networks whose CIDRs fall inside the routes\ncan be attached."
},
"tailscale": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"properties": {
"authKey": {
"type": [
"string",
"null"
],
"description": "Write-only enrollment key. Omit for browser enrollment."
},
"hostname": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": false
}
]
},
"displayName": {
"type": [
"string",
"null"
],
"description": "A free-form label, for telling several tunnels apart."
},
"clientPublicKey": {
"type": [
"string",
"null"
],
"description": "The public key of a keypair you already hold. Omit to have one minted\nfor you; supply it and the platform never sees a private key at all."
}
},
"additionalProperties": {}
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
GET /v5/tunnels/{tunnelIdOrSlug}. Read one tunnel, with its attached networks. The config comes back with a blank `PrivateKey`; fill in the key you saved at create, or rotate to mint a new one.
Describe the returned information so the agent knows whether it will answer the request.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
tunnelIdOrSlug
Tunnel id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get_tunnel",
"description": "GET /v5/tunnels/{tunnelIdOrSlug}. Read one tunnel, with its attached networks. The config comes back with a blank `PrivateKey`; fill in the key you saved at create, or rotate to mint a new one.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tunnelIdOrSlug",
"teamId"
],
"properties": {
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"tunnelIdOrSlug": {
"type": "string",
"description": "Tunnel id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description94/100
PATCH /v5/tunnels/{tunnelIdOrSlug}. Rename a tunnel or change its slug. Only the labels move: the keys, addresses, routes and attached networks are untouched, so a connected client sees nothing change and the config you saved keeps working.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs70/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
tunnelIdOrSlug
Tunnel id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
body › displayName
An empty string clears it.
Explain the meaning of this value, not just its name.
body › slug
An empty string clears it.
Explain the meaning of this value, not just its name.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
POST /v5/tunnels/{tunnelIdOrSlug}/rotate-key. Replace a tunnel's keys, keeping its id and every attached network's address. Use this if you lost the config or need to revoke one that leaked: the old keys stop working, and the response carries the only copy of the new private key you will get.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
tunnelIdOrSlug
Tunnel id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
body › clientPublicKey
The public key of a keypair you already hold. Omit to have a fresh one
minted for you.
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "rotate_tunnel_key",
"description": "POST /v5/tunnels/{tunnelIdOrSlug}/rotate-key. Replace a tunnel's keys, keeping its id and every attached network's address. Use this if you lost the config or need to revoke one that leaked: the old keys stop working, and the response carries the only copy of the new private key you will get.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tunnelIdOrSlug",
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"properties": {
"clientPublicKey": {
"type": [
"string",
"null"
],
"description": "The public key of a keypair you already hold. Omit to have a fresh one\nminted for you."
}
},
"additionalProperties": {}
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"tunnelIdOrSlug": {
"type": "string",
"description": "Tunnel id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
POST /v5/tunnels/{tunnelIdOrSlug}/tailscale/authenticate. Re-enroll a managed router using an auth key or browser login. Poll GET for the login URL and status. Re-enrollment creates a new Tailscale device identity; Freestyle attachments are preserved.
Describe the returned information so the agent knows whether it will answer the request.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
tunnelIdOrSlug
Tunnel id, or your slug
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
body › authKey
Write-only. Omit to request browser enrollment with a new device identity.
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
DELETE /v5/tunnels/{tunnelIdOrSlug}/vpcs/{vpcIdOrSlug}. Detach a private network from a tunnel: it stops being reachable and the tunnel's address inside it is released. The tunnel — and any connected client — carries on untouched.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
tunnelIdOrSlug
Tunnel id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
vpcIdOrSlug
VPC id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
POST /v5/tunnels/{tunnelIdOrSlug}/vpcs/{vpcIdOrSlug}. Attach a private network to a tunnel. The tunnel gains an address inside the network — what that network's VMs see as your address — and a connected client can reach the network immediately, with no config change. Omit `ipv4` and an address is assigned; supply one to pin it. The network's CIDRs must fall inside the tunnel's routes and must not overlap another attached network's.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs94/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
tunnelIdOrSlug
Tunnel id, or your slug for it
Clear enough to supply this argument.
vpcIdOrSlug
VPC id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
body › exit
Make your client this network's exit — a router members can name as a
next hop. A VM routes through it with an ordinary NIC route via the
attachment's address, and everything it sends the exit — whatever the
destination — is forwarded to your client, which is expected to NAT it
onward. Several attachments per network may be exits: members choose
per route, so two exits and two same-metric routes are a redundant
pair, and a dead exit stops being ARP-answered so the other takes
over by itself.
Clear enough to supply this argument.
body › ipv4
The address you want inside the private network. Omit to be assigned
one. It must be free: a VM already holding it makes this a conflict,
and once yours, no VM can be given it.
Clear enough to supply this argument.
body › ipv6
An explicit IPv6 address, equivalent to passing one in `ipv4`; only one
may be set.
Clear enough to supply this argument.
body › remoteCidrs
Ranges behind your client that this network routes through the tunnel —
a site-to-site setup where your client machine forwards for other hosts
on its side. Hosts inside these ranges keep their real addresses inside
the network. A range carved out of the network's own CIDR just works:
VMs reach it with no configuration, and the range is excluded from VM
address allocation (it must be free when granted). A range outside the
network's CIDRs is reached by giving VMs a route via the attachment's
`address`. A range may not straddle the network's CIDR boundary, nor
overlap a range another tunnel already grants this network.
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "attach_vpc_to_tunnel",
"description": "POST /v5/tunnels/{tunnelIdOrSlug}/vpcs/{vpcIdOrSlug}. Attach a private network to a tunnel. The tunnel gains an address inside the network — what that network's VMs see as your address — and a connected client can reach the network immediately, with no config change. Omit `ipv4` and an address is assigned; supply one to pin it. The network's CIDRs must fall inside the tunnel's routes and must not overlap another attached network's.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tunnelIdOrSlug",
"vpcIdOrSlug",
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"properties": {
"exit": {
"type": "boolean",
"description": "Make your client this network's exit — a router members can name as a\nnext hop. A VM routes through it with an ordinary NIC route via the\nattachment's address, and everything it sends the exit — whatever the\ndestination — is forwarded to your client, which is expected to NAT it\nonward. Several attachments per network may be exits: members choose\nper route, so two exits and two same-metric routes are a redundant\npair, and a dead exit stops being ARP-answered so the other takes\nover by itself."
},
"ipv4": {
"type": [
"string",
"null"
],
"description": "The address you want inside the private network. Omit to be assigned\none. It must be free: a VM already holding it makes this a conflict,\nand once yours, no VM can be given it."
},
"ipv6": {
"type": [
"string",
"null"
],
"description": "An explicit IPv6 address, equivalent to passing one in `ipv4`; only one\nmay be set."
},
"remoteCidrs": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ranges behind your client that this network routes through the tunnel —\na site-to-site setup where your client machine forwards for other hosts\non its side. Hosts inside these ranges keep their real addresses inside\nthe network. A range carved out of the network's own CIDR just works:\nVMs reach it with no configuration, and the range is excluded from VM\naddress allocation (it must be free when granted). A range outside the\nnetwork's CIDRs is reached by giving VMs a route via the attachment's\n`address`. A range may not straddle the network's CIDR boundary, nor\noverlap a range another tunnel already grants this network."
}
},
"additionalProperties": {}
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"vpcIdOrSlug": {
"type": "string",
"description": "VPC id, or your slug for it"
},
"tunnelIdOrSlug": {
"type": "string",
"description": "Tunnel id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description78/100
POST /v5/verifications. Issue a challenge. Publish the returned `verificationCode` as a TXT record at `recordName`, then PUT the verification to complete it.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
2 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
body › domain
Not provided
Missing description. Explain what this value means and how to supply it.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
DELETE /v5/verifications/{domainOrId}. Withdraw outstanding challenges; by domain this drops all of them. A challenge that already verified is a permanent record and cannot be deleted.
The description explains the capability, when to use it, and what to expect.
Inputs87/100
Input documentation gives an agent enough context to populate the arguments.
domainOrId
Verification id or the domain under verification
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Add a human-readable title so users do not have to interpret the tool identifier.
Description77/100
PUT /v5/verifications/{domainOrId}. Check DNS and record ownership. Addressed by id, only that challenge's own code counts, and the result names it. Use this when several people are verifying the same domain.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
domainOrId
Verification id, or the domain to verify
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "verify_domain",
"description": "PUT /v5/verifications/{domainOrId}. Check DNS and record ownership. Addressed by id, only that challenge's own code counts, and the result names it. Use this when several people are verifying the same domain.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"domainOrId",
"teamId"
],
"properties": {
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"domainOrId": {
"type": "string",
"description": "Verification id, or the domain to verify"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description73/100
POST /v5/vms. Boot a new VM. Full API options; use the shorter convenience tool for common tasks.
Explain when to choose this tool and distinguish it from related operations.
Inputs51/100
71 of 99 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
body › autoDeleteSeconds
Delete the VM once it has gone this many seconds without running.
Every start resets the clock; a running VM is never deleted for this.
-1 (or omitting this) means never; 0 makes the VM ephemeral — deleted
the moment it stops.
Some plans cap how long an unused VM is kept. On those, omitting this
(or sending -1) gets you the cap rather than "keep forever", and asking
for longer than the cap is a 400.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › automaticRestart
Boot the VM again if it stops without you asking it to — the VMM
crashes, the guest kernel panics, the machine it runs on loses power.
Defaults to `true`.
It never fights you: shutting the VM down, pausing it, running
`poweroff` inside it, or hitting an idle timeout all leave it off. This
only decides who gets the last word when a *failure* stops it.
Clear enough to supply this argument.
body › customer › oneOf › 1 › countryCode
Not provided
Missing description. Explain what this value means and how to supply it.
body › customer › oneOf › 1 › customerId
Not provided
Missing description. Explain what this value means and how to supply it.
Missing description. Explain what this value means and how to supply it.
body › customer › oneOf › 1 › signupDateTime
Unix timestamp in milliseconds, matching legacy Radar metadata.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › customer › oneOf › 1 › stripeCustomerId
Customer ID in your Stripe account. An identity reference only; no billing behavior.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › customerId
Existing customer ID, scoped to your Freestyle account.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › displayName
Not provided
Missing description. Explain what this value means and how to supply it.
body › firewall › rules › items › action
What a rule does with the traffic it matches.
Only `allow` exists today, and it is required on every rule rather than
defaulted: a default would mean that the day `deny` arrives, every rule
written before it silently acquires an action it never stated.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › firewall › rules › items › description
A free-form note, up to 1024 characters.
Resolve the mismatch between this description and its schema constraints.
Missing description. Explain what this value means and how to supply it.
body › firewall › rules › items › destination › public
Every publicly routable address, whoever owns it — including another
Freestyle VM reached at its public address. Only `true` is meaningful;
omit the field otherwise. Not combined with `vmId` or `vpcId`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Whatever is on the far side of one tunnel — the client that dials it,
and any remote range routed over it. Tunnels have no slug, so this is a
tunnel id: `tun-…`, or `wg-…` for one carried over from the per-VPC VPN
records tunnels replaced.
Resolve the mismatch between this description and its schema constraints.
Missing description. Explain what this value means and how to supply it.
body › firewall › rules › items › source › public
Every publicly routable address, whoever owns it — including another
Freestyle VM reached at its public address. Only `true` is meaningful;
omit the field otherwise. Not combined with `vmId` or `vpcId`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Whatever is on the far side of one tunnel — the client that dials it,
and any remote range routed over it. Tunnels have no slug, so this is a
tunnel id: `tun-…`, or `wg-…` for one carried over from the per-VPC VPN
records tunnels replaced.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › firewall › rules › items › source › vmId
A single VM, by id or by your slug for it. Answers hold its id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › firewall › rules › items › source › vpcId
Everything on one private network, by id or by your slug for it.
Answers hold its id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › idleTimeoutSeconds
Pause the VM after this many seconds without network activity.
-1 (or omitting this) means never pause for idleness.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › maxRunSeconds
Pause the VM once a single run has lasted this many seconds, however
busy it is. Starting it again gives it a fresh budget — unlike
`maxRunTotalSeconds`, which never resets. -1 (or omitting this) means
no cap.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › maxRunTotalSeconds
How many seconds this VM may run in total, ever. Spending the budget
pauses the VM, and every later start is a 409 until you raise this.
-1 (or omitting this) means no budget.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › metadata
Up to 64 metadata entries; keys and values are limited to 63 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › networks › items › ipv4
The IPv4 address to take inside the network: an explicit address,
`true` to auto-allocate, or `false` to opt out. Omitted = allocate one
(networks are dual-stack), except on a network with no IPv4 CIDR,
where the VM simply joins over IPv6.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › networks › items › ipv6
The IPv6 address to take: an explicit address, `true` to auto-allocate
(the default), or `false` to opt out. Every network has an IPv6 CIDR.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › networks › items › routes › items › cidr
Not provided
Missing description. Explain what this value means and how to supply it.
body › networks › items › routes › items › metric
Route priority, as `ip route`'s `metric`. Omit for the platform
default. Several routes to the same `cidr` at the same metric are one
multipath route — the guest spreads flows across their gateways —
while different metrics make a primary and a backup.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › networks › items › routes › items › via
Not provided
Missing description. Explain what this value means and how to supply it.
body › networks › items › vpc
The network to join, by id or by your slug for it. Also accepted as
`vpcId`, the name the rest of the API uses.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › reassignSlug
Take `slug` even if another VM in this account already holds it. The
slug moves atomically: the current holder keeps running, stays
addressable by id, and just loses its slug. Without this flag a taken
slug is a 409 CONFLICT. Requires `slug`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › slug
URL-safe identifier, unique within your account: 1–63 chars of
`[a-z0-9-]`, no leading, trailing, or repeated hyphens.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › snapshotId
Boot from this snapshot: its id, your slug for it, or a public
`{owner}/{slug}`. Omit for the platform default.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › tls › oneOf › 1 › rules › items › action
What a rule does with the named session it matches.
Only `allow` exists today, and it is required on every rule rather than
defaulted: a default would mean that the day `deny` arrives, every rule
written before it silently acquires an action it never stated.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
**Destination only.** Pin the session to this host instead of resolving
the domain, while still presenting `domain` as the SNI.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › tls › oneOf › 1 › rules › items › destination › port
**Destination only.** The port the session lands on. Required with a
`vmId` or `host` destination; defaults to 443 for a `public` origin.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › tls › oneOf › 1 › rules › items › destination › public
On a source, every publicly routable client — the open Internet dials the
name. On a destination, the domain's own public origin. Only `true` is
meaningful; omit the field otherwise.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Everything on one private network, by id or by your slug for it. **Source
only** — a landing is one place, so a network cannot be a destination.
Answers hold its id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › tls › oneOf › 1 › rules › items › domain
The name the session is addressed to: exact, `*.suffix`, or `*`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › tls › oneOf › 1 › rules › items › forwardAuth › oneOf › 1 › id
The configuration id returned by `POST /v5/tls/forward-auth`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
**Destination only.** Pin the session to this host instead of resolving
the domain, while still presenting `domain` as the SNI.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › tls › oneOf › 1 › rules › items › source › port
**Destination only.** The port the session lands on. Required with a
`vmId` or `host` destination; defaults to 443 for a `public` origin.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › tls › oneOf › 1 › rules › items › source › public
On a source, every publicly routable client — the open Internet dials the
name. On a destination, the domain's own public origin. Only `true` is
meaningful; omit the field otherwise.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Everything on one private network, by id or by your slug for it. **Source
only** — a landing is one place, so a network cannot be a destination.
Answers hold its id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location
within the target document where the operation is performed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Literal UTF-8 key prefix, including a trailing slash for a directory boundary.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › ttlSeconds
Delete the VM this many seconds after it is created, whatever it is
doing at the time. A deadline, not an idle window: nothing resets it.
-1 (or omitting this) means no deadline.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "api_create_vm",
"description": "POST /v5/vms. Boot a new VM. Full API options; use the shorter convenience tool for common tasks.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"required": [
"firewall"
],
"properties": {
"tls": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"properties": {
"rules": {
"type": "array",
"items": {
"type": "object",
"required": [
"action",
"domain"
],
"properties": {
"match": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"properties": {
"path": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"required": [
"exact"
],
"properties": {
"exact": {
"type": "string"
}
},
"description": "Exact request path. Prefix and regex matching are not supported yet.",
"additionalProperties": false
}
]
},
"method": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Case-sensitive HTTP method tokens. Omitted matches any; an empty list matches none."
}
},
"description": "Select which HTTP egress requests receive a rule's transforms.\nIncluded dimensions are ANDed; methods are ORed. An empty object matches all.\nA non-match skips every transform, without denying access to the origin.\nSee <https://vercel.com/docs/sandbox/concepts/firewall#matchers>.",
"additionalProperties": false
}
]
},
"action": {
"type": "string",
"const": "allow",
"description": "What a rule does with the named session it matches.\n\nOnly `allow` exists today, and it is required on every rule rather than\ndefaulted: a default would mean that the day `deny` arrives, every rule\nwritten before it silently acquires an action it never stated."
},
"domain": {
"type": "string",
"description": "The name the session is addressed to: exact, `*.suffix`, or `*`."
},
"source": {
"type": "object",
"properties": {
"host": {
"type": [
"string",
"null"
],
"description": "**Destination only.** Pin the session to this host instead of resolving\nthe domain, while still presenting `domain` as the SNI."
},
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "**Destination only.** The port the session lands on. Required with a\n`vmId` or `host` destination; defaults to 443 for a `public` origin."
},
"vmId": {
"type": [
"string",
"null"
],
"description": "A single VM, by id or by your slug for it. On a source, the VM that may\nopen the session; on a destination, the VM it lands on. Answers hold its id."
},
"vpcId": {
"type": [
"string",
"null"
],
"description": "Everything on one private network, by id or by your slug for it. **Source\nonly** — a landing is one place, so a network cannot be a destination.\nAnswers hold its id."
},
"public": {
"type": [
"boolean",
"null"
],
"description": "On a source, every publicly routable client — the open Internet dials the\nname. On a destination, the domain's own public origin. Only `true` is\nmeaningful; omit the field otherwise."
}
},
"description": "One end of a rule: which session this side matches.\n\nA `source` says *who* may open the session (`vmId`/`vpcId`/`public: true`); a\n`destination` says *where it lands* (`vmId`+`port`, `host`+`port`, or\n`public: true` for the domain's own origin). Unknown fields are rejected\nrather than ignored: a rule is a security statement, and a typo that quietly\nwidened it is the wrong failure.",
"additionalProperties": false
},
"protocol": {
"oneOf": [
{
"type": "null"
},
{
"enum": [
"tcp",
"http",
"postgres",
"minecraft",
"imap",
"imaps",
"socks5"
],
"type": "string",
"description": "How the edge treats the session's bytes, and therefore which of its front\ndoors serves the rule.\n\n`http` (443) and `postgres` (5432) terminate the session, so each pairs with\nthe transform kind that speaks it and each needs a certificate for the name.\n`minecraft` (25565) routes on the server address in the client's handshake\nand then splices — no TLS, so no certificate and no transform.\n\nThe other two doors carry a terminating protocol and a splicing one at once,\nand a rule picks which it is. `tcp` shares 443 with `http`: match on SNI,\nsplice the bytes, terminate nothing, so your VM's own certificate answers the\nhandshake. `imap` and `imaps` share 993 for mail clients — `imap` terminates\non a certificate issued for the name and forwards plain IMAP to the port your\nserver listens on (143 by default), `imaps` splices to a server holding its\nown certificate on 993. All three splicing shapes are public ingress only.\n\n`socks5` (1080) goes the other way and is the only egress-only protocol. Your\nVM opens SOCKS5 to the platform edge with no authentication, names its own\ndestination inside the request, and the edge opens the session onward through\nyour proxy provider using the credentials a `socks5` transform carries — so\nthe workload can use the subscription without ever holding it. Nothing is\nterminated: your TLS runs end to end to the real origin. The rule's `domain`\nis an allow-list of destinations rather than a name anything resolves, which\nis why `*` is allowed here and refused everywhere else."
}
]
},
"transform": {
"type": "array",
"items": {
"oneOf": [
{
"type": "object",
"required": [
"headers"
],
"properties": {
"headers": {
"type": "object",
"properties": {},
"description": "Set request headers on an `http` session. Header names are preserved\n(they are not secret); values are write-only.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
},
"description": "Set request headers on an `http` session. Header names are preserved\n(they are not secret); values are write-only.",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"jsonPatch"
],
"properties": {
"jsonPatch": {
"type": "array",
"items": {
"oneOf": [
{
"allOf": [
{
"type": "object",
"required": [
"path",
"value"
],
"properties": {
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
},
"value": {
"description": "Value to add to the target location."
}
},
"description": "JSON Patch 'add' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "add"
}
},
"additionalProperties": {}
}
],
"description": "'add' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
}
},
"description": "JSON Patch 'remove' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "remove"
}
},
"additionalProperties": {}
}
],
"description": "'remove' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"path",
"value"
],
"properties": {
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
},
"value": {
"description": "Value to replace with."
}
},
"description": "JSON Patch 'replace' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "replace"
}
},
"additionalProperties": {}
}
],
"description": "'replace' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"from",
"path"
],
"properties": {
"from": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nto move value from."
},
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
}
},
"description": "JSON Patch 'move' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "move"
}
},
"additionalProperties": {}
}
],
"description": "'move' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"from",
"path"
],
"properties": {
"from": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nto copy value from."
},
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
}
},
"description": "JSON Patch 'copy' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "copy"
}
},
"additionalProperties": {}
}
],
"description": "'copy' operation"
},
{
"allOf": [
{
"type": "object",
"required": [
"path",
"value"
],
"properties": {
"path": {
"type": "string",
"description": "JSON-Pointer value [RFC6901](https://tools.ietf.org/html/rfc6901) that references a location\nwithin the target document where the operation is performed."
},
"value": {
"description": "Value to test against."
}
},
"description": "JSON Patch 'test' operation representation",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "test"
}
},
"additionalProperties": {}
}
],
"description": "'test' operation"
}
],
"description": "JSON Patch single patch operation"
},
"description": "Ordered RFC 6902 operations. Values are write-only and read back as `\"***\"`.\nA rule accepts one patch, with at most 128 operations and 64 KiB of configuration."
}
},
"description": "Apply RFC 6902 operations to JSON HTTP egress request bodies.\nValues are write-only; operation names and JSON Pointer paths remain visible.",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"postgres"
],
"properties": {
"postgres": {
"type": "object",
"required": [
"password",
"username"
],
"properties": {
"database": {
"type": [
"string",
"null"
],
"description": "The database to select. Optional: omitted leaves the guest's choice."
},
"password": {
"type": "string",
"description": "The upstream password. Write-only: sealed at rest, read back as `\"***\"`."
},
"username": {
"type": "string",
"description": "The upstream role to authenticate as."
}
},
"description": "Credentials injected into a Postgres startup handshake. The guest connects\nwith no password; the edge completes the real handshake upstream.",
"additionalProperties": false
}
},
"description": "Inject credentials into a `postgres` handshake.",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"socks5"
],
"properties": {
"socks5": {
"type": "object",
"required": [
"password",
"username"
],
"properties": {
"password": {
"type": "string",
"description": "The password to present to the upstream proxy. Write-only: sealed at\nrest, read back as `\"***\"`."
},
"username": {
"type": "string",
"description": "The username to present to the upstream proxy."
}
},
"description": "Credentials presented to an upstream SOCKS5 proxy. Your VM connects to the\nplatform's SOCKS5 front with no authentication at all; the edge authenticates\nto your provider on its behalf, so the subscription is never inside the VM.",
"additionalProperties": false
}
},
"description": "Authenticate a `socks5` session to your upstream proxy provider.",
"additionalProperties": {}
},
{
"type": "object",
"required": [
"s3"
],
"properties": {
"s3": {
"type": "object",
"required": [
"credentials",
"region",
"scope"
],
"properties": {
"scope": {
"type": "object",
"required": [
"bucket",
"operations",
"prefix"
],
"properties": {
"bucket": {
"type": "string"
},
"prefix": {
"type": "string",
"description": "Literal UTF-8 key prefix, including a trailing slash for a directory boundary."
},
"operations": {
"type": "array",
"items": {
"enum": [
"GetObject",
"HeadObject",
"PutObject",
"DeleteObject",
"ListObjects",
"ListObjectsV2",
"CreateMultipartUpload",
"UploadPart",
"ListParts",
"CompleteMultipartUpload",
"AbortMultipartUpload",
"ListMultipartUploads"
],
"type": "string"
}
}
},
"additionalProperties": false
},
"region": {
"type": "string"
},
"credentials": {
"type": "object",
"required": [
"accessKeyId",
"secretAccessKey"
],
"properties": {
"accessKeyId": {
"type": "string"
},
"sessionToken": {
"type": [
"string",
"null"
]
},
"secretAccessKey": {
"type": "string"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
},
"description": "Authorize and sign scoped S3 HTTP requests at the edge.",
"additionalProperties": {}
}
],
"description": "The rewrites a rule applies, in order."
},
"description": "Rewrites applied in flight, in order. Secrets here are write-only."
},
"description": {
"type": [
"string",
"null"
],
"description": "A free-form note, up to 1024 characters."
},
"destination": {
"type": "object",
"properties": {
"host": {
"type": [
"string",
"null"
],
"description": "**Destination only.** Pin the session to this host instead of resolving\nthe domain, while still presenting `domain` as the SNI."
},
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "**Destination only.** The port the session lands on. Required with a\n`vmId` or `host` destination; defaults to 443 for a `public` origin."
},
"vmId": {
"type": [
"string",
"null"
],
"description": "A single VM, by id or by your slug for it. On a source, the VM that may\nopen the session; on a destination, the VM it lands on. Answers hold its id."
},
"vpcId": {
"type": [
"string",
"null"
],
"description": "Everything on one private network, by id or by your slug for it. **Source\nonly** — a landing is one place, so a network cannot be a destination.\nAnswers hold its id."
},
"public": {
"type": [
"boolean",
"null"
],
"description": "On a source, every publicly routable client — the open Internet dials the\nname. On a destination, the domain's own public origin. Only `true` is\nmeaningful; omit the field otherwise."
}
},
"description": "One end of a rule: which session this side matches.\n\nA `source` says *who* may open the session (`vmId`/`vpcId`/`public: true`); a\n`destination` says *where it lands* (`vmId`+`port`, `host`+`port`, or\n`public: true` for the domain's own origin). Unknown fields are rejected\nrather than ignored: a rule is a security statement, and a typo that quietly\nwidened it is the wrong failure.",
"additionalProperties": false
},
"forwardAuth": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The configuration id returned by `POST /v5/tls/forward-auth`."
}
},
"description": "A reusable authorization check attached to public HTTP ingress.",
"additionalProperties": false
}
]
},
"freestyleAuth": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"properties": {
"team": {
"type": "boolean",
"description": "Members of the account that owns the TLS rule."
},
"emails": {
"type": "array",
"items": {
"type": "string"
}
},
"public": {
"type": "boolean",
"description": "Any signed-in Freestyle user. This never permits anonymous requests."
},
"domains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Exact verified email domains, without implicit subdomains."
}
},
"description": "Require a Freestyle login. A signed-in visitor is allowed when ANY criterion\nmatches. Email criteria require a verified email and exact domain matching.",
"additionalProperties": false
}
]
}
},
"additionalProperties": false
}
}
},
"description": "The `tls` block of a VM create: rules created with the VM and deleted with\nit. Inside it, an endpoint with no identity means the VM being created —\nwhich is how a rule names a VM whose id does not exist yet.",
"additionalProperties": false
}
]
},
"slug": {
"type": [
"string",
"null"
],
"description": "URL-safe identifier, unique within your account: 1–63 chars of\n`[a-z0-9-]`, no leading, trailing, or repeated hyphens."
},
"customer": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"required": [
"customerId"
],
"properties": {
"ip": {
"type": [
"string",
"null"
]
},
"emails": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"address"
],
"properties": {
"address": {
"type": "string"
},
"verified": {
"type": [
"boolean",
"null"
],
"description": "The caller's verification assertion, not verification by Freestyle."
}
},
"additionalProperties": false
}
},
{
"type": "null"
}
]
},
"githubId": {
"type": [
"string",
"null"
]
},
"customerId": {
"type": "string"
},
"countryCode": {
"type": [
"string",
"null"
]
},
"phoneNumbers": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"number"
],
"properties": {
"number": {
"type": "string",
"description": "International +country-code number; presentation spaces are accepted."
},
"verified": {
"type": [
"boolean",
"null"
]
}
},
"additionalProperties": false
}
},
{
"type": "null"
}
]
},
"signupDateTime": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Unix timestamp in milliseconds, matching legacy Radar metadata."
},
"oauthIdentities": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"required": [
"provider",
"subject"
],
"properties": {
"subject": {
"type": "string"
},
"provider": {
"type": "string"
}
},
"additionalProperties": false
}
},
{
"type": "null"
}
]
},
"stripeCustomerId": {
"type": [
"string",
"null"
],
"description": "Customer ID in your Stripe account. An identity reference only; no billing behavior."
}
},
"description": "A partial customer upsert. Omitted fields are preserved; supplied arrays\nreplace the previous arrays (use [] to clear). IDs are unique per account.",
"additionalProperties": false
}
]
},
"firewall": {
"type": "object",
"properties": {
"rules": {
"type": "array",
"items": {
"type": "object",
"required": [
"action",
"destination",
"source"
],
"properties": {
"action": {
"type": "string",
"const": "allow",
"description": "What a rule does with the traffic it matches.\n\nOnly `allow` exists today, and it is required on every rule rather than\ndefaulted: a default would mean that the day `deny` arrives, every rule\nwritten before it silently acquires an action it never stated."
},
"source": {
"type": "object",
"properties": {
"cidr": {
"type": [
"string",
"null"
],
"description": "An address range, IPv4 or IPv6, in canonical `network/prefix` form."
},
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "A single port, 1–65535. Requires `protocol`."
},
"vmId": {
"type": [
"string",
"null"
],
"description": "A single VM, by id or by your slug for it. Answers hold its id."
},
"vpcId": {
"type": [
"string",
"null"
],
"description": "Everything on one private network, by id or by your slug for it.\nAnswers hold its id."
},
"public": {
"type": [
"boolean",
"null"
],
"description": "Every publicly routable address, whoever owns it — including another\nFreestyle VM reached at its public address. Only `true` is meaningful;\nomit the field otherwise. Not combined with `vmId` or `vpcId`."
},
"protocol": {
"oneOf": [
{
"type": "null"
},
{
"enum": [
"tcp",
"udp",
"icmp"
],
"type": "string",
"description": "The transport a matcher is restricted to."
}
]
},
"tunnelId": {
"type": [
"string",
"null"
],
"description": "Whatever is on the far side of one tunnel — the client that dials it,\nand any remote range routed over it. Tunnels have no slug, so this is a\ntunnel id: `tun-…`, or `wg-…` for one carried over from the per-VPC VPN\nrecords tunnels replaced."
}
},
"description": "One end of a rule: which traffic this side matches.\n\nFields intersect — `{ vpcId, port, protocol }` is \"traffic in that network,\non that port, over that protocol\". `vmId`/`vpcId`/`tunnelId` select by\nidentity (the VM however it is addressed); `cidr`/`public` select by\naddress. Unknown fields\nare rejected rather than ignored: a matcher is a security statement, and a\ntypo'd `porrt: 22` that quietly became \"every port\" is the wrong failure.",
"additionalProperties": false
},
"description": {
"type": [
"string",
"null"
],
"description": "A free-form note, up to 1024 characters."
},
"destination": {
"type": "object",
"properties": {
"cidr": {
"type": [
"string",
"null"
],
"description": "An address range, IPv4 or IPv6, in canonical `network/prefix` form."
},
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "A single port, 1–65535. Requires `protocol`."
},
"vmId": {
"type": [
"string",
"null"
],
"description": "A single VM, by id or by your slug for it. Answers hold its id."
},
"vpcId": {
"type": [
"string",
"null"
],
"description": "Everything on one private network, by id or by your slug for it.\nAnswers hold its id."
},
"public": {
"type": [
"boolean",
"null"
],
"description": "Every publicly routable address, whoever owns it — including another\nFreestyle VM reached at its public address. Only `true` is meaningful;\nomit the field otherwise. Not combined with `vmId` or `vpcId`."
},
"protocol": {
"oneOf": [
{
"type": "null"
},
{
"enum": [
"tcp",
"udp",
"icmp"
],
"type": "string",
"description": "The transport a matcher is restricted to."
}
]
},
"tunnelId": {
"type": [
"string",
"null"
],
"description": "Whatever is on the far side of one tunnel — the client that dials it,\nand any remote range routed over it. Tunnels have no slug, so this is a\ntunnel id: `tun-…`, or `wg-…` for one carried over from the per-VPC VPN\nrecords tunnels replaced."
}
},
"description": "One end of a rule: which traffic this side matches.\n\nFields intersect — `{ vpcId, port, protocol }` is \"traffic in that network,\non that port, over that protocol\". `vmId`/`vpcId`/`tunnelId` select by\nidentity (the VM however it is addressed); `cidr`/`public` select by\naddress. Unknown fields\nare rejected rather than ignored: a matcher is a security statement, and a\ntypo'd `porrt: 22` that quietly became \"every port\" is the wrong failure.",
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"description": "The `firewall` block of a create: rules created with the resource and\ndeleted with it. Inside it, an endpoint with no identity means the resource\nbeing created — which is how a rule names something whose id does not exist\nyet.",
"additionalProperties": false
},
"metadata": {
"type": "object",
"properties": {},
"description": "Up to 64 metadata entries; keys and values are limited to 63 characters.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"networks": {
"type": "array",
"items": {
"type": "object",
"required": [
"vpc"
],
"properties": {
"vpc": {
"type": "string",
"description": "The network to join, by id or by your slug for it. Also accepted as\n`vpcId`, the name the rest of the API uses."
},
"ipv4": {
"type": "object",
"properties": {},
"description": "The IPv4 address to take inside the network: an explicit address,\n`true` to auto-allocate, or `false` to opt out. Omitted = allocate one\n(networks are dual-stack), except on a network with no IPv4 CIDR,\nwhere the VM simply joins over IPv6.",
"additionalProperties": {}
},
"ipv6": {
"type": "object",
"properties": {},
"description": "The IPv6 address to take: an explicit address, `true` to auto-allocate\n(the default), or `false` to opt out. Every network has an IPv6 CIDR.",
"additionalProperties": {}
},
"routes": {
"type": "array",
"items": {
"type": "object",
"required": [
"cidr",
"via"
],
"properties": {
"via": {
"type": "string"
},
"cidr": {
"type": "string"
},
"metric": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Route priority, as `ip route`'s `metric`. Omit for the platform\ndefault. Several routes to the same `cidr` at the same metric are one\nmultipath route — the guest spreads flows across their gateways —\nwhile different metrics make a primary and a backup."
}
},
"description": "An in-guest static route: reach `cidr` via the gateway `via`, which must be\nan address inside the network's CIDR.",
"additionalProperties": {}
},
"description": "Static routes to install in the guest."
}
},
"description": "Attach a VM to one of your private networks. A VM may be on at most one.",
"additionalProperties": {}
},
"description": "Put the VM on your private networks. Omit to leave it off them. At most\none network is accepted today. Also accepted as `vpcs`, the name the\nrest of the API uses."
},
"customerId": {
"type": [
"string",
"null"
],
"description": "Existing customer ID, scoped to your Freestyle account."
},
"snapshotId": {
"type": [
"string",
"null"
],
"description": "Boot from this snapshot: its id, your slug for it, or a public\n`{owner}/{slug}`. Omit for the platform default."
},
"ttlSeconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Delete the VM this many seconds after it is created, whatever it is\ndoing at the time. A deadline, not an idle window: nothing resets it.\n-1 (or omitting this) means no deadline."
},
"displayName": {
"type": [
"string",
"null"
]
},
"reassignSlug": {
"type": "boolean",
"description": "Take `slug` even if another VM in this account already holds it. The\nslug moves atomically: the current holder keeps running, stays\naddressable by id, and just loses its slug. Without this flag a taken\nslug is a 409 CONFLICT. Requires `slug`."
},
"maxRunSeconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Pause the VM once a single run has lasted this many seconds, however\nbusy it is. Starting it again gives it a fresh budget — unlike\n`maxRunTotalSeconds`, which never resets. -1 (or omitting this) means\nno cap."
},
"automaticRestart": {
"type": [
"boolean",
"null"
],
"description": "Boot the VM again if it stops without you asking it to — the VMM\ncrashes, the guest kernel panics, the machine it runs on loses power.\nDefaults to `true`.\n\nIt never fights you: shutting the VM down, pausing it, running\n`poweroff` inside it, or hitting an idle timeout all leave it off. This\nonly decides who gets the last word when a *failure* stops it."
},
"autoDeleteSeconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Delete the VM once it has gone this many seconds without running.\nEvery start resets the clock; a running VM is never deleted for this.\n-1 (or omitting this) means never; 0 makes the VM ephemeral — deleted\nthe moment it stops.\n\nSome plans cap how long an unused VM is kept. On those, omitting this\n(or sending -1) gets you the cap rather than \"keep forever\", and asking\nfor longer than the cap is a 400."
},
"idleTimeoutSeconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Pause the VM after this many seconds without network activity.\n-1 (or omitting this) means never pause for idleness."
},
"maxRunTotalSeconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "How many seconds this VM may run in total, ever. Spending the budget\npauses the VM, and every later start is a 409 until you raise this.\n-1 (or omitting this) means no budget."
}
},
"additionalProperties": {}
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "api_get_vm",
"description": "GET /v5/vms/{vmIdOrSlug}. Fetch a VM by its id or its slug. Full API options; use the shorter convenience tool for common tasks.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmIdOrSlug",
"teamId"
],
"properties": {
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"vmIdOrSlug": {
"type": "string",
"description": "VM id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description74/100
PATCH /v5/vms/{vmIdOrSlug}. Rename a VM, change its slug or idle timeout, or merge in metadata. Full API options; use the shorter convenience tool for common tasks.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs65/100
18 of 26 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmIdOrSlug
VM id, or your slug for it
Clear enough to supply this argument.
body › autoDeleteSeconds
Seconds of not running before the VM is deleted; -1 removes the window
(on a plan that caps it, -1 puts you back on the cap rather than off
it), and 0 makes the VM ephemeral — deleted the moment it stops, or
right away if it is already stopped.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › automaticRestart
Turn automatic restart on or off. Applies to the next failure: this
neither boots a stopped VM nor stops a running one.
Clear enough to supply this argument.
body › customer › oneOf › 1 › countryCode
Not provided
Missing description. Explain what this value means and how to supply it.
body › customer › oneOf › 1 › customerId
Not provided
Missing description. Explain what this value means and how to supply it.
Missing description. Explain what this value means and how to supply it.
body › customer › oneOf › 1 › signupDateTime
Unix timestamp in milliseconds, matching legacy Radar metadata.
Clear enough to supply this argument.
body › customer › oneOf › 1 › stripeCustomerId
Customer ID in your Stripe account. An identity reference only; no billing behavior.
Clear enough to supply this argument.
body › customerId
Reassign to an existing customer; null detaches; omission leaves unchanged.
Clear enough to supply this argument.
body › displayName
Change the display label; an empty string clears it.
Clear enough to supply this argument.
body › idleTimeoutSeconds
Seconds of network idleness before pause; -1 removes the timeout.
Clear enough to supply this argument.
body › maxRunSeconds
Seconds one run may last before the VM is paused; -1 removes the cap.
Clear enough to supply this argument.
body › maxRunTotalSeconds
The lifetime runtime budget in seconds; -1 removes it. Raising this
past `totalRunSeconds` is how you start a VM that spent its budget.
Clear enough to supply this argument.
body › metadata
Metadata merged into the VM. Only the keys you send are touched; send an
empty value to remove one.
Clear enough to supply this argument.
body › reassignSlug
Take `slug` even if another VM in this account already holds it. The
slug moves atomically: the current holder keeps running, stays
addressable by id, and just loses its slug. Without this flag a taken
slug is a 409 CONFLICT. Requires a non-empty `slug`.
Clear enough to supply this argument.
body › slug
Change the slug; an empty string clears it.
Clear enough to supply this argument.
body › ttlSeconds
Seconds from creation — not from now — before the VM is deleted; -1
removes the deadline. A value already in the past deletes it shortly.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Add a human-readable title so users do not have to interpret the tool identifier.
Description89/100
POST /v5/vms/{vmIdOrSlug}/exec-await. Run a command in the guest and wait for it to finish. A non-zero exit status is still a 200. Read `statusCode`, which is null if the command was killed by its timeout. Full API options; use the shorter convenience tool for common tasks.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
7 of 8 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmIdOrSlug
VM id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
body › command
The command line, run through the guest's shell.
Clear enough to supply this argument.
body › env
Extra environment variables. Keys must be valid POSIX names.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › linuxUser
Not provided
Missing description. Explain what this value means and how to supply it.
body › stdin
Base64-encoded stdin, up to 1 MiB decoded.
Clear enough to supply this argument.
body › timeoutMs
Wall-clock limit, milliseconds. 1–86400000 with background requests and a native-exec-capable agent;
otherwise at most 300000. Defaults to 30000 (30 s).
The guest kills the command at the deadline.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "api_exec_vm",
"description": "POST /v5/vms/{vmIdOrSlug}/exec-await. Run a command in the guest and wait for it to finish. A non-zero exit status is still a 200. Read `statusCode`, which is null if the command was killed by its timeout. Full API options; use the shorter convenience tool for common tasks.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmIdOrSlug",
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"required": [
"command"
],
"properties": {
"env": {
"type": "object",
"properties": {},
"description": "Extra environment variables. Keys must be valid POSIX names.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"stdin": {
"type": [
"string",
"null"
],
"description": "Base64-encoded stdin, up to 1 MiB decoded."
},
"command": {
"type": "string",
"description": "The command line, run through the guest's shell."
},
"linuxUser": {
"oneOf": [
{
"type": "null"
},
{
"type": "string",
"description": "Branded POSIX-style Linux username carried as `linuxUser` in JSON bodies\nand query strings. Constructed only via\n`try_from`/`from_str`, which enforces the same rule as\n`freestyle-firecracker/models/src/users.rs::is_valid_posix_name`:\n`[a-z_][a-z0-9_-]*` up to `MAX_LEN` chars.\n\nValidating at the type boundary keeps shell metacharacters and oversized\nvalues out of the host node and prevents them from reaching the guest."
}
]
},
"timeoutMs": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Wall-clock limit, milliseconds. 1–86400000 with background requests and a native-exec-capable agent;\notherwise at most 300000. Defaults to 30000 (30 s).\nThe guest kills the command at the deadline."
}
},
"additionalProperties": false
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"vmIdOrSlug": {
"type": "string",
"description": "VM id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
GET /v5/vms/{vmIdOrSlug}/fs/read. Read a file from inside the VM. The response body is the file's raw bytes, streamed from the guest, so there is no size limit and nothing to decode. Send a `Range: bytes=…` header to fetch part of a file — which is also how you resume a download that failed partway. Full API options; use the shorter convenience tool for common tasks.
The description explains the capability, when to use it, and what to expect.
Inputs87/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
vmIdOrSlug
VM id, or your slug for it
Clear enough to supply this argument.
path
Absolute path inside the guest.
Clear enough to supply this argument.
Range
Optional single byte range, e.g. `bytes=0-1048575`
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "api_read_file",
"description": "GET /v5/vms/{vmIdOrSlug}/fs/read. Read a file from inside the VM. The response body is the file's raw bytes, streamed from the guest, so there is no size limit and nothing to decode. Send a `Range: bytes=…` header to fetch part of a file — which is also how you resume a download that failed partway. Full API options; use the shorter convenience tool for common tasks.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmIdOrSlug",
"path",
"teamId"
],
"properties": {
"path": {
"type": "string",
"description": "Absolute path inside the guest."
},
"Range": {
"type": [
"string",
"null"
],
"description": "Optional single byte range, e.g. `bytes=0-1048575`"
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"vmIdOrSlug": {
"type": "string",
"description": "VM id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description82/100
POST /v5/vms/{vmIdOrSlug}/fs/uploads. Start a chunked upload of a large file (up to 16 GiB) into the VM. Send the bytes with `PUT /fs/uploads/{uploadId}`, then finish with `commit`.
Describe the returned information so the agent knows whether it will answer the request.
Inputs91/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
vmIdOrSlug
VM id, or your slug for it
Clear enough to supply this argument.
body › mode
Optional final file mode bits (e.g. 493 for `0o755`). Defaults to the
target's existing mode, or `0o600` for a new file.
Clear enough to supply this argument.
body › path
Absolute path inside the guest the finished file is committed to.
Clear enough to supply this argument.
body › sha256
Optional sha256 of the full file as 64 hex characters; the upload is
rejected at commit if the received bytes do not match.
Clear enough to supply this argument.
body › size
Total file size in bytes, up to 16 GiB.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Add a human-readable title so users do not have to interpret the tool identifier.
Description81/100
GET /v5/vms/{vmIdOrSlug}/fs/uploads/{uploadId}. Fetch an upload session's progress — use `receivedBytes` as the next chunk's offset when resuming after a failed chunk.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
vmIdOrSlug
VM id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
uploadId
Upload session id
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
PUT /v5/vms/{vmIdOrSlug}/fs/uploads/{uploadId}. Append one chunk of raw bytes to an upload session at the given offset. Chunks must arrive in order; on any transport error, re-fetch the session and resume from its `receivedBytes`. Keep chunks small enough to retry cheaply (the SDK uses 16 MiB; the hard cap is 256 MiB). Supply raw file bytes encoded as bodyBase64, up to 512 KiB per call; this tool decodes them before sending the HTTP request.
Describe the returned information so the agent knows whether it will answer the request.
Inputs79/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
vmIdOrSlug
VM id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
uploadId
Upload session id
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
offset
Byte offset this chunk starts at. Must equal the session's current
`receivedBytes`; chunks at an already-received offset are acknowledged
without rewriting (safe retries), and offsets beyond it are rejected.
Clear enough to supply this argument.
bodyBase64
Raw request bytes encoded as base64; maximum 512 KiB per chunk
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "upload_chunk",
"description": "PUT /v5/vms/{vmIdOrSlug}/fs/uploads/{uploadId}. Append one chunk of raw bytes to an upload session at the given offset. Chunks must arrive in order; on any transport error, re-fetch the session and resume from its `receivedBytes`. Keep chunks small enough to retry cheaply (the SDK uses 16 MiB; the hard cap is 256 MiB). Supply raw file bytes encoded as bodyBase64, up to 512 KiB per call; this tool decodes them before sending the HTTP request.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmIdOrSlug",
"uploadId",
"offset",
"bodyBase64",
"teamId"
],
"properties": {
"offset": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Byte offset this chunk starts at. Must equal the session's current\n`receivedBytes`; chunks at an already-received offset are acknowledged\nwithout rewriting (safe retries), and offsets beyond it are rejected."
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"uploadId": {
"type": "string",
"description": "Upload session id"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"bodyBase64": {
"type": "string",
"pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$",
"maxLength": 699052,
"description": "Raw request bytes encoded as base64; maximum 512 KiB per chunk"
},
"vmIdOrSlug": {
"type": "string",
"description": "VM id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
POST /v5/vms/{vmIdOrSlug}/fs/uploads/{uploadId}/commit. Finish an upload: the file is verified (size, and sha256 when declared) and renamed into place inside the guest atomically — the target path never holds a partial file. On success the session is gone; on failure it remains and commit may be retried.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
vmIdOrSlug
VM id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
uploadId
Upload session id
Explain the meaning of this value, not just its name.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "commit_upload",
"description": "POST /v5/vms/{vmIdOrSlug}/fs/uploads/{uploadId}/commit. Finish an upload: the file is verified (size, and sha256 when declared) and renamed into place inside the guest atomically — the target path never holds a partial file. On success the session is gone; on failure it remains and commit may be retried.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmIdOrSlug",
"uploadId",
"teamId"
],
"properties": {
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"uploadId": {
"type": "string",
"description": "Upload session id"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"vmIdOrSlug": {
"type": "string",
"description": "VM id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
PUT /v5/vms/{vmIdOrSlug}/fs/write. Write a file inside the VM, atomically: the path holds the old file until the new one has arrived intact, never a half-written one.
Send the file as the raw request body (with `?path=`) and it can be as large as 16 GiB — nothing buffers it whole. Send a JSON body instead (up to 32 MiB) when it is easier to type than to upload, as from this page.
This is a single attempt: if the connection drops, the write starts over. To upload something big over a link you do not trust, open an upload session (`POST /fs/uploads`) and send retryable chunks instead. Supply raw file bytes encoded as bodyBase64, up to 512 KiB per call; this tool decodes them before sending the HTTP request. Full API options; use the shorter convenience tool for common tasks.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
11 of 12 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmIdOrSlug
VM id, or your slug for it
Clear enough to supply this argument.
path
Absolute path inside the guest. Required when the body is raw bytes;
omitted when sending a JSON body, which carries its own `path`.
Clear enough to supply this argument.
mode
Final file mode bits (e.g. 493 for `0o755`). Defaults to the target's
existing mode, or `0o600` for a new file.
Clear enough to supply this argument.
sha256
Optional sha256 of the file as 64 hex characters. Supplied, the write is
rejected unless the received bytes match.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › content
The file's content, interpreted per `encoding`.
Clear enough to supply this argument.
body › encoding
Not provided
Missing description. Explain what this value means and how to supply it.
body › mode
Final file mode bits (e.g. 493 for `0o755`).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › path
Absolute path inside the guest.
Clear enough to supply this argument.
body › sha256
Optional sha256 of the file as 64 hex characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
bodyBase64
Raw request bytes encoded as base64; maximum 512 KiB per chunk
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "api_write_file",
"description": "PUT /v5/vms/{vmIdOrSlug}/fs/write. Write a file inside the VM, atomically: the path holds the old file until the new one has arrived intact, never a half-written one.\n\nSend the file as the raw request body (with `?path=`) and it can be as large as 16 GiB — nothing buffers it whole. Send a JSON body instead (up to 32 MiB) when it is easier to type than to upload, as from this page.\n\nThis is a single attempt: if the connection drops, the write starts over. To upload something big over a link you do not trust, open an upload session (`POST /fs/uploads`) and send retryable chunks instead. Supply raw file bytes encoded as bodyBase64, up to 512 KiB per call; this tool decodes them before sending the HTTP request. Full API options; use the shorter convenience tool for common tasks.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmIdOrSlug",
"teamId"
],
"properties": {
"body": {
"type": "object",
"required": [
"content",
"path"
],
"properties": {
"mode": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Final file mode bits (e.g. 493 for `0o755`)."
},
"path": {
"type": "string",
"description": "Absolute path inside the guest."
},
"sha256": {
"type": [
"string",
"null"
],
"description": "Optional sha256 of the file as 64 hex characters."
},
"content": {
"type": "string",
"description": "The file's content, interpreted per `encoding`."
},
"encoding": {
"oneOf": [
{
"type": "null"
},
{
"enum": [
"utf8",
"base64"
],
"type": "string",
"description": "How `content` is encoded in the JSON form of a write."
}
]
}
},
"description": "The JSON form of a write: convenient from a docs page or a shell, capped at\n32 MiB. Larger files go as raw bytes on the same endpoint.",
"additionalProperties": {}
},
"mode": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Final file mode bits (e.g. 493 for `0o755`). Defaults to the target's\nexisting mode, or `0o600` for a new file."
},
"path": {
"type": "string",
"description": "Absolute path inside the guest. Required when the body is raw bytes;\nomitted when sending a JSON body, which carries its own `path`."
},
"sha256": {
"type": "string",
"description": "Optional sha256 of the file as 64 hex characters. Supplied, the write is\nrejected unless the received bytes match."
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"bodyBase64": {
"type": "string",
"pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$",
"maxLength": 699052,
"description": "Raw request bytes encoded as base64; maximum 512 KiB per chunk"
},
"vmIdOrSlug": {
"type": "string",
"description": "VM id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description90/100
PUT /v5/vms/{vmIdOrSlug}/networks. Set the VM's private networks — attach, update, or detach in one declarative call (an empty list detaches). Works while the VM is stopped, running, or paused: a stopped VM picks the change up on its next start, a running VM is reconfigured live, and a paused VM applies it on resume. At most one network is accepted today. The VM keeps its address while it stays in the same network; moving networks (or naming a different address) renumbers it.
The description explains the capability, when to use it, and what to expect.
Inputs72/100
7 of 9 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmIdOrSlug
VM id, or your slug for it
Clear enough to supply this argument.
body › networks › items › ipv4
The IPv4 address to take inside the network: an explicit address,
`true` to auto-allocate, or `false` to opt out. Omitted = allocate one
(networks are dual-stack), except on a network with no IPv4 CIDR,
where the VM simply joins over IPv6.
Clear enough to supply this argument.
body › networks › items › ipv6
The IPv6 address to take: an explicit address, `true` to auto-allocate
(the default), or `false` to opt out. Every network has an IPv6 CIDR.
Clear enough to supply this argument.
body › networks › items › routes › items › cidr
Not provided
Missing description. Explain what this value means and how to supply it.
body › networks › items › routes › items › metric
Route priority, as `ip route`'s `metric`. Omit for the platform
default. Several routes to the same `cidr` at the same metric are one
multipath route — the guest spreads flows across their gateways —
while different metrics make a primary and a backup.
Clear enough to supply this argument.
body › networks › items › routes › items › via
Not provided
Missing description. Explain what this value means and how to supply it.
body › networks › items › vpc
The network to join, by id or by your slug for it. Also accepted as
`vpcId`, the name the rest of the API uses.
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "update_vm_networks",
"description": "PUT /v5/vms/{vmIdOrSlug}/networks. Set the VM's private networks — attach, update, or detach in one declarative call (an empty list detaches). Works while the VM is stopped, running, or paused: a stopped VM picks the change up on its next start, a running VM is reconfigured live, and a paused VM applies it on resume. At most one network is accepted today. The VM keeps its address while it stays in the same network; moving networks (or naming a different address) renumbers it.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmIdOrSlug",
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"properties": {
"networks": {
"type": "array",
"items": {
"type": "object",
"required": [
"vpc"
],
"properties": {
"vpc": {
"type": "string",
"description": "The network to join, by id or by your slug for it. Also accepted as\n`vpcId`, the name the rest of the API uses."
},
"ipv4": {
"type": "object",
"properties": {},
"description": "The IPv4 address to take inside the network: an explicit address,\n`true` to auto-allocate, or `false` to opt out. Omitted = allocate one\n(networks are dual-stack), except on a network with no IPv4 CIDR,\nwhere the VM simply joins over IPv6.",
"additionalProperties": {}
},
"ipv6": {
"type": "object",
"properties": {},
"description": "The IPv6 address to take: an explicit address, `true` to auto-allocate\n(the default), or `false` to opt out. Every network has an IPv6 CIDR.",
"additionalProperties": {}
},
"routes": {
"type": "array",
"items": {
"type": "object",
"required": [
"cidr",
"via"
],
"properties": {
"via": {
"type": "string"
},
"cidr": {
"type": "string"
},
"metric": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Route priority, as `ip route`'s `metric`. Omit for the platform\ndefault. Several routes to the same `cidr` at the same metric are one\nmultipath route — the guest spreads flows across their gateways —\nwhile different metrics make a primary and a backup."
}
},
"description": "An in-guest static route: reach `cidr` via the gateway `via`, which must be\nan address inside the network's CIDR.",
"additionalProperties": {}
},
"description": "Static routes to install in the guest."
}
},
"description": "Attach a VM to one of your private networks. A VM may be on at most one.",
"additionalProperties": {}
},
"description": "At most one network is accepted today. An empty list detaches the VM.\nAlso accepted as `vpcs`, the name the rest of the API uses."
}
},
"description": "The desired network set for `PUT /vms/{vmIdOrSlug}/networks`. Declarative:\nwhat is listed is attached, what is absent is detached.",
"additionalProperties": {}
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"vmIdOrSlug": {
"type": "string",
"description": "VM id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description88/100
POST /v5/vms/{vmIdOrSlug}/pause. Freeze a running VM, keeping its memory so a later start resumes it exactly. Full API options; use the shorter convenience tool for common tasks.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
vmIdOrSlug
VM id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Add a human-readable title so users do not have to interpret the tool identifier.
Description78/100
GET /v5/vms/{vmIdOrSlug}/pty/sessions. List the VM's terminal sessions, running and recently exited. Scoped to one Linux user when the request names one, otherwise every session on the VM.
Describe the returned information so the agent knows whether it will answer the request.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
vmIdOrSlug
VM id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
linuxUser
Only sessions owned by this guest Linux user; omit for all of them
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list_pty_sessions",
"description": "GET /v5/vms/{vmIdOrSlug}/pty/sessions. List the VM's terminal sessions, running and recently exited. Scoped to one Linux user when the request names one, otherwise every session on the VM.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmIdOrSlug",
"teamId"
],
"properties": {
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"linuxUser": {
"type": "string",
"description": "Only sessions owned by this guest Linux user; omit for all of them"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"vmIdOrSlug": {
"type": "string",
"description": "VM id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "close_pty_session",
"description": "DELETE /v5/vms/{vmIdOrSlug}/pty/sessions/{sessionId}. Kill a terminal session and remove it, addressed by id or by the slug it was opened with.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmIdOrSlug",
"sessionId",
"teamId"
],
"properties": {
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"linuxUser": {
"type": "string",
"description": "Guest Linux user that must own the session"
},
"sessionId": {
"type": "string",
"description": "Session id, or the slug the session was opened with"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"vmIdOrSlug": {
"type": "string",
"description": "VM id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
POST /v5/vms/{vmIdOrSlug}/resize. Change a VM's vCPU, memory, or disk. Resizing is grow-only on every axis: each can go up but never down. Omitted fields keep their current value. vCPU and memory apply live to a running VM, apply on resume for a paused one, and apply at the next boot for a stopped one. Growing the disk needs a running VM, since it grows a live block device and then its filesystem. Full API options; use the shorter convenience tool for common tasks.
The description explains the capability, when to use it, and what to expect.
Inputs67/100
5 of 6 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmIdOrSlug
VM id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
body › cpu
Not provided
Missing description. Explain what this value means and how to supply it.
body › memory
Memory, MiB.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body › storage
Disk, MiB. Disks can only grow.
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "api_resize_vm",
"description": "POST /v5/vms/{vmIdOrSlug}/resize. Change a VM's vCPU, memory, or disk. Resizing is grow-only on every axis: each can go up but never down. Omitted fields keep their current value. vCPU and memory apply live to a running VM, apply on resume for a paused one, and apply at the next boot for a stopped one. Growing the disk needs a running VM, since it grows a live block device and then its filesystem. Full API options; use the shorter convenience tool for common tasks.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmIdOrSlug",
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"properties": {
"cpu": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
]
},
"memory": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Memory, MiB."
},
"storage": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Disk, MiB. Disks can only grow."
}
},
"additionalProperties": {}
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"vmIdOrSlug": {
"type": "string",
"description": "VM id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description95/100
POST /v5/vms/{vmIdOrSlug}/snapshot. Capture the VM's exact state, memory and disk, so a VM booted from it resumes exactly where this one was. The VM must be running or paused. New snapshots are private. This call returns once the state is captured; VMs can be created from the snapshot immediately.
Describe the returned information so the agent knows whether it will answer the request.
Inputs64/100
5 of 7 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
vmIdOrSlug
VM id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
body › autoDeleteSeconds
Delete the snapshot once this many seconds pass without a VM being
created from it. Every create from it resets the clock. -1 (or
omitting this) means never; some plans cap this, and on those omitting
it (or sending -1) gets you the cap.
Clear enough to supply this argument.
body › displayName
Not provided
Missing description. Explain what this value means and how to supply it.
body › slug
Not provided
Missing description. Explain what this value means and how to supply it.
body › ttlSeconds
Delete the snapshot this many seconds after it is taken, whatever has
booted it since. -1 (or omitting this) means no deadline.
Clear enough to supply this argument.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "snapshot_vm",
"description": "POST /v5/vms/{vmIdOrSlug}/snapshot. Capture the VM's exact state, memory and disk, so a VM booted from it resumes exactly where this one was. The VM must be running or paused. New snapshots are private. This call returns once the state is captured; VMs can be created from the snapshot immediately.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"vmIdOrSlug",
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"properties": {
"slug": {
"type": [
"string",
"null"
]
},
"ttlSeconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Delete the snapshot this many seconds after it is taken, whatever has\nbooted it since. -1 (or omitting this) means no deadline."
},
"displayName": {
"type": [
"string",
"null"
]
},
"autoDeleteSeconds": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"type": "null"
}
],
"description": "Delete the snapshot once this many seconds pass without a VM being\ncreated from it. Every create from it resets the clock. -1 (or\nomitting this) means never; some plans cap this, and on those omitting\nit (or sending -1) gets you the cap."
}
},
"additionalProperties": false
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
},
"vmIdOrSlug": {
"type": "string",
"description": "VM id, or your slug for it"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description58/100
POST /v5/vpcs. Create a private network.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs57/100
18 of 22 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
body › cidr
The network's IPv4 CIDR. Networks are dual-stack; a `/24` out of
`10.0.0.0/8` is derived for you when omitted. Name one to choose the
range yourself — worth doing when the network has to reach an existing
estate over a tunnel and must not overlap it, or when it needs more
than 254 IPv4 members.
Clear enough to supply this argument.
body › cidrV6
The network's IPv6 CIDR; a unique-local /64 is derived for you when
omitted.
Clear enough to supply this argument.
body › displayName
Not provided
Missing description. Explain what this value means and how to supply it.
What a rule does with the traffic it matches.
Only `allow` exists today, and it is required on every rule rather than
defaulted: a default would mean that the day `deny` arrives, every rule
written before it silently acquires an action it never stated.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Missing description. Explain what this value means and how to supply it.
body › firewall › oneOf › 1 › rules › items › destination › public
Every publicly routable address, whoever owns it — including another
Freestyle VM reached at its public address. Only `true` is meaningful;
omit the field otherwise. Not combined with `vmId` or `vpcId`.
Whatever is on the far side of one tunnel — the client that dials it,
and any remote range routed over it. Tunnels have no slug, so this is a
tunnel id: `tun-…`, or `wg-…` for one carried over from the per-VPC VPN
records tunnels replaced.
Missing description. Explain what this value means and how to supply it.
body › firewall › oneOf › 1 › rules › items › source › public
Every publicly routable address, whoever owns it — including another
Freestyle VM reached at its public address. Only `true` is meaningful;
omit the field otherwise. Not combined with `vmId` or `vpcId`.
Whatever is on the far side of one tunnel — the client that dials it,
and any remote range routed over it. Tunnels have no slug, so this is a
tunnel id: `tun-…`, or `wg-…` for one carried over from the per-VPC VPN
records tunnels replaced.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "create_vpc",
"description": "POST /v5/vpcs. Create a private network.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"body",
"teamId"
],
"properties": {
"body": {
"type": "object",
"properties": {
"cidr": {
"type": [
"string",
"null"
],
"description": "The network's IPv4 CIDR. Networks are dual-stack; a `/24` out of\n`10.0.0.0/8` is derived for you when omitted. Name one to choose the\nrange yourself — worth doing when the network has to reach an existing\nestate over a tunnel and must not overlap it, or when it needs more\nthan 254 IPv4 members."
},
"slug": {
"type": [
"string",
"null"
]
},
"cidrV6": {
"type": [
"string",
"null"
],
"description": "The network's IPv6 CIDR; a unique-local /64 is derived for you when\nomitted."
},
"firewall": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"properties": {
"rules": {
"type": "array",
"items": {
"type": "object",
"required": [
"action",
"destination",
"source"
],
"properties": {
"action": {
"type": "string",
"const": "allow",
"description": "What a rule does with the traffic it matches.\n\nOnly `allow` exists today, and it is required on every rule rather than\ndefaulted: a default would mean that the day `deny` arrives, every rule\nwritten before it silently acquires an action it never stated."
},
"source": {
"type": "object",
"properties": {
"cidr": {
"type": [
"string",
"null"
],
"description": "An address range, IPv4 or IPv6, in canonical `network/prefix` form."
},
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "A single port, 1–65535. Requires `protocol`."
},
"vmId": {
"type": [
"string",
"null"
],
"description": "A single VM, by id or by your slug for it. Answers hold its id."
},
"vpcId": {
"type": [
"string",
"null"
],
"description": "Everything on one private network, by id or by your slug for it.\nAnswers hold its id."
},
"public": {
"type": [
"boolean",
"null"
],
"description": "Every publicly routable address, whoever owns it — including another\nFreestyle VM reached at its public address. Only `true` is meaningful;\nomit the field otherwise. Not combined with `vmId` or `vpcId`."
},
"protocol": {
"oneOf": [
{
"type": "null"
},
{
"enum": [
"tcp",
"udp",
"icmp"
],
"type": "string",
"description": "The transport a matcher is restricted to."
}
]
},
"tunnelId": {
"type": [
"string",
"null"
],
"description": "Whatever is on the far side of one tunnel — the client that dials it,\nand any remote range routed over it. Tunnels have no slug, so this is a\ntunnel id: `tun-…`, or `wg-…` for one carried over from the per-VPC VPN\nrecords tunnels replaced."
}
},
"description": "One end of a rule: which traffic this side matches.\n\nFields intersect — `{ vpcId, port, protocol }` is \"traffic in that network,\non that port, over that protocol\". `vmId`/`vpcId`/`tunnelId` select by\nidentity (the VM however it is addressed); `cidr`/`public` select by\naddress. Unknown fields\nare rejected rather than ignored: a matcher is a security statement, and a\ntypo'd `porrt: 22` that quietly became \"every port\" is the wrong failure.",
"additionalProperties": false
},
"description": {
"type": [
"string",
"null"
],
"description": "A free-form note, up to 1024 characters."
},
"destination": {
"type": "object",
"properties": {
"cidr": {
"type": [
"string",
"null"
],
"description": "An address range, IPv4 or IPv6, in canonical `network/prefix` form."
},
"port": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "A single port, 1–65535. Requires `protocol`."
},
"vmId": {
"type": [
"string",
"null"
],
"description": "A single VM, by id or by your slug for it. Answers hold its id."
},
"vpcId": {
"type": [
"string",
"null"
],
"description": "Everything on one private network, by id or by your slug for it.\nAnswers hold its id."
},
"public": {
"type": [
"boolean",
"null"
],
"description": "Every publicly routable address, whoever owns it — including another\nFreestyle VM reached at its public address. Only `true` is meaningful;\nomit the field otherwise. Not combined with `vmId` or `vpcId`."
},
"protocol": {
"oneOf": [
{
"type": "null"
},
{
"enum": [
"tcp",
"udp",
"icmp"
],
"type": "string",
"description": "The transport a matcher is restricted to."
}
]
},
"tunnelId": {
"type": [
"string",
"null"
],
"description": "Whatever is on the far side of one tunnel — the client that dials it,\nand any remote range routed over it. Tunnels have no slug, so this is a\ntunnel id: `tun-…`, or `wg-…` for one carried over from the per-VPC VPN\nrecords tunnels replaced."
}
},
"description": "One end of a rule: which traffic this side matches.\n\nFields intersect — `{ vpcId, port, protocol }` is \"traffic in that network,\non that port, over that protocol\". `vmId`/`vpcId`/`tunnelId` select by\nidentity (the VM however it is addressed); `cidr`/`public` select by\naddress. Unknown fields\nare rejected rather than ignored: a matcher is a security statement, and a\ntypo'd `porrt: 22` that quietly became \"every port\" is the wrong failure.",
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"description": "The `firewall` block of a create: rules created with the resource and\ndeleted with it. Inside it, an endpoint with no identity means the resource\nbeing created — which is how a rule names something whose id does not exist\nyet.",
"additionalProperties": false
}
]
},
"displayName": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": {}
},
"teamId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Exact team ID chosen from list_teams"
},
"approvalId": {
"type": "string",
"maxLength": 256,
"minLength": 1,
"description": "Conversation approval from allow_team; omit for an always-approved team"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
GET /v5/vpcs/{vpcIdOrSlug}/tunnels. List the tunnels attached to a private network, newest first. Listings never include a private key: one is returned only by create and rotate-key.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
vpcIdOrSlug
VPC id, or your slug for it
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
type
wireguard (default), ikev2, tailscale, or all.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
teamId
Exact team ID chosen from list_teams
Clear enough to supply this argument.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Add a human-readable title so users do not have to interpret the tool identifier.
Description84/100
Make any HTTP request to the Freestyle /v5/ API using the explicitly chosen team. Prefer dedicated tools; inspect get_openapi first for unfamiliar endpoints. JSON, text and base64 bodies supported (512 KiB maximum); responses capped at 32 KiB. No WebSockets: use open_terminal. Requires write scope even for GET because future endpoints may have side effects. Confirm destructive changes and public exposure.
The description explains the capability, when to use it, and what to expect.
Inputs17/100
2 of 9 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
method
Not provided
Missing description. Explain what this value means and how to supply it.
path
Not provided
Missing description. Explain what this value means and how to supply it.
query
Not provided
Missing description. Explain what this value means and how to supply it.
headers
Not provided
Missing description. Explain what this value means and how to supply it.
body
Not provided
Missing description. Explain what this value means and how to supply it.
textBody
Not provided
Missing description. Explain what this value means and how to supply it.
bodyBase64
Not provided
Missing description. Explain what this value means and how to supply it.
teamId
Exact team ID chosen from list_teams
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approvalId
Conversation approval from allow_team; omit for an always-approved team
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Add a human-readable title so users do not have to interpret the tool identifier.
Description95/100
Read documentation from the bundled Freestyle public OpenAPI contract. This tool only returns static schema text: it does not execute API operations or access a user's resources. Default: paginated operation index, including each operation's dedicated tool name. Select operationId or schemaName for documentation; raw=true returns the whole spec in text chunks. Offset/limit count operations for the index, characters for details. Schema references use components/schemas.
The description explains the capability, when to use it, and what to expect.
Inputs0/100
0 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
operationId
Not provided
Missing description. Explain what this value means and how to supply it.
schemaName
Not provided
Missing description. Explain what this value means and how to supply it.
raw
Not provided
Missing description. Explain what this value means and how to supply it.
offset
Not provided
Missing description. Explain what this value means and how to supply it.
limit
Not provided
Missing description. Explain what this value means and how to supply it.
Freestyle setup, tools, quality score, publishing readiness, and alternatives.
How do I add Freestyle to Claude, ChatGPT, or Cursor?
Add Freestyle to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://mcp.freestyle.sh/mcp.
Is Freestyle MCP ready for ChatGPT and Claude?
As of November 6, 2026, Freestyle scores 86/100 on Manufact's MCP publishing checklist. The scan does not yet meet ChatGPT publishing checks and does not yet meet Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is Freestyle's MCP tool documentation?
As of November 6, 2026, Freestyle scores 66/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 135 of 135 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to Freestyle?
As of November 7, 2026, alternatives to Freestyle in developer-tools on the Manufact MCP leaderboard include Speko, Manufact, Context, AgentMail, and TPC Benchmarks.
How can Freestyle improve its MCP documentation?
allow_team is the lowest-scoring reviewed tool at 40/100. 0 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.