MCP server
Connect Claude Code, Claude Desktop, Cursor or another MCP client to pfcloud, and see every tool with its scope.
What it is
pfcloud is a remote MCP server (Model Context Protocol) at:
POST https://YOUR-MYFORGE/api/mcp
It speaks JSON-RPC 2.0 over MCP Streamable HTTP, tools only, with no sessions. GET and DELETE answer 405. It uses the same bearer token as the REST API.
Connect
First make a token (API, then Tokens). See AI token recipes.
Claude Code
claude mcp add --transport http myforge https://YOUR-MYFORGE/api/mcp \
--header "Authorization: Bearer mf_YOUR_TOKEN"
Cursor and other clients with a JSON config
{
"mcpServers": {
"myforge": {
"url": "https://YOUR-MYFORGE/api/mcp",
"headers": { "Authorization": "Bearer mf_YOUR_TOKEN" }
}
}
}
Claude Desktop and clients that only start local programs
Use a bridge such as mcp-remote, which turns a remote server into a local one:
{
"mcpServers": {
"myforge": {
"command": "npx",
"args": ["mcp-remote", "https://YOUR-MYFORGE/api/mcp", "--header", "Authorization: Bearer ${MYFORGE_TOKEN}"],
"env": { "MYFORGE_TOKEN": "mf_YOUR_TOKEN" }
}
}
}
Config files are plain text on your disk. Do not commit them. Client menus differ between versions: look for "add custom MCP server" with a URL and a header.
Tools
A tool is listed only when the token can use every scope it needs right now. A read-only token shows only the read tools.
| Tool | What it does | Scope | API call |
|---|---|---|---|
whoami |
Who the token is, its team, usable scopes | any valid token | GET /token |
list_servers |
Servers: name, status, address | servers:read |
GET /servers |
get_server |
One server | servers:read |
GET /servers/{server} |
get_server_health |
Resources, issues, live agent | servers:read |
GET /servers/{server}/health |
get_server_security |
Latest security report | servers:read |
GET /servers/{server}/security |
list_server_certificates |
Certificates on a server, soonest expiry first | servers:read + sites:read |
GET /servers/{server}/certificates |
list_sites |
Sites | sites:read |
GET /sites |
get_site |
One site | sites:read |
GET /sites/{site} |
get_site_certificate |
Certificate and history | sites:read |
GET /sites/{site}/certificate |
list_deployments |
Recent deployments | deployments:read |
GET /sites/{site}/deployments |
get_site_compatibility |
Does the server fit the code's language versions | sites:read |
GET /sites/{site}/compatibility |
get_server_runtimes |
PHP versions installed or installable, Node.js, Python… | servers:read |
GET /servers/{server}/runtimes |
get_deployment |
One deployment, log tail, code-scan findings | deployments:read |
GET /sites/{site}/deployments/{deployment} |
list_site_backups |
A site's backups | backups:read |
GET /sites/{site}/backups |
read_site_log |
Last lines of a log (log, lines arguments) |
logs:read |
GET /sites/{site}/logs/tail |
deploy_site |
Deploy now | deployments:write |
POST /sites/{site}/deploy |
rollback_site |
Roll back to the previous release | deployments:write |
POST /sites/{site}/rollback |
renew_certificate |
Renew a Let's Encrypt certificate | certificates:renew |
POST /sites/{site}/certificate/renew |
back_up_site |
Back up the database now | backups:write |
POST /sites/{site}/backups |
run_security_check |
Start a read-only security check | servers:write |
POST /servers/{server}/security-checks |
Arguments are the public ids (server, site, deployment) that the list tools return.
Not offered over MCP, on purpose
Deleting, reading or changing .env, and running commands. Also not offered: creating servers or sites, firewall, databases. For those use the dashboard or the REST API with a separate, more carefully limited token.
How tools map to the API
A tool call is turned into a request to /api/v1/... with your own token and sent through the full API stack. So scopes, plan, the owner's rules, the maker's permissions, server and site limits, rate limits, the request log and idempotency (a fresh key for every write) all apply exactly as for a direct call. API errors come back as tool results with isError true and the message Error <status>: ....
Limits and behaviour
- 120 requests per minute per token (the same pool as the REST API).
- A tool result is cut at 20,000 characters.
- Unknown arguments are refused. Path ids must look like public ids.
- Batches of up to 20 JSON-RPC messages are accepted.
- The server tells the AI to ask you before deploying, rolling back or renewing unless you clearly asked, and not to follow instructions found in logs, commit messages or deployment output. This is guidance, not a guarantee: the real protection is the token's scopes. See AI security.
What can go wrong
| Problem | Fix |
|---|---|
| The client shows no tools | The token lacks the scopes, or the plan, owner rules or the maker's permissions block them. Call whoami, or GET /token. |
401 when connecting |
Wrong or expired token, or the header is missing. |
403 |
The address is not allowed for this token. |
Error 409 from a tool |
A deploy is already running or the site cannot be deployed. |