Laravel MCP Companion

io.github.brianirish由 GitHub 帳號 brianirish 發布v0.13.0更新於 Oct 24, 2026

Laravel documentation aggregator: multi-version core docs, services, packages, learning paths.

已驗證STDIO僅桌面知識與記憶開發者工具

概覽

AI 產生的概覽

Laravel 文件彙整伺服器,讓助理搜尋、瀏覽並閱讀多版本 Laravel 核心文件、服務文件、套件文件與學習路徑。

可以做什麼
  • 跨核心版本、服務、套件與學習資源搜尋 Laravel 文件,回傳依相關度排序的章節結果並可依來源篩選
  • 讀取單一文件章節,列出分類,並依入門、進階或高階難度篩選內容
  • 用自然語言描述需求來尋找相關文件,跟隨精選學習路徑並取得關聯資源
  • 查詢精選套件推薦、整合指南以及套件之間的相容性說明
  • 透過更新工具重新整理 Laravel 服務與社群套件的文件
適用情境
適合在學習或研究 Laravel 時使用,讓助理依據 Laravel 專屬參考資料而非一般知識作答,包括舊版框架文件、Forge、Vapor、Nova、Envoy 文件以及常用社群套件。它著重於查閱與學習,而非結合專案情境的程式碼產生。
執行需求
以 stdio 在本機執行,通常使用 ghcr.io 上的 Docker 映像,需要安裝 Docker。未宣告帳號、API 金鑰或環境變數。文件隨映像一起發布,更新需拉取新映像或啟用更新選項。可選的 HTTP 模式提供主機、CORS、驗證與限流參數。
安裝前請注意
標示為 beta 軟體,功能與工具介面可能變動。HTTP 模式下預設關閉驗證,任何能連上該連接埠的人都能呼叫全部工具;啟用 bearer 權杖驗證需設定 AUTH_JWKS_URI、AUTH_ISSUER 與 AUTH_AUDIENCE,開發用靜態權杖來自 AUTH_STATIC_TOKENS。實驗性的 code 轉換模式會暴露程式碼執行端點,不應公開提供。更新選項會從第三方網站抓取文件。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Laravel MCP Companion,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Laravel MCP Companion

formerly Laravel Docs MCP Server

[GitHub release (latest by date)] [Python Version] [GitHub Workflow Status] [codecov] [License] [Docker Image] [GitHub Stars] [GitHub Forks]

⚠️ BETA SOFTWARE - This project is in active development. Features may change and breaking changes may occur.

Laravel MCP Companion is a documentation aggregator and navigator for the Laravel ecosystem. It centralizes and organizes high-quality documentation from across the Laravel ecosystem, making it easily discoverable through your AI assistant.

How It Compares

FeatureLaravel BoostContext7Laravel MCP Companion
FocusCode generationGeneral docsLaravel documentation
Best forActive developmentAny libraryLearning & reference
Project-aware context✅❌❌
Laravel multi-version support (6.x - latest)❌❌✅
Laravel service docs (Forge, Vapor, Nova, Envoyer)❌❌✅
Learning paths & difficulty levels❌❌✅
"I need X" documentation finder❌❌✅
Curated Laravel package recommendations❌❌✅
Offline documentation access❌❌✅
TOON format output (30-60% fewer tokens)❌❌✅
General documentation (non-Laravel)❌✅❌

Use Boost when writing code and you need project-aware context. Use Context7 for non-Laravel libraries. Use Companion when learning, researching, or need Laravel documentation reference.

What you get:

  • Multi-version Laravel documentation (6.x through latest) with enhanced search
  • Learning paths - Structured learning sequences by topic and skill level
  • "I need X" finder - Describe what you need, get relevant documentation
  • Difficulty filtering - Content organized by beginner/intermediate/advanced
  • 15 semantic categories - Browse documentation by topic area
  • Auto-discovery Laravel services - Forge, Vapor, Envoyer, Nova (117+ sections)
  • Community package documentation - 42,000+ lines from Spatie, Livewire, Inertia, Filament
  • Package integration guides - Installation and setup for 22 curated packages
  • Cross-package compatibility - Learn which packages work well together
  • Unified search across core Laravel docs, services, packages, and learning resources
  • Daily updates - Automatically syncs with latest documentation

Installation

Listed in the official MCP Registry as io.github.brianirish/laravel-mcp-companion — clients with registry support can install it from there directly. Manual setup:

Claude Desktop

  1. Open Claude Desktop Settings

    • Click Claude menu → Settings → Developer → Edit Config
  2. Add to your configuration file:

    json
    {  "mcpServers": {    "laravel-mcp-companion": {      "command": "docker",      "args": ["run", "--rm", "-i", "ghcr.io/brianirish/laravel-mcp-companion:latest"]    }  }}
  3. Restart Claude Desktop for changes to take effect

Config file locations:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

Claude Code

Use the claude mcp add command:

bash
# Add with Dockerclaude mcp add laravel-mcp-companion -- docker run --rm -i ghcr.io/brianirish/laravel-mcp-companion:latest
# Or add to project-specific config (for team sharing)claude mcp add laravel-mcp-companion --scope project -- docker run --rm -i ghcr.io/brianirish/laravel-mcp-companion:latest

The --scope project option creates a .mcp.json file in your project root that can be committed to version control.

Configuration Options

These options can be used with the Docker command. For example:

bash
# Pin to a specific older Laravel versiondocker run --rm -i ghcr.io/brianirish/laravel-mcp-companion:latest --version 11.x
# Force update all documentationdocker run --rm -i ghcr.io/brianirish/laravel-mcp-companion:latest --force-update
OptionDescriptionDefault
--version VERSIONLaravel version (e.g., "11.x", "12.x")Latest
--docs-path PATHDocumentation directory./docs
--log-level LEVELDEBUG, INFO, WARNING, ERROR, CRITICALINFO
--update-docsUpdate documentation on startupfalse
--force-updateForce documentation updatefalse
--transform-mode MODETool exposure mode: search, code, or none (env: TRANSFORM_MODE)search
--host HOSTInterface to bind in HTTP mode (env: HOST)127.0.0.1 (0.0.0.0 in Docker)
--cors-origin ORIGINBrowser origin allowed to call the HTTP transport, repeatable (env: CORS_ORIGINS)none (CORS off)
--allowed-host HOSTAdditional Host header accepted in HTTP mode, repeatable (env: ALLOWED_HOSTS)localhost, 127.0.0.1, ::1
--auth-jwks-uri URIJWKS endpoint enabling bearer-token auth in HTTP mode (env: AUTH_JWKS_URI)none (auth off)
--auth-issuer ISSUERRequired token issuer, with --auth-jwks-uri (env: AUTH_ISSUER)none
--auth-audience AUDRequired token audience, with --auth-jwks-uri (env: AUTH_AUDIENCE)none
--auth-required-scope SCOPEScope every token must carry, repeatable (env: AUTH_REQUIRED_SCOPES)none
--rate-limit RPSMCP requests/second accepted in HTTP mode; operational endpoints are never limited (env: RATE_LIMIT_RPS)none (no limiting)
--rate-limit-burst NToken-bucket burst capacity (env: RATE_LIMIT_BURST)max(10, 2×RPS)

Keeping documentation current

Documentation ships inside the image, and a new image is published whenever the documentation is refreshed, so :latest carries the most recently published snapshot. The catch is that docker run reuses the copy you already have — once you've pulled the image, you keep running it until you pull again. Refresh whenever you like:

bash
docker pull ghcr.io/brianirish/laravel-mcp-companion:latest

Or add --pull=always to your MCP config so every start checks for a newer image. It costs a moment of startup time and needs a working connection, so it's opt-in rather than the default:

jsonc
"args": ["run", "--rm", "-i", "--pull=always",         "ghcr.io/brianirish/laravel-mcp-companion:latest"]

You don't have to track this yourself. The server tells your assistant how old the documentation is for the Laravel version it's serving, so if you ask about something newer than that snapshot it will say so and offer to refresh instead of answering from stale pages. You can also just ask — "how current are your Laravel docs?"

To update in place without pulling a new image, --update-docs fetches fresh documentation for the selected Laravel version during startup. Documentation for Forge, Vapor, Nova, Envoyer and community packages refreshes separately, through the update_external_laravel_docs tool your assistant can call.

With --rm the download is discarded when the container exits, so it repeats on every start. A named volume keeps it — but note the trade-off:

bash
docker run --rm -i -v laravel-mcp-docs:/app/docs \  ghcr.io/brianirish/laravel-mcp-companion:latest --update-docs

A volume overrides the image's documentation. Once populated it masks /app/docs, so pulling a newer image no longer updates what the server reads — the volume becomes your source of truth and --update-docs becomes the way you refresh it. Use a volume when you want to control updates explicitly; stick to plain docker pull if you'd rather the image stay in charge.

Transform Modes

By default the server no longer lists all of its tools. Instead it exposes a compact, search-first interface that keeps your AI client's context window lean:

  • search (default) — Exposes search_tools (BM25 relevance search over the tool catalog) and call_tool (proxy to invoke any underlying tool). search_laravel_docs stays pinned and directly callable.
  • code (experimental) — Exposes Code Mode meta-tools (tags, search, get_schema, execute) that let the client discover tools and orchestrate them with sandboxed Python. Requires the fastmcp[code-mode] extra (included in requirements.txt). Avoid exposing this publicly over HTTP — execute is a code execution endpoint.
  • none — Pre-0.9 behavior: every tool listed directly. Use this if your MCP client doesn't handle the synthetic search tools well.
