Tools now return CallToolResult directly instead of Content arrays, preventing the MCP SDK from auto-generating structuredContent as a JSON array (which Claude Code rejects — expects a JSON object/record). Also adds Accept header to test helpers and SSE response parsing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
52 lines
1.8 KiB
PHP
52 lines
1.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Mcp\Tool;
|
|
|
|
use App\Repository\ComposantRepository;
|
|
use App\Repository\MachineRepository;
|
|
use App\Repository\PieceRepository;
|
|
use App\Repository\ProductRepository;
|
|
use App\Repository\SiteRepository;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
use Mcp\Capability\Attribute\McpTool;
|
|
use Mcp\Schema\Content\TextContent;
|
|
use Mcp\Schema\Result\CallToolResult;
|
|
|
|
#[McpTool(
|
|
name: 'get_dashboard_stats',
|
|
description: 'Get global inventory statistics: count of machines, pieces, composants, products, sites, and unresolved comments. Takes no parameters.',
|
|
)]
|
|
class DashboardStatsTool
|
|
{
|
|
public function __construct(
|
|
private readonly MachineRepository $machines,
|
|
private readonly PieceRepository $pieces,
|
|
private readonly ComposantRepository $composants,
|
|
private readonly ProductRepository $products,
|
|
private readonly SiteRepository $sites,
|
|
private readonly EntityManagerInterface $em,
|
|
) {}
|
|
|
|
public function __invoke(): CallToolResult
|
|
{
|
|
$unresolvedComments = (int) $this->em->createQuery(
|
|
"SELECT COUNT(c.id) FROM App\\Entity\\Comment c WHERE c.status = 'open'"
|
|
)->getSingleScalarResult();
|
|
|
|
return new CallToolResult(
|
|
content: [new TextContent(
|
|
text: json_encode([
|
|
'machines' => $this->machines->count([]),
|
|
'pieces' => $this->pieces->count([]),
|
|
'composants' => $this->composants->count([]),
|
|
'products' => $this->products->count([]),
|
|
'sites' => $this->sites->count([]),
|
|
'unresolvedComments' => $unresolvedComments,
|
|
], JSON_THROW_ON_ERROR)
|
|
)],
|
|
);
|
|
}
|
|
}
|