2026-04-29 08:30:43 +00:00
< ? php
namespace App\Mcp\Tools ;
use App\Mcp\Concerns\BuildsResponse ;
use App\Mcp\Concerns\ResolvesTeam ;
use App\Models\Project ;
use Illuminate\Contracts\JsonSchema\JsonSchema ;
use Laravel\Mcp\Request ;
use Laravel\Mcp\Response ;
use Laravel\Mcp\Server\Tool ;
class ListDatabases extends Tool
{
2026-06-04 09:03:06 +00:00
protected string $name = 'list_databases' ;
protected string $description = 'List standalone databases owned by the authenticated team. Returns summary (uuid, name, status, type). Use get_database for full details.' ;
2026-04-29 08:30:43 +00:00
use BuildsResponse ;
use ResolvesTeam ;
public function handle ( Request $request ) : Response
{
2026-06-04 09:03:06 +00:00
if ( $error = $this -> ensureAbility ( $request , 'read' , $this -> name )) {
2026-04-29 08:30:43 +00:00
return $error ;
}
$teamId = $this -> resolveTeamId ( $request );
if ( is_null ( $teamId )) {
2026-06-04 09:03:06 +00:00
return $this -> mcpError ( $request , 'Invalid token.' );
2026-04-29 08:30:43 +00:00
}
$args = $this -> paginationArgs ( $request );
$projects = Project :: where ( 'team_id' , $teamId ) -> get ();
$databases = collect ();
foreach ( $projects as $project ) {
$databases = $databases -> merge ( $project -> databases ());
}
$total = $databases -> count ();
$summaries = $databases
-> sortBy ( 'name' )
-> slice ( $args [ 'offset' ], $args [ 'per_page' ])
-> map ( fn ( $db ) => [
'uuid' => $db -> uuid ,
'name' => $db -> name ,
'status' => $db -> status ? ? null ,
'type' => method_exists ( $db , 'type' ) ? $db -> type () : class_basename ( $db ),
])
-> values ()
-> all ();
2026-06-04 09:03:06 +00:00
return $this -> mcpSuccess ( $request , $this -> respond (
2026-04-29 08:30:43 +00:00
$summaries ,
[],
$this -> paginationMeta ( 'list_databases' , $args , $total ),
2026-06-04 09:03:06 +00:00
));
2026-04-29 08:30:43 +00:00
}
public function schema ( JsonSchema $schema ) : array
{
return [
'page' => $schema -> integer () -> description ( 'Page number (default 1).' ),
'per_page' => $schema -> integer () -> description ( 'Items per page (default 50, max 100).' ),
];
}
}