Skip to main content
Glama

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.

Install in Cursor Install in VS Code

👉 Supported Features

TIP

Using Unity, Unreal Engine, or Godot? Our Unity, Unreal Engine, and Godot guides and plugins remain the fastest path for those engines. The MCP server works alongside them, and on its own for any engine.

Use our MCP server when:

  • Containerizing your game server - your agent writes a Dockerfile for your build (or reviews the one you have) against best practices, pushes the image to our private container registry, and removes unused old image tags to reclaim registry capacity.

  • Deploying a dedicated server - create and update app versions, review available locations, deploy close to your players, and get server IP with ports to test client connection.

  • Building a CI/CD pipeline - test your deployments and teardown from a build system.

  • Troubleshooting a game server issue - inspect app versions and deployment status, read container logs and CPU/memory utilization, or reproduce a failed deployment.

  • Running client-host and peer-to-peer games - create relay sessions providing NAT punchthrough and avoid connection blocking. Review Orchestration Models and Dedicated Servers or Relays? before deciding.

WARNING

Out of scope / not supported by MCP: building Linux server executable; creating, starting or stopping a matchmaker (upload the generated configuration in the dashboard); server browser; lobbies; managed clusters; private fleets; or billing.

NOTE

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)

NOTE

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:

  1. Install the MCP server for Popular Agents or with Custom Integration.

  2. 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

CAUTION

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.

TIP

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.

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 user

ChatGPT Codex

Codex reads the token from an environment variable and sends it as Authorization: Bearer <token>, which the hosted endpoint accepts. In ~/.codex/config.toml:

[mcp_servers.edgegap]
url = "https://mcp.edgegap.dev/mcp"
bearer_token_env_var = "EDGEGAP_API_TOKEN"

Then set EDGEGAP_API_TOKEN to your token in the environment Codex starts from.

Claude Desktop and claude.ai

Custom connectors in claude.ai and Claude Desktop cannot send an Authorization header, so the hosted endpoint never receives your token from them: the connector shows as connected, but every tool call fails. Use the Local Server instead.

In Claude Desktop, open Settings → Developer → Edit Config and add the local server to claude_desktop_config.json:

{
  "mcpServers": {
    "edgegap": {
      "command": "npx",
      "args": ["-y", "@edgegap/mcp"]
    }
  }
}

Leave the token out and you're asked for it on first use. claude.ai in the browser can't run a local server, so it can't use Edgegap MCP until the hosted endpoint supports OAuth.

Cursor

The Cursor button at the top of this page installs it; to do it by hand, add this to ~/.cursor/mcp.json (or .cursor/mcp.json in a project):

{
  "mcpServers": {
    "edgegap": {
      "url": "https://mcp.edgegap.dev/mcp",
      "headers": { "Authorization": "token xxxxxxxx-e458-4592-b607-c2c28afd8b62" }
    }
  }
}

VS Code (Copilot agent mode)

The VS Code button at the top of this page installs it; to do it by hand, add this to .vscode/mcp.json (VS Code uses servers, not mcpServers):

{
  "servers": {
    "edgegap": {
      "type": "http",
      "url": "https://mcp.edgegap.dev/mcp",
      "headers": { "Authorization": "token xxxxxxxx-e458-4592-b607-c2c28afd8b62" }
    }
  }
}

Windsurf

In ~/.codeium/windsurf/mcp_config.json, run the Local Server, which works in every client that starts MCP servers as commands:

{
  "mcpServers": {
    "edgegap": {
      "command": "npx",
      "args": ["-y", "@edgegap/mcp"],
      "env": { "EDGEGAP_API_TOKEN": "xxxxxxxx-e458-4592-b607-c2c28afd8b62" }
    }
  }
}

mcp.json

Most agentic IDEs also support integration by pasting JSON configuration:

{
    "mcpServers": {
        "Edgegap": {
            "type": "http",
            "url": "https://mcp.edgegap.dev/mcp",
            "headers": {
                "Authorization": "token xxxxxxxx-e458-4592-b607-c2c28afd8b62"
            }
        }
    }
}

Custom Integration

Install remote Edgegap MCP server in your agent's virtualized environment (never in your project!):

Node, using the mcp-remote npx package

{
  "command": "npx",
  "args": ["-y", "mcp-remote", "https://mcp.edgegap.dev/mcp", "--transport", "http-only"]
}

Python, using the mcp-proxy uvx package

{
  "command": "uvx",
  "args": ["mcp-proxy", "--transport", "streamablehttp", "https://mcp.edgegap.dev/mcp"]
}

One-Click Install (Claude Desktop)

Download edgegap-mcp.mcpb and open it: Claude Desktop installs the local server as an extension and asks for your API token, which it keeps in the operating system's secure storage. The extension's settings also hold read-only mode, the application allowlist, the max duration ceiling and the deployment cap (the variables below). Each release attaches the bundle, built from that release's code. Any other app that installs MCPB bundles works the same way.

Local Server

To keep your API token on your own machine, run the server locally instead. Leave the token out and your agent asks you for it on first use, holding it in memory only for that session:

{
  "mcpServers": {
    "Edgegap": {
      "command": "npx",
      "args": ["-y", "@edgegap/mcp"],
      "env": { "EDGEGAP_API_TOKEN": "xxxxxxxx-e458-4592-b607-c2c28afd8b62" }
    }
  }
}

Needs Node 18+. Pin a version in production (@edgegap/mcp@0.15.7) rather than floating on latest. Registered in the official MCP registry as dev.edgegap/mcp.

The local server can also limit what an agent can do. These variables have no effect on the hosted endpoint at mcp.edgegap.dev:

Variable

Default

Purpose

EDGEGAP_API_TOKEN

(prompted)

API token. Optional: omit it and you're asked at first use. The token prefix is added for you. Never pass it as a command-line argument.

EDGEGAP_READ_ONLY

0

Set to 1 and the tools that change something (marked ● in Tools) are never registered, so the agent cannot be talked into calling them.

EDGEGAP_APP_ALLOWLIST

