Saltar al contenido principal

Herramientas

Las herramientas integradas de Copilot CLI están habilitadas por defecto. Aquí puedes indicar herramientas personalizadas.

Uso básico

Indica la definición de las herramientas en tools de SessionConfig. Tool::define() es un helper equivalente a defineTool de las versiones en otros lenguajes. En parameters puedes usar el JsonSchema que Laravel usa en Laravel MCP. También puedes pasar directamente un array sin JsonSchema.
use Illuminate\Support\Facades\Artisan;
use Illuminate\JsonSchema\JsonSchema;
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Types\SessionConfig;
use Revolution\Copilot\Types\Tool;
use Revolution\Copilot\Types\ToolResultObject;

use function Laravel\Prompts\{info, note, spin, warning};

Artisan::command('copilot:tools', function () {
    $facts = [
        'PHP' => 'A popular general-purpose scripting language that is especially suited to web development.',
        'Laravel' => 'A web application framework with expressive, elegant syntax.',
    ];

    $parameters = JsonSchema::object(
        properties: [
            'topic' => JsonSchema::string()
                ->description('Topic to look up (e.g., "PHP", "Laravel")')
                ->required(),
        ],
    )->toArray();

    $config = new SessionConfig(
        tools: [
            Tool::define(
                name: 'lookup_fact',
                description: 'Returns a fun fact about a given topic.',
                parameters: $parameters,
                handler: function (array $params, array $invocation) use ($facts): array {
                    $topic = $params['topic'] ?? '';

                    $fact = $facts[$topic] ?? null;

                    if (! $fact) {
                        return new ToolResultObject(
                            textResultForLlm: "No fact stored for {$topic}.",
                            resultType: 'failure',
                            sessionLog: "lookup_fact: missing topic {$topic}",
                            toolTelemetry: [],
                        );
                    }

                    return new ToolResultObject(
                        textResultForLlm: $fact,
                        resultType: 'success',
                        sessionLog: "lookup_fact: served {$topic}",
                        toolTelemetry: [],
                    );
                },
                overridesBuiltInTool: false,
                skipPermission: false, // si es true, se ejecuta sin prompt de permiso
                defer: 'auto', // controla si la herramienta se carga siempre al arranque o de forma diferida (carga diferida vía descubrimiento de herramientas). Con `"auto"` se carga de forma diferida y aparece en el descubrimiento. Con `"never"` se preloadea siempre. Opcional. Por defecto es `"auto"`.
            ),
        ],
    );

    Copilot::start(function (CopilotSession $session) {
        info('Starting Copilot with tools: '.$session->id());

        $prompt = 'You can call the lookup_fact tool. Use lookup_fact to tell me something about Laravel.';

        warning($prompt);

        $response = spin(
            callback: fn () => $session->sendAndWait($prompt),
            message: 'Copilot thinking...',
        );

        note($response->content());
    }, config: $config);
});

skipPermission

Si indicas skipPermission: true, esa herramienta se ejecuta sin prompt de permiso.
Tool::define(
    name: 'read_only_lookup',
    description: 'Read-only data lookup.',
    parameters: $parameters,
    handler: fn ($params) => ['result' => 'data'],
    skipPermission: true,
),

$invocation

Al segundo argumento del handler, $invocation, se le pasan los siguientes campos.
[
    'sessionId'  => '...',
    'toolCallId' => '...',
    'toolName'   => 'lookup_fact',
    'arguments'  => [...], // argumentos de la herramienta (mismo contenido que $params)
    // Solo se incluye si OpenTelemetry está habilitado
    'traceparent' => '...', // W3C Trace Context traceparent
    'tracestate'  => '...', // W3C Trace Context tracestate
]

Detalles del protocolo

En Protocol v3 (el valor por defecto actual), las invocaciones de herramientas se emiten como eventos de sesión (external_tool.requested), no como peticiones JSON-RPC. El SDK procesa este evento internamente y responde con el RPC session.tools.handlePendingToolCall. El uso de SessionConfig no cambia. Simplemente pasa la definición en tools; el SDK absorbe las diferencias de protocolo.

Conversión de MCP CallToolResult

Para convertir el resultado de una herramienta MCP (CallToolResult) al ToolResultObject de Copilot SDK, usa McpCallToolResult::convert(). El resultado de una herramienta MCP es un array de bloques content de texto, imagen, recursos, etc., pero Copilot SDK espera el formato ToolResultObject, así que hay que convertirlo.
use Revolution\Copilot\Support\McpCallToolResult;

// Formato MCP CallToolResult
$mcpResult = [
    'content' => [
        ['type' => 'text', 'text' => 'File contents here'],
        ['type' => 'image', 'data' => 'base64...', 'mimeType' => 'image/png'],
    ],
    'isError' => false,
];

// Conviértelo al formato ToolResultObject de Copilot SDK
$toolResult = McpCallToolResult::convert($mcpResult);
// $toolResult->textResultForLlm => 'File contents here'
// $toolResult->resultType => 'success'
// $toolResult->binaryResultsForLlm => [['data' => 'base64...', 'mimeType' => 'image/png', 'type' => 'image']]
Consulta la información más reciente en el repositorio de GitHub.
Última modificación el 13 de julio de 2026