Skip to content

Commit 7a631c6

Browse files
committed
feature #808 [MCP Bundle] Add configurable tool discovery options (OskarStark)
This PR was squashed before being merged into the main branch. Discussion ---------- [MCP Bundle] Add configurable tool discovery options | Q | A | ------------- | --- | Bug fix? | no | New feature? | yes | Docs? | no | Issues | Fix #801 | License | MIT ## Summary - Add support for configurable `scan_dirs` and `exclude_dirs` in tool discovery - Allows users to specify multiple directories to scan for MCP tools - Allows users to exclude specific directories from discovery ## Configuration Example ```yaml # config/packages/mcp.yaml mcp: discovery: scan_dirs: ['src', 'lib'] exclude_dirs: ['src/DataFixtures'] ``` Commits ------- b1c6e93 [MCP Bundle] Add configurable tool discovery options
2 parents 323f147 + b1c6e93 commit 7a631c6

File tree

4 files changed

+69
-1
lines changed

4 files changed

+69
-1
lines changed

src/mcp-bundle/config/options.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,19 @@
2424
->booleanNode('http')->defaultFalse()->end()
2525
->end()
2626
->end()
27+
->arrayNode('discovery')
28+
->addDefaultsIfNotSet()
29+
->children()
30+
->arrayNode('scan_dirs')
31+
->scalarPrototype()->end()
32+
->defaultValue(['src'])
33+
->end()
34+
->arrayNode('exclude_dirs')
35+
->scalarPrototype()->end()
36+
->defaultValue([])
37+
->end()
38+
->end()
39+
->end()
2740
->arrayNode('http')
2841
->addDefaultsIfNotSet()
2942
->children()

src/mcp-bundle/config/services.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
->call('setLogger', [service('monolog.logger.mcp')])
3030
->call('setEventDispatcher', [service('event_dispatcher')])
3131
->call('setSession', [service('mcp.session.store')])
32-
->call('setDiscovery', [param('kernel.project_dir'), ['src']])
32+
->call('setDiscovery', [param('kernel.project_dir'), param('mcp.discovery.scan_dirs'), param('mcp.discovery.exclude_dirs')])
3333

3434
->set('mcp.server', Server::class)
3535
->factory([service('mcp.server.builder'), 'build'])

src/mcp-bundle/src/McpBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ public function loadExtension(array $config, ContainerConfigurator $container, C
5050
$builder->setParameter('mcp.version', $config['version']);
5151
$builder->setParameter('mcp.pagination_limit', $config['pagination_limit']);
5252
$builder->setParameter('mcp.instructions', $config['instructions']);
53+
$builder->setParameter('mcp.discovery.scan_dirs', $config['discovery']['scan_dirs']);
54+
$builder->setParameter('mcp.discovery.exclude_dirs', $config['discovery']['exclude_dirs']);
5355

5456
$this->registerMcpAttributes($builder);
5557

src/mcp-bundle/tests/DependencyInjection/McpBundleTest.php

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ public function testDefaultConfiguration()
2626
$this->assertSame('0.0.1', $container->getParameter('mcp.version'));
2727
$this->assertSame(50, $container->getParameter('mcp.pagination_limit'));
2828
$this->assertNull($container->getParameter('mcp.instructions'));
29+
$this->assertSame(['src'], $container->getParameter('mcp.discovery.scan_dirs'));
30+
$this->assertSame([], $container->getParameter('mcp.discovery.exclude_dirs'));
2931
}
3032

3133
public function testCustomConfiguration()
@@ -296,6 +298,57 @@ public function testSessionStoreFileConfiguration()
296298
$this->assertSame(1800, $arguments[1]); // Custom TTL
297299
}
298300

301+
public function testDiscoveryDefaultConfiguration()
302+
{
303+
$container = $this->buildContainer([]);
304+
305+
$this->assertSame(['src'], $container->getParameter('mcp.discovery.scan_dirs'));
306+
$this->assertSame([], $container->getParameter('mcp.discovery.exclude_dirs'));
307+
308+
// Verify the builder service uses the correct parameters
309+
$builderDefinition = $container->getDefinition('mcp.server.builder');
310+
$methodCalls = $builderDefinition->getMethodCalls();
311+
312+
$setDiscoveryCall = null;
313+
foreach ($methodCalls as $call) {
314+
if ('setDiscovery' === $call[0]) {
315+
$setDiscoveryCall = $call;
316+
break;
317+
}
318+
}
319+
320+
$this->assertNotNull($setDiscoveryCall, 'ServerBuilder should have setDiscovery method call');
321+
}
322+
323+
public function testDiscoveryCustomConfiguration()
324+
{
325+
$container = $this->buildContainer([
326+
'mcp' => [
327+
'discovery' => [
328+
'scan_dirs' => ['src', 'lib', 'modules'],
329+
'exclude_dirs' => ['src/DataFixtures', 'tests'],
330+
],
331+
],
332+
]);
333+
334+
$this->assertSame(['src', 'lib', 'modules'], $container->getParameter('mcp.discovery.scan_dirs'));
335+
$this->assertSame(['src/DataFixtures', 'tests'], $container->getParameter('mcp.discovery.exclude_dirs'));
336+
}
337+
338+
public function testDiscoveryWithExcludeDirsOnly()
339+
{
340+
$container = $this->buildContainer([
341+
'mcp' => [
342+
'discovery' => [
343+
'exclude_dirs' => ['src/DataFixtures'],
344+
],
345+
],
346+
]);
347+
348+
$this->assertSame(['src'], $container->getParameter('mcp.discovery.scan_dirs'));
349+
$this->assertSame(['src/DataFixtures'], $container->getParameter('mcp.discovery.exclude_dirs'));
350+
}
351+
299352
private function buildContainer(array $configuration): ContainerBuilder
300353
{
301354
$container = new ContainerBuilder();

0 commit comments

Comments
 (0)