$supportedProtocolVersions * @param array $serverCapabilities * @param array $tools * @param array $resources * @param array $prompts */ public function __construct( public array $supportedProtocolVersions, public array $serverCapabilities, public string $serverName, public string $serverVersion, public string $instructions, public int $maxPaginationLength, public int $defaultPaginationLength, protected array $tools, protected array $resources, protected array $prompts, ) { // } /** * @return Collection */ public function tools(): Collection { /** @var Collection $tools */ $tools = collect($this->tools); return $this->resolvePrimitives($tools); } /** * @return Collection */ public function resources(): Collection { /** @var Collection $resourceTemplates */ $resourceTemplates = collect($this->resources) ->filter(fn (Resource|string $resource): bool => ! $this->isResourceTemplate($resource)); return $this->resolvePrimitives($resourceTemplates); } /** * @return Collection */ public function resourceTemplates(): Collection { /** @var Collection $resourceTemplates */ $resourceTemplates = collect($this->resources) ->filter(fn (Resource|string $resource): bool => $this->isResourceTemplate($resource)); return $this->resolvePrimitives($resourceTemplates); } /** * @return Collection */ public function prompts(): Collection { /** @var Collection $prompts */ $prompts = collect($this->prompts); return $this->resolvePrimitives($prompts); } public function perPage(?int $requestedPerPage = null): int { return min($requestedPerPage ?? $this->defaultPaginationLength, $this->maxPaginationLength); } public function hasCapability(string $capability): bool { return array_key_exists($capability, $this->serverCapabilities); } /** * @template T of Primitive * * @param Collection $primitive * @return Collection */ private function resolvePrimitives(Collection $primitive): Collection { return $primitive->map(fn (Primitive|string $primitiveClass) => is_string($primitiveClass) ? Container::getInstance()->make($primitiveClass) : $primitiveClass) ->filter(fn (Primitive $primitive): bool => $primitive->eligibleForRegistration()); } private function isResourceTemplate(Resource|string $resource): bool { return $resource instanceof HasUriTemplate || (is_string($resource) && is_subclass_of($resource, HasUriTemplate::class)); } }