php-llm/mcp-bundle
A Symfony bundle that turns your app into a Model Context Protocol server for AI clients. Register tools, resources, and prompts with PHP attributes, then expose them over JSON-RPC transports such as stdio and HTTP.
Basis of assessment: Release 0.1 is the first public cut of php-llm/mcp-bundle. Evidence available is limited to three merged PRs and a changelog; there is no prior assessment and no API documentation or production usage data to draw on. Treat the confidence level here as low-to-moderate and validate before committing.
Architecture fit: The bundle is a thin integration layer over php-llm/mcp-sdk, not a standalone MCP implementation. That is the right shape for our purposes — we want MCP server/client transport wiring, not a forked protocol stack. The addition of client transports in 0.1 is the most strategically relevant item: it means the package can act in both directions (exposing our capabilities to LLM clients and consuming external MCP servers), which is what most of our roadmap scenarios actually require. The downside of a thin-wrapper design is that our API surface is effectively someone else's SDK surface, and their release cadence becomes ours.
Integration feasibility: Mechanically straightforward — Composer install, version-constrained, no infrastructure prerequisites. The open question is framework convention. The package is named and structured as a bundle, which is Symfony's terminology for a DI/extension package; Laravel integration would depend on a service provider, publishable config, and container bindings being present or trivially wrappable. This is a 30-minute spike, not a research project, but it must be done before we size anything. Do not assume Laravel first-class support from the package name alone.
Technical risk: Elevated, and concentrated in three places. First, the maintainers shipped an explicit WIP disclaimer in 0.1 — they are telling us the public API is not settled. Second, the bundle is hard-pinned to mcp-sdk 0.1; any SDK fix or MCP spec change requires a coordinated bundle release, so we inherit an external release gate on our own timelines. Third, the contributor base is a single author across all three PRs, which is a bus-factor and responsiveness risk for a dependency sitting in our LLM integration path. None of these are disqualifying at 0.1, but together they mean this belongs behind an internal abstraction boundary from day one.
Key questions:
Stack fit: Good conceptual fit, unproven framework fit. The package's value proposition — MCP transport plumbing without owning the protocol — aligns with our preference for adopting standards early and building thin adapters. The risk is that "bundle" implies Symfony idioms; we should plan for a small internal adapter layer regardless, so that a future framework-convention mismatch doesn't leak into application code.
Migration path: There is nothing to migrate from, which is both the advantage and the trap. Greenfield means no legacy contract to honor, but it also means no production-hardening precedent to inherit. Introduce this as a new, isolated capability behind a feature flag rather than weaving it into an existing service boundary. Our internal abstraction should expose the operations we care about (register tool, handle invocation, route transport), not re-export the SDK's types.
Compatibility: The hard pin to mcp-sdk 0.1 is the defining compatibility constraint. Two consequences: our composer constraints must lock the bundle and SDK together as a pair (never resolve them independently), and we should expect that adopting a newer SDK means adopting a newer bundle, not just bumping a version. Assume zero backward-compatibility guarantee across 0.1.x and design the adapter so an API change is a localized edit.
Sequencing:
Maintenance: Low ongoing effort if the adapter boundary holds; high if we let SDK types into application code. Budget for upgrade work on the SDK's cadence rather than ours. We should track upstream releases explicitly (watch the repo, pin deliberately, upgrade in planned windows) rather than relying on Composer to surface changes.
Support: Effectively self-support. One contributor, WIP status, and no evidence of a support channel or SLA. Internal documentation and the contract tests become the institutional memory — this is a real, if modest, cost and should be assigned to a named owner rather than assumed.
Scaling: Unknown and untested at our volumes. The bundle is transport wiring, so scaling characteristics will mostly be a function of transport choice and our own handler implementations. The specific thing to measure in the pilot is behavior under concurrent tool invocations and long-lived connections, since that is where thin MCP layers typically show their limits.
Failure modes: (a) Upstream stalls — a needed SDK fix or spec adaptation doesn't land, and we're blocked; mitigate by keeping the adapter thin enough to fork or vendor. (b) Silent breakage on a 0.1.x bump — mitigate with pinned lockfiles plus contract tests in CI. (c) Security exposure from a transport enabled by default or misconfigured auth — mitigate by reviewing defaults before the pilot and confining the initial deployment. (d) Framework-convention drift if the package later commits to Symfony-style patterns — mitigate by never letting its types cross the adapter.
Ramp-up: Low for a PHP developer already fluent in Laravel or Symfony DI; the MCP concepts (tools, transports, client/server roles) are the actual learning curve, not the code. Estimate a day to a working spike, plus meaningful time on the protocol model and security posture before anyone ships it to a shared environment. Note that the WIP disclaimer means developers will be reading source rather than documentation — plan for that in the estimate.
How can I help you explore Laravel packages today?