Skip to main content
Glama

Laravel Forge MCP

An MCP server exposing the full Laravel Forge API v2 (273 operations) to Claude Code and other MCP clients.

Why not 273 tools

One tool per operation would burn roughly 43,000 tokens of context before you say anything. This server uses two layers instead:

Layer

Contents

Purpose

Curated (26 tools)

deploys, logs, .env, service restarts

one call per common task

Universal (2 tools)

forge_search_operations + forge_call

reaches all 273 operations

Total: ~5,500 tokens, with no loss of API coverage.

Related MCP server: Forge MCP Server

Install

claude mcp add forge --env FORGE_API_TOKEN=your_token -- npx -y @wdevcom/laravel-forge-mcp

Generate a token at https://forge.laravel.com/profile/api.

Variable

Meaning

FORGE_API_TOKEN

required

FORGE_ORG

optional default organization slug; without it the server uses your only organization or asks

The token is read only from the environment. Passing it as an argument is rejected, because process arguments are visible in ps.

Safety modes

Forge has no trash can - a deleted server does not come back. Operations are classified into three levels:

laravel-forge-mcp                      # read + write (default), no destructive operations
laravel-forge-mcp --allow-destructive  # everything, including DELETE and reboot
laravel-forge-mcp --read-only          # read only, 19 tools

Level

Rule

Operations

read

GET

133

write

POST, PUT, PATCH

93

destructive

DELETE plus action: reboot / action: stop

47

Classification depends on the request body, not just the HTTP method - restarting a service passes, stopping the same service is blocked. Tools also carry MCP annotations (readOnlyHint, destructiveHint) so the client can ask for confirmation.

Tools

site and server arguments accept a domain, name, or ID - you never need numeric IDs.

  • Context: forge_whoami, forge_list_servers, forge_list_sites, forge_resolve

  • Server: forge_get_server, forge_server_events, forge_restart_service, forge_server_action, forge_get_server_log

  • Deploy: forge_get_site, forge_deploy_site, forge_list_deployments, forge_get_deployment_log, forge_deployment_status, forge_get_deployment_script, forge_update_deployment_script

  • Config: forge_get_env, forge_update_env, forge_get_nginx_config, forge_update_nginx_config

  • Diagnostics: forge_get_site_logs, forge_run_command

  • Processes: forge_list_background_processes, forge_background_process_action, forge_list_scheduled_jobs, forge_list_databases

Everything else - certificates, firewall, VPC, roles, recipes, backups - goes through the universal layer:

forge_search_operations("certificate")   → matching operations with parameter schemas
forge_call("organizations.servers.sites.domains.certificates.store", { ... })

A missing {organization} parameter is filled in automatically.

How it works

OpenAPI is the source of truth. The spec/forge.openapi.json snapshot ships with the package and loads locally, so the server starts without network calls. New Forge endpoints become reachable through the universal layer as soon as the file is refreshed (npm run sync:spec).

The resolver caches domain → {organization, server, site} mappings for five minutes; Forge allows only 60 requests per minute. On ambiguity (same domain on two servers) it returns candidates instead of guessing. The formatter flattens JSON:API, dropping the links and relationships that dominate raw responses. Pagination follows at most 5 pages and marks the result as truncated.

Development

npm install
npm test           # 130 tests
npm run typecheck
npm run dev        # run without building

A contract test asserts that every operationId used in the code exists in the spec, catching Forge-side changes before they blow up mid-conversation.

Notes

  • Transport is stdio; HTTP and SSE are not supported.

  • API v2 has no site-level workers, despite the PHP SDK exposing them ($forge->workers(...)). Use forge_list_background_processes at server level.

  • forge_get_env returns secrets in plain text.

License

Apache-2.0. Forge API reference.

Available Tools

28 tools
forge_background_process_actionAkcja na procesie w tleA

Restartuje, uruchamia albo zatrzymuje proces w tle na serwerze - tak restartuje sie workery kolejek. Zatrzymanie jest operacja destrukcyjna i wymaga flagi --allow-destructive.

Inputs: server (required), process (required), org, action.

forge_callWywolaj dowolna operacje Forge APIB

Wykonuje dowolna z 273 operacji Laravel Forge API po jej operationId. Operacje znajdziesz narzedziem forge_search_operations. Brakujacy parametr {organization} jest uzupelniany z konfiguracji serwera.

Inputs: operationId (required), raw, body, path, +1 more.

forge_deployment_statusStatus wdrozeniaA
Read-onlyIdempotent

