{slug}.mcp.ezforge.ai.
Required scope: servers:read (read), servers:write (mutations)
List all servers
servers:read scope).
Query parameters: Standard pagination (limit, cursor) — supported for API key auth path.
Response 200:
List servers in project
limit, cursor)
Response 200:
runMode field (see Run modes).
Server statuses:
Create server
The Free plan is limited to
cpu shared-1x and memoryMb 256. Requesting a larger size returns 403 (plan_limit_exceeded); paid plans can use every listed size.
runMode selects the idle behavior; always_on returns 403 (plan_limit_exceeded) on the Free plan, 403 (spend_cap_exceeded) when the projected period total would pass the spend cap, and an invalid value returns 422. See Run modes and Always-on and the spend cap.
Response 201: Created server object.
Get server
200: Single server object, plus a machineState field reporting the live state of the underlying machine.
machineState values:
status is the server’s recorded lifecycle status and is not updated when the machine idle-stops or auto-starts, so it can differ from machineState. Use machineState to check whether the machine is running at the moment of the request. The lookup is best-effort: a failure never fails the request and never changes status.
Run modes
Each server has arunMode that controls what its machine does when idle. It is returned on every server object.
Always-on and the spend cap
Creating a server withalways_on, switching a server to it, or changing the size of a server that is already always_on is refused with 403 (spend_cap_exceeded) when the projected total for the billing period would exceed the account’s spend cap. The projection is the plan fee, plus metered usage so far this period (before credit), plus the always-on hours for the rest of the period at the per-hour price for the machine size (the monthly price ÷ 730), plus the remaining always-on charge of the account’s other always-on servers. The error message names the projected total, the cap, and the billing page where the cap can be raised. If billing cannot be read, the request returns 503 (billing_unavailable) and changes nothing. Scale accounts, whose cap is set by contract, skip this check.
New servers are created with auto_suspend. Servers that existed before run modes were introduced keep auto_stop, the behavior their machines already had. A suspended machine reports machineState: "stopped" (see Get server).
The platform keeps a timestamped history of each server’s runMode for usage metering. A row is recorded when the server is created and on each runMode change made with PATCH /v1/servers/:serverId. A change is recorded only after the machine update succeeds, so a failed update records nothing and a retry with the same value is still recorded. This history has no public endpoint and adds no request or response fields.
Compute metering
Compute usage is recorded in the platform’s usage ledger once per closed UTC hour for each server, keyed by the machine’s size (for exampleshared-1x-256mb). Which meter an hour uses depends on the server’s runMode during that hour:
The platform polls each machine’s state every 5 minutes and collects closed hours every 15 minutes, re-checking the last 24 hours on each pass. Re-running an hour replaces its quantity, so usage is never double-counted. If the samples do not establish what the machine did in an hour (for example, polls are missing for more than 15 minutes, a state change cannot be placed in time, or no sample reports the machine’s size), no usage is recorded for that hour. It is not estimated, and a later pass retries it for up to 24 hours, while the samples exist. Machines whose CPU and memory are not one of the billed sizes are not metered.
Polling and collecting are separate loops, each under its own lock, so only one platform instance polls at a time and only one collects at a time. A long collection pass never delays polling, so it cannot leave gaps in the machine-state samples. If an instance cannot take a loop’s lock, it skips that pass.
The collector reads and writes 100 servers at a time. Re-running an hour that already holds the computed quantity writes nothing. If recording a batch fails, its hours are not recorded that pass, and the next pass retries them while they are inside the 24-hour window. Hours of a server deleted while the pass is running are not recorded.
Compute metering is internal. It adds no endpoint and no request or response fields.
runMode can be set on POST /v1/projects/:projectId/servers and PATCH /v1/servers/:serverId. The Free plan is limited to auto_stop and auto_suspend; requesting always_on returns 403 (plan_limit_exceeded). Paid plans may use all three. An invalid value returns 422.Update server
The same plan limits apply as on create: a Free account setting
cpu or memoryMb above shared-1x / 256, or runMode to always_on, receives 403 (plan_limit_exceeded). An invalid runMode returns 422. A switch to always_on, or a cpu / memoryMb change on a server that is already always_on, returns 403 (spend_cap_exceeded) when the projected period total would pass the spend cap (see Always-on and the spend cap).
Response 200: Updated server object.
Delete server
204: No content.
Get server metrics
Coming soon. This endpoint is planned but not yet implemented. It currently returns
501 Not Implemented.200: