ClassNameCompletionProvider.php•2.49 kB
<?php
declare(strict_types=1);
namespace OpenFGA\MCP\Completions;
use OpenFGA\MCP\Documentation\{DocumentationIndex, DocumentationIndexSingleton};
use Override;
use PhpMcp\Server\Contracts\{CompletionProviderInterface, SessionInterface};
use Throwable;
final readonly class ClassNameCompletionProvider implements CompletionProviderInterface
{
    private DocumentationIndex $documentationIndex;
    public function __construct()
    {
        $this->documentationIndex = DocumentationIndexSingleton::getInstance();
    }
    /**
     * Get completion suggestions for class names within a specific SDK.
     *
     * @param  string           $currentValue
     * @param  SessionInterface $session
     * @return array<string>
     */
    #[Override]
    public function getCompletions(string $currentValue, SessionInterface $session): array
    {
        try {
            $this->documentationIndex->initialize();
            // Currently, we cannot extract SDK from session context
            // Return all classes from all SDKs
            return $this->getAllClasses($currentValue);
        } catch (Throwable) {
            return [];
        }
    }
    /**
     * Filter completions based on the current input value.
     *
     * @param  array<string> $completions
     * @param  string        $currentValue
     * @return array<string>
     */
    private function filterCompletions(array $completions, string $currentValue): array
    {
        if ('' === $currentValue) {
            return $completions;
        }
        return array_values(array_filter(
            $completions,
            static fn (string $completion): bool => str_starts_with(strtolower($completion), strtolower($currentValue)),
        ));
    }
    /**
     * Get all classes from all SDKs.
     *
     * @param  string        $currentValue
     * @return array<string>
     */
    private function getAllClasses(string $currentValue): array
    {
        $allClasses = [];
        try {
            $sdks = $this->documentationIndex->getSdkList();
        } catch (Throwable) {
            return [];
        }
        foreach ($sdks as $sdk) {
            $overview = $this->documentationIndex->getSdkOverview($sdk);
            if (null !== $overview) {
                foreach ($overview['classes'] as $class) {
                    $allClasses[] = $class;
                }
            }
        }
        return $this->filterCompletions(array_unique($allClasses), $currentValue);
    }
}