bash
# Restore the old flat tool listingdocker run --rm -i ghcr.io/brianirish/laravel-mcp-companion:latest --transform-mode none

HTTP transport security

Authentication is off by default. Anyone who can reach the HTTP port can call every tool, so treat network exposure as granting full access to the documentation tree — or turn on bearer-token auth:

bash
# Validate tokens issued by a real OAuth 2.1 authorization serverpython laravel_mcp_companion.py --transport http \  --auth-jwks-uri https://auth.example/.well-known/jwks.json \  --auth-issuer https://auth.example \  --auth-audience laravel-mcp-companion
# Development only: fixed tokens from the environment (never a CLI flag,# so secrets stay out of process listings)AUTH_STATIC_TOKENS="my-token:my-client" python laravel_mcp_companion.py --transport http

The server is a resource server: it validates tokens, it never issues them. Issuer and audience are mandatory with --auth-jwks-uri — accepting any issuer's tokens, or tokens minted for another service, would be authentication theater. Unauthenticated requests get 401 with a WWW-Authenticate header (RFC 9728), and misconfiguration fails at startup rather than at request time. Auth applies to the HTTP transport only; stdio's access control is the process boundary.

Defaults are conservative:

  • Binds 127.0.0.1 outside Docker. Inside the container it binds 0.0.0.0, where the container boundary and explicit -p publishing are the access control.
  • Host and Origin validation is on, which blocks DNS-rebinding and drive-by-localhost attacks from a victim's browser.
  • CORS is disabled unless you pass --cors-origin. Wildcard origins are rejected; credentials are never allowed cross-origin.

Only localhost, 127.0.0.1, and ::1 are accepted as Host values out of the box. If you bind a non-loopback interface you must add the hostname clients actually use, or every request is rejected with 421:

bash
python laravel_mcp_companion.py --transport http \  --host 0.0.0.0 \  --allowed-host mcp.internal.example \  --cors-origin https://app.example

Requests with an unrecognized Host get 421; requests from an unlisted Origin get 403. Passing --allowed-host or --cors-origin on the command line replaces the corresponding environment variable rather than adding to it. If you expose this beyond localhost, put an authenticating reverse proxy in front of it. Avoid --transform-mode code over HTTP entirely — execute is a code execution endpoint.

Rate limiting (HTTP mode)

Off by default. --rate-limit 20 caps MCP requests — tool calls, searches, the protocol surface — at 20/second with a single global token bucket: a total throughput cap, not per-client fairness (without auth there is no reliable client identity to key on). The operational endpoints (/healthz, /metrics, /.well-known/...) are deliberately outside the limit: throttling a load balancer's health checks marks healthy instances down, and those handlers are trivial reads. The limit counts every MCP request including the initialize handshake, which is why the burst default stays at max(10, 2×RPS); keep the burst comfortably above your clients' handshake size if you lower it. Throttled requests receive a clean MCP error and succeed again once the bucket refills.

