Skip to content

Commit ad9045b

Browse files
committed
feat: Use attributes to register routes
1 parent f4a1198 commit ad9045b

24 files changed

+402
-96
lines changed

context-generator

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@ use Butschster\ContextGenerator\Lib\HttpClient\HttpClientInterface;
2323
use Butschster\ContextGenerator\Lib\Logger\ConsoleLogger;
2424
use Butschster\ContextGenerator\Lib\Logger\LoggerFactory;
2525
use Butschster\ContextGenerator\McpServer\Routing\McpResponseStrategy;
26+
use Butschster\ContextGenerator\McpServer\Routing\RouteRegistrar;
2627
use Butschster\ContextGenerator\Modifier\SourceModifierRegistry;
2728
use GuzzleHttp\Client;
2829
use GuzzleHttp\Psr7\HttpFactory;
30+
use League\Route\Router;
2931
use League\Route\Strategy\StrategyInterface;
3032
use Monolog\ErrorHandler;
33+
use Psr\Container\ContainerInterface;
3134
use Spiral\Core\Container;
3235
use Symfony\Component\Console\Application;
3336
use Symfony\Component\Console\Input\ArgvInput;
@@ -135,24 +138,34 @@ $container->bindSingleton(
135138
SourceModifierRegistry::class,
136139
static fn(ModifierRegistryFactory $factory) => $factory->create(),
137140
);
138-
$container->bindSingleton(HttpClientInterface::class, static function () {
139-
$httpClient = new Client();
140-
$httpMessageFactory = new HttpFactory();
141-
return HttpClientFactory::create(
142-
$httpClient,
143-
$httpMessageFactory,
144-
);
145-
});
141+
$container->bindSingleton(
142+
HttpClientInterface::class,
143+
static function (Client $httpClient, HttpFactory $httpMessageFactory) {
144+
return HttpClientFactory::create(
145+
$httpClient,
146+
$httpMessageFactory,
147+
);
148+
},
149+
);
146150
$container->bindSingleton(RendererInterface::class, MarkdownRenderer::class);
147151
$container->bindSingleton(ContentBuilderFactory::class, ContentBuilderFactory::class);
148-
$container->bindSingleton(GithubClientInterface::class, static fn(
149-
HttpClientInterface $httpClient,
150-
) => new GithubClientFactory(
151-
httpClient: $httpClient,
152-
defaultToken: \getenv('GITHUB_TOKEN') ?: null,
153-
));
152+
$container->bindSingleton(
153+
GithubClientInterface::class,
154+
static fn(HttpClientInterface $httpClient) => new GithubClientFactory(
155+
httpClient: $httpClient,
156+
defaultToken: \getenv('GITHUB_TOKEN') ?: null,
157+
),
158+
);
154159

155160
$container->bindSingleton(LoggerFactory::class, LoggerFactory::class);
161+
$container->bindSingleton(Router::class, static function (StrategyInterface $strategy, ContainerInterface $container) {
162+
$router = new Router();
163+
$strategy->setContainer($container);
164+
$router->setStrategy($strategy);
165+
166+
return $router;
167+
});
168+
$container->bindSingleton(RouteRegistrar::class, RouteRegistrar::class);
156169

