{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-06T03:14:48.785Z","url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp","markdownUrl":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp.md","server":{"slug":"env-kit-envkit","name":"EnvKit","registryName":"io.github.Env-Kit/envkit","description":"Control the EnvKit local dev stack (PHP, nginx, MySQL, sites). Requires the EnvKit desktop app.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"envkit-mcp","type":"mcpb","identifier":"https://github.com/Env-Kit/envkit-releases/releases/download/v0.33.0-beta.44/envkit-mcp-0.33.0-beta.44.mcpb","withdrawn":false,"url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp","version":"0.33.0-beta.44","transport":"stdio","scoredAt":"2026-11-06T02:11:42.334Z"},"score":{"total":43,"tier":"low","status":"scored","weekDelta":4,"history":[{"date":"2026-11-06","total":43},{"date":"2026-11-05","total":42},{"date":"2026-11-04","total":42},{"date":"2026-11-03","total":41},{"date":"2026-11-02","total":41},{"date":"2026-11-01","total":40},{"date":"2026-10-31","total":40},{"date":"2026-10-30","total":39},{"date":"2026-10-29","total":39},{"date":"2026-10-28","total":39},{"date":"2026-10-27","total":38},{"date":"2026-10-26","total":38},{"date":"2026-10-25","total":37},{"date":"2026-10-24","total":37},{"date":"2026-10-23","total":36},{"date":"2026-10-22","total":36},{"date":"2026-10-21","total":33},{"date":"2026-10-20","total":33},{"date":"2026-10-19","total":33},{"date":"2026-10-18","total":33},{"date":"2026-10-17","total":33}]},"categories":[{"name":"Supply Chain Security","score":0,"verdict":"unverified","reasons":["No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.","Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).","Install-script risk not yet assessed.","Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none)."],"codes":[{"code":"supplychain.malware_inconclusive","args":{"reason":"ecosystem_unsupported"}},{"code":"cve.inconclusive","args":{"reason":"no_manifest_bundled"}},{"code":"installscript.inconclusive","args":{"reason":"install_surface_unavailable"}},{"code":"dephealth.inconclusive","args":{"reason":"no_manifest_bundled"}}]},{"name":"Provenance & Transparency","score":32,"verdict":"fail","reasons":["Source repository is publicly reachable at the declared URL.","Provenance check failed: no build-provenance attestation is published.","License check failed: the license (Proprietary) isn't a recognized OSI-approved license.","Actively maintained (last published 19 days ago).","Disclosure check failed: no security disclosure policy was found in the source repository."],"codes":[{"code":"provenance.repo_verified","args":{}},{"code":"provenance.none","args":{}},{"code":"license.non_osi","args":{"spdx":"Proprietary"}},{"code":"maintenance.recent","args":{"age_days":"19"}},{"code":"disclosure.absent","args":{}}]},{"name":"Schema Quality & AI Usability","score":72,"verdict":"fail","reasons":["AI-judged instruction clarity (good).","Tool/resource definitions use about 7965 tokens (~72/item across 110 items; 110 tools + 0 resources), lean.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_lean","args":{"avg":"72","items":"110","tools":"110","tokens":"7965","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":67,"verdict":"partial","reasons":["Stability observed for 20 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"20"}}]},{"name":"Tool Coverage","score":100,"verdict":"pass","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","100% of tool parameters carry a description."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"100"}}]},{"name":"Tool Safety","score":88,"verdict":"partial","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","4 of 8 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; \"nvm_uninstall\" implies \"uninstall\" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.","An AI judge read all 111 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_undeclared","args":{"pct":"50","tool":"nvm_uninstall","verb":"uninstall","declared":"none","annotated":"4","destructive":"8"}},{"code":"toolsafety.manipulation_clean","args":{"units":"111","judged":"111"}}]},{"name":"Capabilities","score":20,"verdict":"fail","reasons":["Spec-recency check failed: implements MCP spec 2024-11-05; the latest is 2026-07-28."],"codes":[{"code":"protocol.outdated","args":{"latest":"2026-07-28","version":"2024-11-05"}}]}],"inconclusive":["No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.","Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).","Install-script risk not yet assessed.","Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none)."],"malware":[],"components":[{"slug":"envkit-mcp","type":"mcpb","identifier":"https://github.com/Env-Kit/envkit-releases/releases/download/v0.33.0-beta.44/envkit-mcp-0.33.0-beta.44.mcpb","withdrawn":false,"score":43,"current":true,"url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp","markdownUrl":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp.md"}],"facts":[{"label":"Registry","value":"mcpb"},{"label":"Package","value":"https://github.com/Env-Kit/envkit-releases/releases/download/v0.33.0-beta.44/envkit-mcp-0.33.0-beta.44.mcpb"},{"label":"Version","value":"0.33.0-beta.44"},{"label":"Transport","value":"stdio"},{"label":"SHA-256","value":"47c45be8c6eab6370a50c7b57c25c0990233e9b76b4c676ecbd38daa7c43362a"}],"install":{"available":true,"bundleSha256":"47c45be8c6eab6370a50c7b57c25c0990233e9b76b4c676ecbd38daa7c43362a"},"tools":[{"name":"help","title":null,"description":"Answer \"how do I / where is / can I …\" questions about USING EnvKit itself — features, where each setting lives, and step-by-step how-tos (e.g. change the default editor → Settings → Startup; add a custom service version; enable a database admin UI; put tools on PATH). Read-only. Call this for ANY question about the app's UI / features / settings, optionally with a `topic` keyword.","inputs":[{"name":"topic","type":"string","required":false,"description":"optional keyword to focus on, e.g. \"editor\", \"php\", \"path\", \"ssl\", \"database\", \"cron\""}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":130},{"name":"status","title":null,"description":"FULL EnvKit status: services, sites, SSL trust, port conflicts, and the whole bundled catalog with every installable version. Heavy — prefer status_live for routine checks; call this only when you need catalog/SSL/port-conflict detail.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":57},{"name":"status_live","title":null,"description":"Fast runtime snapshot: running services, sites, ports — the same cheap poll the dashboard uses (no cert checks, no port-conflict scan, no catalog). Prefer this over `status` for routine checks.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":50},{"name":"config","title":null,"description":"Read the current EnvKit configuration.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":14},{"name":"paths","title":null,"description":"EnvKit data dir, projects dir, config + log paths.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":20},{"name":"list_sites","title":null,"description":"List all registered sites/projects.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":14},{"name":"add_site","title":null,"description":"Register an existing project folder as a site (auto-detects the framework, then provisions its .test host + SSL). Appears in the app immediately — no restart.","inputs":[{"name":"name","type":"string","required":false,"description":"optional site name (defaults to the folder name)"},{"name":"path","type":"string","required":true,"description":"absolute path to the project directory"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":72},{"name":"remove_site","title":null,"description":"Unregister a site (removes its host/vhost). By default the project files and databases are KEPT; pass delete_files / drop_databases to also delete the project folder and drop the database(s) named in its .env / wp-config.php — irreversible, confirm with the user first.","inputs":[{"name":"delete_files","type":"boolean","required":false,"description":"also delete the project folder (irreversible)"},{"name":"drop_databases","type":"boolean","required":false,"description":"also drop the database(s) the site config names (irreversible)"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":115},{"name":"list_databases","title":null,"description":"List databases on the running MySQL/MariaDB server.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":21},{"name":"create_database","title":null,"description":"Create a MySQL/MariaDB database (utf8mb4). The mysql service must be running.","inputs":[{"name":"name","type":"string","required":true,"description":"database name (letters, digits, _ $ -)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":46},{"name":"drop_database","title":null,"description":"Drop a MySQL/MariaDB database (destructive — system schemas are refused). Confirm intent with the user first.","inputs":[{"name":"name","type":"string","required":true,"description":"database name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":41},{"name":"list_services","title":null,"description":"List bundled services with install + runtime status.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":17},{"name":"start_service","title":null,"description":"Start a service (nginx, php-fpm, mysql, redis, postgres, …).","inputs":[{"name":"name","type":"string","required":true,"description":"service name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":36},{"name":"stop_service","title":null,"description":"Stop a running service.","inputs":[{"name":"name","type":"string","required":true,"description":"service name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":22},{"name":"restart_service","title":null,"description":"Restart a service.","inputs":[{"name":"name","type":"string","required":true,"description":"service name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":21},{"name":"diagnose_service","title":null,"description":"Diagnose why a service won't start (port conflict, missing config/dir, stale pid, log errors). Read-only.","inputs":[{"name":"name","type":"string","required":true,"description":"service name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":41},{"name":"repair_service","title":null,"description":"Auto-repair a failed service (regenerate config, recreate dir, clear stale pid; with killConflicting also free its port) and retry start.","inputs":[{"name":"killConflicting","type":"boolean","required":false,"description":"also stop the process holding the port"},{"name":"name","type":"string","required":true,"description":"service name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":64},{"name":"list_logs","title":null,"description":"List available log sources. `logical: true` sources follow the newest file of a daily-rotated log (e.g. Laravel laravel-YYYY-MM-DD.log); `path` is the file they currently read.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":53},{"name":"tail_log","title":null,"description":"Read the last N lines of a log source. Returns { lines, truncated, size, bytesRead, file }: truncated \"lines\" = older lines exist, \"bytes\" = the read budget ran out before N lines (very long records), \"none\" = the whole file is shown.","inputs":[{"name":"id","type":"string","required":true,"description":"log source id"},{"name":"lines","type":"number","required":false,"description":"lines (default 100)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":89},{"name":"php_versions","title":null,"description":"List installed PHP versions.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":13},{"name":"default_php","title":null,"description":"Get the default PHP version.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":14},{"name":"set_default_php","title":null,"description":"Set the default PHP version.","inputs":[{"name":"version","type":"string","required":true,"description":"e.g. 8.3.30"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":31},{"name":"nvm_status","title":null,"description":"nvm-windows status and installed Node versions.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":19},{"name":"nvm_install","title":null,"description":"Install a Node version via nvm-windows.","inputs":[{"name":"version","type":"string","required":true,"description":"e.g. 20 or 20.11.0"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":38},{"name":"nvm_uninstall","title":null,"description":"Uninstall a Node version via nvm-windows (not the one in use).","inputs":[{"name":"version","type":"string","required":true,"description":"e.g. 18.20.4"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":43},{"name":"nvm_use","title":null,"description":"Switch the active Node version via nvm-windows.","inputs":[{"name":"version","type":"string","required":true,"description":"e.g. 20.11.0"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":36},{"name":"laragon_detect","title":null,"description":"Detect a Laragon install (projects, PHP, Node, databases).","inputs":[{"name":"root","type":"string","required":false,"description":"Laragon root (optional)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":35},{"name":"create_laravel_site","title":null,"description":"Scaffold a new Laravel site (needs PHP + Composer).","inputs":[{"name":"name","type":"string","required":true,"description":"project name"},{"name":"starter_kit","type":"string","required":false,"description":"optional Packagist starter kit, e.g. laravel/react-starter-kit (default: plain laravel/laravel)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":65},{"name":"set_site_enabled","title":null,"description":"Enable or disable a site.","inputs":[{"name":"enabled","type":"boolean","required":true,"description":"true to enable"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":34},{"name":"set_site_queue_workers","title":null,"description":"Configure managed Laravel queue workers for a site (label, connection, queue names, tries, timeout, processes, etc.). Replaces the full worker list.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"},{"name":"workers","type":"array","required":true,"description":"Queue worker definitions"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":60},{"name":"set_site_scheduler","title":null,"description":"Enable or disable the managed php artisan schedule:work process for a Laravel site.","inputs":[{"name":"enabled","type":"boolean","required":true,"description":"true to run schedule:work"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":47},{"name":"set_site_live_reload","title":null,"description":"Turn browser auto-refresh on or off for a PHP site: EnvKit watches the project files and reloads the open tab on save (Laravel sites with a running Vite dev server keep Vite HMR). Optional `database` also reloads the site's other open tabs after a save in the site's dashboard (WordPress admin, Laravel/Filament): any POST/PUT/PATCH/DELETE that is not background noise like heartbeats, autosave or polling.","inputs":[{"name":"database","type":"boolean","required":false,"description":"true to also reload other open tabs after a write request on the site; omit to keep the current setting"},{"name":"enabled","type":"boolean","required":true,"description":"true to watch files and auto-refresh"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":154},{"name":"restart_site_queue_worker","title":null,"description":"Restart a named queue worker for a site.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"},{"name":"workerId","type":"string","required":true,"description":"worker id"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":38},{"name":"get_site_workers","title":null,"description":"Get queue worker, scheduler, and custom process runtime status for a site.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":33},{"name":"set_site_processes","title":null,"description":"Configure user-defined long-running commands for a site (label, command, cwd, restart policy). Replaces the full process list.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"},{"name":"processes","type":"array","required":true,"description":"Custom process definitions"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":55},{"name":"debug_tail","title":null,"description":"Read recent Debug-window events captured from a site (dump()/dd(), SQL queries with N+1/slow flags, mail, rendered views, dispatched events, queued jobs, outgoing HTTP). Scoped per site and per git branch. Read-only.","inputs":[{"name":"branch","type":"string","required":false,"description":"git branch to scope to (optional; defaults to all branches)"},{"name":"limit","type":"number","required":false,"description":"max events (default 100)"},{"name":"name","type":"string","required":true,"description":"site name"},{"name":"type","type":"string","required":false,"description":"filter by type: dump|query|mail|view|event|job|http (optional)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":124},{"name":"dumps_tail","title":null,"description":"Read recent dump()/dd() output from the Dumps page, across every PHP site or one site (newest last; `data.text` is the plain-text dump, `source` the file:line). Capture must be on for the site (set_site_dumps). Read-only.","inputs":[{"name":"limit","type":"number","required":false,"description":"max dumps (default 500)"},{"name":"site","type":"string","required":false,"description":"site name (optional; defaults to every site)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":95},{"name":"set_site_dumps","title":null,"description":"Send a PHP site's dump()/dd() output to the EnvKit Dumps page instead of the page (no code added to the project; needs symfony/var-dumper, which every Laravel app has). The first site switched on restarts PHP once.","inputs":[{"name":"enabled","type":"boolean","required":true,"description":"true to capture, false to stop"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":84},{"name":"start_all","title":null,"description":"Start all enabled services.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":13},{"name":"stop_all","title":null,"description":"Stop all services.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":12},{"name":"apply","title":null,"description":"Re-apply config: render service configs, sync hosts + SSL.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":21},{"name":"site_detail","title":null,"description":"Full detail for one site (framework, hostname, PHP version, dev server, workers, SSL, asleep, process usage, last visit, …). `usage` is the site's live memory/CPU: 0 / no groups when idle (nothing of it runs), null only when the process probe failed. Read-only.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":82},{"name":"create_wordpress_site","title":null,"description":"Create a WordPress site: downloads WordPress, creates its MySQL database and writes wp-config.php (needs PHP + MySQL installed). Pass admin_user + admin_password + admin_email (and optionally title) to finish the install too, so /wp-admin logs in immediately; otherwise the user completes the setup wizard in the browser. Returns the site list plus a `wordpress` object with url/adminUrl/installUrl/outcome.","inputs":[{"name":"admin_email","type":"string","required":false,"description":"optional admin email"},{"name":"admin_password","type":"string","required":false,"description":"optional admin password (8+ characters)"},{"name":"admin_user","type":"string","required":false,"description":"optional admin username"},{"name":"db_name","type":"string","required":false,"description":"optional MySQL database name (default: derived from the folder name)"},{"name":"name","type":"string","required":true,"description":"project folder name"},{"name":"title","type":"string","required":false,"description":"optional site title (default: the folder name)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":180},{"name":"create_codeigniter_site","title":null,"description":"Scaffold a new CodeIgniter 4 site with composer create-project codeigniter4/appstarter (needs PHP + Composer), then prepare it like prepare_codeigniter_site. Returns the site list plus a `codeigniter` object with url and the prepare result.","inputs":[{"name":"name","type":"string","required":true,"description":"project folder name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":75},{"name":"prepare_codeigniter_site","title":null,"description":"Get an existing CodeIgniter 4 site ready for local development: creates .env from the project's env file when missing (else updates only these keys), sets CI_ENVIRONMENT=development, app.baseURL to the site URL, database.default.* to the main MySQL server with a database named after the site (created; MySQL is started when idle), and email.* SMTP to Mailpit. Edits the project's .env — only run it when the user asked for it.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":117},{"name":"create_bedrock_site","title":null,"description":"Scaffold a new Roots Bedrock (Composer-based WordPress) site with composer create-project roots/bedrock (needs PHP + Composer), served from web/ with wp-admin at /wp/wp-admin/, then prepare it like prepare_bedrock_site. Returns the site list plus a `bedrock` object with url and the prepare result.","inputs":[{"name":"name","type":"string","required":true,"description":"project folder name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":89},{"name":"prepare_bedrock_site","title":null,"description":"Get an existing Roots Bedrock site ready for local development: when .env is missing it is written from .env.example with DB_NAME/DB_USER/DB_PASSWORD/DB_HOST for the main MySQL server, WP_ENV=development, WP_HOME/WP_SITEURL for the site URL and fresh salts. An existing .env is never modified — the result's `suggestions` lists the lines to set instead. Creates the database (MySQL is started when idle).","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":115},{"name":"list_blueprints","title":null,"description":"List saved project blueprints (user zip templates for one-click site creation).","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":24},{"name":"create_site_from_blueprint","title":null,"description":"Create a new site from a saved blueprint zip: unpacks into the projects dir, optionally creates a MySQL database and rewrites wp-config / Laravel .env, registers the site with HTTPS, and runs an optional post-create command. For a WordPress blueprint that ships no db/*.sql dump, pass admin_user + admin_password + admin_email (and optionally title) to finish the WordPress install too; the result's `blueprint.wordpress` carries outcome/adminUrl/installUrl. Returns sites plus a `blueprint` result with url/notes.","inputs":[{"name":"admin_email","type":"string","required":false,"description":"optional WordPress admin email"},{"name":"admin_password","type":"string","required":false,"description":"optional WordPress admin password (8+ characters)"},{"name":"admin_user","type":"string","required":false,"description":"optional WordPress admin username"},{"name":"blueprint_id","type":"string","required":true,"description":"blueprint id from list_blueprints"},{"name":"db_name","type":"string","required":false,"description":"optional MySQL database name"},{"name":"name","type":"string","required":true,"description":"project folder name"},{"name":"title","type":"string","required":false,"description":"optional WordPress site title (default: the folder name)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":220},{"name":"create_node_site","title":null,"description":"Scaffold a new Node/JS site using the official scaffolder. Provisions its .test host + SSL.","inputs":[{"name":"framework","type":"string","required":true,"description":"nextjs | nuxtjs | vite | angular | node"},{"name":"name","type":"string","required":true,"description":"project name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":59},{"name":"add_proxy_site","title":null,"description":"Register a reverse-proxy site: <name>.test forwards to 127.0.0.1:<port> for a server EnvKit does not run (Docker, Go, Rust, .NET…). No project folder, no managed process; provisions the host + SSL.","inputs":[{"name":"domain","type":"string","required":false,"description":"optional custom hostname instead of <name>.test"},{"name":"name","type":"string","required":true,"description":"site name (becomes <name>.test)"},{"name":"port","type":"string","required":true,"description":"local port to forward to, 1-65535"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":115},{"name":"set_site_proxy_port","title":null,"description":"Change a reverse-proxy site's target port.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"},{"name":"port","type":"string","required":true,"description":"local port, 1-65535"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":43},{"name":"create_empty_site","title":null,"description":"Create an empty project folder registered as a site.","inputs":[{"name":"name","type":"string","required":true,"description":"project name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":28},{"name":"clone_git_site","title":null,"description":"Clone a git repo into the projects folder, register it as a site, and install dependencies (composer for PHP).","inputs":[{"name":"name","type":"string","required":false,"description":"optional project name"},{"name":"url","type":"string","required":true,"description":"git clone URL"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":52},{"name":"set_site_domain","title":null,"description":"Set a site's primary domain + aliases (re-provisions hosts/SSL). Pass an empty domain to revert to the default .test host.","inputs":[{"name":"aliases","type":"array","required":false,"description":"optional aliases"},{"name":"domain","type":"string","required":false,"description":"primary hostname, e.g. shop.test or example.com"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":73},{"name":"set_site_php_version","title":null,"description":"Pin a site to an isolated PHP version (empty = use the default).","inputs":[{"name":"name","type":"string","required":true,"description":"site name"},{"name":"version","type":"string","required":false,"description":"e.g. 8.3.30; empty for default"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":54},{"name":"set_site_group","title":null,"description":"File a site under a group title (groups are shown as collapsible sections on the Sites page). Pass an empty group to ungroup it. Metadata only — no vhost/hosts/SSL change.","inputs":[{"name":"group","type":"string","required":false,"description":"group title, 1–40 chars; empty to ungroup"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":79},{"name":"sleep_site","title":null,"description":"Pause all of a site's background processes (queue workers, scheduler, Reverb, Octane, dev server, custom processes). Files, database and settings are kept; the site's URL shows a sleep page until woken. Works for any site, including one with no background processes (then only the sleep page changes). Refused for a disabled site or one with a custom vhost. Returns the site detail.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":99},{"name":"wake_site","title":null,"description":"Wake a sleeping site: restart its background processes. Pass minutes=60 to put it back to sleep after an hour without visits. Returns the site detail.","inputs":[{"name":"minutes","type":"number","required":false,"description":"optional: 60 = go back to sleep after an hour without visits; omit to stay awake"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":74},{"name":"set_site_framework","title":null,"description":"Override a site's detected framework (empty = re-auto-detect).","inputs":[{"name":"framework","type":"string","required":false,"description":"laravel|wordpress|nextjs|nuxtjs|vite|angular|node|generic|proxy; empty to auto-detect"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":65},{"name":"set_serve_mode","title":null,"description":"Switch a Node site between 'dev' (dev server/HMR) and 'prod' (build + serve production). Prod auto-builds first.","inputs":[{"name":"mode","type":"string","required":true,"description":"'dev' or 'prod'"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":62},{"name":"set_all_serve_mode","title":null,"description":"Switch ALL sites (and the global default) between dev and production.","inputs":[{"name":"mode","type":"string","required":true,"description":"'dev' or 'prod'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":38},{"name":"build_site","title":null,"description":"Run a Node site's production build (npm run build); returns the build status.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":33},{"name":"clear_site_cache","title":null,"description":"Purge a production site's server-side cache and rebuild it.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":30},{"name":"set_dev_server","title":null,"description":"Configure a Node site's dev server (enabled, runtime 'node' | 'bun' | 'deno', port, script, mode, build/start scripts, output dir, prod port). runtime 'bun' runs `bun run --bun <script>`, 'deno' runs `deno task <script>`.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"},{"name":"patch","type":"object","required":true,"description":"dev-server patch"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":93},{"name":"set_octane","title":null,"description":"Laravel Octane for a Laravel site: enable/disable `php artisan octane:start` (EnvKit supervises it and proxies the site's host to it), port, server ('frankenphp' | 'swoole' | 'roadrunner'; null = OCTANE_SERVER from .env / auto), workers.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"},{"name":"patch","type":"object","required":true,"description":"octane patch: { enabled?, port?, server?, workers? }"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":103},{"name":"restart_octane","title":null,"description":"Restart a site's Octane server.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":25},{"name":"list_site_scripts","title":null,"description":"List a site's package.json scripts, the detected package manager (npm/pnpm/yarn/bun, or deno) and the exact install command.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":48},{"name":"run_site_script","title":null,"description":"Open a terminal window on the user's desktop at the site folder running one package.json script (e.g. build, test, lint) with the site's Node version and package manager. Omit script to install dependencies. The output stays in that terminal; nothing is returned but the command. For dev servers prefer restart_dev_server.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"},{"name":"script","type":"string","required":false,"description":"package.json script name; omit to run the install"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":100},{"name":"restart_dev_server","title":null,"description":"Restart a site's dev/prod server.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":26},{"name":"git_overview","title":null,"description":"Git snapshot for a site: branch, ahead/behind, changed files (staged/unstaged), and recent commits. Read-only.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":46},{"name":"create_worktree_site","title":null,"description":"Check out a branch of a site's repo as a git worktree (in <root>/.worktrees/<branch>, excluded from the parent repo via .git/info/exclude) and serve it as its own site on a subdomain of the parent: https://<branch>.<site>.test. Uses an existing local/remote branch or creates it from HEAD.","inputs":[{"name":"branch","type":"string","required":true,"description":"branch name, e.g. feature/login"},{"name":"name","type":"string","required":true,"description":"parent site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":109},{"name":"git_action","title":null,"description":"Run a Git action on a site: pull|push|fetch|stageAll|stage|unstage|discardFile|commit|checkout|createBranch. payload: {file?, message?, all?, branch?}.","inputs":[{"name":"action","type":"string","required":true,"description":"pull|push|fetch|stageAll|stage|unstage|discardFile|commit|checkout|createBranch"},{"name":"name","type":"string","required":true,"description":"site name"},{"name":"payload","type":"object","required":false,"description":"{ file?, message?, all?, branch? }"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":107},{"name":"db_connections","title":null,"description":"Connection details (host/port/user) for each running DB engine, for copying into a project .env. Read-only.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":33},{"name":"databases_overview","title":null,"description":"Per-engine database list + status and ordered adminUis across MySQL/MariaDB, PostgreSQL, MongoDB. The legacy adminUi field remains the primary UI. Read-only.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":46},{"name":"create_db","title":null,"description":"Create a database on a specific engine. The engine must be running.","inputs":[{"name":"engine","type":"string","required":true,"description":"'mysql' | 'postgres' | 'mongodb'"},{"name":"instance","type":"string","required":false,"description":"mysql only: the version of an extra MySQL/MariaDB server (see databases_overview); omit for the main server"},{"name":"name","type":"string","required":true,"description":"database name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":80},{"name":"drop_db","title":null,"description":"Drop a database on a specific engine (destructive — system schemas refused). Confirm with the user first.","inputs":[{"name":"engine","type":"string","required":true,"description":"'mysql' | 'postgres' | 'mongodb'"},{"name":"instance","type":"string","required":false,"description":"mysql only: the version of an extra MySQL/MariaDB server; omit for the main server"},{"name":"name","type":"string","required":true,"description":"database name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":82},{"name":"start_mysql_version","title":null,"description":"Start one installed MySQL/MariaDB version. The active version is the main server; any other runs alongside it on its own port (reported as `mysql-<version>` in status; the port goes in the project .env as DB_PORT) and comes back when EnvKit restarts.","inputs":[{"name":"version","type":"string","required":true,"description":"full version, e.g. 5.7.44"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":88},{"name":"stop_mysql_version","title":null,"description":"Stop one MySQL/MariaDB version. Stopping the active version stops the main server; stopping another keeps its port reserved.","inputs":[{"name":"version","type":"string","required":true,"description":"full version, e.g. 5.7.44"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":54},{"name":"install_service","title":null,"description":"Download + install a bundled service version (nginx/php/mysql/postgres/redis/mongodb/node/…). Use list_services for ids/versions.","inputs":[{"name":"id","type":"string","required":true,"description":"service id"},{"name":"version","type":"string","required":true,"description":"version to install"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":56},{"name":"uninstall_service","title":null,"description":"Uninstall a bundled service (removes its files; destructive). Pass version to remove only that version, leaving other installed versions intact.","inputs":[{"name":"id","type":"string","required":true,"description":"service id"},{"name":"version","type":"string","required":false,"description":"version to remove (default: the whole service, every installed version)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":64},{"name":"cron_list","title":null,"description":"List scheduled tasks (cron jobs). Read-only. A job with `site` belongs to that site; `siteState` other than \"active\" (disabled / asleep / missing = site removed) means its scheduled runs are skipped.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":55},{"name":"cron_save","title":null,"description":"Create or update a scheduled task. job: {id?, name, schedule (5-field cron), command, cwd?, site?, enabled?}. `site` links the job to a site by name: it runs in the site folder when cwd is empty and is skipped while the site is disabled or asleep; null unlinks, omitting it keeps the current link. For Laravel `schedule:run` prefer set_site_scheduler (the site's built-in scheduler) over a cron job.","inputs":[{"name":"job","type":"object","required":true,"description":"{ id?, name, schedule, command, cwd?, site?, enabled? }"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":127},{"name":"cron_run","title":null,"description":"Run a scheduled task now.","inputs":[{"name":"id","type":"string","required":true,"description":"cron job id"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":24},{"name":"cron_remove","title":null,"description":"Delete a scheduled task.","inputs":[{"name":"id","type":"string","required":true,"description":"cron job id"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":23},{"name":"set_web_server","title":null,"description":"Switch the active web server ('nginx', 'apache', 'caddy' or 'frankenphp'; Apache is Windows-only; FrankenPHP serves PHP in-process with its embedded PHP).","inputs":[{"name":"server","type":"string","required":true,"description":"'nginx' | 'apache' | 'caddy' | 'frankenphp'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":72},{"name":"set_tld","title":null,"description":"Change the local TLD (e.g. 'test' → 'localhost'); regenerates hosts/certs/vhosts.","inputs":[{"name":"tld","type":"string","required":true,"description":"local TLD, e.g. 'test'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":50},{"name":"save_settings","title":null,"description":"Patch app settings (general.*, services.*). patch mirrors the config shape.","inputs":[{"name":"patch","type":"object","required":true,"description":"AppSettingsPatch"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":33},{"name":"tinker_eval","title":null,"description":"Run PHP/Laravel Tinker code in a site and return the output.","inputs":[{"name":"code","type":"string","required":true,"description":"PHP code to evaluate"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":45},{"name":"issue_letsencrypt","title":null,"description":"Issue a Let's Encrypt certificate for a site's real (public) domain. opts: {challenge:'http-01'|'dns-01', email?, dnsProvider?, cloudflareToken?, staging?}.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"},{"name":"opts","type":"object","required":true,"description":"{ challenge, email?, dnsProvider?, cloudflareToken?, staging? }"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":81},{"name":"php_extensions","title":null,"description":"List PHP extensions for a version (name, enabled, recommended, builtin). Read-only. On macOS `builtin` modules are compiled in (always on); only the ext/ add-ons toggle.","inputs":[{"name":"version","type":"string","required":false,"description":"PHP version (optional; defaults to the default version)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":65},{"name":"set_php_extension","title":null,"description":"Enable or disable a PHP extension (verifies it loads; rolls back a broken enable). Returns the updated list. On macOS only the ext/ add-ons (xdebug, apcu, ���) toggle; compiled-in modules cannot be disabled.","inputs":[{"name":"enabled","type":"boolean","required":true,"description":"true to enable"},{"name":"name","type":"string","required":true,"description":"extension name, e.g. xdebug, intl, gd"},{"name":"version","type":"string","required":false,"description":"PHP version (optional)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":100},{"name":"set_frankenphp_extensions","title":null,"description":"Set which loadable extensions FrankenPHP's embedded PHP enables (Windows `ext/php_*.dll`). Pass `names` as an array of bare names (e.g. ['curl','gd']), or null to restore the recommended defaults. Regenerates php.ini and restarts FrankenPHP when it is the active web server. No-op on macOS (static build, no ext/).","inputs":[{"name":"names","type":null,"required":true,"description":"string[] of extension names, or null for defaults"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":104},{"name":"refresh_php_build","title":null,"description":"macOS: bring an older PHP install up to the current mirrored build in place (re-downloads the version, swaps bin/ + ext/, keeps php.ini) so the loadable add-ons (xdebug, apcu, imagick, memcached, mongodb, igbinary) become available. Use when php_extensions reports legacyBuild=true.","inputs":[{"name":"version","type":"string","required":false,"description":"PHP version (optional; defaults to the default version)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":95},{"name":"install_php_extension","title":null,"description":"Download + install a PECL extension build matching the PHP version (e.g. xdebug, redis, imagick), then enable it. Also accepts the encoded-PHP loaders \"ioncube\" (Windows) and \"sourceguardian\" (Windows x64, macOS arm64).","inputs":[{"name":"name","type":"string","required":true,"description":"PECL extension name"},{"name":"version","type":"string","required":false,"description":"PHP version (optional)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":88},{"name":"dev_tools_status","title":null,"description":"Install status of the managed developer tools: Composer, PIE, Git, GitHub CLI, Laravel installer. Read-only.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":33},{"name":"install_dev_tool","title":null,"description":"Install a managed developer tool and put it on PATH.","inputs":[{"name":"tool","type":"string","required":true,"description":"'composer' | 'pie' | 'git' | 'gh' | 'laravel-installer'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":48},{"name":"share_site","title":null,"description":"Share a site publicly and return the URL. provider \"envkit\" (default, EnvKit Share): https://<subdomain>.envkit.net, the same address every time; reuses the previous subdomain for that site when one is not given; optionally require a password (HTTP basic auth on the share URL only; the .test site stays open): the result then carries `auth` {user, password} to hand to the user; without password arguments the site keeps its previous protection setting. provider \"cloudflare\" (Cloudflare quick tunnel, no account): a random https://<words>.trycloudflare.com that changes every time the site is shared and ends when the tunnel stops; no subdomain and no password. Several sites can be shared at the same time; sharing a site again replaces its current share.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"},{"name":"password","type":"string","required":false,"description":"login password (optional; 8-72 printable characters; generated when omitted). Giving one implies require_password"},{"name":"provider","type":"string","required":false,"description":"share provider (optional; default \"envkit\")"},{"name":"require_password","type":"boolean","required":false,"description":"EnvKit Share only: protect the share URL with a username + password (optional; false removes an existing password)"},{"name":"subdomain","type":"string","required":false,"description":"EnvKit Share only: subdomain to serve it under (optional; 3-63 chars, letters/numbers/hyphens)"},{"name":"username","type":"string","required":false,"description":"login username (optional; default \"guest\"; letters, numbers, . _ -)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":317},{"name":"stop_share","title":null,"description":"Stop a public share and release its tunnel. Stops every share when no site name is given.","inputs":[{"name":"name","type":"string","required":false,"description":"site name (optional; omit to stop all)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":43},{"name":"share_status","title":null,"description":"Every active public share (site, provider \"envkit\" or \"cloudflare\", URL, status, expiry — empty for cloudflare — and `auth` {user, password} when password-protected) as {shares:[...]}. A share that ended by itself (status \"stopped\" or \"expired\") stays listed until stop_share dismisses it; `error` says why (e.g. its site was disabled). Read-only.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":98},{"name":"backup_site","title":null,"description":"Create a local zip backup of a site (project files + a logical dump of its detected MySQL/Postgres database). Returns the archive path. Skips node_modules, vendor, .git, storage/logs.","inputs":[{"name":"dest_dir","type":"string","required":false,"description":"optional destination folder (default: <dataDir>/backups/<site>)"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":82},{"name":"apply_project_config","title":null,"description":"Apply a project's committed envkit.json (at the project root) to its EnvKit site: PHP version, required PHP extensions and php.ini values (schema 2 `php: {version, extensions, ini}`), domain/aliases, databases to create, Laravel scheduler/queue workers, custom processes. An optional envkit.local.json (per developer, not committed) is merged over it; items it decided carry origin:'local'. Node is only checked, never changed. The file only adds and updates — workers/processes/aliases it does not mention are kept. web_server is a GLOBAL switch that affects every site, so it is applied only when its key 'web_server' is named in items. PHP extension/ini items belong to a PHP version: when other sites use that version the item lists them in sharedWith and is applied only when its key (e.g. 'php_extension:intl', 'php_ini:memory_limit') is named in items — tell the user which sites it reaches first. With FrankenPHP as the web server, web requests run FrankenPHP's embedded PHP; the plan reports a version or extension it lacks as blocked. Call with dry_run:true first and show the plan to the user before applying. Returns {applied, skipped, errors} (dry run: the plan with items[] and their state same|change|blocked).","inputs":[{"name":"dry_run","type":"boolean","required":false,"description":"only return the plan: what envkit.json would change, nothing is applied"},{"name":"items","type":"array","required":false,"description":"plan item keys to apply; default = every applicable change except web_server and PHP extension/ini changes shared with other sites"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":348},{"name":"export_project_config","title":null,"description":"Write a site's current EnvKit setup (PHP major.minor, Node from .nvmrc, custom domain, aliases, detected databases, scheduler, queue workers, processes) to envkit.json at the project root, so teammates can apply it. Never writes the web server; process env variables are written by name with an empty value (never the value). Queue worker extraArgs are written as configured, so review the file before committing it. Refuses to replace an existing envkit.json unless overwrite is true — ask the user first.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"},{"name":"overwrite","type":"boolean","required":false,"description":"replace an existing envkit.json"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":139},{"name":"list_site_backups","title":null,"description":"List local zip backups for a site (path, size, createdAt, databases included). Read-only.","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":40},{"name":"snapshot_database","title":null,"description":"Take a snapshot (logical dump) of ONE MySQL/MariaDB or PostgreSQL database, saved under <dataDir>/snapshots/<engine>/<name>/. Starts the server if it is stopped. System databases (mysql, sys, information_schema, performance_schema, postgres) are refused. Returns the snapshot (id, path, size, createdAt).","inputs":[{"name":"engine","type":"string","required":false,"description":"'mysql' | 'postgres' (default mysql)"},{"name":"instance","type":"string","required":false,"description":"full version of an extra MySQL/MariaDB server running next to the main one (omit for the main server)"},{"name":"name","type":"string","required":true,"description":"database name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":136},{"name":"restore_database_snapshot","title":null,"description":"Restore a database from one of its snapshots: drops and replaces the database on that server — confirm with the user first. By default a snapshot of the current data is taken first so the restore can be undone. A snapshot restores onto any server of the same engine (pass instance to target an extra MySQL/MariaDB version). PostgreSQL: other connections to that database are closed first. System databases are refused.","inputs":[{"name":"engine","type":"string","required":false,"description":"'mysql' | 'postgres' (default mysql)"},{"name":"id","type":"string","required":true,"description":"snapshot id from list_database_snapshots"},{"name":"instance","type":"string","required":false,"description":"full version of an extra MySQL/MariaDB server (omit for the main server)"},{"name":"name","type":"string","required":true,"description":"database name"},{"name":"safety_snapshot","type":"boolean","required":false,"description":"take a snapshot of the current data first (default true)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":175},{"name":"list_database_snapshots","title":null,"description":"List the snapshots of a database, newest first (id, createdAt, size, source instance/port) as {snapshots:[...]}. Read-only.","inputs":[{"name":"engine","type":"string","required":false,"description":"'mysql' | 'postgres' (default mysql)"},{"name":"name","type":"string","required":true,"description":"database name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":68},{"name":"open_site_in_editor","title":null,"description":"Open a site's project folder in the user's preferred code editor (falls back to the OS file manager).","inputs":[{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":39},{"name":"run_artisan","title":null,"description":"Run a php artisan command in a Laravel site and return its output (e.g. args [\"migrate\",\"--force\"]).","inputs":[{"name":"args","type":"array","required":true,"description":"artisan arguments, e.g. [\"migrate:status\"]"},{"name":"name","type":"string","required":true,"description":"site name"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":62},{"name":"open_app","title":null,"description":"Show and focus the EnvKit app window (restores it from the tray, recreating it if closed). Optionally open a specific page. This server runs inside the app, so EnvKit is already running whenever this tool is reachable.","inputs":[{"name":"page","type":"string","required":false,"description":"optional page to open: 'dashboard' | 'sites' | 'services' | 'databases' | 'logs' | 'dumps' | 'mailpit' | 'tools' | 'cron' | 'ai' | 'settings'"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":113}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-06T02:11:42.000Z","track":"package","endpoint":null,"declaredUrl":null,"truncated":false,"tls":null,"dnssec":null,"auth":null,"httpsRedirect":null,"transports":[],"provenance":{"outcome":"none","label":"No attestation","reason":"no_attestation","reasonLabel":"No attestation published","discovery":null,"discoveryLabel":null,"sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-10-17","recent":[{"id":"chg_01a1aea0-488e-7ccf-b6b4-5e49fd1f94f8","kind":"score.total_changed","summary":"Trust score (42 → 43)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-06","url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp#chg-chg_01a1aea0-488e-7ccf-b6b4-5e49fd1f94f8"},{"id":"chg_01a1a453-fefc-7c3c-8ab4-838be97633e7","kind":"score.total_changed","summary":"Trust score (41 → 42)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp#chg-chg_01a1a453-fefc-7c3c-8ab4-838be97633e7"},{"id":"chg_01a19a07-8634-7033-9ae9-312706375e9e","kind":"score.total_changed","summary":"Trust score (40 → 41)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp#chg-chg_01a19a07-8634-7033-9ae9-312706375e9e"},{"id":"chg_01a18fb9-dfb5-763c-9aab-016338b97195","kind":"score.total_changed","summary":"Trust score (39 → 40)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp#chg-chg_01a18fb9-dfb5-763c-9aab-016338b97195"},{"id":"chg_01a18046-6389-77f9-8efd-b6f2034c2cb8","kind":"score.total_changed","summary":"Trust score (38 → 39)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-28","url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp#chg-chg_01a18046-6389-77f9-8efd-b6f2034c2cb8"},{"id":"chg_01a175f6-03eb-7b80-86a4-a8201876cf65","kind":"score.total_changed","summary":"Trust score (37 → 38)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-26","url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp#chg-chg_01a175f6-03eb-7b80-86a4-a8201876cf65"},{"id":"chg_01a16ba8-f699-7dae-bb7a-5cd5078db65f","kind":"score.total_changed","summary":"Trust score (36 → 37)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-24","url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp#chg-chg_01a16ba8-f699-7dae-bb7a-5cd5078db65f"},{"id":"chg_01a1615c-54fd-7d3a-a1c6-d2ad42752658","kind":"check.reverified","summary":"Stability (unverified → 0.17)","materiality":"functional","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-22","url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp#chg-chg_01a1615c-54fd-7d3a-a1c6-d2ad42752658"},{"id":"chg_01a1615c-54fe-7a68-89d3-fa5df8827eec","kind":"score.total_changed","summary":"Trust score (33 → 36)","materiality":"functional","direction":"improvement","scoreDelta":3,"occurredOn":"2026-10-22","url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp#chg-chg_01a1615c-54fe-7a68-89d3-fa5df8827eec"},{"id":"chg_01a14b6c-05bb-7920-a1ac-a2b29cb20f7e","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-17","url":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp#chg-chg_01a14b6c-05bb-7920-a1ac-a2b29cb20f7e"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp","markdown":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp.md","changelogJson":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/env-kit-envkit/envkit-mcp.xml","external":[{"label":"Repository","href":"https://github.com/Env-Kit/envkit-releases"},{"label":"Website","href":"https://envkit.net/docs#ai-mcp"}]}}