(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.

EDGEGAP_MAX_DURATION_MINUTES

60

Ceiling on max_duration the agent may set on a version. edgegap_deploy also refuses a version whose max_duration is above it, or unlimited, unless the agent passes allow_long_running: true after asking you.

EDGEGAP_MAX_AGENT_DEPLOYMENTS

5

edgegap_deploy refuses while this many deployments tagged edgegap-mcp are running. 0 turns the cap off.

EDGEGAP_MAX_DEPLOYS_PER_RUN

20

Deploys one server process may send, failed ones included. Restart the server to reset it. 0 turns it off.

EDGEGAP_STOP_OWN_ONLY

0

Set to 1 and edgegap_stop_deployment only stops deployments tagged edgegap-mcp, so an agent cannot stop servers it did not start.

EDGEGAP_ENABLE_SKILLS_UPDATE

0

Set to 1 to let edgegap_update_skills run npx skills@1.7.4 update or claude plugin update with apply: true. Without it, it lists those commands for you to run. Hand-copied skills are rewritten from the bundle either way. The updaters get only path, home, temp, locale, proxy and npm settings, never EDGEGAP_* variables or anything named like a token, secret, password or key.

EDGEGAP_TIMEOUT_MS

30000

Per-request HTTP timeout.

EDGEGAP_SKILLS_CHECK

on

Set to off and the skill tools never read the latest skills version from GitHub.

Windows

The local server runs on Windows with Node.js 18 or newer, and CI runs the build and the stdio tests on Windows.

  • Many Windows MCP clients cannot start npx directly, because it is a .cmd script. Start it through cmd /c: "command": "cmd", "args": ["/c", "npx", "-y", "@edgegap/mcp"]. In Claude Code: claude mcp add Edgegap --env EDGEGAP_API_TOKEN=<token> -- cmd /c npx -y @edgegap/mcp.

  • In PowerShell, type npx.cmd instead of npx to run it by hand: a new Windows install blocks the npx PowerShell script ("running scripts is disabled on this system").

  • The first start downloads the package and can take a while; later starts are fast.

  • edgegap_update_skills finds skills installed in %USERPROFILE%, the same way as on macOS and Linux.

📚 Skills

The server includes the Edgegap agent skills: tested, step-by-step workflows for getting a multiplayer game online, with templates (Dockerfiles, matchmaker configs, Unity C# and Unreal C++ drop-ins) and known pitfalls. Any agent connected to Edgegap MCP gets them, with no separate install and no token needed, and is told to load the matching skill before working on a game project.

Skill

For

edgegap

Start here for any engine other than Unity or Unreal Engine, or platform questions. Routes to the rest.

edgegap-unity

Unity end to end: server build, matchmaker, client, end-to-end test.

edgegap-ngo

Unity with Netcode for GameObjects end to end: server start and self-stop, Find Match panel, Boss Room adapter, matchmaker.

edgegap-fishnet

Unity with FishNet end to end: headless server, Bayou/WebGL, matchmaker, end-to-end test.

edgegap-purrnet

Unity with PurrNet end to end: dedicated server, connect panel, matchmaker, end-to-end test.

edgegap-fusion

Unity with Photon Fusion 2 end to end: IL2CPP Linux server, server bound to 0.0.0.0, Edgegap deployment, BR200 kit.

edgegap-fusion-simplefps

Photon's Simple FPS sample on Edgegap dedicated servers.

edgegap-godot

Godot 4 with a Godot dedicated server: headless export, ENet or WebSocket, matchmaker.

edgegap-colyseus

Colyseus servers on Edgegap, direct or through the matchmaker.

edgegap-nakama

Nakama as the backend, starting Edgegap servers for its matches.

edgegap-playfab

PlayFab Matchmaking with Edgegap servers.

edgegap-threejs

Three.js and other browser games with their own Node.js server.

edgegap-matchmaking

Matchmaking design for any engine: who owns it, profiles, parties, region selection, backfill, third-party matchmakers.

edgegap-manus

Browser games built with Manus: backend matchmaking, Steam sign-in, signed join tokens, Node WebSocket server.

edgegap-unreal

Unreal Engine end to end: source engine, Linux server, matchmaker, end-to-end test.

edgegap-eos-voice

Voice chat for an Unreal game on Edgegap with EOS Voice: server-side room tokens, match and team rooms.

edgegap-server-design

Authoritative server design and the deployment lifecycle.

edgegap-containerize

The container contract, Dockerfiles, registries, app versions.

edgegap-local-testing

Parity tests on your machine, then one smoke-test deployment.

edgegap-troubleshoot

Pull errors, crash loops, out-of-memory, clients that can't connect.

edgegap-deployments-api

Backend code that deploys servers: webhooks, cleanup, Nakama, PlayFab, UGS, EOS.

edgegap-launch

Launch checklist, rollouts, caching, cost control.

They're served three ways, so every MCP client can reach them:

  • Tools: edgegap_list_skills and edgegap_get_skill, which loads a skill's SKILL.md, or one of its reference documents or templates with file.

  • Prompts: deploy-game-server ("Deploy my game server to Edgegap") is the place to start: it finds the engine and netcode, loads the matching skill and walks the golden path, cleanup included. There is also one prompt per skill, named after it. In Claude Code they show up as slash commands, e.g. /mcp__edgegap__deploy-game-server.

  • Resources: each skill's SKILL.md is listed, at edgegap-skill://<skill>/SKILL.md; every other file is read through the edgegap-skill://{skill}/{+path} template, e.g. edgegap-skill://edgegap-unity/references/deploy.md.

Each release bundles the skills at the commit pinned in scripts/skills-pin.txt; edgegap_context reports which pack is loaded. edgegap_list_skills also reads the latest pack version from GitHub (one version number, cached for an hour; EDGEGAP_SKILLS_CHECK=off turns it off) and says when a newer one is out, and edgegap_get_skill adds the same note under a skill's header.

Keeping installed skills current. If you also installed the skills in your agent (the Claude Code plugin edgegap@edgegap, npx skills add edgegap/llm-agent-skills, or folders copied into ~/.claude/skills), edgegap_update_skills compares each one with the latest on GitHub. On the local server it finds those installs itself; with apply: true it runs npx skills update (Edgegap skills only) or claude plugin update, and rewrites hand-copied skills from the files bundled in this release, keeping files you added and leaving symlinks and git checkouts alone. It never downloads skill text. The hosted server cannot see your disk: pass the versions you have loaded in installed_versions and it says which are behind and how to update them.

🧰 Tools

Your agent picks the right tool from your request. You don't need to name them, but knowing what's available helps you ask. Tools marked ● change something in your account, accept dry_run, and are hidden when EDGEGAP_READ_ONLY=1.

Tool

What it does

edgegap_context

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

edgegap_generate_dockerfile

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 -batchmode -nographics, Godot --headless), a non-root user for Unreal, and matching ports. Lists anything it had to assume so your agent can confirm it. Works for Unity, Unreal Engine, Godot, and any other engine.

edgegap_validate_server_config

Checks an existing Dockerfile, ports, resources, and image tag before you build. Catches ARM or Windows images (Edgegap runs linux/amd64), Unreal servers running as root, missing Unity -batchmode -nographics, servers bound to localhost, ports that don't match your netcode transport, and the latest tag.

edgegap_get_registry_credentials ●

Returns push credentials for your private Edgegap container registry, with the exact docker login, build, and push commands. Edgegap only gives these to the Unity/Unreal plugins' quick-start token; with a regular API token, it tells your agent to ask you for the login from the dashboard's Container Registry page instead.

edgegap_list_registry_tags

Confirms your image push landed before you register it. Takes the image name only, e.g. my-game-server: the project comes from your token.

edgegap_delete_registry_tag ●

Deletes one tag, and the image it points to, to clean up old builds. One exact tag per call; latest, wildcards and lists are refused.

Tool

What it does

edgegap_list_apps

Lists your applications.

edgegap_create_app ●

Creates an application.

edgegap_update_app ●

Turns an application on or off for new deployments.

edgegap_list_app_versions

Lists versions with their image, resources, ports (with TLS Upgrade), and whether a registry login is set.

edgegap_get_app_version

Reads one version in full: image, resources, ports, max duration, image caching, restart policy, and env var names (never values).

edgegap_create_app_version ●

Registers a container image as a deployable version. Supports TLS Upgrade on WS and HTTP ports, which browser (WebGL) clients need for wss://.

edgegap_update_app_version ●

Changes an existing version: a new image tag, on/off, CPU and memory (both together), max duration, registry login, image caching (force_cache), shutdown grace period, ports, env vars, and the Endpoint Storage its logs go to. Only the fields passed change, but ports and env replace the whole list. Running deployments keep the old settings.

edgegap_delete_app_version ●

Deletes one version, to clean up test versions. Refused while a deployment of it runs. The registry image is kept.

edgegap_delete_app ●

Deletes an application and its versions. Refused while any of its deployments runs, and while it has more versions than max_versions (default 0).

edgegap_list_locations

Lists the cities Edgegap deploys to, or, for one version, only those with capacity right now.

edgegap_list_ping_beacons

Lists the ping beacons game clients measure their latency to each region against.

edgegap_deploy ●

Deploys an authoritative dedicated server close to your players. Always tagged edgegap-mcp, and reports when Edgegap will stop it. Optional: CPU and memory for this deployment only, webhooks Edgegap calls when the server is ready, fails or ends, require_cached_locations for faster starts, and private_host_ids to place it on your private fleet first.

edgegap_list_fleet_hosts

Lists the hosts of one of your private fleets, with status and location, to deploy onto them.

edgegap_wait_for_deployment

Waits until the server is ready and returns the connection address.

edgegap_get_deployment

Reads a deployment's status.

edgegap_list_deployments

Lists running deployments, filtered by application, version, status, tags and more, and sorted by age. Finds servers left running; only_agent_deployments: true lists every one an agent started. See Filter Deployments.

edgegap_get_deployment_logs

Reads container logs and crash details while the deployment runs. After it stops, logs are only kept if Endpoint Storage was set up.

edgegap_get_deployment_metrics

Summarises CPU, CPU throttling, memory and network use (latest, average, peak), to size a version or check a crash.

edgegap_stop_deployment ●

Stops one deployment, by its exact request ID. No bulk stop.

edgegap_tag_deployment ●

Adds or removes tags on a running deployment, e.g. to mark a match. The edgegap-mcp tag stays.

edgegap_report_deployment ●

Reports a deployment to Edgegap with a reason, for a studio's moderation backend. It keeps running.

Logs and Files (Endpoint Storage)

Container logs disappear with the deployment unless they are exported to your own S3-compatible bucket.

Tool

What it does

edgegap_list_endpoint_storage

Lists your Endpoint Storage buckets and their pull profiles. Secret keys are never returned.

edgegap_create_endpoint_storage ●

Registers a bucket (AWS S3, Cloudflare R2, DigitalOcean Spaces…) for log export. Set endpoint_storage on a version to turn export on. The secret key is never echoed back.

edgegap_create_pull_profile ●

Copies a file or folder from the bucket into the container at boot (maps, configs, large assets).

edgegap_link_pull_profile ●

Links a pull profile to a version, or unlinks it.

edgegap_delete_pull_profile ●

Deletes one pull profile. The bucket and its files stay.

edgegap_delete_endpoint_storage ●

Deletes one Endpoint Storage; refused while it has pull profiles unless max_pull_profiles allows them. The bucket and its logs stay.

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

edgegap_create_relay_session ●

Creates a relay session for your players and returns the relay address and each player's authorization token.

edgegap_get_relay_session

Reads a relay session.

edgegap_list_relay_sessions

Lists open relay sessions, to find ones left running. No authorization tokens.

edgegap_authorize_relay_user ●

Adds a player who joins later.

edgegap_revoke_relay_user ●

Removes one player from a relay session.

edgegap_delete_relay_session ●

Closes a relay session.

WARNING

Deployments and relay sessions are billed while they run. Ask your agent to stop test deployments and delete test relay sessions when it's done.

Example Prompts

  • "Write a Dockerfile for my Unity server build, then push it and deploy a server near me."

  • "Check my Dockerfile for Edgegap and fix any problems."

  • "My deployment failed. Read the logs and tell me why."

  • "How much CPU and memory did my last match use? Size my version for it."

  • "My game uses host-client networking. Set up an Edgegap relay for two players."

🛡️ Guardrails

Your API token can do anything in your organization, so the server adds its own limits around what an agent does with it. They apply in both the local server and the hosted endpoint.

Guardrail

What it does

Dry run

Every tool that changes something takes dry_run: true: it returns the exact method, host, path and body, with the token, registry tokens and env values masked, and sends nothing. Local checks still run.

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 edgegap-mcp tag, even when the agent passes its own tags. edgegap_list_deployments with only_agent_deployments: true finds them all.

Auto-stop

Every deploy reports when Edgegap will stop it: the version's max_duration, capped at EDGEGAP_MAX_DURATION_MINUTES (default 60) for versions the agent creates. Edgegap has no per-deployment time limit, so deploying a version whose max_duration is above that ceiling or unlimited (a version made elsewhere defaults to 1440 minutes) is refused unless the agent passes allow_long_running: true, which it is told to do only after asking you.

Deploys per run

The local server sends at most EDGEGAP_MAX_DEPLOYS_PER_RUN (default 20) deploys per process, failed ones included, since a refused deploy can still create a deployment. When the API refuses a deploy but created one anyway, the error names it so the agent can stop it.

No moving image tags

edgegap_create_app_version refuses latest (any case), an empty tag, or a tag Docker would reject, with nothing sent: Edgegap caches images by tag, so a re-pushed tag can deploy a stale build. Deploying an existing version on latest is refused too, and so is asking for registry push commands for latest.

Image reference check

A docker_image that also holds a registry host, tag or digest (e.g. registry.edgegap.com/proj/server:v2) is refused, and the error gives the right docker_repository / docker_image / docker_tag split. edgegap_validate_server_config flags the same things.

Deployment cap

edgegap_deploy is refused while EDGEGAP_MAX_AGENT_DEPLOYMENTS (default 5) deployments tagged edgegap-mcp are already running, so a looping agent cannot pile up billing servers. The refusal says how to list and stop them.

Hidden secret env vars

Env vars whose names look like secrets (TOKEN, SECRET, PASSWORD, API_KEY, CREDENTIAL, AUTH…) are sent with is_hidden, so the dashboard does not show their values in plain text.

Strict stop

edgegap_stop_deployment stops one deployment by its exact request ID. Empty IDs, wildcards and lists are refused. There is no bulk stop. With EDGEGAP_STOP_OWN_ONLY=1, it only stops deployments tagged edgegap-mcp.

Careful deletes

edgegap_delete_app_version and edgegap_delete_app take one exact name, and are refused while a deployment of it is running. An application with versions is only deleted when max_versions covers them.

Webhook and bucket URLs

Deploy webhooks and Endpoint Storage endpoints must be https URLs without credentials, and are refused if they contain your API token.

Host on every result

Every result starts with the API host, e.g. [api.edgegap.com], or [custom · host] when EDGEGAP_BASE_URL points elsewhere. A base URL naming api.edgegap.com must be exactly https://api.edgegap.com, or the server refuses to start.

Redaction

The token is stripped from every error before it reaches the agent.

The server identifies itself with User-Agent: edgegap-mcp/<version> (<MCP client name>) on every API call.

Usage analytics. The local server and the self-hosted Docker image send nothing beyond the API calls themselves. The hosted endpoint at mcp.edgegap.dev uses PostHog MCP Analytics (@posthog/mcp) and sends usage events to Edgegap's PostHog: which MCP client connected, which tool, prompt or skill resource was used, the names (not values) of the arguments passed, whether a call succeeded, its error code, the stage it failed at and the Edgegap API status, how long it took, whether it was a dry run, a few facts about the call (how a wait for a deployment ended, a validation result, which skill was loaded), which golden-path step was reached, plus the server version and Cloudflare's country code. On a failed call it also sends the error message, after removing your token, the values of the arguments you passed, and anything shaped like a credential, an IP address or an ID, cut to 300 characters. Deployment IDs are only sent as a keyed hash. Only named metadata properties are let through. It never sends your token, tool argument values (IP addresses, env vars, app or image names) or results, and GeoIP is off. It adds no parameters to the tools. Events from one token are grouped under a keyed, non-reversible hash of it. The full list is in docs/analytics.md. To opt out, send the header X-Edgegap-Telemetry: off (or DNT: 1), or use the local server.

🚨 Troubleshooting

Review common error codes and learn how to unlock your integration.

401 Unauthorized

Your MCP integration is most likely not including the Authorization header correctly.

Tool Call Failed

Your client is missing an Edgegap token. This happens with claude.ai and Claude Desktop custom connectors, which can't send an Authorization header. See Claude Desktop and claude.ai for the alternative.

WARNING

This is a known limitation which will be resolved in the near term, stay tuned for updates!

403 Forbidden

Your MCP integration is likely using the template token or a deleted token. Please validate that the token value used by your integration matches exactly the token displayed in dashboard.

424 Image Could Not Be Pulled

Edgegap could not pull your container image. Check the repository, image name, and tag, and that the tag was pushed (ask your agent to list registry tags). For images in the Edgegap registry, the image name must include your project, e.g. my-project/my-game-server.

Registry Credentials Unavailable

Edgegap only gives registry credentials to the quick-start token the Unity and Unreal plugins use, so with a regular API token your agent can't retrieve them and asks you instead. Copy the Project, Username and Token from the dashboard under Container Registry, or push to another registry Edgegap can pull from (Docker Hub, GitHub, AWS ECR, GCP, GitLab). See External Registries.

"status": "empty" or "not_configured"

Not an error. A list with nothing in it (no applications yet, no deployments running, an image never pushed) or a feature this organization has not set up (relays, a registry this token cannot read) comes back as a normal result with status and a next_step. Your agent should do the next step instead of retrying.

No Token Yet

The skills (edgegap_list_skills, edgegap_get_skill), edgegap_context, edgegap_generate_dockerfile and edgegap_validate_server_config work without a token, so an agent can prepare the server build first. Create an account at app.edgegap.com and a token under User Settings → Tokens. edgegap_context with check_token: true says whether the session's token is present and accepted, and shows its last four characters so you can find it on that page.

Starts Locally but Not on Edgegap

Ask your agent to validate your server configuration, or to generate a new Dockerfile. The most common causes are an image built on Apple Silicon without docker build --platform linux/amd64, a server listening on a different port than the version exposes, or a UDP transport configured as TCP.

Other API Errors

Please consult our API Reference for possible error responses for individual API endpoints.

NOTE

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-mcp

Clients connect to http://<host>:8080/mcp with their own Authorization header, the same way they connect to the hosted endpoint. The image holds no credential, and /health answers without one. PORT, HOST, EDGEGAP_READ_ONLY, EDGEGAP_APP_ALLOWLIST, EDGEGAP_MAX_DURATION_MINUTES, EDGEGAP_MAX_AGENT_DEPLOYMENTS and EDGEGAP_STOP_OWN_ONLY apply; pass each with -e NAME=value. Never pass an API token to the container: each client sends its own on every request. Read worker/DECISION.md before exposing it beyond a private network.

Prebuilt images for linux/amd64 and linux/arm64 are published to ghcr.io/edgegap/llm-mcp-server (and, for existing setups, the old name ghcr.io/edgegap/edgegap-mcp), tagged main and sha-<commit> on every push to main, plus the version on v* tags:

docker run --rm -p 8080:8080 ghcr.io/edgegap/llm-mcp-server:main

Development

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:worker

To update the bundled skills to the latest commit of llm-agent-skills, then release as usual:

npm run sync-skills -- --ref main
npm run check-skills      # exit 1 if src/skills.generated.ts differs from the pin

Test

Covers

test/unit.test.mjs

Unit tests for the tag, image, secret-name, URL and redaction rules

test/package.mjs

Packaging: one bin, runtime dependencies, versions in step

test/skills.mjs

Skills over MCP: tools, prompts, resources, path safety, bundle matches the pin

test/smoke.mjs

Handshake, tool registration, read-only mode

test/guards.mjs

Local validation and allowlist enforcement

test/elicit.mjs

Token prompt: accept, refuse acknowledgement, decline, no support

test/newtools.mjs

Validator, Dockerfile generator, registry, deployments, relay and matchmaker tools against a local mock API

test/http.mjs

Self-hosted HTTP server: discovery without a token, per-request tokens, foreign credentials

test/spec.mjs

Every endpoint and request-body field the server sends is in spec/ (write tools checked by dry run)

test/snapshot.mjs

Tool names, descriptions, schemas and the instructions match test/tools.snapshot.json; npm run snapshot:update after a deliberate change

test/live-check.mjs

Not in npm test. Runs against the real API with a token from a non-production organization

Design decisions, the security model, and what's deliberately out of scope are in DESIGN.md.

Available Tools

43 tools
edgegap_authorize_relay_userAdd a player to a relay sessionA
Idempotent
Inspect

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.

NameRequiredDescriptionDefault
dry_runNoShow 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_ipYesPublic IP of the joining player.
session_idYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 configurationA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
inspectNoExpose the inspection API for debugging. Default true; turn off for production.
versionYesVersion the matchmaker deploys.
expansionsNoRule relaxations after a player has waited this long, e.g. [{after_seconds: 20, min_team_size: 1}]. Keep each below ticket_expiration. Not needed for partial matches: min_team_size below max_team_size already allows them. Expansions cost the matchmaker performance, so add one only to relax a rule.
team_countYesTeams per match. 1 for free-for-all or co-op.
applicationYesApplication the matchmaker deploys.
profile_nameYesProfile clients will queue into, e.g. "casual-2v2".
max_team_sizeYes
min_team_sizeYes
max_latency_msNoAdds a latency rule: drop players above this ping to the chosen region. Needs beacon pings from the client.
verify_versionNoLook up the application version first. Default true.
ticket_expirationNoDefault "30s", so a developer testing alone is matched or told to retry within 30 s instead of waiting minutes. Raise it only for production queues.
allowed_cors_originsNoOrigins 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_msNoMax ping spread between matched players. Default 100.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the readOnly/idempotent annotations by disclosing that it validates the referenced application version and its ports, that no resource is created server-side, and that a manual dashboard upload is required. The runtime note that each match spins up an authoritative dedicated server is useful context, though the shape of the returned JSON is not described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with what is generated, followed by the manual-upload caveat and a closing rationale. No filler, though the final sentence about dedicated servers is context rather than call-critical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter generator with no output schema, the description covers the essential contract: what it produces, what it verifies, and that creation happens outside the tool. It could go one step further in describing the returned artifact's contents, but the schema fills in the parameter-level detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 85%, so the input schema already carries most parameter meaning (expansions, latency, ticket_expiration, CORS). The description only gestures at the parameter set at a high level (team count/size, optional latency rule, expansions) without adding format or constraint detail beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and artifact: "Generate a ready-to-upload Edgegap matchmaker JSON configuration with one profile." It immediately lists the scope (team count/size, latency rule, expansions), so an agent knows exactly what this produces and how it differs from the deploy/version siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says what the tool does NOT do and why ("Edgegap has no API for creating a matchmaker, so this tool does NOT create one"), then gives the required next step: save the config and upload via the dashboard. It also tells when to add expansions and when they are unnecessary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_contextShow this Edgegap MCP server's configurationA
Read-onlyIdempotent
Inspect

Report which Edgegap API this server talks to, its version, whether it is the local or hosted server, and the guardrails in force: read-only mode, application allowlist, max_duration ceiling, the agent deployment cap, the tag forced onto every deployment, and which tools support dry_run. Also says whether this session has a usable token and, if not, why and how to fix it. Call it first when unsure what this session is allowed to do, before anything billable, or when tool calls fail with a token problem. Makes no API call unless check_token is true, and never shows the token.

NameRequiredDescriptionDefault
check_tokenNoMake one read-only API call (list one application) to confirm Edgegap accepts the token. Default false.

Output Schema

NameRequiredDescription
serverNo
api_hostNo
read_onlyNo
transportNo
guardrailsNo
skills_packNo
api_base_urlNo
forced_deploy_tagNo
max_duration_ceiling_minutesNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/openWorldHint/idempotent, and the description still adds real value beyond them: it discloses the conditional side effect ('makes no API call unless check_token is true') and the security guarantee ('never shows the token'). It also explains that failure paths return the reason and a fix, which is behavioral context the schema cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the primary resource (which API/version/mode), then guardrails, then the token note, then the call conditions. Dense but every clause carries information; the long guardrail list in the first sentence is the only mild bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema, full annotation coverage, and 100% parameter description coverage, the description supplies everything an agent needs: what it returns conceptually, when to call it, cost implications, and the token non-disclosure guarantee.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter already documents the one-read-only-call behavior. The description's 'makes no API call unless check_token is true' reinforces but does not extend the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Report') and enumerates exactly what is reported: API target, version, local vs hosted, guardrails, and token usability. No sibling tool does anything similar, so the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives three explicit trigger conditions: 'call it first when unsure what this session is allowed to do', 'before anything billable', and 'when tool calls fail with a token problem'. That is a clear when-to-use rule with concrete situations rather than vague advice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_create_appCreate an Edgegap applicationAInspect

