Since WarpEngine 1.0 everything the ActiveAdmin resources do is also a JSON API under
/api/admin/v1: the catalog with its releases, assets, links and images, the status and category vocabulary, platform links, download statistics, pipelines, the artifact store and the application tokens. It is off until the host turns it on, it describes itself in an OpenAPI 3.1 document, and it can serve the same operations to LLM agents as an MCP server. The read side for catalog readers stays WECP.
# config/initializers/warp_engine.rb
WarpEngine.configure do |c|
c.admin_api.enabled = true
c.admin_api.mcp = true # needs gem "mcp" in the Gemfile
c.admin_api.rate_limit = { to: 300, within: 1.minute } # per token
end
| Key | Default | Meaning |
|---|---|---|
enabled |
false |
Off: every Admin API address answers 404 |
token_owner_class |
application_token_owner_class |
The model whose tokens may hold admin scopes |
authenticator |
:application_token |
Or a callable that turns a request into a WarpEngine::AdminApi::Principal |
resources |
:all |
Or a list, for example %i[softwares releases downloads]; the rest answers 404 |
read_only |
false |
true: every write answers 405 and leaves the document |
page_size / max_page_size |
50 / 200 |
Paging of the lists |
rate_limit |
nil |
{ to:, within: } per token, counted in Rails.cache; 429 with Retry-After past it |
openapi_requires_auth |
true |
false: the OpenAPI document is public |
docs_ui |
false |
true: a Redoc page at /api/admin/v1/docs (follows the document's auth rule) |
mcp |
false |
true: MCP at /api/admin/v1/mcp |
mcp_exclude |
application_tokens, device_grants |
Resources MCP leaves out |
On teletypegames.org the Admin API and MCP are on since 1.0.0, with AdminUser tokens.
Authorization: Bearer 3f9c…
An application token issued in the admin (App Tokens → Admin API scope) or through the API itself. Three scopes, none implying another:
| Scope | Opens |
|---|---|
admin:read |
every GET |
admin:write |
every create, change, delete, trigger, sync and file operation |
admin:tokens |
the application token and device sign-in resources, reading included |
Only a token whose owner is the admin owner class may hold them — a publisher's token never becomes an admin token. A token can grant no admin scope it lacks, no unrestricted, and no expiry past its own; it cannot rotate a token wider than itself either, since rotation hands over the new secret. It may issue publishing tokens (update, upload) and client tokens (catalog).
perPage, needsReview).{ "data": [ … ], "meta": { "page", "perPage", "total", "totalPages", "nextPage" } }; page and perPage choose, sort=title or sort=-createdAt orders.{ "data": { … } }. A delete answers 204.{ "error": "Validation failed", "details": { "name": ["has already been taken"] } }.WarpEngine-Version and WarpEngine-Admin-Api: 1.warp_engine.admin_api.write with the principal, the operation and via (http or mcp), for a host's audit log.| Resource | Operations |
|---|---|
| Softwares | GET/POST /softwares, GET/PATCH/DELETE /softwares/{id} (include=releases,images,externalLinks,extras) |
| Releases | GET/POST /softwares/{softwareId}/releases, GET/PATCH/DELETE /releases/{id} |
| Release assets | GET/POST /releases/{releaseId}/assets, GET/PATCH/DELETE /assets/{id} |
| External links | GET/POST /softwares/{softwareId}/external_links, GET/PATCH/DELETE /external_links/{id} |
| Software images | GET/POST /softwares/{softwareId}/images, POST …/images/upload (multipart), GET/PATCH/DELETE /software_images/{id} |
| Additional resources | GET/PATCH /softwares/{softwareId}/extras/{association} — a host's own records, see below |
| Vocabulary | /software_statuses, /software_categories, /platform_links, each with GET/POST and GET/PATCH/DELETE /{id} |
| Downloads | GET /downloads, GET /downloads/{id}, /downloads/summary, /downloads/top_files, /downloads/top_softwares, /softwares/{id}/download_stats |
| Pipelines | GET /pipelines, GET/PATCH /pipelines/{id}, GET /pipelines/{id}/runs, POST /pipelines/{id}/trigger, POST /pipelines/sync |
| Files | GET /files?dir=, POST /files (multipart), POST /files/directories, PATCH /files, DELETE /files?path= |
| Tokens | GET/POST /application_tokens, GET/PATCH/DELETE /application_tokens/{id}, POST /application_tokens/{id}/rotate, GET /device_grants[/{id}] |
| Meta | GET /me — the caller, its scopes and the resources it may use |
Creating a token is the one answer that carries its plainToken; it is never shown again. A host's additional_resources appear under extras once the host gives them an api_schema — on teletypegames.org that is the SEO metadata of a software.
GET /api/admin/v1/openapi.json (or openapi.yaml) is generated from the same registry that routes the requests, at request time, so it describes exactly what this host serves: resources left out, writes under read_only, and pipelines or device sign-ins where the host has no CI or no client sign-in are not in it. Each operation carries x-required-scope, and its operationId is also its MCP tool name. It needs an admin:read token unless the host made it public.
With c.admin_api.mcp = true, POST /api/admin/v1/mcp is a stateless Streamable HTTP MCP server — no session, no stream, one JSON answer per request — built on the official Ruby SDK. The same bearer token and scopes apply.
software_list, software_update, release_create, pipeline_trigger, download_summary, admin_whoami …, with the same JSON Schema as input and the same answer as structured content. A failed operation is a tool error carrying the HTTP status.tools/list shows only what the token may call, after resources, read_only and the CI and sign-in conditions.claude mcp add --transport http warp-admin https://teletypegames.org/api/admin/v1/mcp \
--header "Authorization: Bearer 3f9c…"
GET /api/service (WECP) carries an admin key: null while the Admin API is off, otherwise its version, url, openapiUrl and mcpUrl. The addresses are public; what lives there is not.