mirror of
https://github.com/HolgerHatGarKeineNode/einundzwanzig-app.git
synced 2026-06-11 02:50:29 +00:00
8c68b19138
- 🛠️ Introduced generic Super-Admin MCP tools, including `list-models`, `describe-model`, `list-records`, `show-record`, `create-record`, and `update-record`. - 🛡️ Restricted modification of critical fields (e.g., passwords, roles, tokens) to enhance security. - ✅ Added extensive feature tests for Super-Admin functionality and access control. - 📜 Increased pagination length to accommodate new tools on a single page. - 🔗 Registered Super-Admin tools in `EinundzwanzigServer`.
65 lines
1.9 KiB
PHP
65 lines
1.9 KiB
PHP
<?php
|
|
|
|
namespace App\Mcp\Tools\SuperAdmin;
|
|
|
|
use App\Mcp\Tools\SuperAdmin\Concerns\AuthorizesSuperAdmin;
|
|
use Illuminate\Contracts\JsonSchema\JsonSchema;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\JsonSchema\Types\Type;
|
|
use Illuminate\Support\Facades\Schema;
|
|
use Laravel\Mcp\Request;
|
|
use Laravel\Mcp\Response;
|
|
use Laravel\Mcp\Server\Attributes\Description;
|
|
use Laravel\Mcp\Server\Tool;
|
|
use Laravel\Mcp\Server\Tools\Annotations\IsReadOnly;
|
|
|
|
#[IsReadOnly]
|
|
#[Description('NUR SUPER-ADMIN: Beschreibt ein Model: Spalten (Name, Typ, nullable, Default), Primärschlüssel und Casts. So weißt du, welche Felder du bei super-admin-create-record / super-admin-update-record setzen kannst.')]
|
|
class SuperAdminDescribeModelTool extends Tool
|
|
{
|
|
use AuthorizesSuperAdmin;
|
|
|
|
public function handle(Request $request): Response
|
|
{
|
|
if ($denied = $this->denyUnlessSuperAdmin($request)) {
|
|
return $denied;
|
|
}
|
|
|
|
$class = $this->resolveModel($request);
|
|
|
|
if ($class instanceof Response) {
|
|
return $class;
|
|
}
|
|
|
|
/** @var Model $model */
|
|
$model = new $class;
|
|
$table = $model->getTable();
|
|
|
|
$columns = collect(Schema::getColumns($table))->map(fn (array $column): array => [
|
|
'name' => $column['name'],
|
|
'type' => $column['type_name'] ?? $column['type'] ?? null,
|
|
'nullable' => $column['nullable'] ?? null,
|
|
'default' => $column['default'] ?? null,
|
|
])->values();
|
|
|
|
return Response::json([
|
|
'model' => class_basename($class),
|
|
'class' => $class,
|
|
'table' => $table,
|
|
'primary_key' => $model->getKeyName(),
|
|
'columns' => $columns,
|
|
'casts' => $model->getCasts(),
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* @return array<string, Type>
|
|
*/
|
|
public function schema(JsonSchema $schema): array
|
|
{
|
|
return [
|
|
'model' => $this->modelParameter($schema),
|
|
];
|
|
}
|
|
}
|