MCP server providing WP-CLI, MySQL, and filesystem access for Local by Flywheel WordPress sites
Server has solid foundations: all 10 tools have descriptions (194 - 250 chars, within baseline), explicit Zod schemas with typed parameters, and tool annotations (readOnlyHint/destructiveHint). However, several tools lack output schema documentation, parameter descriptions are sometimes generic, and error messages do not guide recovery. Naming is verb-forward and clear (mysql_query, read_site_file, wp_cli_run). No critical security gaps detected, write operations are gated behind env vars (MYSQL_ALLOW_WRITES, FS_ALLOW_WRITES, WPCLI_ALLOW_WRITES). Main weaknesses: (1) output schemas not documented in tool definitions; (2) some parameters lack actionable constraints (e.g., wp_cli_run 'command' param has no enum or pattern); (3) error responses are generic ('Error: {message}') and do not suggest recovery steps.
List files and directories in a Local by Flywheel site directory. Path is relative to the site root. Returns file names, types, and sizes.
Execute a SQL query against the WordPress database. SELECT, SHOW, DESCRIBE, and EXPLAIN are always allowed. INSERT, UPDATE, DELETE require MYSQL_ALLOW_WRITES=true.
Get the schema of the WordPress database. Without a table name, lists all tables. With a table name, shows column details.
Read a file from the Local by Flywheel site directory. Path is relative to the site root (e.g., "app/public/wp-config.php"). Files are limited to 512KB. All paths are validated against the site directory.
Search for files by name pattern within the Local site directory. Searches recursively up to 10 levels deep, max 100 results. Skips node_modules, vendor, and dotfiles.
Query the database directly to get the list of active WordPress plugins.
Output schemas not documented. Tool definitions do not declare what fields/structure the response contains. LLMs cannot plan downstream calls or extract required data without knowing response shape.
wp_cli_run 'command' parameter accepts free-form strings with no enum or pattern constraint. Blocked commands (eval, eval-file, shell) are documented in description but not enforced at schema level. LLMs may attempt blocked commands.
Error responses are generic ('Error: {message}') and do not guide recovery. No categorization of errors as retryable, user-fixable, or fatal. LLMs receive no actionable next steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 70 | 2026-07-28+ | v2 |
Execute a WP-CLI command against a Local by Flywheel WordPress site. Commands like "plugin list", "option get siteurl", "core version" are always allowed. Write commands require WPCLI_ALLOW_WRITES=true. Commands "eval", "eval-file", and "shell" are blocked for security.
List all WordPress sites configured in Local by Flywheel, including their names, domains, IDs, and service versions.
Get detailed information about the current Local by Flywheel WordPress site, including the site URL, WordPress version, active theme, and PHP version.
Write content to a file in the Local by Flywheel site directory. Requires FS_ALLOW_WRITES=true. Cannot write to wp-admin/ or wp-includes/ (WordPress core). Path is relative to the site root.
mysql_query lacks input validation. Query string is passed directly to executeQuery(). No check for dangerous patterns (DROP, TRUNCATE, etc.) beyond the env var gate. Prompt injection via query param could bypass intent.
write_site_file and mysql_query support destructive operations but lack confirmation/dry-run pattern. Agents can delete or modify data without a safety checkpoint.