dynu-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dynu-mcplist my DNS domains"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dynu-mcp
MCP server for Dynu — a Dynamic DNS, domain registration, email hosting, and cloud compute (VPS) provider. Exposes the full public Dynu REST API v2 as MCP tools.
Overview
Stateless HTTP service. No credentials are ever persisted — each request supplies its own API key via a header, used only for the lifetime of that single request.
Supports concurrent requests; per-request credential isolation is done via Python
contextvars, not a global/shared client instance.Entry points:
POST /mcp(MCP protocol) andGET /health(health check).Default port:
8080(configurable viaMCP_HTTP_PORT).
Related MCP server: dynadot-mcp
Scope
117 tools, one per operation in Dynu's official OpenAPI 3.0 spec
(Dynu.API.OAS.zip, downloaded from https://www.dynu.com/Support/API),
across 6 categories: dns (30), email (36), compute (27), domain
(15), monitor (7), ping (2). Per explicit user decision, this covers
the full public API including write operations (POST/DELETE — adding,
updating, and removing DNS records, domains, email accounts, and even
VPS compute instances), not just the 66 GET read methods. MSPbots
itself only calls 1 endpoint (GET /dns) — see Known Gaps for
important caveats about the higher-stakes compute/domain categories.
Authentication
Dynu authenticates with a single static API key (found in the API
Credentials area of the Dynu control panel). MSPbots' own integration
convention sends this key as the raw value of the API-Key header, and
this server forwards it exactly that way.
HEADER 授权参数说明
Header | 类型 | 是否必填 | 默认值 | 枚举值 | 字段描述 | Example |
| string | 是 | 无 | 无 | Dynu 静态 API Key,原样转发为上游 |
|
Missing the header returns 401:
{
"error": "Missing credentials",
"message": "This server requires the X-Dynu-Api-Key header",
"required_headers": ["X-Dynu-Api-Key"],
"optional_headers": []
}Environment Variables
Variable | 类型 | 是否必填 | 默认值 | 说明 |
| int | 否 |
| HTTP 监听端口 |
| string | 否 |
| HTTP 监听地址 |
| string | 否 |
| Dynu API 基础 URL |
MCP Endpoint
POST /mcp— MCP protocol (streamable HTTP transport)GET /health— health check, returns{"status": "ok", "service": "dynu-mcp", "transport": "http"}
Tool List
Tool names are derived from each operation's own summary in the vendor's
OpenAPI spec (e.g. "Get a list of domains for DNS service" →
dynu_get_list_domains_dns_service); the one naming collision (both
GET /ping and POST /ping share an identical summary) is disambiguated
with a _get/_post suffix. body parameters for POST operations are
accepted as a generic dict — see the vendor's OpenAPI spec's Models
section (linked below) for the exact field names/types of each resource.
Category | Tool | 功能 | 方法+路径 | 参数 |
| Add a new blacklist for email service. | POST /email/{id}/blacklist | id(必填), body(必填,dict) | |
| Add a new email account for email service. | POST /email/{id}/account | id(必填), body(必填,dict) | |
| Add a new email alias for email service. | POST /email/{id}/alias | id(必填), body(必填,dict) | |
| Add a new email distribution list for email service. | POST /email/{id}/distributionlist | id(必填), body(必填,dict) | |
| Add a new recipient for email distribution list. | POST /email/{id}/distributionlist/{distributionListId}/recipient | id(必填), distribution_list_id(必填), body(必填,dict) | |
| Add a new whitelist for email service. | POST /email/{id}/whitelist | id(必填), body(必填,dict) | |
| Get details of a blacklist for email service. | GET /email/{id}/blacklist/{blacklistId} | id(必填), blacklist_id(必填) | |
| Get details of the email account. | GET /email/{id}/account/{accountId} | id(必填), account_id(必填) | |
| Get details of the email alias. | GET /email/{id}/alias/{aliasId} | id(必填), alias_id(必填) | |
| Get details of the email distribution list. | GET /email/{id}/distributionlist/{distributionListId} | id(必填), distribution_list_id(必填) | |
| Get details of an email service. | GET /email/{id} | id(必填) | |
| Get details of a whitelist for email service. | GET /email/{id}/whitelist/{whitelistId} | id(必填), whitelist_id(必填) | |
| Get DKIM details of the email service. | GET /email/{id}/dkim | id(必填) | |
| Get a list of blacklist. | GET /email/{id}/blacklist | id(必填) | |
| Get a list of daily limits for email service. | GET /email/{id}/dailylimit | id(必填) | |
| Get a list of distribution lists for email service. | GET /email/{id}/distributionlist | id(必填) | |
| Get a list of email accounts for email service. | GET /email/{id}/account | id(必填) | |
| Get a list of email aliases for email service. | GET /email/{id}/alias | id(必填) | |
| Get a list of email services. | GET /email | 无 | |
| Get a list of messages in delivery queue. | GET /email/{id}/deliveryQueue | id(必填) | |
| Get a list of recipients of the distribution list. | GET /email/{id}/distributionlist/{distributionListId}/recipient | id(必填), distribution_list_id(必填) | |
| Get a list of whitelist. | GET /email/{id}/whitelist | id(必填) | |
| Remove a blacklist from email service. | DELETE /email/{id}/blacklist/{blacklistId} | id(必填), blacklist_id(必填) | |
| Remove an email account from email service. | DELETE /email/{id}/account/{accountId} | id(必填), account_id(必填) | |
| Remove an email alias from email service. | DELETE /email/{id}/alias/{aliasId} | id(必填), alias_id(必填) | |
| Remove an email distribution list from email service. | DELETE /email/{id}/distributionlist/{distributionListId} | id(必填), distribution_list_id(必填) | |
| Remove an existing recipient from email distribution list. | DELETE /email/{id}/distributionlist/{distributionListId}/recipient/{recipientId} | id(必填), distribution_list_id(必填), recipient_id(必填) | |
| Remove a whitelist from email service. | DELETE /email/{id}/whitelist/{whitelistId} | id(必填), whitelist_id(必填) | |
| This operation auto-generates DKIM details including the private key of the email service. | GET /email/{id}/autogeneratedkim | id(必填) | |
| Update details of an existing blacklist for email service. | POST /email/{id}/blacklist/{blacklistId} | id(必填), blacklist_id(必填), body(必填,dict) | |
| Update details of an existing whitelist for email service. | POST /email/{id}/whitelist/{whitelistId} | id(必填), whitelist_id(必填), body(必填,dict) | |
| Update DKIM details for the email service. | POST /email/{id}/dkim | id(必填), body(必填,dict) | |
| Update an email service. | POST /email/{id} | id(必填), body(必填,dict) | |
| Update an existing email account for email service. | POST /email/{id}/account/{accountId} | id(必填), account_id(必填), body(必填,dict) | |
| Update an existing email alias for email service. | POST /email/{id}/alias/{aliasId} | id(必填), alias_id(必填), body(必填,dict) | |
| Update an existing email distribution list for email service. | POST /email/{id}/distributionlist/{distributionListId} | id(必填), distribution_list_id(必填), body(必填,dict) | |
dns |
| Add a new DNS record for DNS service. | POST /dns/{id}/record | id(必填), body(必填,dict) |
dns |
| Add a new DNS service. | POST /dns | body(必填,dict) |
dns |
| Add a new group. | POST /dns/group | body(必填,dict) |
dns |
| Add a new web redirect. | POST /dns/{id}/webredirect | id(必填), body(必填,dict) |
dns |
| Disable the DNS record for DNS service. | GET /dns/{id}/record/{dnsRecordId}/disable | id(必填), dns_record_id(必填) |
dns |
| Disable DNSSEC for DNS service. | GET /dns/{id}/dnssec/disable | id(必填) |
dns |
| DS record of DNSSEC for DNS service. | GET /dns/{id}/dnssec | id(必填) |
dns |
| Enable the DNS record for DNS service. | GET /dns/{id}/record/{dnsRecordId}/enable | id(必填), dns_record_id(必填) |
dns |
| Enable DNSSEC for DNS service. | GET /dns/{id}/dnssec/enable | id(必填) |
dns |
| Get details of a DNS record for DNS service. | GET /dns/{id}/record/{dnsRecordId} | id(必填), dns_record_id(必填) |
dns |
| Get details of a domain for DNS service. | GET /dns/{id} | id(必填) |
dns |
| Get details of the web redirect. | GET /dns/{id}/webRedirect/{webRedirectId} | id(必填), web_redirect_id(必填) |
dns |
| Get DNS records based on a hostname and resource record type. | GET /dns/record/{hostname} | hostname(必填), record_type(必填) |
dns |
| Get a list of DNS records for DNS service. | GET /dns/{id}/record | id(必填) |
dns |
| Get a list of domains for DNS service. | GET /dns | 无 |
dns |
| Get a list of groups to which hosts are assigned to. | GET /dns/group | 无 |
dns |
| Get a list of IP address updates. | GET /dns/ipUpdateHistory | 无 |
dns |
| Get a list of top levels. | GET /dns/toplevel | 无 |
dns |
| Get a list of web redirects. | GET /dns/{id}/webredirect | id(必填) |
dns |
| Get the root domain name based on a hostname. | GET /dns/getroot/{hostname} | hostname(必填) |
dns |
| Limits associated with DNS records. | GET /dns/{id}/limit | id(必填) |
dns |
| Limits associated with hostnames. | GET /dns/limit | 无 |
dns |
| Remove a DNS record from DNS service. | DELETE /dns/{id}/record/{dnsRecordId} | id(必填), dns_record_id(必填) |
dns |
| Remove domain from DNS service. | DELETE /dns/{id} | id(必填) |
dns |
| Remove a group. | DELETE /dns/group/{id} | id(必填) |
dns |
| Remove a web redirect. | DELETE /dns/{id}/webRedirect/{webRedirectId} | id(必填), web_redirect_id(必填) |
dns |
| Update an existing DNS record for DNS service. | POST /dns/{id}/record/{dnsRecordId} | id(必填), dns_record_id(必填), body(必填,dict) |
dns |
| Update an existing DNS service. | POST /dns/{id} | id(必填), body(必填,dict) |
dns |
| Update an existing group. | POST /dns/group/{id} | id(必填), body(必填,dict) |
dns |
| Update an existing web redirect. | POST /dns/{id}/webRedirect/{webRedirectId} | id(必填), web_redirect_id(必填), body(必填,dict) |
compute |
| Change the operating system password. | POST /compute/instance/{id}/password | id(必填), body(必填,dict) |
compute |
| Change the VNC password. | POST /compute/instance/{id}/vnc | id(必填), body(必填,dict) |
compute |
| Create a manual backup. | POST /compute/instance/{id}/backup | id(必填) |
compute |
| Create or update a reverse DNS mapping. | POST /compute/instance/{id}/reversedns | id(必填), body(必填,dict) |
compute |
| Create a snapshot. | POST /compute/instance/{id}/snapshot | id(必填) |
compute |
| Get an instance. | GET /compute/instance/{id} | id(必填) |
compute |
| Get a list of active tasks. | GET /compute/instance/{id}/task | id(必填) |
compute |
| Get a list of backups. | GET /compute/instance/{id}/backup | id(必填) |
compute |
| Get a list of instances. | GET /compute/instance | 无 |
compute |
| Get a list of operating systems available for reinstall. | GET /compute/os | 无 |
compute |
| Get a list of snapshots. | GET /compute/instance/{id}/snapshot | id(必填) |
compute |
| Get network settings. | GET /compute/instance/{id}/network | id(必填) |
compute |
| Get reverse DNS mappings. | GET /compute/instance/{id}/reversedns | id(必填) |
compute |
| Get VNC connection details. | GET /compute/instance/{id}/vnc | id(必填) |
compute |
| Mount an ISO image. | POST /compute/instance/{id}/mountiso | id(必填), body(必填,dict) |
compute |
| Reinstall the operating system. | POST /compute/instance/{id}/reinstall | id(必填), body(必填,dict) |
compute |
| Remove all snapshots. | DELETE /compute/instance/{id}/snapshot | id(必填) |
compute |
| Remove a backup. | DELETE /compute/instance/{id}/backup/{backupId} | id(必填), backup_id(必填) |
compute |
| Remove an IPv6 reverse DNS mapping. | DELETE /compute/instance/{id}/reversedns/{ptrRecordId} | id(必填), ptr_record_id(必填) |
compute |
| Remove a snapshot. | DELETE /compute/instance/{id}/snapshot/{snapshotId} | id(必填), snapshot_id(必填) |
compute |
| Restart an instance. | GET /compute/instance/{id}/restart | id(必填) |
compute |
| Restore a backup. | GET /compute/instance/{id}/backup/{backupId}/restore | id(必填), backup_id(必填) |
compute |
| Restore a snapshot. | GET /compute/instance/{id}/snapshot/{snapshotId}/restore | id(必填), snapshot_id(必填) |
compute |
| Start an instance. | GET /compute/instance/{id}/start | id(必填) |
compute |
| Stop (suspend) an instance. | GET /compute/instance/{id}/stop | id(必填) |
compute |
| Unmount the ISO image. | POST /compute/instance/{id}/unmountiso | id(必填), body(必填,dict) |
compute |
| Update an instance label or CPU emulation mode. | POST /compute/instance/{id} | id(必填), body(必填,dict) |
domain |
| Add a glue record to a domain. | POST /domain/{id}/glueRecord | id(必填), body(必填,dict) |
domain |
| Add a name server to a domain. | GET /domain/{id}/nameServer/add | id(必填), name_server(必填) |
domain |
| Cancel a domain. | GET /domain/{id}/cancel | id(必填) |
domain |
| Delete a glue record of a domain. | DELETE /domain/{id}/glueRecord/{glueRecordId} | id(必填), glue_record_id(必填) |
domain |
| Delete a name server of a domain. | DELETE /domain/{id}/nameServer | id(必填), name_server(必填) |
domain |
| Disable autorenewal for a domain. | GET /domain/{id}/autorenewDisable | id(必填) |
domain |
| Enable autorenewal for a domain. | GET /domain/{id}/autorenewEnable | id(必填) |
domain |
| Get details of a domain registration domain. | GET /domain/{id} | id(必填) |
domain |
| Get a list of domains for domain registration service. | GET /domain | 无 |
domain |
| Get a list of glue records for a domain. | GET /domain/{id}/glueRecord | id(必填) |
domain |
| Get a list of name servers for a domain. | GET /domain/{id}/nameServer | id(必填) |
domain |
| Lock a domain. | GET /domain/{id}/lock | id(必填) |
domain |
| Make a name server the primary name server of a domain. | GET /domain/{id}/nameServer/primary | id(必填), name_server(必填) |
domain |
| Unlock a domain. | GET /domain/{id}/unlock | id(必填) |
domain |
| Update a glue record of a domain. | POST /domain/{id}/glueRecord/{glueRecordId} | id(必填), glue_record_id(必填), body(必填,dict) |
monitor |
| Add a new monitor. | POST /monitor | body(必填,dict) |
monitor |
| Delete a monitor. | DELETE /monitor/{id} | id(必填) |
monitor |
| Get details of a monitor. | GET /monitor/{id} | id(必填) |
monitor |
| Get a list of monitors. | GET /monitor | 无 |
monitor |
| Limits associated with monitoring. | GET /monitor/limit | 无 |
monitor |
| Pause a monitor. | GET /monitor/{id}/pause | id(必填) |
monitor |
| Unpause a monitor. | GET /monitor/{id}/unpause | id(必填) |
ping |
| Ping the API server to obtain the pong response. | GET /ping | message(必填) |
ping |
| Ping the API server to obtain the pong response. | POST /ping | body(必填,dict) |
测试示例
# Health check
curl -s http://localhost:8080/health
# Call a tool via the MCP protocol (streamable HTTP) — requires an
# initialize handshake first per the MCP spec; abbreviated example below
# shows the tool-call request body only:
curl -s -X POST http://localhost:8080/mcp -H "X-Dynu-Api-Key: <your-dynu-api-key>" -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" -H "mcp-session-id: <session-id-from-initialize>" -d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "dynu_get_list_domains_dns_service",
"arguments": {}
}
}'Live-verified (2026-07-29): dynu_get_list_domains_dns_service (the
same endpoint MSPbots itself calls, zero parameters) was called end-to-end
through this running server with a real API key and returned real DNS
domain records for the account.
API Reference
Overview: https://www.dynu.com/Support/API
Official OpenAPI 3.0 spec (Swagger): https://www.dynu.com/files/dynu.api/Dynu.API.OAS.zip
Known Gaps
Full API coverage was an explicit user decision, matching the pattern used for other large public APIs in this program (e.g. ConnectSecure, Cove Data Protection). Unlike those, Dynu's
computecategory manages real VPS instances (start/stop/restart/reinstall OS/change password/mount ISO) anddomainincludes registrar-level actions (lock/unlock/cancel a domain, manage nameservers) — these are meaningfully higher-stakes than DNS record management. Treat any tool whose name starts withdynu_reinstall_,dynu_stop_,dynu_cancel_,dynu_change_operating_system_password_, or similar as destructive/ irreversible and confirm with a human before invoking.bodyparameters are untyped (dict) rather than fully modeled — the OpenAPI spec's Models section defines the exact schema per resource (e.g.DNS.dnsRecordA,Compute.instanceUpdate), but reproducing all of them as typed Python parameters was out of scope for a 117-tool generation. Callers should shape thebodydict per the linked spec.Only
dynu_get_list_domains_dns_service(MSPbots' own endpoint) was live-verified with real account data. The remaining 116 tools are structurally correct (schema validated, MCP-protocoltools/listconfirmed) but not individually smoke-tested — most are write/destructive operations that would create, modify, or delete real DNS records, domains, email accounts, or VPS instances, so they weren't exercised against the live test account.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/MSPbotsAI/dynu-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server