Compare commits

...

2 commits

Author SHA1 Message Date
Jan Böhmer
6dd08f6aeb Added some metadata to the MCP server
Some checks failed
Build assets artifact / Build assets artifact (push) Has been cancelled
Docker Image Build / build (linux/amd64, amd64, ubuntu-latest) (push) Has been cancelled
Docker Image Build / build (linux/arm/v7, armv7, ubuntu-24.04-arm) (push) Has been cancelled
Docker Image Build / build (linux/arm64, arm64, ubuntu-24.04-arm) (push) Has been cancelled
Docker Image Build (FrankenPHP) / build (linux/amd64, amd64, ubuntu-latest) (push) Has been cancelled
Docker Image Build (FrankenPHP) / build (linux/arm/v7, armv7, ubuntu-24.04-arm) (push) Has been cancelled
Docker Image Build (FrankenPHP) / build (linux/arm64, arm64, ubuntu-24.04-arm) (push) Has been cancelled
Static analysis / Static analysis (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.2, mysql) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.3, mysql) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.4, mysql) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.5, mysql) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.2, postgres) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.3, postgres) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.4, postgres) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.5, postgres) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.2, sqlite) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.3, sqlite) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.4, sqlite) (push) Has been cancelled
PHPUnit Tests / PHPUnit and coverage Test (PHP 8.5, sqlite) (push) Has been cancelled
Docker Image Build / merge (push) Has been cancelled
Docker Image Build (FrankenPHP) / merge (push) Has been cancelled
2026-05-31 23:02:20 +02:00
Jan Böhmer
bcf439ba22 Allow to enable/disable MCP endpoint 2026-05-31 22:47:53 +02:00
6 changed files with 153 additions and 1 deletions

View file

@ -1,4 +1,12 @@
mcp:
app: "Part-DB"
version: "0.1.0"
description: "Part-DB is a inventory management database for electronic parts."
instructions: |
This server provides inventory information for your current user. It is mostly used for electronic parts,
but can be used for any kind of inventory. The stored objects are called parts.
If you miss some information from an search endpoint, try to retrieve more details using the ID of an entity.
client_transports:
http: true
stdio: false

View file

@ -0,0 +1,60 @@
<?php
/*
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2026 Jan Böhmer (https://github.com/jbtronics)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace App\EventSubscriber;
use App\Settings\AISettings\McpSettings;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException;
use Symfony\Component\HttpKernel\KernelEvents;
readonly class McpAccessSubscriber implements EventSubscriberInterface
{
public function __construct(private McpSettings $mcpSettings)
{
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 10],
];
}
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$path = $event->getRequest()->getPathInfo();
if (!str_starts_with($path, '/mcp')) {
return;
}
if (!$this->mcpSettings->enabled) {
throw new ServiceUnavailableHttpException(null, 'The MCP endpoint is disabled. Enable it in the system settings.');
}
}
}

View file

@ -35,6 +35,9 @@ class AISettings
{
use SettingsTrait;
#[EmbeddedSettings]
public ?McpSettings $mcp = null;
#[EmbeddedSettings]
public ?OpenRouterSettings $openRouter = null;

View file

@ -0,0 +1,45 @@
<?php
/*
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2026 Jan Böhmer (https://github.com/jbtronics)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
namespace App\Settings\AISettings;
use App\Settings\SettingsIcon;
use Jbtronics\SettingsBundle\Metadata\EnvVarMode;
use Jbtronics\SettingsBundle\Settings\Settings;
use Jbtronics\SettingsBundle\Settings\SettingsParameter;
use Jbtronics\SettingsBundle\Settings\SettingsTrait;
use Symfony\Component\Translation\TranslatableMessage as TM;
#[Settings(label: new TM("settings.misc.mcp"))]
#[SettingsIcon("fa-robot")]
class McpSettings
{
use SettingsTrait;
#[SettingsParameter(
label: new TM("settings.misc.mcp.enabled"),
description: new TM("settings.misc.mcp.enabled.help"),
envVar: "bool:MCP_ENABLED",
envVarMode: EnvVarMode::OVERWRITE,
)]
public bool $enabled = false;
}

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:2.0" version="2.0" srcLang="en" trgLang="de">
<file id="messages.en">
<file id="messages.de">
<unit id="x_wTSQS" name="attachment_type.caption">
<segment state="translated">
<source>attachment_type.caption</source>
@ -10034,6 +10034,24 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön
<target>Servereinstellungen</target>
</segment>
</unit>
<unit id="ZDiR5ya" name="settings.misc.mcp">
<segment state="translated">
<source>settings.misc.mcp</source>
<target>MCP (Model Context Protocol) Server</target>
</segment>
</unit>
<unit id="CdFWDgN" name="settings.misc.mcp.enabled">
<segment state="translated">
<source>settings.misc.mcp.enabled</source>
<target>MCP-Endpunkt aktivieren</target>
</segment>
</unit>
<unit id="Gyos.5e" name="settings.misc.mcp.enabled.help">
<segment state="translated">
<source>settings.misc.mcp.enabled.help</source>
<target>Aktiviert den MCP-Endpunkt (Model Context Protocol) unter /mcp, der es KI-Assistenten ermöglicht, mit Part-DB zu interagieren.</target>
</segment>
</unit>
<unit id="xtw_ol7" name="settings.misc.kicad_eda">
<segment state="translated">
<source>settings.misc.kicad_eda</source>

View file

@ -10035,6 +10035,24 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<target>Server settings</target>
</segment>
</unit>
<unit id="ZDiR5ya" name="settings.misc.mcp">
<segment state="translated">
<source>settings.misc.mcp</source>
<target>MCP (Model Context Protocol) Server</target>
</segment>
</unit>
<unit id="CdFWDgN" name="settings.misc.mcp.enabled">
<segment state="translated">
<source>settings.misc.mcp.enabled</source>
<target>Enable MCP endpoint</target>
</segment>
</unit>
<unit id="Gyos.5e" name="settings.misc.mcp.enabled.help">
<segment state="translated">
<source>settings.misc.mcp.enabled.help</source>
<target>Enable the MCP (Model Context Protocol) endpoint at /mcp, which allows AI assistants to interact with Part-DB.</target>
</segment>
</unit>
<unit id="xtw_ol7" name="settings.misc.kicad_eda">
<segment state="translated">
<source>settings.misc.kicad_eda</source>