Deploy and operate multiplayer game servers on Edgegap's global edge network.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Edgegap API token (organization-wide; cannot be scoped to one application).
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
Public IP of the joining player.
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.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. |
| user_ip* | string | Public IP of the joining player. |
| session_id* | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"session_id",
"user_ip"
],
"properties": {
"dry_run": {
"type": "boolean",
"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."
},
"user_ip": {
"type": "string",
"minLength": 3,
"description": "Public IP of the joining player."
},
"session_id": {
"type": "string"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| inspect | boolean | Expose the inspection API for debugging. Default true; turn off for production. |
| version* | string | Version the matchmaker deploys. |
| expansions | array | Rule relaxations after a player has waited this long, e.g. [{after_seconds: 20, min_team_size: 1}]. Keep each below ticket_expiration. |
| team_count* | integer | Teams per match. 1 for free-for-all or co-op. |
| application* | string | Application the matchmaker deploys. |
| profile_name* | string | Profile clients will queue into, e.g. "casual-2v2". |
| max_team_size* | integer | |
| min_team_size* | integer | |
| max_latency_ms | integer | Adds a latency rule: drop players above this ping to the chosen region. Needs beacon pings from the client. |
| verify_version | boolean | Look up the application version first. Default true. |
| ticket_expiration | string |
Report which Edgegap API this server talks to, its version, whether it is the local or hosted server, and the guardrails in force: read-only mode, application allowlist, max_duration ceiling, the agent deployment cap, the tag forced onto every deployment, and which tools support dry_run. Call it first when unsure what this session is allowed to do, or before anything billable. Makes no API call and never shows the token.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| name* | string | Application name, 3-64 chars. Usually the game or project name. |
| dry_run | boolean | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. |
| is_active | boolean | Whether deployments are allowed. Default true. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 64,
"minLength": 3,
"description": "Application name, 3-64 chars. Usually the game or project name."
},
"dry_run": {
"type": "boolean",
"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."
},
"is_active": {
"type": "boolean",
"description": "Whether deployments are allowed. Default true."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| env | array | Environment variables injected into the container. Values are never echoed back. |
| name* | string | Version identifier, typically a build ID or timestamp. |
| ports* | array | Ports to expose. At least one is required for players to connect. |
| dry_run | boolean | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. |
| cpu_units* | integer | vCPU units. 1024 = 1 vCPU. |
| memory_mb* | integer | Memory in MB. At most 2x cpu_units. |
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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. |
| user_ips* | array | Public IP of each player, host first. Add late joiners with edgegap_authorize_relay_user. |
| webhook_url | string | Called when the session is ready. |
| timeout_seconds | integer | Default 30. |
| wait_until_ready | boolean | Poll until the relay is assigned. Default true. |
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.
| Argument | Type | Description |
|---|---|---|
| tag* | string | The exact tag to delete, e.g. "build-41". |
| dry_run | boolean | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. |
| image_name* | string | The image name only, e.g. "my-game-server", as for edgegap_list_registry_tags. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"image_name",
"tag"
],
"properties": {
"tag": {
"type": "string",
"description": "The exact tag to delete, e.g. \"build-41\"."
},
"dry_run": {
"type": "boolean",
"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."
},
"image_name": {
"type": "string",
"minLength": 1,
"description": "The image name only, e.g. \"my-game-server\", as for edgegap_list_registry_tags."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. |
| session_id* | string | The exact session_id of the one session to delete, e.g. "0724828881e2-S". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"session_id"
],
"properties": {
"dry_run": {
"type": "boolean",
"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."
},
"session_id": {
"type": "string",
"description": "The exact session_id of the one session to delete, e.g. \"0724828881e2-S\"."
}
}
}Start one authoritative dedicated game server from an application version, placed near the players you specify. This is the recommended way to host a multiplayer match: the server owns the game state, so no player hosts it. Returns immediately with a request_id; the server is still starting and has no connection details yet. Follow this call with edgegap_wait_for_deployment to get the address players connect to. Always stop deployments you started for testing. Every deployment is tagged "edgegap-mcp" in addition to any tags you pass, so edgegap_list_deployments with only_agent_deployments: true finds them all. Runs until stopped or until the version's max_duration, which the result reports. Refused, with nothing sent, if the API token appears in an env var or tag, if the version uses the "latest" docker tag, or when too many agent deployments are already running (EDGEGAP_MAX_AGENT_DEPLOYMENTS, default 5): stop finished ones first. Env vars named like secrets are hidden in the dashboard.
| Argument | Type | Description |
|---|---|---|
| env | array | Environment variables for this deployment only. Values are never echoed back. |
| tags | array | Extra tags for filtering later, e.g. ["agent-test"]. "edgegap-mcp" is always added. |
| users* | object | Where the players are. Exactly one of these two is required. |
| dry_run | boolean | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. |
| version* | string | Version name within the application. |
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.
| Argument | Type | Description |
|---|---|---|
| ports | array | Ports the server listens on. Default: 7777, with the protocol the netcode uses (UDP if unknown). |
| engine* | string | Game engine of the server build. |
| netcode | string | Networking transport, to pick the protocol. Known: mirror-kcp, kcp, mirror-telepathy, telepathy, mirror-simpleweb, simpleweb, websocket, fishnet-tugboat, tugboat, netcode-for-gameobjects, ngo, unity-transport, utp, photon-fusion, litenetlib, enet, unreal-netdriver, godot-enet, godot-websocket. |
| base_image | string | Default "ubuntu:22.04". |
| build_path | string | Server build folder, relative to where docker build runs. Defaults: unity "Builds/EdgegapServer", unreal "." (run from inside the packaged LinuxServer folder), godot "build". |
Read one version in full: image, resources, ports, max_duration, whether image caching (force_cache) and verify_image are on, restart policy, and the names of its env vars (values are never shown). Use it before edgegap_update_app_version or edgegap_deploy to check what a version will do.
| Argument | Type | Description |
|---|---|---|
| version* | string | Version name, as listed by edgegap_list_app_versions. |
| application* | string | Application name. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"application",
"version"
],
"properties": {
"version": {
"type": "string",
"description": "Version name, as listed by edgegap_list_app_versions."
},
"application": {
"type": "string",
"description": "Application name."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| request_id* | string | The request_id returned by edgegap_deploy. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string",
"description": "The request_id returned by edgegap_deploy."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| request_id* | string | The request_id of the deployment. |
| max_characters | integer | Truncate logs to this length, keeping the tail. Default 8000. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string",
"description": "The request_id of the deployment."
},
"max_characters": {
"type": "integer",
"maximum": 50000,
"minimum": 500,
"description": "Truncate logs to this length, keeping the tail. Default 8000."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| step | string | Averaging step, e.g. "30s" or "5m". Default: the API's. |
| end_time | string | ISO 8601. Default: now, or when it stopped. |
| request_id* | string | The request_id of the deployment. |
| start_time | string | ISO 8601. Default: when the deployment started. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"request_id"
],
"properties": {
"step": {
"type": "string",
"description": "Averaging step, e.g. \"30s\" or \"5m\". Default: the API's."
},
"end_time": {
"type": "string",
"description": "ISO 8601. Default: now, or when it stopped."
},
"request_id": {
"type": "string",
"description": "The request_id of the deployment."
},
"start_time": {
"type": "string",
"description": "ISO 8601. Default: when the deployment started."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| tag | string | Unique build tag for the commands, e.g. a build ID. Never "latest". |
| image_name | string | Image name without project or tag, e.g. "my-game-server". Used to build the commands. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"tag": {
"type": "string",
"description": "Unique build tag for the commands, e.g. a build ID. Never \"latest\"."
},
"image_name": {
"type": "string",
"pattern": "^[a-z0-9]+([._-][a-z0-9]+)*$",
"description": "Image name without project or tag, e.g. \"my-game-server\". Used to build the commands."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| session_id* | string | Returned by edgegap_create_relay_session. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"session_id"
],
"properties": {
"session_id": {
"type": "string",
"description": "Returned by edgegap_create_relay_session."
}
}
}Load one Edgegap agent skill: its SKILL.md (the workflow to follow) by default, or one of its reference documents or templates with file. Load the matching skill before acting on a game project — edgegap-ngo for Unity with Netcode for GameObjects, edgegap-fishnet for Unity with FishNet, edgegap-purrnet for Unity with PurrNet, edgegap-fusion for Unity with Photon Fusion 2, edgegap-unity for other Unity projects, edgegap-unreal for Unreal Engine (edgegap-eos-voice for voice chat), edgegap-fusion-simplefps for the Photon Simple FPS sample, edgegap-godot for Godot 4 with a Godot server, edgegap-colyseus for a Colyseus server, edgegap-nakama for a Nakama backend, edgegap-playfab for PlayFab Matchmaking, edgegap-threejs for a Three.js/browser game with a Node.js server, edgegap-manus for a browser game built with Manus, edgegap otherwise — and fetch the references and templates it points to as you reach them. No API call.
| Argument | Type | Description |
|---|---|---|
| file | string | A file inside the skill, e.g. "references/deploy.md" or "assets/docker/Dockerfile". Default SKILL.md. |
| skill* | string | 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. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"skill"
],
"properties": {
"file": {
"type": "string",
"description": "A file inside the skill, e.g. \"references/deploy.md\" or \"assets/docker/Dockerfile\". Default SKILL.md."
},
"skill": {
"type": "string",
"description": "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."
}
}
}List the versions under an application, with their container image, resources, ports (including whether TLS Upgrade is on, which browser/WebGL clients need for wss://) and whether a registry login is set for pulling the image. Use this to find the version name to deploy, to check a version is ready before deploying, or to copy settings from a working version when creating a new one.
| Argument | Type | Description |
|---|---|---|
| application* | string | Application name, as returned by edgegap_list_apps. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"application"
],
"properties": {
"application": {
"type": "string",
"description": "Application name, as returned by edgegap_list_apps."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| page | integer | |
| limit | integer | Results per page. Default 50. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page. Default 50."
}
}
}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"]).
| Argument | Type | Description |
|---|---|---|
| limit | integer | Default 50. |
| filters | array | Omit for all deployments. |
| order_by | array | e.g. [{field:"created_at",order:"asc"}] for oldest first. |
| only_agent_deployments | boolean | 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": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Default 50."
},
"filters": {
"type": "array",
"items": {
"type": "object",
"required": [
"field",
"operator",
"value"
],
"properties": {
"field": {
"enum": [
"status",
"request_id",
"tags",
"created_at",
"application",
"version",
"fleet_name",
"host_name"
],
"type": "string"
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "A string, or an array of strings for in/nin. created_at is ISO 8601, e.g. \"2026-09-30T00:00:00Z\"."
},
"operator": {
"enum": [
"eq",
"neq",
"in",
"nin",
"gte",
"lte",
"ilike"
],
"type": "string"
}
}
},
"description": "Omit for all deployments."
},
"order_by": {
"type": "array",
"items": {
"type": "object",
"required": [
"field",
"order"
],
"properties": {
"field": {
"enum": [
"created_at",
"available_session_sockets"
],
"type": "string"
},
"order": {
"enum": [
"asc",
"desc"
],
"type": "string"
}
}
},
"description": "e.g. [{field:\"created_at\",order:\"asc\"}] for oldest first."
},
"only_agent_deployments": {
"type": "boolean",
"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."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| page | integer | |
| limit | integer | Default 100. |
| version | string | |
| application | string | With version: only locations with capacity for it now. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Default 100."
},
"version": {
"type": "string"
},
"application": {
"type": "string",
"description": "With version: only locations with capacity for it now."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| page | integer | |
| limit | integer | Default 100. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Default 100."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| page | integer | |
| limit | integer | Default 20. |
| image_name* | string | 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. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"image_name"
],
"properties": {
"page": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Default 20."
},
"image_name": {
"type": "string",
"minLength": 1,
"description": "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."
}
}
}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.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}List the Edgegap agent skills: tested, step-by-step workflows for getting a multiplayer game online on Edgegap, with templates (Dockerfiles, matchmaker configs, Unity C# and Unreal C++ drop-ins) and known pitfalls. Before working on a game project, load the matching skill with edgegap_get_skill: edgegap-ngo for Unity with Netcode for GameObjects, edgegap-fishnet for Unity with FishNet, edgegap-purrnet for Unity with PurrNet, edgegap-fusion for Unity with Photon Fusion 2, edgegap-unity for other Unity projects, edgegap-unreal for Unreal Engine (edgegap-eos-voice to add voice chat to it), edgegap-fusion-simplefps for the Photon Simple FPS sample, edgegap-godot for Godot 4 with a Godot server, edgegap-colyseus for a Colyseus server, edgegap-nakama for a game with a Nakama backend, edgegap-playfab for a game that keeps PlayFab Matchmaking, edgegap-threejs for a Three.js or other browser game with its own Node.js server, edgegap-manus for a browser game built with Manus, edgegap for any other engine or platform questions; it routes to the rest. Also says whether a newer skills pack is on GitHub (reads one version number, no Edgegap API call).
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. |
| session_id* | string | The relay session_id, e.g. "0724828881e2-S". |
| user_authorization_token* | integer | The player's authorization token, not the session's. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"session_id",
"user_authorization_token"
],
"properties": {
"dry_run": {
"type": "boolean",
"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."
},
"session_id": {
"type": "string",
"description": "The relay session_id, e.g. \"0724828881e2-S\"."
},
"user_authorization_token": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The player's authorization token, not the session's."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. |
| request_id* | string | The exact request_id of the one deployment to stop, e.g. "61b1be8f54d9". |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"request_id"
],
"properties": {
"dry_run": {
"type": "boolean",
"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."
},
"request_id": {
"type": "string",
"description": "The exact request_id of the one deployment to stop, e.g. \"61b1be8f54d9\"."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. |
| is_active* | boolean | false blocks new deployments; true allows them again. |
| application* | string | Application name. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"application",
"is_active"
],
"properties": {
"dry_run": {
"type": "boolean",
"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."
},
"is_active": {
"type": "boolean",
"description": "false blocks new deployments; true allows them again."
},
"application": {
"type": "string",
"description": "Application name."
}
}
}Change settings on an existing version instead of creating a new one: point it at a new image tag, turn it on or off, change max_duration, set the registry login, turn on image caching (force_cache: Edgegap pre-loads the image so deployments start faster), or set the shutdown grace period. Only the fields you pass change. Deployments already running keep their old settings; new deployments get the new ones. Same refusals as edgegap_create_app_version: "latest" or empty tags, a docker_image holding a host or tag, and the API token in the registry login. Resources, ports and env vars cannot be changed here; create a new version for those.
| Argument | Type | Description |
|---|---|---|
| dry_run | boolean | Show the exact request (method, host, path, body) with secrets masked, and send nothing. Local checks still run. Use it to confirm a billable or destructive call before making it. |
| version* | string | Version name to change. |
| is_active | boolean | false blocks new deployments of this version. |
| docker_tag | string | New image tag: a build ID, commit SHA or timestamp. |
| application* | string | Application name. |
| force_cache | boolean | Pre-load the image on Edgegap so deployments start faster. |
| docker_image |
Check whether the Edgegap agent skills installed in the developer's agent are the latest, and update them. This hosted server cannot see the developer's disk: pass installed_versions (each loaded skill's metadata.version from its SKILL.md frontmatter) and it compares them with the latest on GitHub and says how to update. Skill text is never downloaded by this tool. The skills served by edgegap_get_skill need no update here.
| Argument | Type | Description |
|---|---|---|
| installed_versions | object | Skill name → version of skills you have loaded from somewhere this server cannot see, e.g. {"edgegap-unity": "0.1.8"}. The version is metadata.version in the SKILL.md frontmatter. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"installed_versions": {
"type": "object",
"description": "Skill name → version of skills you have loaded from somewhere this server cannot see, e.g. {\"edgegap-unity\": \"0.1.8\"}. The version is metadata.version in the SKILL.md frontmatter.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| ports | array | Ports you plan to pass to edgegap_create_app_version. |
| engine | string | Game engine. Detected from the Dockerfile when omitted. |
| netcode | string | Networking transport, to check the port protocol. Known: mirror-kcp, kcp, mirror-telepathy, telepathy, mirror-simpleweb, simpleweb, websocket, fishnet-tugboat, tugboat, netcode-for-gameobjects, ngo, unity-transport, utp, photon-fusion, litenetlib, enet, unreal-netdriver, godot-enet, godot-websocket. |
| cpu_units | integer | |
| memory_mb | integer | |
| docker_tag | string |
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.
| Argument | Type | Description |
|---|---|---|
| request_id* | string | The request_id returned by edgegap_deploy. |
| timeout_seconds | integer | How long to wait before giving up. Default 180. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string",
"description": "The request_id returned by edgegap_deploy."
},
"timeout_seconds": {
"type": "integer",
"maximum": 600,
"minimum": 5,
"description": "How long to wait before giving up. Default 180."
}
}
}| Default "30s", so a developer testing alone is matched or told to retry within 30 s instead of waiting minutes. Raise it only for production queues. |
| allowed_cors_origins | array | Origins of web pages allowed to call the matchmaker, e.g. ["https://mygame.example.com", "http://localhost:8080"]. Required when game clients run in a browser (WebGL): browsers block matchmaker calls from any origin not listed. Scheme and host only, no path. |
| latency_difference_ms | integer | Max ping spread between matched players. Default 100. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"profile_name",
"application",
"version",
"team_count",
"min_team_size",
"max_team_size"
],
"properties": {
"inspect": {
"type": "boolean",
"description": "Expose the inspection API for debugging. Default true; turn off for production."
},
"version": {
"type": "string",
"description": "Version the matchmaker deploys."
},
"expansions": {
"type": "array",
"items": {
"type": "object",
"required": [
"after_seconds"
],
"properties": {
"after_seconds": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"min_team_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"max_latency_ms": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
}
}
},
"description": "Rule relaxations after a player has waited this long, e.g. [{after_seconds: 20, min_team_size: 1}]. Keep each below ticket_expiration."
},
"team_count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Teams per match. 1 for free-for-all or co-op."
},
"application": {
"type": "string",
"description": "Application the matchmaker deploys."
},
"profile_name": {
"type": "string",
"description": "Profile clients will queue into, e.g. \"casual-2v2\"."
},
"max_team_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"min_team_size": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1
},
"max_latency_ms": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "Adds a latency rule: drop players above this ping to the chosen region. Needs beacon pings from the client."
},
"verify_version": {
"type": "boolean",
"description": "Look up the application version first. Default true."
},
"ticket_expiration": {
"type": "string",
"description": "Default \"30s\", so a developer testing alone is matched or told to retry within 30 s instead of waiting minutes. Raise it only for production queues."
},
"allowed_cors_origins": {
"type": "array",
"items": {
"type": "string"
},
"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."
},
"latency_difference_ms": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Max ping spread between matched players. Default 100."
}
}
}| docker_tag* | string | Image tag: a build ID, commit SHA or timestamp. "latest" and empty tags are refused. |
| application* | string | Existing application name. |
| docker_image* | string | Namespaced image, e.g. "mystudio/game-server". |
| verify_image | boolean | Verify Edgegap can pull the image before accepting the version. |
| registry_token | string | Registry password or token. |
| docker_repository* | string | Registry host, e.g. "docker.io" or "registry.edgegap.com". |
| registry_username | string | Registry username. Needed for private images, including images in your own registry.edgegap.com project: Edgegap pulls with this login, not your API token. |
| max_duration_minutes | integer | Auto-stop after this many minutes. Keeps test deployments from running up cost. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"application",
"name",
"docker_repository",
"docker_image",
"docker_tag",
"cpu_units",
"memory_mb",
"ports"
],
"properties": {
"env": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"value"
],
"properties": {
"key": {
"type": "string"
},
"value": {
"type": "string"
}
}
},
"description": "Environment variables injected into the container. Values are never echoed back."
},
"name": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "Version identifier, typically a build ID or timestamp."
},
"ports": {
"type": "array",
"items": {
"type": "object",
"required": [
"port",
"protocol"
],
"properties": {
"name": {
"type": "string",
"description": "Label, e.g. \"gameport\"."
},
"port": {
"type": "integer",
"maximum": 59999,
"minimum": 1,
"description": "Port the server listens on."
},
"protocol": {
"type": "string",
"description": "One of UDP, TCP, TCP/UDP, HTTP, HTTPS, WS, WSS. Most game servers use UDP."
},
"to_check": {
"type": "boolean",
"description": "Readiness check on this port. Default true."
},
"tls_upgrade": {
"type": "boolean",
"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."
}
}
},
"minItems": 1,
"description": "Ports to expose. At least one is required for players to connect."
},
"dry_run": {
"type": "boolean",
"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."
},
"cpu_units": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 256,
"description": "vCPU units. 1024 = 1 vCPU."
},
"memory_mb": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 256,
"description": "Memory in MB. At most 2x cpu_units."
},
"docker_tag": {
"type": "string",
"description": "Image tag: a build ID, commit SHA or timestamp. \"latest\" and empty tags are refused."
},
"application": {
"type": "string",
"description": "Existing application name."
},
"docker_image": {
"type": "string",
"description": "Namespaced image, e.g. \"mystudio/game-server\"."
},
"verify_image": {
"type": "boolean",
"description": "Verify Edgegap can pull the image before accepting the version."
},
"registry_token": {
"type": "string",
"description": "Registry password or token."
},
"docker_repository": {
"type": "string",
"description": "Registry host, e.g. \"docker.io\" or \"registry.edgegap.com\"."
},
"registry_username": {
"type": "string",
"description": "Registry username. Needed for private images, including images in your own registry.edgegap.com project: Edgegap pulls with this login, not your API token."
},
"max_duration_minutes": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Auto-stop after this many minutes. Keeps test deployments from running up cost."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"user_ips"
],
"properties": {
"dry_run": {
"type": "boolean",
"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."
},
"user_ips": {
"type": "array",
"items": {
"type": "string",
"minLength": 3
},
"minItems": 1,
"description": "Public IP of each player, host first. Add late joiners with edgegap_authorize_relay_user."
},
"webhook_url": {
"type": "string",
"format": "uri",
"description": "Called when the session is ready."
},
"timeout_seconds": {
"type": "integer",
"maximum": 120,
"minimum": 5,
"description": "Default 30."
},
"wait_until_ready": {
"type": "boolean",
"description": "Poll until the relay is assigned. Default true."
}
}
}| cpu_units | integer | Override the version CPU (with memory_mb). Not in the published v2 spec, so the API may ignore it; a version with the size you need is the reliable way. |
| memory_mb | integer | Override the version memory (with cpu_units). Same caveat as cpu_units. |
| application* | string | Application name. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"application",
"version",
"users"
],
"properties": {
"env": {
"type": "array",
"items": {
"type": "object",
"required": [
"key",
"value"
],
"properties": {
"key": {
"type": "string"
},
"value": {
"type": "string"
}
}
},
"description": "Environment variables for this deployment only. Values are never echoed back."
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"description": "Extra tags for filtering later, e.g. [\"agent-test\"]. \"edgegap-mcp\" is always added."
},
"users": {
"type": "object",
"properties": {
"ip_addresses": {
"type": "array",
"items": {
"type": "string"
},
"description": "Public IPv4/IPv6 addresses of the players. Edgegap places the server near them."
},
"geo_coordinates": {
"type": "array",
"items": {
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number"
},
"longitude": {
"type": "number"
}
}
},
"description": "Latitude/longitude pairs, as an alternative to IP addresses."
}
},
"description": "Where the players are. Exactly one of these two is required."
},
"dry_run": {
"type": "boolean",
"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."
},
"version": {
"type": "string",
"description": "Version name within the application."
},
"cpu_units": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 256,
"description": "Override the version CPU (with memory_mb). Not in the published v2 spec, so the API may ignore it; a version with the size you need is the reliable way."
},
"memory_mb": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 256,
"description": "Override the version memory (with cpu_units). Same caveat as cpu_units."
},
"application": {
"type": "string",
"description": "Application name."
}
}
}| executable | string | File name of the server binary or start script inside build_path. Defaults: unity "ServerBuild", unreal "StartServer.sh", godot "server.x86_64". Required for "other". |
| launch_args | array | Extra server arguments, one per entry, e.g. ["-log", "-port=7777"]. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"engine"
],
"properties": {
"ports": {
"type": "array",
"items": {
"type": "object",
"required": [
"port",
"protocol"
],
"properties": {
"name": {
"type": "string"
},
"port": {
"type": "integer",
"maximum": 59999,
"minimum": 1
},
"protocol": {
"enum": [
"UDP",
"TCP",
"TCP/UDP",
"HTTP",
"HTTPS",
"WS",
"WSS"
],
"type": "string"
},
"tls_upgrade": {
"type": "boolean",
"description": "TLS Upgrade (wss/https) on a WS or HTTP port, for browser clients."
}
}
},
"description": "Ports the server listens on. Default: 7777, with the protocol the netcode uses (UDP if unknown)."
},
"engine": {
"enum": [
"unity",
"unreal",
"godot",
"other"
],
"type": "string",
"description": "Game engine of the server build."
},
"netcode": {
"type": "string",
"description": "Networking transport, to pick the protocol. Known: mirror-kcp, kcp, mirror-telepathy, telepathy, mirror-simpleweb, simpleweb, websocket, fishnet-tugboat, tugboat, netcode-for-gameobjects, ngo, unity-transport, utp, photon-fusion, litenetlib, enet, unreal-netdriver, godot-enet, godot-websocket."
},
"base_image": {
"type": "string",
"description": "Default \"ubuntu:22.04\"."
},
"build_path": {
"type": "string",
"description": "Server build folder, relative to where docker build runs. Defaults: unity \"Builds/EdgegapServer\", unreal \".\" (run from inside the packaged LinuxServer folder), godot \"build\"."
},
"executable": {
"type": "string",
"description": "File name of the server binary or start script inside build_path. Defaults: unity \"ServerBuild\", unreal \"StartServer.sh\", godot \"server.x86_64\". Required for \"other\"."
},
"launch_args": {
"type": "array",
"items": {
"type": "string"
},
"description": "Extra server arguments, one per entry, e.g. [\"-log\", \"-port=7777\"]."
}
}
}| string |
| Image path, e.g. "my-org-abc123/my-game-server". |
| verify_image | boolean | Check Edgegap can pull the image when saving. |
| registry_token | string | Registry password or token. Never echoed back. |
| docker_repository | string | Registry host, e.g. "registry.edgegap.com". |
| registry_username | string |
| max_duration_minutes | integer | Auto-stop after this many minutes. Capped by EDGEGAP_MAX_DURATION_MINUTES. |
| termination_grace_period_seconds | integer | Seconds between SIGTERM and SIGKILL when a deployment stops. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"application",
"version"
],
"properties": {
"dry_run": {
"type": "boolean",
"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."
},
"version": {
"type": "string",
"description": "Version name to change."
},
"is_active": {
"type": "boolean",
"description": "false blocks new deployments of this version."
},
"docker_tag": {
"type": "string",
"description": "New image tag: a build ID, commit SHA or timestamp."
},
"application": {
"type": "string",
"description": "Application name."
},
"force_cache": {
"type": "boolean",
"description": "Pre-load the image on Edgegap so deployments start faster."
},
"docker_image": {
"type": "string",
"description": "Image path, e.g. \"my-org-abc123/my-game-server\"."
},
"verify_image": {
"type": "boolean",
"description": "Check Edgegap can pull the image when saving."
},
"registry_token": {
"type": "string",
"description": "Registry password or token. Never echoed back."
},
"docker_repository": {
"type": "string",
"description": "Registry host, e.g. \"registry.edgegap.com\"."
},
"registry_username": {
"type": "string"
},
"max_duration_minutes": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Auto-stop after this many minutes. Capped by EDGEGAP_MAX_DURATION_MINUTES."
},
"termination_grace_period_seconds": {
"type": "integer",
"maximum": 3600,
"minimum": 0,
"description": "Seconds between SIGTERM and SIGKILL when a deployment stops."
}
}
}| dockerfile | string | Full text of the Dockerfile. |
| docker_image | string |
| docker_repository | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"ports": {
"type": "array",
"items": {
"type": "object",
"required": [
"port",
"protocol"
],
"properties": {
"name": {
"type": "string"
},
"port": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"protocol": {
"type": "string"
},
"tls_upgrade": {
"type": "boolean",
"description": "TLS Upgrade (wss/https) on a WS or HTTP port, for browser clients."
}
}
},
"description": "Ports you plan to pass to edgegap_create_app_version."
},
"engine": {
"enum": [
"unity",
"unreal",
"godot",
"other"
],
"type": "string",
"description": "Game engine. Detected from the Dockerfile when omitted."
},
"netcode": {
"type": "string",
"description": "Networking transport, to check the port protocol. Known: mirror-kcp, kcp, mirror-telepathy, telepathy, mirror-simpleweb, simpleweb, websocket, fishnet-tugboat, tugboat, netcode-for-gameobjects, ngo, unity-transport, utp, photon-fusion, litenetlib, enet, unreal-netdriver, godot-enet, godot-websocket."
},
"cpu_units": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"memory_mb": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"docker_tag": {
"type": "string"
},
"dockerfile": {
"type": "string",
"description": "Full text of the Dockerfile."
},
"docker_image": {
"type": "string"
},
"docker_repository": {
"type": "string"
}
}
}