php-sdk/examples/server
Repository files (latest commit first)
Filename Latest commit message Latest commit date
simon chrzanowski 863cfc1e78
[Server] feat: relax StrictOidcDiscoveryMetadataPolicy and add Dynamic Client Registration middleware (RFC 7591) (#269)
* feat: relax OIDC discovery policy and add Dynamic Client Registration middleware (RFC 7591)

- Add LenientOidcDiscoveryMetadataPolicy for providers that omit
  code_challenge_methods_supported (e.g. FusionAuth, Microsoft Entra ID)
- Keep StrictOidcDiscoveryMetadataPolicy RFC-aligned
- Add ClientRegistrationMiddleware handling POST /register and enriching
  /.well-known/oauth-authorization-server with registration_endpoint
- Update Microsoft example to use built-in LenientOidcDiscoveryMetadataPolicy

* fix: move metadata policy note under server.php in Files section

Address review comment: the LenientOidcDiscoveryMetadataPolicy bullet
was a behavioral note, not a file entry. Inline it into the server.php
description to keep the Files list consistent.

* fix: address Copilot review comments on ClientRegistrationMiddleware

- Decode JSON with assoc=true for registrar data so nested objects
  are associative arrays, not stdClass instances
- Add Cache-Control: no-store to all error responses (400), not just
  the success response (201)
- Rewind response body stream before returning unmodified response
  when metadata is not valid JSON, preventing empty body on read

* fix: harden ClientRegistrationMiddleware and improve test coverage

- Revert spurious .gitignore trailing newline
- Use JSON_THROW_ON_ERROR consistently in enrichAuthServerMetadata()
- Add comment clarifying the second json_decode in handleRegistration()
- Assert Cache-Control: no-store on registrar exception error response
- Add test for non-object JSON body in metadata enrichment path
- Extract createPlainTextHandler helper for non-JSON response tests

* fix: reject JSON array bodies in metadata enrichment

Treat JSON list arrays (e.g. [] or ["..."]) as invalid metadata in
enrichAuthServerMetadata() to prevent corrupting the response shape
by adding registration_endpoint to a non-object.

* fix: add RFC 7591 error codes, Content-Type validation, and docblock safety warning

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Christopher Hertel <mail@christopher-hertel.de>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 17:27:27 +02:00
..
cached-discovery Move examples to server directory (#198) 2025-12-27 15:39:05 +01:00
client-communication [Client] Feat: Implement MCP client component (#192) 2026-03-10 17:22:40 +01:00
client-logging Move examples to server directory (#198) 2025-12-27 15:39:05 +01:00
combined-registration Move examples to server directory (#198) 2025-12-27 15:39:05 +01:00
complex-tool-schema Use SchemaValidator to validate tool input (#203) 2026-01-11 21:46:53 +01:00
custom-dependencies Update codestyle based on updated Symfony rules (#229) 2026-02-01 11:54:31 +01:00
custom-method-handlers Move examples to server directory (#198) 2025-12-27 15:39:05 +01:00
discovery-calculator Move examples to server directory (#198) 2025-12-27 15:39:05 +01:00
discovery-userprofile Update codestyle based on updated Symfony rules (#229) 2026-02-01 11:54:31 +01:00
elicitation Add elicitation support for server-to-client user input requests (#228) 2026-02-15 23:34:19 +01:00
env-variables Update codestyle based on updated Symfony rules (#229) 2026-02-01 11:54:31 +01:00
explicit-registration Move examples to server directory (#198) 2025-12-27 15:39:05 +01:00
oauth-keycloak [Server] Oauth2 based on middleware (#221) 2026-03-10 17:10:07 +01:00
oauth-microsoft [Server] feat: relax StrictOidcDiscoveryMetadataPolicy and add Dynamic Client Registration middleware (RFC 7591) (#269) 2026-04-11 17:27:27 +02:00
schema-showcase Update codestyle based on updated Symfony rules (#229) 2026-02-01 11:54:31 +01:00
bootstrap.php [Client] Feat: Implement MCP client component (#192) 2026-03-10 17:22:40 +01:00
README.md [Client] Feat: Implement MCP client component (#192) 2026-03-10 17:22:40 +01:00

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:

# 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:

npx @modelcontextprotocol/inspector php examples/server/discovery-calculator/server.php

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:

npx @modelcontextprotocol/inspector -e DEBUG=1 -e FILE_LOG=1 php examples/server/discovery-calculator/server.php