Edgegap MCP Server
OfficialConnect AI agents to Edgegap to containerize, deploy, and troubleshoot multiplayer game servers.
Generate and validate server Dockerfiles/configs for Unity, Unreal, Godot, or other engines.
Manage applications and versions: images, ports, CPU/memory, env vars, max duration, caching, registry credentials/tags.
Deploy, wait for, inspect, list, tag, report, and stop authoritative dedicated servers near players.
List deployment locations and ping beacons.
Read deployment logs and CPU/memory/network metrics for troubleshooting and sizing.
Configure Endpoint Storage and pull profiles for log retention and boot-time file copies.
Create and manage relay sessions for host-client or peer-to-peer games.
Build basic matchmaker configs and load bundled Edgegap agent skills/workflows.
Use guardrails: dry runs, read-only mode, app allowlist, deployment caps, auto-stop limits, secret redaction, and strict stop/delete controls.
Generates and validates Dockerfiles for headless game server builds against Edgegap's requirements, checks images are linux/amd64, and provides registry credentials with the exact docker login, build and push commands to publish the image for deployment.
Supports Unity dedicated server builds: generates a Dockerfile with the correct Unity headless flags (-batchmode -nographics), default build paths and server binary names, and validates existing configs for missing batchmode/nographics flags and port mismatches.
Supports Unreal Engine dedicated server builds: generates a Dockerfile that runs the packaged LinuxServer folder, applies the non-root user Unreal requires, and validates existing configs for Unreal servers running as root.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Edgegap MCP ServerDeploy my game server container on Edgegap near Frankfurt and give me the connection address."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Edgegap MCP Server
Connect AI coding agents to Edgegap through our MCP server. Your agent can take a headless server build all the way to players connecting: write or check the Dockerfile, push the image to your private Edgegap registry, deploy an authoritative dedicated server close to players, and read logs when something breaks.
👉 Supported Features
Using Unity, Unreal Engine, or Godot? Our Unity, Unreal Engine, and Godot guides and plugins remain the fastest path for those engines. The MCP server works alongside them, and on its own for any engine.
Use our MCP server when:
Containerizing your game server - your agent writes a Dockerfile for your build (or reviews the one you have) against best practices, pushes the image to our private container registry, and removes unused old image tags to reclaim registry capacity.
Deploying a dedicated server - create and update app versions, review available locations, deploy close to your players, and get server IP with ports to test client connection.
Building a CI/CD pipeline - test your deployments and teardown from a build system.
Troubleshooting a game server issue - inspect app versions and deployment status, read container logs and CPU/memory utilization, or reproduce a failed deployment.
Running client-host and peer-to-peer games - create relay sessions providing NAT punchthrough and avoid connection blocking. Review Orchestration Models and Dedicated Servers or Relays? before deciding.
Out of scope / not supported by MCP: building Linux server executable; creating, starting or stopping a matchmaker (upload the generated configuration in the dashboard); server browser; lobbies; managed clusters; private fleets; or billing.
If you need help,please reach out to us over Discord. For live games support see our ticketing system.
Related MCP server: MileHost MCP Server
⚖️ Dedicated Servers or Relays?
Edgegap can host your multiplayer game in two ways. We recommend dedicated servers, and so does our MCP server: your agent will default to a dedicated server and only use a relay when you've chosen a host-client setup.
Dedicated server (recommended) | Relay | |
What Edgegap runs | Your headless server build, close to players | A traffic forwarder only, no game code |
Who runs the game | The server | One player's game (the host) |
Cheating | Much harder, the server has authority | The host can change anything |
Fairness | Every player connects directly to the server | The host has no latency, everyone else goes through two hops |
When the host leaves | The match continues | The match ends, unless your game supports host migration |
Performance limited by | The server's allocated CPU and memory | The host's PC and home internet upload |
You need | A server build in a container image | Netcode built as a listen server (host-client) |
No server image yet? That's not a reason to choose relays. Your agent can write the Dockerfile for your build with edgegap_generate_dockerfile. Learn more about relays in Distributed Relay.
🚀 Installation
MCP server installation is very simple:
Install the MCP server for Popular Agents or with Custom Integration.
Generate and attach an API token for your agent to use with our MCP server.
Generate (and view) your secret tokens for Edgegap API in Dashboard - User Settings / Tokens.
Add your secret token with each API request as an HTTP header (include the word token):
Authorization: token xxxxxxxx-e458-4592-b607-c2c28afd8b62
Do not integrate Edgegap API endpoints in game client, as your API token provides unlimited access to your account. See Integration for secure client-facing API endpoints and functions.
In case your secret tokens are compromised or leaked, delete and re-create them from dashboard.
The token is organization-wide and cannot be scoped to one application. Read DESIGN.md before giving it to an unattended agent.
Popular Agents
Install Edgegap MCP server in your preferred agentic IDE with the Cursor or VS Code buttons at the top of this page, then add your token to the Authorization header.
Claude Code
claude mcp add --transport http edgegap https://mcp.edgegap.dev/mcp \
-H "Authorization: token xxxxxxxx-e458-4592-b607-c2c28afd8b62" --scope userChatGPT Codex
Codex reads the token from an environment variable and sends it as Authorization: Bearer <token>, which the hosted endpoint accepts. In ~/.codex/config.toml:
[mcp_servers.edgegap]
url = "https://mcp.edgegap.dev/mcp"
bearer_token_env_var = "EDGEGAP_API_TOKEN"Then set EDGEGAP_API_TOKEN to your token in the environment Codex starts from.
Claude Desktop and claude.ai
Custom connectors in claude.ai and Claude Desktop cannot send an Authorization header, so the hosted endpoint never receives your token from them: the connector shows as connected, but every tool call fails. Use the Local Server instead.
In Claude Desktop, open Settings → Developer → Edit Config and add the local server to claude_desktop_config.json:
{
"mcpServers": {
"edgegap": {
"command": "npx",
"args": ["-y", "@edgegap/mcp"]
}
}
}Leave the token out and you're asked for it on first use. claude.ai in the browser can't run a local server, so it can't use Edgegap MCP until the hosted endpoint supports OAuth.
Cursor
The Cursor button at the top of this page installs it; to do it by hand, add this to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):
{
"mcpServers": {
"edgegap": {
"url": "https://mcp.edgegap.dev/mcp",
"headers": { "Authorization": "token xxxxxxxx-e458-4592-b607-c2c28afd8b62" }
}
}
}VS Code (Copilot agent mode)
The VS Code button at the top of this page installs it; to do it by hand, add this to .vscode/mcp.json (VS Code uses servers, not mcpServers):
{
"servers": {
"edgegap": {
"type": "http",
"url": "https://mcp.edgegap.dev/mcp",
"headers": { "Authorization": "token xxxxxxxx-e458-4592-b607-c2c28afd8b62" }
}
}
}Windsurf
In ~/.codeium/windsurf/mcp_config.json, run the Local Server, which works in every client that starts MCP servers as commands:
{
"mcpServers": {
"edgegap": {
"command": "npx",
"args": ["-y", "@edgegap/mcp"],
"env": { "EDGEGAP_API_TOKEN": "xxxxxxxx-e458-4592-b607-c2c28afd8b62" }
}
}
}mcp.json
Most agentic IDEs also support integration by pasting JSON configuration:
{
"mcpServers": {
"Edgegap": {
"type": "http",
"url": "https://mcp.edgegap.dev/mcp",
"headers": {
"Authorization": "token xxxxxxxx-e458-4592-b607-c2c28afd8b62"
}
}
}
}Custom Integration
Install remote Edgegap MCP server in your agent's virtualized environment (never in your project!):
Node, using the mcp-remote npx package
{
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.edgegap.dev/mcp", "--transport", "http-only"]
}Python, using the mcp-proxy uvx package
{
"command": "uvx",
"args": ["mcp-proxy", "--transport", "streamablehttp", "https://mcp.edgegap.dev/mcp"]
}One-Click Install (Claude Desktop)
Download edgegap-mcp.mcpb and open it: Claude Desktop installs the local server as an extension and asks for your API token, which it keeps in the operating system's secure storage. The extension's settings also hold read-only mode, the application allowlist, the max duration ceiling and the deployment cap (the variables below). Each release attaches the bundle, built from that release's code. Any other app that installs MCPB bundles works the same way.
Local Server
To keep your API token on your own machine, run the server locally instead. Leave the token out and your agent asks you for it on first use, holding it in memory only for that session:
{
"mcpServers": {
"Edgegap": {
"command": "npx",
"args": ["-y", "@edgegap/mcp"],
"env": { "EDGEGAP_API_TOKEN": "xxxxxxxx-e458-4592-b607-c2c28afd8b62" }
}
}
}Needs Node 18+. Pin a version in production (@edgegap/mcp@0.15.7) rather than floating on latest. Registered in the official MCP registry as dev.edgegap/mcp.
The local server can also limit what an agent can do. These variables have no effect on the hosted endpoint at mcp.edgegap.dev:
Variable | Default | Purpose |
| (prompted) | API token. Optional: omit it and you're asked at first use. The |
|
| Set to |
| (empty) | Comma-separated application names. Limits what the agent can create and deploy into. Reading (listing apps and versions) is not limited, and neither is touching deployments once running. See DESIGN.md. |
|
| Ceiling on |
|
|
|
|
| Deploys one server process may send, failed ones included. Restart the server to reset it. |
|
| Set to |
|
| Set to |
|
| Per-request HTTP timeout. |
|
| Set to |
Windows
The local server runs on Windows with Node.js 18 or newer, and CI runs the build and the stdio tests on Windows.
Many Windows MCP clients cannot start
npxdirectly, because it is a.cmdscript. Start it throughcmd /c:"command": "cmd", "args": ["/c", "npx", "-y", "@edgegap/mcp"]. In Claude Code:claude mcp add Edgegap --env EDGEGAP_API_TOKEN=<token> -- cmd /c npx -y @edgegap/mcp.In PowerShell, type
npx.cmdinstead ofnpxto run it by hand: a new Windows install blocks thenpxPowerShell script ("running scripts is disabled on this system").The first start downloads the package and can take a while; later starts are fast.
edgegap_update_skillsfinds skills installed in%USERPROFILE%, the same way as on macOS and Linux.
📚 Skills
The server includes the Edgegap agent skills: tested, step-by-step workflows for getting a multiplayer game online, with templates (Dockerfiles, matchmaker configs, Unity C# and Unreal C++ drop-ins) and known pitfalls. Any agent connected to Edgegap MCP gets them, with no separate install and no token needed, and is told to load the matching skill before working on a game project.
Skill | For |
| Start here for any engine other than Unity or Unreal Engine, or platform questions. Routes to the rest. |
| Unity end to end: server build, matchmaker, client, end-to-end test. |
| Unity with Netcode for GameObjects end to end: server start and self-stop, Find Match panel, Boss Room adapter, matchmaker. |
| Unity with FishNet end to end: headless server, Bayou/WebGL, matchmaker, end-to-end test. |
| Unity with PurrNet end to end: dedicated server, connect panel, matchmaker, end-to-end test. |
| Unity with Photon Fusion 2 end to end: IL2CPP Linux server, server bound to 0.0.0.0, Edgegap deployment, BR200 kit. |
| Photon's Simple FPS sample on Edgegap dedicated servers. |
| Godot 4 with a Godot dedicated server: headless export, ENet or WebSocket, matchmaker. |
| Colyseus servers on Edgegap, direct or through the matchmaker. |
| Nakama as the backend, starting Edgegap servers for its matches. |
| PlayFab Matchmaking with Edgegap servers. |
| Three.js and other browser games with their own Node.js server. |
| Matchmaking design for any engine: who owns it, profiles, parties, region selection, backfill, third-party matchmakers. |
| Browser games built with Manus: backend matchmaking, Steam sign-in, signed join tokens, Node WebSocket server. |
| Unreal Engine end to end: source engine, Linux server, matchmaker, end-to-end test. |
| Voice chat for an Unreal game on Edgegap with EOS Voice: server-side room tokens, match and team rooms. |
| Authoritative server design and the deployment lifecycle. |
| The container contract, Dockerfiles, registries, app versions. |
| Parity tests on your machine, then one smoke-test deployment. |
| Pull errors, crash loops, out-of-memory, clients that can't connect. |
| Backend code that deploys servers: webhooks, cleanup, Nakama, PlayFab, UGS, EOS. |
| Launch checklist, rollouts, caching, cost control. |
They're served three ways, so every MCP client can reach them:
Tools:
edgegap_list_skillsandedgegap_get_skill, which loads a skill'sSKILL.md, or one of its reference documents or templates withfile.Prompts:
deploy-game-server("Deploy my game server to Edgegap") is the place to start: it finds the engine and netcode, loads the matching skill and walks the golden path, cleanup included. There is also one prompt per skill, named after it. In Claude Code they show up as slash commands, e.g./mcp__edgegap__deploy-game-server.Resources: each skill's
SKILL.mdis listed, atedgegap-skill://<skill>/SKILL.md; every other file is read through theedgegap-skill://{skill}/{+path}template, e.g.edgegap-skill://edgegap-unity/references/deploy.md.
Each release bundles the skills at the commit pinned in scripts/skills-pin.txt; edgegap_context reports which pack is loaded. edgegap_list_skills also reads the latest pack version from GitHub (one version number, cached for an hour; EDGEGAP_SKILLS_CHECK=off turns it off) and says when a newer one is out, and edgegap_get_skill adds the same note under a skill's header.
Keeping installed skills current. If you also installed the skills in your agent (the Claude Code plugin edgegap@edgegap, npx skills add edgegap/llm-agent-skills, or folders copied into ~/.claude/skills), edgegap_update_skills compares each one with the latest on GitHub. On the local server it finds those installs itself; with apply: true it runs npx skills update (Edgegap skills only) or claude plugin update, and rewrites hand-copied skills from the files bundled in this release, keeping files you added and leaving symlinks and git checkouts alone. It never downloads skill text. The hosted server cannot see your disk: pass the versions you have loaded in installed_versions and it says which are behind and how to update them.
🧰 Tools
Your agent picks the right tool from your request. You don't need to name them, but knowing what's available helps you ask. Tools marked ● change something in your account, accept dry_run, and are hidden when EDGEGAP_READ_ONLY=1.
Tool | What it does |
| Shows which API this server talks to, its version, local or hosted, and the guardrails in force. No API call; never shows the token. |
Before Your First Deployment
Tool | What it does |
| Writes a Dockerfile for your server build: your build folder, server binary or start script, ports, and launch arguments, with the right headless flags (Unity |
| Checks an existing Dockerfile, ports, resources, and image tag before you build. Catches ARM or Windows images (Edgegap runs |
| Returns push credentials for your private Edgegap container registry, with the exact |
| Confirms your image push landed before you register it. Takes the image name only, e.g. |
| Deletes one tag, and the image it points to, to clean up old builds. One exact tag per call; |
Dedicated Servers (Recommended)
Tool | What it does |
| Lists your applications. |
| Creates an application. |
| Turns an application on or off for new deployments. |
| Lists versions with their image, resources, ports (with TLS Upgrade), and whether a registry login is set. |
| Reads one version in full: image, resources, ports, max duration, image caching, restart policy, and env var names (never values). |
| Registers a container image as a deployable version. Supports TLS Upgrade on WS and HTTP ports, which browser (WebGL) clients need for |
| Changes an existing version: a new image tag, on/off, CPU and memory (both together), max duration, registry login, image caching ( |
| Deletes one version, to clean up test versions. Refused while a deployment of it runs. The registry image is kept. |
| Deletes an application and its versions. Refused while any of its deployments runs, and while it has more versions than |
| Lists the cities Edgegap deploys to, or, for one version, only those with capacity right now. |
| Lists the ping beacons game clients measure their latency to each region against. |
| Deploys an authoritative dedicated server close to your players. Always tagged |
| Lists the hosts of one of your private fleets, with status and location, to deploy onto them. |
| Waits until the server is ready and returns the connection address. |
| Reads a deployment's status. |
| Lists running deployments, filtered by application, version, status, tags and more, and sorted by age. Finds servers left running; |
| Reads container logs and crash details while the deployment runs. After it stops, logs are only kept if Endpoint Storage was set up. |
| Summarises CPU, CPU throttling, memory and network use (latest, average, peak), to size a version or check a crash. |
| Stops one deployment, by its exact request ID. No bulk stop. |
| Adds or removes tags on a running deployment, e.g. to mark a match. The |
| Reports a deployment to Edgegap with a reason, for a studio's moderation backend. It keeps running. |
Logs and Files (Endpoint Storage)
Container logs disappear with the deployment unless they are exported to your own S3-compatible bucket.
Tool | What it does |
| Lists your Endpoint Storage buckets and their pull profiles. Secret keys are never returned. |
| Registers a bucket (AWS S3, Cloudflare R2, DigitalOcean Spaces…) for log export. Set |
| Copies a file or folder from the bucket into the container at boot (maps, configs, large assets). |
| Links a pull profile to a version, or unlinks it. |
| Deletes one pull profile. The bucket and its files stay. |
| Deletes one Endpoint Storage; refused while it has pull profiles unless |
Relays (Host-Client Games Only)
A relay is not a game server: it forwards traffic while one player's game hosts the match. See Dedicated Servers or Relays?.
Tool | What it does |
| Creates a relay session for your players and returns the relay address and each player's authorization token. |
| Reads a relay session. |
| Lists open relay sessions, to find ones left running. No authorization tokens. |
| Adds a player who joins later. |
| Removes one player from a relay session. |
| Closes a relay session. |
Deployments and relay sessions are billed while they run. Ask your agent to stop test deployments and delete test relay sessions when it's done.
Example Prompts
"Write a Dockerfile for my Unity server build, then push it and deploy a server near me."
"Check my Dockerfile for Edgegap and fix any problems."
"My deployment failed. Read the logs and tell me why."
"How much CPU and memory did my last match use? Size my version for it."
"My game uses host-client networking. Set up an Edgegap relay for two players."
🛡️ Guardrails
Your API token can do anything in your organization, so the server adds its own limits around what an agent does with it. They apply in both the local server and the hosted endpoint.
Guardrail | What it does |
Dry run | Every tool that changes something takes |
No token in containers | A deploy or version is refused, with nothing sent, if your API token appears in an env var name or value, a tag, or a webhook URL. Env values are never echoed back. |
Agent tag | Every deployment gets the |
Auto-stop | Every deploy reports when Edgegap will stop it: the version's |
Deploys per run | The local server sends at most |
No moving image tags |
|
Image reference check | A |
Deployment cap |
|
Hidden secret env vars | Env vars whose names look like secrets ( |
Strict stop |
|
Careful deletes |
|
Webhook and bucket URLs | Deploy webhooks and Endpoint Storage endpoints must be |
Host on every result | Every result starts with the API host, e.g. |
Redaction | The token is stripped from every error before it reaches the agent. |
The server identifies itself with User-Agent: edgegap-mcp/<version> (<MCP client name>) on every API call.
Usage analytics. The local server and the self-hosted Docker image send nothing beyond the API calls themselves. The hosted endpoint at mcp.edgegap.dev uses PostHog MCP Analytics (@posthog/mcp) and sends usage events to Edgegap's PostHog: which MCP client connected, which tool, prompt or skill resource was used, the names (not values) of the arguments passed, whether a call succeeded, its error code, the stage it failed at and the Edgegap API status, how long it took, whether it was a dry run, a few facts about the call (how a wait for a deployment ended, a validation result, which skill was loaded), which golden-path step was reached, plus the server version and Cloudflare's country code. On a failed call it also sends the error message, after removing your token, the values of the arguments you passed, and anything shaped like a credential, an IP address or an ID, cut to 300 characters. Deployment IDs are only sent as a keyed hash. Only named metadata properties are let through. It never sends your token, tool argument values (IP addresses, env vars, app or image names) or results, and GeoIP is off. It adds no parameters to the tools. Events from one token are grouped under a keyed, non-reversible hash of it. The full list is in docs/analytics.md. To opt out, send the header X-Edgegap-Telemetry: off (or DNT: 1), or use the local server.
🚨 Troubleshooting
Review common error codes and learn how to unlock your integration.
401 Unauthorized
Your MCP integration is most likely not including the Authorization header correctly.
Tool Call Failed
Your client is missing an Edgegap token. This happens with claude.ai and Claude Desktop custom connectors, which can't send an Authorization header. See Claude Desktop and claude.ai for the alternative.
This is a known limitation which will be resolved in the near term, stay tuned for updates!
403 Forbidden
Your MCP integration is likely using the template token or a deleted token. Please validate that the token value used by your integration matches exactly the token displayed in dashboard.
424 Image Could Not Be Pulled
Edgegap could not pull your container image. Check the repository, image name, and tag, and that the tag was pushed (ask your agent to list registry tags). For images in the Edgegap registry, the image name must include your project, e.g. my-project/my-game-server.
Registry Credentials Unavailable
Edgegap only gives registry credentials to the quick-start token the Unity and Unreal plugins use, so with a regular API token your agent can't retrieve them and asks you instead. Copy the Project, Username and Token from the dashboard under Container Registry, or push to another registry Edgegap can pull from (Docker Hub, GitHub, AWS ECR, GCP, GitLab). See External Registries.
"status": "empty" or "not_configured"
Not an error. A list with nothing in it (no applications yet, no deployments running, an image never pushed) or a feature this organization has not set up (relays, a registry this token cannot read) comes back as a normal result with status and a next_step. Your agent should do the next step instead of retrying.
No Token Yet
The skills (edgegap_list_skills, edgegap_get_skill), edgegap_context, edgegap_generate_dockerfile and edgegap_validate_server_config work without a token, so an agent can prepare the server build first. Create an account at app.edgegap.com and a token under User Settings → Tokens. edgegap_context with check_token: true says whether the session's token is present and accepted, and shows its last four characters so you can find it on that page.
Starts Locally but Not on Edgegap
Ask your agent to validate your server configuration, or to generate a new Dockerfile. The most common causes are an image built on Apple Silicon without docker build --platform linux/amd64, a server listening on a different port than the version exposes, or a UDP transport configured as TCP.
Other API Errors
Please consult our API Reference for possible error responses for individual API endpoints.
If you need help,please reach out to us over Discord. For live games support see our ticketing system.
🛠️ Self-Hosting
The hosted endpoint at mcp.edgegap.dev runs as a Cloudflare Worker (see worker/INSTALL.md). To run the same stateless HTTP server on your own infrastructure, use the Docker image:
docker build -t edgegap-mcp .
docker run --rm -p 8080:8080 edgegap-mcpClients connect to http://<host>:8080/mcp with their own Authorization header, the same way they connect to the hosted endpoint. The image holds no credential, and /health answers without one. PORT, HOST, EDGEGAP_READ_ONLY, EDGEGAP_APP_ALLOWLIST, EDGEGAP_MAX_DURATION_MINUTES, EDGEGAP_MAX_AGENT_DEPLOYMENTS and EDGEGAP_STOP_OWN_ONLY apply; pass each with -e NAME=value. Never pass an API token to the container: each client sends its own on every request. Read worker/DECISION.md before exposing it beyond a private network.
Prebuilt images for linux/amd64 and linux/arm64 are published to ghcr.io/edgegap/llm-mcp-server (and, for existing setups, the old name ghcr.io/edgegap/edgegap-mcp), tagged main and sha-<commit> on every push to main, plus the version on v* tags:
docker run --rm -p 8080:8080 ghcr.io/edgegap/llm-mcp-server:mainDevelopment
See CONTRIBUTING.md for the checks a change has to pass, CHANGELOG.md for what each version changed, and SECURITY.md to report a vulnerability.
npm ci
npm run build
npm test # mock-API tests; none reach Edgegap
npm run typecheck:workerTo update the bundled skills to the latest commit of llm-agent-skills, then release as usual:
npm run sync-skills -- --ref main
npm run check-skills # exit 1 if src/skills.generated.ts differs from the pinTest | Covers |
| Unit tests for the tag, image, secret-name, URL and redaction rules |
| Packaging: one |
| Skills over MCP: tools, prompts, resources, path safety, bundle matches the pin |
| Handshake, tool registration, read-only mode |
| Local validation and allowlist enforcement |
| Token prompt: accept, refuse acknowledgement, decline, no support |
| Validator, Dockerfile generator, registry, deployments, relay and matchmaker tools against a local mock API |
| Self-hosted HTTP server: discovery without a token, per-request tokens, foreign credentials |
| Every endpoint and request-body field the server sends is in |
| Tool names, descriptions, schemas and the instructions match |
| Not in |
Design decisions, the security model, and what's deliberately out of scope are in DESIGN.md.
Available Tools
43 toolsedgegap_authorize_relay_userAdd a player to a relay sessionAIdempotentInspect
Authorize one more player (by public IP) on an existing relay session, for a player joining after the session was created. Returns that player's authorization token.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| user_ip | Yes | Public IP of the joining player. | |
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description usefully adds that a per-player authorization token is returned, but says nothing about what a repeat call for an already-authorized IP does, even though idempotency is asserted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the action and the triggering scenario front-loaded before the return value. Nothing redundant with the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a small three-parameter mutation with annotations present, the description covers the action, the scenario, and the returned token (no output schema exists, so this is needed). Remaining gaps are error/repeat-call behavior against a non-existent or already-authorized player.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
user_ip and dry_run are fully documented in the schema; session_id has no schema description at all. The description partially compensates by stating the session must already exist and the IP is public, but adds no format or constraint detail. This matches a baseline 3 at 67% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (authorize) plus resource (relay session / player) and scope ('one more player... joining after the session was created'). This cleanly separates it from edgegap_create_relay_session, edgegap_get_relay_session, and edgegap_delete_relay_session in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage condition: use it for a player joining after the session already exists, which implies create_relay_session handles players present at creation. It stops short of naming that sibling or stating exclusions such as duplicate authorization of an already-authorized IP.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_build_matchmaker_configBuild a basic matchmaker configurationARead-onlyIdempotentInspect
Generate a ready-to-upload Edgegap matchmaker JSON configuration with one profile: team count and size, optional latency rule, and optional expansions that relax the rules the longer a player waits. Checks the referenced application version exists and has ports. Edgegap has no API for creating a matchmaker, so this tool does NOT create one: save the returned config to a file (e.g. matchmaker-config.json) and have the developer upload it on the Matchmaker page of the dashboard. The matchmaker starts an authoritative dedicated server for each match, which is the recommended setup for multiplayer games.
| Name | Required | Description | Default |
|---|---|---|---|
| inspect | No | Expose the inspection API for debugging. Default true; turn off for production. | |
| version | Yes | Version the matchmaker deploys. | |
| expansions | No | Rule relaxations after a player has waited this long, e.g. [{after_seconds: 20, min_team_size: 1}]. Keep each below ticket_expiration. Not needed for partial matches: min_team_size below max_team_size already allows them. Expansions cost the matchmaker performance, so add one only to relax a rule. | |
| team_count | Yes | Teams per match. 1 for free-for-all or co-op. | |
| application | Yes | Application the matchmaker deploys. | |
| profile_name | Yes | Profile clients will queue into, e.g. "casual-2v2". | |
| max_team_size | Yes | ||
| min_team_size | Yes | ||
| max_latency_ms | No | Adds a latency rule: drop players above this ping to the chosen region. Needs beacon pings from the client. | |
| verify_version | No | Look up the application version first. Default true. | |
| ticket_expiration | No | Default "30s", so a developer testing alone is matched or told to retry within 30 s instead of waiting minutes. Raise it only for production queues. | |
| allowed_cors_origins | No | Origins of web pages allowed to call the matchmaker, e.g. ["https://mygame.example.com", "http://localhost:8080"]. Required when game clients run in a browser (WebGL): browsers block matchmaker calls from any origin not listed. Scheme and host only, no path. | |
| latency_difference_ms | No | Max ping spread between matched players. Default 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the readOnly/idempotent annotations by disclosing that it validates the referenced application version and its ports, that no resource is created server-side, and that a manual dashboard upload is required. The runtime note that each match spins up an authoritative dedicated server is useful context, though the shape of the returned JSON is not described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with what is generated, followed by the manual-upload caveat and a closing rationale. No filler, though the final sentence about dedicated servers is context rather than call-critical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter generator with no output schema, the description covers the essential contract: what it produces, what it verifies, and that creation happens outside the tool. It could go one step further in describing the returned artifact's contents, but the schema fills in the parameter-level detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 85%, so the input schema already carries most parameter meaning (expansions, latency, ticket_expiration, CORS). The description only gestures at the parameter set at a high level (team count/size, optional latency rule, expansions) without adding format or constraint detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and artifact: "Generate a ready-to-upload Edgegap matchmaker JSON configuration with one profile." It immediately lists the scope (team count/size, latency rule, expansions), so an agent knows exactly what this produces and how it differs from the deploy/version siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says what the tool does NOT do and why ("Edgegap has no API for creating a matchmaker, so this tool does NOT create one"), then gives the required next step: save the config and upload via the dashboard. It also tells when to add expansions and when they are unnecessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_contextShow this Edgegap MCP server's configurationARead-onlyIdempotentInspect
Report which Edgegap API this server talks to, its version, whether it is the local or hosted server, and the guardrails in force: read-only mode, application allowlist, max_duration ceiling, the agent deployment cap, the tag forced onto every deployment, and which tools support dry_run. Also says whether this session has a usable token and, if not, why and how to fix it. Call it first when unsure what this session is allowed to do, before anything billable, or when tool calls fail with a token problem. Makes no API call unless check_token is true, and never shows the token.
| Name | Required | Description | Default |
|---|---|---|---|
| check_token | No | Make one read-only API call (list one application) to confirm Edgegap accepts the token. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| server | No | |
| api_host | No | |
| read_only | No | |
| transport | No | |
| guardrails | No | |
| skills_pack | No | |
| api_base_url | No | |
| forced_deploy_tag | No | |
| max_duration_ceiling_minutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint/idempotent, and the description still adds real value beyond them: it discloses the conditional side effect ('makes no API call unless check_token is true') and the security guarantee ('never shows the token'). It also explains that failure paths return the reason and a fix, which is behavioral context the schema cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the primary resource (which API/version/mode), then guardrails, then the token note, then the call conditions. Dense but every clause carries information; the long guardrail list in the first sentence is the only mild bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full annotation coverage, and 100% parameter description coverage, the description supplies everything an agent needs: what it returns conceptually, when to call it, cost implications, and the token non-disclosure guarantee.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already documents the one-read-only-call behavior. The description's 'makes no API call unless check_token is true' reinforces but does not extend the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Report') and enumerates exactly what is reported: API target, version, local vs hosted, guardrails, and token usability. No sibling tool does anything similar, so the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three explicit trigger conditions: 'call it first when unsure what this session is allowed to do', 'before anything billable', and 'when tool calls fail with a token problem'. That is a clear when-to-use rule with concrete situations rather than vague advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_create_appCreate an Edgegap applicationAInspect
Create a new application to hold game server versions. Only call this after edgegap_list_apps confirms no suitable application exists. Creating an application does not deploy anything — follow with edgegap_create_app_version.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Application name, 3-64 chars. Usually the game or project name. | |
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| is_active | No | Whether deployments are allowed. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare openWorldHint, non-idempotent, non-destructive, but say nothing about side effects. The description adds real behavioral value by clarifying that creation 'does not deploy anything' and must be followed by edgegap_create_app_version, preventing a common misunderstanding. It does not cover auth requirements or what happens to the name if it already exists, so it stops short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: the action first, the precondition second, the follow-up step third. No repetition of schema or title content and nothing extraneous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, an agent still learns the logical next call, which partially compensates. The remaining gap is that the description never indicates what is returned (e.g. whether an application ID comes back for use in edgegap_create_app_version), though the chained-tool guidance makes the call sequence unambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter descriptions (name constraints, dry_run semantics, is_active default) are already richer than anything the description offers. The description adds no parameter-level meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a new application') and immediately clarifies what an application is ('to hold game server versions'), distinguishing it from version-creation and deployment siblings. An agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('Only call this after edgegap_list_apps confirms no suitable application exists') naming the alternative tool and the condition that selects it, plus the required follow-up step (edgegap_create_app_version). Both when-to-use and what-comes-next are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_create_app_versionCreate an application versionAInspect
Register a container image as a deployable version of an application. The image must already be pushed to a registry that Edgegap can pull from (see edgegap_get_registry_credentials and edgegap_list_registry_tags). Resource units: 1024 cpu units = 1 vCPU; memory_mb must be at least 256 and at most double the cpu units. Set verify_image true on the first version so a bad image fails here rather than at deploy time. Refused, with nothing sent, for the "latest" or an empty docker tag (use a build ID so deployments are reproducible) and for a docker_image that also holds a registry host or tag. Env vars named like secrets (TOKEN, SECRET, PASSWORD, API_KEY…) are hidden in the dashboard. When copying an existing version, copy only non-secret settings: the API returns "This value is set and encrypted" for its registry login and secret env values, and that placeholder is refused here.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Environment variables injected into the container. Values are never echoed back. | |
| name | Yes | Version identifier, typically a build ID or timestamp. | |
| ports | Yes | Ports to expose. At least one is required for players to connect. | |
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| cpu_units | Yes | vCPU units. 1024 = 1 vCPU. | |
| memory_mb | Yes | Memory in MB. At most 2x cpu_units. | |
| docker_tag | Yes | Image tag: a build ID, commit SHA or timestamp. "latest" and empty tags are refused. | |
| application | Yes | Existing application name. | |
| docker_image | Yes | Namespaced image, e.g. "mystudio/game-server". | |
| verify_image | No | Verify Edgegap can pull the image before accepting the version. | |
| registry_token | No | Registry password or token. | |
| endpoint_storage | No | Endpoint Storage name (edgegap_list_endpoint_storage) to export container logs to when deployments end. | |
| docker_repository | Yes | Registry host, e.g. "docker.io" or "registry.edgegap.com". | |
| registry_username | No | Registry username. Needed for private images, including images in your own registry.edgegap.com project: Edgegap pulls with this login, not your API token. | |
| max_duration_minutes | No | Auto-stop after this many minutes. Keeps test deployments from running up cost. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only covering openWorld/idempotent/destructive, the description adds substantial operational detail: refusals happen 'with nothing sent' for 'latest'/empty tags and malformed docker_image, secret-named env vars are masked in the dashboard, and the 'This value is set and encrypted' placeholder is rejected. That tells the agent exactly what will silently fail before a billable call is made.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then prerequisites, then constraints and refusals — a logical order for a call-plan. It is dense and slightly over-packed in the middle (resource units, verify_image, tag refusal, env masking all in successive clauses), but almost every sentence carries a distinct constraint that isn't duplicated in structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter mutation with 8 required fields, no output schema and no enums, the description covers the prerequisites, the validation rules, the failure modes and the secret-handling caveat. An agent can construct a correct first call and anticipate the main rejections without further reference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds value the schema doesn't: the cpu-unit/memory relationship is restated as a hard constraint, docker_tag must be a build ID for reproducibility, and copying secrets fails on purpose. It does not mention several parameters (env structure, ports, endpoint_storage, max_duration_minutes) beyond the schema's own text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Register a container image as a deployable version of an application.' That is clearly distinct from sibling tools like edgegap_update_app_version, edgegap_get_app_version and edgegap_list_app_versions; an agent knows this is the create path.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing context — 'see edgegap_get_registry_credentials and edgegap_list_registry_tags' for the image prerequisite, and tells the agent when to set verify_image true ('on the first version'). It never states the inverse (don't use this to modify an existing version; use update_app_version), so the exclusion against the closest sibling is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_create_endpoint_storageCreate an Endpoint Storage (S3 bucket for logs)AInspect
Register an S3-compatible bucket (AWS S3, Cloudflare R2, DigitalOcean Spaces, ...) as Endpoint Storage, so container logs are exported there when deployments end. The developer supplies the bucket, endpoint URL and an access key pair scoped to that bucket; never invent or reuse other credentials, and never pass the Edgegap API token. The secret key is sent once and never echoed back. Then set endpoint_storage on the version (edgegap_update_app_version) to turn log export on.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for this storage, e.g. "game-logs". | |
| bucket | Yes | Bucket name. | |
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| endpoint | Yes | https URL of the S3 endpoint, without the bucket, e.g. "https://s3.us-east-1.amazonaws.com". | |
| access_key_id | Yes | Access key ID for the bucket. | |
| output_format | No | Log file format. Default TEXT. | |
| secret_access_key | Yes | Secret access key for the bucket. Never echoed back. | |
| container_log_version | No | v1 (default) writes one file per deployment; v2 streams chunks while it runs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare openWorldHint/idempotentHint/destructiveHint; the description adds genuinely new behavior: the secret key is transmitted once and never echoed back, and credentials must be scoped to the bucket rather than reused. It still doesn't say what the call returns or whether a partial failure leaves registered storage behind.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler, ordered as purpose → credential constraint → next step. The security-critical 'never invent or reuse other credentials' line is placed before the activation instruction, which is where an agent should hit it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers what to supply, what not to supply, and how to activate log export afterwards — enough for an 8-parameter mutation tool with no output schema. The remaining gap is the return value (e.g. a storage ID or name to reference in update_app_version), which the absence of an output schema leaves unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all eight parameters including the enums for output_format and container_log_version. The description only reinforces credential semantics (bucket-scoped key pair) and never touches dry_run, output_format or container_log_version, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Register') and resource (an S3-compatible bucket as Endpoint Storage) and immediately explains the payoff: container logs exported there at deployment end. That scope plus the named provider examples clearly separates it from edgegap_list_endpoint_storage, edgegap_delete_endpoint_storage and edgegap_create_pull_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the operational prerequisites (developer-supplied bucket, endpoint URL, bucket-scoped key pair, never the Edgegap API token) and the follow-up step: set endpoint_storage on the version via edgegap_update_app_version. It doesn't state when not to use this tool, e.g. reuse of existing storage or rotation flow, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_create_pull_profileCreate a pull profile (copy bucket files into containers)AInspect
Create a pull profile under an Endpoint Storage: at boot, Edgegap copies a file or folder from the bucket into the container (maps, configs, large assets kept out of the image). It does nothing until linked to a version with edgegap_link_pull_profile. Avoid destination paths the image already uses.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name for the profile, e.g. "maps". | |
| source | Yes | Path in the bucket, starting with "/" and without a trailing "/", e.g. "/maps" or "/config/server.json". Letters, digits, "_", "-", "+" and "." only. | |
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| destination | Yes | Absolute path in the container, e.g. "/data/maps". | |
| source_type | Yes | Whether source is a file or a folder. | |
| endpoint_storage | Yes | Endpoint Storage name, from edgegap_list_endpoint_storage. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare openWorldHint=true, idempotentHint=false and destructiveHint=false, so the safety profile is already covered. The description adds genuinely non-redundant behavior: the profile is inert until linked, and destination collisions with image paths should be avoided. It stops short of saying what a successful call returns or how duplicate names are handled, which matters for a non-idempotent create.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses, front-loaded with the verb and the mechanism, followed by the lifecycle dependency and the one operational caution. No filler and nothing repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter create with full schema coverage and no output schema, the description covers the two things an agent can't infer structurally: the profile is inert until linked, and destination paths can shadow image content. Only the return value / how to reference the created profile for linking is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (including source path syntax, source_type enum, and dry_run) is already documented at the field level. The description only adds the destination-collision caveat, which is marginal extra meaning. Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Create a pull profile') and immediately explains the mechanism: at boot, files are copied from an Endpoint Storage bucket into the container. The parenthetical use-case examples (maps, configs, large assets kept out of the image) make the concept unmistakable and differentiate it from the storage-creation siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the key prerequisite explicitly: the profile 'does nothing until linked to a version with edgegap_link_pull_profile', which routes the agent to the follow-up tool. It also adds a caution ('Avoid destination paths the image already uses'). What it lacks is guidance relative to edgegap_create_endpoint_storage (must that exist first?) or when to prefer baking files into the image instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_create_relay_sessionCreate a relay session (host-client games only)AInspect
A relay is NOT a game server and is not the recommended default — for a multiplayer match, deploy an authoritative dedicated server with edgegap_deploy instead. A relay only forwards traffic between players while one player's game acts as host and owns the game state: the host can cheat and has a latency advantage, the host's PC and connection cap the match, and the match ends if the host quits. Only use this when the developer has chosen peer-to-peer/host-client, or the netcode is already a listen server and a dedicated server is not an option; if that has not been established, ask first. Never pick it only because it needs no server image. Creates an Edgegap relay session for every player's public IP, host first, waits until it is ready, and returns the relay address plus per-player authorization tokens for the relay transport. Relay sessions are billed while open: delete test sessions with edgegap_delete_relay_session when finished.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| user_ips | Yes | Public IP of each player, host first. Add late joiners with edgegap_authorize_relay_user. | |
| webhook_url | No | Called when the session is ready. | |
| timeout_seconds | No | Default 30. | |
| wait_until_ready | No | Poll until the relay is assigned. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the openWorld/idempotent/destructive profile; the description adds genuinely new behavioral context: relay sessions are billed while open, the call blocks until ready, the host is created first, and it returns the relay address plus per-player authorization tokens. The security caveats (host can cheat, host latency advantage, match dies if host quits) further explain the operational consequences of choosing this path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Efficient in substance — every sentence is decision-relevant — but the action itself is deferred behind two long admonition paragraphs, and the 'not the default' warning is repeated in both the opening and the 'Only use this when' sentence. Slightly wordier than needed, though justified by the misuse risk.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the return value (relay address + per-player tokens) and the async readiness behavior. It also covers billing, cleanup via edgegap_delete_relay_session, and late-joiner handling, so an agent has everything needed to call and manage the session correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents user_ips, webhook_url, timeout_seconds, wait_until_ready, and dry_run. The description reinforces the host-first ordering and mentions per-player tokens but adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Creates an Edgegap relay session') and immediately distinguishes it from the sibling edgegap_deploy by naming the dedicated-server alternative. It also names edgegap_authorize_relay_user and edgegap_delete_relay_session, so an agent can place it precisely in the relay workflow without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('developer has chosen peer-to-peer/host-client', listen-server netcode) and when not ('not the recommended default', 'Never pick it only because it needs no server image'), names the preferred alternative (edgegap_deploy), and adds a fallback instruction to ask first if the netcode hasn't been established.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_delete_appDelete an application and all its versionsADestructiveIdempotentInspect
Delete one application and every version under it, to clean up a test application. Exactly one exact name; refused while any of its deployments is running, and refused when it has more versions than max_versions (default 0: delete its versions first with edgegap_delete_app_version, or raise max_versions after the developer agreed). Registry images are not touched. Cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| application | Yes | The exact application name to delete. | |
| max_versions | No | Delete only if it has at most this many versions. Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint and idempotentHint, and the description adds materially beyond them: irreversibility ('Cannot be undone'), the blast radius (all versions, but registry images untouched), and the two guard conditions that cause failure. This is exactly the context an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Effectively one dense, front-loaded sentence with zero filler, but the parenthetical remedy clause makes it slightly hard to scan. Every clause still carries information, so it is close to optimal despite the density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 3-parameter tool with no output schema, the description covers scope, prerequisites, failure modes, side-effect boundaries, and irreversibility. Nothing an agent needs in order to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes further by explaining the semantics of max_versions (default 0 means refuse if any versions exist, with the two remedies) and stressing that application must be an exact name. dry_run is left to its own schema description, hence not a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (one application plus every version under it) and frames the intent (clean up a test application). It is clearly distinguished from the sibling edgegap_delete_app_version, which is named as the narrower alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions and refusal conditions: refused while any deployment is running, and refused when versions exceed max_versions. It names the alternative tool (edgegap_delete_app_version) and the escalation path (raise max_versions after developer agreement), so the agent knows exactly what to do when blocked.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_delete_app_versionDelete one application versionADestructiveIdempotentInspect
Delete one version of an application, to clean up test versions. Exactly one exact version name; refused while any deployment of that version is running. The container image stays in the registry (edgegap_delete_registry_tag removes it). Cannot be undone, so confirm with the developer when the version is not one this conversation created.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| version | Yes | The exact version name to delete. | |
| application | Yes | Application name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it destructive/idempotent/openWorld, but the description adds real value beyond them: the running-deployment refusal, that the image is retained in the registry, and that the action is irreversible requiring confirmation. These are operational traits not encoded in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and scope, then layers in the refusal condition, alternative, and irreversibility. Every sentence carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description covers safety, refusal behavior, and consequence of deletion thoroughly enough for a destructive single-target operation. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both required parameters and their meanings are already documented. The description's 'Exactly one exact version name' reinforces the version parameter's exactness but adds little beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete one version of an application') and scopes it to a single exact version. It distinguishes itself from siblings by explicitly naming edgegap_delete_registry_tag for the image and implying it differs from delete_app.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the use case ('clean up test versions'), an explicit refusal condition ('refused while any deployment of that version is running'), and routes the agent to the alternative for the container image. Confirmation guidance when the version wasn't created in-conversation adds clear when-to-be-cautious direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_delete_endpoint_storageDelete an Endpoint StorageADestructiveIdempotentInspect
Delete one Endpoint Storage, to clean up a test one. Exactly one exact name; refused when it still has more pull profiles than max_pull_profiles (default 0: delete them first with edgegap_delete_pull_profile, or raise max_pull_profiles after the developer agreed). Versions that export logs to it stop doing so, so confirm with the developer when the storage is not one this conversation created. The bucket and the logs already in it are not touched. Cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| endpoint_storage | Yes | The exact Endpoint Storage name to delete. | |
| max_pull_profiles | No | Delete only if it has at most this many pull profiles, which go with it. Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/idempotent/openWorld, but the description goes further: it discloses the refusal guard, the cascade effect that exporting versions stop exporting, that the bucket and existing logs survive, and that the operation is irreversible. That is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and the primary target, and every sentence carries operational content with no filler. The middle sentences are dense and slightly clause-heavy, which costs a point on readability but not on usefulness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter destructive tool with no output schema, it covers the guard conditions, side effects, irreversibility, escalation path, and the safety valve (dry_run is documented in the schema). Nothing an agent needs before calling is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the name must be an exact single name, and max_pull_profiles carries a coupled semantics (profiles go with the storage; default 0 blocks deletion). It does not spend words repeating dry_run, which the schema already explains well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete one Endpoint Storage') plus the intended scenario ('to clean up a test one'). It also contrasts with edgegap_list_endpoint_storage / create siblings implicitly by being the removal counterpart and names edgegap_delete_pull_profile as a different action, so an agent can place it precisely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the preconditions and the fallback paths: refused when pull profiles exceed max_pull_profiles, then either delete them with edgegap_delete_pull_profile or raise the threshold 'after the developer agreed'. It also says when to confirm with the developer before deleting a storage this conversation did not create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_delete_pull_profileDelete a pull profileADestructiveIdempotentInspect
Delete one pull profile from an Endpoint Storage, to clean up a test profile. Exactly one exact name. Every version linked to it stops getting its files at boot (the API cannot list those links, so ask the developer when the profile is not one this conversation created). The bucket and its files are not touched. Cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| pull_profile | Yes | The exact pull profile name to delete. | |
| endpoint_storage | Yes | Endpoint Storage name, from edgegap_list_endpoint_storage. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the destructiveHint/idempotentHint annotations by disclosing the cascade effect (every linked version stops getting its files at boot), an API blind spot (linked versions cannot be listed), and what is explicitly left intact (the bucket and its files). That is exactly the risk information an agent needs before a destructive call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and scope, then layers consequences and caveats; nearly every clause carries information. The parenthetical about the API's inability to list links is dense but justified. Minor redundancy between "Cannot be undone" and the destructive annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 3-parameter tool with no output schema, the description covers side effects, irreversibility, and a safety precondition, leaving only the response shape unstated. Little else an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented, including the dry_run escape hatch. The description only reinforces that the name is exact and singular ("Exactly one exact name"), which the schema already states, so it adds little beyond baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delete one pull profile from an Endpoint Storage") and implicitly carves itself out from edgegap_delete_endpoint_storage by noting "The bucket and its files are not touched." It does not name sibling tools explicitly, but the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear context ("to clean up a test profile") and a concrete prerequisite caveat: consult the developer when the profile was not created in this conversation, because the API cannot list links. It stops short of naming an alternative tool or a when-not-to-use rule beyond that caveat.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_delete_registry_tagDelete one image tag from the Edgegap registryADestructiveIdempotentInspect
Delete one tag, and the image it points to, from this organization's Edgegap container registry, to clean up old builds. Takes exactly one image name and one exact tag; wildcards, lists and "latest" are refused, and there is no bulk delete. A version that still uses the tag can no longer start deployments, so check edgegap_list_app_versions first. Cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | Yes | The exact tag to delete, e.g. "build-41". | |
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| image_name | Yes | The image name only, e.g. "my-game-server", as for edgegap_list_registry_tags. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint and idempotentHint, but the description adds what is actually destroyed (the tag and its underlying image), that deletion is irreversible, and the downstream consequence that versions pinned to the tag can no longer start deployments. That is substantive context beyond the safety flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
What-it-does and scope lead, followed by input constraints, then the pre-check and irreversibility warning. Four dense sentences with no filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, three-parameter tool with no output schema, the description supplies the consequence of deletion, the rejection rules, and the recommended pre-verification step. Nothing an agent needs to avoid a bad call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes beyond it by constraining values to exactly one image name and one exact tag, rejecting wildcards/lists/"latest". It stops short of documenting dry_run or the naming format, which the schema handles alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Delete one tag, and the image it points to") scoped to this organization's registry, and names the operational goal ("clean up old builds"). Clearly distinguishable from sibling edgegap_list_registry_tags, which the schema even cross-references.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ("check edgegap_list_app_versions first"), enumerates what will be refused (wildcards, lists, "latest", bulk delete), and states the intended use case. An agent knows both when to call it and what inputs will fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_delete_relay_sessionDelete a relay sessionADestructiveIdempotentInspect
Close one relay session. Connected players lose their relay connection. Delete every session you created for testing before ending your task. Takes exactly one session_id; empty IDs, wildcards and lists are refused.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| session_id | Yes | The exact session_id of the one session to delete, e.g. "0724828881e2-S". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint and idempotentHint, but the description adds the human-facing consequence - connected players lose their relay connection - which is not derivable from annotations. It also documents input validation behavior (empty IDs, wildcards and lists refused), useful operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action and its blast radius, then the cleanup rule, then the input constraint. Every sentence carries information; only the imperative cleanup guidance borders on advisory rather than definitional.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema destructive delete, the description supplies impact, scope, validation, and the dry_run escape hatch is documented in the schema itself. Nothing essential is missing, though return/error behavior is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds a real constraint - exactly one session_id, wildcards and lists refused - that tightens interpretation of the single string parameter beyond the schema's per-parameter wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (close/delete) and resource (relay session) with explicit single-item scope, which cleanly separates it from the get_relay_session, create_relay_session, and authorize_relay_user siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use rule (delete every test session you created before ending your task), which is real workflow guidance. It stops short of naming alternatives or stating when-not to use, so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_deployDeploy a game serverAInspect
Start one authoritative dedicated game server from an application version, placed near the players you specify. This is the recommended way to host a multiplayer match: the server owns the game state, so no player hosts it. Returns immediately with a request_id; the server is still starting and has no connection details yet. Follow this call with edgegap_wait_for_deployment to get the address players connect to. Always stop deployments you started for testing. Every deployment is tagged "edgegap-mcp" in addition to any tags you pass, so edgegap_list_deployments with only_agent_deployments: true finds them all. Runs until stopped or until the version's max_duration, which the result reports. Refused, with nothing sent, if the API token appears in an env var or tag, if the version uses the "latest" docker tag, or when too many agent deployments are already running (EDGEGAP_MAX_AGENT_DEPLOYMENTS, default 5): stop finished ones first. Also refused when the version's max_duration is unlimited or above EDGEGAP_MAX_DURATION_MINUTES, unless allow_long_running is true (ask the developer first), and on the local server after EDGEGAP_MAX_DEPLOYS_PER_RUN deploys (default 20). Env vars named like secrets are hidden in the dashboard. Optional: webhooks Edgegap calls when the server is ready, errors or ends (instead of polling), require_cached_locations for faster starts, and private_host_ids to place it on your private fleet first.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Environment variables for this deployment only. Values are never echoed back. | |
| tags | No | Extra tags for filtering later, e.g. ["agent-test"]. "edgegap-mcp" is always added. | |
| users | Yes | Where the players are. Exactly one of these two is required. | |
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| version | Yes | Version name within the application. | |
| cpu_units | No | Override the version's CPU for this deployment only, with memory_mb. 1024 = 1 vCPU. | |
| memory_mb | No | Override the version's memory for this deployment only, with cpu_units. At most 2x cpu_units. | |
| application | Yes | Application name. | |
| private_host_ids | No | Private fleet host IDs to try first, in order (from edgegap_list_fleet_hosts); Edgegap overflows to its cloud when they are full. Omit for a normal cloud deployment. | |
| webhook_on_error | No | https URL Edgegap POSTs to when the deployment fails. | |
| webhook_on_ready | No | https URL Edgegap POSTs to when the server is ready. | |
| allow_long_running | No | Deploy even though the version's max_duration is unlimited or above EDGEGAP_MAX_DURATION_MINUTES. Only after the developer agreed: the server bills until it is stopped or that limit. | |
| webhook_on_terminated | No | https URL Edgegap POSTs to when the deployment ends. | |
| require_cached_locations | No | Only place it where the image is already cached: starts faster, fewer places to choose from. Needs force_cache on the version (edgegap_update_app_version); without it the API refuses the deploy. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | No | |
| status | No | |
| warning | No | |
| auto_stop | No | |
| next_step | No | |
| resources | No | |
| request_id | No | |
| auto_stop_after_minutes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the async return (request_id, no connection details yet), the auto 'edgegap-mcp' tag, lifecycle (runs until stopped or max_duration), billing implications, secret-env-var hiding, and multiple refusal conditions (token in env, 'latest' docker tag, concurrent-deploy caps, max_duration limits, local per-run cap). This is unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and the async/next-step behavior before restrictions. It is dense and long, but for a 14-parameter tool with many guardrails most sentences earn their place; a slight trim of the restriction run-on would help.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so it needn't explain return structure, and the description still covers the immediate return (request_id) and next-step tool. Given complexity, annotations, and schema richness, nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the schema already documents all 14 params, but the description adds real meaning: webhooks as a polling alternative, require_cached_locations for faster starts, private_host_ids placement order, and secret-env-var hiding. It complements rather than repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start one authoritative dedicated game server from an application version') and clarifies placement near specified players. The distinction from hosting-vs-player-hosted is clear, and it is easy to tell apart from relay/session siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames this as 'the recommended way to host a multiplayer match' and directs the next step ('Follow this call with edgegap_wait_for_deployment'). It also adds operational guidance ('Always stop deployments you started for testing') and names the tool that finds these deployments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_generate_dockerfileGenerate a game server DockerfileARead-onlyIdempotentInspect
Write a Dockerfile for this project's headless game server build, ready for Edgegap: linux/amd64 base, the build folder copied in, the binary made executable, the right headless flags (Unity -batchmode -nographics, Godot --headless), a non-root user where the engine needs it (Unreal refuses root), CRLF fixes for start scripts, and EXPOSE lines matching the ports. Call this when the project has no Dockerfile, before building anything. Look at the build output first so you can pass the real build folder, binary name and port; anything you omit is assumed and listed under assumptions, which you must confirm with the developer or the project files. Write the result to Dockerfile, then build. The output is checked against edgegap_validate_server_config before it is returned. Makes no API calls.
| Name | Required | Description | Default |
|---|---|---|---|
| ports | No | Ports the server listens on. Default: 7777, with the protocol the netcode uses (UDP if unknown). | |
| engine | Yes | Game engine of the server build. | |
| netcode | No | Networking transport, to pick the protocol. Known: mirror-kcp, kcp, mirror-telepathy, telepathy, mirror-simpleweb, simpleweb, websocket, fishnet-tugboat, tugboat, netcode-for-gameobjects, ngo, unity-transport, utp, photon-fusion, litenetlib, enet, unreal-netdriver, godot-enet, godot-websocket. | |
| base_image | No | Default "ubuntu:22.04". | |
| build_path | No | Server build folder, relative to where docker build runs. Defaults: unity "Builds/EdgegapServer", unreal "." (run from inside the packaged LinuxServer folder), godot "build". | |
| executable | No | File name of the server binary or start script inside build_path. Defaults: unity "ServerBuild", unreal "StartServer.sh", godot "server.x86_64". Required for "other". | |
| launch_args | No | Extra server arguments, one per entry, e.g. ["-log", "-port=7777"]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/closed-world, but the description adds substantial behavior beyond them: engine-specific quirks (Unreal refuses root, Unity -batchmode -nographics, Godot --headless), CRLF fixing, and the assumption-listing contract for omitted parameters. It also states 'Makes no API calls' and that output is validated before return, which an agent needs to trust the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with verb+artifact before the detail, and every clause is informational rather than filler. The primary sentence is an unusually long run-on list of generated content, which slightly hurts scanability but not correctness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers trigger, prerequisites, assumption handling, downstream validation and the fact that no API is called, which is thorough for a 7-parameter generation tool with no output schema. It does not explicitly state the returned payload shape or overwrite behavior if a Dockerfile already exists, a minor residual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents defaults, enums and ranges for all seven parameters. The description still adds value by explaining the assumption mechanism for omitted values (they are assumed and surfaced for confirmation), which changes how an agent should treat partial input rather than just what the fields mean.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and artifact (write a Dockerfile) for a defined resource (this project's headless game server build) and enumerates concrete content it will produce. It explicitly names a sibling, edgegap_validate_server_config, which the output is checked against, so an agent can place it relative to the rest of the toolset without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger and preconditions: 'Call this when the project has no Dockerfile, before building anything,' plus a preceding step ('Look at the build output first so you can pass the real build folder...'). It also routes the follow-up ('Write the result to Dockerfile, then build') and names the validation sibling, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_get_app_versionGet one application versionARead-onlyInspect
Read one version in full: image, resources, ports, max_duration, whether image caching (force_cache) and verify_image are on, restart policy, the Endpoint Storage its logs go to, and the names of its env vars (values are never shown). Use it before edgegap_update_app_version or edgegap_deploy to check what a version will do.
| Name | Required | Description | Default |
|---|---|---|---|
| version | Yes | Version name, as listed by edgegap_list_app_versions. | |
| application | Yes | Application name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| env | No | |
| name | No | |
| image | No | |
| ports | No | |
| active | No | |
| warning | No | |
| auto_stop | No | |
| cpu_units | No | |
| memory_mb | No | |
| application | No | |
| force_cache | No | |
| verify_image | No | |
| restart_policy | No | |
| caching_percent | No | |
| endpoint_storage | No | |
| max_duration_minutes | No | |
| auto_stop_after_minutes | No | |
| registry_credentials_set | No | |
| termination_grace_period_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and open-world hints, so the description's added value is the disclosure that env var values are never returned — a meaningful safety/redaction detail an agent needs. It also scopes the read ('one version in full'), though it says nothing about rate limits or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The payload contents come first and the usage cue comes second, so the most selection-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the field enumeration is partly redundant, but it usefully doubles as a selection aid. Safety is covered by annotations and the env-var redaction note. Nothing critical is missing, though it could note that this is the only way to inspect a single version's config.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'application' and 'version' documented, including a pointer to edgegap_list_app_versions for valid version names. The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Read one version in full') and then enumerates exactly what is returned: image, resources, ports, max_duration, cache flags, restart policy, Endpoint Storage, env var names. That enumeration distinguishes it cleanly from edgegap_list_app_versions and edgegap_create_app_version without needing the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to reach for it: 'Use it before edgegap_update_app_version or edgegap_deploy to check what a version will do.' That names the downstream siblings and the decision point. It stops short of stating exclusions (e.g., 'use list_app_versions to browse'), so it is a strong 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_get_deploymentGet deployment statusARead-onlyInspect
Read the current status of one deployment, including connection address and ports once it is ready. For a deployment you just created, prefer edgegap_wait_for_deployment — it polls for you instead of making you call this in a loop.
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes | The request_id returned by edgegap_deploy. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fqdn | No | |
| error | No | |
| ports | No | |
| ready | No | |
| status | No | |
| running | No | |
| version | No | |
| location | No | |
| next_step | No | |
| public_ip | No | |
| request_id | No | |
| application | No | |
| error_detail | No | |
| elapsed_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already confirm it is a read-only operation (readOnlyHint: true). The description adds behavioral context by stating that the status is delivered only 'once it is ready' and detailing the data returned (connection address and ports), which enhances transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is highly concise, using two short, impactful sentences. The most crucial information—the operational constraint and the sibling tool recommendation—is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the operational lifecycle of the tool, explaining both what the tool provides (status, ports) and how it should be used in practice (avoid manual loops). Given the high schema coverage, this provides maximum value without redundancy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema coverage is 100%, providing a solid baseline. The description does not add unique semantic meaning to the required 'request_id' beyond its role in retrieving status, but it frames the context of that ID perfectly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description precisely states that the tool reads the 'current status' of a deployment, specifying that it includes connection address and ports. By mentioning 'one deployment,' it defines the scope, and it clearly sets this tool apart from the waiting tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides extremely clear usage guidance by advising against manual polling loops. It explicitly recommends the alternative tool, edgegap_wait_for_deployment, for newly created deployments, effectively directing the agent on the optimal call pattern.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_get_deployment_logsGet container logs for a deploymentARead-onlyInspect
Retrieve stdout/stderr and crash output for a deployment. Call this whenever a deployment errors or a server exits unexpectedly — the crash exit code usually identifies the problem faster than redeploying does. Logs for stopped deployments are only retained if Endpoint Storage was configured on the version beforehand.
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes | The request_id of the deployment. | |
| max_characters | No | Truncate logs to this length (500-50000), keeping the tail. Default 8000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint and openWorldHint annotations already cover the safety profile, and the description adds valuable context about crash output and retention for stopped deployments. It does not contradict the annotations and adds operational insight beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, followed by usage guidance and a retention caveat. Every sentence adds useful information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only log retrieval tool with full schema coverage and annotation safety hints, the description is complete enough. It covers purpose, when to call it, output content, and the stopped-deployment retention caveat.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so request_id and max_characters are already documented. The description adds little parameter-specific meaning beyond saying it retrieves deployment logs, which makes the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: retrieving stdout/stderr and crash output for a deployment. It clearly distinguishes the tool's content from generic deployment lookup siblings, though it does not explicitly name when to use it instead of edgegap_get_deployment or edgegap_get_deployment_metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear trigger: call this whenever a deployment errors or a server exits unexpectedly. The rationale about crash exit codes is useful, but it does not mention explicit alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_get_deployment_metricsGet CPU, memory and network use of a deploymentARead-onlyInspect
Summarise a deployment's resource use over time: CPU, CPU throttling, memory and network, each as latest, average and peak, with the API's own labels. Use it to size a version (cpu_units, memory_mb) from a real match, or to check whether a crash was memory or CPU starvation before redeploying. Defaults to the whole life of the deployment.
| Name | Required | Description | Default |
|---|---|---|---|
| step | No | Averaging step, e.g. "30s" or "5m". Default: the API's. | |
| end_time | No | ISO 8601. Default: now, or when it stopped. | |
| request_id | Yes | The request_id of the deployment. | |
| start_time | No | ISO 8601. Default: when the deployment started. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cpu | No | |
| note | No | |
| memory | No | |
| totals | No | |
| request_id | No | |
| network_receive | No | |
| network_transmit | No | |
| cpu_throttle_rate | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description adds real value by stating the return shape (latest/average/peak with the API's own labels) and the default window (whole life of the deployment). It omits any note on data availability/retention or rate limits, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler: the first front-loads what the response contains, the second gives use cases and the default window. Every clause earns its place and the most decision-relevant information comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and read-only annotations, the description need only frame intent and scope, which it largely does, including the default window and metric shape. It could add one line on when metrics become available for a deployment or on step-size tradeoffs, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so step, start_time, end_time and request_id are already fully documented in the schema. The description only restates the default time window, adding no syntax or format detail beyond what the schema says; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ("Summarise") plus resource ("a deployment's resource use over time") and an enumeration of the exact signals returned: CPU, CPU throttling, memory, network, each as latest/average/peak. This clearly separates it from sibling reads like edgegap_get_deployment, edgegap_get_deployment_logs, and edgegap_wait_for_deployment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete motivating scenarios: sizing a version (cpu_units, memory_mb) from a real match, and diagnosing whether a crash was memory or CPU starvation before redeploying. It stops short of naming the sibling alternative (logs) that would pair with the crash-diagnosis case, so there is no explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_get_registry_credentialsGet Edgegap container registry push credentialsAIdempotentInspect
Get the push login for this organization's private Edgegap container registry (registry.edgegap.com) and the exact docker login, build and push commands for your image. Use this when the server image is not in a registry yet. Edgegap only hands these credentials to the quick-start token the Unity/Unreal plugins use; with a regular API token this tool cannot fetch them and instead returns the steps to copy them from the dashboard's Container Registry page — ask the developer for them then, do not retry. When it does return a token, it is registry-scoped (push/pull images in this project), not the org API token: pass it to docker login via --password-stdin, never as a command-line argument, and do not write it into files. Call edgegap_validate_server_config before building. Any other registry Edgegap can pull from (Docker Hub, GHCR, ECR, GitLab) works too: then skip this tool and pass that registry and its pull login to edgegap_create_app_version.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Unique build tag for the commands, e.g. a build ID. Never "latest". | |
| image_name | No | Image name without project or tag, e.g. "my-game-server". Used to build the commands. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false): discloses that credentials are only available with the quick-start token, that a regular API token returns steps instead and should not be retried, that the returned token is registry-scoped, and how to handle it securely (--password-stdin, not in files).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and immediate usage condition. Every sentence adds actionable context (auth caveat, token handling, validation step, alternative registries) without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (token scoping, conditional availability, security-sensitive handling) and absence of an output schema, the description covers all critical operational details an agent needs to call it correctly and handle the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents 'tag' and 'image_name' fully. The description adds no parameter-specific syntax or meaning beyond what the schema provides; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (push login for the private Edgegap container registry), including the registry domain. Distinguishes from siblings like edgegap_list_registry_tags and edgegap_create_app_version by focusing on credential retrieval for image push.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use: 'Use this when the server image is not in a registry yet.' Also names alternatives and exclusions: if using Docker Hub, GHCR, ECR, or GitLab, skip this tool and pass the registry to edgegap_create_app_version. Guides to call edgegap_validate_server_config before building.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_get_relay_sessionGet a relay sessionARead-onlyInspect
Read one relay session: whether it is ready, the relay address and ports, and each authorized player with their authorization token. edgegap_create_relay_session already waits for readiness; use this to re-read a session or one created with wait_until_ready false.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | Returned by edgegap_create_relay_session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds genuinely useful behavioral context: what data comes back (readiness flag, relay address, ports, per-player authorization tokens). It does not cover auth requirements or rate limits, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler: the first front-loads the return contents, the second handles routing against the sibling tool. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values and does so concretely. Combined with annotations and a fully documented single parameter, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single session_id parameter is documented in the schema as 'Returned by edgegap_create_relay_session.' The description adds no format or syntax detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Read') and resource ('one relay session') and enumerates what the read returns: readiness, relay address and ports, authorized players with tokens. It is clearly distinguishable from edgegap_create_relay_session by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says create already waits for readiness, and directs the agent here to re-read a session or read one created with wait_until_ready false. That is a concrete when-to-use rule with the alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_get_skillLoad an Edgegap agent skillARead-onlyIdempotentInspect
Load one Edgegap agent skill: its SKILL.md (the workflow to follow) by default, or one of its reference documents or templates with file. Load the skill that matches the project before acting (the server instructions and edgegap_list_skills say which; "edgegap" when unsure), then fetch the references and templates it points to as you reach them. No API call.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | A file inside the skill, e.g. "references/deploy.md" or "assets/docker/Dockerfile". Default SKILL.md. | |
| skill | Yes | Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-matchmaking, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-relays, edgegap-server-design, edgegap-threejs, edgegap-troubleshoot, edgegap-unity, edgegap-unreal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and the description reinforces this with "No API call", clarifying that this is a local content fetch rather than a remote Edgegap request. It also discloses the default resolution behavior (SKILL.md when file is omitted) and the incremental-fetch pattern. It stops short of saying what happens with an unknown skill or file name (error vs. empty), which is the one behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool returns, then the selection rule, then the progressive-fetch instruction; no sentence is filler. The nested parenthetical about server instructions and edgegap_list_skills is slightly dense but carries real routing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: the agent knows it receives SKILL.md workflow content or a named reference/template. For a two-parameter read tool this is essentially complete, with only failure-mode behavior left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine selection guidance beyond the field types: which skill to pick, what to do when unsure, and that file is used to reach reference/template documents the SKILL.md points to. That converts the schema's enumerated names into an actionable selection policy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Load one Edgegap agent skill: its SKILL.md ... or one of its reference documents or templates with file" names a specific verb (load), a specific resource (skill file), and the two modes of the call. It is cleanly separable from edgegap_list_skills (enumeration) and edgegap_update_skills (mutation) without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit sequencing: "Load the skill that matches the project before acting", with the selection authority named (server instructions and edgegap_list_skills) and a concrete fallback ("edgegap" when unsure). It also says to fetch references and templates only as you reach them, which tells the agent how to descend the skill tree rather than dumping everything up front.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_link_pull_profileLink or unlink a pull profile and a versionAIdempotentInspect
Link a pull profile to an application version, so its new deployments get the bucket files at boot, or unlink it (unlink: true). Running deployments are not changed.
| Name | Required | Description | Default |
|---|---|---|---|
| unlink | No | true removes the link instead. | |
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| version | Yes | Version name. | |
| application | Yes | Application name. | |
| pull_profile | Yes | Pull profile name. | |
| endpoint_storage | Yes | Endpoint Storage name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds a genuine behavioral trait beyond the annotations: running deployments are unaffected, only new ones pick up the bucket files. This is exactly the kind of side-effect information annotations (idempotent, non-destructive, open-world) cannot convey. It doesn't cover auth requirements or what happens on a duplicate link, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the primary action front-loaded, the inverse operation parenthesized, and the side-effect caveat last. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description covers purpose, the unlink variant, and the deployment-timing behavior, which is what an agent needs to call it correctly. Minor gaps: behavior on an already-linked profile and error modes are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters including `unlink` and `dry_run`. The description restates `unlink: true` but adds no syntax, format, or validation detail beyond the schema, putting it at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (link/unlink) and resource (pull profile ↔ application version) and explains the functional consequence: new deployments get bucket files at boot. No sibling tool performs linking, so it is inherently distinct, though the description doesn't name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains how to trigger the inverse operation via `unlink: true`, which is the main usage branch for this tool. Lacks explicit when-to-use context (e.g. link profiles only after the profile and version both exist), but the operational guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_list_appsList Edgegap applicationsARead-onlyInspect
List the applications in the Edgegap organization. Start here before creating or deploying anything, so you reuse an existing application instead of making a duplicate. An "application" groups versions of one game server.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | Results per page, 1-100. Default 50. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| showing | No | |
| next_step | No | |
| truncated | No | |
| applications | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds the organizational scope (whole org, no filtering) which is useful, but says nothing about pagination behavior or result volume, which matters for a list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then workflow guidance, then a definition. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need no explanation, and the tool is a simple read. The only real gap is pagination/parameter behavior, which lowers it from a 5 for a tool that returns potentially large org-wide lists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: 'limit' is documented, but 'page' has no description anywhere. The description adds no parameter guidance at all—no mention of paging, default page size, or how to iterate results—so it fails to compensate for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (applications in the Edgegap organization), and additionally defines what an 'application' is versus the sibling version tools: 'groups versions of one game server'. An agent can distinguish this from edgegap_list_app_versions without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Start here before creating or deploying anything, so you reuse an existing application instead of making a duplicate' gives a clear precondition and intent, effectively routing the agent away from edgegap_create_app. It stops short of naming the sibling explicitly or saying when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_list_app_versionsList versions of an applicationARead-onlyInspect
List the versions under an application, with their container image, resources, ports (including whether TLS Upgrade is on, which browser/WebGL clients need for wss://) and whether a registry login is set for pulling the image. Use this to find the version name to deploy, to check a version is ready before deploying, or to copy the non-secret settings (image, resources, ports) of a working version when creating a new one. The registry login and secret env values are never readable: the API returns "This value is set and encrypted" for them, so get them from the dashboard's Container Registry page or the developer.
| Name | Required | Description | Default |
|---|---|---|---|
| application | Yes | Application name, as returned by edgegap_list_apps. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| showing | No | |
| versions | No | |
| next_step | No | |
| truncated | No | |
| application | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, and the description adds substantial context beyond them: registry logins and secret env values are never returned, the API substitutes the literal string "This value is set and encrypted", and the agent is told where to get the real values (dashboard Container Registry page or the developer). That is exactly the kind of behavioral caveat that prevents dead-end calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The returned fields and the deploy-readiness workflow are front-loaded, and the secret-redaction caveat follows logically. The WebGL/wss parenthetical about TLS Upgrade is informative but slightly more detail than an agent needs to select the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a single-parameter read tool with an output schema, so return values need no explanation — yet the description still flags which returned fields matter and which are redacted. Nothing needed to call it correctly or interpret the response is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and schema coverage is 100%, with the schema itself noting it is the application name as returned by edgegap_list_apps. The description adds nothing further about the parameter (no format, casing, or lookup caveats), so the schema carries the full load — the baseline 3 for high coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the versions under an application') and enumerates what each entry contains (image, resources, ports, TLS Upgrade flag, registry-login status), which clearly separates it from edgegap_get_app_version's single-version read. It never names the sibling tools explicitly, so the list-vs-get distinction is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives three concrete usage scenarios: finding the version name to deploy, checking a version is ready before deploying, and copying non-secret settings when creating a new version — the last effectively routes to edgegap_create_app_version. No explicit 'don't use this when...' or named alternative (e.g., get_app_version for a single known version) is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_list_deploymentsList running deploymentsARead-onlyInspect
List active deployments, optionally filtered and sorted. Use this to find deployments left running from earlier sessions before starting new ones — orphaned servers cost money. Filter by status, application, version, tags, request_id, created_at, fleet_name or host_name, e.g. [{field:"application",operator:"eq",value:"my-game"},{field:"status",operator:"eq",value:"ready"}]. Operators: eq and neq on every field except created_at (eq, gte, lte); in and nin with an array value on request_id, tags, application, version, fleet_name, host_name; ilike with % wildcards on fleet_name and host_name. At most one filter per field. Sort by created_at or available_session_sockets. To find every deployment an agent started through this server, pass only_agent_deployments: true (the same as filtering tags in ["edgegap-mcp", "mcp"]).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 1-100. Default 50. | |
| filters | No | Omit for all deployments. | |
| order_by | No | e.g. [{field:"created_at",order:"asc"}] for oldest first. | |
| only_agent_deployments | No | Only deployments started through this server: tagged "edgegap-mcp", or "mcp" by versions up to 0.3.3. Cannot be combined with a tags filter. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| showing | No | |
| next_step | No | |
| truncated | No | |
| deployments | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds real behavioral context beyond that: the cost/orphan risk and the equivalence of only_agent_deployments to a tags filter (with a note about versions up to 0.3.3). It could still say more about pagination limits beyond the schema, but this is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and when-to-use are front-loaded, and every sentence carries constraint information. It is dense and the operator rules run long, but little is wasted. Slightly sprawling for a single paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. All four parameters, their interactions, and the usage context are covered adequately. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds substantial meaning the schema does not: which operators apply per field, ilike only on fleet_name/host_name, in/nin requiring array values, created_at restricted to eq/gte/lte, and the one-filter-per-field constraint. This is genuinely additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list active deployments) plus scoping (optionally filtered and sorted). An agent can immediately distinguish this from edgegap_get_deployment (single) and edgegap_deploy (create). The scope is precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the use case: find deployments left running from earlier sessions before starting new ones, warning that orphaned servers cost money. It also gives a targeted mode (only_agent_deployments) for agent-started deployments, effectively directing the agent when to use which variant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_list_endpoint_storageList Endpoint Storage and pull profilesARead-onlyInspect
List the organization's Endpoint Storage: S3-compatible buckets Edgegap exports container logs to when a deployment ends (so logs survive the deployment), and the pull profiles under each, which copy files from the bucket into a container at boot. Secret keys are never returned. A version uses a storage for logs through edgegap_create_app_version / edgegap_update_app_version endpoint_storage, and a pull profile through edgegap_link_pull_profile.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Read-only and open-world behavior are already covered by annotations, and the description adds meaningful context beyond them: it explains what endpoint storage is for, that pull profiles copy files at container boot, and that secret keys are never returned. It does not cover pagination or response shape, but the security and domain behavior disclosure is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then briefly explains the two resource types, security handling, and related tools. Every sentence contributes useful context without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with no output schema, the description provides enough domain context about what is listed, the relationship between buckets and pull profiles, and the security constraint around secret keys. An agent can confidently select and invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter semantics to document and the baseline is 4. The description does not need to compensate for missing schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb, 'List', and precisely defines the two resources returned: Endpoint Storage buckets and the pull profiles under each. It explains the domain concepts well enough that an agent can distinguish this read operation from sibling create/delete/link tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful context by explaining that endpoint storage is attached via edgegap_create_app_version / edgegap_update_app_version and pull profiles via edgegap_link_pull_profile, which helps the agent understand where this listing fits. However, it does not explicitly say when to call this tool versus alternatives, nor does it state exclusions such as 'use this before linking' or 'this does not create resources'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_list_fleet_hostsList the hosts of a private fleetARead-onlyInspect
List the hosts in one of the organization's private fleets (dedicated machines Edgegap manages for you), with status, IP and location. Only ACTIVE hosts accept deployments. Pass their host_id values to edgegap_deploy as private_host_ids to place a server on them first. Organizations without private fleets get an error from the API.
| Name | Required | Description | Default |
|---|---|---|---|
| fleet_name | Yes | The private fleet name, as shown in the dashboard. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds genuinely useful behavior: status filtering semantics ('only ACTIVE hosts accept deployments') and the failure mode for orgs without fleets. It stops short of describing pagination or the shape/ordering of the returned host list, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action, followed by the operational constraint, the downstream call, and the error case. Nothing is repeated and every sentence carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description names the returned fields (status, IP, location), the key filtering concept, the hand-off to edgegap_deploy, and the failure condition. For a single-parameter read tool this is sufficient to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter (fleet_name) and schema coverage is 100%, with the schema already saying it is 'the private fleet name, as shown in the dashboard.' The description refers to 'one of the organization's private fleets' but adds no format, naming convention, or lookup guidance beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (hosts of a private fleet) and immediately clarifies what a private fleet is ('dedicated machines Edgegap manages for you'), plus the fields returned (status, IP, location). No sibling tool covers fleet hosts, so there is no ambiguity to resolve.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says only ACTIVE hosts accept deployments, tells the agent to pass host_id values to edgegap_deploy as private_host_ids, and warns that organizations without private fleets get an API error. That is when-to-use, what-to-do-next, and a when-not condition all in one paragraph.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_list_locationsList where servers can runARead-onlyInspect
List the cities Edgegap can deploy to. Pass application and version to see only the locations with capacity for that version right now. Use it to pick geo_coordinates for edgegap_deploy when you have no player IPs, or to tell a developer where their players can be served from. For the ping beacons game clients use to measure latency, see edgegap_list_ping_beacons.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | Default 100. | |
| version | No | ||
| application | No | With version: only locations with capacity for it now. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| showing | No | |
| messages | No | |
| locations | No | |
| next_step | No | |
| truncated | No | |
| filtered_for | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds one genuinely useful behavioral fact — the filtered result reflects capacity "right now," i.e. volatile data — but says nothing about pagination, result volume, or ordering, which matters for a list endpoint that can span many cities.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then the filtering behavior, then the sibling pointer. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape needn't be explained, and there are no required parameters to warn about. The only real omission is pagination behavior for a potentially long list, which the description never addresses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%; application and version are documented in-schema and the description restates that pairing as a capacity filter, adding a little semantic value. page and limit get no mention in the description, and with the schema silent on page, half the parameter surface is explained in neither place.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — "List the cities Edgegap can deploy to" — and immediately clarifies that passing application+version narrows the result to locations with current capacity. It also explicitly separates itself from edgegap_list_ping_beacons, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use conditions: pick geo_coordinates for edgegap_deploy when no player IPs are available, or report to a developer where players can be served from. It names the alternative tool (edgegap_list_ping_beacons) for the latency-beacon case, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_list_ping_beaconsList ping beaconsARead-onlyInspect
List Edgegap's ping beacons: one host per region that a game client can ping (UDP or TCP) to measure its latency before matchmaking. The matchmaker's latency rules use these measurements. Read-only; the game client does the pinging, not this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | Default 100. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| beacons | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, yet the description adds a genuinely useful clarification that this tool does not perform pings, so agents will not expect latency data back. It does not cover pagination behavior, which is the remaining behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses in one sentence plus a front-loaded scoping sentence; the core definition comes first and the read-only caveat last. Nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Safety is covered by annotations, return shape by the output schema, and the remaining ambiguity about what the tool actually does versus what the client does is resolved explicitly. Complete for a two-parameter list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description says nothing about the page or limit parameters. At 50% schema coverage, only 'limit' carries a schema note, so the description neither compensates nor worsens the gap; these are standard, self-explanatory pagination fields, which keeps this at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list ping beacons) and then defines the resource itself: one host per region that a game client pings over UDP or TCP to measure latency. No sibling tool covers latency beacons, so the definition alone lets an agent place it correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes the usage context clearly: these measurements feed the matchmaker's latency rules and are taken before matchmaking. There are no explicit exclusions or named alternatives, but none of the sibling tools overlaps with this one, so the missing exclusion is low risk.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_list_registry_tagsList image tags in the Edgegap registryARead-onlyInspect
List the tags pushed for one image in this organization's Edgegap container registry, with push time and size. Call it after docker push to confirm the tag landed before edgegap_create_app_version, which otherwise fails later with an image-pull error. An image that was never pushed comes back as status "not_found" with no tags, not as an error. Only for registry.edgegap.com: images in Docker Hub, GHCR or another registry are not listed here.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | 1-100. Default 20. | |
| image_name | Yes | The image name only, without the project, registry host or tag, e.g. "my-game-server". The API reads the project from your token; "<project>/my-game-server" is not found. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| tags | No | |
| total | No | |
| showing | No | |
| next_step | No | |
| truncated | No | |
| image_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds the non-obvious disclosure that a never-pushed image returns status "not_found" with no tags rather than an error, plus the downstream failure it prevents. It does not touch auth requirements, rate limits, or pagination behavior, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with the purpose front-loaded, followed by the workflow reason, the edge-case return, and the scope limit. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers purpose, trigger, and the not_found edge case. Only minor gaps remain, chiefly the undescribed 'page' parameter and no note on how many tags a typical response yields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and image_name already has a rich schema description (name only, no project/registry host/tag, project read from token), so the description mostly restates rather than extends it. The undocumented 'page' parameter is not addressed, and nothing is said about how limit/paging interact with large tag lists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource + scope: lists tags pushed for one image in this organization's Edgegap registry, and states what is returned (push time and size). It is clearly distinguishable from siblings edgegap_delete_registry_tag and edgegap_get_registry_credentials.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call it (after docker push, before edgegap_create_app_version) and why, and names the exclusion: images in Docker Hub, GHCR or other registries are not listed here. An agent knows both the trigger and the boundary without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_list_relay_sessionsList relay sessionsARead-onlyInspect
List this organization's active relay sessions: id, status, readiness and player count. Relay sessions bill while open, so use this to find ones left over from earlier sessions and delete them with edgegap_delete_relay_session. Authorization tokens are not listed; read one session with edgegap_get_relay_session.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| showing | No | |
| sessions | No | |
| next_step | No | |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds genuinely new behavioral context: relay sessions bill while open, so this listing has a cost-control purpose. It also discloses a coverage limit — authorization tokens are not listed — which an agent would otherwise wrongly assume.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler: the summary, the cost-driven motivation with the next action, and the limitation with the alternative. The most actionable information (what is returned) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Zero parameters, an output schema that covers the return shape, and annotations covering the safety profile mean the description only needs to supply motivation, follow-up, and limitations — all of which it does. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. The description uses that space to describe the listed fields instead, which the output schema already covers, so no credit above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List this organization's active relay sessions") and even names the fields surfaced (id, status, readiness, player count), so what it returns is unambiguous. It is clearly distinguishable from the sibling edgegap_get_relay_session, which it explicitly routes single-session reads to.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case (find leftover sessions from earlier runs because sessions bill while open) and names the follow-up action with edgegap_delete_relay_session, plus the alternative edgegap_get_relay_session for reading one session. When-to-use, what-to-do-next, and the alternative are all spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_list_skillsList the Edgegap agent skillsARead-onlyIdempotentInspect
List the Edgegap agent skills: tested, step-by-step workflows for getting a multiplayer game online on Edgegap, with templates (Dockerfiles, matchmaker configs, Unity C# and Unreal C++ drop-ins) and known pitfalls. Each entry says which engine, netcode or backend it is for, and the server instructions map projects to skills. Before working on a game project, load the matching skill with edgegap_get_skill; "edgegap" covers any other engine and routes to the rest. Also says whether a newer skills pack is on GitHub (reads one version number, no Edgegap API call).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, but the description adds meaningful detail beyond them: it discloses that the GitHub version check 'reads one version number, no Edgegap API call', which clarifies the openWorld behavior and reassures the agent no Edgegap-side side effects occur. It stops short of describing ordering or result size, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the purpose and followed by the routing guidance and the version-check note. Dense with useful detail, though the final parenthetical about GitHub is slightly tacked-on rather than integrated into the flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does it: it explains that each entry states engine/netcode/backend, and that server instructions map projects to skills. Nothing an agent needs in order to decide to call it and interpret the result is missing, though the shape of the GitHub version-check result is only lightly described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description adds no parameter information because none is needed, and the empty schema is fully consistent with the described behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List the Edgegap agent skills') and immediately defines what a skill is (tested step-by-step workflows with templates and pitfalls). It also explicitly contrasts itself with the sibling edgegap_get_skill, which loads a single skill, so an agent can choose between them without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Before working on a game project, load the matching skill with edgegap_get_skill') and names the fallback ('edgegap' covers any other engine and routes to the rest). It also flags the secondary purpose of reporting whether a newer skills pack exists on GitHub, so the agent knows both reasons to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_report_deploymentReport a deployment to EdgegapAInspect
Report a problem with one deployment to Edgegap (the API's "Report a Deployment", meant for a studio's moderation backend), with a short reason and optional key/value details. It does not stop the deployment. Use it only when the developer asks to report a deployment; for a crash, read edgegap_get_deployment_logs first.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why it is reported, 1-255 characters. | |
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| metadata | No | Extra key/value details, e.g. {"match_id": "m-42"}. | |
| request_id | Yes | The exact request_id of the deployment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and non-idempotency, but the description adds real value beyond them: it clarifies that the report is a side-channel moderation signal to a studio's backend and that the deployment keeps running. It stops short of saying what the call returns or whether a report can be withdrawn, so it is strong but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: purpose, non-effect, and usage routing, with the routing constraint front-loaded where the agent needs it. No repetition of schema content and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter write-adjacent tool with no output schema, the description covers purpose, side effects, and sibling routing, which is most of what an agent needs. It leaves the response shape and any rate limiting unstated, a modest gap given annotations already cover the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents reason, metadata, request_id and dry_run fully. The description adds only framing ('short reason and optional key/value details') and says nothing about the dry_run escape hatch, so it neither compensates nor needs to. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Report a problem with one deployment'), names the underlying API endpoint, and explicitly delimits it against what it is not ('does not stop the deployment'). An agent can distinguish it from edgegap_stop_deployment and edgegap_get_deployment_logs without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use rule ('only when the developer asks to report a deployment') and names an alternative with its trigger condition ('for a crash, read edgegap_get_deployment_logs first'). Both the positive case and the exclusion are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_revoke_relay_userRemove a player from a relay sessionADestructiveIdempotentInspect
Revoke one player's access to a relay session, by that player's authorization token (from edgegap_get_relay_session or edgegap_authorize_relay_user). The player loses the relay connection; the session and the other players stay.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| session_id | Yes | The relay session_id, e.g. "0724828881e2-S". | |
| user_authorization_token | Yes | The player's authorization token, not the session's. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true, so the safety profile is largely covered. The description adds real context beyond that: the blast radius is scoped to a single player and the session plus other players survive, which prevents an agent from overestimating the destruction implied by destructiveHint. It does not cover auth requirements or behavior on an already-revoked/expired token.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The action and scope come first, and the 'session and other players stay' clause is a compact, high-value carve-out rather than preamble.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with annotations and no output schema, the description is nearly sufficient: it gives action, token provenance, and effect. Remaining gaps are minor — no statement about return value or failure modes such as an unknown/expired token.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description goes beyond the schema by identifying where user_authorization_token comes from (get_relay_session or authorize_relay_user) and reinforcing that it belongs to the player, not the session — useful provenance the schema does not supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Revoke one player's access to a relay session.' It makes the granularity explicit (one player, not the whole session), which separates it from edgegap_delete_relay_session and edgegap_authorize_relay_user in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the token source tools (edgegap_get_relay_session, edgegap_authorize_relay_user) and clarifies the effect: 'the session and the other players stay,' implicitly distinguishing this from tearing down a session. It stops short of stating explicit when-not conditions or edge cases (e.g. revoking the last player).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_stop_deploymentStop a deploymentADestructiveIdempotentInspect
Gracefully stop one deployment by request_id, sending SIGTERM to the container. Stop every deployment you started for testing before ending your task. This tool stops exactly one deployment, named by its exact request_id: empty IDs, wildcards and lists are refused, and bulk stop is deliberately not exposed.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| request_id | Yes | The exact request_id of the one deployment to stop, e.g. "61b1be8f54d9". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint, idempotentHint and openWorldHint, so safety is covered. The description adds real value beyond them: the SIGTERM graceful-shutdown semantics and the refusal of empty IDs, wildcards, and lists, which the annotations do not express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and mechanism. The 'exactly one deployment' point is stated twice, a minor redundancy, but every sentence otherwise earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive two-parameter tool with no output schema, the description covers mechanism, scope constraints, and workflow guidance. Return-value behavior is unspecified, but that is a minor gap given the annotations carry the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning: request_id must be an exact, non-empty single ID and wildcards/lists are rejected. This sharpens usage beyond the schema's example value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('stop one deployment by request_id') and constrains scope to exactly one deployment. It is clearly distinguishable from siblings like get_deployment, list_deployments, and deploy, and even notes the SIGTERM mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives actionable workflow context ('Stop every deployment you started for testing before ending your task') and explicitly rules out bulk stops. It doesn't name alternative tools, but the when-to-use guidance is clear enough to drive correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_tag_deploymentAdd or remove tags on a running deploymentAIdempotentInspect
Add tags to, or remove tags from, one running deployment, e.g. to mark the match it serves or that a test is done, so edgegap_list_deployments can filter on them. Tags are labels only: the game server does not see the change. The "edgegap-mcp" tag cannot be removed, since it is how agent deployments are found and cleaned up. Returns the tags now on the deployment.
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | Tags to add, at most 40 characters each. | |
| remove | No | Tags to remove. | |
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| request_id | Yes | The exact request_id of the deployment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: tags are labels only and invisible to the game server, and the 'edgegap-mcp' tag is protected because cleanup depends on it. Also discloses the return value (current tags), which the annotations cannot.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action and resource, followed by intent, then caveats, then return value. Nothing is redundant with the schema text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description explicitly states the return value (the tags now on the deployment). Combined with annotation coverage and full schema descriptions, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents request_id, add, remove and dry_run in detail. The description still contributes value by framing the deployment as 'one running deployment' and by flagging the protected tag that constrains valid values for the remove parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States specific verbs (add/remove) plus the exact resource (tags on one running deployment) and gives concrete intent examples (mark the match served, mark a test done). Clearly distinct from siblings like edgegap_get_deployment or edgegap_list_registry_tags.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage contexts — labeling a match or test — and names the downstream consumer, edgegap_list_deployments, that makes tagging worthwhile. It lacks an explicit 'do not use this for X' exclusion, but the positive routing is clear enough for an agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_update_appTurn an application on or offAIdempotentInspect
Set whether an application accepts new deployments. Turning it off stops new deployments of every version under it; running deployments keep running. Use it to pause an application without deleting anything.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| is_active | Yes | false blocks new deployments; true allows them again. | |
| application | Yes | Application name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent, non-destructive, open-world, but they cannot express effect scope. The description supplies exactly that: turning off blocks new deployments of every version under the application while running deployments keep running, and nothing is deleted. That is the key behavioral fact an agent needs before flipping the flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then the blast radius, then the use case. No filler and no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-flag toggle with full schema coverage, annotations, and no output schema, this covers what an agent needs. The only omission is the dry_run verification path, which the schema already explains, so the gap is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and is_active is already documented as 'false blocks new deployments; true allows them again', which the description largely restates. The dry_run parameter is fully documented in the schema but unmentioned here, so the description adds little beyond structured fields. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (set whether an application accepts new deployments) on a specific resource (application), not the version or deployment level. That scoping distinguishes it from edgegap_update_app_version and the deployment siblings without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use it to pause an application without deleting anything" gives a clear use case and implicitly rules out deletion as the path to stopping deployments. It stops short of naming an explicit alternative or when-not-to-use case, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_update_app_versionUpdate an application versionAIdempotentInspect
Change settings on an existing version instead of creating a new one: point it at a new image tag, turn it on or off, change max_duration, set the registry login, turn on image caching (force_cache: Edgegap pre-loads the image so deployments start faster), or set the shutdown grace period. Only the fields you pass change. Deployments already running keep their old settings; new deployments get the new ones. Same refusals as edgegap_create_app_version: "latest" or empty tags, a docker_image holding a host or tag, and the API token in the registry login or env vars. ports and env REPLACE the version's whole list (per the API): read the current ones with edgegap_get_app_version and pass every port or variable to keep; secret env values are not readable, so get them from the developer. Refused, with nothing sent, for a registry login or env value equal to the API's "This value is set and encrypted" placeholder; leave the registry login out to keep it. cpu_units and memory_mb change together (both or neither); to try other resources for one deployment only, override them in edgegap_deploy instead.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | REPLACES every env var on the version; [] removes them all. Values are never echoed back. | |
| ports | No | REPLACES every port on the version. Include the ports to keep, not only new ones. | |
| dry_run | No | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. | |
| version | Yes | Version name to change. | |
| cpu_units | No | New vCPU units for later deployments, with memory_mb. 1024 = 1 vCPU. | |
| is_active | No | false blocks new deployments of this version. | |
| memory_mb | No | New memory in MB for later deployments, with cpu_units. At most 2x cpu_units. | |
| docker_tag | No | New image tag: a build ID, commit SHA or timestamp. | |
| application | Yes | Application name. | |
| force_cache | No | Pre-load the image on Edgegap so deployments start faster. | |
| docker_image | No | Image path, e.g. "my-org-abc123/my-game-server". | |
| verify_image | No | Check Edgegap can pull the image when saving. | |
| registry_token | No | Registry password or token. Never echoed back. | |
| endpoint_storage | No | Endpoint Storage name (edgegap_list_endpoint_storage) to export container logs to when deployments end. | |
| docker_repository | No | Registry host, e.g. "registry.edgegap.com". | |
| registry_username | No | ||
| max_duration_minutes | No | Auto-stop after this many minutes. Capped by EDGEGAP_MAX_DURATION_MINUTES. | |
| termination_grace_period_seconds | No | Seconds between SIGTERM and SIGKILL when a deployment stops. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, reducing the burden. The description adds real behavioral context (partial-update merge semantics, running vs new deployments, refusals, secret values not readable), but the ports/env whole-list replacement is arguably a destruct-on-unpassed-value behavior that sits in tension with destructiveHint=false — the description discloses it, so it's guidance rather than a contradiction, though it warrants caution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and keeps sentences dense with actionable detail. It is long and slightly sprawling, but nearly every clause carries operational value (replacement rules, refusals, coupling constraints), so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter mutation with no output schema, the description covers merge semantics, refusals, destructive list-replacement, secret-handling, and parameter coupling — everything an agent needs to call it safely without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 94% so the schema already documents most params. The description still adds cross-parameter meaning the schema cannot: cpu_units and memory_mb must change together, ports/env replace the entire list, and the registry-login placeholder must be omitted to preserve it. This genuinely supplements structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Change settings on an existing version') and immediately frames it against creating a new one. Enumerates the concrete editable settings (image tag, active flag, max_duration, registry login, force_cache, grace period) so an agent distinguishes it from edgegap_create_app_version and edgegap_get_app_version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it (change an existing version rather than create), names alternatives (edgegap_create_app_version for the same refusals, edgegap_get_app_version to read current ports/env, edgegap_deploy to override resources for one deployment). Covers when-not and points to sibling tools for adjacent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_update_skillsCheck and update the installed Edgegap skillsAIdempotentInspect
Check whether the Edgegap agent skills installed in the developer's agent are the latest, and update them. Finds installs made with the skills CLI (user-wide or this project), the Claude Code plugin edgegap@edgegap, and skills copied by hand into an agent's skills folder, and compares each skill with the latest on GitHub. Without apply it only checks and changes nothing. With apply=true it rewrites hand-copied skills from the files bundled in this server, and runs each outdated install's own updater (npx skills@1.7.4 update for the Edgegap skills only, or claude plugin update) only when the operator started the server with EDGEGAP_ENABLE_SKILLS_UPDATE=1; otherwise it lists those commands for the developer to run. Ask the developer before applying. Skill text is never downloaded by this tool. The skills served by edgegap_get_skill need no update here.
| Name | Required | Description | Default |
|---|---|---|---|
| apply | No | Run the updates for outdated installs. Omit or false to only check. | |
| installed_versions | No | Skill name → version of skills you have loaded from somewhere this server cannot see, e.g. {"edgegap-unity": "0.1.8"}. The version is metadata.version in the SKILL.md frontmatter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses exactly what apply mutates (hand-copied skill files from bundled sources), which external commands may be run and under what gate, and that commands are merely listed when the env flag is off. It also states a negative safety fact: skill text is never downloaded by this tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb and the apply/no-apply split, then details. The middle sentences are dense and clause-heavy (nested parenthetical about npx/claude commands), but every sentence carries operational information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description says what the check produces (comparison of each skill with latest on GitHub) and what the apply branch does in both gated and ungated states. For a 2-parameter, 0-required tool that is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, and the description adds real meaning on top: apply=true implies file rewriting and updater execution rather than a passive refresh. The installed_versions semantics beyond the schema (hidden installs) are echoed from the schema but the interaction with the check is clarified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (check/update installed Edgegap agent skills) and enumerates the install kinds it covers (skills CLI, Claude Code plugin, hand-copied folders). It also carves itself away from siblings: 'The skills served by edgegap_get_skill need no update here.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when/when-not: 'Without apply it only checks and changes nothing,' 'With apply=true it rewrites...', 'Ask the developer before applying.' It also names the operator precondition (EDGEGAP_ENABLE_SKILLS_UPDATE=1) that changes what actually happens.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_validate_server_configValidate a game server Dockerfile and port configARead-onlyIdempotentInspect
Check a game server Dockerfile and the ports/resources you intend to register against what Edgegap requires, BEFORE building and pushing. Catches the failures that otherwise only show up after a build, push, version and deploy: ARM or Windows images (Edgegap runs linux/amd64), Unreal running as root, missing Unity -batchmode -nographics, a server bound to localhost, EXPOSE ports that do not match the version ports, a protocol that does not match the netcode transport, the "latest" tag, and bad CPU/memory ratios. Pass the Dockerfile text (read it from disk first). If there is no Dockerfile yet, call edgegap_generate_dockerfile instead. Makes no API calls.
| Name | Required | Description | Default |
|---|---|---|---|
| ports | No | Ports you plan to pass to edgegap_create_app_version. | |
| engine | No | Game engine. Detected from the Dockerfile when omitted. | |
| netcode | No | Networking transport, to check the port protocol. Known: mirror-kcp, kcp, mirror-telepathy, telepathy, mirror-simpleweb, simpleweb, websocket, fishnet-tugboat, tugboat, netcode-for-gameobjects, ngo, unity-transport, utp, photon-fusion, litenetlib, enet, unreal-netdriver, godot-enet, godot-websocket. | |
| cpu_units | No | ||
| memory_mb | No | ||
| docker_tag | No | ||
| dockerfile | No | Full text of the Dockerfile. | |
| docker_image | No | ||
| docker_repository | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| engine | No | |
| errors | No | |
| verdict | No | |
| warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, openWorldHint=false and idempotentHint=true, and the description reinforces this with 'Makes no API calls', so an agent knows it is a pure local check. Beyond that it enumerates the actual failure classes detected (ARM/Windows images, root Unreal, missing -batchmode -nographics, localhost binding, EXPOSE/port mismatch, protocol vs netcode mismatch, 'latest' tag, bad CPU/memory ratios), which is real behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The pre-build purpose and the sibling deferral are front-loaded, and the failure list is dense but each item is a concrete check. The long mid-sentence enumeration is information-dense rather than padded, though it could be bulleted for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter validation tool with an output schema and rich annotations, the description covers timing, alternative routing, side-effect profile and the check catalog. The only real omission is what docker_image/docker_repository contribute to validation, which an agent would have to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 44%, so the description must compensate, and it does for several key inputs: it tells the agent to read the Dockerfile from disk and pass the full text, and it ties ports, protocol and CPU/memory to concrete validations (EXPOSE mismatch, netcode transport, ratios, 'latest' tag → docker_tag). docker_image and docker_repository remain unexplained in both places, keeping this short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (check/validate) applied to a specific resource pair (Dockerfile text plus the ports/resources to be registered), and frames the timing relative to build/push/deploy. It is clearly distinguishable from the sibling edgegap_generate_dockerfile, which it names and defers to.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when: run BEFORE building and pushing, because the failures otherwise surface only after build/push/version/deploy. Gives an explicit alternative and its selecting condition: 'If there is no Dockerfile yet, call edgegap_generate_dockerfile instead.' Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edgegap_wait_for_deploymentWait for a deployment to become readyARead-onlyIdempotentInspect
Poll a deployment until it is ready, errors, or the timeout expires, then return the connection details. This is the tool to call right after edgegap_deploy. Do not build your own polling loop — this handles backoff and reports the container error detail if the server fails to start.
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes | The request_id returned by edgegap_deploy. | |
| timeout_seconds | No | How long to wait before giving up, 5-600. Default 180. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fqdn | No | |
| error | No | |
| ports | No | |
| ready | No | |
| status | No | |
| running | No | |
| version | No | |
| location | No | |
| next_step | No | |
| public_ip | No | |
| request_id | No | |
| application | No | |
| error_detail | No | |
| waited_seconds | No | |
| elapsed_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint and idempotentHint, so the description adds value by disclosing backoff handling, the three termination paths, and that container error detail is surfaced on failure start. It still doesn't say the call blocks for up to the timeout (a long-polling trait) or what connection details contain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and termination behavior, then the sequencing guidance, then the anti-pattern warning. No filler and nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. The description covers the lifecycle position (after deploy), failure reporting, wait bounds, and backoff, leaving nothing an agent needs before invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both request_id and timeout_seconds documented in-schema including the 5-600 range and default. The description adds no parameter-level meaning beyond that, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (poll), resource (a deployment), termination conditions (ready, errors, timeout), and the return value (connection details). It is clearly distinguishable from the one-shot status siblings like edgegap_get_deployment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call it right after edgegap_deploy and warns against building a custom polling loop, which is a real when-to-use signal with an implied alternative. It stops short of contrasting with edgegap_get_deployment or edgegap_get_deployment_logs for one-off status checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.15.7- Changed
edgegap_get_skill1 field changed- changed
Input schema / properties / skill / descriptionPrevious value: -"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-matchmaking, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-server-design, edgegap-threejs, edgegap-troubleshoot, edgegap-unity, edgegap-unreal."New value: +"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-matchmaking, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-relays, edgegap-server-design, edgegap-threejs, edgegap-troubleshoot, edgegap-unity, edgegap-unreal."
15 tool updates
v0.15.1- Changed
edgegap_create_app_version1 field changed- added
Input schema / properties / endpoint_storageAdded value: +{ + "description": "Endpoint Storage name (edgegap_list_endpoint_storage) to export container logs to when deployments end.", + "minLength": 1, + "type": "string" +}
- Added
edgegap_create_endpoint_storage - Added
edgegap_create_pull_profile - Added
edgegap_delete_app - Added
edgegap_delete_app_version - Added
edgegap_delete_endpoint_storage - Added
edgegap_delete_pull_profile - Changed
edgegap_deploy6 fields changed- added
Input schema / properties / allow_long_runningAdded value: +{ + "description": "Deploy even though the version's max_duration is unlimited or above EDGEGAP_MAX_DURATION_MINUTES. Only after the developer agreed: the server bills until it is stopped or that limit.", + "type": "boolean" +} - added
Input schema / properties / private_host_idsAdded value: +{ + "description": "Private fleet host IDs to try first, in order (from edgegap_list_fleet_hosts); Edgegap overflows to its cloud when they are full. Omit for a normal cloud deployment.", + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / require_cached_locationsAdded value: +{ + "description": "Only place it where the image is already cached: starts faster, fewer places to choose from. Needs force_cache on the version (edgegap_update_app_version); without it the API refuses the deploy.", + "type": "boolean" +} - added
Input schema / properties / webhook_on_errorAdded value: +{ + "description": "https URL Edgegap POSTs to when the deployment fails.", + "type": "string" +} - added
Input schema / properties / webhook_on_readyAdded value: +{ + "description": "https URL Edgegap POSTs to when the server is ready.", + "type": "string" +} - added
Input schema / properties / webhook_on_terminatedAdded value: +{ + "description": "https URL Edgegap POSTs to when the deployment ends.", + "type": "string" +}
- Changed
edgegap_get_app_version1 field changed- added
Output schema / properties / endpoint_storageAdded value: +{ + "type": "string" +}
- Added
edgegap_link_pull_profile - Added
edgegap_list_endpoint_storage - Added
edgegap_list_fleet_hosts - Added
edgegap_report_deployment - Added
edgegap_tag_deployment - Changed
edgegap_update_app_version3 fields changed- added
Input schema / properties / cpu_unitsAdded value: +{ + "description": "New vCPU units for later deployments, with memory_mb. 1024 = 1 vCPU.", + "maximum": 9007199254740991, + "minimum": 256, + "type": "integer" +} - added
Input schema / properties / endpoint_storageAdded value: +{ + "description": "Endpoint Storage name (edgegap_list_endpoint_storage) to export container logs to when deployments end.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / memory_mbAdded value: +{ + "description": "New memory in MB for later deployments, with cpu_units. At most 2x cpu_units.", + "maximum": 9007199254740991, + "minimum": 256, + "type": "integer" +}
1 tool update
v0.13.3- Changed
edgegap_build_matchmaker_config1 field changed- changed
Input schema / properties / expansions / descriptionPrevious value: -"Rule relaxations after a player has waited this long, e.g. [{after_seconds: 20, min_team_size: 1}]. Keep each below ticket_expiration."New value: +"Rule relaxations after a player has waited this long, e.g. [{after_seconds: 20, min_team_size: 1}]. Keep each below ticket_expiration. Not needed for partial matches: min_team_size below max_team_size already allows them. Expansions cost the matchmaker performance, so add one only to relax a rule."
17 tool updates
v0.12.0- Changed
edgegap_context2 fields changed- added
Input schema / properties / check_tokenAdded value: +{ + "description": "Make one read-only API call (list one application) to confirm Edgegap accepts the token. Default false.", + "type": "boolean" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "api_base_url": { + "type": "string" + }, + "api_host": { + "type": "string" + }, + "forced_deploy_tag": { + "type": "string" + }, + "guardrails": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "max_duration_ceiling_minutes": { + "type": "number" + }, + "read_only": { + "type": "boolean" + }, + "server": { + "type": "string" + }, + "skills_pack": { + "type": "string" + }, + "transport": { + "type": "string" + } + }, + "type": "object" +}
- Changed
edgegap_deploy3 fields changed- changed
Input schema / properties / cpu_units / descriptionPrevious value: -"Override the version CPU (with memory_mb). Not in the published v2 spec, so the API may ignore it; a version with the size you need is the reliable way."New value: +"Override the version's CPU for this deployment only, with memory_mb. 1024 = 1 vCPU." - changed
Input schema / properties / memory_mb / descriptionPrevious value: -"Override the version memory (with cpu_units). Same caveat as cpu_units."New value: +"Override the version's memory for this deployment only, with cpu_units. At most 2x cpu_units." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "auto_stop": { + "type": "string" + }, + "auto_stop_after_minutes": { + "type": "number" + }, + "next_step": { + "type": "string" + }, + "request_id": { + "type": "string" + }, + "resources": { + "additionalProperties": {}, + "properties": { + "cpu_units": { + "type": "number" + }, + "memory_mib": { + "type": "number" + } + }, + "type": "object" + }, + "status": { + "type": "string" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "warning": { + "type": "string" + } + }, + "type": "object" +}
- Changed
edgegap_get_app_version1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "active": { + "type": "boolean" + }, + "application": { + "type": "string" + }, + "auto_stop": { + "type": "string" + }, + "auto_stop_after_minutes": { + "type": "number" + }, + "caching_percent": { + "type": "number" + }, + "cpu_units": { + "type": "number" + }, + "env": { + "items": { + "additionalProperties": {}, + "properties": { + "hidden": { + "type": "boolean" + }, + "key": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "force_cache": { + "type": "boolean" + }, + "image": { + "type": "string" + }, + "max_duration_minutes": { + "type": "number" + }, + "memory_mb": { + "type": "number" + }, + "name": { + "type": "string" + }, + "ports": { + "items": { + "additionalProperties": {}, + "properties": { + "name": { + "type": "string" + }, + "port": { + "type": "number" + }, + "protocol": { + "type": "string" + }, + "tls_upgrade": { + "type": "boolean" + } + }, + "type": "object" + }, + "type": "array" + }, + "registry_credentials_set": { + "type": "boolean" + }, + "restart_policy": { + "type": "string" + }, + "termination_grace_period_seconds": { + "type": "number" + }, + "verify_image": { + "type": "boolean" + }, + "warning": { + "type": "string" + } + }, + "type": "object" +}
- Changed
edgegap_get_deployment1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "application": { + "type": "string" + }, + "elapsed_seconds": { + "type": "number" + }, + "error": { + "type": "boolean" + }, + "error_detail": { + "type": "string" + }, + "fqdn": { + "type": "string" + }, + "location": { + "type": "string" + }, + "next_step": { + "type": "string" + }, + "ports": { + "items": { + "additionalProperties": {}, + "properties": { + "connect": { + "type": "string" + }, + "external": { + "type": "number" + }, + "internal": { + "type": "number" + }, + "name": { + "type": "string" + }, + "protocol": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "public_ip": { + "type": "string" + }, + "ready": { + "type": "boolean" + }, + "request_id": { + "type": "string" + }, + "running": { + "type": "boolean" + }, + "status": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "type": "object" +}
- Changed
edgegap_get_deployment_logs3 fields changed- changed
Input schema / properties / max_characters / descriptionPrevious value: -"Truncate logs to this length, keeping the tail. Default 8000."New value: +"Truncate logs to this length (500-50000), keeping the tail. Default 8000." - changed
Input schema / properties / max_characters / maximumPrevious value: -50000New value: +9007199254740991 - changed
Input schema / properties / max_characters / minimumPrevious value: -500New value: +-9007199254740991
- Changed
edgegap_get_deployment_metrics1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "cpu": { + "additionalProperties": {}, + "properties": { + "average": { + "type": "number" + }, + "from": { + "type": "string" + }, + "labels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "latest": { + "type": "number" + }, + "peak": { + "type": "number" + }, + "samples": { + "type": "number" + }, + "to": { + "type": "string" + } + }, + "type": "object" + }, + "cpu_throttle_rate": { + "additionalProperties": {}, + "properties": { + "average": { + "type": "number" + }, + "from": { + "type": "string" + }, + "labels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "latest": { + "type": "number" + }, + "peak": { + "type": "number" + }, + "samples": { + "type": "number" + }, + "to": { + "type": "string" + } + }, + "type": "object" + }, + "memory": { + "additionalProperties": {}, + "properties": { + "average": { + "type": "number" + }, + "from": { + "type": "string" + }, + "labels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "latest": { + "type": "number" + }, + "peak": { + "type": "number" + }, + "samples": { + "type": "number" + }, + "to": { + "type": "string" + } + }, + "type": "object" + }, + "network_receive": { + "additionalProperties": {}, + "properties": { + "average": { + "type": "number" + }, + "from": { + "type": "string" + }, + "labels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "latest": { + "type": "number" + }, + "peak": { + "type": "number" + }, + "samples": { + "type": "number" + }, + "to": { + "type": "string" + } + }, + "type": "object" + }, + "network_transmit": { + "additionalProperties": {}, + "properties": { + "average": { + "type": "number" + }, + "from": { + "type": "string" + }, + "labels": { + "items": { + "type": "string" + }, + "type": "array" + }, + "latest": { + "type": "number" + }, + "peak": { + "type": "number" + }, + "samples": { + "type": "number" + }, + "to": { + "type": "string" + } + }, + "type": "object" + }, + "note": { + "type": "string" + }, + "request_id": { + "type": "string" + }, + "totals": { + "additionalProperties": {}, + "properties": { + "disk_read": { + "type": "number" + }, + "disk_written": { + "type": "number" + }, + "received": { + "type": "number" + }, + "transmitted": { + "type": "number" + } + }, + "type": "object" + } + }, + "type": "object" +}
- Changed
edgegap_get_skill1 field changed- changed
Input schema / properties / skill / descriptionPrevious value: -"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-server-design, edgegap-threejs, edgegap-troubleshoot, edgegap-unity, edgegap-unreal."New value: +"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-matchmaking, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-server-design, edgegap-threejs, edgegap-troubleshoot, edgegap-unity, edgegap-unreal."
- Changed
edgegap_list_app_versions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "application": { + "type": "string" + }, + "next_step": { + "type": "string" + }, + "showing": { + "type": "number" + }, + "total": { + "type": "number" + }, + "truncated": { + "type": "boolean" + }, + "versions": { + "items": { + "additionalProperties": {}, + "properties": { + "active": { + "type": "boolean" + }, + "cpu_units": { + "type": "number" + }, + "image": { + "type": "string" + }, + "max_duration_minutes": { + "type": "number" + }, + "memory_mb": { + "type": "number" + }, + "name": { + "type": "string" + }, + "ports": { + "items": { + "additionalProperties": {}, + "properties": { + "name": { + "type": "string" + }, + "port": { + "type": "number" + }, + "protocol": { + "type": "string" + }, + "tls_upgrade": { + "type": "boolean" + } + }, + "type": "object" + }, + "type": "array" + }, + "registry_credentials_set": { + "type": "boolean" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
edgegap_list_apps5 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Results per page. Default 50."New value: +"Results per page, 1-100. Default 50." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +9007199254740991 - changed
Input schema / properties / limit / minimumPrevious value: -1New value: +-9007199254740991 - changed
Input schema / properties / page / minimumPrevious value: -1New value: +-9007199254740991 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "applications": { + "items": { + "additionalProperties": {}, + "properties": { + "active": { + "type": "boolean" + }, + "last_updated": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "next_step": { + "type": "string" + }, + "showing": { + "type": "number" + }, + "total": { + "type": "number" + }, + "truncated": { + "type": "boolean" + } + }, + "type": "object" +}
- Changed
edgegap_list_deployments4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Default 50."New value: +"1-100. Default 50." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +9007199254740991 - changed
Input schema / properties / limit / minimumPrevious value: -1New value: +-9007199254740991 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "deployments": { + "items": { + "additionalProperties": {}, + "properties": { + "fqdn": { + "type": "string" + }, + "ready": { + "type": "boolean" + }, + "request_id": { + "type": "string" + }, + "started": { + "type": "string" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "next_step": { + "type": "string" + }, + "showing": { + "type": "number" + }, + "total": { + "type": "number" + }, + "truncated": { + "type": "boolean" + } + }, + "type": "object" +}
- Changed
edgegap_list_locations1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "filtered_for": { + "type": "string" + }, + "locations": { + "items": { + "additionalProperties": {}, + "properties": { + "city": { + "type": "string" + }, + "continent": { + "type": "string" + }, + "country": { + "type": "string" + }, + "latitude": { + "type": "number" + }, + "longitude": { + "type": "number" + }, + "region": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "messages": { + "items": { + "type": "string" + }, + "type": "array" + }, + "next_step": { + "type": "string" + }, + "showing": { + "type": "number" + }, + "total": { + "type": "number" + }, + "truncated": { + "type": "boolean" + } + }, + "type": "object" +}
- Changed
edgegap_list_ping_beacons1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "beacons": { + "items": { + "additionalProperties": {}, + "properties": { + "city": { + "type": "string" + }, + "continent": { + "type": "string" + }, + "country": { + "type": "string" + }, + "host": { + "type": "string" + }, + "tcp_port": { + "type": "number" + }, + "udp_port": { + "type": "number" + } + }, + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "type": "object" +}
- Changed
edgegap_list_registry_tags4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Default 20."New value: +"1-100. Default 20." - changed
Input schema / properties / limit / maximumPrevious value: -100New value: +9007199254740991 - changed
Input schema / properties / limit / minimumPrevious value: -1New value: +-9007199254740991 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "image_name": { + "type": "string" + }, + "next_step": { + "type": "string" + }, + "note": { + "type": "string" + }, + "showing": { + "type": "number" + }, + "tags": { + "items": { + "additionalProperties": {}, + "properties": { + "digest": { + "type": "string" + }, + "pushed": { + "type": "string" + }, + "size_mb": { + "type": "number" + }, + "tag": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + }, + "truncated": { + "type": "boolean" + } + }, + "type": "object" +}
- Changed
edgegap_list_relay_sessions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "next_step": { + "type": "string" + }, + "sessions": { + "items": { + "additionalProperties": {}, + "properties": { + "error": { + "type": "string" + }, + "linked": { + "type": "boolean" + }, + "players": { + "type": "number" + }, + "ready": { + "type": "boolean" + }, + "relay": { + "type": "string" + }, + "session_id": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "showing": { + "type": "number" + }, + "total": { + "type": "number" + }, + "truncated": { + "type": "boolean" + } + }, + "type": "object" +}
- Changed
edgegap_update_app_version2 fields changed- added
Input schema / properties / envAdded value: +{ + "description": "REPLACES every env var on the version; [] removes them all. Values are never echoed back.", + "items": { + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "key", + "value" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / portsAdded value: +{ + "description": "REPLACES every port on the version. Include the ports to keep, not only new ones.", + "items": { + "properties": { + "name": { + "description": "Label, e.g. \"gameport\".", + "type": "string" + }, + "port": { + "description": "Port the server listens on.", + "maximum": 59999, + "minimum": 1, + "type": "integer" + }, + "protocol": { + "description": "One of UDP, TCP, TCP/UDP, HTTP, HTTPS, WS, WSS. Most game servers use UDP.", + "type": "string" + }, + "tls_upgrade": { + "description": "wss:// / https:// for browser clients. WS and HTTP ports only.", + "type": "boolean" + }, + "to_check": { + "description": "Readiness check on this port. Default true.", + "type": "boolean" + } + }, + "required": [ + "port", + "protocol" + ], + "type": "object" + }, + "minItems": 1, + "type": "array" +}
- Changed
edgegap_validate_server_config1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "engine": { + "type": "string" + }, + "errors": { + "items": { + "additionalProperties": {}, + "properties": { + "code": { + "type": "string" + }, + "fix": { + "type": "string" + }, + "line": { + "type": "number" + }, + "message": { + "type": "string" + }, + "severity": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "verdict": { + "type": "string" + }, + "warnings": { + "items": { + "additionalProperties": {}, + "properties": { + "code": { + "type": "string" + }, + "fix": { + "type": "string" + }, + "line": { + "type": "number" + }, + "message": { + "type": "string" + }, + "severity": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" +}
- Changed
edgegap_wait_for_deployment4 fields changed- changed
Input schema / properties / timeout_seconds / descriptionPrevious value: -"How long to wait before giving up. Default 180."New value: +"How long to wait before giving up, 5-600. Default 180." - changed
Input schema / properties / timeout_seconds / maximumPrevious value: -600New value: +9007199254740991 - changed
Input schema / properties / timeout_seconds / minimumPrevious value: -5New value: +-9007199254740991 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "application": { + "type": "string" + }, + "elapsed_seconds": { + "type": "number" + }, + "error": { + "type": "boolean" + }, + "error_detail": { + "type": "string" + }, + "fqdn": { + "type": "string" + }, + "location": { + "type": "string" + }, + "next_step": { + "type": "string" + }, + "ports": { + "items": { + "additionalProperties": {}, + "properties": { + "connect": { + "type": "string" + }, + "external": { + "type": "number" + }, + "internal": { + "type": "number" + }, + "name": { + "type": "string" + }, + "protocol": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "public_ip": { + "type": "string" + }, + "ready": { + "type": "boolean" + }, + "request_id": { + "type": "string" + }, + "running": { + "type": "boolean" + }, + "status": { + "type": "string" + }, + "version": { + "type": "string" + }, + "waited_seconds": { + "type": "number" + } + }, + "type": "object" +}
3 tool updates
v0.10.0- Changed
edgegap_build_matchmaker_config2 fields changed- changed
Input schema / properties / expansions / descriptionPrevious value: -"Rule relaxations after a player has waited this long, e.g. [{after_seconds: 30, min_team_size: 1}]."New value: +"Rule relaxations after a player has waited this long, e.g. [{after_seconds: 20, min_team_size: 1}]. Keep each below ticket_expiration." - changed
Input schema / properties / ticket_expiration / descriptionPrevious value: -"Default \"5m\"."New value: +"Default \"30s\", so a developer testing alone is matched or told to retry within 30 s instead of waiting minutes. Raise it only for production queues."
- Changed
edgegap_get_skill1 field changed- changed
Input schema / properties / skill / descriptionPrevious value: -"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-server-design, edgegap-troubleshoot, edgegap-unity, edgegap-unreal."New value: +"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-server-design, edgegap-threejs, edgegap-troubleshoot, edgegap-unity, edgegap-unreal."
- Added
edgegap_update_skills
12 tool updates
v0.7.1- Changed
edgegap_create_app_version1 field changed- changed
Input schema / properties / docker_tag / descriptionPrevious value: -"Image tag. Use a build ID, not \"latest\"."New value: +"Image tag: a build ID, commit SHA or timestamp. \"latest\" and empty tags are refused."
- Added
edgegap_delete_registry_tag - Changed
edgegap_deploy2 fields changed- changed
Input schema / properties / cpu_units / descriptionPrevious value: -"Override the version CPU."New value: +"Override the version CPU (with memory_mb). Not in the published v2 spec, so the API may ignore it; a version with the size you need is the reliable way." - changed
Input schema / properties / memory_mb / descriptionPrevious value: -"Override the version memory."New value: +"Override the version memory (with cpu_units). Same caveat as cpu_units."
- Added
edgegap_get_app_version - Added
edgegap_get_deployment_metrics - Changed
edgegap_get_skill2 fields changed- changed
Input schema / properties / skill / descriptionPrevious value: -"Skill name, from edgegap_list_skills."New value: +"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-server-design, edgegap-troubleshoot, edgegap-unity, edgegap-unreal." - removed
Input schema / properties / skill / enumRemoved value: -[ - "edgegap", - "edgegap-containerize", - "edgegap-deployments-api", - "edgegap-launch", - "edgegap-local-testing", - "edgegap-server-design", - "edgegap-troubleshoot", - "edgegap-unity", - "edgegap-unreal" -]
- Added
edgegap_list_locations - Added
edgegap_list_ping_beacons - Added
edgegap_list_relay_sessions - Added
edgegap_revoke_relay_user - Added
edgegap_update_app - Added
edgegap_update_app_version
15 tool updates
v0.5.2- Changed
edgegap_authorize_relay_user1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it.", + "type": "boolean" +}
- Changed
edgegap_build_matchmaker_config1 field changed- added
Input schema / properties / allowed_cors_originsAdded value: +{ + "description": "Origins of web pages allowed to call the matchmaker, e.g. [\"https://mygame.example.com\", \"http://localhost:8080\"]. Required when game clients run in a browser (WebGL): browsers block matchmaker calls from any origin not listed. Scheme and host only, no path.", + "items": { + "type": "string" + }, + "type": "array" +}
- Added
edgegap_context - Changed
edgegap_create_app1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it.", + "type": "boolean" +}
- Changed
edgegap_create_app_version4 fields changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it.", + "type": "boolean" +} - changed
Input schema / properties / env / descriptionPrevious value: -"Environment variables injected into the container."New value: +"Environment variables injected into the container. Values are never echoed back." - added
Input schema / properties / ports / items / properties / tls_upgradeAdded value: +{ + "description": "Edgegap terminates TLS on this port, so clients connect with wss:// or https://. Required for browser (WebGL) clients, which cannot use plain ws:// from an https page. WS and HTTP ports only. Default false.", + "type": "boolean" +} - changed
Input schema / properties / registry_username / descriptionPrevious value: -"Registry username, for private images."New value: +"Registry username. Needed for private images, including images in your own registry.edgegap.com project: Edgegap pulls with this login, not your API token."
- Changed
edgegap_create_relay_session1 field changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it.", + "type": "boolean" +}
- Changed
edgegap_delete_relay_session2 fields changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it.", + "type": "boolean" +} - added
Input schema / properties / session_id / descriptionAdded value: +"The exact session_id of the one session to delete, e.g. \"0724828881e2-S\"."
- Changed
edgegap_deploy5 fields changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it.", + "type": "boolean" +} - changed
Input schema / properties / env / descriptionPrevious value: -"Environment variables for this deployment only."New value: +"Environment variables for this deployment only. Values are never echoed back." - changed
Input schema / properties / tags / descriptionPrevious value: -"Tags for filtering later, e.g. [\"agent-test\"]. Recommended."New value: +"Extra tags for filtering later, e.g. [\"agent-test\"]. \"edgegap-mcp\" is always added." - added
Input schema / properties / tags / items / maxLengthAdded value: +40 - added
Input schema / properties / tags / items / minLengthAdded value: +1
- Changed
edgegap_generate_dockerfile1 field changed- added
Input schema / properties / ports / items / properties / tls_upgradeAdded value: +{ + "description": "TLS Upgrade (wss/https) on a WS or HTTP port, for browser clients.", + "type": "boolean" +}
- Added
edgegap_get_skill - Changed
edgegap_list_deployments1 field changed- added
Input schema / properties / only_agent_deploymentsAdded value: +{ + "description": "Only deployments started through this server: tagged \"edgegap-mcp\", or \"mcp\" by versions up to 0.3.3. Cannot be combined with a tags filter.", + "type": "boolean" +}
- Changed
edgegap_list_registry_tags2 fields changed- changed
Input schema / properties / image_name / descriptionPrevious value: -"\"<project>/<image>\", e.g. \"my-org-cv2l3w3vy6fg/my-game-server\". Project comes from edgegap_get_registry_credentials."New value: +"The image name only, without the project, registry host or tag, e.g. \"my-game-server\". The API reads the project from your token; \"<project>/my-game-server\" is not found." - added
Input schema / properties / image_name / minLengthAdded value: +1
- Added
edgegap_list_skills - Changed
edgegap_stop_deployment2 fields changed- added
Input schema / properties / dry_runAdded value: +{ + "description": "Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it.", + "type": "boolean" +} - changed
Input schema / properties / request_id / descriptionPrevious value: -"The request_id of the deployment to stop."New value: +"The exact request_id of the one deployment to stop, e.g. \"61b1be8f54d9\"."
- Changed
edgegap_validate_server_config1 field changed- added
Input schema / properties / ports / items / properties / tls_upgradeAdded value: +{ + "description": "TLS Upgrade (wss/https) on a WS or HTTP port, for browser clients.", + "type": "boolean" +}
2 tool updates
v0.2.2- Added
edgegap_generate_dockerfile - Changed
edgegap_list_deployments3 fields changed- removed
Input schema / properties / filterRemoved value: -{ - "description": "Edgegap filter expression, e.g. by tag. Omit for all deployments.", - "type": "string" -} - added
Input schema / properties / filtersAdded value: +{ + "description": "Omit for all deployments.", + "items": { + "properties": { + "field": { + "enum": [ + "status", + "request_id", + "tags", + "created_at", + "application", + "version", + "fleet_name", + "host_name" + ], + "type": "string" + }, + "operator": { + "enum": [ + "eq", + "neq", + "in", + "nin", + "gte", + "lte", + "ilike" + ], + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ], + "description": "A string, or an array of strings for in/nin. created_at is ISO 8601, e.g. \"2026-09-30T00:00:00Z\"." + } + }, + "required": [ + "field", + "operator", + "value" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / order_byAdded value: +{ + "description": "e.g. [{field:\"created_at\",order:\"asc\"}] for oldest first.", + "items": { + "properties": { + "field": { + "enum": [ + "created_at", + "available_session_sockets" + ], + "type": "string" + }, + "order": { + "enum": [ + "asc", + "desc" + ], + "type": "string" + } + }, + "required": [ + "field", + "order" + ], + "type": "object" + }, + "type": "array" +}
9 tool updates
v0.2.0- Added
edgegap_authorize_relay_user - Added
edgegap_build_matchmaker_config - Changed
edgegap_create_app_version1 field changed- changed
Input schema / properties / ports / items / properties / protocol / descriptionPrevious value: -"UDP, TCP, WS, or HTTP. Most game servers use UDP."New value: +"One of UDP, TCP, TCP/UDP, HTTP, HTTPS, WS, WSS. Most game servers use UDP."
- Added
edgegap_create_relay_session - Added
edgegap_delete_relay_session - Added
edgegap_get_registry_credentials - Added
edgegap_get_relay_session - Added
edgegap_list_registry_tags - Added
edgegap_validate_server_config
10 tool updates
v0.1.2- First observed
edgegap_create_app - First observed
edgegap_create_app_version - First observed
edgegap_deploy - First observed
edgegap_get_deployment - First observed
edgegap_get_deployment_logs - First observed
edgegap_list_app_versions - First observed
edgegap_list_apps - First observed
edgegap_list_deployments - First observed
edgegap_stop_deployment - First observed
edgegap_wait_for_deployment
TDQS
Scored across 43 tools
Each tool targets a distinct resource plus action across clearly separated sub-domains (apps/versions, deployments, registry, endpoint storage, relay, matchmaker, skills). The few near-neighbours (edgegap_get_deployment vs edgegap_wait_for_deployment, edgegap_get_skill vs edgegap_list_skills vs edgegap_update_skills, delete_app vs delete_app_version) are explicitly differentiated in the descriptions with guidance on when to pick which. Even the risky relay-vs-deploy choice is called out and steered by the create_relay_session description.
All 43 names share the edgegap_ prefix and follow snake_case verb_noun (list_apps, create_app_version, delete_registry_tag, revoke_relay_user). Minor deviations exist: edgegap_context is a bare noun, edgegap_deploy omits the object, and the skills tools mix get/list/update semantics. Still, the pattern is predictable enough that an agent can guess a name.
43 tools is heavy for a single server, though the surface genuinely spans eight distinct sub-APIs (apps, versions, deployments, registry, endpoint storage, relay, matchmaker, skills). The splits are defensible, but the sheer volume makes tool selection and context cost a real burden. It sits at the upper edge of what is reasonable rather than being padded with filler.
Coverage is unusually thorough: full create/read/update/delete lifecycles for apps, versions, deployments, endpoint storage, pull profiles and relay sessions, plus observability (logs, metrics), tagging, registry inspection and workflow skills. Remaining gaps are minor: no single get_app read tool, update_app only toggles a flag, endpoint storage cannot be updated, and matchmaker is config-generation only (documented as an API limitation).
Maintenance
Related MCP Connectors
Deploy and manage your apps, databases, storage, and scheduled jobs from your AI agent
Backend for AI agents: one batched tool over ~668 actions (hosting, storage, auth, payments).
Deploy apps from GitHub, read build/runtime logs, and manage your app's users from your AI agent.
Provides capabilities that let LLM agents perform a range of infrastructure management tasks.
Related MCP Servers
FlicenseAqualityDmaintenanceEnables AI agents to deploy multiplayer web games as playable URLs with rooms, live state sync, and leaderboards, all through a single tool call.4144 npm5-
MileHost MCP Serverofficial
AlicenseCqualityBmaintenanceEnables AI coding agents to manage cloud containers, create and edit files, run commands, and deploy projects directly.247MIT- AlicenseAqualityAmaintenanceEnables AI coding assistants to access documentation, live API tools, and workflow prompts for integrating a game/app backend service into Godot, Unity, and Unreal Engine projects, including auth, leaderboards, cloud saves, remote config, localization, news, gift codes, feedback, logs, crash reporting, email, and admin dashboard management.120171 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to manage, configure, and operate game servers hosted on Pterodactyl panels, including power actions, console commands, file operations, plugin installation, and backups. It also supports Cloudflare challenge bypass and automatic request pacing for reliable panel automation.MIT