Create a new application to hold game server versions. Only call this after edgegap_list_apps confirms no suitable application exists. Creating an application does not deploy anything — follow with edgegap_create_app_version.

NameRequiredDescriptionDefault
nameYesApplication name, 3-64 chars. Usually the game or project name.
dry_runNoShow 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_activeNoWhether deployments are allowed. Default true.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition ('Only call this after edgegap_list_apps confirms no suitable application exists') naming the alternative tool and the condition that selects it, plus the required follow-up step (edgegap_create_app_version). Both when-to-use and what-comes-next are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_create_app_versionCreate an application versionAInspect

Register a container image as a deployable version of an application. The image must already be pushed to a registry that Edgegap can pull from (see edgegap_get_registry_credentials and edgegap_list_registry_tags). Resource units: 1024 cpu units = 1 vCPU; memory_mb must be at least 256 and at most double the cpu units. Set verify_image true on the first version so a bad image fails here rather than at deploy time. Refused, with nothing sent, for the "latest" or an empty docker tag (use a build ID so deployments are reproducible) and for a docker_image that also holds a registry host or tag. Env vars named like secrets (TOKEN, SECRET, PASSWORD, API_KEY…) are hidden in the dashboard. When copying an existing version, copy only non-secret settings: the API returns "This value is set and encrypted" for its registry login and secret env values, and that placeholder is refused here.

NameRequiredDescriptionDefault
envNoEnvironment variables injected into the container. Values are never echoed back.
nameYesVersion identifier, typically a build ID or timestamp.
portsYesPorts to expose. At least one is required for players to connect.
dry_runNoShow 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_unitsYesvCPU units. 1024 = 1 vCPU.
memory_mbYesMemory in MB. At most 2x cpu_units.
docker_tagYesImage tag: a build ID, commit SHA or timestamp. "latest" and empty tags are refused.
applicationYesExisting application name.
docker_imageYesNamespaced image, e.g. "mystudio/game-server".
verify_imageNoVerify Edgegap can pull the image before accepting the version.
registry_tokenNoRegistry password or token.
endpoint_storageNoEndpoint Storage name (edgegap_list_endpoint_storage) to export container logs to when deployments end.
docker_repositoryYesRegistry host, e.g. "docker.io" or "registry.edgegap.com".
registry_usernameNoRegistry 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_minutesNoAuto-stop after this many minutes. Keeps test deployments from running up cost.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations only covering openWorld/idempotent/destructive, the description adds substantial operational detail: refusals happen 'with nothing sent' for 'latest'/empty tags and malformed docker_image, secret-named env vars are masked in the dashboard, and the 'This value is set and encrypted' placeholder is rejected. That tells the agent exactly what will silently fail before a billable call is made.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then prerequisites, then constraints and refusals — a logical order for a call-plan. It is dense and slightly over-packed in the middle (resource units, verify_image, tag refusal, env masking all in successive clauses), but almost every sentence carries a distinct constraint that isn't duplicated in structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter mutation with 8 required fields, no output schema and no enums, the description covers the prerequisites, the validation rules, the failure modes and the secret-handling caveat. An agent can construct a correct first call and anticipate the main rejections without further reference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3, but the description adds value the schema doesn't: the cpu-unit/memory relationship is restated as a hard constraint, docker_tag must be a build ID for reproducibility, and copying secrets fails on purpose. It does not mention several parameters (env structure, ports, endpoint_storage, max_duration_minutes) beyond the schema's own text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: 'Register a container image as a deployable version of an application.' That is clearly distinct from sibling tools like edgegap_update_app_version, edgegap_get_app_version and edgegap_list_app_versions; an agent knows this is the create path.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete routing context — 'see edgegap_get_registry_credentials and edgegap_list_registry_tags' for the image prerequisite, and tells the agent when to set verify_image true ('on the first version'). It never states the inverse (don't use this to modify an existing version; use update_app_version), so the exclusion against the closest sibling is left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_create_endpoint_storageCreate an Endpoint Storage (S3 bucket for logs)AInspect

Register an S3-compatible bucket (AWS S3, Cloudflare R2, DigitalOcean Spaces, ...) as Endpoint Storage, so container logs are exported there when deployments end. The developer supplies the bucket, endpoint URL and an access key pair scoped to that bucket; never invent or reuse other credentials, and never pass the Edgegap API token. The secret key is sent once and never echoed back. Then set endpoint_storage on the version (edgegap_update_app_version) to turn log export on.

NameRequiredDescriptionDefault
nameYesName for this storage, e.g. "game-logs".
bucketYesBucket name.
dry_runNoShow 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.
endpointYeshttps URL of the S3 endpoint, without the bucket, e.g. "https://s3.us-east-1.amazonaws.com".
access_key_idYesAccess key ID for the bucket.
output_formatNoLog file format. Default TEXT.
secret_access_keyYesSecret access key for the bucket. Never echoed back.
container_log_versionNov1 (default) writes one file per deployment; v2 streams chunks while it runs.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare openWorldHint/idempotentHint/destructiveHint; the description adds genuinely new behavior: the secret key is transmitted once and never echoed back, and credentials must be scoped to the bucket rather than reused. It still doesn't say what the call returns or whether a partial failure leaves registered storage behind.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero filler, ordered as purpose → credential constraint → next step. The security-critical 'never invent or reuse other credentials' line is placed before the activation instruction, which is where an agent should hit it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers what to supply, what not to supply, and how to activate log export afterwards — enough for an 8-parameter mutation tool with no output schema. The remaining gap is the return value (e.g. a storage ID or name to reference in update_app_version), which the absence of an output schema leaves unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all eight parameters including the enums for output_format and container_log_version. The description only reinforces credential semantics (bucket-scoped key pair) and never touches dry_run, output_format or container_log_version, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Register') and resource (an S3-compatible bucket as Endpoint Storage) and immediately explains the payoff: container logs exported there at deployment end. That scope plus the named provider examples clearly separates it from edgegap_list_endpoint_storage, edgegap_delete_endpoint_storage and edgegap_create_pull_profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the operational prerequisites (developer-supplied bucket, endpoint URL, bucket-scoped key pair, never the Edgegap API token) and the follow-up step: set endpoint_storage on the version via edgegap_update_app_version. It doesn't state when not to use this tool, e.g. reuse of existing storage or rotation flow, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_create_pull_profileCreate a pull profile (copy bucket files into containers)AInspect

Create a pull profile under an Endpoint Storage: at boot, Edgegap copies a file or folder from the bucket into the container (maps, configs, large assets kept out of the image). It does nothing until linked to a version with edgegap_link_pull_profile. Avoid destination paths the image already uses.

NameRequiredDescriptionDefault
nameYesName for the profile, e.g. "maps".
sourceYesPath in the bucket, starting with "/" and without a trailing "/", e.g. "/maps" or "/config/server.json". Letters, digits, "_", "-", "+" and "." only.
dry_runNoShow 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.
destinationYesAbsolute path in the container, e.g. "/data/maps".
source_typeYesWhether source is a file or a folder.
endpoint_storageYesEndpoint Storage name, from edgegap_list_endpoint_storage.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare openWorldHint=true, idempotentHint=false and destructiveHint=false, so the safety profile is already covered. The description adds genuinely non-redundant behavior: the profile is inert until linked, and destination collisions with image paths should be avoided. It stops short of saying what a successful call returns or how duplicate names are handled, which matters for a non-idempotent create.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short clauses, front-loaded with the verb and the mechanism, followed by the lifecycle dependency and the one operational caution. No filler and nothing repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter create with full schema coverage and no output schema, the description covers the two things an agent can't infer structurally: the profile is inert until linked, and destination paths can shadow image content. Only the return value / how to reference the created profile for linking is left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (including source path syntax, source_type enum, and dry_run) is already documented at the field level. The description only adds the destination-collision caveat, which is marginal extra meaning. Baseline 3 is correct when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Create a pull profile') and immediately explains the mechanism: at boot, files are copied from an Endpoint Storage bucket into the container. The parenthetical use-case examples (maps, configs, large assets kept out of the image) make the concept unmistakable and differentiate it from the storage-creation siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the key prerequisite explicitly: the profile 'does nothing until linked to a version with edgegap_link_pull_profile', which routes the agent to the follow-up tool. It also adds a caution ('Avoid destination paths the image already uses'). What it lacks is guidance relative to edgegap_create_endpoint_storage (must that exist first?) or when to prefer baking files into the image instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_create_relay_sessionCreate a relay session (host-client games only)AInspect

A relay is NOT a game server and is not the recommended default — for a multiplayer match, deploy an authoritative dedicated server with edgegap_deploy instead. A relay only forwards traffic between players while one player's game acts as host and owns the game state: the host can cheat and has a latency advantage, the host's PC and connection cap the match, and the match ends if the host quits. Only use this when the developer has chosen peer-to-peer/host-client, or the netcode is already a listen server and a dedicated server is not an option; if that has not been established, ask first. Never pick it only because it needs no server image. Creates an Edgegap relay session for every player's public IP, host first, waits until it is ready, and returns the relay address plus per-player authorization tokens for the relay transport. Relay sessions are billed while open: delete test sessions with edgegap_delete_relay_session when finished.

NameRequiredDescriptionDefault
dry_runNoShow 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_ipsYesPublic IP of each player, host first. Add late joiners with edgegap_authorize_relay_user.
webhook_urlNoCalled when the session is ready.
timeout_secondsNoDefault 30.
wait_until_readyNoPoll until the relay is assigned. Default true.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use it ('developer has chosen peer-to-peer/host-client', listen-server netcode) and when not ('not the recommended default', 'Never pick it only because it needs no server image'), names the preferred alternative (edgegap_deploy), and adds a fallback instruction to ask first if the netcode hasn't been established.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_delete_appDelete an application and all its versionsA
DestructiveIdempotent
Inspect

Delete one application and every version under it, to clean up a test application. Exactly one exact name; refused while any of its deployments is running, and refused when it has more versions than max_versions (default 0: delete its versions first with edgegap_delete_app_version, or raise max_versions after the developer agreed). Registry images are not touched. Cannot be undone.

NameRequiredDescriptionDefault
dry_runNoShow 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.
applicationYesThe exact application name to delete.
max_versionsNoDelete only if it has at most this many versions. Default 0.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint and idempotentHint, and the description adds materially beyond them: irreversibility ('Cannot be undone'), the blast radius (all versions, but registry images untouched), and the two guard conditions that cause failure. This is exactly the context an agent needs before a destructive call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Effectively one dense, front-loaded sentence with zero filler, but the parenthetical remedy clause makes it slightly hard to scan. Every clause still carries information, so it is close to optimal despite the density.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive 3-parameter tool with no output schema, the description covers scope, prerequisites, failure modes, side-effect boundaries, and irreversibility. Nothing an agent needs in order to call it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description goes further by explaining the semantics of max_versions (default 0 means refuse if any versions exist, with the two remedies) and stressing that application must be an exact name. dry_run is left to its own schema description, hence not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (delete) and resource (one application plus every version under it) and frames the intent (clean up a test application). It is clearly distinguished from the sibling edgegap_delete_app_version, which is named as the narrower alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit preconditions and refusal conditions: refused while any deployment is running, and refused when versions exceed max_versions. It names the alternative tool (edgegap_delete_app_version) and the escalation path (raise max_versions after developer agreement), so the agent knows exactly what to do when blocked.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_delete_app_versionDelete one application versionA
DestructiveIdempotent
Inspect

Delete one version of an application, to clean up test versions. Exactly one exact version name; refused while any deployment of that version is running. The container image stays in the registry (edgegap_delete_registry_tag removes it). Cannot be undone, so confirm with the developer when the version is not one this conversation created.

NameRequiredDescriptionDefault
dry_runNoShow 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.
versionYesThe exact version name to delete.
applicationYesApplication name.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it destructive/idempotent/openWorld, but the description adds real value beyond them: the running-deployment refusal, that the image is retained in the registry, and that the action is irreversible requiring confirmation. These are operational traits not encoded in annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action and scope, then layers in the refusal condition, alternative, and irreversibility. Every sentence carries information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description covers safety, refusal behavior, and consequence of deletion thoroughly enough for a destructive single-target operation. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both required parameters and their meanings are already documented. The description's 'Exactly one exact version name' reinforces the version parameter's exactness but adds little beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete one version of an application') and scopes it to a single exact version. It distinguishes itself from siblings by explicitly naming edgegap_delete_registry_tag for the image and implying it differs from delete_app.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the use case ('clean up test versions'), an explicit refusal condition ('refused while any deployment of that version is running'), and routes the agent to the alternative for the container image. Confirmation guidance when the version wasn't created in-conversation adds clear when-to-be-cautious direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_delete_endpoint_storageDelete an Endpoint StorageA
DestructiveIdempotent
Inspect

Delete one Endpoint Storage, to clean up a test one. Exactly one exact name; refused when it still has more pull profiles than max_pull_profiles (default 0: delete them first with edgegap_delete_pull_profile, or raise max_pull_profiles after the developer agreed). Versions that export logs to it stop doing so, so confirm with the developer when the storage is not one this conversation created. The bucket and the logs already in it are not touched. Cannot be undone.

NameRequiredDescriptionDefault
dry_runNoShow the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it.
endpoint_storageYesThe exact Endpoint Storage name to delete.
max_pull_profilesNoDelete only if it has at most this many pull profiles, which go with it. Default 0.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive/idempotent/openWorld, but the description goes further: it discloses the refusal guard, the cascade effect that exporting versions stop exporting, that the bucket and existing logs survive, and that the operation is irreversible. That is exactly the extra context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb and the primary target, and every sentence carries operational content with no filler. The middle sentences are dense and slightly clause-heavy, which costs a point on readability but not on usefulness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter destructive tool with no output schema, it covers the guard conditions, side effects, irreversibility, escalation path, and the safety valve (dry_run is documented in the schema). Nothing an agent needs before calling is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the name must be an exact single name, and max_pull_profiles carries a coupled semantics (profiles go with the storage; default 0 blocks deletion). It does not spend words repeating dry_run, which the schema already explains well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete one Endpoint Storage') plus the intended scenario ('to clean up a test one'). It also contrasts with edgegap_list_endpoint_storage / create siblings implicitly by being the removal counterpart and names edgegap_delete_pull_profile as a different action, so an agent can place it precisely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives the preconditions and the fallback paths: refused when pull profiles exceed max_pull_profiles, then either delete them with edgegap_delete_pull_profile or raise the threshold 'after the developer agreed'. It also says when to confirm with the developer before deleting a storage this conversation did not create.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_delete_pull_profileDelete a pull profileA
DestructiveIdempotent
Inspect

