webdock-mcp-server
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., "@webdock-mcp-servercreate a new VPS in Amsterdam with Ubuntu 22.04"
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.
webdock-mcp-server
An MCP (Model Context Protocol) server that gives any MCP-compatible AI client — Claude Code, Claude Desktop, Cursor, or your own agent — full control over your Webdock.io VPS infrastructure: provision and manage servers, take and restore snapshots, manage SSH/shell users, deploy scripts, configure webhooks, and inspect account/billing and event history, all through natural language.
It's a thin, well-typed wrapper around the official
@webdock/sdk client — the same library that powers
webdock-cli — so every tool call here does exactly
what the equivalent SDK/CLI call would do, with no reimplemented API logic.
Why
Webdock already has a CLI and a REST API. This exists for the case where the client is an LLM: tool names and parameters are described for an agent to read and choose correctly, destructive actions are annotated so a host application can gate them, list responses are paginated and size-capped so they don't blow a context window, and every error message tells the agent what to check next instead of just repeating an HTTP status code.
Features
56 tools, full parity with
webdock-cli's command surface, across 11 resource domainsTwo output formats on every tool —
markdown(human-readable, default) orjson(machine-readable, complete payload) — chosen per call via aresponse_formatparameterAsync-aware: mutating server actions accept an optional
waitflag that blocks until the triggered operation finishes on Webdock's side, or return immediately with a callback ID you can poll separately viawebdock_get_operation_statusClient-side pagination (
limit/offset) and response truncation on every list tool, so a large account (hundreds of servers/snapshots/events) can't overflow a single tool responseTool annotations (
readOnlyHint,destructiveHint,idempotentHint,openWorldHint) on every tool, so a host application can distinguish "just looking" from "about to delete a server"Actionable errors — auth, not-found, conflict, and rate-limit responses are translated into messages that tell the agent what to do next, not just an HTTP code
Both stdio (default, for local MCP clients) and streamable HTTP transports
Requirements
Node.js ≥ 18
A Webdock.io account and an API token (Account → API Tokens in the dashboard)
Installation
Clone and build from source (this package isn't published to npm yet):
git clone https://github.com/heaventree/webdock-mcp.git
cd webdock-mcp
npm install
npm run buildThis produces dist/index.js, the server's entry point.
Configuration
The server takes exactly one piece of configuration: the WEBDOCK_API_TOKEN environment variable.
It's validated at startup — if it's missing, the process prints an error and exits immediately
rather than accepting an unauthenticated tool call.
Variable | Required | Description |
| Yes | Your Webdock API token, from the dashboard's API Tokens section |
| No |
|
| No | Port for |
Claude Code
Add to .mcp.json in your project (or ~/.claude.json for a global config):
{
"mcpServers": {
"webdock": {
"command": "node",
"args": ["/absolute/path/to/webdock-mcp/dist/index.js"],
"env": {
"WEBDOCK_API_TOKEN": "your-token-here"
}
}
}
}Or register it with the CLI:
claude mcp add webdock -- node /absolute/path/to/webdock-mcp/dist/index.js
# then set WEBDOCK_API_TOKEN in your environment, or edit the resulting config entry to add an "env" blockClaude Desktop
Add the same mcpServers block to your Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Then restart Claude Desktop.
Any other MCP client (generic stdio)
Point the client at:
command: node
args: ["/absolute/path/to/webdock-mcp/dist/index.js"]
env: { "WEBDOCK_API_TOKEN": "your-token-here" }Remote / streamable HTTP
TRANSPORT=http PORT=3000 WEBDOCK_API_TOKEN=your-token-here npm startThe server listens on http://127.0.0.1:3000/mcp. Put a reverse proxy with TLS and auth in front
of it before exposing it beyond localhost — the server itself does not add authentication on top of
the Webdock API token.
Tool reference
Every tool accepts an optional response_format ('markdown' | 'json', default 'markdown').
List tools accept limit/offset for pagination. Tools that trigger an async Webdock operation
accept an optional wait boolean (mirrors the CLI's --wait) that blocks until the operation
finishes; leave it false (the default) to get a callback ID back immediately and poll it later
with webdock_get_operation_status.
Servers
Tool | Description |
| List servers, filterable by account status |
| Full detail for one server |
| Provision a server from an image or snapshot |
| Power actions |
| Stop and archive a server |
| Schedule/undo deletion |
| Update name/description/notes/next action date |
| Preview/apply a hardware profile change |
| Wipe and reinstall from an image |
| CPU/memory/disk/network usage |
Server configuration
Tool | Description |
| Set a server's main domain and alias domains |
| Trigger a Let's Encrypt SSL renewal |
| Change web root and reconfigure web server / Let's Encrypt |
| Toggle password auth / passwordless sudo / SSH port |
Server scripts (deployed to a specific server)
Tool | Description |
| List scripts attached to a server |
| Deploy an account script onto a server |
| Get one attached script's details |
| Run an already-attached script |
| Detach a script from a server |
Snapshots
Tool | Description |
| List/inspect snapshots (account-wide or per-server) |
| Create an on-demand snapshot |
| Restore a server from a snapshot |
| Permanently delete a snapshot |
SSH keys & shell users
Tool | Description |
| Manage account SSH keys |
| List a server's shell (SSH login) users |
| Manage shell users |
| Reset a shell user's password |
| Replace a shell user's attached SSH keys |
| Generate a browser-based WebSSH token/URL |
Catalog (reference data)
Tool | Description |
| Datacenter locations |
| Server images (OS/stack combinations) |
| Hardware profiles (CPU/RAM/disk/price) |
| Manage custom hardware profiles |
| Hardware platforms and their resource/pricing ranges |
Account
Tool | Description |
| Profile and billing summary |
| Servers previously archived |
| List reusable account scripts |
| Get a script's full content |
| Manage account scripts |
Events & webhooks
Tool | Description |
| Paginated account event history |
| List/inspect webhooks |
| Manage webhooks |
Operations
Tool | Description |
| Poll an async action's status by callback ID |
Security notes
Treat
WEBDOCK_API_TOKENlike any other production credential — it grants full account access. Don't commit it; pass it via environment/secret manager.Destructive tools (
webdock_delete_server,webdock_reinstall_server,webdock_restore_snapshot,webdock_delete_snapshot, ...) are marked withdestructiveHint: truein their MCP annotations. A host application that wants a confirmation step before destructive calls should gate on that flag; this server executes whatever a validated tool call asks for.webdock_get_webssh_tokenreturns a credential (a WebSSH URL granting shell access) in its response — avoid logging or persisting tool outputs from it.If running the
httptransport beyond localhost, put TLS and an auth layer in front of it; the server itself trusts any caller that can reach it.
Development
npm run dev # tsx watch, runs src/index.ts directly
npm run build # tsc -> dist/
npm start # run the built server (stdio)
TRANSPORT=http PORT=3000 npm start # run as streamable HTTP instead of stdioExercise it manually with the MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.jsProject structure
src/
├── index.ts # entry point, transport selection, tool registration
├── client.ts # Webdock SDK client singleton, error handling, wait-for-operation helper
├── constants.ts # response size / pagination limits
├── schemas.ts # shared Zod schemas (response_format, pagination, wait, server slug)
├── formatting.ts # markdown table / pagination / truncation helpers
├── types.ts # local structural types for @webdock/sdk response shapes (see below)
└── tools/
├── servers.ts # server lifecycle
├── server-config.ts # identity, SSL, web server settings
├── server-scripts.ts # scripts attached to a server
├── snapshots.ts
├── sshkeys.ts
├── shellusers.ts
├── catalog.ts # locations, images, profiles, platforms
├── account.ts # account info, archived servers, account scripts
├── events.ts
├── hooks.ts # webhooks
└── operations.ts # async operation status pollingA note on @webdock/sdk's types
The published @webdock/sdk package's package.json has two packaging issues that break normal
TypeScript resolution: its exports map only publishes the root entry point (so per-domain types
like Server/Snapshot can't be imported by name), and its types field points at
./dist/index.d — missing the .ts extension. This project works around both: a paths mapping
in tsconfig.json points directly at the installed package's .d.ts file for type resolution, and
src/types.ts defines local structural interfaces for the fields each tool reads — TypeScript's
structural typing means the SDK's own inferred response objects satisfy them without any cast. If a
future SDK release fixes its packaging, these workarounds can be removed.
Contributing
Issues and PRs are welcome. A few starting points if you want to extend coverage:
Every tool follows the same shape — see any file in
src/tools/for the pattern (Zod input schema with.describe()on every field,readOnlyHint/destructiveHint/idempotentHintannotations,callSdk()+handleApiError()for the API call, markdown + JSON response formatting).@webdock/sdkexposes a few more domains not yet wrapped here: the server web server extras (database backup scheduling, search-engine blocking, HTTP basic auth, certbot testing) underclient.servers.webserver.*, and raw IP block management underclient.webdock.IpBlocks. PRs adding tools for these are welcome.Run
npm run buildbefore opening a PR — it must complete without errors.
License
Acknowledgments
Webdock.io for the API and the
@webdock/sdkclientwebdock-cli as the reference for command coverage
Model Context Protocol and its TypeScript SDK
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.
Related MCP Connectors
Provision and manage a VPS for AI agents over MCP: register, order, get root, control the server.
Agent-first web hosting: deploy sites, apps, databases and domains over MCP.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
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/heaventree/webdock-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server