Add roadmap to readme (#20)

* Update README.md

Add roadmap
Add a basic example
Fix default NullLogger() in ServerBuilder

* Update README.md

Update intro
Add roadmap
Add a basic example
Fix default NullLogger() in ServerBuilder
Add Credits

* Update src/Server/ServerBuilder.php

Co-authored-by: Christopher Hertel <mail@christopher-hertel.de>

* Fix code review comments

---------

Co-authored-by: Christopher Hertel <mail@christopher-hertel.de>
This commit is contained in:
Roman Pronskiy 2025-09-04 15:49:16 +02:00 • committed by GitHub
commit 8985be6af3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 115 additions and 10 deletions

113
README.md
View file

@ -1,15 +1,16 @@
# MCP PHP SDK
The official PHP SDK for Model Context Protocol (MCP). It provides a framework-agnostic API for implementing MCP servers in PHP.
> [!IMPORTANT]
> Currently we are still in the process of merging [Symfony's MCP SDK](https://github.com/symfony/mcp-sdk) and
> [PHP-MCP](https://github.com/php-mcp) components. Not all code paths are fully tested, complete or this package
> Currently, we are still in the process of merging [Symfony's MCP SDK](https://github.com/symfony/mcp-sdk) and
> [PHP-MCP](https://github.com/php-mcp) components. Not all code paths are fully tested, complete, or this package
> may contain duplicate functionality or dead code.
>
> If you want to help us stabilize the SDK, please see the
> [issue tracker](https://github.com/modelcontextprotocol/php-sdk/issues).
Low-level SDK implementation of the Model Context Protocol (MCP) in PHP.
This project is a collaboration between the [PHP Foundation](https://thephp.foundation/) and the
This project is a collaboration between [the PHP Foundation](https://thephp.foundation/) and the
[Symfony project](https://symfony.com/). It adopts development practices and standards from the Symfony project,
including [Coding Standards](https://symfony.com/doc/current/contributing/code/standards.html) and the
[Backward Compatibility Promise](https://symfony.com/doc/current/contributing/code/bc.html).
@ -17,12 +18,107 @@ including [Coding Standards](https://symfony.com/doc/current/contributing/code/s
Until the first major release, this SDK is considered
[experimental](https://symfony.com/doc/current/contributing/code/experimental.html).
## 🚧 Roadmap
Features
- [x] bring back php-mcp examples
- [ ] Glue handler, registry and reference handlers
- [ ] Revive `ServerBuilder`
- [ ] Revive transports
- [ ] Streamable Transport https://github.com/modelcontextprotocol/php-sdk/issues/7
- [ ] Http/SSE-based Transport https://github.com/modelcontextprotocol/php-sdk/issues/8
- [ ] Support pagination
- [ ] Support Schema validation
- [ ] Support Multiple Versions of MCP Specification https://github.com/modelcontextprotocol/php-sdk/issues/14
- [ ] (Re-)Implement missing Notification & Request Handlers https://github.com/modelcontextprotocol/php-sdk/issues/9
---
Examples working
- [x] 01-discovery-stdio-calculator
- [ ] 02-discovery-http-userprofile
- [x] 03-manual-registration-stdio
- [ ] 04-combined-registration-http
- [ ] 05-stdio-env-variables
- [ ] 06-custom-dependencies-stdio
- [ ] 07-complex-tool-schema-http
- [ ] 08-schema-showcase-streamable
- [ ] 09-standalone-cli
## Installation
```bash
composer require mcp/sdk
```
## ⚡ Quick Start: Stdio Server with Discovery
This example demonstrates the most common usage pattern - a `stdio` server using attribute discovery.
**1. Define Your MCP Elements**
Create `src/CalculatorElements.php`:
```php
<?php
namespace App;
use PhpMcp\Server\Attributes\McpTool;
use PhpMcp\Server\Attributes\Schema;
class CalculatorElements
{
#[McpTool(name: 'add_numbers')]
public function add(int $a, int $b): int
{
return $a + $b;
}
}
```
**2. Create the Server Script**
Create `mcp-server.php`:
```php
#!/usr/bin/env php
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use Mcp\Server;
use Mcp\Server\Transport\StdioTransport;
Server::make()
->withServerInfo('Stdio Calculator', '1.1.0', 'Basic Calculator over STDIO transport.')
->withDiscovery(__DIR__, ['.'])
->build()
->connect(new StdioTransport());
```
**3. Configure Your MCP Client**
Add to your client configuration (e.g., `mcp.json`):
```json
{
"mcpServers": {
"php-calculator": {
"command": "php",
"args": ["/absolute/path/to/your/mcp-server.php"]
}
}
}
```
**4. Test the Server**
Your AI assistant can now call:
- `add_numbers` - Add two integers
## Documentation
- [SDK documentation](doc/index.rst)
@ -30,6 +126,10 @@ composer require mcp/sdk
- [Model Context Protocol specification](https://spec.modelcontextprotocol.io)
- [Officially supported servers](https://github.com/modelcontextprotocol/servers)
## Examples of MCP Tools that use this SDK
- https://github.com/pronskiy/mcp
## Contributing
We are passionate about supporting contributors of all levels of experience and would love to see you get involved in
@ -37,6 +137,9 @@ the project. See the [contributing guide](CONTRIBUTING.md) to get started before
[report issues](https://github.com/modelcontextprotocol/php-sdk/issues) and
[send pull requests](https://github.com/modelcontextprotocol/php-sdk/pulls).
## Credits
The starting point for this SDK was [PHP-MCP](https://github.com/php-mcp/server) project, initiated by [Kyrian Obikwelu](https://github.com/CodeWithKyrian). We are grateful for the work done by Kyrian and other contributors to that repository, which created a solid foundation for this SDK.
## License
This project is licensed under the MIT License - see the LICENSE file for details.

View file

@ -216,19 +216,21 @@ final class ServerBuilder
*/
public function build(): Server
{
$container = $this->container ?? new Container();
$registry = new Registry(new ReferenceHandler($container), $this->eventDispatcher, $this->logger);
$logger = $this->logger ?? new NullLogger();
$this->registerManualElements($registry, $this->logger);
$container = $this->container ?? new Container();
$registry = new Registry(new ReferenceHandler($container), $this->eventDispatcher, $logger);
$this->registerManualElements($registry, $logger);
if (null !== $this->discoveryBasePath) {
$discovery = new Discoverer($registry, $this->logger);
$discovery = new Discoverer($registry, $logger);
$discovery->discover($this->discoveryBasePath, $this->discoveryScanDirs, $this->discoveryExcludeDirs);
}
return new Server(
Handler::make($registry, $this->serverInfo, $this->logger),
$this->logger,
Handler::make($registry, $this->serverInfo, $logger),
$logger,
);
}