* feat: implement discovery caching with state-based approach - Add DiscoveryState class to encapsulate discovered MCP capabilities - Add exportDiscoveryState and importDiscoveryState methods to Registry - Modify Discoverer to return DiscoveryState instead of void - Create CachedDiscoverer decorator for caching discovery results - Add importDiscoveryState method to ReferenceRegistryInterface - Update ServerBuilder to use caching with withCache() method - Update tests to work with new state-based approach - Add example demonstrating cached discovery functionality - Add PSR-16 SimpleCache and Symfony Cache dependencies * docs: add comprehensive discovery caching documentation - Add detailed documentation explaining discovery caching architecture - Include usage examples for different cache implementations - Document performance benefits and best practices - Add troubleshooting guide and migration instructions - Include complete API reference for all caching components - Fix PHPStan issues by regenerating baseline - Apply PHP CS Fixer formatting to all new files * refactor: address reviewer feedback and clean up discovery caching - Make DiscoveryState class final - Cache DiscoveryState objects directly instead of arrays (no serialization needed) - Rename exportDiscoveryState/importDiscoveryState to getDiscoveryState/setDiscoveryState - Add getDiscoveryState method to ReferenceRegistryInterface - Remove TTL parameter from CachedDiscoverer (no expiration by default) - Remove unused methods from DiscoveryState (toArray, fromArray, merge) - Simplify ServerBuilder to handle decoration internally - Make Discoverer.applyDiscoveryState() internal (no longer public API) - Simplify documentation to focus on user perspective - Remove unnecessary development comments - Update all tests to work with new architecture - All tests pass, PHPStan clean, code formatting applied * refactor: clean up comments and formatting in server.php example * refactor: improve code formatting and consistency in discovery classes and example server * Fix method names in cached discovery example - Change withServerInfo() to setServerInfo() - Change withDiscovery() to setDiscovery() - Change withLogger() to setLogger() - Fixes PHPStan static analysis errors * refactor: update method names in ServerBuilder for consistency - Change withCache() to setCache() in ServerBuilder - Update example and documentation to reflect method name changes - Ensure consistency across caching implementation in examples and documentation * refactor: reorganize examples and fix PHPStan baseline - Move cached discovery example from examples/10 to examples/09 - Update composer.json autoload-dev namespace mapping - Fix PHPStan baseline by removing invalid entries for non-existent files - Update server.php to follow proper example pattern with logging and lifecycle * fix: correct formatting in server.php
91 lines
2.5 KiB
PHP
91 lines
2.5 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the official PHP MCP SDK.
|
|
*
|
|
* A collaboration between Symfony and the PHP Foundation.
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Mcp\Capability\Registry;
|
|
|
|
use Mcp\Capability\Discovery\DiscoveryState;
|
|
use Mcp\Schema\Prompt;
|
|
use Mcp\Schema\Resource;
|
|
use Mcp\Schema\ResourceTemplate;
|
|
use Mcp\Schema\ServerCapabilities;
|
|
use Mcp\Schema\Tool;
|
|
|
|
/**
|
|
* @phpstan-import-type Handler from ElementReference
|
|
*
|
|
* Interface for registering MCP elements.
|
|
* Separates the concern of registering elements from accessing them.
|
|
*
|
|
* @author Pavel Buchnev <butschster@gmail.com>
|
|
*/
|
|
interface ReferenceRegistryInterface
|
|
{
|
|
/**
|
|
* Gets server capabilities based on registered elements.
|
|
*/
|
|
public function getCapabilities(): ServerCapabilities;
|
|
|
|
/**
|
|
* Registers a tool with its handler.
|
|
*
|
|
* @param Handler $handler
|
|
*/
|
|
public function registerTool(Tool $tool, callable|array|string $handler, bool $isManual = false): void;
|
|
|
|
/**
|
|
* Registers a resource with its handler.
|
|
*
|
|
* @param Handler $handler
|
|
*/
|
|
public function registerResource(Resource $resource, callable|array|string $handler, bool $isManual = false): void;
|
|
|
|
/**
|
|
* Registers a resource template with its handler and completion providers.
|
|
*
|
|
* @param Handler $handler
|
|
* @param array<string, class-string|object> $completionProviders
|
|
*/
|
|
public function registerResourceTemplate(
|
|
ResourceTemplate $template,
|
|
callable|array|string $handler,
|
|
array $completionProviders = [],
|
|
bool $isManual = false,
|
|
): void;
|
|
|
|
/**
|
|
* Registers a prompt with its handler and completion providers.
|
|
*
|
|
* @param Handler $handler
|
|
* @param array<string, class-string|object> $completionProviders
|
|
*/
|
|
public function registerPrompt(
|
|
Prompt $prompt,
|
|
callable|array|string $handler,
|
|
array $completionProviders = [],
|
|
bool $isManual = false,
|
|
): void;
|
|
|
|
/**
|
|
* Clear discovered elements from registry.
|
|
*/
|
|
public function clear(): void;
|
|
|
|
/**
|
|
* Get the current discovery state (only discovered elements, not manual ones).
|
|
*/
|
|
public function getDiscoveryState(): DiscoveryState;
|
|
|
|
/**
|
|
* Set discovery state, replacing all discovered elements.
|
|
* Manual elements are preserved.
|
|
*/
|
|
public function setDiscoveryState(DiscoveryState $state): void;
|
|
}
|