Skip to content

Commit 0db4f14

Browse files
committed
feat(server): enhance MCP server handling to support versioning in tools, prompts, and resources
1 parent e282262 commit 0db4f14

File tree

5 files changed

+101
-36
lines changed

5 files changed

+101
-36
lines changed

src/Server/Framework/Hyperf/Collector/Annotations/McpPrompt.php

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ class McpPrompt extends McpAnnotation
2626
/** @var array<string, mixed> */
2727
protected array $arguments = [];
2828

29-
protected string $group = '';
29+
protected string $server = '';
30+
31+
protected string $version = '';
3032

3133
protected bool $enabled = true;
3234

@@ -37,16 +39,18 @@ public function __construct(
3739
string $name = '',
3840
string $description = '',
3941
array $arguments = [],
40-
string $group = '',
41-
bool $enabled = true,
42+
string $server = '',
43+
string $version = '',
44+
bool $enabled = true
4245
) {
4346
if ($name !== '' && ! preg_match('/^[a-zA-Z0-9_-]+$/', $name)) {
4447
throw new ValidationError('Prompt name must be alphanumeric, underscores, and hyphens.');
4548
}
4649
$this->name = $name;
4750
$this->description = $description;
4851
$this->arguments = $arguments;
49-
$this->group = $group;
52+
$this->server = $server;
53+
$this->version = $version;
5054
$this->enabled = $enabled;
5155
}
5256

@@ -75,9 +79,14 @@ public function getArguments(): array
7579
return $this->arguments;
7680
}
7781

78-
public function getGroup(): string
82+
public function getServer(): string
83+
{
84+
return $this->server;
85+
}
86+
87+
public function getVersion(): string
7988
{
80-
return $this->group;
89+
return $this->version;
8190
}
8291

8392
public function isEnabled(): bool

src/Server/Framework/Hyperf/Collector/Annotations/McpResource.php

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ class McpResource extends McpAnnotation
2828

2929
protected ?int $size = null;
3030

31-
protected string $group = '';
31+
protected string $server = '';
32+
33+
protected string $version = '';
3234

3335
protected bool $enabled = true;
3436

@@ -43,10 +45,11 @@ public function __construct(
4345
string $description = '',
4446
?string $mimeType = null,
4547
?int $size = null,
46-
string $group = '',
48+
string $server = '',
49+
string $version = '',
4750
bool $enabled = true,
4851
bool $isTemplate = false,
49-
array $uriTemplate = [],
52+
array $uriTemplate = []
5053
) {
5154
if ($name !== '' && ! preg_match('/^[a-zA-Z0-9_-]+$/', $name)) {
5255
throw new ToolError('Resource name must be alphanumeric, underscores, and hyphens.');
@@ -61,7 +64,8 @@ public function __construct(
6164
$this->description = $description;
6265
$this->mimeType = $mimeType;
6366
$this->size = $size;
64-
$this->group = $group;
67+
$this->server = $server;
68+
$this->version = $version;
6569
$this->enabled = $enabled;
6670
$this->isTemplate = $isTemplate;
6771
$this->uriTemplate = $uriTemplate;
@@ -98,9 +102,14 @@ public function getSize(): ?int
98102
return $this->size;
99103
}
100104

101-
public function getGroup(): string
105+
public function getServer(): string
106+
{
107+
return $this->server;
108+
}
109+
110+
public function getVersion(): string
102111
{
103-
return $this->group;
112+
return $this->version;
104113
}
105114

106115
public function isEnabled(): bool

src/Server/Framework/Hyperf/Collector/Annotations/McpTool.php

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ class McpTool extends McpAnnotation
2525
/** @var array<string, mixed> */
2626
protected array $inputSchema = [];
2727

28-
protected string $group = '';
28+
protected string $server = '';
29+
30+
protected string $version = '';
2931

3032
protected bool $enabled = true;
3133

@@ -36,16 +38,18 @@ public function __construct(
3638
string $name = '',
3739
string $description = '',
3840
array $inputSchema = [],
39-
string $group = '',
40-
bool $enabled = true,
41+
string $server = '',
42+
string $version = '',
43+
bool $enabled = true
4144
) {
4245
if ($name !== '' && ! preg_match('/^[a-zA-Z0-9_]+$/', $name)) {
4346
throw new ValidationError('Tool name must be alphanumeric and underscores.');
4447
}
4548
$this->name = $name;
4649
$this->description = $description;
4750
$this->inputSchema = $inputSchema;
48-
$this->group = $group;
51+
$this->server = $server;
52+
$this->version = $version;
4953
$this->enabled = $enabled;
5054
}
5155

@@ -73,9 +77,14 @@ public function getInputSchema(): array
7377
return $this->inputSchema;
7478
}
7579

76-
public function getGroup(): string
80+
public function getServer(): string
81+
{
82+
return $this->server;
83+
}
84+
85+
public function getVersion(): string
7786
{
78-
return $this->group;
87+
return $this->version;
7988
}
8089

8190
public function isEnabled(): bool

src/Server/Framework/Hyperf/Collector/McpCollector.php

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,41 +29,62 @@ class McpCollector
2929
*/
3030
protected static array $tools = [];
3131

32+
/**
33+
* @var array<string, RegisteredTool>
34+
*/
35+
protected static array $globalTools = [];
36+
3237
/**
3338
* @var array<string, array<string, RegisteredPrompt>>
3439
*/
3540
protected static array $prompts = [];
3641

42+
/**
43+
* @var array<string, RegisteredPrompt>
44+
*/
45+
protected static array $globalPrompts = [];
46+
3747
/**
3848
* @return array<string, array<string, RegisteredResource>>
3949
*/
4050
protected static array $resources = [];
4151

4252
/**
53+
* @var array<string, RegisteredResource>
54+
*/
55+
protected static array $globalResources = [];
56+
57+
/**
58+
* @param mixed $version
4359
* @return array<string, RegisteredTool>
4460
*/
45-
public static function getTools(string $server = ''): array
61+
public static function getTools(string $server = '', $version = ''): array
4662
{
4763
self::collect();
48-
return self::$tools[$server] ?? [];
64+
$current = self::$tools[self::createGroup($server, $version)] ?? [];
65+
return array_merge(self::$globalTools, $current);
4966
}
5067

5168
/**
69+
* @param mixed $version
5270
* @return array<string, RegisteredPrompt>
5371
*/
54-
public static function getPrompts(string $server = ''): array
72+
public static function getPrompts(string $server = '', $version = ''): array
5573
{
5674
self::collect();
57-
return self::$prompts[$server] ?? [];
75+
$current = self::$prompts[self::createGroup($server, $version)] ?? [];
76+
return array_merge(self::$globalPrompts, $current);
5877
}
5978

6079
/**
80+
* @param mixed $version
6181
* @return array<string, RegisteredResource>
6282
*/
63-
public static function getResources(string $server = ''): array
83+
public static function getResources(string $server = '', $version = ''): array
6484
{
6585
self::collect();
66-
return self::$resources[$server] ?? [];
86+
$current = self::$resources[self::createGroup($server, $version)] ?? [];
87+
return array_merge(self::$globalResources, $current);
6788
}
6889

6990
public static function collect(): void
@@ -110,7 +131,11 @@ function (array $arguments) use ($class, $method) {
110131
return $instance->{$method}(...$arguments);
111132
}
112133
);
113-
self::$tools[$mcpTool->getGroup()][$mcpTool->getName()] = $registeredTool;
134+
if ($mcpTool->getServer()) {
135+
self::$tools[self::createGroup($mcpTool->getServer(), $mcpTool->getVersion())][$mcpTool->getName()] = $registeredTool;
136+
} else {
137+
self::$globalTools[$mcpTool->getName()] = $registeredTool;
138+
}
114139
}
115140
}
116141

