Auto-expose Eloquent models as policy-enforced MCP tools. Safe-by-default CRUD over the Model Context Protocol, gated by your Laravel Policies, scoped to your tenant, and audited.
Laravel Model MCP demonstrates solid fundamentals: all 7 tools have clear verb-noun naming (list_*, view_*, create_*, etc.), comprehensive parameter schemas with types and descriptions, and thoughtful authorization/audit patterns. Descriptions are concise and action-oriented (avg ~100 chars). However, output schemas are not explicitly documented in the visible code, and error handling lacks recovery guidance (e.g., 'try search_* first'). The dynamic tool generation pattern (tools parameterized by ModelDescriptor) is elegant but makes per-tool schema validation harder to verify statically. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications in metadata.
Create a new {model}. Requires the 'create' policy ability.
Delete a {model} by primary key (soft-deletes if the model uses the SoftDeletes trait, otherwise permanent). Requires the 'delete' policy ability.
Describe the fields, types and available operations of {model}. Call this before create or update to learn which fields are writable and what they expect. Returns schema metadata only — it reads no rows.
List {model} records (paginated). Honors the viewer's policy and tenant.
Search {model} records by text across their textual columns. Honors the viewer's policy and tenant.
Update an existing {model} by primary key. Requires the 'update' policy ability.
Fetch a single {model} by primary key. Honors the viewer's policy and tenant.
Output schemas not documented in visible code. LLMs cannot plan downstream tool calls without knowing what fields list_*, view_*, create_* return. Pagination metadata (total, next_cursor) not visible.
Error responses lack recovery guidance. When authorization fails, the response says 'denied' but does not suggest 'call describe_* to see required fields' or 'check your policy'. Agents cannot self-correct.
Tool annotations missing. delete_* is destructive (soft or hard), create_* and update_* are write operations, but no readOnlyHint/destructiveHint/idempotentHint metadata. LLMs cannot distinguish safe from risky tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
Dynamic tool generation makes per-tool schema validation opaque. Tools are parameterized by ModelDescriptor; actual input schemas for create_* and update_* vary per model but are not statically visible in the code sample.
Pagination limits (max 100 per_page) are documented in parameter descriptions but not enforced in visible code. No evidence of result capping or token-aware truncation.