Delete one pull profile from an Endpoint Storage, to clean up a test profile. Exactly one exact name. Every version linked to it stops getting its files at boot (the API cannot list those links, so ask the developer when the profile is not one this conversation created). The bucket and its files are not touched. Cannot be undone.

NameRequiredDescriptionDefault
dry_runNoShow the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it.
pull_profileYesThe exact pull profile name to delete.
endpoint_storageYesEndpoint Storage name, from edgegap_list_endpoint_storage.

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the destructiveHint/idempotentHint annotations by disclosing the cascade effect (every linked version stops getting its files at boot), an API blind spot (linked versions cannot be listed), and what is explicitly left intact (the bucket and its files). That is exactly the risk information an agent needs before a destructive call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action and scope, then layers consequences and caveats; nearly every clause carries information. The parenthetical about the API's inability to list links is dense but justified. Minor redundancy between "Cannot be undone" and the destructive annotation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive 3-parameter tool with no output schema, the description covers side effects, irreversibility, and a safety precondition, leaving only the response shape unstated. Little else an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters are already documented, including the dry_run escape hatch. The description only reinforces that the name is exact and singular ("Exactly one exact name"), which the schema already states, so it adds little beyond baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Delete one pull profile from an Endpoint Storage") and implicitly carves itself out from edgegap_delete_endpoint_storage by noting "The bucket and its files are not touched." It does not name sibling tools explicitly, but the scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear context ("to clean up a test profile") and a concrete prerequisite caveat: consult the developer when the profile was not created in this conversation, because the API cannot list links. It stops short of naming an alternative tool or a when-not-to-use rule beyond that caveat.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_delete_registry_tagDelete one image tag from the Edgegap registryA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
tagYesThe exact tag to delete, e.g. "build-41".
dry_runNoShow 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_nameYesThe image name only, e.g. "my-game-server", as for edgegap_list_registry_tags.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint and idempotentHint, but the description adds what is actually destroyed (the tag and its underlying image), that deletion is irreversible, and the downstream consequence that versions pinned to the tag can no longer start deployments. That is substantive context beyond the safety flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

What-it-does and scope lead, followed by input constraints, then the pre-check and irreversibility warning. Four dense sentences with no filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, three-parameter tool with no output schema, the description supplies the consequence of deletion, the rejection rules, and the recommended pre-verification step. Nothing an agent needs to avoid a bad call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description goes beyond it by constraining values to exactly one image name and one exact tag, rejecting wildcards/lists/"latest". It stops short of documenting dry_run or the naming format, which the schema handles alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Delete one tag, and the image it points to") scoped to this organization's registry, and names the operational goal ("clean up old builds"). Clearly distinguishable from sibling edgegap_list_registry_tags, which the schema even cross-references.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition ("check edgegap_list_app_versions first"), enumerates what will be refused (wildcards, lists, "latest", bulk delete), and states the intended use case. An agent knows both when to call it and what inputs will fail.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_delete_relay_sessionDelete a relay sessionA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
dry_runNoShow 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_idYesThe exact session_id of the one session to delete, e.g. "0724828881e2-S".

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete when-to-use rule (delete every test session you created before ending your task), which is real workflow guidance. It stops short of naming alternatives or stating when-not to use, so it is clear context rather than full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_deployDeploy a game serverAInspect

Start one authoritative dedicated game server from an application version, placed near the players you specify. This is the recommended way to host a multiplayer match: the server owns the game state, so no player hosts it. Returns immediately with a request_id; the server is still starting and has no connection details yet. Follow this call with edgegap_wait_for_deployment to get the address players connect to. Always stop deployments you started for testing. Every deployment is tagged "edgegap-mcp" in addition to any tags you pass, so edgegap_list_deployments with only_agent_deployments: true finds them all. Runs until stopped or until the version's max_duration, which the result reports. Refused, with nothing sent, if the API token appears in an env var or tag, if the version uses the "latest" docker tag, or when too many agent deployments are already running (EDGEGAP_MAX_AGENT_DEPLOYMENTS, default 5): stop finished ones first. Also refused when the version's max_duration is unlimited or above EDGEGAP_MAX_DURATION_MINUTES, unless allow_long_running is true (ask the developer first), and on the local server after EDGEGAP_MAX_DEPLOYS_PER_RUN deploys (default 20). Env vars named like secrets are hidden in the dashboard. Optional: webhooks Edgegap calls when the server is ready, errors or ends (instead of polling), require_cached_locations for faster starts, and private_host_ids to place it on your private fleet first.

NameRequiredDescriptionDefault
envNoEnvironment variables for this deployment only. Values are never echoed back.
tagsNoExtra tags for filtering later, e.g. ["agent-test"]. "edgegap-mcp" is always added.
usersYesWhere the players are. Exactly one of these two is required.
dry_runNoShow 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.
versionYesVersion name within the application.
cpu_unitsNoOverride the version's CPU for this deployment only, with memory_mb. 1024 = 1 vCPU.
memory_mbNoOverride the version's memory for this deployment only, with cpu_units. At most 2x cpu_units.
applicationYesApplication name.
private_host_idsNoPrivate fleet host IDs to try first, in order (from edgegap_list_fleet_hosts); Edgegap overflows to its cloud when they are full. Omit for a normal cloud deployment.
webhook_on_errorNohttps URL Edgegap POSTs to when the deployment fails.
webhook_on_readyNohttps URL Edgegap POSTs to when the server is ready.
allow_long_runningNoDeploy even though the version's max_duration is unlimited or above EDGEGAP_MAX_DURATION_MINUTES. Only after the developer agreed: the server bills until it is stopped or that limit.
webhook_on_terminatedNohttps URL Edgegap POSTs to when the deployment ends.
require_cached_locationsNoOnly place it where the image is already cached: starts faster, fewer places to choose from. Needs force_cache on the version (edgegap_update_app_version); without it the API refuses the deploy.

Output Schema

NameRequiredDescription
tagsNo
statusNo
warningNo
auto_stopNo
next_stepNo
resourcesNo
request_idNo
auto_stop_after_minutesNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: discloses the async return (request_id, no connection details yet), the auto 'edgegap-mcp' tag, lifecycle (runs until stopped or max_duration), billing implications, secret-env-var hiding, and multiple refusal conditions (token in env, 'latest' docker tag, concurrent-deploy caps, max_duration limits, local per-run cap). This is unusually rich behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose and the async/next-step behavior before restrictions. It is dense and long, but for a 14-parameter tool with many guardrails most sentences earn their place; a slight trim of the restriction run-on would help.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so it needn't explain return structure, and the description still covers the immediate return (request_id) and next-step tool. Given complexity, annotations, and schema richness, nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the schema already documents all 14 params, but the description adds real meaning: webhooks as a polling alternative, require_cached_locations for faster starts, private_host_ids placement order, and secret-env-var hiding. It complements rather than repeats the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start one authoritative dedicated game server from an application version') and clarifies placement near specified players. The distinction from hosting-vs-player-hosted is clear, and it is easy to tell apart from relay/session siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames this as 'the recommended way to host a multiplayer match' and directs the next step ('Follow this call with edgegap_wait_for_deployment'). It also adds operational guidance ('Always stop deployments you started for testing') and names the tool that finds these deployments.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_generate_dockerfileGenerate a game server DockerfileA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
portsNoPorts the server listens on. Default: 7777, with the protocol the netcode uses (UDP if unknown).
engineYesGame engine of the server build.
netcodeNoNetworking 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_imageNoDefault "ubuntu:22.04".
build_pathNoServer build folder, relative to where docker build runs. Defaults: unity "Builds/EdgegapServer", unreal "." (run from inside the packaged LinuxServer folder), godot "build".
executableNoFile 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_argsNoExtra server arguments, one per entry, e.g. ["-log", "-port=7777"].

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 versionA
Read-only
Inspect

Read one version in full: image, resources, ports, max_duration, whether image caching (force_cache) and verify_image are on, restart policy, the Endpoint Storage its logs go to, and the names of its env vars (values are never shown). Use it before edgegap_update_app_version or edgegap_deploy to check what a version will do.

NameRequiredDescriptionDefault
versionYesVersion name, as listed by edgegap_list_app_versions.
applicationYesApplication name.

Output Schema

NameRequiredDescription
envNo
nameNo
imageNo
portsNo
activeNo
warningNo
auto_stopNo
cpu_unitsNo
memory_mbNo
applicationNo
force_cacheNo
verify_imageNo
restart_policyNo
caching_percentNo
endpoint_storageNo
max_duration_minutesNo
auto_stop_after_minutesNo
registry_credentials_setNo
termination_grace_period_secondsNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only and open-world hints, so the description's added value is the disclosure that env var values are never returned — a meaningful safety/redaction detail an agent needs. It also scopes the read ('one version in full'), though it says nothing about rate limits or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler. The payload contents come first and the usage cue comes second, so the most selection-relevant information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the field enumeration is partly redundant, but it usefully doubles as a selection aid. Safety is covered by annotations and the env-var redaction note. Nothing critical is missing, though it could note that this is the only way to inspect a single version's config.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both 'application' and 'version' documented, including a pointer to edgegap_list_app_versions for valid version names. The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('Read one version in full') and then enumerates exactly what is returned: image, resources, ports, max_duration, cache flags, restart policy, Endpoint Storage, env var names. That enumeration distinguishes it cleanly from edgegap_list_app_versions and edgegap_create_app_version without needing the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to reach for it: 'Use it before edgegap_update_app_version or edgegap_deploy to check what a version will do.' That names the downstream siblings and the decision point. It stops short of stating exclusions (e.g., 'use list_app_versions to browse'), so it is a strong 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_get_deploymentGet deployment statusA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
request_idYesThe request_id returned by edgegap_deploy.

Output Schema

NameRequiredDescription
fqdnNo
errorNo
portsNo
readyNo
statusNo
runningNo
versionNo
locationNo
next_stepNo
public_ipNo
request_idNo
applicationNo
error_detailNo
elapsed_secondsNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already confirm it is a read-only operation (readOnlyHint: true). The description adds behavioral context by stating that the status is delivered only 'once it is ready' and detailing the data returned (connection address and ports), which enhances transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is highly concise, using two short, impactful sentences. The most crucial information—the operational constraint and the sibling tool recommendation—is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the operational lifecycle of the tool, explaining both what the tool provides (status, ports) and how it should be used in practice (avoid manual loops). Given the high schema coverage, this provides maximum value without redundancy.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema coverage is 100%, providing a solid baseline. The description does not add unique semantic meaning to the required 'request_id' beyond its role in retrieving status, but it frames the context of that ID perfectly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description precisely states that the tool reads the 'current status' of a deployment, specifying that it includes connection address and ports. By mentioning 'one deployment,' it defines the scope, and it clearly sets this tool apart from the waiting tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides extremely clear usage guidance by advising against manual polling loops. It explicitly recommends the alternative tool, edgegap_wait_for_deployment, for newly created deployments, effectively directing the agent on the optimal call pattern.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_get_deployment_logsGet container logs for a deploymentA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
request_idYesThe request_id of the deployment.
max_charactersNoTruncate logs to this length (500-50000), keeping the tail. Default 8000.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint and openWorldHint annotations already cover the safety profile, and the description adds valuable context about crash output and retention for stopped deployments. It does not contradict the annotations and adds operational insight beyond them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core action, followed by usage guidance and a retention caveat. Every sentence adds useful information without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only log retrieval tool with full schema coverage and annotation safety hints, the description is complete enough. It covers purpose, when to call it, output content, and the stopped-deployment retention caveat.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so request_id and max_characters are already documented. The description adds little parameter-specific meaning beyond saying it retrieves deployment logs, which makes the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: retrieving stdout/stderr and crash output for a deployment. It clearly distinguishes the tool's content from generic deployment lookup siblings, though it does not explicitly name when to use it instead of edgegap_get_deployment or edgegap_get_deployment_metrics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear trigger: call this whenever a deployment errors or a server exits unexpectedly. The rationale about crash exit codes is useful, but it does not mention explicit alternatives or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_get_deployment_metricsGet CPU, memory and network use of a deploymentA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
stepNoAveraging step, e.g. "30s" or "5m". Default: the API's.
end_timeNoISO 8601. Default: now, or when it stopped.
request_idYesThe request_id of the deployment.
start_timeNoISO 8601. Default: when the deployment started.

Output Schema

NameRequiredDescription
cpuNo
noteNo
memoryNo
totalsNo
request_idNo
network_receiveNo
network_transmitNo
cpu_throttle_rateNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered; the description adds real value by stating the return shape (latest/average/peak with the API's own labels) and the default window (whole life of the deployment). It omits any note on data availability/retention or rate limits, which is the remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler: the first front-loads what the response contains, the second gives use cases and the default window. Every clause earns its place and the most decision-relevant information comes first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and read-only annotations, the description need only frame intent and scope, which it largely does, including the default window and metric shape. It could add one line on when metrics become available for a deployment or on step-size tradeoffs, but nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so step, start_time, end_time and request_id are already fully documented in the schema. The description only restates the default time window, adding no syntax or format detail beyond what the schema says; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ("Summarise") plus resource ("a deployment's resource use over time") and an enumeration of the exact signals returned: CPU, CPU throttling, memory, network, each as latest/average/peak. This clearly separates it from sibling reads like edgegap_get_deployment, edgegap_get_deployment_logs, and edgegap_wait_for_deployment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives two concrete motivating scenarios: sizing a version (cpu_units, memory_mb) from a real match, and diagnosing whether a crash was memory or CPU starvation before redeploying. It stops short of naming the sibling alternative (logs) that would pair with the crash-diagnosis case, so there is no explicit when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_get_registry_credentialsGet Edgegap container registry push credentialsA
Idempotent
Inspect

Get the push login for this organization's private Edgegap container registry (registry.edgegap.com) and the exact docker login, build and push commands for your image. Use this when the server image is not in a registry yet. Edgegap only hands these credentials to the quick-start token the Unity/Unreal plugins use; with a regular API token this tool cannot fetch them and instead returns the steps to copy them from the dashboard's Container Registry page — ask the developer for them then, do not retry. When it does return a token, it is registry-scoped (push/pull images in this project), not the org API token: pass it to docker login via --password-stdin, never as a command-line argument, and do not write it into files. Call edgegap_validate_server_config before building. Any other registry Edgegap can pull from (Docker Hub, GHCR, ECR, GitLab) works too: then skip this tool and pass that registry and its pull login to edgegap_create_app_version.

NameRequiredDescriptionDefault
tagNoUnique build tag for the commands, e.g. a build ID. Never "latest".
image_nameNoImage name without project or tag, e.g. "my-game-server". Used to build the commands.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false): discloses that credentials are only available with the quick-start token, that a regular API token returns steps instead and should not be retried, that the returned token is registry-scoped, and how to handle it securely (--password-stdin, not in files).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and immediate usage condition. Every sentence adds actionable context (auth caveat, token handling, validation step, alternative registries) without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (token scoping, conditional availability, security-sensitive handling) and absence of an output schema, the description covers all critical operational details an agent needs to call it correctly and handle the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents 'tag' and 'image_name' fully. The description adds no parameter-specific syntax or meaning beyond what the schema provides; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get) and resource (push login for the private Edgegap container registry), including the registry domain. Distinguishes from siblings like edgegap_list_registry_tags and edgegap_create_app_version by focusing on credential retrieval for image push.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use: 'Use this when the server image is not in a registry yet.' Also names alternatives and exclusions: if using Docker Hub, GHCR, ECR, or GitLab, skip this tool and pass the registry to edgegap_create_app_version. Guides to call edgegap_validate_server_config before building.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_get_relay_sessionGet a relay sessionA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
session_idYesReturned by edgegap_create_relay_session.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 skillA
Read-onlyIdempotent
Inspect

