DevelopersMCP server
Hostwolf Apps MCP server
@hostwolf/apps-mcp lets AI assistants deploy and run your apps on Hostwolf Apps. It works with Claude, Cursor, VS Code and any other client that supports the Model Context Protocol. Ask things like:
- "Why did the last deploy of my shop fail?"
- "Deploy github.com/acme/api on my app server, listening on port 8080."
- "Set STRIPE_KEY on the api app and redeploy it."
- "Create a small Postgres database in Amsterdam and connect it to the shop."
- "Let the shop scale to 4 copies, but keep autoscaling under $40 a month."
- "Add a 50 GB disk with backups to my app server, and tell me the price first."
Also see: TypeScript SDK · REST API reference · Changelog · Get an API token
Setup#
- Create an API token in the console under Keys & Tokens → API tokens. Tick Read, Write and Deploy for full use; add Read sensitive data if the assistant should read logs and variable values.
- Connect your client. You can use the hosted server at
https://app.hostwolf.net/mcp(nothing to install), or run it yourself from the download (needs Node.js 18+).
Hosted: https://app.hostwolf.net/mcp#
Nothing to install, and always the latest version. Your client sends your token with each request; we never store it.
Claude Code
claude mcp add --transport http hostwolf-apps https://app.hostwolf.net/mcp --header "Authorization: Bearer your_token"Claude Desktop
Claude Desktop runs local servers only, so it connects to the hosted one through mcp-remote. Add this to claude_desktop_config.json (Settings → Developer → Edit config):
{
"mcpServers": {
"hostwolf-apps": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://app.hostwolf.net/mcp", "--header", "Authorization:${AUTH_HEADER}"],
"env": { "AUTH_HEADER": "Bearer your_token" }
}
}
}Cursor
Add this to ~/.cursor/mcp.json, or to .cursor/mcp.json in a project:
{
"mcpServers": {
"hostwolf-apps": {
"url": "https://app.hostwolf.net/mcp",
"headers": { "Authorization": "Bearer your_token" }
}
}
}VS Code
Add this to .vscode/mcp.json:
{
"servers": {
"hostwolf-apps": {
"type": "http",
"url": "https://app.hostwolf.net/mcp",
"headers": { "Authorization": "Bearer your_token" }
}
}
}Add ?readonly=1 to the URL (https://app.hostwolf.net/mcp?readonly=1) to expose only tools that read.
Run it yourself#
The same server as a download. It runs on your computer, so your token never leaves it.
Claude Code
claude mcp add hostwolf-apps -e HOSTWOLF_APPS_TOKEN=your_token -- npx -y https://app.hostwolf.net/dl/hostwolf-apps-mcp-0.2.1.tgzClaude Desktop
Add this to claude_desktop_config.json (Settings → Developer → Edit config):
{
"mcpServers": {
"hostwolf-apps": {
"command": "npx",
"args": ["-y", "https://app.hostwolf.net/dl/hostwolf-apps-mcp-0.2.1.tgz"],
"env": { "HOSTWOLF_APPS_TOKEN": "your_token" }
}
}
}Cursor
Add this to ~/.cursor/mcp.json, or to .cursor/mcp.json in a project:
{
"mcpServers": {
"hostwolf-apps": {
"command": "npx",
"args": ["-y", "https://app.hostwolf.net/dl/hostwolf-apps-mcp-0.2.1.tgz"],
"env": { "HOSTWOLF_APPS_TOKEN": "your_token" }
}
}
}VS Code
Add this to .vscode/mcp.json:
{
"servers": {
"hostwolf-apps": {
"command": "npx",
"args": ["-y", "https://app.hostwolf.net/dl/hostwolf-apps-mcp-0.2.1.tgz"],
"env": { "HOSTWOLF_APPS_TOKEN": "your_token" }
}
}
}Settings#
For the self-run server; the hosted one takes ?readonly=1 on its URL instead.
| Variable | Meaning |
|---|---|
HOSTWOLF_APPS_TOKEN | Required. Your API token from Keys & Tokens. |
HOSTWOLF_READONLY | 1 to expose only tools that read, never change anything. |
HOSTWOLF_APPS_URL | Console URL (default https://console.app.hostwolf.net). |
HOSTWOLF_NO_UPDATE_CHECK | 1 to skip the startup check for a newer release. |
Self-hosting the HTTP server#
hostwolf-apps-mcp --http runs the same Streamable HTTP endpoint we host at app.hostwolf.net/mcp, for a team that wants its own. It is stateless: every request carries the caller's own token as Authorization: Bearer …, and nothing is stored.
Node
npm install -g https://app.hostwolf.net/dl/hostwolf-apps-mcp-0.2.1.tgz
HOST=0.0.0.0 PORT=8791 hostwolf-apps-mcp --http
curl http://localhost:8791/mcp/healthDocker
cat > Dockerfile <<'EOF'
FROM node:22-alpine
RUN npm install -g --omit=dev https://app.hostwolf.net/dl/hostwolf-apps-mcp-0.2.1.tgz && npm cache clean --force
ENV HOST=0.0.0.0 PORT=8791
USER node
EXPOSE 8791
CMD ["hostwolf-apps-mcp", "--http"]
EOF
docker build -t hostwolf-apps-mcp .
docker run -d --name hostwolf-apps-mcp --memory 192m -p 127.0.0.1:8791:8791 hostwolf-apps-mcpPut it behind your HTTPS proxy, then point clients at https://your-host/mcp as in the hosted setup above.
| Variable | Meaning |
|---|---|
PORT / HOST | Listen address (default 127.0.0.1:8791). |
MCP_PATH | Endpoint path (default /mcp; health check at /mcp/health). |
HOSTWOLF_APPS_URL | Console URL (default https://console.app.hostwolf.net). |
MCP_TRUST_CF_IP | 1 to rate-limit by the CF-Connecting-IP header. Only set it when nothing but Cloudflare can reach your proxy. |
Limits: 300 requests a minute per client address and 180 per token, 2 MB request bodies, 32 requests at a time. The access log shows the time, address, the first 8 characters of a SHA-256 of the token, the tool name and the status, never the token or tool arguments.
Tools#
Applications:
list_apps: every app with status, domains, source, project and environment.get_app: settings, servers, latest deployments and variable names.get_app_logs: recent container output (token needs read sensitive data).get_app_metrics: CPU and memory.create_app_from_git,create_app_from_dockerfile,create_app_from_image.update_app: name, domains, ports, branch, commands, health check.deploy_app: builds and waits up to about 40 seconds for the result.restart_app,stop_app,delete_app.
Environment variables:
list_env_vars: values are masked unless you ask the assistant to reveal them.set_env_vars: create or update several at once, optionally as secrets that can't be read back.delete_env_var.
Deployments:
list_deployments: an app's recent deployments, or what is running now.get_deployment: status and the end of the build log.cancel_deployment.
Projects:
list_projects,create_project,create_environment,delete_project.
Servers:
list_servers: your app servers and VPS with size, city, status and price.get_server: what runs on a server, its domains and load.add_app_server,remove_app_server: run copies of an app on several of your servers.get_traffic: outbound traffic this month and its bill so far, per server or for the team.list_regions: cities with the price per size, and where autoscaling may add servers.
Storage volumes (disks of your servers):
list_storage_volumes,get_storage_volume_price.add_storage_volume,update_storage_volume(enlarge, backups, auto-grow): the assistant shows the price and needs your confirmation.detach_storage_volume,attach_storage_volume: move a volume between your servers in one city.list_storage_volume_backups,backup_storage_volume,restore_storage_volume,delete_storage_volume.
App volumes:
list_volumes,add_volume,delete_volume.backup_volume: a backup schedule, a backup right now, or both.
Managed databases:
list_databases,get_database_plans.get_database: status, the pooled and the direct connection URL, with the password masked unless you ask for it.create_database: billed hourly, so it needs your confirmation.attach_database: saves the pooled URL asDATABASE_URLand the direct one asDATABASE_DIRECT_URL(orREDIS_URL) without showing them. If the app already uses those names for something else it saves nothing and offers a free name (env_key) oroverwrite.upgrade_database: a bigger plan; the assistant shows the new price and needs your confirmation.set_database_eviction_policy: what Redis does when its memory is full.backup_database,delete_database.
Autoscaling and team:
get_autoscaling: policy, live copies, CPU and this month's spend.set_autoscaling: turning it on or raising the limits needs your confirmation.get_team.
Safety#
- Destructive tools (stop, delete, removing a server copy, deleting variables, volumes or databases) are marked
destructiveHintand refuse to run until the assistant passesconfirm: true, which it may only do after you agreed. So do the tools that cost money: creating or upgrading a database, adding or enlarging a storage volume, and raising autoscaling limits. Called withoutconfirm, those answer with the price, so the assistant can show it to you first. - Database passwords and variable values are masked unless you ask for them.
attach_databasehands a URL to an app without the assistant ever seeing it. HOSTWOLF_READONLY=1(or?readonly=1on the hosted URL) removes every tool that writes. A token with only the Read permission does the same on the API side.- The hosted server checks your token with the console, keeps nothing between requests and never logs tokens or tool arguments. It is rate limited per address and per token.
- API tokens can't buy or cancel servers. Those actions only work in the console.
- Create a separate token just for your assistant, and revoke it at any time under Keys & Tokens.
Updating#
The hosted server is always up to date. For the self-run one, npx caches the server by its URL, so it never updates by itself. Every release has its own URL, and the server checks app.hostwolf.net/dl/index.json when it starts. If a newer release exists, it logs a notice and adds it to the list_apps result, so your assistant tells you. To update, change the version in your config's URL and restart your client.
Built on the SDK#
The tools use @hostwolf/apps-sdk, which is bundled inside this package. To embed the server in your own app, install both packages:
npm install https://app.hostwolf.net/dl/hostwolf-apps-sdk-0.2.1.tgz https://app.hostwolf.net/dl/hostwolf-apps-mcp-0.2.1.tgz
import { HostwolfApps } from '@hostwolf/apps-sdk';
import { createHostwolfAppsMcp } from '@hostwolf/apps-mcp/server';
License#
MIT