Edgegap MCP Server
OfficialEdgegap MCP Server lets an AI coding agent take a headless game server build all the way to players connecting: containerize it, push the image, deploy a dedicated server, manage relays and matchmaker configs, and troubleshoot when things break.
Check the session —
edgegap_contextreports which API it talks to, local vs hosted, and the guardrails in force (read-only mode, allowlist, max duration, forced tag, dry-run support).Containerize —
edgegap_generate_dockerfilewrites a Dockerfile for Unity/Unreal/Godot/other builds;edgegap_validate_server_configchecks an existing Dockerfile, ports, resources and image tag before building.Push images —
edgegap_get_registry_credentialsreturns private Edgegap registry push credentials and exact docker commands;edgegap_list_registry_tagsconfirms a push landed.Register apps and versions — list/create applications, and list/create application versions (image, CPU/memory, ports, TLS Upgrade, env vars, registry login, max duration).
Deploy dedicated servers —
edgegap_deploystarts an authoritative server near given player IPs/coordinates;edgegap_wait_for_deploymentpolls for the connection address;edgegap_get_deploymentreads status.Manage deployments — list running deployments with rich filters (including
only_agent_deployments), read container logs and crash details, and stop exactly one deployment by request ID.Matchmaking —
edgegap_build_matchmaker_configgenerates a ready-to-upload matchmaker JSON (teams, sizes, latency rules, expansions, CORS origins) after verifying the version exists; the developer uploads it in the dashboard.Relays (host-client games only) — create a relay session, read one, authorize late-joining players, and delete sessions.
Skills —
edgegap_list_skillsandedgegap_get_skillload bundled step-by-step workflows and templates (Unity, Unreal, containerize, server design, local testing, troubleshoot, deployments API, launch).Safety guardrails — dry-run on every mutating tool, automatic
edgegap-mcpdeployment tag, auto-stop duration reporting, refusal to send if the API token appears in env/tags/webhooks, and token redaction.
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 checks the one you have) against Edgegap's requirements, then pushes the image to your private Edgegap container registry.
Deploying a dedicated server - create an application and version, deploy close to your players, and get the connection address.
Setting up matchmaking - generate a matchmaker configuration that points at your deployed version, ready to upload in the dashboard.
Running a host-client game - create a relay session if your game is built with one player as host. See Dedicated Servers or Relays? first.
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, or reproduce a failed deployment.
Out of scope / not supported by MCP: creating or running a matchmaker (the MCP generates the configuration, you upload it 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 mcp add edgegap --url https://mcp.edgegap.dev/mcpClaude 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.
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"]
}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.7.1) 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 |
|
|
|
|
| Per-request HTTP timeout. |
📚 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. |
| 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: one per skill, named after it. In Claude Code they show up as slash commands, e.g.
/mcp__edgegap__edgegap-unity.Resources: one per file, at
edgegap-skill://<skill>/<path>, 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. If you also installed the skills locally (the Claude Code plugin or npx skills add), they're the same pack.
🧰 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, max duration, registry login, image caching ( |
| Lists the cities Edgegap deploys to, or, for one version, only those with capacity right now. |
| Lists the ping beacons game clients measure latency against before matchmaking. |
| Deploys an authoritative dedicated server close to your players. Always tagged |
| 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. |
Matchmaking
Tool | What it does |
| Generates a matchmaker configuration (teams, team size, optional latency rules and expansions) and checks that the version it deploys exists. Set |
Learn more about the configuration in Matchmaking.
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."
"Create a matchmaker config for 2v2 matches on my latest version."
"My deployment failed. Read the logs and tell me why."
"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 |
No moving image tags |
|
Image reference check | A |
Deployment cap |
|
Hidden secret env vars | Env vars whose names look like secrets ( |
Strict stop |
|
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 and its error category, how long it took, and whether it was a dry run, plus the server version and Cloudflare's country code. Only named metadata properties are let through. It never sends your token, tool argument values (IP addresses, env vars, app or image names), results or error text, 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. 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.
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.
Server 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 and EDGEGAP_MAX_AGENT_DEPLOYMENTS apply. 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/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/edgegap-mcp: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 edgegap-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
31 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: 30, min_team_size: 1}]. | |
| 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 "5m". | |
| 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?
Annotations already signal read-only/idempotent, which is consistent with a generator. The description adds real behavioral detail beyond annotations: it performs a lookup that verifies the referenced application version exists and has ports, and it explicitly clarifies that no server-side object is created and the developer must upload the config manually. It does not cover the inspect/verify_version toggles or failure modes when verification fails.
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 concrete artifact and its contents, then the critical caveat about manual upload. Four sentences all carry weight, though the closing sentence about authoritative dedicated servers is more recommendation than instruction and could be trimmed.
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 explains what is produced, what is verified, and what to do with the result. It does not describe the shape of the returned JSON beyond 'config', but the schema and the tool's generative nature make that a minor 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 already 85%, so the baseline is 3, but the description adds conceptual meaning the schema lacks: expansions are described as time-based rule relaxations ('relax the rules the longer a player waits'), and the latency rule is tied to the profiles's matching behavior. The two undocumented team-size parameters are only generically covered as 'team size'.
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, plus the exact contents (team count/size, optional latency rule, optional expansions). No sibling tool produces matchmaker configs, and the description makes that boundary obvious.
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 when-to-use context and an explicit when-not: 'Edgegap has no API for creating a matchmaker, so this tool does NOT create one.' It also prescribes the follow-up workflow (save to file, upload manually on the dashboard). It stops short of pointing to any alternative or prerequisite sibling tools (e.g. app-version lookup tools), so not a full 5.
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 configurationRead-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. Call it first when unsure what this session is allowed to do, or before anything billable. Makes no API call and never shows the token.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 versionInspect
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.
| 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. | |
| 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. |
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_registry_tagDelete one image tag from the Edgegap registryDestructiveIdempotentInspect
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. |
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 serverInspect
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. Env vars named like secrets are hidden in the dashboard.
| 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 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. | |
| memory_mb | No | Override the version memory (with cpu_units). Same caveat as cpu_units. | |
| application | Yes | Application name. |
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 versionRead-onlyInspect
Read one version in full: image, resources, ports, max_duration, whether image caching (force_cache) and verify_image are on, restart policy, 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. |
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, so the read-only behavior is covered. The description adds value by disclosing that connection address and ports appear only once the deployment is ready, which helps the agent understand timing and response 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 short sentences with no filler: the first states what the tool does and what it returns, and the second routes to the preferred sibling when relevant. The most important 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?
For a simple single-parameter read tool with readOnlyHint and full schema coverage, the description is sufficient. An agent knows what to call, how to get the request_id, what to expect in the response, and when to use wait_for_deployment instead.
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 already documents request_id fully, including that it is returned by edgegap_deploy, so schema coverage is 100%. The description reinforces this but does not add meaningful semantics beyond the schema, warranting the baseline score.
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: 'Read the current status of one deployment' and adds the relevant output ('connection address and ports once it is ready'). The singular 'one deployment' clearly distinguishes it from list-style 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 explicitly names the alternative edgegap_wait_for_deployment and gives the condition for preferring it: a deployment you just created, because that tool polls for you instead of requiring a loop. This is clear, actionable usage guidance.
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, keeping the tail. Default 8000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint already present, the description adds useful non-obvious behavior: logs include crash output and are retained for stopped deployments only if Endpoint Storage was configured. No contradiction with 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?
Three tight sentences cover what the tool returns, when to call it, and an important retention caveat. No filler; the usage guidance is front-loaded before the edge case.
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 simple read-only log retrieval tool with two well-documented parameters and annotations covering safety, the description provides enough context: what logs are retrieved, when to use it, and the retention limitation. The lack of an output schema is not a gap here.
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 clear descriptions of request_id and max_characters. The description does not add parameter-level details, but the baseline 3 is appropriate because the schema already carries the semantic load.
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 ('Retrieve') and resource ('stdout/stderr and crash output for a deployment'), making the tool's function unambiguous. This is clearly distinct from sibling tools that list, stop, or create deployments/apps.
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 explicit trigger conditions: call when a deployment errors or a server exits unexpectedly, and explains the diagnostic value of the crash exit code. It does not explicitly name alternatives or when-not-to-use cases, so it stops 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_get_deployment_metricsGet CPU, memory and network use of a deploymentRead-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. |
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.
| 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?
Far exceeds the annotations (which only say non-read-only, idempotent, non-destructive). It discloses the token-scope behavior (quick-start vs regular API token), the fallback response when credentials are unavailable, and handling constraints (registry-scoped token, use --password-stdin, never a CLI argument, never written to 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 the purpose and the registry URL, then ordered by decision flow (when to use → auth caveat → token handling → prerequisite). It is long at roughly 110 words, but nearly every sentence encodes a security or routing constraint that cannot be dropped.
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 auth behavior, fallback path, token hygiene, and a prerequisite tool, which is substantial for a credential tool with no output schema. It does not state what happens if the optional 'tag' or 'image_name' are omitted, a minor gap given the 0 required parameters.
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 both 'tag' (never "latest") and 'image_name' (pattern, no project/tag). The description only adds that the returned commands are built 'for your image', which is implied. Baseline 3 applies when the schema carries parameter meaning.
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: fetching push login credentials for the organization's private Edgegap container registry, plus the exact docker login/build/push commands. It is clearly distinguishable from the sibling edgegap_list_registry_tags, which only lists tags rather than supplying 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 says when to use it ('when the server image is not in a registry yet'), when it will not work ('with a regular API token this tool cannot fetch them... do not retry'), what to do instead (copy from the dashboard, ask the developer), and names a prerequisite sibling ('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 skillRead-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 matching skill before acting on a game project — edgegap-ngo for Unity with Netcode for GameObjects, edgegap-fishnet for Unity with FishNet, edgegap-purrnet for Unity with PurrNet, edgegap-fusion for Unity with Photon Fusion 2, edgegap-unity for other Unity projects, edgegap-unreal for Unreal Engine (edgegap-eos-voice for voice chat), edgegap-fusion-simplefps for the Photon Simple FPS sample, edgegap-godot for Godot 4 with a Godot server, edgegap-colyseus for a Colyseus server, edgegap-nakama for a Nakama backend, edgegap-playfab for PlayFab Matchmaking, edgegap-manus for a browser game built with Manus, edgegap otherwise — and 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-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-server-design, edgegap-troubleshoot, edgegap-unity, edgegap-unreal. |
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. Default 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety profile. The description adds useful context about organizational scope and the meaning of an application, but does not disclose pagination behavior or response details.
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-load the action, then give a concrete usage rule, then define the domain concept. 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?
The description is sufficient for deciding to call it and knowing its scope, and the annotations cover safety. It falls slightly short by not hinting that results are paginated or that page/limit should be considered for a complete inventory.
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 two pagination parameters are optional, and only 'limit' carries a schema description; 'page' has only type/constraints. The description adds no parameter-level detail, so it fails to compensate for the incomplete 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?
Opens with a specific verb and resource: 'List the applications in the Edgegap organization.' The definition of an application as grouping versions of one game server distinguishes it from sibling list_app_versions and places it clearly in the create/deploy workflow.
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 instructs the agent to call this before creating or deploying anything to avoid duplicate applications. It does not name sibling alternatives or state when not to use, but the context 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_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 settings from a working version when creating a new one.
| Name | Required | Description | Default |
|---|---|---|---|
| application | Yes | Application name, as returned by edgegap_list_apps. |
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 goes further by disclosing the returned content, including the non-obvious detail that ports carry a TLS Upgrade flag needed by browser/WebGL clients for wss://, plus whether registry credentials exist for image pulls. It omits pagination/ordering behavior, which keeps it 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?
Front-loaded with the verb and the returned fields, then the usage sentence. Every clause carries information; the descriptions of returned fields are dense but each one (TLS Upgrade, registry login) is actionable and not 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?
There is no output schema, so the description correctly carries the burden of describing return values and does so thoroughly. Remaining gaps are minor for a scoped list-under-a-parent call: no mention of ordering or pagination limits, and no explicit note that a nonexistent application errors.
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?
Only one parameter and schema description coverage is 100%, so the schema already explains 'application' and even cross-references edgegap_list_apps as the source. The description adds no syntax, naming, or format constraints beyond the schema, which is the expected 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 the versions under an application') and immediately enumerates the payload the agent will get back (container image, resources, ports/TLS, registry login). This is clearly distinguishable from edgegap_list_apps and edgegap_list_registry_tags, which operate on different resources.
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 three concrete use cases: finding the version name to deploy, verifying a version is ready before deploying, and copying settings when creating a new one. The last two also route implicitly to edgegap_deploy and edgegap_create_app_version, so the agent knows when this tool is the right first step.
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 | 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. |
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 constraints beyond that: at most one filter per field, operator availability varies by field, and only_agent_deployments cannot be combined with a tags filter. It does not describe the return shape or result volume, which is a minor gap for a tool with no output schema.
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 the motivating use case are front-loaded, followed by the filter grammar. It is long, but the length is driven by genuinely dense query semantics rather than filler, and it includes worked examples. Slightly heavy for a single description but each clause carries 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?
For a read-only, annotated list tool whose schema already defines limit and filter structure, the description supplies enough to call it correctly, including caveats and examples. The remaining gap is that it never characterizes the returned deployment objects, which matters somewhat given there is no output 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 100%, setting the baseline at 3, but the description meaningfully exceeds it: it maps which operators are valid per field (eq/neq everywhere except created_at, which uses eq/gte/lte; in/nin on specific fields; ilike with % wildcards only on fleet_name and host_name) and documents the only_agent_deployments equivalence to a tags filter. That per-field operator grammar is not inferable from the schema's flat operator enum.
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+scope ("List active deployments, optionally filtered and sorted"), which cleanly distinguishes it from the singular edgegap_get_deployment and from edgegap_deploy/edgegap_stop_deployment. An agent can identify the operation 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 a concrete when-to-use scenario with a rationale: find deployments left running from earlier sessions before starting new ones because orphaned servers cost money. It also routes a special case (only_agent_deployments for agent-started servers). It stops short of naming explicit alternatives for single-deployment lookups (get_deployment) or exclusions.
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 runRead-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. |
edgegap_list_ping_beaconsList ping beaconsRead-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. |
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds genuine value beyond them: what the response contains (push time, size) and the operational consequence of skipping the check. It does not mention pagination behavior, 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 tightly packed sentences, zero filler. The scoping statement comes first and the workflow guidance second, which is the correct front-loading for a read-only lookup 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?
For a read-only list tool with annotations covering safety and no output schema, the description covers purpose, workflow placement, and return content. The only omission is how page/limit pagination behaves when many tags exist, which matters for a listing 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 67% and the schema itself already documents image_name thoroughly (excluding project, registry host, tag) and limit's default. The description adds no parameter-level syntax or constraints, so the 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 resource ('List the tags pushed for one image in this organization's Edgegap container registry') plus the returned fields (push time, size). It is clearly distinguishable from siblings like edgegap_list_apps and edgegap_list_app_versions, which target different resources.
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 when-to-use ('Call it after docker push to confirm the tag landed') and names the alternative/downstream tool (edgegap_create_app_version), including the concrete failure mode ('image-pull error') that this check prevents. 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_list_relay_sessionsList relay sessionsRead-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 | |||
edgegap_list_skillsList the Edgegap agent skillsRead-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. Before working on a game project, load the matching skill with edgegap_get_skill: edgegap-ngo for Unity with Netcode for GameObjects, edgegap-fishnet for Unity with FishNet, edgegap-purrnet for Unity with PurrNet, edgegap-fusion for Unity with Photon Fusion 2, edgegap-unity for other Unity projects, edgegap-unreal for Unreal Engine (edgegap-eos-voice to add voice chat to it), edgegap-fusion-simplefps for the Photon Simple FPS sample, edgegap-godot for Godot 4 with a Godot server, edgegap-colyseus for a Colyseus server, edgegap-nakama for a game with a Nakama backend, edgegap-playfab for a game that keeps PlayFab Matchmaking, edgegap-manus for a browser game built with Manus, edgegap for any other engine or platform questions; it routes to the rest. No API call.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
edgegap_revoke_relay_userRemove a player from a relay sessionDestructiveIdempotentInspect
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. |
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_update_appTurn an application on or offIdempotentInspect
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. |
edgegap_update_app_versionUpdate an application versionIdempotentInspect
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. Resources, ports and env vars cannot be changed here; create a new version for those.
| 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 | Version name to change. | |
| is_active | No | false blocks new deployments of this version. | |
| 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. | |
| 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. |
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 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, but the description adds genuinely new behavior: it is a purely local check ('Makes no API calls'), and it discloses the concrete validation rules applied (linux/amd64 only, root detection, Unity batchmode flags, localhost binding, EXPOSE/version-port mismatch, protocol/netcode mismatch, 'latest' tag, CPU/memory ratios). It stops short of saying how findings are reported.
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 purpose sentence, then a dense but non-redundant list of failure categories, closing with the sibling alternative and the no-API-calls note. The failure list is long but every item is a distinct, actionable check 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?
Covers the two things an agent most needs: what gets checked and that this is a safe local operation with an alternative when the Dockerfile is absent. The one real gap is the return contract — with no output schema and no statement of what a failed validation yields (findings list vs boolean), the agent cannot anticipate the response shape.
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?
With only 44% schema coverage, the description compensates by binding several bare params to meaning: dockerfile ('Pass the Dockerfile text, read it from disk first'), netcode (protocol-vs-transport matching), docker_tag ('latest' rejection), cpu_units/memory_mb (ratios), and ports (must agree with version ports). It does not meaningfully clarify docker_image vs docker_repository, the engine auto-detection, or the port name/tls_upgrade fields.
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 (validate a game server Dockerfile plus ports/resources) and pins the timing ('BEFORE building and pushing'), which cleanly separates it from edgegap_create_app_version, edgegap_deploy and edgegap_build_matchmaker_config. The enumerated failure classes make the scope unmistakable.
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 call it (pre-build/push, read the Dockerfile from disk first) and names the alternative for the opposite condition: 'If there is no Dockerfile yet, call edgegap_generate_dockerfile instead.' That is a textbook when/when-not/alternative split.
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. Default 180. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds valuable behavioral details: polling behavior, backoff, timeout handling, and that it reports container error detail on failure. This is more than the annotations provide, though it doesn't specify exact timeout semantics beyond the parameter.
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 with zero waste. The purpose is front-loaded, and the usage guidance is compact and direct. Every clause serves a purpose, making it easy for an agent to parse quickly.
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 polling tool with no output schema, the description covers the full lifecycle: what triggers it, what it does while polling, what it returns on success, and what happens on failure (error detail). An agent has everything needed 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?
Schema coverage is 100% with both parameters documented. The description adds the key contextual meaning that request_id comes from edgegap_deploy, which is not in the schema. This extra clarification goes beyond the schema's field descriptions, justifying a score above the baseline 3.
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 precise verb ('poll') and resource ('deployment'), and the outcome ('return the connection details'). It explicitly positions itself relative to edgegap_deploy and mentions that it handles backoff, which distinguishes it from a generic status check 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?
It clearly says 'This is the tool to call right after edgegap_deploy' and instructs 'Do not build your own polling loop', giving an explicit when-to-use and a when-not-to alternative. This leaves no ambiguity about the intended context.
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.
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 22 tools
Almost every tool targets a distinct resource+action (apps, versions, deployments, relay sessions, registry, config, skills), and the descriptions explicitly steer between the few that could overlap. The deployment trio (deploy/get_deployment/wait_for_deployment) is the only real overlap, but the text clearly explains when to use each, so ambiguity is minimal.
Nearly all tools follow a consistent edgegap_verb_noun pattern (list_apps, create_app, get_deployment, stop_deployment). Minor deviations like edgegap_deploy (verb only) and edgegap_context (noun only) break the pattern slightly but remain readable and unambiguous.
22 tools is on the heavy side, but the domain is genuinely broad (app/version lifecycle, deployments, relay sessions, registry, Dockerfile/config generation, matchmaker, and skills). Each tool maps to a distinct capability rather than padding, so the count is justified though near the upper bound.
Deployment and relay lifecycles are well covered (create/list/get/wait/stop, plus logs, and full relay CRUD), and config/skill helpers round it out. The main gaps are app- and version-level update/delete operations, which are minor and likely intentional given the API surface.
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.466 npm5-
MileHost MCP Serverofficial
AlicenseCqualityBmaintenanceEnables AI coding agents to manage cloud containers, create and edit files, run commands, and deploy projects directly.247MIT- AlicenseNot gradedqualityBmaintenanceEnables Codex and other agents to discover live AutoDL GPU stock, produce cost- and time-optimized rental plans with human review, and manage approved Elastic/Pro deployments through the official API.4Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables coding agents to deploy Next.js apps and provision Postgres, Redis, MinIO, NATS, Mailpit, and nginx locally via Docker without requiring Vercel or Supabase signups, using a single account and reading logs from the same environment.MIT