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."

Setup#

  1. 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.
  2. 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.tgz

Claude 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.

VariableMeaning
HOSTWOLF_APPS_TOKENRequired. Your API token from Keys & Tokens.
HOSTWOLF_READONLY1 to expose only tools that read, never change anything.
HOSTWOLF_APPS_URLConsole URL (default https://console.app.hostwolf.net).
HOSTWOLF_NO_UPDATE_CHECK1 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/health

Docker

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-mcp

Put it behind your HTTPS proxy, then point clients at https://your-host/mcp as in the hosted setup above.

VariableMeaning
PORT / HOSTListen address (default 127.0.0.1:8791).
MCP_PATHEndpoint path (default /mcp; health check at /mcp/health).
HOSTWOLF_APPS_URLConsole URL (default https://console.app.hostwolf.net).
MCP_TRUST_CF_IP1 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 as DATABASE_URL and the direct one as DATABASE_DIRECT_URL (or REDIS_URL) without showing them. If the app already uses those names for something else it saves nothing and offers a free name (env_key) or overwrite.
  • 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 destructiveHint and refuse to run until the assistant passes confirm: 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 without confirm, 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_database hands a URL to an app without the assistant ever seeing it.
  • HOSTWOLF_READONLY=1 (or ?readonly=1 on 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

Stuck, or missing an endpoint? Tell us at app.hostwolf.net/contact or [email protected].