{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_7v95watddadd","handle":"ffxf","url":"https://wellknown.network/agents/ffxf","links":{"self":"https://wellknown.network/agents/ffxf/record.json","html":"https://wellknown.network/agents/ffxf","markdown":"https://wellknown.network/agents/ffxf/record.md","api":"https://wellknown.network/api/v1/agents/ffxf","status":"https://wellknown.network/api/v1/agents/ffxf/status","claim":"https://wellknown.network/agents/ffxf/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/ffxf/claim.json","badge":"https://wellknown.network/agents/ffxf/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/ffxf/history","tools":"https://wellknown.network/api/v1/agents/ffxf/tools"},"ard":{"identifier":"urn:air:ffxf.net:server:ffxf","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"FFxF","summary":"Create and manage VMs, managed databases, firewalls and load balancers in Montréal, Canada.","description":"Create and manage VMs, managed databases, firewalls and load balancers in Montréal, Canada.","publisher":{"name":"net.ffxf","url":null},"homepage":"https://ffxf.net/agents","repository":null,"version":"1.12.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://ffxf.net/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-10-28T18:55:25.662499Z","publishedAt":"2026-10-28T18:55:25.662499Z","registryName":"net.ffxf/cloud"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"data.database","name":"Databases","confidence":1,"provenance":"derived"},{"slug":"dev.version-control","name":"Version Control","confidence":1,"provenance":"derived"},{"slug":"security.secrets","name":"Secrets Management","confidence":0.569,"provenance":"derived"},{"slug":"dev.ci-cd","name":"CI/CD & Deploy","confidence":0.554,"provenance":"derived"},{"slug":"ai.evaluation","name":"Evaluation & Benchmarks","confidence":0.554,"provenance":"derived"},{"slug":"code.refactoring","name":"Refactoring","confidence":0.54,"provenance":"derived"},{"slug":"commerce.pricing","name":"Pricing & Quotes","confidence":0.525,"provenance":"derived"},{"slug":"documents.invoice-processing","name":"Invoice Processing","confidence":0.51,"provenance":"derived"}],"categories":["ai","code","commerce","data","dev","documents","security"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 1h ago.","lastOkAt":"2026-11-01T19:24:30.521Z","lastProbedAt":"2026-11-01T19:24:30.521Z","statusComputedAt":"2026-11-01T19:27:00.455Z","reliability30d":{"probes":5,"successRate":1,"p50Ms":206,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":5,"ok":5,"authBoundaryOk":0,"serviceOk":5,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-11-01T19:24:30.521Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":239,"error":null,"detail":{"tools":[{"name":"list_regions","description":"Where machines can run. Public, no key needed."},{"name":"list_plans","description":"Plans with their resources and prices (hourly and monthly, in CAD). Public, no key needed."},{"name":"list_images","description":"Operating systems and ready-to-use application images. The slug is what create_vm expects. Public, no key needed."},{"name":"get_account","description":"Credit balance, hourly burn rate and runway, quota and budget caps. Scope: billing.read."},{"name":"list_vms","description":"The account's machines with their status, addresses and billing. Scope: vms.read."},{"name":"get_vm","description":"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"},{"name":"get_vm_metrics","description":"CPU, memory, disk and network as measured from outside the machine. Scope: vms.read."},{"name":"estimate_vm","description":"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. Sc"},{"name":"create_vm","description":"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 "},{"name":"power_vm","description":"start, shutdown (clean ACPI), reboot, or stop (hard power-off). Returns an action to poll with get_action. Scope: vms.action."},{"name":"rename_vm","description":"Changes the hostname, inside the guest and in the console. Scope: vms.action."},{"name":"reinstall_vm","description":"ERASES THE DISK and redeploys another image. Ask the user first. confirm_hostname must be the machine's exact current hostname. Scope: vms.action."},{"name":"destroy_vm","description":"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.destro"},{"name":"get_action","description":"Follows an asynchronous action (create, reinstall, power…). Poll until status leaves running; on error it carries the reason. Scope: vms.read."},{"name":"list_vm_actions","description":"History of actions on one machine, from the API and the console. Scope: vms.read."},{"name":"get_vm_network","description":"IPv4 and IPv6 addresses of a machine with their reverse DNS, and its private networks. Scope: vms.read."},{"name":"set_reverse_dns","description":"Sets the PTR record of one of the machine's addresses; null restores the default. Scope: network.write."},{"name":"list_vpcs","description":"The account's private networks with their range, gateway and connected machines, plus the quota. Scope: vms.read."},{"name":"get_vpc","description":"One private network and the machines on it, with their private address. Scope: vms.read."},{"name":"create_vpc","description":"Creates an isolated private network; ready when the call returns. The first usable address (.1) is reserved for the gateway. Scope: network.write."},{"name":"delete_vpc","description":"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."},{"name":"connect_vpc","description":"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"},{"name":"disconnect_vpc","description":"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."},{"name":"move_vpc","description":"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."},{"name":"list_firewalls","description":"The account's firewalls with their inbound rules and the machines they protect, plus the quota. Scope: vms.read."},{"name":"get_firewall","description":"One firewall: its rules and the machines it protects, with the status of each (applied, pending, error). Scope: vms.read."},{"name":"create_firewall","description":"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"},{"name":"update_firewall","description":"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). Removin"},{"name":"delete_firewall","description":"Deletes a firewall attached to no machine. Refused while it protects one: detach it first. Scope: network.write."},{"name":"attach_firewall","description":"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, ru"},{"name":"detach_firewall","description":"Removes the firewall's rules from the machine; with no other firewall it accepts all inbound traffic again. Scope: network.write."},{"name":"list_load_balancers","description":"The account's load balancers with their addresses, pools, targets and health, listeners and rules, certificates; plus the quota. Scope: vms.read."},{"name":"get_load_balancer","description":"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, cert"},{"name":"get_load_balancer_metrics","description":"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.rea"},{"name":"create_load_balancer","description":"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)"},{"name":"delete_load_balancer","description":"Deletes the load balancer, its address and its configuration; billing stops. Target machines are not touched. Ask the user first. Scope: vms.destroy."},{"name":"upsert_pool","description":"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"},{"name":"delete_pool","description":"Removes a pool, its targets and the rules leading to it. Scope: network.write."},{"name":"set_targets","description":"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_v"},{"name":"upsert_listener","description":"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 certificat"},{"name":"delete_listener","description":"Closes the port and removes its rules. Scope: network.write."},{"name":"set_rules","description":"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 "},{"name":"list_databases","description":"The account's managed databases with their status, private and public addresses, disk, backups and billing (no passwords), plus the quota. Scope: vms.read."},{"name":"get_database_options","description":"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 i"},{"name":"get_database","description":"One database: status, connection (host, private ip, port, defaultdb and ffxfadmin; on Valkey no database and default), public access and sources, disk usage and"},{"name":"get_database_credentials","description":"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"},{"name":"get_database_metrics","description":"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 s"},{"name":"get_slow_queries","description":"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, "},{"name":"list_database_backups","description":"Completed backups (weekly full, daily differential; the transaction log is archived continuously) and the restore window: any minute in it can be restored with "},{"name":"create_database","description":"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"},{"name":"restore_database","description":"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 l"},{"name":"fork_database","description":"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 sta"},{"name":"detach_database_fork","description":"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."},{"name":"resize_database","description":"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 "},{"name":"delete_database","description":"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 "},{"name":"update_database","description":"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); t"},{"name":"set_database_public_access","description":"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"},{"name":"backup_database","description":"Starts a differential backup within a minute, e.g. before a risky migration. Not available on a linked fork. Scope: backups.write."},{"name":"create_database_user","description":"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 onl"},{"name":"set_database_user_access","description":"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 kee"},{"name":"reset_database_password","description":"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."},{"name":"delete_database_user","description":"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."},{"name":"create_logical_database","description":"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: "},{"name":"delete_logical_database","description":"DROPS the logical database with everything in it (the backups keep it 7 days). Ask the user first. Scope: databases.write."},{"name":"enable_extension","description":"PostgreSQL only. Enables an extension from get_database_options (vector for pgvector, postgis, pg_trgm…) in one logical database; installed on demand, live with"},{"name":"disable_extension","description":"Drops the extension without CASCADE: if objects depend on it, it stays and get_database shows why in warning. Scope: databases.write."},{"name":"get_runners","description":"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 or"},{"name":"list_runner_jobs","description":"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; run"},{"name":"list_ssh_keys","description":"SSH keys saved on the account, to pass to create_vm. Scope: sshkeys.write or vms.read."},{"name":"add_ssh_key","description":"Saves a public key on the account so new machines can be reached without a password. Scope: sshkeys.write."},{"name":"delete_ssh_key","description":"Removes a key from the account. Machines already deployed with it keep it; only future deployments change. Scope: sshkeys.write."}],"toolCount":71,"toolsHash":"8c76b131c6da0a065100d3f8ab6d130c5208f754316381974e524d78b3a2275b","serverName":"ffxf","capabilities":["tools"],"serverVersion":"1.12.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-01T11:27:13.574Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":208,"error":null,"detail":{"tools":[{"name":"list_regions","description":"Where machines can run. Public, no key needed."},{"name":"list_plans","description":"Plans with their resources and prices (hourly and monthly, in CAD). Public, no key needed."},{"name":"list_images","description":"Operating systems and ready-to-use application images. The slug is what create_vm expects. Public, no key needed."},{"name":"get_account","description":"Credit balance, hourly burn rate and runway, quota and budget caps. Scope: billing.read."},{"name":"list_vms","description":"The account's machines with their status, addresses and billing. Scope: vms.read."},{"name":"get_vm","description":"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"},{"name":"get_vm_metrics","description":"CPU, memory, disk and network as measured from outside the machine. Scope: vms.read."},{"name":"estimate_vm","description":"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. Sc"},{"name":"create_vm","description":"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 "},{"name":"power_vm","description":"start, shutdown (clean ACPI), reboot, or stop (hard power-off). Returns an action to poll with get_action. Scope: vms.action."},{"name":"rename_vm","description":"Changes the hostname, inside the guest and in the console. Scope: vms.action."},{"name":"reinstall_vm","description":"ERASES THE DISK and redeploys another image. Ask the user first. confirm_hostname must be the machine's exact current hostname. Scope: vms.action."},{"name":"destroy_vm","description":"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.destro"},{"name":"get_action","description":"Follows an asynchronous action (create, reinstall, power…). Poll until status leaves running; on error it carries the reason. Scope: vms.read."},{"name":"list_vm_actions","description":"History of actions on one machine, from the API and the console. Scope: vms.read."},{"name":"get_vm_network","description":"IPv4 and IPv6 addresses of a machine with their reverse DNS, and its private networks. Scope: vms.read."},{"name":"set_reverse_dns","description":"Sets the PTR record of one of the machine's addresses; null restores the default. Scope: network.write."},{"name":"list_vpcs","description":"The account's private networks with their range, gateway and connected machines, plus the quota. Scope: vms.read."},{"name":"get_vpc","description":"One private network and the machines on it, with their private address. Scope: vms.read."},{"name":"create_vpc","description":"Creates an isolated private network; ready when the call returns. The first usable address (.1) is reserved for the gateway. Scope: network.write."},{"name":"delete_vpc","description":"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."},{"name":"connect_vpc","description":"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"},{"name":"disconnect_vpc","description":"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."},{"name":"move_vpc","description":"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."},{"name":"list_firewalls","description":"The account's firewalls with their inbound rules and the machines they protect, plus the quota. Scope: vms.read."},{"name":"get_firewall","description":"One firewall: its rules and the machines it protects, with the status of each (applied, pending, error). Scope: vms.read."},{"name":"create_firewall","description":"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"},{"name":"update_firewall","description":"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). Removin"},{"name":"delete_firewall","description":"Deletes a firewall attached to no machine. Refused while it protects one: detach it first. Scope: network.write."},{"name":"attach_firewall","description":"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, ru"},{"name":"detach_firewall","description":"Removes the firewall's rules from the machine; with no other firewall it accepts all inbound traffic again. Scope: network.write."},{"name":"list_load_balancers","description":"The account's load balancers with their addresses, pools, targets and health, listeners and rules, certificates; plus the quota. Scope: vms.read."},{"name":"get_load_balancer","description":"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, cert"},{"name":"get_load_balancer_metrics","description":"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.rea"},{"name":"create_load_balancer","description":"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)"},{"name":"delete_load_balancer","description":"Deletes the load balancer, its address and its configuration; billing stops. Target machines are not touched. Ask the user first. Scope: vms.destroy."},{"name":"upsert_pool","description":"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"},{"name":"delete_pool","description":"Removes a pool, its targets and the rules leading to it. Scope: network.write."},{"name":"set_targets","description":"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_v"},{"name":"upsert_listener","description":"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 certificat"},{"name":"delete_listener","description":"Closes the port and removes its rules. Scope: network.write."},{"name":"set_rules","description":"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 "},{"name":"list_databases","description":"The account's managed databases with their status, private and public addresses, disk, backups and billing (no passwords), plus the quota. Scope: vms.read."},{"name":"get_database_options","description":"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 i"},{"name":"get_database","description":"One database: status, connection (host, private ip, port, defaultdb and ffxfadmin; on Valkey no database and default), public access and sources, disk usage and"},{"name":"get_database_credentials","description":"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"},{"name":"get_database_metrics","description":"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 s"},{"name":"get_slow_queries","description":"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, "},{"name":"list_database_backups","description":"Completed backups (weekly full, daily differential; the transaction log is archived continuously) and the restore window: any minute in it can be restored with "},{"name":"create_database","description":"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"},{"name":"restore_database","description":"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 l"},{"name":"fork_database","description":"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 sta"},{"name":"detach_database_fork","description":"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."},{"name":"resize_database","description":"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 "},{"name":"delete_database","description":"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 "},{"name":"update_database","description":"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); t"},{"name":"set_database_public_access","description":"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"},{"name":"backup_database","description":"Starts a differential backup within a minute, e.g. before a risky migration. Not available on a linked fork. Scope: backups.write."},{"name":"create_database_user","description":"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 onl"},{"name":"set_database_user_access","description":"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 kee"},{"name":"reset_database_password","description":"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."},{"name":"delete_database_user","description":"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."},{"name":"create_logical_database","description":"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: "},{"name":"delete_logical_database","description":"DROPS the logical database with everything in it (the backups keep it 7 days). Ask the user first. Scope: databases.write."},{"name":"enable_extension","description":"PostgreSQL only. Enables an extension from get_database_options (vector for pgvector, postgis, pg_trgm…) in one logical database; installed on demand, live with"},{"name":"disable_extension","description":"Drops the extension without CASCADE: if objects depend on it, it stays and get_database shows why in warning. Scope: databases.write."},{"name":"get_runners","description":"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 or"},{"name":"list_runner_jobs","description":"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; run"},{"name":"list_ssh_keys","description":"SSH keys saved on the account, to pass to create_vm. Scope: sshkeys.write or vms.read."},{"name":"add_ssh_key","description":"Saves a public key on the account so new machines can be reached without a password. Scope: sshkeys.write."},{"name":"delete_ssh_key","description":"Removes a key from the account. Machines already deployed with it keep it; only future deployments change. Scope: sshkeys.write."}],"toolCount":71,"toolsHash":"8c76b131c6da0a065100d3f8ab6d130c5208f754316381974e524d78b3a2275b","serverName":"ffxf","capabilities":["tools"],"serverVersion":"1.12.0","protocolVersion":"2025-06-18"}},{"at":"2026-11-01T03:27:21.770Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":206,"error":null,"detail":{"tools":[{"name":"list_regions","description":"Where machines can run. Public, no key needed."},{"name":"list_plans","description":"Plans with their resources and prices (hourly and monthly, in CAD). Public, no key needed."},{"name":"list_images","description":"Operating systems and ready-to-use application images. The slug is what create_vm expects. Public, no key needed."},{"name":"get_account","description":"Credit balance, hourly burn rate and runway, quota and budget caps. Scope: billing.read."},{"name":"list_vms","description":"The account's machines with their status, addresses and billing. Scope: vms.read."},{"name":"get_vm","description":"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"},{"name":"get_vm_metrics","description":"CPU, memory, disk and network as measured from outside the machine. Scope: vms.read."},{"name":"estimate_vm","description":"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. Sc"},{"name":"create_vm","description":"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 "},{"name":"power_vm","description":"start, shutdown (clean ACPI), reboot, or stop (hard power-off). Returns an action to poll with get_action. Scope: vms.action."},{"name":"rename_vm","description":"Changes the hostname, inside the guest and in the console. Scope: vms.action."},{"name":"reinstall_vm","description":"ERASES THE DISK and redeploys another image. Ask the user first. confirm_hostname must be the machine's exact current hostname. Scope: vms.action."},{"name":"destroy_vm","description":"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.destro"},{"name":"get_action","description":"Follows an asynchronous action (create, reinstall, power…). Poll until status leaves running; on error it carries the reason. Scope: vms.read."},{"name":"list_vm_actions","description":"History of actions on one machine, from the API and the console. Scope: vms.read."},{"name":"get_vm_network","description":"IPv4 and IPv6 addresses of a machine with their reverse DNS, and its private networks. Scope: vms.read."},{"name":"set_reverse_dns","description":"Sets the PTR record of one of the machine's addresses; null restores the default. Scope: network.write."},{"name":"list_vpcs","description":"The account's private networks with their range, gateway and connected machines, plus the quota. Scope: vms.read."},{"name":"get_vpc","description":"One private network and the machines on it, with their private address. Scope: vms.read."},{"name":"create_vpc","description":"Creates an isolated private network; ready when the call returns. The first usable address (.1) is reserved for the gateway. Scope: network.write."},{"name":"delete_vpc","description":"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."},{"name":"connect_vpc","description":"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"},{"name":"disconnect_vpc","description":"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."},{"name":"move_vpc","description":"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."},{"name":"list_firewalls","description":"The account's firewalls with their inbound rules and the machines they protect, plus the quota. Scope: vms.read."},{"name":"get_firewall","description":"One firewall: its rules and the machines it protects, with the status of each (applied, pending, error). Scope: vms.read."},{"name":"create_firewall","description":"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"},{"name":"update_firewall","description":"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). Removin"},{"name":"delete_firewall","description":"Deletes a firewall attached to no machine. Refused while it protects one: detach it first. Scope: network.write."},{"name":"attach_firewall","description":"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, ru"},{"name":"detach_firewall","description":"Removes the firewall's rules from the machine; with no other firewall it accepts all inbound traffic again. Scope: network.write."},{"name":"list_load_balancers","description":"The account's load balancers with their addresses, pools, targets and health, listeners and rules, certificates; plus the quota. Scope: vms.read."},{"name":"get_load_balancer","description":"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, cert"},{"name":"get_load_balancer_metrics","description":"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.rea"},{"name":"create_load_balancer","description":"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)"},{"name":"delete_load_balancer","description":"Deletes the load balancer, its address and its configuration; billing stops. Target machines are not touched. Ask the user first. Scope: vms.destroy."},{"name":"upsert_pool","description":"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"},{"name":"delete_pool","description":"Removes a pool, its targets and the rules leading to it. Scope: network.write."},{"name":"set_targets","description":"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_v"},{"name":"upsert_listener","description":"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 certificat"},{"name":"delete_listener","description":"Closes the port and removes its rules. Scope: network.write."},{"name":"set_rules","description":"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 "},{"name":"list_databases","description":"The account's managed databases with their status, private and public addresses, disk, backups and billing (no passwords), plus the quota. Scope: vms.read."},{"name":"get_database_options","description":"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 i"},{"name":"get_database","description":"One database: status, connection (host, private ip, port, defaultdb and ffxfadmin; on Valkey no database and default), public access and sources, disk usage and"},{"name":"get_database_credentials","description":"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"},{"name":"get_database_metrics","description":"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 s"},{"name":"get_slow_queries","description":"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, "},{"name":"list_database_backups","description":"Completed backups (weekly full, daily differential; the transaction log is archived continuously) and the restore window: any minute in it can be restored with "},{"name":"create_database","description":"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"},{"name":"restore_database","description":"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 l"},{"name":"fork_database","description":"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 sta"},{"name":"detach_database_fork","description":"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."},{"name":"resize_database","description":"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 "},{"name":"delete_database","description":"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 "},{"name":"update_database","description":"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); t"},{"name":"set_database_public_access","description":"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"},{"name":"backup_database","description":"Starts a differential backup within a minute, e.g. before a risky migration. Not available on a linked fork. Scope: backups.write."},{"name":"create_database_user","description":"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 onl"},{"name":"set_database_user_access","description":"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 kee"},{"name":"reset_database_password","description":"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."},{"name":"delete_database_user","description":"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."},{"name":"create_logical_database","description":"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: "},{"name":"delete_logical_database","description":"DROPS the logical database with everything in it (the backups keep it 7 days). Ask the user first. Scope: databases.write."},{"name":"enable_extension","description":"PostgreSQL only. Enables an extension from get_database_options (vector for pgvector, postgis, pg_trgm…) in one logical database; installed on demand, live with"},{"name":"disable_extension","description":"Drops the extension without CASCADE: if objects depend on it, it stays and get_database shows why in warning. Scope: databases.write."},{"name":"get_runners","description":"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 or"},{"name":"list_runner_jobs","description":"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; run"},{"name":"list_ssh_keys","description":"SSH keys saved on the account, to pass to create_vm. Scope: sshkeys.write or vms.read."},{"name":"add_ssh_key","description":"Saves a public key on the account so new machines can be reached without a password. Scope: sshkeys.write."},{"name":"delete_ssh_key","description":"Removes a key from the account. Machines already deployed with it keep it; only future deployments change. Scope: sshkeys.write."}],"toolCount":71,"toolsHash":"8c76b131c6da0a065100d3f8ab6d130c5208f754316381974e524d78b3a2275b","serverName":"ffxf","capabilities":["tools"],"serverVersion":"1.12.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-31T19:25:53.198Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":194,"error":null,"detail":{"tools":[{"name":"list_regions","description":"Where machines can run. Public, no key needed."},{"name":"list_plans","description":"Plans with their resources and prices (hourly and monthly, in CAD). Public, no key needed."},{"name":"list_images","description":"Operating systems and ready-to-use application images. The slug is what create_vm expects. Public, no key needed."},{"name":"get_account","description":"Credit balance, hourly burn rate and runway, quota and budget caps. Scope: billing.read."},{"name":"list_vms","description":"The account's machines with their status, addresses and billing. Scope: vms.read."},{"name":"get_vm","description":"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"},{"name":"get_vm_metrics","description":"CPU, memory, disk and network as measured from outside the machine. Scope: vms.read."},{"name":"estimate_vm","description":"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. Sc"},{"name":"create_vm","description":"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 "},{"name":"power_vm","description":"start, shutdown (clean ACPI), reboot, or stop (hard power-off). Returns an action to poll with get_action. Scope: vms.action."},{"name":"rename_vm","description":"Changes the hostname, inside the guest and in the console. Scope: vms.action."},{"name":"reinstall_vm","description":"ERASES THE DISK and redeploys another image. Ask the user first. confirm_hostname must be the machine's exact current hostname. Scope: vms.action."},{"name":"destroy_vm","description":"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.destro"},{"name":"get_action","description":"Follows an asynchronous action (create, reinstall, power…). Poll until status leaves running; on error it carries the reason. Scope: vms.read."},{"name":"list_vm_actions","description":"History of actions on one machine, from the API and the console. Scope: vms.read."},{"name":"get_vm_network","description":"IPv4 and IPv6 addresses of a machine with their reverse DNS, and its private networks. Scope: vms.read."},{"name":"set_reverse_dns","description":"Sets the PTR record of one of the machine's addresses; null restores the default. Scope: network.write."},{"name":"list_vpcs","description":"The account's private networks with their range, gateway and connected machines, plus the quota. Scope: vms.read."},{"name":"get_vpc","description":"One private network and the machines on it, with their private address. Scope: vms.read."},{"name":"create_vpc","description":"Creates an isolated private network; ready when the call returns. The first usable address (.1) is reserved for the gateway. Scope: network.write."},{"name":"delete_vpc","description":"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."},{"name":"connect_vpc","description":"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"},{"name":"disconnect_vpc","description":"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."},{"name":"move_vpc","description":"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."},{"name":"list_firewalls","description":"The account's firewalls with their inbound rules and the machines they protect, plus the quota. Scope: vms.read."},{"name":"get_firewall","description":"One firewall: its rules and the machines it protects, with the status of each (applied, pending, error). Scope: vms.read."},{"name":"create_firewall","description":"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"},{"name":"update_firewall","description":"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). Removin"},{"name":"delete_firewall","description":"Deletes a firewall attached to no machine. Refused while it protects one: detach it first. Scope: network.write."},{"name":"attach_firewall","description":"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, ru"},{"name":"detach_firewall","description":"Removes the firewall's rules from the machine; with no other firewall it accepts all inbound traffic again. Scope: network.write."},{"name":"list_load_balancers","description":"The account's load balancers with their addresses, pools, targets and health, listeners and rules, certificates; plus the quota. Scope: vms.read."},{"name":"get_load_balancer","description":"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, cert"},{"name":"get_load_balancer_metrics","description":"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.rea"},{"name":"create_load_balancer","description":"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)"},{"name":"delete_load_balancer","description":"Deletes the load balancer, its address and its configuration; billing stops. Target machines are not touched. Ask the user first. Scope: vms.destroy."},{"name":"upsert_pool","description":"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"},{"name":"delete_pool","description":"Removes a pool, its targets and the rules leading to it. Scope: network.write."},{"name":"set_targets","description":"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_v"},{"name":"upsert_listener","description":"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 certificat"},{"name":"delete_listener","description":"Closes the port and removes its rules. Scope: network.write."},{"name":"set_rules","description":"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 "},{"name":"list_databases","description":"The account's managed databases with their status, private and public addresses, disk, backups and billing (no passwords), plus the quota. Scope: vms.read."},{"name":"get_database_options","description":"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 i"},{"name":"get_database","description":"One database: status, connection (host, private ip, port, defaultdb and ffxfadmin; on Valkey no database and default), public access and sources, disk usage and"},{"name":"get_database_credentials","description":"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"},{"name":"get_database_metrics","description":"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 s"},{"name":"get_slow_queries","description":"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, "},{"name":"list_database_backups","description":"Completed backups (weekly full, daily differential; the transaction log is archived continuously) and the restore window: any minute in it can be restored with "},{"name":"create_database","description":"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"},{"name":"restore_database","description":"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 l"},{"name":"fork_database","description":"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 sta"},{"name":"detach_database_fork","description":"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."},{"name":"resize_database","description":"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 "},{"name":"delete_database","description":"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 "},{"name":"update_database","description":"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); t"},{"name":"set_database_public_access","description":"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"},{"name":"backup_database","description":"Starts a differential backup within a minute, e.g. before a risky migration. Not available on a linked fork. Scope: backups.write."},{"name":"create_database_user","description":"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 onl"},{"name":"set_database_user_access","description":"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 kee"},{"name":"reset_database_password","description":"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."},{"name":"delete_database_user","description":"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."},{"name":"create_logical_database","description":"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: "},{"name":"delete_logical_database","description":"DROPS the logical database with everything in it (the backups keep it 7 days). Ask the user first. Scope: databases.write."},{"name":"enable_extension","description":"PostgreSQL only. Enables an extension from get_database_options (vector for pgvector, postgis, pg_trgm…) in one logical database; installed on demand, live with"},{"name":"disable_extension","description":"Drops the extension without CASCADE: if objects depend on it, it stays and get_database shows why in warning. Scope: databases.write."},{"name":"get_runners","description":"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 or"},{"name":"list_runner_jobs","description":"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; run"},{"name":"list_ssh_keys","description":"SSH keys saved on the account, to pass to create_vm. Scope: sshkeys.write or vms.read."},{"name":"add_ssh_key","description":"Saves a public key on the account so new machines can be reached without a password. Scope: sshkeys.write."},{"name":"delete_ssh_key","description":"Removes a key from the account. Machines already deployed with it keep it; only future deployments change. Scope: sshkeys.write."}],"toolCount":71,"toolsHash":"8c76b131c6da0a065100d3f8ab6d130c5208f754316381974e524d78b3a2275b","serverName":"ffxf","capabilities":["tools"],"serverVersion":"1.12.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-31T11:27:17.675Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":214,"error":null,"detail":{"tools":[{"name":"list_regions","description":"Where machines can run. Public, no key needed."},{"name":"list_plans","description":"Plans with their resources and prices (hourly and monthly, in CAD). Public, no key needed."},{"name":"list_images","description":"Operating systems and ready-to-use application images. The slug is what create_vm expects. Public, no key needed."},{"name":"get_account","description":"Credit balance, hourly burn rate and runway, quota and budget caps. Scope: billing.read."},{"name":"list_vms","description":"The account's machines with their status, addresses and billing. Scope: vms.read."},{"name":"get_vm","description":"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"},{"name":"get_vm_metrics","description":"CPU, memory, disk and network as measured from outside the machine. Scope: vms.read."},{"name":"estimate_vm","description":"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. Sc"},{"name":"create_vm","description":"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 "},{"name":"power_vm","description":"start, shutdown (clean ACPI), reboot, or stop (hard power-off). Returns an action to poll with get_action. Scope: vms.action."},{"name":"rename_vm","description":"Changes the hostname, inside the guest and in the console. Scope: vms.action."},{"name":"reinstall_vm","description":"ERASES THE DISK and redeploys another image. Ask the user first. confirm_hostname must be the machine's exact current hostname. Scope: vms.action."},{"name":"destroy_vm","description":"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.destro"},{"name":"get_action","description":"Follows an asynchronous action (create, reinstall, power…). Poll until status leaves running; on error it carries the reason. Scope: vms.read."},{"name":"list_vm_actions","description":"History of actions on one machine, from the API and the console. Scope: vms.read."},{"name":"get_vm_network","description":"IPv4 and IPv6 addresses of a machine with their reverse DNS, and its private networks. Scope: vms.read."},{"name":"set_reverse_dns","description":"Sets the PTR record of one of the machine's addresses; null restores the default. Scope: network.write."},{"name":"list_vpcs","description":"The account's private networks with their range, gateway and connected machines, plus the quota. Scope: vms.read."},{"name":"get_vpc","description":"One private network and the machines on it, with their private address. Scope: vms.read."},{"name":"create_vpc","description":"Creates an isolated private network; ready when the call returns. The first usable address (.1) is reserved for the gateway. Scope: network.write."},{"name":"delete_vpc","description":"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."},{"name":"connect_vpc","description":"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"},{"name":"disconnect_vpc","description":"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."},{"name":"move_vpc","description":"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."},{"name":"list_firewalls","description":"The account's firewalls with their inbound rules and the machines they protect, plus the quota. Scope: vms.read."},{"name":"get_firewall","description":"One firewall: its rules and the machines it protects, with the status of each (applied, pending, error). Scope: vms.read."},{"name":"create_firewall","description":"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"},{"name":"update_firewall","description":"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). Removin"},{"name":"delete_firewall","description":"Deletes a firewall attached to no machine. Refused while it protects one: detach it first. Scope: network.write."},{"name":"attach_firewall","description":"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, ru"},{"name":"detach_firewall","description":"Removes the firewall's rules from the machine; with no other firewall it accepts all inbound traffic again. Scope: network.write."},{"name":"list_load_balancers","description":"The account's load balancers with their addresses, pools, targets and health, listeners and rules, certificates; plus the quota. Scope: vms.read."},{"name":"get_load_balancer","description":"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, cert"},{"name":"get_load_balancer_metrics","description":"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.rea"},{"name":"create_load_balancer","description":"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)"},{"name":"delete_load_balancer","description":"Deletes the load balancer, its address and its configuration; billing stops. Target machines are not touched. Ask the user first. Scope: vms.destroy."},{"name":"upsert_pool","description":"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"},{"name":"delete_pool","description":"Removes a pool, its targets and the rules leading to it. Scope: network.write."},{"name":"set_targets","description":"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_v"},{"name":"upsert_listener","description":"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 certificat"},{"name":"delete_listener","description":"Closes the port and removes its rules. Scope: network.write."},{"name":"set_rules","description":"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 "},{"name":"list_databases","description":"The account's managed databases with their status, private and public addresses, disk, backups and billing (no passwords), plus the quota. Scope: vms.read."},{"name":"get_database_options","description":"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 i"},{"name":"get_database","description":"One database: status, connection (host, private ip, port, defaultdb and ffxfadmin; on Valkey no database and default), public access and sources, disk usage and"},{"name":"get_database_credentials","description":"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"},{"name":"get_database_metrics","description":"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 s"},{"name":"get_slow_queries","description":"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, "},{"name":"list_database_backups","description":"Completed backups (weekly full, daily differential; the transaction log is archived continuously) and the restore window: any minute in it can be restored with "},{"name":"create_database","description":"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"},{"name":"restore_database","description":"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 l"},{"name":"fork_database","description":"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 sta"},{"name":"detach_database_fork","description":"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."},{"name":"resize_database","description":"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 "},{"name":"delete_database","description":"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 "},{"name":"update_database","description":"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); t"},{"name":"set_database_public_access","description":"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"},{"name":"backup_database","description":"Starts a differential backup within a minute, e.g. before a risky migration. Not available on a linked fork. Scope: backups.write."},{"name":"create_database_user","description":"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 onl"},{"name":"set_database_user_access","description":"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 kee"},{"name":"reset_database_password","description":"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."},{"name":"delete_database_user","description":"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."},{"name":"create_logical_database","description":"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: "},{"name":"delete_logical_database","description":"DROPS the logical database with everything in it (the backups keep it 7 days). Ask the user first. Scope: databases.write."},{"name":"enable_extension","description":"PostgreSQL only. Enables an extension from get_database_options (vector for pgvector, postgis, pg_trgm…) in one logical database; installed on demand, live with"},{"name":"disable_extension","description":"Drops the extension without CASCADE: if objects depend on it, it stays and get_database shows why in warning. Scope: databases.write."},{"name":"get_runners","description":"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 or"},{"name":"list_runner_jobs","description":"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; run"},{"name":"list_ssh_keys","description":"SSH keys saved on the account, to pass to create_vm. Scope: sshkeys.write or vms.read."},{"name":"add_ssh_key","description":"Saves a public key on the account so new machines can be reached without a password. Scope: sshkeys.write."},{"name":"delete_ssh_key","description":"Removes a key from the account. Machines already deployed with it keep it; only future deployments change. Scope: sshkeys.write."}],"toolCount":71,"toolsHash":"8c76b131c6da0a065100d3f8ab6d130c5208f754316381974e524d78b3a2275b","serverName":"ffxf","capabilities":["tools"],"serverVersion":"1.12.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"list_regions","description":"Where machines can run. Public, no key needed."},{"name":"list_plans","description":"Plans with their resources and prices (hourly and monthly, in CAD). Public, no key needed."},{"name":"list_images","description":"Operating systems and ready-to-use application images. The slug is what create_vm expects. Public, no key needed."},{"name":"get_account","description":"Credit balance, hourly burn rate and runway, quota and budget caps. Scope: billing.read."},{"name":"list_vms","description":"The account's machines with their status, addresses and billing. Scope: vms.read."},{"name":"get_vm","description":"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"},{"name":"get_vm_metrics","description":"CPU, memory, disk and network as measured from outside the machine. Scope: vms.read."},{"name":"estimate_vm","description":"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. Sc"},{"name":"create_vm","description":"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 "},{"name":"power_vm","description":"start, shutdown (clean ACPI), reboot, or stop (hard power-off). Returns an action to poll with get_action. Scope: vms.action."},{"name":"rename_vm","description":"Changes the hostname, inside the guest and in the console. Scope: vms.action."},{"name":"reinstall_vm","description":"ERASES THE DISK and redeploys another image. Ask the user first. confirm_hostname must be the machine's exact current hostname. Scope: vms.action."},{"name":"destroy_vm","description":"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.destro"},{"name":"get_action","description":"Follows an asynchronous action (create, reinstall, power…). Poll until status leaves running; on error it carries the reason. Scope: vms.read."},{"name":"list_vm_actions","description":"History of actions on one machine, from the API and the console. Scope: vms.read."},{"name":"get_vm_network","description":"IPv4 and IPv6 addresses of a machine with their reverse DNS, and its private networks. Scope: vms.read."},{"name":"set_reverse_dns","description":"Sets the PTR record of one of the machine's addresses; null restores the default. Scope: network.write."},{"name":"list_vpcs","description":"The account's private networks with their range, gateway and connected machines, plus the quota. Scope: vms.read."},{"name":"get_vpc","description":"One private network and the machines on it, with their private address. Scope: vms.read."},{"name":"create_vpc","description":"Creates an isolated private network; ready when the call returns. The first usable address (.1) is reserved for the gateway. Scope: network.write."},{"name":"delete_vpc","description":"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."},{"name":"connect_vpc","description":"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"},{"name":"disconnect_vpc","description":"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."},{"name":"move_vpc","description":"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."},{"name":"list_firewalls","description":"The account's firewalls with their inbound rules and the machines they protect, plus the quota. Scope: vms.read."},{"name":"get_firewall","description":"One firewall: its rules and the machines it protects, with the status of each (applied, pending, error). Scope: vms.read."},{"name":"create_firewall","description":"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"},{"name":"update_firewall","description":"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). Removin"},{"name":"delete_firewall","description":"Deletes a firewall attached to no machine. Refused while it protects one: detach it first. Scope: network.write."},{"name":"attach_firewall","description":"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, ru"},{"name":"detach_firewall","description":"Removes the firewall's rules from the machine; with no other firewall it accepts all inbound traffic again. Scope: network.write."},{"name":"list_load_balancers","description":"The account's load balancers with their addresses, pools, targets and health, listeners and rules, certificates; plus the quota. Scope: vms.read."},{"name":"get_load_balancer","description":"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, cert"},{"name":"get_load_balancer_metrics","description":"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.rea"},{"name":"create_load_balancer","description":"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)"},{"name":"delete_load_balancer","description":"Deletes the load balancer, its address and its configuration; billing stops. Target machines are not touched. Ask the user first. Scope: vms.destroy."},{"name":"upsert_pool","description":"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"},{"name":"delete_pool","description":"Removes a pool, its targets and the rules leading to it. Scope: network.write."},{"name":"set_targets","description":"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_v"},{"name":"upsert_listener","description":"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 certificat"},{"name":"delete_listener","description":"Closes the port and removes its rules. Scope: network.write."},{"name":"set_rules","description":"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 "},{"name":"list_databases","description":"The account's managed databases with their status, private and public addresses, disk, backups and billing (no passwords), plus the quota. Scope: vms.read."},{"name":"get_database_options","description":"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 i"},{"name":"get_database","description":"One database: status, connection (host, private ip, port, defaultdb and ffxfadmin; on Valkey no database and default), public access and sources, disk usage and"},{"name":"get_database_credentials","description":"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"},{"name":"get_database_metrics","description":"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 s"},{"name":"get_slow_queries","description":"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, "},{"name":"list_database_backups","description":"Completed backups (weekly full, daily differential; the transaction log is archived continuously) and the restore window: any minute in it can be restored with "},{"name":"create_database","description":"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"},{"name":"restore_database","description":"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 l"},{"name":"fork_database","description":"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 sta"},{"name":"detach_database_fork","description":"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."},{"name":"resize_database","description":"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 "},{"name":"delete_database","description":"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 "},{"name":"update_database","description":"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); t"},{"name":"set_database_public_access","description":"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"},{"name":"backup_database","description":"Starts a differential backup within a minute, e.g. before a risky migration. Not available on a linked fork. Scope: backups.write."},{"name":"create_database_user","description":"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 onl"},{"name":"set_database_user_access","description":"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 kee"},{"name":"reset_database_password","description":"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."},{"name":"delete_database_user","description":"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."},{"name":"create_logical_database","description":"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: "},{"name":"delete_logical_database","description":"DROPS the logical database with everything in it (the backups keep it 7 days). Ask the user first. Scope: databases.write."},{"name":"enable_extension","description":"PostgreSQL only. Enables an extension from get_database_options (vector for pgvector, postgis, pg_trgm…) in one logical database; installed on demand, live with"},{"name":"disable_extension","description":"Drops the extension without CASCADE: if objects depend on it, it stays and get_database shows why in warning. Scope: databases.write."},{"name":"get_runners","description":"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 or"},{"name":"list_runner_jobs","description":"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; run"},{"name":"list_ssh_keys","description":"SSH keys saved on the account, to pass to create_vm. Scope: sshkeys.write or vms.read."},{"name":"add_ssh_key","description":"Saves a public key on the account so new machines can be reached without a password. Scope: sshkeys.write."},{"name":"delete_ssh_key","description":"Removes a key from the account. Machines already deployed with it keep it; only future deployments change. Scope: sshkeys.write."}],"package":null,"toolSurface":{"id":"ts_sg6htyb9km9c","endpointId":"ep_9rgzprz9bydn","hash":"8c76b131c6da0a065100d3f8ab6d130c5208f754316381974e524d78b3a2275b","toolCount":71,"serverName":"ffxf","serverVersion":"1.12.0","protocolVersion":"2025-06-18","firstSeenAt":"2026-10-31T11:27:17.690Z","lastSeenAt":"2026-11-01T19:24:30.535Z","observations":5,"toolNames":["list_regions","list_plans","list_images","get_account","list_vms","get_vm","get_vm_metrics","estimate_vm","create_vm","power_vm","rename_vm","reinstall_vm","destroy_vm","get_action","list_vm_actions","get_vm_network","set_reverse_dns","list_vpcs","get_vpc","create_vpc","delete_vpc","connect_vpc","disconnect_vpc","move_vpc","list_firewalls","get_firewall","create_firewall","update_firewall","delete_firewall","attach_firewall","detach_firewall","list_load_balancers","get_load_balancer","get_load_balancer_metrics","create_load_balancer","delete_load_balancer","upsert_pool","delete_pool","set_targets","upsert_listener","delete_listener","set_rules","list_databases","get_database_options","get_database","get_database_credentials","get_database_metrics","get_slow_queries","list_database_backups","create_database","restore_database","fork_database","detach_database_fork","resize_database","delete_database","update_database","set_database_public_access","backup_database","create_database_user","set_database_user_access","reset_database_password","delete_database_user","create_logical_database","delete_logical_database","enable_extension","disable_extension","get_runners","list_runner_jobs","list_ssh_keys","add_ssh_key","delete_ssh_key"],"distinctSurfaces":1},"endpointFacts":[]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"net.ffxf/cloud","url":"https://registry.modelcontextprotocol.io/v0/servers/net.ffxf%2Fcloud","firstSeenAt":"2026-10-31T09:22:03.148Z","fetchedAt":"2026-10-31T09:22:03.148Z","normalizedAt":"2026-10-31T09:22:03.148Z"}]},"firstSeenAt":"2026-10-31T09:22:03.148Z","updatedAt":"2026-11-01T19:28:11.068Z"}