docs/stateless-lifecycle.md walks the revision end to end - per-request _meta, server/discover, multi round-trip requests, caching and subscriptions - and a runnable example on each side shows what that looks like in code. CI matrixes both conformance roles over both revisions. --spec-version is cumulative across the dated revisions, so 2025-11-25 covers the two before it; 2026-07-28 is not cumulative with them and needs its own run against its own baseline. The runner is pinned so a PR only goes red for reasons in the PR, and conformance-weekly tracks the moving target instead - on both revisions, since the draft scenarios ship only on the alpha dist-tag. The Inspector cannot reach a modern-lifecycle server (it opens with initialize), so the example is covered by integration tests instead: one drives it with hand-built HTTP the way a conforming client would, one drives it with this SDK's client, and one drives the single endpoint from both eras.
61 lines
2.2 KiB
Markdown
61 lines
2.2 KiB
Markdown
# MCP SDK Examples
|
|
|
|
This directory contains various examples of how to use the PHP MCP SDK.
|
|
|
|
You can run the examples with the dependencies already installed in the root directory of the SDK.
|
|
The bootstrapping of the example will choose the used transport based on the SAPI you use.
|
|
|
|
For running an example, you execute the `server.php` like this:
|
|
```bash
|
|
# For using the STDIO transport:
|
|
php examples/server/discovery-calculator/server.php
|
|
|
|
# For using the Streamable HTTP transport:
|
|
php -S localhost:8000 examples/server/discovery-userprofile/server.php
|
|
```
|
|
|
|
You will see debug outputs to help you understand what is happening.
|
|
|
|
Run with Inspector:
|
|
|
|
```bash
|
|
npx @modelcontextprotocol/inspector php examples/server/discovery-calculator/server.php
|
|
```
|
|
|
|
## The 2026-07-28 lifecycle
|
|
|
|
`stateless-lifecycle/server.php` speaks protocol revision `2026-07-28`, which removed the `initialize`
|
|
handshake and protocol-level sessions. It is HTTP-only and cannot be driven by the Inspector, which
|
|
opens with `initialize`:
|
|
|
|
```bash
|
|
php -S 127.0.0.1:8000 examples/server/stateless-lifecycle/server.php
|
|
```
|
|
|
|
Every request carries its own protocol version and client capabilities, so a call is a single POST with
|
|
no handshake before it:
|
|
|
|
```bash
|
|
curl -sS http://127.0.0.1:8000/ \
|
|
-H 'Content-Type: application/json' \
|
|
-H 'Accept: application/json, text/event-stream' \
|
|
-H 'MCP-Protocol-Version: 2026-07-28' \
|
|
-H 'Mcp-Method: server/discover' \
|
|
-d '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{
|
|
"io.modelcontextprotocol/protocolVersion":"2026-07-28",
|
|
"io.modelcontextprotocol/clientCapabilities":{}}}}'
|
|
```
|
|
|
|
`tests/Integration/StatelessLifecycleTest.php` drives this example end to end — discovery, a tool call,
|
|
the multi round-trip flow, and the response stream carrying progress and log notifications.
|
|
|
|
## Debugging
|
|
|
|
You can enable debug output by setting the `DEBUG` environment variable to `1`, and additionally log to a file by
|
|
setting the `FILE_LOG` environment variable to `1` as well. A `dev.log` file gets written within the example's
|
|
directory.
|
|
|
|
With the Inspector you can set the environment variables like this:
|
|
```bash
|
|
npx @modelcontextprotocol/inspector -e DEBUG=1 -e FILE_LOG=1 php examples/server/discovery-calculator/server.php
|
|
```
|