Laraguard Mcp

Created By
ecr17dev3 months ago
Overview

Laraguard MCP

image

A security audit MCP server for Laravel projects — built with TypeScript and stdio transport.

License: MIT Node.js TypeScript MCP SDK Version


Overview

Laraguard MCP is a standalone Model Context Protocol (MCP) server that performs security audits on Laravel projects. It is implemented in pure TypeScript using the official @modelcontextprotocol/sdk and communicates over stdio, making it natively compatible with any MCP-capable IDE or client (Cursor, Claude Desktop, VS Code MCP extensions, etc.).

The server analyses a Laravel project as an external target — it does not require Laravel to be running. It returns structured JSON findings categorised by severity, covering configuration issues, risky code patterns, and dependency hygiene.


Features

  • 🔍 Static code scanning — 15+ rules covering SQL injection, RCE, hardcoded credentials, weak crypto, mass assignment, and LFI
  • 🎭 Blade XSS scanner — detects unescaped {!! !!} output and raw input rendering in templates
  • 🛣️ Route & middleware audit — flags admin routes without auth, API routes without auth:sanctum, login routes without throttle, and CSRF exceptions
  • 📦 Dependency CVE feed — queries the OSV.dev API for real CVEs across all composer.lock packages
  • ⚙️ Configuration audit — inspects .env (DEBUG, APP_KEY, APP_ENV, secure cookies) and config/cors.php
  • 🗂️ Project metadata — reads composer.json to identify Laravel and PHP version constraints
  • 💥 Active attack simulation — fires HTTP probes (SQL injection, XSS, CSRF, auth bypass, rate limiting) against a running app
  • 🔒 Path traversal prevention — strict allowlist enforcement for all file operations
  • ✂️ Secret redaction — sensitive values are masked in textual output before reaching the MCP client
  • 🚀 stdio transport — zero-config network; works inside any IDE that supports MCP

MCP Tools

The server exposes 8 tools. All static tools accept a single path parameter. attack_simulate additionally requires a baseUrl.

ToolInputDescription
project_infopathReturns metadata from composer.json: project name, Laravel/PHP version constraints, engine info.
dependency_auditpathParses composer.lock and queries OSV.dev for real CVEs with severity and fix versions.
config_auditpathInspects .env (DEBUG, APP_KEY, APP_ENV, session cookies) and config/cors.php (wildcard origins).
code_scanpath15+ static pattern rules across all PHP files — credentials, weak crypto, mass assignment, RCE, LFI, SQL injection.
blade_scanpathScans resources/views/ Blade templates for unescaped output ({!! !!}) and XSS-prone patterns.
route_auditpathAudits route files and middleware for missing auth, missing throttle, and CSRF exception wildcards.
attack_simulatepath + baseUrlFires 6 live HTTP probes against a running app: SQL injection, XSS, CSRF, auth bypass, rate limiting, error disclosure.
full_auditpathRuns dependency_audit + config_audit + code_scan + blade_scan + route_audit in parallel and returns a consolidated report.

Code Scan — Detected Patterns