157170
// Register all commands
158171
$application->add(

context.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,15 @@ documents:
259259
sourcePaths:
260260
- src/McpServer/Action
261261

262+
- description: "MCP Server routing"
263+
outputPath: "mcp/routing.md"
264+
sources:
265+
- type: file
266+
sourcePaths:
267+
- src/McpServer/Routing
268+
- src/McpServer/Server.php
269+
- src/McpServer/ServerFactory.php
270+
262271
- description: "Changes in the Project"
263272
outputPath: "changes.md"
264273
sources:

src/McpServer/Action/Prompts/GetPromptAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Butschster\ContextGenerator\McpServer\Action\Prompts;
66

7+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Get;
78
use Mcp\Types\GetPromptResult;
89
use Mcp\Types\PromptMessage;
910
use Mcp\Types\Role;
@@ -17,6 +18,7 @@ public function __construct(
1718
private LoggerInterface $logger,
1819
) {}
1920

21+
#[Get(path: '/prompt/{name}', name: 'prompts.get')]
2022
public function __invoke(ServerRequestInterface $request): GetPromptResult
2123
{
2224
$name = $request->getAttribute('name');

src/McpServer/Action/Prompts/ListPromptsAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Butschster\ContextGenerator\McpServer\Action\Prompts;
66

7+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Get;
78
use Mcp\Types\ListPromptsResult;
89
use Mcp\Types\Prompt;
910
use Psr\Http\Message\ServerRequestInterface;
@@ -15,6 +16,7 @@ public function __construct(
1516
private LoggerInterface $logger,
1617
) {}
1718

19+
#[Get(path: '/prompts/list', name: 'prompts.list')]
1820
public function __invoke(ServerRequestInterface $request): ListPromptsResult
1921
{
2022
$this->logger->info('Listing available prompts');

src/McpServer/Action/Resources/GetDocumentContentResourceAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Butschster\ContextGenerator\ConfigLoader\ConfigLoaderInterface;
88
use Butschster\ContextGenerator\Document\Compiler\DocumentCompiler;
99
use Butschster\ContextGenerator\Document\Compiler\Error\ErrorCollection;
10+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Get;
1011
use Mcp\Types\ReadResourceResult;
1112
use Mcp\Types\TextResourceContents;
1213
use Psr\Http\Message\ServerRequestInterface;
@@ -20,6 +21,7 @@ public function __construct(
2021
private DocumentCompiler $compiler,
2122
) {}
2223

24+
#[Get(path: '/resource/ctx/document/{path:.*}', name: 'resources.ctx.document')]
2325
public function __invoke(ServerRequestInterface $request): ReadResourceResult
2426
{
2527
$path = $request->getAttribute('path');

src/McpServer/Action/Resources/GetJsonSchemaResourceAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Butschster\ContextGenerator\Directories;
88
use Butschster\ContextGenerator\FilesInterface;
9+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Get;
910
use Mcp\Types\ReadResourceResult;
1011
use Mcp\Types\TextResourceContents;
1112
use Psr\Http\Message\ServerRequestInterface;
@@ -19,6 +20,7 @@ public function __construct(
1920
private Directories $dirs,
2021
) {}
2122

23+
#[Get(path: '/resource/ctx/json-schema', name: 'resources.ctx.json-schema')]
2224
public function __invoke(ServerRequestInterface $request): ReadResourceResult
2325
{
2426
$this->logger->info('Getting JSON schema');

src/McpServer/Action/Resources/ListDocumentsResourceAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Butschster\ContextGenerator\McpServer\Action\Resources;
66

77
use Butschster\ContextGenerator\ConfigLoader\ConfigLoaderInterface;
8+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Get;
89
use Mcp\Types\ReadResourceResult;
910
use Mcp\Types\TextResourceContents;
1011
use Psr\Http\Message\ServerRequestInterface;
@@ -17,6 +18,7 @@ public function __construct(
1718
private ConfigLoaderInterface $configLoader,
1819
) {}
1920

21+
#[Get(path: '/resource/ctx/list', name: 'resources.ctx.list')]
2022
public function __invoke(ServerRequestInterface $request): ReadResourceResult
2123
{
2224
$this->logger->info('Listing available documents');

src/McpServer/Action/Resources/ListResourcesAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Butschster\ContextGenerator\McpServer\Action\Resources;
66

77
use Butschster\ContextGenerator\ConfigLoader\ConfigLoaderInterface;
8+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Get;
89
use Mcp\Types\ListResourcesResult;
910
use Mcp\Types\Resource;
1011
use Psr\Http\Message\ServerRequestInterface;
@@ -17,6 +18,7 @@ public function __construct(
1718
private ConfigLoaderInterface $configLoader,
1819
) {}
1920

21+
#[Get(path: '/resources/list', name: 'resources.list')]
2022
public function __invoke(ServerRequestInterface $request): ListResourcesResult
2123
{
2224
$this->logger->info('Listing available resources');

src/McpServer/Action/RouteProvider.php

Lines changed: 0 additions & 71 deletions
This file was deleted.

src/McpServer/Action/Tools/Context/ContextAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Butschster\ContextGenerator\McpServer\Action\Tools\Context;
66

77
use Butschster\ContextGenerator\ConfigLoader\ConfigLoaderInterface;
8+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Post;
89
use Mcp\Types\CallToolResult;
910
use Mcp\Types\TextContent;
1011
use Psr\Http\Message\ServerRequestInterface;
@@ -17,6 +18,7 @@ public function __construct(
1718
private ConfigLoaderInterface $configLoader,
1819
) {}
1920

21+
#[Post(path: '/tools/call/context', name: 'tools.context.list')]
2022
public function __invoke(ServerRequestInterface $request): CallToolResult
2123
{
2224
$this->logger->info('Processing context tool');

src/McpServer/Action/Tools/Context/ContextGetAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Butschster\ContextGenerator\ConfigLoader\ConfigLoaderInterface;
88
use Butschster\ContextGenerator\Document\Compiler\DocumentCompiler;
99
use Butschster\ContextGenerator\Document\Compiler\Error\ErrorCollection;
10+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Post;
1011
use Mcp\Types\CallToolResult;
1112
use Mcp\Types\TextContent;
1213
use Psr\Http\Message\ServerRequestInterface;
@@ -20,6 +21,7 @@ public function __construct(
2021
private DocumentCompiler $documentCompiler,
2122
) {}
2223

24+
#[Post(path: '/tools/call/context-get', name: 'tools.context.get')]
2325
public function __invoke(ServerRequestInterface $request): CallToolResult
2426
{
2527
$this->logger->info('Processing context-get tool');

src/McpServer/Action/Tools/Context/ContextRequestAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Butschster\ContextGenerator\Directories;
99
use Butschster\ContextGenerator\Document\Compiler\DocumentCompiler;
1010
use Butschster\ContextGenerator\Document\Compiler\Error\ErrorCollection;
11+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Post;
1112
use Laminas\Diactoros\Response\JsonResponse;
1213
use Psr\Http\Message\ResponseInterface;
1314
use Psr\Http\Message\ServerRequestInterface;
@@ -22,6 +23,7 @@ public function __construct(
2223
private Directories $dirs,
2324
) {}
2425

26+
#[Post(path: '/tools/call/context-request', name: 'tools.context.request')]
2527
public function __invoke(ServerRequestInterface $request): ResponseInterface
2628
{
2729
$this->logger->info('Handling context-request action');

src/McpServer/Action/Tools/Filesystem/FileInfoAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Butschster\ContextGenerator\Directories;
88
use Butschster\ContextGenerator\FilesInterface;
9+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Post;
910
use Mcp\Types\CallToolResult;
1011
use Mcp\Types\TextContent;
1112
use Psr\Http\Message\ServerRequestInterface;
@@ -19,6 +20,7 @@ public function __construct(
1920
private Directories $dirs,
2021
) {}
2122

23+
#[Post(path: '/tools/call/file-info', name: 'tools.file-info')]
2224
public function __invoke(ServerRequestInterface $request): CallToolResult
2325
{
2426
$this->logger->info('Processing file-info tool');

src/McpServer/Action/Tools/Filesystem/FileMoveAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Butschster\ContextGenerator\Directories;
88
use Butschster\ContextGenerator\FilesInterface;
9+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Post;
910
use Mcp\Types\CallToolResult;
1011
use Mcp\Types\TextContent;
1112
use Psr\Http\Message\ServerRequestInterface;
@@ -19,6 +20,7 @@ public function __construct(
1920
private Directories $dirs,
2021
) {}
2122

23+
#[Post(path: '/tools/call/file-move', name: 'tools.file-move')]
2224
public function __invoke(ServerRequestInterface $request): CallToolResult
2325
{
2426
$this->logger->info('Processing file-move tool');

src/McpServer/Action/Tools/Filesystem/FileReadAction.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66

77
use Butschster\ContextGenerator\Directories;
88
use Butschster\ContextGenerator\FilesInterface;
9+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Post;
910
use Mcp\Types\CallToolResult;
1011
use Mcp\Types\TextContent;
1112
use Psr\Http\Message\ServerRequestInterface;
1213
use Psr\Log\LoggerInterface;
1314

15+
#[Controller(prefix: '/tools/call')]
1416
final readonly class FileReadAction
1517
{
1618
public function __construct(
@@ -19,6 +21,7 @@ public function __construct(
1921
private Directories $dirs,
2022
) {}
2123

24+
#[Post(path: 'file-read', name: 'tools.file-read')]
2225
public function __invoke(ServerRequestInterface $request): CallToolResult
2326
{
2427
$this->logger->info('Processing file-read tool');

src/McpServer/Action/Tools/Filesystem/FileRenameAction.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use Butschster\ContextGenerator\Directories;
88
use Butschster\ContextGenerator\FilesInterface;
9+
use Butschster\ContextGenerator\McpServer\Routing\Attribute\Post;
910
use Mcp\Types\CallToolResult;
1011
use Mcp\Types\TextContent;
1112
use Psr\Http\Message\ServerRequestInterface;
@@ -19,6 +20,7 @@ public function __construct(
1920
private Directories $dirs,
2021
) {}
2122

23+
#[Post(path: '/tools/call/file-rename', name: 'tools.file-rename')]
2224
public function __invoke(ServerRequestInterface $request): CallToolResult
2325
{
2426
$this->logger->info('Processing file-rename tool');

0 commit comments

Comments
 (0)