# App Cities, for AIs (https://appcities.cloud/ai) App Cities puts a user's app online in an isolated pod. Its frontend, backend and database share the chosen pod's capacity. Users can upload a project in the dashboard or use an AI through MCP. Check available sites and prices through the API rather than assuming a city is open. The local development preview simulates infrastructure and payments; do not treat its status as proof of production deployment. Connector (best). If your client supports MCP connectors, the user adds https://mcp.appcities.cloud/mcp and clicks Connect (OAuth, an App Cities consent page). Then use its tools: get_account, create_app, check_project, deploy (inline files up to 5 MB, or create_upload then PUT the zip), get_status, get_logs, rollback, pod_power, quote_resize/confirm_resize, secrets_link, add_domain/verify_domain. Access without a connector. The user pastes a block with a pairing code (10 minutes, single use). Exchange it: POST https://api.appcities.cloud/v1/pair {"code": "..."} -> {"token", "app", "expires_at"}. Then Authorization: Bearer . Never ask for an API key, a password or a card number in the chat. Secrets: GET /apps/{app}/env lists names and missing ones; POST /apps/{app}/env-link gives a dashboard link where the user types the values; then restart the pod. Deploy. Use the project's docker-compose.yml as it is; write one only if there is none, without changing the user's stack. One service carries labels appcities.web: "true" and appcities.port: "". Secrets are ${VARIABLES}. Data in named volumes. Send the project to POST /apps/{app}/deploy: {"files": [{"path","content"}]} inline (5 MB), or POST /apps/{app}/uploads then PUT the zip to upload_url and deploy {"upload_id"}, or a multipart zip, or {"git_url", "ref"}. No node_modules, .env (refused), .git; max 200 MB. Builds run on the platform's build servers, not in the pod. Poll GET /apps/{app}/deployments/{id} until "online". Then give the user the URL: https://.apps.appcities.run. Each deployment keeps its own URL; roll back with POST /apps/{app}/deployments/{id}/activate. Logs. GET /apps/{app}/logs?lines=200 (or ?stream=true). Errors carry a code, a plain message, a hint and a paste_for_ai text. Fix, redeploy, check. Tell the user what was wrong in one plain sentence. Refused in a pod: privileged, network_mode host, devices, cap_add, bind mounts of host paths, GPU, outbound SMTP (use an HTTPS mail API), private registries. Memory and CPU. Read GET /apps/{app}/pod. Static site or one small service: 1 GB. Backend plus a database: 2 GB. SSR framework plus database, or several services with a queue or cache: 4 GB. Renting is for 1h, 1d, 1w or 1m and ends by itself. Two steps: POST /apps/{app}/pod/resize {"memory_gb", "vcpu", "duration"} returns a quote with the price and the balance after; show it to the user and wait for an explicit yes; then POST again with {"quote_id", "confirm": true}. Never confirm for the user. CAP_REACHED or INSUFFICIENT_CREDITS: tell the user and stop. The pod. It is paid from the user's prepaid credits, per minute while it runs. Read current prices and caps from GET /v1/prices and the authenticated pod endpoint; never quote stale amounts from a guide. POST /apps/{app}/pod/stop stops it (retained disk may still be billed; ask first), POST /apps/{app}/pod/start brings it back (needs a day of credit), POST /apps/{app}/pod/restart restarts the services. App endpoints in this guide use the /v1 API prefix. Ask before: any spend, stop, delete, publishing to the gallery, adding or removing a domain. Export: GET /apps/{app}/export gives a zip (compose, code, volumes, secret names). Domain: POST /apps/{app}/domains {"domain"} returns the DNS records to create, then POST /apps/{app}/domains/{domain}/verify; one domain per pod is included, the platform sells none. At zero credit the pod stops and its content is deleted unless the user turned on "keep my content"; nightly backups are another add-on; both are in the dashboard. Outside your reach (the pod itself down, billing, a suspension): tell the user to write to support@appcities.cloud with the app name. Status: https://status.appcities.cloud.