_ registry / mcp streamable-http · checked 1h ago

ffxf

https://ffxf.net

Registry code: 89916535ecfb978d

api record

FFxF rents KVM virtual machines in Montréal, Canada, through its public API.

- Catalogue tools (list_regions, list_plans, list_images) need no key.

endpoint
https://ffxf.net/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is ffxf live?
Yes — it answered the hub's last check (checked 1h ago). It answered 100% of checks over the last 30 days.
Is ffxf free to use?
Not measured yet.
What tools does ffxf have?
71 tools: power_vm, rename_vm, delete_vpc, disconnect_vpc, list_firewalls, get_firewall, update_firewall, list_databases, ….
Is ffxf safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
308ms

last good check

priced tools
0

of 71 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 71 tools
71 never probed 0 of 71 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • power_vm unknown never probed

    start, shutdown (clean ACPI), reboot, or stop (hard power-off). Returns an action to poll with get_action. Scope: vms.action.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vm",
        "type"
      ],
      "properties": {
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        },
        "type": {
          "enum": [
            "start",
            "shutdown",
            "reboot",
            "stop"
          ],
          "type": "string"
        }
      }
    }
    arguments 25 lines
  • rename_vm unknown never probed

    Changes the hostname, inside the guest and in the console. Scope: vms.action.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vm",
        "hostname"
      ],
      "properties": {
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        },
        "hostname": {
          "type": "string",
          "pattern": "^(?!.*[.-]{2})[a-zA-Z0-9]([a-zA-Z0-9.-]{0,126}[a-zA-Z0-9])?$",
          "maxLength": 128,
          "minLength": 1,
          "description": "Letters, digits, dots and hyphens; no leading, trailing or doubled separator."
        }
      }
    }
    arguments 23 lines
  • delete_vpc unknown never probed

    Deletes an empty private network. Refused while a machine is still on it: disconnect or destroy those first. Ask the user first. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vpc"
      ],
      "properties": {
        "vpc": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Private network id, as returned by list_vpcs or create_vpc.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • disconnect_vpc unknown never probed

    Removes the machine's private address and card, without a restart. Refused for the only network of a machine with no public address. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vpc",
        "vm"
      ],
      "properties": {
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        },
        "vpc": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Private network id, as returned by list_vpcs or create_vpc.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 22 lines
  • list_firewalls unknown never probed

    The account's firewalls with their inbound rules and the machines they protect, plus the quota. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • get_firewall unknown never probed

    One firewall: its rules and the machines it protects, with the status of each (applied, pending, error). Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "firewall"
      ],
      "properties": {
        "firewall": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Firewall id, as returned by list_firewalls or create_firewall.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • update_firewall unknown never probed

    rules REPLACES the whole list and is applied at once to every attached machine: send every rule to keep, not only the new one (read get_firewall first). Removing the SSH rule can lock the agent out. pending_machines counts machines not updated yet, retried automatically. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "firewall"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        "rules": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "protocol"
            ],
            "properties": {
              "ports": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "TCP/UDP only: \"22\", \"80,443\" or a range \"8000-8100\" (up to 15 items). Omitted or null: all ports."
              },
              "sources": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "maxItems": 20,
                "description": "Inbound rules only: IPv4/IPv6 addresses or ranges allowed in. Omitted or empty: anywhere."
              },
              "protocol": {
                "enum": [
                  "tcp",
                  "udp",
                  "icmp",
                  "any"
                ],
                "type": "string",
                "description": "icmp covers ping for IPv4 and IPv6; any is every protocol."
              },
              "direction": {
                "enum": [
                  "in",
                  "out"
                ],
                "type": "string",
                "description": "in (default) lets traffic in; out lets it out. The first outbound rule makes outbound restrictive."
              },
              "description": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 64
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "destinations": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "maxItems": 20,
                "description": "Outbound rules only: IPv4/IPv6 addresses or ranges allowed out to. Omitted or empty: anywhere."
              }
            }
          },
          "maxItems": 50
        },
        "firewall": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Firewall id, as returned by list_firewalls or create_firewall.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 84 lines
  • list_databases unknown never probed

    The account's managed databases with their status, private and public addresses, disk, backups and billing (no passwords), plus the quota. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • backup_database unknown never probed

    Starts a differential backup within a minute, e.g. before a risky migration. Not available on a linked fork. Scope: backups.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database"
      ],
      "properties": {
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • delete_logical_database unknown never probed

    DROPS the logical database with everything in it (the backups keep it 7 days). Ask the user first. Scope: databases.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "pattern": "^[a-z_][a-z0-9_]{0,62}$",
          "description": "Lowercase letters, digits and _, starting with a letter or _."
        },
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 21 lines
  • list_regions unknown never probed

    Where machines can run. Public, no key needed.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • list_plans unknown never probed

    Plans with their resources and prices (hourly and monthly, in CAD). Public, no key needed.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "region": {
          "type": "string",
          "description": "Keep only plans offered in this region."
        }
      }
    }
    arguments 10 lines
  • list_images unknown never probed

    Operating systems and ready-to-use application images. The slug is what create_vm expects. Public, no key needed.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "plan": {
          "type": "string",
          "description": "Keep only images that fit this plan."
        },
        "region": {
          "type": "string"
        },
        "category": {
          "type": "string",
          "description": "linux, windows, bsd or app."
        }
      }
    }
    arguments 17 lines
  • get_account unknown never probed

    Credit balance, hourly burn rate and runway, quota and budget caps. Scope: billing.read.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • list_vms unknown never probed

    The account's machines with their status, addresses and billing. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "limit": {
          "type": "integer",
          "maximum": 100,
          "minimum": 1
        },
        "cursor": {
          "type": "string",
          "description": "next_cursor from the previous page."
        },
        "region": {
          "type": "string"
        },
        "status": {
          "type": "string",
          "description": "e.g. running, stopped, provisioning."
        },
        "billing": {
          "enum": [
            "hourly",
            "monthly"
          ],
          "type": "string"
        }
      }
    }
    arguments 29 lines
  • get_vm unknown never probed

    One machine: status, IPv4, IPv6 /64, specs, traffic (Internet only, this traffic month: used_gb, limit_gb, period_ends_at), billing, suspension. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vm"
      ],
      "properties": {
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • get_vm_metrics unknown never probed

    CPU, memory, disk and network as measured from outside the machine. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vm"
      ],
      "properties": {
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        },
        "timeframe": {
          "enum": [
            "hour",
            "day",
            "week",
            "month"
          ],
          "type": "string"
        }
      }
    }
    arguments 24 lines
  • estimate_vm unknown never probed

    Runs every check of create_vm and prices it, without creating anything: would_succeed, hourly rate, monthly price, credit required. Call it before create_vm. Scope: vms.create.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "plan",
        "region",
        "image",
        "hostname",
        "billing"
      ],
      "properties": {
        "vpc": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Private network id (list_vpcs) to connect the machine to, in the same region.",
          "exclusiveMinimum": 0
        },
        "ipv4": {
          "type": "boolean",
          "description": "false orders an IPv6-only machine, cheaper; outbound IPv4 goes through NAT64."
        },
        "plan": {
          "type": "string",
          "description": "Plan slug from list_plans, e.g. nano."
        },
        "image": {
          "type": "string",
          "description": "Image slug from list_images, e.g. debian-13."
        },
        "region": {
          "type": "string",
          "description": "Region slug from list_regions, e.g. montreal."
        },
        "billing": {
          "enum": [
            "hourly",
            "monthly"
          ],
          "type": "string",
          "description": "Hourly draws on prepaid credit; monthly raises an invoice. Fixed for the life of the machine."
        },
        "options": {
          "type": "object",
          "description": "Paid options declared by the plan, by name.",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {}
        },
        "hostname": {
          "type": "string",
          "pattern": "^(?!.*[.-]{2})[a-zA-Z0-9]([a-zA-Z0-9.-]{0,126}[a-zA-Z0-9])?$",
          "maxLength": 128,
          "minLength": 1,
          "description": "Letters, digits, dots and hyphens; no leading, trailing or doubled separator."
        },
        "ssh_keys": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Fingerprints or ids of SSH keys already on the account (see list_ssh_keys)."
        },
        "private_only": {
          "type": "boolean",
          "description": "No public address at all; needs vpc. Reachable only from the private network, Internet through its gateway. Priced like ipv4: false."
        }
      }
    }
    arguments 69 lines
  • create_vm unknown never probed

    Orders a machine and spends credit (hourly) or raises an invoice (monthly). Returns the machine and a provisioning action to poll with get_action. Retrying the same order is safe: it is deduplicated for 24 hours. Scope: vms.create.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "plan",
        "region",
        "image",
        "hostname",
        "billing"
      ],
      "properties": {
        "vpc": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Private network id (list_vpcs) to connect the machine to, in the same region.",
          "exclusiveMinimum": 0
        },
        "ipv4": {
          "type": "boolean",
          "description": "false orders an IPv6-only machine, cheaper; outbound IPv4 goes through NAT64."
        },
        "plan": {
          "type": "string",
          "description": "Plan slug from list_plans, e.g. nano."
        },
        "image": {
          "type": "string",
          "description": "Image slug from list_images, e.g. debian-13."
        },
        "region": {
          "type": "string",
          "description": "Region slug from list_regions, e.g. montreal."
        },
        "billing": {
          "enum": [
            "hourly",
            "monthly"
          ],
          "type": "string",
          "description": "Hourly draws on prepaid credit; monthly raises an invoice. Fixed for the life of the machine."
        },
        "options": {
          "type": "object",
          "description": "Paid options declared by the plan, by name.",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {}
        },
        "payment": {
          "enum": [
            "credit",
            "manual"
          ],
          "type": "string",
          "description": "Monthly only. credit pays from the balance when it covers the invoice."
        },
        "hostname": {
          "type": "string",
          "pattern": "^(?!.*[.-]{2})[a-zA-Z0-9]([a-zA-Z0-9.-]{0,126}[a-zA-Z0-9])?$",
          "maxLength": 128,
          "minLength": 1,
          "description": "Letters, digits, dots and hyphens; no leading, trailing or doubled separator."
        },
        "ssh_keys": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Fingerprints or ids of SSH keys already on the account (see list_ssh_keys)."
        },
        "private_only": {
          "type": "boolean",
          "description": "No public address at all; needs vpc. Reachable only from the private network, Internet through its gateway. Priced like ipv4: false."
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 255,
          "description": "Your own unique value per order. By default one is derived from the order itself."
        },
        "password_delivery": {
          "enum": [
            "email",
            "none"
          ],
          "type": "string",
          "description": "email mails a generated password; none needs at least one SSH key."
        }
      }
    }
    arguments 90 lines
  • reinstall_vm unknown never probed

    ERASES THE DISK and redeploys another image. Ask the user first. confirm_hostname must be the machine's exact current hostname. Scope: vms.action.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vm",
        "image",
        "confirm_hostname"
      ],
      "properties": {
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        },
        "image": {
          "type": "string",
          "description": "Image slug from list_images, offered in the machine's region and fitting its plan."
        },
        "ssh_keys": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "confirm_hostname": {
          "type": "string",
          "description": "The machine's exact hostname, typed back as confirmation."
        },
        "password_delivery": {
          "enum": [
            "email",
            "none"
          ],
          "type": "string"
        }
      }
    }
    arguments 38 lines
  • destroy_vm unknown never probed

    DESTROYS the machine and its disk, with no undo and no backup kept. Ask the user first. confirm_hostname must be the machine's exact hostname. Scope: vms.destroy.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vm",
        "confirm_hostname"
      ],
      "properties": {
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        },
        "when": {
          "enum": [
            "period_end",
            "now"
          ],
          "type": "string",
          "description": "Monthly machines only: at the end of the paid period, or now."
        },
        "confirm_hostname": {
          "type": "string",
          "description": "The machine's exact hostname, typed back as confirmation."
        }
      }
    }
    arguments 28 lines
  • get_action unknown never probed

    Follows an asynchronous action (create, reinstall, power…). Poll until status leaves running; on error it carries the reason. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "action"
      ],
      "properties": {
        "action": {
          "type": "integer",
          "maximum": 9007199254740991,
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 14 lines
  • list_vm_actions unknown never probed

    History of actions on one machine, from the API and the console. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vm"
      ],
      "properties": {
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • get_vm_network unknown never probed

    IPv4 and IPv6 addresses of a machine with their reverse DNS, and its private networks. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vm"
      ],
      "properties": {
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • set_reverse_dns unknown never probed

    Sets the PTR record of one of the machine's addresses; null restores the default. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vm",
        "address",
        "hostname"
      ],
      "properties": {
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        },
        "address": {
          "type": "string",
          "description": "An IPv4 or IPv6 address of the machine."
        },
        "hostname": {
          "type": [
            "string",
            "null"
          ],
          "description": "Fully qualified name, or null to clear."
        }
      }
    }
    arguments 28 lines
  • list_vpcs unknown never probed

    The account's private networks with their range, gateway and connected machines, plus the quota. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • get_vpc unknown never probed

    One private network and the machines on it, with their private address. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vpc"
      ],
      "properties": {
        "vpc": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Private network id, as returned by list_vpcs or create_vpc.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • create_vpc unknown never probed

    Creates an isolated private network; ready when the call returns. The first usable address (.1) is reserved for the gateway. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "name",
        "cidr",
        "region"
      ],
      "properties": {
        "cidr": {
          "type": "string",
          "description": "Private IPv4 range from /16 to /29 in 10.0.0.0/8, 172.16.0.0/12 or 192.168.0.0/16, e.g. 10.0.0.0/24."
        },
        "name": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        "region": {
          "type": "string",
          "description": "Region slug from list_regions, e.g. montreal."
        }
      }
    }
    arguments 24 lines
  • connect_vpc unknown never probed

    Hot-adds a card on the private network and sets its address in the system, without a restart. configuration: manual means the address must be set by hand in the guest. Connecting again returns the same address. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vpc",
        "vm"
      ],
      "properties": {
        "ip": {
          "type": "string",
          "description": "Address wanted in the range; default the next free one."
        },
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        },
        "vpc": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Private network id, as returned by list_vpcs or create_vpc.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 26 lines
  • move_vpc unknown never probed

    Joins the target network, then leaves this one, so the machine is never cut off. Keeps the same address ending when free. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "vpc",
        "vm",
        "to"
      ],
      "properties": {
        "to": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "The target network.",
          "exclusiveMinimum": 0
        },
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        },
        "vpc": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "The network the machine is on now.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 29 lines
  • create_firewall unknown never probed

    Creates a reusable set of inbound and outbound rules. Without rules it starts with SSH (TCP 22) and ping open from anywhere; pass rules: [] for none. Nothing is filtered until it is attached to a machine. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        "rules": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "protocol"
            ],
            "properties": {
              "ports": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "TCP/UDP only: \"22\", \"80,443\" or a range \"8000-8100\" (up to 15 items). Omitted or null: all ports."
              },
              "sources": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "maxItems": 20,
                "description": "Inbound rules only: IPv4/IPv6 addresses or ranges allowed in. Omitted or empty: anywhere."
              },
              "protocol": {
                "enum": [
                  "tcp",
                  "udp",
                  "icmp",
                  "any"
                ],
                "type": "string",
                "description": "icmp covers ping for IPv4 and IPv6; any is every protocol."
              },
              "direction": {
                "enum": [
                  "in",
                  "out"
                ],
                "type": "string",
                "description": "in (default) lets traffic in; out lets it out. The first outbound rule makes outbound restrictive."
              },
              "description": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 64
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "destinations": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "maxItems": 20,
                "description": "Outbound rules only: IPv4/IPv6 addresses or ranges allowed out to. Omitted or empty: anywhere."
              }
            }
          },
          "maxItems": 50
        }
      }
    }
    arguments 78 lines
  • delete_firewall unknown never probed

    Deletes a firewall attached to no machine. Refused while it protects one: detach it first. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "firewall"
      ],
      "properties": {
        "firewall": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Firewall id, as returned by list_firewalls or create_firewall.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • attach_firewall unknown never probed

    From now on the machine refuses inbound traffic no rule of its firewalls opens; enforced within about ten seconds of the call. Up to 5 firewalls per machine, rules add up. Refused for a machine with no public address. Attaching again is harmless. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "firewall",
        "vm"
      ],
      "properties": {
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        },
        "firewall": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Firewall id, as returned by list_firewalls or create_firewall.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 22 lines
  • detach_firewall unknown never probed

    Removes the firewall's rules from the machine; with no other firewall it accepts all inbound traffic again. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "firewall",
        "vm"
      ],
      "properties": {
        "vm": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Machine id, as returned by list_vms or create_vm.",
          "exclusiveMinimum": 0
        },
        "firewall": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Firewall id, as returned by list_firewalls or create_firewall.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 22 lines
  • list_load_balancers unknown never probed

    The account's load balancers with their addresses, pools, targets and health, listeners and rules, certificates; plus the quota. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • get_load_balancer unknown never probed

    One load balancer in full: status, ipv4/ipv6 to put in DNS, pools with targets (health, sessions, response time), listeners with rules in evaluation order, certificates. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "lb"
      ],
      "properties": {
        "lb": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Load balancer id, as returned by list_load_balancers or create_load_balancer.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • get_load_balancer_metrics unknown never probed

    Requests by response class, connections, bytes in/out and peak sessions over 1h (1-minute buckets), 24h (15 minutes) or 7d (1 hour), plus totals. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "lb"
      ],
      "properties": {
        "lb": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Load balancer id, as returned by list_load_balancers or create_load_balancer.",
          "exclusiveMinimum": 0
        },
        "range": {
          "enum": [
            "1h",
            "24h",
            "7d"
          ],
          "type": "string"
        }
      }
    }
    arguments 23 lines
  • create_load_balancer unknown never probed

    Orders a load balancer in a private network, billed by the hour from now (the account needs 24 hours of credit), or by the month (7.30 CAD) or the year (73 CAD) with billing. A monthly or yearly period comes out of credit if it covers it; otherwise billing.pending_invoice holds the invoice to pay and it stays hourly until then. Ready within minutes (status pending → active); pools and listeners can be added meanwhile. Retrying the same call is safe. Scope: vms.create.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "name",
        "vpc"
      ],
      "properties": {
        "vpc": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Private network whose machines will be the targets (list_vpcs).",
          "exclusiveMinimum": 0
        },
        "name": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        "billing": {
          "enum": [
            "hourly",
            "monthly",
            "yearly"
          ],
          "type": "string",
          "description": "hourly (default), monthly (the price of 730 hours, paid in advance) or yearly (ten months). Ask the user; monthly or yearly needs credit or an invoice paid by the user."
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 255,
          "description": "Your own unique value per order. By default one is derived from the call."
        }
      }
    }
    arguments 35 lines
  • delete_load_balancer unknown never probed

    Deletes the load balancer, its address and its configuration; billing stops. Target machines are not touched. Ask the user first. Scope: vms.destroy.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "lb"
      ],
      "properties": {
        "lb": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Load balancer id, as returned by list_load_balancers or create_load_balancer.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • upsert_pool unknown never probed

    Without pool: creates one (name required, up to 10). With pool: changes only the fields given. Deleting a pool also removes its targets and the rules leading to it. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "lb"
      ],
      "properties": {
        "lb": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Load balancer id, as returned by list_load_balancers or create_load_balancer.",
          "exclusiveMinimum": 0
        },
        "name": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1,
          "description": "Letters, digits, spaces, . _ -; unique in the load balancer."
        },
        "pool": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Pool id, from get_load_balancer.",
          "exclusiveMinimum": 0
        },
        "protocol": {
          "enum": [
            "http",
            "tcp"
          ],
          "type": "string",
          "description": "http pools serve http/https listeners, tcp pools tcp listeners. Default http; cannot change once in use."
        },
        "algorithm": {
          "enum": [
            "roundrobin",
            "leastconn"
          ],
          "type": "string"
        },
        "send_proxy": {
          "type": "boolean",
          "description": "tcp pools only: PROXY protocol v2 to the targets."
        },
        "health_path": {
          "anyOf": [
            {
              "type": "string",
              "maxLength": 128
            },
            {
              "type": "null"
            }
          ],
          "description": "e.g. /health"
        },
        "health_type": {
          "enum": [
            "tcp",
            "http"
          ],
          "type": "string",
          "description": "http (http pools only): GET health_path, 2xx or 3xx is healthy. Default tcp."
        },
        "health_interval": {
          "type": "integer",
          "maximum": 60,
          "minimum": 2,
          "description": "Seconds between checks, default 5."
        }
      }
    }
    arguments 72 lines
  • delete_pool unknown never probed

    Removes a pool, its targets and the rules leading to it. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "lb",
        "pool"
      ],
      "properties": {
        "lb": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Load balancer id, as returned by list_load_balancers or create_load_balancer.",
          "exclusiveMinimum": 0
        },
        "pool": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Pool id, from get_load_balancer.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 22 lines
  • set_targets unknown never probed

    REPLACES the pool's targets with exactly this list (up to 25): send every target to keep. Each machine must be in the load balancer's private network (connect_vpc first). drain: true stops new connections to a target before maintenance. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "lb",
        "pool",
        "targets"
      ],
      "properties": {
        "lb": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Load balancer id, as returned by list_load_balancers or create_load_balancer.",
          "exclusiveMinimum": 0
        },
        "pool": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Pool id, from get_load_balancer.",
          "exclusiveMinimum": 0
        },
        "targets": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "vm",
              "port"
            ],
            "properties": {
              "vm": {
                "type": "integer",
                "maximum": 9007199254740991,
                "description": "Machine id, as returned by list_vms or create_vm.",
                "exclusiveMinimum": 0
              },
              "port": {
                "type": "integer",
                "maximum": 65535,
                "minimum": 1,
                "description": "Port the service listens on, on the machine's private address."
              },
              "drain": {
                "type": "boolean"
              },
              "weight": {
                "type": "integer",
                "maximum": 256,
                "minimum": 1
              }
            }
          },
          "maxItems": 25
        }
      }
    }
    arguments 56 lines
  • upsert_listener unknown never probed

    An entry port on the load balancer's address. Without listener: opens one (port and protocol required, up to 5; 22 and 8402 are reserved). https gets certificates for its rules' hostnames; redirect_https makes port 80 redirect to it. A tcp listener needs a tcp default_pool. sources restricts who may connect (null: everyone); with an https listener, port 80 stays open to everyone. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "lb"
      ],
      "properties": {
        "lb": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Load balancer id, as returned by list_load_balancers or create_load_balancer.",
          "exclusiveMinimum": 0
        },
        "port": {
          "type": "integer",
          "maximum": 65535,
          "minimum": 1
        },
        "sources": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 20
            },
            {
              "type": "null"
            }
          ],
          "description": "IPv4/IPv6 addresses or ranges allowed in."
        },
        "listener": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Listener id, from get_load_balancer.",
          "exclusiveMinimum": 0
        },
        "protocol": {
          "enum": [
            "http",
            "https",
            "tcp"
          ],
          "type": "string"
        },
        "default_pool": {
          "anyOf": [
            {
              "type": "integer",
              "maximum": 9007199254740991,
              "exclusiveMinimum": 0
            },
            {
              "type": "null"
            }
          ],
          "description": "Pool for traffic no rule matches; none answers 503."
        },
        "redirect_https": {
          "type": "boolean"
        }
      }
    }
    arguments 65 lines
  • delete_listener unknown never probed

    Closes the port and removes its rules. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "lb",
        "listener"
      ],
      "properties": {
        "lb": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Load balancer id, as returned by list_load_balancers or create_load_balancer.",
          "exclusiveMinimum": 0
        },
        "listener": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Listener id, from get_load_balancer.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 22 lines
  • set_rules unknown never probed

    REPLACES the http/https listener's rules: each sends a hostname and/or path prefix to an http pool (up to 25). They are evaluated most specific first, whatever the order sent; anything unmatched goes to the default pool. No wildcard hostname on https. Each https hostname gets a certificate once it points to the load balancer. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "lb",
        "listener",
        "rules"
      ],
      "properties": {
        "lb": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Load balancer id, as returned by list_load_balancers or create_load_balancer.",
          "exclusiveMinimum": 0
        },
        "rules": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "pool"
            ],
            "properties": {
              "pool": {
                "type": "integer",
                "maximum": 9007199254740991,
                "description": "Pool id, from get_load_balancer.",
                "exclusiveMinimum": 0
              },
              "hostname": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 253
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "e.g. app.example.com, or *.example.com on http only."
              },
              "path_prefix": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 128
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "e.g. /api/"
              }
            }
          },
          "maxItems": 25
        },
        "listener": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Listener id, from get_load_balancer.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 65 lines
  • get_database_options unknown never probed

    What can be ordered: engines and versions, extensions, sizes with their hourly, monthly and yearly prices per region, and the price of disk beyond what a size includes. Call it before create_database and show the price to the user. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • get_database unknown never probed

    One database: status, connection (host, private ip, port, defaultdb and ffxfadmin; on Valkey no database and default), public access and sources, disk usage and cap, users with their databases (null: all) and read_only, logical databases and extensions, Valkey's eviction policy and data memory, backups and restore window, maintenance window, fork link, warning. No passwords. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database"
      ],
      "properties": {
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • get_database_credentials unknown never probed

    Every user with its password, databases and read_only, and its own connection_uri; ready-made connection strings for the admin (private network, and public when open). Treat the result as a secret: give it to the application through an environment variable or a secret store, never into code, commits or logs. Scope: databases.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database"
      ],
      "properties": {
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • get_database_metrics unknown never probed

    CPU, memory, connections and commits per minute (commands per minute on Valkey) over 1h (1-minute buckets), 24h (10 minutes) or 7d (1 hour); only buckets with samples. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database"
      ],
      "properties": {
        "range": {
          "enum": [
            "1h",
            "24h",
            "7d"
          ],
          "type": "string"
        },
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 23 lines
  • get_slow_queries unknown never probed

    The 20 queries with the most total time (pg_stat_statements, values replaced by $1, $2…; performance_schema on MySQL and MariaDB, values replaced by ?): calls, total and mean time, rows. A starting point for indexes. On Valkey, the commands with the most total time since the engine started (GET, HSET…). Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database"
      ],
      "properties": {
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • list_database_backups unknown never probed

    Completed backups (weekly full, daily differential; the transaction log is archived continuously) and the restore window: any minute in it can be restored with restore_database. On Valkey, snapshots (rdb) every hour when there were writes, all kept 24 hours, then one a day. Scope: vms.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database"
      ],
      "properties": {
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • create_database unknown never probed

    Orders a managed database (PostgreSQL, MySQL, MariaDB or Valkey) in a private network, billed by the hour from now (the account needs 24 hours of credit), or by the month (730 hours) or the year (ten months) with billing; get_database_options gives each price. A monthly or yearly period comes out of credit if it covers it; otherwise billing.pending_invoice holds the invoice to pay and it stays hourly until then. Ready within minutes (status pending → active), with the admin user ffxfadmin and the logical database defaultdb (Valkey: the admin default, no logical database). Retrying the same call is safe. Scope: vms.create.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "name",
        "vpc"
      ],
      "properties": {
        "vpc": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Private network the database joins (list_vpcs); the machines on it reach the database.",
          "exclusiveMinimum": 0
        },
        "name": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        "engine": {
          "enum": [
            "postgresql",
            "mysql",
            "mariadb",
            "valkey"
          ],
          "type": "string",
          "description": "Default postgresql. mysql is Percona Server; valkey is Redis-compatible (key-value, in memory)."
        },
        "billing": {
          "enum": [
            "hourly",
            "monthly",
            "yearly"
          ],
          "type": "string",
          "description": "hourly (default), monthly (the price of 730 hours, paid in advance) or yearly (ten months). Ask the user; monthly or yearly needs credit or an invoice paid by the user."
        },
        "size_gb": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Memory in GB, one of the sizes of get_database_options for the region. Default: 1, or the source's size.",
          "exclusiveMinimum": 0
        },
        "version": {
          "type": "string",
          "description": "Major version from get_database_options; the newest by default."
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 255,
          "description": "Your own unique value per order. By default one is derived from the call."
        }
      }
    }
    arguments 55 lines
  • restore_database unknown never probed

    Creates a NEW database, billed like any other, holding the data as it was at a given minute of the source's restore window (list_database_backups; Valkey: the last snapshot before that minute), with the same users and passwords. The source is not touched and may have been deleted in the last 7 days. Retrying the same call is safe. Scope: vms.create.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "at",
        "name"
      ],
      "properties": {
        "at": {
          "type": "string",
          "description": "ISO 8601 timestamp, UTC unless an offset is given, e.g. 2026-10-14T09:30:00Z."
        },
        "vpc": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Default: the source's private network.",
          "exclusiveMinimum": 0
        },
        "name": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1,
          "description": "Name of the new database."
        },
        "size_gb": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Memory in GB, one of the sizes of get_database_options for the region. Default: 1, or the source's size.",
          "exclusiveMinimum": 0
        },
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "The source database.",
          "exclusiveMinimum": 0
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 255
        }
      }
    }
    arguments 43 lines
  • fork_database unknown never probed

    Creates a NEW database, billed like any other, whose data is an instant copy of this one (for a test or staging copy), with the same users and passwords. It stays linked to its source for up to 7 days (no backups of its own, the source cannot be deleted) unless detach_database_fork ends that sooner. Retrying the same call is safe. Scope: vms.create.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "name"
      ],
      "properties": {
        "vpc": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Default: the source's private network; same region either way.",
          "exclusiveMinimum": 0
        },
        "name": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1,
          "description": "Name of the new database."
        },
        "size_gb": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Memory in GB, one of the sizes of get_database_options for the region. Default: 1, or the source's size.",
          "exclusiveMinimum": 0
        },
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "The source database.",
          "exclusiveMinimum": 0
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 255
        }
      }
    }
    arguments 38 lines
  • detach_database_fork unknown never probed

    Gives a linked fork its own copy of the data; the database is unavailable for about 30 seconds, then its backups start. Scope: vms.action.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database"
      ],
      "properties": {
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 15 lines
  • resize_database unknown never probed

    Moves the database to a LARGER size (more vCPU, memory and included disk; see get_database_options): same data, users, names and addresses. It restarts: one to two minutes of downtime, status maintenance meanwhile (resize.to_gb set), then active with the new size_gb. The new rate applies from the next hour. Larger sizes only, there is no way back: tell the user the new price and the downtime first. Retrying the same call is safe. Scope: vms.create.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "size_gb"
      ],
      "properties": {
        "size_gb": {
          "type": "integer",
          "maximum": 1024,
          "minimum": 1,
          "description": "Memory in GB, larger than the current size_gb."
        },
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        },
        "idempotency_key": {
          "type": "string",
          "maxLength": 255
        }
      }
    }
    arguments 26 lines
  • delete_database unknown never probed

    DELETES the database and its data; billing stops. Ask the user first. confirm_name must be the database's exact name. Its backups stay 7 days (restore_database can bring it back meanwhile). Refused while a linked fork depends on it. Scope: vms.destroy.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "confirm_name"
      ],
      "properties": {
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        },
        "confirm_name": {
          "type": "string",
          "description": "The database's exact name, typed back as confirmation."
        }
      }
    }
    arguments 20 lines
  • update_database unknown never probed

    Any of: the name; the weekly maintenance window (day 0 = Sunday, start hour, Montréal time, 2 hours long; minor updates, usually under 2 minutes of downtime); the disk cap (the disk grows by itself at 80 % full, up to the cap; disk beyond what the size includes is billed per GB); on Valkey, the eviction policy. Scope: databases.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        },
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        },
        "disk_cap_gb": {
          "type": "integer",
          "maximum": 1000,
          "minimum": 1
        },
        "eviction_policy": {
          "enum": [
            "noeviction",
            "allkeys-lru",
            "allkeys-lfu",
            "allkeys-random",
            "volatile-lru",
            "volatile-lfu",
            "volatile-random",
            "volatile-ttl"
          ],
          "type": "string",
          "description": "Valkey only: what happens when data memory is full. noeviction (default) refuses writes; allkeys-lru removes the least used keys, for a cache."
        },
        "maintenance_day": {
          "type": "integer",
          "maximum": 6,
          "minimum": 0
        },
        "maintenance_hour": {
          "type": "integer",
          "maximum": 23,
          "minimum": 0
        }
      }
    }
    arguments 49 lines
  • set_database_public_access unknown never probed

    Opens the database to the internet at its public host and port (IPv4 and IPv6, TLS and password still required), or closes it. sources restricts who may connect (IPv4/IPv6 addresses or ranges); omitted it is left as is, null or [] means everyone. Prefer listing the user's addresses. Live within about 30 seconds. Scope: network.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "enabled"
      ],
      "properties": {
        "enabled": {
          "type": "boolean"
        },
        "sources": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string"
              },
              "maxItems": 50
            },
            {
              "type": "null"
            }
          ]
        },
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 33 lines
  • create_database_user unknown never probed

    Creates a user with a generated password, returned here once (also readable with get_database_credentials); live within seconds. Up to 30 users. It connects only to its databases (every logical database, future ones included, when databases is omitted): it reads and writes everything there and creates tables (on PostgreSQL in public too), or only reads with read_only; elsewhere it has no access. Its connection_uri points to defaultdb, or to its first database without access to defaultdb. On Valkey, an ACL user with every key and data command (no databases, no read_only). Treat the password as a secret. Scope: databases.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "username"
      ],
      "properties": {
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        },
        "username": {
          "type": "string",
          "pattern": "^[a-z_][a-z0-9_]{0,62}$",
          "description": "Lowercase letters, digits and _, starting with a letter or _."
        },
        "databases": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^[a-z_][a-z0-9_]{0,62}$",
            "description": "Lowercase letters, digits and _, starting with a letter or _."
          },
          "maxItems": 30,
          "description": "Logical databases it may connect to (existing ones, see get_database). Omit for all of them, future ones included."
        },
        "read_only": {
          "type": "boolean",
          "description": "SELECT only (MySQL, MariaDB: SELECT and SHOW VIEW). Default false."
        }
      }
    }
    arguments 35 lines
  • set_database_user_access unknown never probed

    Sets the logical databases a user connects to (databases: a list, or null for all of them, future ones included) and whether it only reads; a field left out keeps its value. Applied within seconds; where its access is removed or lowered, its open connections are closed, so tell the user first if an application uses it. Not on the admin (it always has every database) nor on Valkey. Scope: databases.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "username"
      ],
      "properties": {
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        },
        "username": {
          "type": "string",
          "pattern": "^[a-z_][a-z0-9_]{0,62}$",
          "description": "Lowercase letters, digits and _, starting with a letter or _."
        },
        "databases": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^[a-z_][a-z0-9_]{0,62}$",
                "description": "Lowercase letters, digits and _, starting with a letter or _."
              },
              "maxItems": 30
            },
            {
              "type": "null"
            }
          ],
          "description": "Logical databases it may connect to; null for all of them, future ones included."
        },
        "read_only": {
          "type": "boolean"
        }
      }
    }
    arguments 41 lines
  • reset_database_password unknown never probed

    Gives the user a new password, returned here; the old one stops working within seconds, so update the application first or right after. Scope: databases.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "username"
      ],
      "properties": {
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        },
        "username": {
          "type": "string",
          "pattern": "^[a-z_][a-z0-9_]{0,62}$",
          "description": "Lowercase letters, digits and _, starting with a letter or _."
        }
      }
    }
    arguments 21 lines
  • delete_database_user unknown never probed

    Hands the user's objects to the admin, then drops the user. The admin (ffxfadmin, or default on Valkey) cannot be deleted. Scope: databases.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "username"
      ],
      "properties": {
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        },
        "username": {
          "type": "string",
          "pattern": "^[a-z_][a-z0-9_]{0,62}$",
          "description": "Lowercase letters, digits and _, starting with a letter or _."
        }
      }
    }
    arguments 21 lines
  • create_logical_database unknown never probed

    Creates another database inside the managed database (like defaultdb), owned by the admin; up to 30. Not on Valkey (numbered databases, SELECT 0 to 15). Scope: databases.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "name"
      ],
      "properties": {
        "name": {
          "type": "string",
          "pattern": "^[a-z_][a-z0-9_]{0,62}$",
          "description": "Lowercase letters, digits and _, starting with a letter or _."
        },
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        }
      }
    }
    arguments 21 lines
  • enable_extension unknown never probed

    PostgreSQL only. Enables an extension from get_database_options (vector for pgvector, postgis, pg_trgm…) in one logical database; installed on demand, live within a minute. Scope: databases.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "name",
        "extension"
      ],
      "properties": {
        "name": {
          "type": "string",
          "pattern": "^[a-z_][a-z0-9_]{0,62}$",
          "description": "The logical database, e.g. defaultdb."
        },
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        },
        "extension": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        }
      }
    }
    arguments 27 lines
  • disable_extension unknown never probed

    Drops the extension without CASCADE: if objects depend on it, it stays and get_database shows why in warning. Scope: databases.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "database",
        "name",
        "extension"
      ],
      "properties": {
        "name": {
          "type": "string",
          "pattern": "^[a-z_][a-z0-9_]{0,62}$",
          "description": "The logical database."
        },
        "database": {
          "type": "integer",
          "maximum": 9007199254740991,
          "description": "Database id, as returned by list_databases or create_database.",
          "exclusiveMinimum": 0
        },
        "extension": {
          "type": "string",
          "maxLength": 64,
          "minLength": 1
        }
      }
    }
    arguments 27 lines
  • get_runners unknown never probed

    The runs-on labels with their vCPU, memory and price per minute, the account's concurrency (vCPU of jobs starting or running, and the cap), the linked GitHub organizations and accounts, this month's minutes and cost per repository, the actions cache next to the runners (bytes, entries and last use per repository, price per GB per month), and the Docker cache per repository (enabled in the console, bytes, last successful job). Scope: billing.read.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • list_runner_jobs unknown never probed

    Jobs that ran or wait on FFxF runners, most recent first: repository, workflow and job, label, status (queued with waiting_reason credit, budget or account; running; succeeded; failed, stopped_for_credit when the credit ran out; cancelled; refused with refusal), times, billed minutes and amount, link to the run. Scope: billing.read.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "properties": {
        "limit": {
          "type": "integer",
          "maximum": 100,
          "minimum": 1,
          "description": "Default 25."
        },
        "cursor": {
          "type": "string",
          "description": "meta.next_cursor of the previous page."
        },
        "status": {
          "enum": [
            "queued",
            "running",
            "succeeded",
            "failed",
            "cancelled",
            "refused"
          ],
          "type": "string"
        },
        "repository": {
          "type": "string",
          "maxLength": 200,
          "description": "owner/name"
        }
      }
    }
    arguments 32 lines
  • list_ssh_keys unknown never probed

    SSH keys saved on the account, to pass to create_vm. Scope: sshkeys.write or vms.read.

    mcp-tool

    {
      "type": "object",
      "properties": {}
    }
    arguments 4 lines
  • add_ssh_key unknown never probed

    Saves a public key on the account so new machines can be reached without a password. Scope: sshkeys.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "name",
        "public_key"
      ],
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 64
        },
        "public_key": {
          "type": "string",
          "maxLength": 8192,
          "description": "OpenSSH public key, e.g. ssh-ed25519 AAAA… user@host."
        }
      }
    }
    arguments 19 lines
  • delete_ssh_key unknown never probed

    Removes a key from the account. Machines already deployed with it keep it; only future deployments change. Scope: sshkeys.write.

    mcp-tool

    {
      "type": "object",
      "$schema": "http://json-schema.org/draft-07/schema#",
      "required": [
        "key"
      ],
      "properties": {
        "key": {
          "anyOf": [
            {
              "type": "integer",
              "maximum": 9007199254740991,
              "exclusiveMinimum": 0
            },
            {
              "type": "string",
              "minLength": 1
            }
          ],
          "description": "Key id from list_ssh_keys."
        }
      }
    }
    arguments 23 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 89916535ecfb978d.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/89916535ecfb978d/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/89916535ecfb978d/badge.svg)](https://brick.blue/agent/89916535ecfb978d?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.