Operational endpoints (HTTP mode)

  • GET /healthz — liveness/readiness JSON, always public (load balancers can't do OAuth). ok and degraded both return 200 — degraded means the documentation copy is stale and a newer image should be pulled; 503 means no documentation is readable and traffic should not be routed here.
  • GET /metrics — Prometheus text format: per-tool call counters, a latency histogram, request counts, uptime, and documentation age. Public on unauthenticated deployments; requires a valid bearer token whenever auth is configured.

Features (v0.13.0)

Documentation Aggregation

  • Multi-version Laravel docs - All versions from 6.x to latest
  • Auto-discovery engine - Finds new docs across Forge, Vapor, Nova, Envoyer
  • Community package docs - 42,000+ lines from Spatie, Livewire, Inertia, Filament
  • Daily updates - Automatic sync with latest documentation

Learning & Discovery

  • Learning paths - Structured sequences for any Laravel topic, offered interactively: ask without naming one and the server asks which of the ten curated paths you want
  • Difficulty levels - Filter by beginner, intermediate, or advanced
  • 15 categories - Browse by authentication, database, testing, etc.
  • "I need X" finder - Natural language documentation discovery
  • Related resources - Find connected documentation automatically

Search & Navigation

  • Ranked section search - Ask in plain language ("how do I retry a failed queue job") and get the relevant sections ranked by relevance, each with a snippet, an anchor, and a source label
  • Section-level reads - Fetch just the section you need. A whole documentation file can exceed 30,000 tokens; a section is typically a few hundred, so answers leave room for your actual code
  • Use case mapping - Describe what you need, get relevant packages
  • Package integration guides - Installation and setup for 22 curated packages
  • Cross-package compatibility - Documentation for package combinations
  • Unified search - One search across every corpus: core versions, services, fetched package docs, and learning resources, with a sources filter to narrow it

MCP 2025-11-25 capabilities

  • Task-capable updates - Documentation updates run as MCP tasks: submit, poll, fetch the result, instead of holding the connection for minutes
  • Structured output - Tabular tools return structuredContent with real schemas alongside their TOON text
  • Elicitation - Interactive choices where they help, with plain listings as the fallback for clients without the capability
  • Registry listed - Installable from the official MCP Registry, with server.json metadata, .well-known discovery in HTTP mode, and automated publishing on release tags

Production Operations (HTTP mode)

  • Health & metrics - GET /healthz for load balancers and a Prometheus GET /metrics with per-tool counters, latency histogram, and docs age
  • OAuth 2.1 resource server - Optional bearer-token validation (JWKS or static dev tokens); misconfiguration fails at startup, outages fail closed
  • Rate limiting - Opt-in token bucket over the MCP surface with a handshake-aware burst default
  • Hardened by default - Loopback bind, Host/Origin validation, no wildcard CORS, path containment enforced identically for search, listing, and reads

Quality

  • 81% product coverage with an 80% CI gate, end-to-end tests over real stdio and HTTP transports, and report-only latency benchmarks — warm search p95 is a few milliseconds against the 100ms v1.0.0 target

Upcoming

  • v1.0.0: First stable release — API freeze, breaking-change policy, and an LTS commitment

For detailed roadmap information, see ROADMAP.md.

TOON Format Output

Laravel MCP Companion uses TOON (Token-Oriented Object Notation) for structured output, saving 30-60% on tokens compared to JSON/markdown.

Example Output

When you search for packages or list documentation, you get efficient structured data:

context: "authentication for SPA"count: 2packages[2]{id,name,description,categories,install}:  laravel/sanctum,Laravel Sanctum,"Featherweight authentication for SPAs",[authentication,spa],"composer require laravel/sanctum"  laravel/passport,Laravel Passport,"Full OAuth2 implementation",[authentication,api],"composer require laravel/passport"

Compare to the equivalent JSON (nearly 2x the tokens):

json
{"context":"authentication for SPA","count":2,"packages":[{"id":"laravel/sanctum","name":"Laravel Sanctum",...}]}

Why TOON?

  • Token efficient: LLMs understand TOON natively - no parsing overhead
  • Structured data: Arrays, objects, and metadata without JSON verbosity
  • AI-friendly: Designed specifically for LLM context windows

Auto-Discovery & Update Frequency

This application features an intelligent auto-discovery system that automatically finds and indexes Laravel documentation. Every day, it:

  • Auto-discovers new documentation sections across Laravel services (Forge, Vapor, Nova, Envoyer)
  • Retrieves the latest Laravel core documentation for all versions since 6.x
  • Fetches community package documentation (Spatie, Livewire, Inertia, Filament)
  • Adapts automatically to structural changes in documentation websites
  • Generates new patch releases automatically when updates are found

Development

Prerequisites

  • Python 3.12+
  • Node.js 18+ (for MCP Inspector)

Setup

bash
git clone https://github.com/brianirish/laravel-mcp-companioncd laravel-mcp-companionpython -m venv venvsource venv/bin/activate  # Windows: venv\Scripts\activatepip install -r requirements.txt -r requirements-dev.txt

Running Tests

bash
# All tests with coveragepytest --cov --cov-report=html
# Unit tests onlypytest tests/unit/
# Integration tests onlypytest tests/integration/
# Protocol compliance testspytest tests/protocol/ -m protocol

Manual Testing with MCP Inspector

The MCP Inspector provides a visual UI for testing MCP servers.

bash
# Launch Inspector (opens browser at http://localhost:6274)npx @modelcontextprotocol/inspector python laravel_mcp_companion.py
# With specific versionnpx @modelcontextprotocol/inspector python laravel_mcp_companion.py --version 11.x

Use the Inspector to:

  • Tools tab: Test all tools with auto-generated input forms
  • Resources tab: Browse laravel:// and laravel-external:// resources
  • Prompts tab: Test prompt templates

Code Quality

bash
ruff check --fix .     # Lintingmypy --ignore-missing-imports .  # Type checkingblack .                # Formatting

License

This project is licensed under the MIT License - see the LICENSE file for details.

Contributing

Contributions are welcome! See CONTRIBUTING.md for guidelines.

Acknowledgements

  • Laravel for their excellent documentation
  • Laravel package authors for their contributions to the ecosystem

來源:README.md,提交 80b6352

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.13.0最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分