@@ -146,7 +171,11 @@ function (array $arguments) use ($class, $method) {
146171
return $instance->{$method}(...$arguments);
147172
}
148173
);
149-
self::$prompts[$mcpPrompt->getGroup()][$mcpPrompt->getName()] = $registeredPrompt;
174+
if ($mcpPrompt->getServer()) {
175+
self::$prompts[self::createGroup($mcpPrompt->getServer(), $mcpPrompt->getVersion())][$mcpPrompt->getName()] = $registeredPrompt;
176+
} else {
177+
self::$globalPrompts[$mcpPrompt->getName()] = $registeredPrompt;
178+
}
150179
}
151180
}
152181

@@ -181,7 +210,16 @@ function () use ($class, $method) {
181210
return $instance->{$method}();
182211
}
183212
);
184-
self::$resources[$mcpResource->getGroup()][$mcpResource->getName()] = $resource;
213+
if ($mcpResource->getServer()) {
214+
self::$resources[self::createGroup($mcpResource->getServer(), $mcpResource->getVersion())][$mcpResource->getName()] = $resource;
215+
} else {
216+
self::$globalResources[$mcpResource->getUri()] = $resource;
217+
}
185218
}
186219
}
220+
221+
private static function createGroup(string $server, string $version): string
222+
{
223+
return md5($server . $version);
224+
}
187225
}

src/Server/Framework/Hyperf/HyperfMcpServer.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,32 +52,32 @@ protected function createMcpServer(string $server, string $version = '1.0.0'): M
5252
$app = new Application($this->container);
5353
$mcpServer = new McpServer($server, $version, $app);
5454

55-
$this->addAnnotationTools($mcpServer, $server);
56-
$this->addAnnotationPrompts($mcpServer, $server);
57-
$this->addAnnotationResources($mcpServer, $server);
55+
$this->addAnnotationTools($mcpServer, $server, $version);
56+
$this->addAnnotationPrompts($mcpServer, $server, $version);
57+
$this->addAnnotationResources($mcpServer, $server, $version);
5858

5959
return $mcpServer;
6060
}
6161

62-
protected function addAnnotationTools(McpServer $mcpServer, string $server = ''): void
62+
protected function addAnnotationTools(McpServer $mcpServer, string $server, string $version = '1.0.0'): void
6363
{
64-
$registeredTools = McpCollector::getTools($server);
64+
$registeredTools = McpCollector::getTools($server, $version);
6565
foreach ($registeredTools as $registeredTool) {
6666
$mcpServer->registerTool($registeredTool);
6767
}
6868
}
6969

70-
protected function addAnnotationPrompts(McpServer $mcpServer, string $server = ''): void
70+
protected function addAnnotationPrompts(McpServer $mcpServer, string $server, string $version = '1.0.0'): void
7171
{
72-
$registeredPrompts = McpCollector::getPrompts($server);
72+
$registeredPrompts = McpCollector::getPrompts($server, $version);
7373
foreach ($registeredPrompts as $registeredPrompt) {
7474
$mcpServer->registerPrompt($registeredPrompt);
7575
}
7676
}
7777

78-
protected function addAnnotationResources(McpServer $mcpServer, string $server = ''): void
78+
protected function addAnnotationResources(McpServer $mcpServer, string $server, string $version = '1.0.0'): void
7979
{
80-
$registeredResources = McpCollector::getResources($server);
80+
$registeredResources = McpCollector::getResources($server, $version);
8181
foreach ($registeredResources as $registeredResource) {
8282
$mcpServer->registerResource($registeredResource);
8383
}

0 commit comments

Comments
 (0)