Search / page.aft/mcp
aft.page
R0· no sign-inDeploy HTML or dist/ to a live HTTPS URL. No account. Drop, MCP, or CLI.
v1.0.0 · active · repository · website · descriptor JSON · versions
Search / page.aft/mcp
R0· no sign-inDeploy HTML or dist/ to a live HTTPS URL. No account. Drop, MCP, or CLI.
v1.0.0 · active · repository · website · descriptor JSON · versions
{
"mcpServers": {
"aft": {
"type": "http",
"url": "https://mcp.aft.page/mcp"
}
}
}claude mcp add --transport http aft https://mcp.aft.page/mcp[mcp_servers.aft]
url = "https://mcp.aft.page/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"aft": {
"type": "remote",
"url": "https://mcp.aft.page/mcp",
"enabled": true
}
}
}{
"mcpServers": {
"aft": {
"type": "http",
"url": "https://mcp.aft.page/mcp"
}
},
"deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=aft&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vbWNwLmFmdC5wYWdlL21jcCJ9"
}{
"servers": {
"aft": {
"type": "http",
"url": "https://mcp.aft.page/mcp"
}
}
}{
"mcpServers": {
"aft": {
"httpUrl": "https://mcp.aft.page/mcp"
}
}
}extensions:
"aft":
enabled: true
name: "aft"
type: streamable_http
uri: "https://mcp.aft.page/mcp"
timeout: 300
protocol.modernsupports 2026-07-28 (server/discover)protocol.statelessanswers without a sessionprotocol.transportstreamable HTTPprotocol.list_ttltools/list declares ttlMs 0, so clients re-fetch it on every useauth.prm, auth.as_metadata, auth.cimdno remote uses OAuthauth.secret_in_urlno templated URLtools.descriptionsevery tool has a descriptiontools.description_lengthdescriptions are concisetools.schemasevery tool has an object input schematools.annotations6 of 6 tools declare readOnlyHint or destructiveHinttools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHinttools.token_costabout 1,324 tokens to load every tooltools.api_dumptools are not a one-to-one API dumpstability.changes10 tool changes in 30 daysstability.rug_pullno tool changed its meaning under the same namedeps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI packagedeploychangeddescriptionPublish to a live URL. Pass html (one page) OR files (built site). Plain HTML → html. Vite/React → npm run build, then files from dist/. Next static export → files from out/. Always include index.html. Never upload src/, node_modules, or .next/. First hit: preferred_slug from aft.json (include aft.json in files). Later: same slug + edit_token from .aft/state.json — every update is a new version (v1, v2…) at the same URL. Pass hold:true to keep an update as a preview until aft_promote. label names the version. Limits: 500 files, 25MB each, 100MB total.
Publish to a live URL. Pass html (one page) OR files (a built site, or a small app's source). Plain HTML → html. Vite/React → npm run build, then files from dist/. Next static export → files from out/; a static site needs index.html. Flask/FastAPI/Django/Express → the source files with requirements.txt or package.json; aft builds and runs it. Never upload node_modules, .venv, or .next/. First hit: preferred_slug from aft.json (include aft.json in files). Later: same slug + edit_token from .aft/state.json — every update is a new version (v1, v2…) at the same URL. Pass hold:true to keep an update as a preview until aft_promote. label names the version. Limits: 500 files, 25MB each, 100MB total.
aft_promoteaddedMake a held preview version live at the same URL. Pass version (e.g. 4) or deploy_id from aft_deploys. Needs edit_token.
aft_rollbackchangeddescription, input schemaPoint the live slug at a prior deployId from aft_deploys. Same URL. Needs edit_token from .aft/state.json. Claim not required.
Point the live slug at a prior version from aft_deploys, by version number or deploy_id. Same URL. Needs edit_token from .aft/state.json. Claim not required.
aft_deployschangeddescriptionList rollback-able deploys for a slug. Needs edit_token from .aft/state.json (or the first deploy). Same history the project UI shows after claim.
List the versions (v1, v2…) of a slug with their label, door, commit and whether each is live or a held preview. Needs edit_token from .aft/state.json (or the first deploy). Same history the project UI shows after claim.
deploychangeddescription, input schemaPublish to a live URL. Pass html (one page) OR files (built site). Plain HTML → html. Vite/React → npm run build, then files from dist/. Next static export → files from out/. Always include index.html. Never upload src/, node_modules, or .next/. First hit: preferred_slug from aft.json (include aft.json in files). Later: same slug + edit_token from .aft/state.json. Limits: 500 files, 25MB each, 100MB total.
Publish to a live URL. Pass html (one page) OR files (built site). Plain HTML → html. Vite/React → npm run build, then files from dist/. Next static export → files from out/. Always include index.html. Never upload src/, node_modules, or .next/. First hit: preferred_slug from aft.json (include aft.json in files). Later: same slug + edit_token from .aft/state.json — every update is a new version (v1, v2…) at the same URL. Pass hold:true to keep an update as a preview until aft_promote. label names the version. Limits: 500 files, 25MB each, 100MB total.
aft_healthchangedannotationsaft_rollbackchangedannotationsaft_deployschangedannotationsdeploy_repochangedannotationsdeploychangedannotationsFull history: list_changes · trend: quality JSON.
Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.
+repository +dns-namespace +website +reachable +uptime-97% ~updated-51d-ago
Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.
| remote | auth | reachable | uptime 30d | p50 | protocol | last ok |
|---|---|---|---|---|---|---|
https://mcp.aft.page/mcp streamable-http | none | yes | 97% | 642 ms | 2026-07-28 | 2026-10-20 |
aft_deploysread-only | List the versions (v1, v2…) of a slug with their label, door, commit and whether each is live or a held preview. Needs edit_token from .aft/state.json (or the first deploy). Same history the project UI shows after claim. |
aft_healthread-only | Ping the aft.page deploy API. |
aft_promote | Make a held preview version live at the same URL. Pass version (e.g. 4) or deploy_id from aft_deploys. Needs edit_token. |
aft_rollbackdestructive | Point the live slug at a prior version from aft_deploys, by version number or deploy_id. Same URL. Needs edit_token from .aft/state.json. Claim not required. |
deploy | Publish to a live URL. Pass html (one page) OR files (a built site, or a small app's source). Plain HTML → html. Vite/React → npm run build, then files from dist/. Next static export → files from out/; a static site needs index.html. Flask/FastAPI/Django/Express → the source files with requirements.txt or package.json; aft builds and runs it. Never upload node_modules, .venv, or .next/. First hit: preferred_slug from aft.json (include aft.json in files). Later: same slug + edit_token from .aft/state.json — every update is a new version (v1, v2…) at the same URL. Pass hold:true to keep an update as a preview until aft_promote. label names the version. Limits: 500 files, 25MB each, 100MB total. |
deploy_repo | Same engine as aft.page/run: public GitHub URL → detect → build → live URL. Static is instant; Vite and Next.js build in the background (polls until live or failed). Private repos are refused. For a local project dir, use hosted CLI aft deploy instead. |
Schemas: list_tools.
{
"name": "page.aft/mcp",
"title": "aft.page",
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"remotes": [
{
"url": "https://mcp.aft.page/mcp",
"type": "streamable-http"
}
],
"version": "1.0.0",
"repository": {
"id": "1326207355",
"url": "https://github.com/vaibhavmule/aft.page",
"source": "github",
"subfolder": "apps/mcp-worker"
},
"websiteUrl": "https://aft.page/mcp",
"description": "Deploy HTML or dist/ to a live HTTPS URL. No account. Drop, MCP, or CLI."
}