PatternSeverityFinding Type
->whereRaw(HighSQL_INJECTION
DB::raw(MediumRAW_SQL_USAGE
unserialize(CriticalUNSAFE_UNSERIALIZE
shell_exec( / exec( / system( / passthru(CriticalRCE_RISK
eval(CriticalEVAL_USAGE
password = 'literal'CriticalHARDCODED_PASSWORD
api_key = 'literal'CriticalHARDCODED_API_KEY
Long hardcoded tokens/secretsHighHARDCODED_SECRET
md5(HighWEAK_HASH_MD5
sha1(MediumWEAK_HASH_SHA1
protected $guarded = []HighMASS_ASSIGNMENT_UNGUARDED
file_get_contents($request…)CriticalPATH_TRAVERSAL_RISK
include/require($request…)CriticalLFI_RISK

Audit Report Schema

Every tool returns a structured JSON report:

{
  "summary": {
    "critical": 0,
    "high": 1,
    "medium": 2,
    "low": 0,
    "info": 1
  },
  "findings": [
    {
      "severity": "high",
      "type": "SQL_INJECTION",
      "title": "Potential SQL injection via whereRaw",
      "file": "app/Http/Controllers/UserController.php",
      "line": 42,
      "evidence": "->whereRaw('email = ' . $email)",
      "recommendation": "Avoid raw SQL with user input. Use parameter binding/query builder."
    }
  ],
  "metadata": {
    "scannedPath": "/absolute/path/to/laravel-project",
    "engine": "Laraguard MCP",
    "version": "3.0.0",
    "timestamp": "2025-01-01T00:00:00.000Z",
    "durationMs": 312
  }
}

Architecture

src/
├── index.ts      — MCP server bootstrap and tool registration
├── config.ts     — Environment variable loading and validation
├── security.ts   — Path allowlist enforcement and secret redaction
├── files.ts      — Safe file enumeration and reading
├── tools.ts      — Audit tool implementations
├── reports.ts    — Report aggregation and severity summarization
└── types.ts      — Domain types (Finding, AuditReport, Severity, etc.)

Runtime stack:

ComponentTechnology
RuntimeNode.js 20+
LanguageTypeScript 5.x
ProtocolModel Context Protocol (MCP)
Transportstdio
Schema validationZod
MCP SDK@modelcontextprotocol/sdk

Requirements

  • Node.js 20 or higher
  • npm 10 or higher

Verify your environment:

node -v
npm -v

Installation

Clone the repository and install dependencies:

git clone https://github.com/ecr17dev/Laraguard-MCP.git
cd "Laraguard MCP"
npm install

Configuration

Copy the example environment file and customise it:

cp .env.example .env

Environment Variables

VariableDefaultDescription
MCP_BASE_PATHSingle allowed root path for project scanning.
MCP_BASE_PATHSComma-separated list of allowed root paths. Takes precedence over MCP_BASE_PATH.
MCP_MAX_FILES5000Maximum number of files to enumerate per scan.
MCP_MAX_FILE_SIZE_BYTES300000Maximum file size (in bytes) to read per file.
MCP_TIMEOUT_SECONDS30Logical timeout for audit operations.

Priority order: MCP_BASE_PATHSMCP_BASE_PATH → current working directory.

Example .env

# Allow scanning two project roots
MCP_BASE_PATHS="/Users/yourname/projects/my-laravel-app,/srv/workspaces/api"

# Scan limits
MCP_MAX_FILES=5000
MCP_MAX_FILE_SIZE_BYTES=300000
MCP_TIMEOUT_SECONDS=30

Development

Available Scripts

CommandDescription
npm run devRuns the MCP server directly from TypeScript source using tsx (recommended for development)
npm run buildCompiles TypeScript to dist/
npm run startRuns the compiled server from dist/index.js
npm run checkType-checks the project without emitting output

Running in Development Mode

npm run dev

Building for Production

npm run check   # Validate types first
npm run build   # Emit to dist/
npm run start   # Run compiled output

Integration with MCP Clients

Generic MCP Configuration (JSON)

Add the following to your MCP client's configuration file, replacing the path with the absolute path to your installation:

{
  "mcpServers": {
    "laraguard": {
      "command": "node",
      "args": ["/absolute/path/to/Laraguard MCP/dist/index.js"],
      "env": {
        "MCP_BASE_PATHS": "/absolute/path/to/your-laravel-project"
      }
    }
  }
}

Using Development Mode (tsx)

If you prefer to run without building first:

{
  "mcpServers": {
    "laraguard": {
      "command": "npx",
      "args": ["tsx", "/absolute/path/to/Laraguard MCP/src/index.ts"],
      "env": {
        "MCP_BASE_PATHS": "/absolute/path/to/your-laravel-project"
      }
    }
  }
}

Cursor IDE

Open Settings → MCP and paste the JSON block above. Cursor will detect the server on the next reload.

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) and add the laraguard entry under mcpServers.


Tool Usage Reference

project_info

{ "path": "/absolute/path/to/laravel-project" }

Returns basic project metadata without performing any security checks. Use it to confirm the target is a valid Laravel project and inspect framework and PHP version constraints before auditing.


dependency_audit

{ "path": "/absolute/path/to/laravel-project" }

Parses composer.lock, extracts all locked package names and versions, and queries the OSV.dev batch API for known CVEs. Each vulnerability is returned as a finding with:

  • CVE/GHSA identifier and summary
  • Severity (mapped from CVSS score)
  • Affected package version and recommended fix version
  • Direct link to the advisory page

config_audit

{ "path": "/absolute/path/to/laravel-project" }
CheckFileSeverity
APP_DEBUG=true.envHigh
APP_ENV=local.envMedium
APP_KEY= (empty).envCritical
SESSION_SECURE_COOKIE=false.envMedium
Wildcard CORS origin ('*')config/cors.phpMedium

code_scan

{ "path": "/absolute/path/to/laravel-project" }

Performs line-by-line static analysis across all PHP files. Returns every matching finding with file path, line number, and evidence snippet. See the Code Scan — Detected Patterns table above for the full rule set.


blade_scan

{ "path": "/absolute/path/to/laravel-project" }

Scans all .blade.php files under resources/views/ for XSS-prone output patterns:

CheckSeverity
{!! $variable !!} — unescaped variableHigh
{!! request( !!} / {!! old( !!} — raw user inputCritical
echo $_GET / echo $_POST in blade PHP blocksHigh

route_audit

{ "path": "/absolute/path/to/laravel-project" }

Reads routes/web.php, routes/api.php, and app/Http/Middleware/VerifyCsrfToken.php:

CheckFileSeverity
Admin/dashboard route without auth middlewareroutes/web.phpCritical
API route without auth:sanctum / auth:apiroutes/api.phpHigh
Login/register route without throttle middlewareRoute filesMedium
Wildcard pattern in VerifyCsrfToken::$exceptVerifyCsrfToken.phpHigh

attack_simulate

{
  "path": "/absolute/path/to/laravel-project",
  "baseUrl": "http://localhost:8000"
}

⚠️ Only use against local or staging environments. Never run against production.

Fires 6 live HTTP probes against the running application:

ProbeMethod & EndpointWhat it Tests
error_disclosureGET /__invalid_route__Framework/stack-trace info leakage
sql_injection_loginPOST /login with SQLi payloadSQL injection in login form
reflected_xssGET /search?q=<script>…Reflected XSS in search/query params
csrf_not_enforcedPOST /login without CSRF tokenCSRF token enforcement (expects HTTP 419)
auth_bypassGET /api/user without auth headerUnauthenticated access to protected API
rate_limit10× rapid POST /loginBrute-force rate limiting (expects HTTP 429)

The report includes a probes metadata array with the status code, duration, and triggered state for every probe.


full_audit

{ "path": "/absolute/path/to/laravel-project" }

Runs dependency_audit, config_audit, code_scan, blade_scan, and route_audit in parallel and merges all findings into a single consolidated report. The metadata includes per-section summaries.


Security Design

Laraguard MCP implements the following controls to ensure it operates safely even when handling untrusted project paths:

  • Strict path allowlisting — all file access is validated against MCP_BASE_PATHS / MCP_BASE_PATH; path traversal attempts are rejected immediately.
  • File count limit — configurable cap (MCP_MAX_FILES) prevents runaway enumeration on large monorepos.
  • File size limit — configurable cap (MCP_MAX_FILE_SIZE_BYTES) prevents memory exhaustion from binary or generated files.
  • Directory and extension exclusionsvendor/, node_modules/, .git/, and binary file types are excluded from scans.
  • Secret redaction — sensitive values (passwords, tokens, keys) are masked in textual output before being returned to the MCP client.
  • Attack simulation guardattack_simulate always targets only the explicitly provided baseUrl; no automated discovery or production detection is performed.

Important Notes

  • Laraguard MCP analyses a Laravel project as an external auditor — the Laravel application itself does not need to be running for static tools.
  • attack_simulate requires the application to be running and should never target production.
  • The server is framework-agnostic at the transport level: any client that supports MCP stdio can use it.
  • All findings are informational. Always combine automated scanning with manual code review and dedicated DAST/SAST tooling (OWASP ZAP, Burp Suite) for production security assessments.

License

This project is licensed under the MIT License. See LICENSE for details.

Server Config

{
  "mcpServers": {
    "laraguard": {
      "command": "node",
      "args": [
        "/absolute/path/to/Laraguard MCP/dist/index.js"
      ],
      "env": {
        "MCP_BASE_PATHS": "/absolute/path/to/your-laravel-project"
      }
    }
  }
}
Project Info
Created At
3 months ago
Updated At
3 months ago
Author Name
ecr17dev
Star
-
Language
-
License
-
Category
Tags

Recommend Servers

View All
Voyei

16 hours ago