laravel-forge-readonly-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FORGE_BASE_URL | No | Base URL for Forge API. Default: https://forge.laravel.com/api | |
| FORGE_API_TOKEN | Yes | Your Laravel Forge API token. Required. | |
| FORGE_ORGANIZATION | No | Your Forge organization slug. Optional but recommended. | |
| FORGE_REQUESTS_PER_MINUTE | No | Rate limit for API requests. Default: 60 | |
| FORGE_UNSAFE_ALLOW_SECRETS | No | Allow reading secret endpoints. Default: false |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_organizationsA | List the Forge organisations this API token can reach, with their slugs. Every other tool takes an organisation slug (or uses the configured default). Start here if you do not know the slug. |
| list_serversA | List the servers in an organisation — provider, region, size, PHP version, IP addresses and provisioning status. Supports filter/sort/include (try include="tags"). Use this to find a server id for the other tools. |
| get_serverA | Get one server in full: provider and region, sizes, PHP and database versions, IP addresses, tags and provisioning state. |
| list_server_eventsA | A server's recent Forge activity — provisioning steps, service restarts, configuration changes, who triggered them and whether they succeeded. The closest thing Forge has to an audit trail, and the first place to look when something changed unexpectedly. |
| get_server_phpA | The PHP versions installed on a server, which is the default, and their patch levels. Useful for spotting servers left on an end-of-life version. |
| list_sitesA | List every site in an organisation across all servers, with its domain, project type, PHP version, repository, deployment and maintenance-mode state. Prefer this over listing sites server by server. Note that the hosting server is NOT included by default — pass include="server" to answer "which server hosts acme.com?" in one call. To find one site, filter by name (filter: {"name": "acme.com"}) rather than paging through them all. Sites on a revoked (archived) server are still listed as installed; with include="server" they are marked server_revoked: true, so a stale namesake is not taken for the live site. |
| get_siteA | Get one site in full: domain and aliases, web directory, PHP version, repository and branch, quick-deploy state and which server it lives on. Note that Forge addresses a single site at organisation level, so no server id is needed. |
| list_domainsA | The domains attached to a site, including aliases and their certificate state. Pair with list_certificates to audit SSL expiry. |
| list_certificatesA | A site's SSL certificates with their type, status and expiry — the read to use for certificate-expiry checks. Requires the site:meta scope. |
| list_deploymentsA | A site's deployment history — commit, author, status, duration and timestamps. Use it to find when a site last shipped, or to identify a failed deployment to inspect with get_deployment. Newest first unless you pass sort (Forge's own default is oldest first). |
| get_deploymentA | One deployment in detail: commit, author, status, timings and any failure information. Note that the deployment OUTPUT log needs the site:manage-deploys scope, which also grants the ability to deploy — so a read-only token will get a 403 for the log while this summary still works. |
| get_deployment_scriptA | The site's deployment script — the commands Forge runs on each deploy. Read-only: this cannot change the script. |
| get_site_logsA | Tail a site's logs: the Laravel/application log, or the Nginx access or error log. The first place to look when a site is throwing errors. Returns the END of the log by default (that is where failures are) — raise tail_lines for more. Requires the server:manage-logs scope, whose only write power is clearing logs. Note that Forge reads logs from the server over SSH at request time, so a server whose Forge access has been revoked returns an SSH error instead of a log. |
| get_deployment_logA | The output of a deployment — the deploy script's stdout/stderr, which is what actually tells you why a deploy failed. Get the deployment id from list_deployments. Requires the site:manage-deploys scope; be aware that scope ALSO grants the ability to deploy, so a strictly read-only token will get a 403 here while list_deployments and get_deployment still work. |
| get_command_outputA | The output of a command previously run from a site's Commands panel. Get the command id from list_site_commands. NOTE: this replays whatever a human chose to run, so it is the tool most likely to contain deliberately-dumped secrets — credential-shaped text is scrubbed on a best-effort basis, but do not treat the result as sanitised. |
| get_scheduled_job_outputA | The output of the most recent run of a scheduled (cron) job — server-level, or site-level if you pass |
| get_server_event_outputA | The output of a Forge server event — a provisioning step, service restart or configuration change. Get the event id from list_server_events. Useful for finding out why a Forge-side operation failed. |
| get_background_process_logA | The log of a daemon or queue worker — what a stuck or crashing queue is actually printing. Get the id from list_background_processes. Requires the server:create-daemons scope; that scope ALSO grants creating daemons and enabling Horizon/Octane/Pulse, so a strictly read-only token will get a 403 here while list_background_processes still works. |
| list_scheduled_jobsA | Cron/scheduled jobs, either for a whole server or for one site. Shows the command, user, frequency and last run state — use it to confirm a schedule exists and is firing. |
| list_background_processesA | Daemons and queue workers on a server — command, user, process count and status. Use it to check queue workers are running and correctly sized. |
| get_site_integrationA | Whether a first-party Laravel integration is enabled for a site: Horizon, Octane, Reverb, Pulse, Inertia, the scheduler, or maintenance mode. "laravel-maintenance" answers "is this site in maintenance mode?". |
| list_site_commandsA | The history of commands run from a site's Commands panel, with who ran them and when. An audit read — this cannot run a command. |
| list_databasesA | Database schemas on a server, or the database users and the schemas they can access. Names and grants only — this never reads database contents. |
| list_backup_configsA | Database backup configurations on a server — schedule, retention, destination and which databases are covered. Answers "is this server actually being backed up?". Listing individual backup INSTANCES needs the server:create-backups scope, which also grants restore, so it is not exposed here. |
| forge_getA | Perform an arbitrary GET against the Forge API for endpoints the named tools do not cover — monitors, firewall rules, Nginx templates, recipes, teams, PHP config, heartbeats, providers and so on. Pass a path relative to the API base with real ids substituted, e.g. "/orgs/acme/servers/12345/monitors". Only documented Forge GET endpoints are permitted: writes are impossible, and a small set of reads that would expose secrets (.env contents, registry and provider credentials, SSH and deploy keys) or hand over a deploy capability (the deployment trigger URL) are refused with an explanation. Query parameters go in |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 25 tools
Each named tool targets a distinct Forge resource or action, and the descriptions do a good job clarifying scope and required identifiers. However, the cluster of output/log readers (get_deployment_log, get_command_output, get_scheduled_job_output, get_server_event_output, get_background_process_log) and the forge_get catch-all can be mistaken for one another without reading the full descriptions.
Nearly all tools follow a predictable snake_case verb_noun pattern (list_servers, get_site, list_deployments). The main deviations are forge_get's prefix order and a slight suffix inconsistency between *_output and *_log, but overall naming is readable and consistent.
25 tools is borderline heavy for a read-only surface. The breadth of Laravel Forge justifies many tools, but several resource-specific readers (sites, deployments, logs, outputs) could be consolidated, especially since forge_get already covers uncovered endpoints.
The surface provides strong read-only coverage for servers, sites, deployments, databases, backups, scheduled jobs, logs, certificates and integrations. Minor gaps for first-class tools covering monitors, firewall rules, Nginx templates, teams and similar areas are workable via forge_get, and a few log tools may return 403 with a strictly read-only token.