Grades are a hygiene check, not a security guarantee.

MCP, MCP server

Laravel MCP Companion

formerly Laravel Docs MCP Server

Compatibility: Not stated.

Grade C

One Medium finding. Read the findings before installing.

Graded by PlugVetRubric v2

Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.

INSTALL_REMOTE_SCRIPT

Why this grade

  • INSTALL_REMOTE_SCRIPT Medium

    Fetches a script from the network and runs it (a pipe to a shell, or an install hook with a URL).

    .harness/orgs/default/projects/laravel_mcp_companion/pipelines/ci.yaml, line 53 curl -LsSf --retry 3 --retry-delay 2 https://astral.sh/uv/install.sh | sh

Any High, or two or more Medium findings, give D. One Medium gives C. Low findings or a security Note give B. Each code names a finding behind the letter.

Grades are a hygiene check of the source at the commit shown, on the date checked, not a security audit or a guarantee. The free directory grades are automated. Before release, a PlugVet engineer reviews every paid report and any grade we hold back, including all F grades, against the source code and the evidence we quote.

What was checked

Plain notes from the hygiene checks.

  • Permissions

    Concern

    can delete files.

    PERMISSION_DELETE_FILES

    docs_updater.py, line 1118

    shutil.rmtree(target_dir)

    docs_updater.py, line 1728

    shutil.rmtree(item)

    docs_updater.py, line 1750

    shutil.rmtree(source_dir.parent) # Remove the temporary directory

    Show more

    laravel_mcp_companion.py, line 2773

    os.remove(file_path)

    docs/superpowers/plans/2026-08-02-coverage-and-e2e.md, line 119

    - [ ] `tests/e2e/conftest.py`: session fixture building a temp docs tree (reuse `test_docs_dir`-style content builder); `stdio_client()` helper → `fastmcp.Client` with a `PythonStd

  • Install and update

    Serious

    install fetches a script from the network.

    INSTALL_REMOTE_SCRIPT

    docs/10.x/installation.md, line 155

    curl -s "https://laravel.build/example-app" | bash

    docs/10.x/installation.md, line 186

    curl -s https://laravel.build/example-app | bash

    .harness/orgs/default/projects/laravel_mcp_companion/pipelines/ci.yaml, line 53

    curl -LsSf --retry 3 --retry-delay 2 https://astral.sh/uv/install.sh | sh

    Show more

    docs/10.x/installation.md, line 226

    curl -s https://laravel.build/example-app | bash

    docs/10.x/installation.md, line 252

    curl -s "https://laravel.build/example-app?with=mysql,redis" | bash

    docs/10.x/installation.md, line 260

    curl -s "https://laravel.build/example-app?with=mysql,redis&devcontainer" | bash

    docs/11.x/installation.md, line 233

    curl -s "https://laravel.build/example-app" | bash

    docs/11.x/installation.md, line 270

    curl -s https://laravel.build/example-app | bash

    docs/11.x/installation.md, line 316

    curl -s https://laravel.build/example-app | bash

    docs/11.x/installation.md, line 348

    curl -s "https://laravel.build/example-app?with=mysql,redis" | bash

    docs/11.x/installation.md, line 356

    curl -s "https://laravel.build/example-app?with=mysql,redis&devcontainer" | bash

    requirements.txt, line 1

    fastmcp[code-mode,tasks]>=3.4.5,<4

    .harness/orgs/default/projects/laravel_mcp_companion/pipelines/ci.yaml, line 173

    curl -fsSL https://fnm.vercel.app/install | bash

    .harness/orgs/default/projects/laravel_mcp_companion/pipelines/docs_update.yaml, line 63

    curl -LsSf --retry 3 --retry-delay 2 https://astral.sh/uv/install.sh | sh

    docs/8.x/installation.md, line 65

    curl -s "https://laravel.build/example-app" | bash

    docs/8.x/installation.md, line 94

    curl -s https://laravel.build/example-app | bash

    docs/8.x/installation.md, line 125

    curl -s https://laravel.build/example-app | bash

    docs/8.x/installation.md, line 150

    curl -s "https://laravel.build/example-app?with=mysql,redis" | bash

    docs/8.x/starter-kits.md, line 30

    curl -s https://laravel.build/example-app | bash

    docs/9.x/installation.md, line 101

    curl -s "https://laravel.build/example-app" | bash

    docs/9.x/installation.md, line 132

    curl -s https://laravel.build/example-app | bash

    docs/9.x/installation.md, line 164

    curl -s https://laravel.build/example-app | bash

    docs/9.x/installation.md, line 190

    curl -s "https://laravel.build/example-app?with=mysql,redis" | bash

    docs/9.x/installation.md, line 198

    curl -s "https://laravel.build/example-app?with=mysql,redis&devcontainer" | bash

  • Network

    Concern

    can reach a host that is not written as a fixed address.

    NETWORK_NO_FIXED_HOST

    docs_updater.py, line 273

    with urllib.request.urlopen(request, timeout=DEFAULT_REQUEST_TIMEOUT) as response:

    docs_updater.py, line 649

    with urllib.request.urlopen(request, timeout=DEFAULT_REQUEST_TIMEOUT) as response:

    docs_updater.py, line 1432

    with urllib.request.urlopen(request, timeout=DEFAULT_REQUEST_TIMEOUT) as response:

    Show more

    docs_updater.py, line 1534

    with urllib.request.urlopen(request, timeout=DEFAULT_REQUEST_TIMEOUT) as response:

    docs_updater.py, line 1634

    with urllib.request.urlopen(request, timeout=DEFAULT_REQUEST_TIMEOUT) as response, open(zip_path, 'wb') as out_file:

    docs_updater.py, line 2086

    with urllib.request.urlopen(request, timeout=DEFAULT_REQUEST_TIMEOUT) as response:

    docs_updater.py, line 2107

    with urllib.request.urlopen(request, timeout=DEFAULT_REQUEST_TIMEOUT) as response:

    docs_updater.py, line 2419

    with urllib.request.urlopen(request, timeout=DEFAULT_REQUEST_TIMEOUT) as response:

  • Secrets

    Concern

    reads a credential or environment file.

    SECRETS_ENV_READ SECRETS_PATH_DOTENV

    laravel_mcp_companion.py, line 1479

    static_tokens = os.environ.get("AUTH_STATIC_TOKENS", "").strip()

    .gitignore, line 24

    venv/

    docs/10.x/billing.md, line 155

    Next, you should configure your Stripe API keys in your application's `.env` file. You can retrieve your Stripe API keys from the Stripe control panel:

    Show more

    docs/10.x/billing.md, line 164

    > You should ensure that the `STRIPE_WEBHOOK_SECRET` environment variable is defined in your application's `.env` file, as this variable is used to ensure that incoming webhooks ar

    docs/10.x/billing.md, line 169

    The default Cashier currency is United States Dollars (USD). You can change the default currency by setting the `CASHIER_CURRENCY` environment variable within your application's `.

    docs/10.x/billing.md, line 209

    Cashier allows you to specify the log channel to be used when logging fatal Stripe errors. You may specify the log channel by defining the `CASHIER_LOGGER` environment variable wit

    docs/10.x/billing.md, line 1750

    To enable webhook verification, ensure that the `STRIPE_WEBHOOK_SECRET` environment variable is set in your application's `.env` file. The webhook `secret` may be retrieved from yo

    docs/10.x/broadcasting.md, line 121

    Next, you will need to change your broadcast driver to `pusher` in your `.env` file:

    docs/10.x/broadcasting.md, line 152

    Next, you will need to change your broadcast driver to `ably` in your `.env` file:

  • Agent instructions

    Pass

    No instruction to ignore earlier instructions or to hide a step.

  • Obfuscation

    Concern

    contains an encoded blob in a file that should be readable.

    OBFUSCATION_ENCODED_BLOB

    uv.lock, line 1

    version = 1

    docs/13.x/processes.md, line 1

    # Processes

    docs/10.x/mcp.md, line 1114

    ![Authorization screen example](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABOAAAAROCAMAAABKc73cAAAA81BMVEX////7+/v4+PgXFxfl5eUKCgr9/f1zc3P29vby8vLs7Ozj4+Pp6env7++RkZF5eXlRUVF9fX

    Show more

    docs/11.x/mcp.md, line 1114

    ![Authorization screen example](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABOAAAAROCAMAAABKc73cAAAA81BMVEX////7+/v4+PgXFxfl5eUKCgr9/f1zc3P29vby8vLs7Ozj4+Pp6env7++RkZF5eXlRUVF9fX

    docs/12.x/mcp.md, line 1431

    ![Authorization screen example](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABOAAAAROCAMAAABKc73cAAAA81BMVEX////7+/v4+PgXFxfl5eUKCgr9/f1zc3P29vby8vLs7Ozj4+Pp6env7++RkZF5eXlRUVF9fX

    docs/13.x/mcp.md, line 1763

    ![Authorization screen example](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABOAAAAROCAMAAABKc73cAAAA81BMVEX////7+/v4+PgXFxfl5eUKCgr9/f1zc3P29vby8vLs7Ozj4+Pp6env7++RkZF5eXlRUVF9fX

  • Licence

    Pass

    A licence file is present (LICENSE).

  • Maintainer activity

    Pass

    The latest commit is within the last 365 days.

Note

Hygiene check of commit f3039d6195c1. can delete files. install fetches a script from the network. can reach a host that is not written as a fixed address. reads a credential or environment file. contains an encoded blob in a file that should be readable.

Date and source

Date checked:

View source

github.com

Commit graded: f3039d6195c108b0c619cdda545bf67d94c70d54

This link goes to the original host. PlugVet does not host or check what you download from there, and installing it is your own decision and risk.

Read how this letter is chosen