Pokazuje biezacy status wdrozenia site - czy trwa, czy sie zakonczylo i kiedy sie zaczelo.

Inputs: site (required), org.

forge_deploy_siteUruchom wdrozenieA

Uruchamia wdrozenie site. Domyslnie zwraca potwierdzenie startu bez czekania na koniec - ustaw wait na true, zeby odpytywac status az do zakonczenia (maksymalnie 2 minuty). Postep sprawdzisz tez narzedziem forge_deployment_status.

Inputs: site (required), org, wait.

forge_get_deployment_logLog wdrozeniaA
Read-onlyIdempotent

Pobiera pelne wyjscie wdrozenia. Bez argumentu deployment bierze ostatnie wdrozenie - to najczestszy przypadek przy diagnozowaniu nieudanego deploya.

Inputs: site (required), org, lines, deployment.

forge_get_deployment_scriptSkrypt wdrozeniowyB
Read-onlyIdempotent

Pobiera tresc skryptu wdrozeniowego site - komendy uruchamiane przy kazdym deployu.

Inputs: site (required), org.

forge_get_envPlik .env siteA
Read-onlyIdempotent

Pobiera zawartosc pliku .env site. Uwaga: zwraca sekrety w czystej postaci, wiec nie wklejaj wyniku do publicznych miejsc.

Inputs: site (required), org.

forge_get_nginx_configKonfiguracja Nginx siteA
Read-onlyIdempotent

Pobiera konfiguracje Nginx dla site - przydatne przy diagnozowaniu przekierowan i naglowkow.

Inputs: site (required), org.

forge_get_serverSzczegoly serweraA
Read-onlyIdempotent

Pokazuje pelne dane serwera: adresy IP, dostawce, region, wersje PHP, typ bazy i status uslug. Argument server przyjmuje nazwe serwera albo jego identyfikator.

Inputs: server (required), org.

forge_get_server_logLog serweraA
Read-onlyIdempotent

Pobiera zawartosc logu systemowego serwera po jego kluczu, np. "nginx-error". Logi konkretnego site pobierzesz narzedziem forge_get_site_logs.

Inputs: key (required), server (required), org, lines.

forge_get_siteSzczegoly siteA
Read-onlyIdempotent

Pokazuje pelne dane site: status, wersje PHP, repozytorium, katalogi, HTTPS i status ostatniego wdrozenia. Argument site przyjmuje domene albo identyfikator.

Inputs: site (required), org.

forge_get_site_logsLogi siteA
Read-onlyIdempotent

Pobiera logi site: application (log aplikacji Laravel), nginx-error (bledy serwera WWW) albo nginx-access (ruch). Zwraca ostatnie linie, bo logi czyta sie od konca.

Inputs: site (required), org, type, lines.

forge_list_background_processesProcesy w tle serweraA
Read-onlyIdempotent

Wypisuje procesy w tle uruchomione na serwerze - to sa workery kolejek i inne dlugotrwale komendy (w starym Forge nazywane demonami). Podaj argument process, zeby zobaczyc jego log. Uwaga: w API v2 procesy w tle naleza do serwera, nie do pojedynczego site.

Inputs: server (required), org, lines, process.

forge_list_databasesBazy danych serweraA
Read-onlyIdempotent

Wypisuje bazy danych i uzytkownikow bazy na serwerze.

Inputs: server (required), org.

forge_list_deploymentsHistoria wdrozenB
Read-onlyIdempotent

Wypisuje ostatnie wdrozenia site wraz ze statusem i czasami rozpoczecia oraz zakonczenia.

Inputs: site (required), org.

forge_list_scheduled_jobsZadania cykliczneA
Read-onlyIdempotent

Wypisuje zadania cykliczne (cron) serwera albo konkretnego site. Podaj argument job razem z site, zeby zobaczyc wyjscie ostatniego uruchomienia.

Inputs: server (required), job, org, site.

forge_list_serversLista serwerowA
Read-onlyIdempotent

Wypisuje serwery w organizacji: identyfikator, nazwe, adres IP, wersje PHP i gotowosc. Uzyj argumentu search, zeby zawezic liste po nazwie.

Inputs: org, search.

forge_list_sitesLista siteA
Read-onlyIdempotent

Wypisuje site w organizacji albo na wskazanym serwerze: identyfikator, domene, status i status ostatniego wdrozenia. Argument server przyjmuje nazwe serwera albo jego identyfikator.

Inputs: org, search, server.

forge_resolveZnajdz identyfikatory zasobuA
Read-onlyIdempotent