Load one Edgegap agent skill: its SKILL.md (the workflow to follow) by default, or one of its reference documents or templates with file. Load the skill that matches the project before acting (the server instructions and edgegap_list_skills say which; "edgegap" when unsure), then fetch the references and templates it points to as you reach them. No API call.

NameRequiredDescriptionDefault
fileNoA file inside the skill, e.g. "references/deploy.md" or "assets/docker/Dockerfile". Default SKILL.md.
skillYesSkill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-matchmaking, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-relays, edgegap-server-design, edgegap-threejs, edgegap-troubleshoot, edgegap-unity, edgegap-unreal.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false, and the description reinforces this with "No API call", clarifying that this is a local content fetch rather than a remote Edgegap request. It also discloses the default resolution behavior (SKILL.md when file is omitted) and the incremental-fetch pattern. It stops short of saying what happens with an unknown skill or file name (error vs. empty), which is the one behavioral gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what the tool returns, then the selection rule, then the progressive-fetch instruction; no sentence is filler. The nested parenthetical about server instructions and edgegap_list_skills is slightly dense but carries real routing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so: the agent knows it receives SKILL.md workflow content or a named reference/template. For a two-parameter read tool this is essentially complete, with only failure-mode behavior left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds genuine selection guidance beyond the field types: which skill to pick, what to do when unsure, and that file is used to reach reference/template documents the SKILL.md points to. That converts the schema's enumerated names into an actionable selection policy.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Load one Edgegap agent skill: its SKILL.md ... or one of its reference documents or templates with file" names a specific verb (load), a specific resource (skill file), and the two modes of the call. It is cleanly separable from edgegap_list_skills (enumeration) and edgegap_update_skills (mutation) without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit sequencing: "Load the skill that matches the project before acting", with the selection authority named (server instructions and edgegap_list_skills) and a concrete fallback ("edgegap" when unsure). It also says to fetch references and templates only as you reach them, which tells the agent how to descend the skill tree rather than dumping everything up front.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_list_appsList Edgegap applicationsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
pageNo
limitNoResults per page, 1-100. Default 50.

Output Schema

NameRequiredDescription
totalNo
showingNo
next_stepNo
truncatedNo
applicationsNo

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds the organizational scope (whole org, no filtering) which is useful, but says nothing about pagination behavior or result volume, which matters for a list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action, then workflow guidance, then a definition. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values need no explanation, and the tool is a simple read. The only real gap is pagination/parameter behavior, which lowers it from a 5 for a tool that returns potentially large org-wide lists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%: 'limit' is documented, but 'page' has no description anywhere. The description adds no parameter guidance at all—no mention of paging, default page size, or how to iterate results—so it fails to compensate for the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (applications in the Edgegap organization), and additionally defines what an 'application' is versus the sibling version tools: 'groups versions of one game server'. An agent can distinguish this from edgegap_list_app_versions without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Start here before creating or deploying anything, so you reuse an existing application instead of making a duplicate' gives a clear precondition and intent, effectively routing the agent away from edgegap_create_app. It stops short of naming the sibling explicitly or saying when not to call it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_list_app_versionsList versions of an applicationA
Read-only
Inspect

List the versions under an application, with their container image, resources, ports (including whether TLS Upgrade is on, which browser/WebGL clients need for wss://) and whether a registry login is set for pulling the image. Use this to find the version name to deploy, to check a version is ready before deploying, or to copy the non-secret settings (image, resources, ports) of a working version when creating a new one. The registry login and secret env values are never readable: the API returns "This value is set and encrypted" for them, so get them from the dashboard's Container Registry page or the developer.

NameRequiredDescriptionDefault
applicationYesApplication name, as returned by edgegap_list_apps.

Output Schema

NameRequiredDescription
totalNo
showingNo
versionsNo
next_stepNo
truncatedNo
applicationNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, and the description adds substantial context beyond them: registry logins and secret env values are never returned, the API substitutes the literal string "This value is set and encrypted", and the agent is told where to get the real values (dashboard Container Registry page or the developer). That is exactly the kind of behavioral caveat that prevents dead-end calls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The returned fields and the deploy-readiness workflow are front-loaded, and the secret-redaction caveat follows logically. The WebGL/wss parenthetical about TLS Upgrade is informative but slightly more detail than an agent needs to select the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a single-parameter read tool with an output schema, so return values need no explanation — yet the description still flags which returned fields matter and which are redacted. Nothing needed to call it correctly or interpret the response is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter and schema coverage is 100%, with the schema itself noting it is the application name as returned by edgegap_list_apps. The description adds nothing further about the parameter (no format, casing, or lookup caveats), so the schema carries the full load — the baseline 3 for high coverage applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the versions under an application') and enumerates what each entry contains (image, resources, ports, TLS Upgrade flag, registry-login status), which clearly separates it from edgegap_get_app_version's single-version read. It never names the sibling tools explicitly, so the list-vs-get distinction is inferred rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives three concrete usage scenarios: finding the version name to deploy, checking a version is ready before deploying, and copying non-secret settings when creating a new version — the last effectively routes to edgegap_create_app_version. No explicit 'don't use this when...' or named alternative (e.g., get_app_version for a single known version) is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_list_deploymentsList running deploymentsA
Read-only
Inspect

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"]).

NameRequiredDescriptionDefault
limitNo1-100. Default 50.
filtersNoOmit for all deployments.
order_byNoe.g. [{field:"created_at",order:"asc"}] for oldest first.
only_agent_deploymentsNoOnly deployments started through this server: tagged "edgegap-mcp", or "mcp" by versions up to 0.3.3. Cannot be combined with a tags filter.

Output Schema

NameRequiredDescription
totalNo
showingNo
next_stepNo
truncatedNo
deploymentsNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds real behavioral context beyond that: the cost/orphan risk and the equivalence of only_agent_deployments to a tags filter (with a note about versions up to 0.3.3). It could still say more about pagination limits beyond the schema, but this is strong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and when-to-use are front-loaded, and every sentence carries constraint information. It is dense and the operator rules run long, but little is wasted. Slightly sprawling for a single paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. All four parameters, their interactions, and the usage context are covered adequately. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds substantial meaning the schema does not: which operators apply per field, ilike only on fleet_name/host_name, in/nin requiring array values, created_at restricted to eq/gte/lte, and the one-filter-per-field constraint. This is genuinely additive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list active deployments) plus scoping (optionally filtered and sorted). An agent can immediately distinguish this from edgegap_get_deployment (single) and edgegap_deploy (create). The scope is precise.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the use case: find deployments left running from earlier sessions before starting new ones, warning that orphaned servers cost money. It also gives a targeted mode (only_agent_deployments) for agent-started deployments, effectively directing the agent when to use which variant.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_list_endpoint_storageList Endpoint Storage and pull profilesA
Read-only
Inspect

List the organization's Endpoint Storage: S3-compatible buckets Edgegap exports container logs to when a deployment ends (so logs survive the deployment), and the pull profiles under each, which copy files from the bucket into a container at boot. Secret keys are never returned. A version uses a storage for logs through edgegap_create_app_version / edgegap_update_app_version endpoint_storage, and a pull profile through edgegap_link_pull_profile.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Read-only and open-world behavior are already covered by annotations, and the description adds meaningful context beyond them: it explains what endpoint storage is for, that pull profiles copy files at container boot, and that secret keys are never returned. It does not cover pagination or response shape, but the security and domain behavior disclosure is strong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then briefly explains the two resource types, security handling, and related tools. Every sentence contributes useful context without repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list tool with no output schema, the description provides enough domain context about what is listed, the relationship between buckets and pull profiles, and the security constraint around secret keys. An agent can confidently select and invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is no parameter semantics to document and the baseline is 4. The description does not need to compensate for missing schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb, 'List', and precisely defines the two resources returned: Endpoint Storage buckets and the pull profiles under each. It explains the domain concepts well enough that an agent can distinguish this read operation from sibling create/delete/link tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives useful context by explaining that endpoint storage is attached via edgegap_create_app_version / edgegap_update_app_version and pull profiles via edgegap_link_pull_profile, which helps the agent understand where this listing fits. However, it does not explicitly say when to call this tool versus alternatives, nor does it state exclusions such as 'use this before linking' or 'this does not create resources'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_list_fleet_hostsList the hosts of a private fleetA
Read-only
Inspect

List the hosts in one of the organization's private fleets (dedicated machines Edgegap manages for you), with status, IP and location. Only ACTIVE hosts accept deployments. Pass their host_id values to edgegap_deploy as private_host_ids to place a server on them first. Organizations without private fleets get an error from the API.

NameRequiredDescriptionDefault
fleet_nameYesThe private fleet name, as shown in the dashboard.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds genuinely useful behavior: status filtering semantics ('only ACTIVE hosts accept deployments') and the failure mode for orgs without fleets. It stops short of describing pagination or the shape/ordering of the returned host list, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the core action, followed by the operational constraint, the downstream call, and the error case. Nothing is repeated and every sentence carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description names the returned fields (status, IP, location), the key filtering concept, the hand-off to edgegap_deploy, and the failure condition. For a single-parameter read tool this is sufficient to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter (fleet_name) and schema coverage is 100%, with the schema already saying it is 'the private fleet name, as shown in the dashboard.' The description refers to 'one of the organization's private fleets' but adds no format, naming convention, or lookup guidance beyond the schema, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (hosts of a private fleet) and immediately clarifies what a private fleet is ('dedicated machines Edgegap manages for you'), plus the fields returned (status, IP, location). No sibling tool covers fleet hosts, so there is no ambiguity to resolve.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says only ACTIVE hosts accept deployments, tells the agent to pass host_id values to edgegap_deploy as private_host_ids, and warns that organizations without private fleets get an API error. That is when-to-use, what-to-do-next, and a when-not condition all in one paragraph.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_list_locationsList where servers can runA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
pageNo
limitNoDefault 100.
versionNo
applicationNoWith version: only locations with capacity for it now.

Output Schema

NameRequiredDescription
totalNo
showingNo
messagesNo
locationsNo
next_stepNo
truncatedNo
filtered_forNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds one genuinely useful behavioral fact — the filtered result reflects capacity "right now," i.e. volatile data — but says nothing about pagination, result volume, or ordering, which matters for a list endpoint that can span many cities.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core action, then the filtering behavior, then the sibling pointer. No filler or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return shape needn't be explained, and there are no required parameters to warn about. The only real omission is pagination behavior for a potentially long list, which the description never addresses.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%; application and version are documented in-schema and the description restates that pairing as a capacity filter, adding a little semantic value. page and limit get no mention in the description, and with the schema silent on page, half the parameter surface is explained in neither place.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — "List the cities Edgegap can deploy to" — and immediately clarifies that passing application+version narrows the result to locations with current capacity. It also explicitly separates itself from edgegap_list_ping_beacons, so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use conditions: pick geo_coordinates for edgegap_deploy when no player IPs are available, or report to a developer where players can be served from. It names the alternative tool (edgegap_list_ping_beacons) for the latency-beacon case, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_list_ping_beaconsList ping beaconsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
pageNo
limitNoDefault 100.

Output Schema

NameRequiredDescription
totalNo
beaconsNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, yet the description adds a genuinely useful clarification that this tool does not perform pings, so agents will not expect latency data back. It does not cover pagination behavior, which is the remaining behavioral gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short clauses in one sentence plus a front-loaded scoping sentence; the core definition comes first and the read-only caveat last. Nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Safety is covered by annotations, return shape by the output schema, and the remaining ambiguity about what the tool actually does versus what the client does is resolved explicitly. Complete for a two-parameter list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description says nothing about the page or limit parameters. At 50% schema coverage, only 'limit' carries a schema note, so the description neither compensates nor worsens the gap; these are standard, self-explanatory pagination fields, which keeps this at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list ping beacons) and then defines the resource itself: one host per region that a game client pings over UDP or TCP to measure latency. No sibling tool covers latency beacons, so the definition alone lets an agent place it correctly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It establishes the usage context clearly: these measurements feed the matchmaker's latency rules and are taken before matchmaking. There are no explicit exclusions or named alternatives, but none of the sibling tools overlaps with this one, so the missing exclusion is low risk.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_list_registry_tagsList image tags in the Edgegap registryA
Read-only
Inspect

List the tags pushed for one image in this organization's Edgegap container registry, with push time and size. Call it after docker push to confirm the tag landed before edgegap_create_app_version, which otherwise fails later with an image-pull error. An image that was never pushed comes back as status "not_found" with no tags, not as an error. Only for registry.edgegap.com: images in Docker Hub, GHCR or another registry are not listed here.

NameRequiredDescriptionDefault
pageNo
limitNo1-100. Default 20.
image_nameYesThe image name only, without the project, registry host or tag, e.g. "my-game-server". The API reads the project from your token; "<project>/my-game-server" is not found.

Output Schema

