antideploy-mcp
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ANTIDEPLOY_URL | No | The Antideploy server URL. A login for any other address is kept in its own file, so a test server never replaces your real login. | https://antideploy.com |
| ANTIDEPLOY_API_KEY | No | A project key for one application, made in the console (starts with ad_). For a pipeline or a second machine. A server started with one is bound to that application and works without login. | |
| ANTIDEPLOY_PROJECT_DIR | No | The project folder, for a client that starts servers somewhere else. Defaults to the working directory. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| loginA | Connect this machine to the user's Antideploy account. First call: returns a link and a short code; show both to the user, who opens the link, checks the code matches and clicks Approve (that is the only thing they do; if they have no account the same link creates one). Then call |
| logoutA | Delete the account token saved on this machine, only when the user asked to sign out. It does not revoke the token on the server; for that the user opens https://antideploy.com/tokens. A project key in ANTIDEPLOY_API_KEY is not affected. |
| list_applicationsA | Every application on the account (or the one this server's key belongs to), with its id, name and address, and which account this is. Use it to pick an id for |
| create_applicationA | Create an Antideploy application for the project in this folder and record it in .antideploy.json, so every later call knows which application it is about. This is the step the dashboard used to be for: there is no application or key to make by hand. Do it once per project, before |
| link_applicationA | Record an application the user already has in .antideploy.json for this folder, so deploys and the other tools act on it. Take the id from |
| check_addressA | Check whether an address label such as my-app is free to use as my-app.antideploy.app, before creating the application with it. The address is the link the user shares, so it is theirs to choose. |
| deployA | Package a project directory and deploy it. Sends the whole directory, not just an entry point: a deploy containing one file builds successfully and then serves a page whose assets all 404. Returns a taskId to poll with |
| deployment_statusA | Progress for one deployment: status, per-step detail, the analyzed spec, warnings and hazards. The call waits up to 20 seconds for the deploy to finish, so call it again straight away until the status is succeeded or failed; do not add pauses or your own polling loop. A first deploy usually takes one to three minutes. Once it is live, |
| list_envA | Names only. The platform never returns values, by design. |
| set_envA | Store or replace environment variables for this application. Write-only. Do not pass DATABASE_URL, PG*, storage, sign-in or email variables: the platform sets those itself. To take values from a local .env without them passing through this conversation, use |
| set_env_from_fileA | Read the named variables out of a .env file in the project directory and store them for the application, so the values go from the file to Antideploy and never through this conversation. Only the names you list are sent. Names the platform fills in itself (the database, storage, sign-in and email variables, the application's own address and generated signing secrets) are refused with the reason, and so are empty values and template placeholders like your-key-here. The result names what was stored and what was skipped, never a value. Redeploy afterwards for the running app to pick them up. |
| request_keysA | For a value that is not in the project, such as a Stripe secret key, a bot token or an AI provider's key: get a link where the user pastes it on an Antideploy page, so it goes straight into the application's encrypted variables and never passes through this conversation. Show the user the |
| api_infoA | The platform's self-description: endpoints, limits and current behaviour. Worth reading whenever something here disagrees with what the server does. |
| redeployA | Build and release the application again without uploading it. By default that is the version last sent, with the current environment variables: this is how a changed variable or a new AI key reaches the running app. For an application built from GitHub, |
| deployment_historyA | Recent deploys, newest first: status, commit, address, and the full failure sentence in |
| logsB | What the running container has printed, newest last. |
| healthA | Last observed state (healthy, degraded, down or unknown) and when it was checked. A sweep every five minutes, not a probe taken now: compare |
| metricsA | Requests, server errors and their rate, p50 and p95 response times, and requests per day. Check it when the user says the site is slow or failing: logs show what happened, this shows how often. Requests include bots and every asset on a page, so they are not visitors. |
| rollbackA | Put back the last version that went live before the one serving now, or a specific deployment from |
| remove_envA | Remove one variable. The running app keeps it until the next deploy; |
| app_settingsC | Its address, source, repository and branch, whether a push deploys it ( |
| update_app_settingsA | Change any of: the address ( |
| list_schedulesA | The application's scheduled jobs, each with its next and last run, last status and error, plus the rules: UTC, a few jobs per application, runs at least five minutes apart. |
| add_scheduleA | Call a path on the application on a schedule, such as a nightly cleanup. Anyone can send the x-antideploy-cron header the call carries, so an endpoint that does real work should also check a secret of the app's own. |
| set_schedule_enabledB | Resuming also resets the job's failure count, which pauses it after ten in a row. |
| remove_scheduleB | To change a job's schedule or path, remove it and add it again. |
| database_infoA | Its state, size and tables, with the connection string masked. The platform creates a Postgres database and sets DATABASE_URL by itself when the project needs one, or earlier when |
| database_createA | Create this application's Postgres database now, while the project is still being written, so it is built and tested against the real thing instead of SQLite or mock data. A later deploy reuses it, so what was tested is what goes live. Safe to call twice. Skip it when the project stores nothing, or already points at a database the user chose (a DATABASE_URL in .env that is not localhost, or a provider they named): the answer is a 409 own_database. It counts against the plan's allowance; a 402 database_limit is not a rate limit, so do not retry, say what it says and let the user choose. If the call is refused or blocked, do not look for another route: tell the user, who can approve it or press Create database on the application's page in the console, then carry on with |
| database_env_to_fileA | Write DATABASE_URL and the PG* variables for this application's database into a .env file in the project directory, and return only the names of what was written. The password goes into the file and never into this conversation, so do not read the file back out to the user. These are the same variables the deployed app receives. Variables already in the file are replaced, everything else is kept, and the file is added to .gitignore. Needs the account token that |
| storage_createA | Create a private S3 bucket for this application now, while the project is still being written, so uploads are built and tested against real storage instead of the container's disk, which is wiped on every deploy. A later deploy gives the running app the same bucket. Safe to call twice. Only for a project that stores uploads or generated files: skip it otherwise, and skip it when the project already has a storage key of its own (an AWS_ACCESS_KEY_ID in .env that is not ours, or a service the user named, such as Cloudinary or UploadThing): the answer is a 409 own_storage. It counts against the plan's bucket allowance; a 402 storage_limit is not a rate limit, so do not retry, say what it says and let the user choose. If the call is refused or blocked, do not look for another route: tell the user. The key is not returned: call |
| storage_env_to_fileA | Write the bucket's name, endpoint, region and access key (AWS_S3_BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ENDPOINT_URL_S3, AWS_REGION and the spellings other S3 libraries read) into a .env file in the project directory, and return only the names of what was written. The key goes into the file and never into this conversation, so do not read the file back out to the user. These are the same variables the deployed app receives, so do not copy them into |
| auth_createA | Switch on sign-in (Neon Auth) for this application now, while the project is still being written, so a login page is built and tested against the real thing instead of a library and a table of passwords of your own. The people who sign up are rows in a neon_auth schema of the application's own Postgres, so it makes the database first if there is none, and that counts against the plan's databases. Safe to call twice. Only for a project that has accounts: skip it otherwise, and skip it when the user already chose a service (Clerk, Auth0, Supabase Auth), or when the project connects to a database of its own: the answers are 409 own_auth and own_database. A 402 database_limit is not a rate limit, so do not retry, say what it says and let the user choose. If the call is refused or blocked, do not look for another route: tell the user. The cookie secret is not returned: call |
| auth_env_to_fileA | Write NEON_AUTH_BASE_URL, NEON_AUTH_COOKIE_SECRET, NEON_AUTH_JWKS_URL and VITE_NEON_AUTH_URL into a .env file in the project directory, and return only the names of what was written. The cookie secret goes into the file and never into this conversation, so do not read the file back out to the user. These are the same variables the deployed app receives, so do not copy them into |
| email_createA | Let this application send email now, while the project is still being written, so a welcome or a password reset is built and tested against the real thing instead of being left out or sending the user to open a Resend account and verify a domain. There is nothing to sign up for. Safe to call twice. Only for a project that sends mail: skip it otherwise, and skip it when the project already sets a RESEND_API_KEY of its own (409 own_email). A 503 email_unavailable means email is not set up on this server: carry on without it and tell the user. If the call is refused or blocked, do not look for another route: tell the user. The token is not returned: call |
| email_env_to_fileA | Write RESEND_API_KEY, RESEND_BASE_URL, RESEND_API_URL and EMAIL_FROM into a .env file in the project directory, and return only the names of what was written. RESEND_API_KEY here is a token for the platform's relay, not a Resend key, and it goes into the file and never into this conversation, so do not read the file back out to the user. These are the same variables the deployed app receives, so do not copy them into |
| email_statusA | Whether this application can send email, from which address, its allowance and what it has sent in the last 24 hours, who stopped it if it is stopped (pausedBy, pausedReason), the last 14 days, when it last sent and how its mail is landing ( |
| email_activityA | The relay's log for this application, newest first: when, how many addresses, whether it was handed to Resend or turned away, and what Resend reported afterwards (delivered, bounced, complained, delayed, failed, suppressed) with a reason. Use it to answer "did my email go out" and "why did that one not arrive". It never has a subject, a body or an address, because none is kept. |
| email_deliverabilityA | The last 7 days of this application's mail: delivered, bounced and reported as spam, whether it is healthy or one to watch, the recent problems with the reason Resend gave, and the rules the platform uses to stop an application's email by itself (at least three addresses bouncing that are a fifth of a day's mail, or two spam reports in a week). While |
| email_domainA | The platform's sending domain, this application's own address under it, and the From value. Sending from the user's own domain is not offered, so never send the user to add DNS records for email. |
| email_overviewA | Every application on the account and where its email stands (state, who paused it, what it sent in the last day against its allowance, how its mail is landing), and which have none. Uses the account token when this machine has one; with only a project key it shows this application alone. |
| email_pauseA | Stop this application's email at once, for a leaked token or a loop in the code. Its token is refused (403 suspended_api_key) until |
| email_resumeA | Start this application's email again after |
| email_testA | Send one real message to the address of the account that owns this application, through the relay exactly as the application's code would, so the user can see that email works. The recipient is always the account's own address. It counts as one address against the day. Needs the account token. |
| email_removeA | Take email away from this application. Its token is refused from then on, and the running app keeps the variables it was given, so its mail fails until |
| security_scanA | Start a scan of the running application: keys shipped to the browser, endpoints open without a login, SQL injection, downloadable config files, open CORS and missing headers. Takes seconds. Poll |
| security_scan_statusA | Status and findings, each with a severity, a plain explanation and a |
| ai_walletA | The balance, the rate usage is charged at, and the AI keys on this account. Only the user can add money: give them the |
| create_ai_keyA | Create an OpenRouter key (hundreds of models, any OpenAI-compatible client at https://openrouter.ai/api/v1) and save it into the application as OPENROUTER_API_KEY. Then |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 48 tools
Most tools target a distinct resource+action and the descriptions are unusually explicit about when to pick each one (e.g. logs vs metrics vs health). However, there are real confusable clusters: deploy vs redeploy, set_env vs set_env_from_file, and especially email_status vs email_deliverability vs email_overview vs email_activity, where 'is email working?' could plausibly hit three or four tools. Descriptions mitigate but do not eliminate the overlap.
Names are snake_case and grouped by a readable resource prefix, but the verb position is inconsistent: verb-first (create_application, remove_env, add_schedule, create_ai_key) mixed with resource-first (database_create, storage_create, auth_create, email_create, email_pause, email_remove). There are also bare-noun tools (app_settings, database_info, deployment_history, logs, health, metrics) and single-word verbs (deploy, login, rollback), so the pattern is predictable only within a sub-cluster.
48 tools is heavy even for a broad platform surface, and several groups look consolidatable: eleven email_* tools, four near-identical *_env_to_file tools, and separate *_create / *_env_to_file pairs for database, storage, auth and email. The domain justifies many tools, but this count pushes well past the point where an agent can scan the surface comfortably.
Coverage is strong across the lifecycle: application create/link/list, deploy/redeploy/rollback/status/history, env list/set/set-from-file/remove, schedules list/add/enable/remove, plus one-shot provisioning and status for database, storage, auth, email, AI keys and security scans. Minor gaps: no delete/remove for the application itself, no update_schedule (must remove and re-add, as the description admits), and no standalone info/status for storage or auth comparable to database_info.