Zamienia domene albo nazwe na komplet identyfikatorow {organization, server, site}. Przydatne, gdy chcesz uzyc forge_call, ktore wymaga surowych identyfikatorow.

Inputs: query (required), org.

forge_restart_serviceAkcja na usludze serweraA

Restartuje, uruchamia albo zatrzymuje usluge na serwerze: nginx, php, mysql, postgres, redis lub supervisor. Zatrzymanie uslugi jest operacja destrukcyjna i wymaga flagi --allow-destructive.

Inputs: server (required), service (required), org, action.

forge_run_commandUruchom komende w katalogu siteA

Uruchamia komende powloki w katalogu site, np. "php artisan migrate --force" albo "php artisan cache:clear". Domyslnie czeka na zakonczenie i zwraca wyjscie (maksymalnie minute). Komenda wykonuje sie na produkcyjnym serwerze - sprawdz ja przed uruchomieniem.

Inputs: site (required), command (required), org, wait.

forge_search_operationsWyszukaj operacje Forge APIA
Read-onlyIdempotent

Przeszukuje wszystkie 273 operacje Laravel Forge API i zwraca dopasowania wraz ze schematem parametrow. Uzyj tego, gdy potrzebna operacja nie ma wlasnego narzedzia forge_*, a potem wywolaj ja przez forge_call. Przyklady zapytan: "certificate", "firewall", "recipe", "backup".

Inputs: query (required), tag, limit.

forge_server_actionAkcja na serwerzeB

Wykonuje akcje na samym serwerze, na przyklad reboot. Reboot jest operacja destrukcyjna i wymaga flagi --allow-destructive.

Inputs: action (required), server (required), org.

forge_server_eventsZdarzenia serweraA
Read-onlyIdempotent

Pokazuje ostatnie zdarzenia serwera - to odpowiedz na pytanie "co sie teraz dzieje z serwerem". Podaj argument event, zeby zobaczyc pelne wyjscie konkretnego zdarzenia.

Inputs: server (required), org, event.

forge_update_deployment_scriptZapisz skrypt wdrozeniowyA

Nadpisuje caly skrypt wdrozeniowy site. Najpierw pobierz obecna tresc narzedziem forge_get_deployment_script, zeby nie skasowac istniejacych komend.

Inputs: site (required), content (required), org.

forge_update_envZapisz plik .env siteA

Nadpisuje caly plik .env site. To operacja nadpisujaca, nie scalajaca - najpierw pobierz obecna tresc narzedziem forge_get_env i zmodyfikuj ja, inaczej skasujesz wszystkie pozostale zmienne.

Inputs: site (required), content (required), org.

forge_update_nginx_configZapisz konfiguracje Nginx siteA

Nadpisuje cala konfiguracje Nginx site. Bledna konfiguracja moze wylaczyc strone - najpierw pobierz obecna tresc narzedziem forge_get_nginx_config.

Inputs: site (required), content (required), org.

forge_whoamiKonto i organizacjeA
Read-onlyIdempotent

Pokazuje zalogowanego uzytkownika Forge oraz liste jego organizacji wraz z ich slugami. Zacznij od tego narzedzia, gdy nie wiesz, do ktorej organizacji nalezy zasob.

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.8/5.0

    Scored across 28 tools

    Disambiguation5/5

    Each tool targets a distinct resource/action: list/get/update/deploy/status are separated, and logs are explicitly scoped to server, site, or deployment. The generic forge_search_operations/forge_call pair is clearly framed as a fallback for operations without a dedicated tool, so it does not create ambiguity.

    Naming Consistency4/5

    The forge_ prefix and snake_case are consistent, and most names follow verb_noun patterns like forge_list_servers, forge_get_site, and forge_update_env. A few names deviate with noun-phrase or verb-only forms such as forge_deployment_status, forge_server_events, forge_background_process_action, forge_resolve, and forge_call, so the pattern is mostly but not perfectly uniform.

    Tool Count3/5

    28 tools is on the heavy side and above the ideal discoverability range for an MCP server. However, the Laravel Forge domain is broad and the tools are grouped by server, site, deployment, background process, and database concerns, so the set is not redundant; the generic forge_call/search pair also keeps the count from needing to grow further.

    Completeness5/5

    The dedicated tools cover core server, site, deployment, env, nginx, background process, scheduled job, and database workflows. Because forge_search_operations and forge_call expose all 273 Forge API operations, any missing capability such as certificates, firewall rules, recipes, or backups remains reachable without a dead end.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers