nginx-certbot-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
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 |
|---|---|
| list_sitesA | List every nginx server block currently in sites-enabled, with domain, upstream, and whether SSL looks configured. Read-only - parses config files directly, does not shell out to nginx. Use get_site_config for one domain's full raw config. |
| get_site_configA | Get the raw, unparsed nginx config file for one domain from sites-available. Throws if no config exists for that domain - call list_sites first if you're not sure it exists. |
| check_cert_expiryA | List every certbot-managed certificate on the box with its expiry date and days remaining, via |
| check_dnsA | Resolve a domain (CNAME first, then A/AAAA) against public resolvers (1.1.1.1, 8.8.8.8) rather than this box's own DNS, so the result matches what Let's Encrypt and the public internet see. Use before issue_cert / create_site to confirm a domain actually points where you expect. For confirming something is listening behind nginx, use check_upstream_health instead. |
| check_upstream_healthA | TCP-probe an upstream host:port to confirm something is actually listening there, independent of nginx or DNS. Use to sanity-check an upstream before create_site, or to debug a 502 afterward. For confirming a public domain resolves, use check_dns instead. |
| get_nginx_statusA | Report whether the nginx service is active (via systemctl) and its version string. Read-only. |
| tail_site_logsA | Tail nginx's access or error log (capped at 1000 lines). |
| list_archived_sitesA | List archived nginx configs created by delete_site, newest first. Feed a filename from here into restore_site's archive_filename to restore a specific archive instead of the newest. |
| create_domain_recordA | Upsert a Route 53 CNAME record pointing |
| delete_domain_recordA | Delete the Route 53 CNAME record for a domain. Destructive - requires confirm:true to actually act; without it, returns what would happen and changes nothing. Looks up the exact existing record first rather than guessing its TTL/value. |
| create_txt_recordA | Upsert a Route 53 TXT record - e.g. for an ACME DNS-01 challenge (_acme-challenge., as used by issue_wildcard_cert) or domain verification. Quotes the value automatically if the caller didn't. Clean up afterward with delete_txt_record. For a CNAME pointing a domain at an upstream, use create_domain_record instead. |
| delete_txt_recordA | Delete the Route 53 TXT record for a domain - e.g. to clean up an ACME DNS-01 challenge record left behind by create_txt_record or issue_wildcard_cert. Destructive - requires confirm:true to actually act; without it, returns what would happen and changes nothing. Looks up the exact existing record first rather than guessing its TTL/value. For a CNAME record, use delete_domain_record instead. |
| create_siteA | Create a new nginx server block from the websocket-capable default template. Validates and test-renders ( |
| update_siteA | Update an existing site's upstream by rewriting its proxy_pass directive(s) in place - everything else in the config, including any SSL server block issue_cert/certbot added, is left untouched. Fails if the domain has no existing config (use create_site instead) or has no proxy_pass directive to update. Test-renders before keeping the change and rolls back automatically if |
| delete_siteA | Disable, archive, and delete the nginx server block for a domain. Destructive - requires confirm:true to actually act; without it, returns what would happen. Does not touch any certbot certificate for the domain. Does NOT reload nginx - call reload_nginx afterward. The archived copy can be brought back with restore_site. |
| restore_siteA | Restore a domain's nginx config from its most recent archive (created by delete_site) and enable it. Destructive to any current config for that domain - requires confirm:true. Test-renders before enabling and rolls back automatically if that fails. Does NOT reload nginx - call reload_nginx afterward. |
| prune_archivesA | Delete archived site configs (from delete_site) older than a threshold. Destructive - requires confirm:true to actually act; without it, lists what would be deleted and changes nothing. Continues past individual failures and reports how many actually got removed. |
| reload_nginxA | Run |
| issue_certA | Request a certificate via |
| issue_wildcard_certA | Request a wildcard certificate ( |
| renew_certA | Run |
| revoke_certA | Revoke a certificate with Let's Encrypt (e.g. after a key compromise) - the CA distrusts it immediately, browser-wide, for any site still serving it. Destructive and effectively irreversible - requires confirm:true. Leaves the cert files on disk; follow with delete_cert to remove them. |
| delete_certA | Delete a certificate's files from certbot's local store. Destructive - requires confirm:true. Does not revoke the certificate first - if it may be compromised, call revoke_cert before this. Any nginx config still referencing the deleted files will fail to reload afterward. |
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 23 tools
Every tool targets a distinct resource and action: nginx site inspection vs. mutation, cert issuance vs. renewal vs. revocation, and DNS record types are cleanly separated. Cross-references like check_dns vs. check_upstream_health and create_domain_record vs. create_txt_record eliminate ambiguity.
All tools follow a consistent snake_case verb_noun pattern with predictable verbs: list, get, check, create, delete, update, restore, reload, issue, renew, revoke. There are no mixed conventions or vague generic names.
At 23 tools, this is on the heavy end of the scale, though the count is justified by spanning three related areas: nginx site lifecycle, certbot certificate lifecycle, and Route 53 DNS record management. Each tool has a real purpose, but the overall surface area feels larger than a typical focused server.
The tool surface covers the full lifecycle for nginx sites, certificates, and DNS records: create/read/update/delete/restore for sites, issue/renew/revoke/delete for certs, and upsert/delete for records. Minor gaps exist, such as update_site only rewriting proxy_pass directives rather than supporting arbitrary config edits, but most workflows can be completed without dead ends.