An MCP server that lets AI agents inspect a Laravel app — routes, models, schema, and read-only queries — over stdio.
Strong foundation with 13 well-named, read-only tools covering Laravel introspection. All tools have descriptions (avg 95 chars) and explicit input schemas with typed properties. Tool names follow verb_noun pattern (config_get, database_query, list_routes). Schemas are complete with property descriptions. However, output schemas are not documented, LLMs cannot predict response structure. Parameter descriptions are present but terse (avg 45 chars); some lack format/constraint details. Error handling is minimal, no recovery guidance or actionable error messages visible in code. Security is strong (read-only enforcement via IsReadOnly trait, sensitive config redaction), but no per-tool permission declarations. Composition is clean: each tool has one responsibility, and tool names make distinctions clear (database_query vs model_query vs database_schema).
Read configuration values (sensitive values redacted). Omit "key" to list the top-level config namespaces.
Run a single read-only SELECT query and return the rows. Writes are rejected.
List every table in the database with its columns (name and type) — a whole-schema overview.
Describe an Eloquent model: its table, columns, fillable/hidden, casts and relationships.
Describe a database table: its columns, indexes and foreign keys.
Return the query plan (EXPLAIN) for a read-only SELECT, without running it.
List registered Artisan commands with their descriptions and usage.
List Eloquent models in the application with their database table names.
Output schemas not documented. LLMs cannot predict response structure (fields, types, nesting). Forces trial-and-error parsing and wastes tokens on clarification.
Parameter descriptions are terse (avg 45 chars). Missing format/constraint details. E.g., 'limit' lacks min/max bounds; 'filter' lacks case-sensitivity or regex rules; 'model' lacks guidance on short vs fully-qualified names.
No error recovery guidance. Code throws InvalidArgumentException for missing config keys or invalid models, but LLMs receive no hint on what to try next (e.g., 'Call list_models() first').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2026-07-28+ | v2 |
List the application's HTTP routes: methods, URI, name, action and middleware.
List migrations and whether each has run (ran vs pending), with batch numbers.
Run a read-only Eloquent query: equality filters, selected columns, eager-loaded relations, ordering and a row limit.
Map every Eloquent model and its relationships as a graph (nodes = models, edges = relations).
Return the last lines of a log file (defaults to the newest log in storage/logs).
No per-tool permission declarations. Tools lack scope metadata (e.g., 'read:config', 'read:database'). Prevents least-privilege agent configuration and audit clarity.
Result limits not enforced uniformly. database_query caps at 1000 rows, model_query at 500, but list_routes and list_commands lack explicit limits. Large result sets risk context window exhaustion.