NameRequiredDescription
noteNo
tagsNo
totalNo
showingNo
next_stepNo
truncatedNo
image_nameNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered; the description adds the non-obvious disclosure that a never-pushed image returns status "not_found" with no tags rather than an error, plus the downstream failure it prevents. It does not touch auth requirements, rate limits, or pagination behavior, so it stops short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences with the purpose front-loaded, followed by the workflow reason, the edge-case return, and the scope limit. No filler or repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers purpose, trigger, and the not_found edge case. Only minor gaps remain, chiefly the undescribed 'page' parameter and no note on how many tags a typical response yields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and image_name already has a rich schema description (name only, no project/registry host/tag, project read from token), so the description mostly restates rather than extends it. The undocumented 'page' parameter is not addressed, and nothing is said about how limit/paging interact with large tag lists.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb + resource + scope: lists tags pushed for one image in this organization's Edgegap registry, and states what is returned (push time and size). It is clearly distinguishable from siblings edgegap_delete_registry_tag and edgegap_get_registry_credentials.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to call it (after docker push, before edgegap_create_app_version) and why, and names the exclusion: images in Docker Hub, GHCR or other registries are not listed here. An agent knows both the trigger and the boundary without inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_list_relay_sessionsList relay sessionsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
totalNo
showingNo
sessionsNo
next_stepNo
truncatedNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, but the description adds genuinely new behavioral context: relay sessions bill while open, so this listing has a cost-control purpose. It also discloses a coverage limit — authorization tokens are not listed — which an agent would otherwise wrongly assume.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no filler: the summary, the cost-driven motivation with the next action, and the limitation with the alternative. The most actionable information (what is returned) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Zero parameters, an output schema that covers the return shape, and annotations covering the safety profile mean the description only needs to supply motivation, follow-up, and limitations — all of which it does. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline is 4. The description uses that space to describe the listed fields instead, which the output schema already covers, so no credit above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("List this organization's active relay sessions") and even names the fields surfaced (id, status, readiness, player count), so what it returns is unambiguous. It is clearly distinguishable from the sibling edgegap_get_relay_session, which it explicitly routes single-session reads to.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit use case (find leftover sessions from earlier runs because sessions bill while open) and names the follow-up action with edgegap_delete_relay_session, plus the alternative edgegap_get_relay_session for reading one session. When-to-use, what-to-do-next, and the alternative are all spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_list_skillsList the Edgegap agent skillsA
Read-onlyIdempotent
Inspect

List the Edgegap agent skills: tested, step-by-step workflows for getting a multiplayer game online on Edgegap, with templates (Dockerfiles, matchmaker configs, Unity C# and Unreal C++ drop-ins) and known pitfalls. Each entry says which engine, netcode or backend it is for, and the server instructions map projects to skills. Before working on a game project, load the matching skill with edgegap_get_skill; "edgegap" covers any other engine and routes to the rest. Also says whether a newer skills pack is on GitHub (reads one version number, no Edgegap API call).

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld, but the description adds meaningful detail beyond them: it discloses that the GitHub version check 'reads one version number, no Edgegap API call', which clarifies the openWorld behavior and reassures the agent no Edgegap-side side effects occur. It stops short of describing ordering or result size, so not a full 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the purpose and followed by the routing guidance and the version-check note. Dense with useful detail, though the final parenthetical about GitHub is slightly tacked-on rather than integrated into the flow.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does it: it explains that each entry states engine/netcode/backend, and that server instructions map projects to skills. Nothing an agent needs in order to decide to call it and interpret the result is missing, though the shape of the GitHub version-check result is only lightly described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The description adds no parameter information because none is needed, and the empty schema is fully consistent with the described behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List the Edgegap agent skills') and immediately defines what a skill is (tested step-by-step workflows with templates and pitfalls). It also explicitly contrasts itself with the sibling edgegap_get_skill, which loads a single skill, so an agent can choose between them without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('Before working on a game project, load the matching skill with edgegap_get_skill') and names the fallback ('edgegap' covers any other engine and routes to the rest). It also flags the secondary purpose of reporting whether a newer skills pack exists on GitHub, so the agent knows both reasons to call it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_report_deploymentReport a deployment to EdgegapAInspect

Report a problem with one deployment to Edgegap (the API's "Report a Deployment", meant for a studio's moderation backend), with a short reason and optional key/value details. It does not stop the deployment. Use it only when the developer asks to report a deployment; for a crash, read edgegap_get_deployment_logs first.

NameRequiredDescriptionDefault
reasonYesWhy it is reported, 1-255 characters.
dry_runNoShow 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.
metadataNoExtra key/value details, e.g. {"match_id": "m-42"}.
request_idYesThe exact request_id of the deployment.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=false and non-idempotency, but the description adds real value beyond them: it clarifies that the report is a side-channel moderation signal to a studio's backend and that the deployment keeps running. It stops short of saying what the call returns or whether a report can be withdrawn, so it is strong but not complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: purpose, non-effect, and usage routing, with the routing constraint front-loaded where the agent needs it. No repetition of schema content and no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter write-adjacent tool with no output schema, the description covers purpose, side effects, and sibling routing, which is most of what an agent needs. It leaves the response shape and any rate limiting unstated, a modest gap given annotations already cover the safety profile.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents reason, metadata, request_id and dry_run fully. The description adds only framing ('short reason and optional key/value details') and says nothing about the dry_run escape hatch, so it neither compensates nor needs to. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Report a problem with one deployment'), names the underlying API endpoint, and explicitly delimits it against what it is not ('does not stop the deployment'). An agent can distinguish it from edgegap_stop_deployment and edgegap_get_deployment_logs without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use rule ('only when the developer asks to report a deployment') and names an alternative with its trigger condition ('for a crash, read edgegap_get_deployment_logs first'). Both the positive case and the exclusion are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_revoke_relay_userRemove a player from a relay sessionA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
dry_runNoShow 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_idYesThe relay session_id, e.g. "0724828881e2-S".
user_authorization_tokenYesThe player's authorization token, not the session's.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true and idempotentHint=true, so the safety profile is largely covered. The description adds real context beyond that: the blast radius is scoped to a single player and the session plus other players survive, which prevents an agent from overestimating the destruction implied by destructiveHint. It does not cover auth requirements or behavior on an already-revoked/expired token.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The action and scope come first, and the 'session and other players stay' clause is a compact, high-value carve-out rather than preamble.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter mutation with annotations and no output schema, the description is nearly sufficient: it gives action, token provenance, and effect. Remaining gaps are minor — no statement about return value or failure modes such as an unknown/expired token.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description goes beyond the schema by identifying where user_authorization_token comes from (get_relay_session or authorize_relay_user) and reinforcing that it belongs to the player, not the session — useful provenance the schema does not supply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Revoke one player's access to a relay session.' It makes the granularity explicit (one player, not the whole session), which separates it from edgegap_delete_relay_session and edgegap_authorize_relay_user in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the token source tools (edgegap_get_relay_session, edgegap_authorize_relay_user) and clarifies the effect: 'the session and the other players stay,' implicitly distinguishing this from tearing down a session. It stops short of stating explicit when-not conditions or edge cases (e.g. revoking the last player).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_stop_deploymentStop a deploymentA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
dry_runNoShow 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_idYesThe exact request_id of the one deployment to stop, e.g. "61b1be8f54d9".

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives actionable workflow context ('Stop every deployment you started for testing before ending your task') and explicitly rules out bulk stops. It doesn't name alternative tools, but the when-to-use guidance is clear enough to drive correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_tag_deploymentAdd or remove tags on a running deploymentA
Idempotent
Inspect

Add tags to, or remove tags from, one running deployment, e.g. to mark the match it serves or that a test is done, so edgegap_list_deployments can filter on them. Tags are labels only: the game server does not see the change. The "edgegap-mcp" tag cannot be removed, since it is how agent deployments are found and cleaned up. Returns the tags now on the deployment.

NameRequiredDescriptionDefault
addNoTags to add, at most 40 characters each.
removeNoTags to remove.
dry_runNoShow 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_idYesThe exact request_id of the deployment.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the annotations: tags are labels only and invisible to the game server, and the 'edgegap-mcp' tag is protected because cleanup depends on it. Also discloses the return value (current tags), which the annotations cannot.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the action and resource, followed by intent, then caveats, then return value. Nothing is redundant with the schema text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, and the description explicitly states the return value (the tags now on the deployment). Combined with annotation coverage and full schema descriptions, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema documents request_id, add, remove and dry_run in detail. The description still contributes value by framing the deployment as 'one running deployment' and by flagging the protected tag that constrains valid values for the remove parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verbs (add/remove) plus the exact resource (tags on one running deployment) and gives concrete intent examples (mark the match served, mark a test done). Clearly distinct from siblings like edgegap_get_deployment or edgegap_list_registry_tags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage contexts — labeling a match or test — and names the downstream consumer, edgegap_list_deployments, that makes tagging worthwhile. It lacks an explicit 'do not use this for X' exclusion, but the positive routing is clear enough for an agent to choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_update_appTurn an application on or offA
Idempotent
Inspect

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.

NameRequiredDescriptionDefault
dry_runNoShow 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_activeYesfalse blocks new deployments; true allows them again.
applicationYesApplication name.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotent, non-destructive, open-world, but they cannot express effect scope. The description supplies exactly that: turning off blocks new deployments of every version under the application while running deployments keep running, and nothing is deleted. That is the key behavioral fact an agent needs before flipping the flag.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core action, then the blast radius, then the use case. No filler and no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-flag toggle with full schema coverage, annotations, and no output schema, this covers what an agent needs. The only omission is the dry_run verification path, which the schema already explains, so the gap is minor.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and is_active is already documented as 'false blocks new deployments; true allows them again', which the description largely restates. The dry_run parameter is fully documented in the schema but unmentioned here, so the description adds little beyond structured fields. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (set whether an application accepts new deployments) on a specific resource (application), not the version or deployment level. That scoping distinguishes it from edgegap_update_app_version and the deployment siblings without needing to name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use it to pause an application without deleting anything" gives a clear use case and implicitly rules out deletion as the path to stopping deployments. It stops short of naming an explicit alternative or when-not-to-use case, but the context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_update_app_versionUpdate an application versionA
Idempotent
Inspect

Change settings on an existing version instead of creating a new one: point it at a new image tag, turn it on or off, change max_duration, set the registry login, turn on image caching (force_cache: Edgegap pre-loads the image so deployments start faster), or set the shutdown grace period. Only the fields you pass change. Deployments already running keep their old settings; new deployments get the new ones. Same refusals as edgegap_create_app_version: "latest" or empty tags, a docker_image holding a host or tag, and the API token in the registry login or env vars. ports and env REPLACE the version's whole list (per the API): read the current ones with edgegap_get_app_version and pass every port or variable to keep; secret env values are not readable, so get them from the developer. Refused, with nothing sent, for a registry login or env value equal to the API's "This value is set and encrypted" placeholder; leave the registry login out to keep it. cpu_units and memory_mb change together (both or neither); to try other resources for one deployment only, override them in edgegap_deploy instead.

NameRequiredDescriptionDefault
envNoREPLACES every env var on the version; [] removes them all. Values are never echoed back.
portsNoREPLACES every port on the version. Include the ports to keep, not only new ones.
dry_runNoShow 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.
versionYesVersion name to change.
cpu_unitsNoNew vCPU units for later deployments, with memory_mb. 1024 = 1 vCPU.
is_activeNofalse blocks new deployments of this version.
memory_mbNoNew memory in MB for later deployments, with cpu_units. At most 2x cpu_units.
docker_tagNoNew image tag: a build ID, commit SHA or timestamp.
applicationYesApplication name.
force_cacheNoPre-load the image on Edgegap so deployments start faster.
docker_imageNoImage path, e.g. "my-org-abc123/my-game-server".
verify_imageNoCheck Edgegap can pull the image when saving.
registry_tokenNoRegistry password or token. Never echoed back.
endpoint_storageNoEndpoint Storage name (edgegap_list_endpoint_storage) to export container logs to when deployments end.
docker_repositoryNoRegistry host, e.g. "registry.edgegap.com".
registry_usernameNo
max_duration_minutesNoAuto-stop after this many minutes. Capped by EDGEGAP_MAX_DURATION_MINUTES.
termination_grace_period_secondsNoSeconds between SIGTERM and SIGKILL when a deployment stops.

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false, reducing the burden. The description adds real behavioral context (partial-update merge semantics, running vs new deployments, refusals, secret values not readable), but the ports/env whole-list replacement is arguably a destruct-on-unpassed-value behavior that sits in tension with destructiveHint=false — the description discloses it, so it's guidance rather than a contradiction, though it warrants caution.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose and keeps sentences dense with actionable detail. It is long and slightly sprawling, but nearly every clause carries operational value (replacement rules, refusals, coupling constraints), so little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 18-parameter mutation with no output schema, the description covers merge semantics, refusals, destructive list-replacement, secret-handling, and parameter coupling — everything an agent needs to call it safely without opening the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 94% so the schema already documents most params. The description still adds cross-parameter meaning the schema cannot: cpu_units and memory_mb must change together, ports/env replace the entire list, and the registry-login placeholder must be omitted to preserve it. This genuinely supplements structured data.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Change settings on an existing version') and immediately frames it against creating a new one. Enumerates the concrete editable settings (image tag, active flag, max_duration, registry login, force_cache, grace period) so an agent distinguishes it from edgegap_create_app_version and edgegap_get_app_version.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it (change an existing version rather than create), names alternatives (edgegap_create_app_version for the same refusals, edgegap_get_app_version to read current ports/env, edgegap_deploy to override resources for one deployment). Covers when-not and points to sibling tools for adjacent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_update_skillsCheck and update the installed Edgegap skillsA
Idempotent
Inspect

Check whether the Edgegap agent skills installed in the developer's agent are the latest, and update them. Finds installs made with the skills CLI (user-wide or this project), the Claude Code plugin edgegap@edgegap, and skills copied by hand into an agent's skills folder, and compares each skill with the latest on GitHub. Without apply it only checks and changes nothing. With apply=true it rewrites hand-copied skills from the files bundled in this server, and runs each outdated install's own updater (npx skills@1.7.4 update for the Edgegap skills only, or claude plugin update) only when the operator started the server with EDGEGAP_ENABLE_SKILLS_UPDATE=1; otherwise it lists those commands for the developer to run. Ask the developer before applying. Skill text is never downloaded by this tool. The skills served by edgegap_get_skill need no update here.

NameRequiredDescriptionDefault
applyNoRun the updates for outdated installs. Omit or false to only check.
installed_versionsNoSkill name → version of skills you have loaded from somewhere this server cannot see, e.g. {"edgegap-unity": "0.1.8"}. The version is metadata.version in the SKILL.md frontmatter.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations it discloses exactly what apply mutates (hand-copied skill files from bundled sources), which external commands may be run and under what gate, and that commands are merely listed when the env flag is off. It also states a negative safety fact: skill text is never downloaded by this tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb and the apply/no-apply split, then details. The middle sentences are dense and clause-heavy (nested parenthetical about npx/claude commands), but every sentence carries operational information rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description says what the check produces (comparison of each skill with latest on GitHub) and what the apply branch does in both gated and ungated states. For a 2-parameter, 0-required tool that is complete enough to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented, and the description adds real meaning on top: apply=true implies file rewriting and updater execution rather than a passive refresh. The installed_versions semantics beyond the schema (hidden installs) are echoed from the schema but the interaction with the check is clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (check/update installed Edgegap agent skills) and enumerates the install kinds it covers (skills CLI, Claude Code plugin, hand-copied folders). It also carves itself away from siblings: 'The skills served by edgegap_get_skill need no update here.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when/when-not: 'Without apply it only checks and changes nothing,' 'With apply=true it rewrites...', 'Ask the developer before applying.' It also names the operator precondition (EDGEGAP_ENABLE_SKILLS_UPDATE=1) that changes what actually happens.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_validate_server_configValidate a game server Dockerfile and port configA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
portsNoPorts you plan to pass to edgegap_create_app_version.
engineNoGame engine. Detected from the Dockerfile when omitted.
netcodeNoNetworking 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_unitsNo
memory_mbNo
docker_tagNo
dockerfileNoFull text of the Dockerfile.
docker_imageNo
docker_repositoryNo

