protogrid

Search / page.aft/mcp

aft.page

R0· no sign-in

Deploy HTML or dist/ to a live HTTPS URL. No account. Drop, MCP, or CLI.

v1.0.0 · active · repository · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality90strong
Trust92of 100
Uptime, 30 days97%
Latency p50642 ms

Connect

8 clients · secrets stay placeholders
{
  "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

Quality 90 / 100strong

protocol88 · weight 25
  • pass
    protocol.modernsupports 2026-07-28 (server/discover)
  • pass
    protocol.statelessanswers without a session
  • pass
    protocol.transportstreamable HTTP
  • warn
    protocol.list_ttltools/list declares ttlMs 0, so clients re-fetch it on every use
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene100 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • pass
    tools.annotations6 of 6 tools declare readOnlyHint or destructiveHint
  • pass
    tools.directory_hintsevery tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
  • pass
    tools.token_costabout 1,324 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stability75 · weight 15
  • warn
    stability.changes10 tool changes in 30 days
  • pass
    stability.rug_pullno tool changed its meaning under the same name
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

6 tools, about 1,324 tokens to load them all · tool set 2b94f94f8fe6 · tools last changed 2026-10-15 · checked 2026-10-20 13:17 UTC

Tool changes

  • deploychangeddescription
    before

    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.

    after · 78% of words in common

    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_promoteadded

    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_rollbackchangeddescription, input schema
    before

    Point the live slug at a prior deployId from aft_deploys. Same URL. Needs edit_token from .aft/state.json. Claim not required.

    after · 74% of words in common

    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_deployschangeddescription
    before

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

    after · 51% of words in common

    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 schema
    before

    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. Limits: 500 files, 25MB each, 100MB total.

    after · 73% of words in common

    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_healthchangedannotations
  • aft_rollbackchangedannotations
  • aft_deployschangedannotations
  • deploy_repochangedannotations
  • deploychangedannotations

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

Trust 92 / 100

provenance85
liveness99
freshness85
hygiene100

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

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://mcp.aft.page/mcp streamable-httpnoneyes97%642 ms2026-07-282026-10-20

Tools (6)

aft_deploysread-onlyList 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-onlyPing the aft.page deploy API.
aft_promoteMake a held preview version live at the same URL. Pass version (e.g. 4) or deploy_id from aft_deploys. Needs edit_token.
aft_rollbackdestructivePoint 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.
deployPublish 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_repoSame 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.

Similar MCP servers

Official server.json
{
  "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."
}