{"name":"page.aft/mcp","slug":"aft-mcp","title":"aft.page","description":"Deploy a folder, build output, or public GitHub repo to a live URL. Update, roll back.","url":"https://mcp.market/server/aft-mcp","rating":null,"grade":"B","score":81,"certified":false,"status":"active","category":"devtools","tags":["devtools"],"presence":{"score":23,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-10-29T06:15:00.000Z","license":"MIT"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-05T13:35:52.219Z","last_ok_at":"2026-11-05T13:35:52.219Z","latency_ms":547},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/aft-page/plugins","website":"https://aft.page/mcp","version":"1.1.0","remotes":[{"type":"streamable-http","url":"https://mcp.aft.page/mcp"}],"packages":[],"tools":[{"name":"aft_deploys","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$","description":"Site slug from aft.json or .aft/state.json"},"edit_token":{"type":"string","minLength":1,"description":"From first deploy / .aft/state.json. Required to update or rollback the same URL."}},"required":["slug","edit_token"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"aft_health","description":"Ping the aft.page deploy API.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"aft_promote","description":"Make a held preview version live at the same URL. Pass version (e.g. 4) or deploy_id from aft_deploys. Needs edit_token.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$","description":"Site slug from aft.json or .aft/state.json"},"edit_token":{"type":"string","minLength":1,"description":"From first deploy / .aft/state.json. Required to update or rollback the same URL."},"deploy_id":{"description":"deployId from aft_deploys","type":"string","minLength":1},"version":{"description":"Version number from aft_deploys, e.g. 3 for v3","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["slug","edit_token"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"aft_rollback","description":"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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$","description":"Site slug from aft.json or .aft/state.json"},"edit_token":{"type":"string","minLength":1,"description":"From first deploy / .aft/state.json. Required to update or rollback the same URL."},"deploy_id":{"description":"deployId from aft_deploys","type":"string","minLength":1},"version":{"description":"Version number from aft_deploys, e.g. 3 for v3","type":"integer","minimum":1,"maximum":9007199254740991}},"required":["slug","edit_token"],"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"deploy","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"html":{"description":"One HTML document. Ignored if files is set.","type":"string","minLength":1},"files":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"object","properties":{"path":{"type":"string","minLength":1,"description":"Relative path, e.g. index.html"},"content":{"type":"string","description":"UTF-8 text (or base64 if encoding=base64)"},"encoding":{"type":"string","enum":["utf8","base64"]}},"required":["path","content"]}},"preferred_slug":{"description":"aft.json slug. Required with edit_token.","type":"string","pattern":"^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$"},"edit_token":{"type":"string","minLength":1,"description":"From first deploy / .aft/state.json. Required to update or rollback the same URL."},"expires":{"type":"string","pattern":"^\\d+(s|m|h|d)?$","description":"Optional quick-view expiry, e.g. \"1h\", \"24h\", \"90s\", \"7d\". Anonymous (unclaimed) deploys only — the link 404s after this."},"hold":{"description":"Update only: build and verify but do not go live; promote later with aft_promote.","type":"boolean"},"label":{"description":"Short name for this version, e.g. 'before redesign'.","type":"string","maxLength":60}},"$schema":"https://json-schema.org/draft/2020-12/schema"}},{"name":"deploy_repo","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","minLength":3,"description":"GitHub URL or owner/repo, e.g. https://github.com/mdn/beginner-html-site"}},"required":["url"],"$schema":"https://json-schema.org/draft/2020-12/schema"}}],"scan":{"score":81,"grade":"B","scanned_at":"2026-10-30T06:00:08.354Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-30T06:00:08.314Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1789ms"]},"poisoning":{"score":15,"max":15,"notes":["6 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 2 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":8,"max":10,"notes":["endpoint served from the registry-verified namespace domain"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://mcp.aft.page/mcp","reachable":true,"authRequired":false,"latencyMs":1789,"serverInfo":{"name":"aft-page","version":"0.6.0"}}],"packages":[],"repo":{"found":true,"owner":"aft-page","repo":"plugins","archived":false,"pushedAt":"2026-10-29T06:15:00Z","stars":0,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/334881214?v=4","ownerCreatedAt":"2026-09-28T07:45:03Z","license":"MIT"},"icon":{"url":"https://aft.page/favicon.svg","source":"registry"},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-10-29T06:15:00.000Z","score":23}}}},"grade_history":[{"kind":"restore","fromGrade":"C","toGrade":"B","reason":"score 81: Write-action tools reachable without authentication","createdAt":"2026-10-30T06:00:09.422Z"}],"reviews":[]}