Output Schema

NameRequiredDescription
engineNo
errorsNo
verdictNo
warningsNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, openWorldHint=false and idempotentHint=true, and the description reinforces this with 'Makes no API calls', so an agent knows it is a pure local check. Beyond that it enumerates the actual failure classes detected (ARM/Windows images, root Unreal, missing -batchmode -nographics, localhost binding, EXPOSE/port mismatch, protocol vs netcode mismatch, 'latest' tag, bad CPU/memory ratios), which is real behavioral context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The pre-build purpose and the sibling deferral are front-loaded, and the failure list is dense but each item is a concrete check. The long mid-sentence enumeration is information-dense rather than padded, though it could be bulleted for faster scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter validation tool with an output schema and rich annotations, the description covers timing, alternative routing, side-effect profile and the check catalog. The only real omission is what docker_image/docker_repository contribute to validation, which an agent would have to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 44%, so the description must compensate, and it does for several key inputs: it tells the agent to read the Dockerfile from disk and pass the full text, and it ties ports, protocol and CPU/memory to concrete validations (EXPOSE mismatch, netcode transport, ratios, 'latest' tag → docker_tag). docker_image and docker_repository remain unexplained in both places, keeping this short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (check/validate) applied to a specific resource pair (Dockerfile text plus the ports/resources to be registered), and frames the timing relative to build/push/deploy. It is clearly distinguishable from the sibling edgegap_generate_dockerfile, which it names and defers to.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when: run BEFORE building and pushing, because the failures otherwise surface only after build/push/version/deploy. Gives an explicit alternative and its selecting condition: 'If there is no Dockerfile yet, call edgegap_generate_dockerfile instead.' Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edgegap_wait_for_deploymentWait for a deployment to become readyA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
request_idYesThe request_id returned by edgegap_deploy.
timeout_secondsNoHow long to wait before giving up, 5-600. Default 180.

Output Schema

NameRequiredDescription
fqdnNo
errorNo
portsNo
readyNo
statusNo
runningNo
versionNo
locationNo
next_stepNo
public_ipNo
request_idNo
applicationNo
error_detailNo
waited_secondsNo
elapsed_secondsNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint and idempotentHint, so the description adds value by disclosing backoff handling, the three termination paths, and that container error detail is surfaced on failure start. It still doesn't say the call blocks for up to the timeout (a long-polling trait) or what connection details contain.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the action and termination behavior, then the sequencing guidance, then the anti-pattern warning. No filler and nothing redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. The description covers the lifecycle position (after deploy), failure reporting, wait bounds, and backoff, leaving nothing an agent needs before invoking it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both request_id and timeout_seconds documented in-schema including the 5-600 range and default. The description adds no parameter-level meaning beyond that, which is the expected baseline when the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (poll), resource (a deployment), termination conditions (ready, errors, timeout), and the return value (connection details). It is clearly distinguishable from the one-shot status siblings like edgegap_get_deployment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to call it right after edgegap_deploy and warns against building a custom polling loop, which is a real when-to-use signal with an implied alternative. It stops short of contrasting with edgegap_get_deployment or edgegap_get_deployment_logs for one-off status checks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.15.7
    • Changededgegap_get_skill1 field changed
      • changedInput schema / properties / skill / description
        Previous value: -"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-matchmaking, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-server-design, edgegap-threejs, edgegap-troubleshoot, edgegap-unity, edgegap-unreal."New value: +"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-matchmaking, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-relays, edgegap-server-design, edgegap-threejs, edgegap-troubleshoot, edgegap-unity, edgegap-unreal."
  2. 15 tool updatesv0.15.1
    • Changededgegap_create_app_version1 field changed
      • addedInput schema / properties / endpoint_storage
        Added value: +{
        +  "description": "Endpoint Storage name (edgegap_list_endpoint_storage) to export container logs to when deployments end.",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Addededgegap_create_endpoint_storage
    • Addededgegap_create_pull_profile
    • Addededgegap_delete_app
    • Addededgegap_delete_app_version
    • Addededgegap_delete_endpoint_storage
    • Addededgegap_delete_pull_profile
    • Changededgegap_deploy6 fields changed
      • addedInput schema / properties / allow_long_running
        Added value: +{
        +  "description": "Deploy even though the version's max_duration is unlimited or above EDGEGAP_MAX_DURATION_MINUTES. Only after the developer agreed: the server bills until it is stopped or that limit.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / private_host_ids
        Added value: +{
        +  "description": "Private fleet host IDs to try first, in order (from edgegap_list_fleet_hosts); Edgegap overflows to its cloud when they are full. Omit for a normal cloud deployment.",
        +  "items": {
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
      • addedInput schema / properties / require_cached_locations
        Added value: +{
        +  "description": "Only place it where the image is already cached: starts faster, fewer places to choose from. Needs force_cache on the version (edgegap_update_app_version); without it the API refuses the deploy.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / webhook_on_error
        Added value: +{
        +  "description": "https URL Edgegap POSTs to when the deployment fails.",
        +  "type": "string"
        +}
      • addedInput schema / properties / webhook_on_ready
        Added value: +{
        +  "description": "https URL Edgegap POSTs to when the server is ready.",
        +  "type": "string"
        +}
      • addedInput schema / properties / webhook_on_terminated
        Added value: +{
        +  "description": "https URL Edgegap POSTs to when the deployment ends.",
        +  "type": "string"
        +}
    • Changededgegap_get_app_version1 field changed
      • addedOutput schema / properties / endpoint_storage
        Added value: +{
        +  "type": "string"
        +}
    • Addededgegap_link_pull_profile
    • Addededgegap_list_endpoint_storage
    • Addededgegap_list_fleet_hosts
    • Addededgegap_report_deployment
    • Addededgegap_tag_deployment
    • Changededgegap_update_app_version3 fields changed
      • addedInput schema / properties / cpu_units
        Added value: +{
        +  "description": "New vCPU units for later deployments, with memory_mb. 1024 = 1 vCPU.",
        +  "maximum": 9007199254740991,
        +  "minimum": 256,
        +  "type": "integer"
        +}
      • addedInput schema / properties / endpoint_storage
        Added value: +{
        +  "description": "Endpoint Storage name (edgegap_list_endpoint_storage) to export container logs to when deployments end.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / memory_mb
        Added value: +{
        +  "description": "New memory in MB for later deployments, with cpu_units. At most 2x cpu_units.",
        +  "maximum": 9007199254740991,
        +  "minimum": 256,
        +  "type": "integer"
        +}
  3. 1 tool updatev0.13.3
    • Changededgegap_build_matchmaker_config1 field changed
      • changedInput schema / properties / expansions / description
        Previous value: -"Rule relaxations after a player has waited this long, e.g. [{after_seconds: 20, min_team_size: 1}]. Keep each below ticket_expiration."New value: +"Rule relaxations after a player has waited this long, e.g. [{after_seconds: 20, min_team_size: 1}]. Keep each below ticket_expiration. Not needed for partial matches: min_team_size below max_team_size already allows them. Expansions cost the matchmaker performance, so add one only to relax a rule."
  4. 17 tool updatesv0.12.0
    • Changededgegap_context2 fields changed
      • addedInput schema / properties / check_token
        Added value: +{
        +  "description": "Make one read-only API call (list one application) to confirm Edgegap accepts the token. Default false.",
        +  "type": "boolean"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "api_base_url": {
        +      "type": "string"
        +    },
        +    "api_host": {
        +      "type": "string"
        +    },
        +    "forced_deploy_tag": {
        +      "type": "string"
        +    },
        +    "guardrails": {
        +      "additionalProperties": {},
        +      "properties": {},
        +      "type": "object"
        +    },
        +    "max_duration_ceiling_minutes": {
        +      "type": "number"
        +    },
        +    "read_only": {
        +      "type": "boolean"
        +    },
        +    "server": {
        +      "type": "string"
        +    },
        +    "skills_pack": {
        +      "type": "string"
        +    },
        +    "transport": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_deploy3 fields changed
      • changedInput schema / properties / cpu_units / description
        Previous value: -"Override the version CPU (with memory_mb). Not in the published v2 spec, so the API may ignore it; a version with the size you need is the reliable way."New value: +"Override the version's CPU for this deployment only, with memory_mb. 1024 = 1 vCPU."
      • changedInput schema / properties / memory_mb / description
        Previous value: -"Override the version memory (with cpu_units). Same caveat as cpu_units."New value: +"Override the version's memory for this deployment only, with cpu_units. At most 2x cpu_units."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "auto_stop": {
        +      "type": "string"
        +    },
        +    "auto_stop_after_minutes": {
        +      "type": "number"
        +    },
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "request_id": {
        +      "type": "string"
        +    },
        +    "resources": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "cpu_units": {
        +          "type": "number"
        +        },
        +        "memory_mib": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "tags": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "warning": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_get_app_version1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "active": {
        +      "type": "boolean"
        +    },
        +    "application": {
        +      "type": "string"
        +    },
        +    "auto_stop": {
        +      "type": "string"
        +    },
        +    "auto_stop_after_minutes": {
        +      "type": "number"
        +    },
        +    "caching_percent": {
        +      "type": "number"
        +    },
        +    "cpu_units": {
        +      "type": "number"
        +    },
        +    "env": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "hidden": {
        +            "type": "boolean"
        +          },
        +          "key": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "force_cache": {
        +      "type": "boolean"
        +    },
        +    "image": {
        +      "type": "string"
        +    },
        +    "max_duration_minutes": {
        +      "type": "number"
        +    },
        +    "memory_mb": {
        +      "type": "number"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "ports": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "name": {
        +            "type": "string"
        +          },
        +          "port": {
        +            "type": "number"
        +          },
        +          "protocol": {
        +            "type": "string"
        +          },
        +          "tls_upgrade": {
        +            "type": "boolean"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "registry_credentials_set": {
        +      "type": "boolean"
        +    },
        +    "restart_policy": {
        +      "type": "string"
        +    },
        +    "termination_grace_period_seconds": {
        +      "type": "number"
        +    },
        +    "verify_image": {
        +      "type": "boolean"
        +    },
        +    "warning": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_get_deployment1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "application": {
        +      "type": "string"
        +    },
        +    "elapsed_seconds": {
        +      "type": "number"
        +    },
        +    "error": {
        +      "type": "boolean"
        +    },
        +    "error_detail": {
        +      "type": "string"
        +    },
        +    "fqdn": {
        +      "type": "string"
        +    },
        +    "location": {
        +      "type": "string"
        +    },
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "ports": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "connect": {
        +            "type": "string"
        +          },
        +          "external": {
        +            "type": "number"
        +          },
        +          "internal": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "protocol": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "public_ip": {
        +      "type": "string"
        +    },
        +    "ready": {
        +      "type": "boolean"
        +    },
        +    "request_id": {
        +      "type": "string"
        +    },
        +    "running": {
        +      "type": "boolean"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "version": {
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_get_deployment_logs3 fields changed
      • changedInput schema / properties / max_characters / description
        Previous value: -"Truncate logs to this length, keeping the tail. Default 8000."New value: +"Truncate logs to this length (500-50000), keeping the tail. Default 8000."
      • changedInput schema / properties / max_characters / maximum
        Previous value: -50000New value: +9007199254740991
      • changedInput schema / properties / max_characters / minimum
        Previous value: -500New value: +-9007199254740991
    • Changededgegap_get_deployment_metrics1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "cpu": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "average": {
        +          "type": "number"
        +        },
        +        "from": {
        +          "type": "string"
        +        },
        +        "labels": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "latest": {
        +          "type": "number"
        +        },
        +        "peak": {
        +          "type": "number"
        +        },
        +        "samples": {
        +          "type": "number"
        +        },
        +        "to": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "cpu_throttle_rate": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "average": {
        +          "type": "number"
        +        },
        +        "from": {
        +          "type": "string"
        +        },
        +        "labels": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "latest": {
        +          "type": "number"
        +        },
        +        "peak": {
        +          "type": "number"
        +        },
        +        "samples": {
        +          "type": "number"
        +        },
        +        "to": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "memory": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "average": {
        +          "type": "number"
        +        },
        +        "from": {
        +          "type": "string"
        +        },
        +        "labels": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "latest": {
        +          "type": "number"
        +        },
        +        "peak": {
        +          "type": "number"
        +        },
        +        "samples": {
        +          "type": "number"
        +        },
        +        "to": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "network_receive": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "average": {
        +          "type": "number"
        +        },
        +        "from": {
        +          "type": "string"
        +        },
        +        "labels": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "latest": {
        +          "type": "number"
        +        },
        +        "peak": {
        +          "type": "number"
        +        },
        +        "samples": {
        +          "type": "number"
        +        },
        +        "to": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "network_transmit": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "average": {
        +          "type": "number"
        +        },
        +        "from": {
        +          "type": "string"
        +        },
        +        "labels": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "latest": {
        +          "type": "number"
        +        },
        +        "peak": {
        +          "type": "number"
        +        },
        +        "samples": {
        +          "type": "number"
        +        },
        +        "to": {
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "request_id": {
        +      "type": "string"
        +    },
        +    "totals": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "disk_read": {
        +          "type": "number"
        +        },
        +        "disk_written": {
        +          "type": "number"
        +        },
        +        "received": {
        +          "type": "number"
        +        },
        +        "transmitted": {
        +          "type": "number"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_get_skill1 field changed
      • changedInput schema / properties / skill / description
        Previous value: -"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-server-design, edgegap-threejs, edgegap-troubleshoot, edgegap-unity, edgegap-unreal."New value: +"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-matchmaking, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-server-design, edgegap-threejs, edgegap-troubleshoot, edgegap-unity, edgegap-unreal."
    • Changededgegap_list_app_versions1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "application": {
        +      "type": "string"
        +    },
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "showing": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "truncated": {
        +      "type": "boolean"
        +    },
        +    "versions": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "active": {
        +            "type": "boolean"
        +          },
        +          "cpu_units": {
        +            "type": "number"
        +          },
        +          "image": {
        +            "type": "string"
        +          },
        +          "max_duration_minutes": {
        +            "type": "number"
        +          },
        +          "memory_mb": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "ports": {
        +            "items": {
        +              "additionalProperties": {},
        +              "properties": {
        +                "name": {
        +                  "type": "string"
        +                },
        +                "port": {
        +                  "type": "number"
        +                },
        +                "protocol": {
        +                  "type": "string"
        +                },
        +                "tls_upgrade": {
        +                  "type": "boolean"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "registry_credentials_set": {
        +            "type": "boolean"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_list_apps5 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Results per page. Default 50."New value: +"Results per page, 1-100. Default 50."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +9007199254740991
      • changedInput schema / properties / limit / minimum
        Previous value: -1New value: +-9007199254740991
      • changedInput schema / properties / page / minimum
        Previous value: -1New value: +-9007199254740991
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "applications": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "active": {
        +            "type": "boolean"
        +          },
        +          "last_updated": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "showing": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "truncated": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_list_deployments4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Default 50."New value: +"1-100. Default 50."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +9007199254740991
      • changedInput schema / properties / limit / minimum
        Previous value: -1New value: +-9007199254740991
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "deployments": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "fqdn": {
        +            "type": "string"
        +          },
        +          "ready": {
        +            "type": "boolean"
        +          },
        +          "request_id": {
        +            "type": "string"
        +          },
        +          "started": {
        +            "type": "string"
        +          },
        +          "tags": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "showing": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "truncated": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_list_locations1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "filtered_for": {
        +      "type": "string"
        +    },
        +    "locations": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "city": {
        +            "type": "string"
        +          },
        +          "continent": {
        +            "type": "string"
        +          },
        +          "country": {
        +            "type": "string"
        +          },
        +          "latitude": {
        +            "type": "number"
        +          },
        +          "longitude": {
        +            "type": "number"
        +          },
        +          "region": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "messages": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "showing": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "truncated": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_list_ping_beacons1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "beacons": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "city": {
        +            "type": "string"
        +          },
        +          "continent": {
        +            "type": "string"
        +          },
        +          "country": {
        +            "type": "string"
        +          },
        +          "host": {
        +            "type": "string"
        +          },
        +          "tcp_port": {
        +            "type": "number"
        +          },
        +          "udp_port": {
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_list_registry_tags4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Default 20."New value: +"1-100. Default 20."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +9007199254740991
      • changedInput schema / properties / limit / minimum
        Previous value: -1New value: +-9007199254740991
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "image_name": {
        +      "type": "string"
        +    },
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "showing": {
        +      "type": "number"
        +    },
        +    "tags": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "digest": {
        +            "type": "string"
        +          },
        +          "pushed": {
        +            "type": "string"
        +          },
        +          "size_mb": {
        +            "type": "number"
        +          },
        +          "tag": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "truncated": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_list_relay_sessions1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "sessions": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "error": {
        +            "type": "string"
        +          },
        +          "linked": {
        +            "type": "boolean"
        +          },
        +          "players": {
        +            "type": "number"
        +          },
        +          "ready": {
        +            "type": "boolean"
        +          },
        +          "relay": {
        +            "type": "string"
        +          },
        +          "session_id": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "showing": {
        +      "type": "number"
        +    },
        +    "total": {
        +      "type": "number"
        +    },
        +    "truncated": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_update_app_version2 fields changed
      • addedInput schema / properties / env
        Added value: +{
        +  "description": "REPLACES every env var on the version; [] removes them all. Values are never echoed back.",
        +  "items": {
        +    "properties": {
        +      "key": {
        +        "type": "string"
        +      },
        +      "value": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "key",
        +      "value"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / ports
        Added value: +{
        +  "description": "REPLACES every port on the version. Include the ports to keep, not only new ones.",
        +  "items": {
        +    "properties": {
        +      "name": {
        +        "description": "Label, e.g. \"gameport\".",
        +        "type": "string"
        +      },
        +      "port": {
        +        "description": "Port the server listens on.",
        +        "maximum": 59999,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "protocol": {
        +        "description": "One of UDP, TCP, TCP/UDP, HTTP, HTTPS, WS, WSS. Most game servers use UDP.",
        +        "type": "string"
        +      },
        +      "tls_upgrade": {
        +        "description": "wss:// / https:// for browser clients. WS and HTTP ports only.",
        +        "type": "boolean"
        +      },
        +      "to_check": {
        +        "description": "Readiness check on this port. Default true.",
        +        "type": "boolean"
        +      }
        +    },
        +    "required": [
        +      "port",
        +      "protocol"
        +    ],
        +    "type": "object"
        +  },
        +  "minItems": 1,
        +  "type": "array"
        +}
    • Changededgegap_validate_server_config1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "engine": {
        +      "type": "string"
        +    },
        +    "errors": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "code": {
        +            "type": "string"
        +          },
        +          "fix": {
        +            "type": "string"
        +          },
        +          "line": {
        +            "type": "number"
        +          },
        +          "message": {
        +            "type": "string"
        +          },
        +          "severity": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "verdict": {
        +      "type": "string"
        +    },
        +    "warnings": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "code": {
        +            "type": "string"
        +          },
        +          "fix": {
        +            "type": "string"
        +          },
        +          "line": {
        +            "type": "number"
        +          },
        +          "message": {
        +            "type": "string"
        +          },
        +          "severity": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changededgegap_wait_for_deployment4 fields changed
      • changedInput schema / properties / timeout_seconds / description
        Previous value: -"How long to wait before giving up. Default 180."New value: +"How long to wait before giving up, 5-600. Default 180."
      • changedInput schema / properties / timeout_seconds / maximum
        Previous value: -600New value: +9007199254740991
      • changedInput schema / properties / timeout_seconds / minimum
        Previous value: -5New value: +-9007199254740991
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "application": {
        +      "type": "string"
        +    },
        +    "elapsed_seconds": {
        +      "type": "number"
        +    },
        +    "error": {
        +      "type": "boolean"
        +    },
        +    "error_detail": {
        +      "type": "string"
        +    },
        +    "fqdn": {
        +      "type": "string"
        +    },
        +    "location": {
        +      "type": "string"
        +    },
        +    "next_step": {
        +      "type": "string"
        +    },
        +    "ports": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "connect": {
        +            "type": "string"
        +          },
        +          "external": {
        +            "type": "number"
        +          },
        +          "internal": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "protocol": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "public_ip": {
        +      "type": "string"
        +    },
        +    "ready": {
        +      "type": "boolean"
        +    },
        +    "request_id": {
        +      "type": "string"
        +    },
        +    "running": {
        +      "type": "boolean"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "version": {
        +      "type": "string"
        +    },
        +    "waited_seconds": {
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
  5. 3 tool updatesv0.10.0
    • Changededgegap_build_matchmaker_config2 fields changed
      • changedInput schema / properties / expansions / description
        Previous value: -"Rule relaxations after a player has waited this long, e.g. [{after_seconds: 30, min_team_size: 1}]."New value: +"Rule relaxations after a player has waited this long, e.g. [{after_seconds: 20, min_team_size: 1}]. Keep each below ticket_expiration."
      • changedInput schema / properties / ticket_expiration / description
        Previous value: -"Default \"5m\"."New value: +"Default \"30s\", so a developer testing alone is matched or told to retry within 30 s instead of waiting minutes. Raise it only for production queues."
    • Changededgegap_get_skill1 field changed
      • changedInput schema / properties / skill / description
        Previous value: -"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-server-design, edgegap-troubleshoot, edgegap-unity, edgegap-unreal."New value: +"Skill name, from edgegap_list_skills: edgegap, edgegap-colyseus, edgegap-containerize, edgegap-deployments-api, edgegap-eos-voice, edgegap-fishnet, edgegap-fusion, edgegap-fusion-simplefps, edgegap-godot, edgegap-launch, edgegap-local-testing, edgegap-manus, edgegap-nakama, edgegap-ngo, edgegap-playfab, edgegap-purrnet, edgegap-server-design, edgegap-threejs, edgegap-troubleshoot, edgegap-unity, edgegap-unreal."
    • Addededgegap_update_skills
  6. 12 tool updatesv0.7.1
    • Changededgegap_create_app_version1 field changed
      • changedInput schema / properties / docker_tag / description
        Previous 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."
    • Addededgegap_delete_registry_tag
    • Changededgegap_deploy2 fields changed
      • changedInput schema / properties / cpu_units / description
        Previous 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."
      • changedInput schema / properties / memory_mb / description
        Previous value: -"Override the version memory."New value: +"Override the version memory (with cpu_units). Same caveat as cpu_units."
    • Addededgegap_get_app_version
    • Addededgegap_get_deployment_metrics
    • Changededgegap_get_skill2 fields changed
      • changedInput schema / properties / skill / description
        Previous 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."
      • removedInput schema / properties / skill / enum
        Removed value: -[
        -  "edgegap",
        -  "edgegap-containerize",
        -  "edgegap-deployments-api",
        -  "edgegap-launch",
        -  "edgegap-local-testing",
        -  "edgegap-server-design",
        -  "edgegap-troubleshoot",
        -  "edgegap-unity",
        -  "edgegap-unreal"
        -]
    • Addededgegap_list_locations
    • Addededgegap_list_ping_beacons
    • Addededgegap_list_relay_sessions
    • Addededgegap_revoke_relay_user
    • Addededgegap_update_app
    • Addededgegap_update_app_version
  7. 15 tool updatesv0.5.2
    • Changededgegap_authorize_relay_user1 field changed
      • addedInput schema / properties / dry_run
        Added 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"
        +}
    • Changededgegap_build_matchmaker_config1 field changed
      • addedInput schema / properties / allowed_cors_origins
        Added 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"
        +}
    • Addededgegap_context
    • Changededgegap_create_app1 field changed
      • addedInput schema / properties / dry_run
        Added 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"
        +}
    • Changededgegap_create_app_version4 fields changed
      • addedInput schema / properties / dry_run
        Added 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"
        +}
      • changedInput schema / properties / env / description
        Previous value: -"Environment variables injected into the container."New value: +"Environment variables injected into the container. Values are never echoed back."
      • addedInput schema / properties / ports / items / properties / tls_upgrade
        Added 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"
        +}
      • changedInput schema / properties / registry_username / description
        Previous 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."
    • Changededgegap_create_relay_session1 field changed
      • addedInput schema / properties / dry_run
        Added 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"
        +}
    • Changededgegap_delete_relay_session2 fields changed
      • addedInput schema / properties / dry_run
        Added 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"
        +}
      • addedInput schema / properties / session_id / description
        Added value: +"The exact session_id of the one session to delete, e.g. \"0724828881e2-S\"."
    • Changededgegap_deploy5 fields changed
      • addedInput schema / properties / dry_run
        Added 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"
        +}
      • changedInput schema / properties / env / description
        Previous value: -"Environment variables for this deployment only."New value: +"Environment variables for this deployment only. Values are never echoed back."
      • changedInput schema / properties / tags / description
        Previous 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."
      • addedInput schema / properties / tags / items / maxLength
        Added value: +40
      • addedInput schema / properties / tags / items / minLength
        Added value: +1
    • Changededgegap_generate_dockerfile1 field changed
      • addedInput schema / properties / ports / items / properties / tls_upgrade
        Added value: +{
        +  "description": "TLS Upgrade (wss/https) on a WS or HTTP port, for browser clients.",
        +  "type": "boolean"
        +}
    • Addededgegap_get_skill
    • Changededgegap_list_deployments1 field changed
      • addedInput schema / properties / only_agent_deployments
        Added 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"
        +}
    • Changededgegap_list_registry_tags2 fields changed
      • changedInput schema / properties / image_name / description
        Previous 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."
      • addedInput schema / properties / image_name / minLength
        Added value: +1
    • Addededgegap_list_skills
    • Changededgegap_stop_deployment2 fields changed
      • addedInput schema / properties / dry_run
        Added 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"
        +}
      • changedInput schema / properties / request_id / description
        Previous value: -"The request_id of the deployment to stop."New value: +"The exact request_id of the one deployment to stop, e.g. \"61b1be8f54d9\"."
    • Changededgegap_validate_server_config1 field changed
      • addedInput schema / properties / ports / items / properties / tls_upgrade
        Added value: +{
        +  "description": "TLS Upgrade (wss/https) on a WS or HTTP port, for browser clients.",
        +  "type": "boolean"
        +}
  8. 2 tool updatesv0.2.2
    • Addededgegap_generate_dockerfile
    • Changededgegap_list_deployments3 fields changed
      • removedInput schema / properties / filter
        Removed value: -{
        -  "description": "Edgegap filter expression, e.g. by tag. Omit for all deployments.",
        -  "type": "string"
        -}
      • addedInput schema / properties / filters
        Added 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"
        +}
      • addedInput schema / properties / order_by
        Added 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. 9 tool updatesv0.2.0
    • Addededgegap_authorize_relay_user
    • Addededgegap_build_matchmaker_config
    • Changededgegap_create_app_version1 field changed
      • changedInput schema / properties / ports / items / properties / protocol / description
        Previous 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."
    • Addededgegap_create_relay_session
    • Addededgegap_delete_relay_session
    • Addededgegap_get_registry_credentials
    • Addededgegap_get_relay_session
    • Addededgegap_list_registry_tags
    • Addededgegap_validate_server_config
  10. 10 tool updatesv0.1.2
    • First observededgegap_create_app
    • First observededgegap_create_app_version
    • First observededgegap_deploy
    • First observededgegap_get_deployment
    • First observededgegap_get_deployment_logs
    • First observededgegap_list_app_versions
    • First observededgegap_list_apps
    • First observededgegap_list_deployments
    • First observededgegap_stop_deployment
    • First observededgegap_wait_for_deployment

TDQS

A4.1/5.0

Scored across 43 tools

Disambiguation5/5

Each tool targets a distinct resource plus action across clearly separated sub-domains (apps/versions, deployments, registry, endpoint storage, relay, matchmaker, skills). The few near-neighbours (edgegap_get_deployment vs edgegap_wait_for_deployment, edgegap_get_skill vs edgegap_list_skills vs edgegap_update_skills, delete_app vs delete_app_version) are explicitly differentiated in the descriptions with guidance on when to pick which. Even the risky relay-vs-deploy choice is called out and steered by the create_relay_session description.

Naming Consistency4/5

All 43 names share the edgegap_ prefix and follow snake_case verb_noun (list_apps, create_app_version, delete_registry_tag, revoke_relay_user). Minor deviations exist: edgegap_context is a bare noun, edgegap_deploy omits the object, and the skills tools mix get/list/update semantics. Still, the pattern is predictable enough that an agent can guess a name.

Tool Count3/5

43 tools is heavy for a single server, though the surface genuinely spans eight distinct sub-APIs (apps, versions, deployments, registry, endpoint storage, relay, matchmaker, skills). The splits are defensible, but the sheer volume makes tool selection and context cost a real burden. It sits at the upper edge of what is reasonable rather than being padded with filler.

Completeness4/5

Coverage is unusually thorough: full create/read/update/delete lifecycles for apps, versions, deployments, endpoint storage, pull profiles and relay sessions, plus observability (logs, metrics), tagging, registry inspection and workflow skills. Remaining gaps are minor: no single get_app read tool, update_app only toggles a flag, endpoint storage cannot be updated, and matchmaker is config-generation only (documented as an API limitation).

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables AI agents to deploy multiplayer web games as playable URLs with rooms, live state sync, and leaderboards, all through a single tool call.
    4
    144 npm
    5
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI coding assistants to access documentation, live API tools, and workflow prompts for integrating a game/app backend service into Godot, Unity, and Unreal Engine projects, including auth, leaderboards, cloud saves, remote config, localization, news, gift codes, feedback, logs, crash reporting, email, and admin dashboard management.
    120
    171 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to manage, configure, and operate game servers hosted on Pterodactyl panels, including power actions, console commands, file operations, plugin installation, and backups. It also supports Cloudflare challenge bypass and automatic request pacing for reliable panel automation.
    MIT