2026-02-28 21:53:04 -06:00
<? php
2026-03-01 14:30:24 -06:00
namespace App\Mcp\Tools\FiveM\Client ;
2026-02-28 21:53:04 -06:00
use Illuminate\Contracts\JsonSchema\JsonSchema ;
use Laravel\Mcp\Request ;
use Laravel\Mcp\Response ;
use Laravel\Mcp\Server\Attributes\Description ;
use Laravel\Mcp\Server\Tool ;
2026-03-01 14:30:24 -06:00
#[ Description ( 'Get information about FiveM client-side events including framework events (ESX, QBCore).' )]
class GetEventClientReference extends Tool
2026-02-28 21:53:04 -06:00
{
/**
* Handle the tool request.
*/
public function handle ( Request $request ) : Response
{
$eventName = $request -> get ( 'event_name' );
$eventType = $request -> get ( 'event_type' , 'all' );
$language = $request -> get ( 'language' , 'lua' );
if ( $eventName ) {
return $this -> getEventInfo ( $eventName , $language );
}
return $this -> listEvents ( $eventType , $language );
}
/**
* Get specific event information.
*/
protected function getEventInfo ( string $eventName , string $language ) : Response
{
$events = $this -> getEventsDatabase ();
foreach ( $events as $event ) {
if ( strtolower ( $event [ 'name' ]) === strtolower ( $eventName )) {
return Response :: text ( $this -> formatEventInfo ( $event , $language ));
}
}
2026-03-01 14:30:24 -06:00
return Response :: text ( sprintf ( "Client event '%s' not found in the database." , $eventName ));
2026-02-28 21:53:04 -06:00
}
/**
* List events by type.
*/
protected function listEvents ( string $type , string $language ) : Response
{
$events = $this -> getEventsDatabase ();
if ( $type !== 'all' ) {
$events = array_filter ( $events , fn ( $e ) => $e [ 'type' ] === $type );
}
$eventsByType = [];
foreach ( $events as $event ) {
$eventsByType [ $event [ 'type' ]][] = $event ;
}
return Response :: text (
2026-03-01 14:41:31 -06:00
view ( 'mcp.fivem.event-list' , [
2026-02-28 21:53:04 -06:00
'eventsByType' => $eventsByType ,
]) -> render ()
);
}
/**
* Format event information.
*/
protected function formatEventInfo ( array $event , string $language ) : string
{
2026-03-01 14:41:31 -06:00
return view ( 'mcp.fivem.event-reference' , [
2026-02-28 21:53:04 -06:00
'event' => $event ,
'language' => $language ,
]) -> render ();
}
/**
2026-03-01 14:30:24 -06:00
* Get client events database.
2026-02-28 21:53:04 -06:00
*/
protected function getEventsDatabase () : array
{
return [
2026-03-01 14:30:24 -06:00
// Core FiveM Client Events
2026-02-28 21:53:04 -06:00
[
'name' => 'onResourceStart' ,
'type' => 'core' ,
2026-03-01 14:30:24 -06:00
'side' => 'client' ,
'description' => 'Triggered when a resource starts (client-side)' ,
2026-02-28 21:53:04 -06:00
'parameters' => [
[ 'name' => 'resourceName' , 'type' => 'string' , 'description' => 'The name of the resource that started' ],
],
2026-03-01 14:30:24 -06:00
'lua_example' => "AddEventHandler('onResourceStart', function(resourceName) \n if resourceName == GetCurrentResourceName() then \n print('Resource started on client!') \n end \n end)" ,
'js_example' => "on('onResourceStart', (resourceName) => { \n if (resourceName === GetCurrentResourceName()) { \n console.log('Resource started on client!'); \n } \n });" ,
2026-02-28 21:53:04 -06:00
'documentation' => 'https://docs.fivem.net/docs/scripting-reference/events/list/onResourceStart/' ,
],
[
'name' => 'onResourceStop' ,
'type' => 'core' ,
2026-03-01 14:30:24 -06:00
'side' => 'client' ,
'description' => 'Triggered when a resource stops (client-side)' ,
2026-02-28 21:53:04 -06:00
'parameters' => [
[ 'name' => 'resourceName' , 'type' => 'string' , 'description' => 'The name of the resource that stopped' ],
],
2026-03-01 14:30:24 -06:00
'lua_example' => "AddEventHandler('onResourceStop', function(resourceName) \n if resourceName == GetCurrentResourceName() then \n print('Resource stopped on client!') \n end \n end)" ,
'js_example' => "on('onResourceStop', (resourceName) => { \n if (resourceName === GetCurrentResourceName()) { \n console.log('Resource stopped on client!'); \n } \n });" ,
2026-02-28 21:53:04 -06:00
'documentation' => 'https://docs.fivem.net/docs/scripting-reference/events/list/onResourceStop/' ,
],
2026-03-01 14:30:24 -06:00
// ESX Client Events
2026-02-28 21:53:04 -06:00
[
'name' => 'esx:playerLoaded' ,
'type' => 'esx' ,
'side' => 'client' ,
'description' => 'Triggered when ESX player data is loaded on client' ,
'parameters' => [
[ 'name' => 'xPlayer' , 'type' => 'table' , 'description' => 'ESX player object' ],
],
'lua_example' => "RegisterNetEvent('esx:playerLoaded', function(xPlayer) \n ESX.PlayerData = xPlayer \n -- Player is loaded \n end)" ,
'js_example' => "RegisterNetEvent('esx:playerLoaded', (xPlayer) => { \n ESX.PlayerData = xPlayer; \n // Player is loaded \n });" ,
],
[
'name' => 'esx:setJob' ,
'type' => 'esx' ,
'side' => 'client' ,
'description' => 'Triggered when player job changes' ,
'parameters' => [
[ 'name' => 'job' , 'type' => 'table' , 'description' => 'New job object' ],
],
'lua_example' => "RegisterNetEvent('esx:setJob', function(job) \n ESX.PlayerData.job = job \n print('Job changed to: ' .. job.name) \n end)" ,
'js_example' => "RegisterNetEvent('esx:setJob', (job) => { \n ESX.PlayerData.job = job; \n console.log(`Job changed to: \$ {job.name}`); \n });" ,
],
2026-03-01 14:30:24 -06:00
// QBCore Client Events
2026-02-28 21:53:04 -06:00
[
'name' => 'QBCore:Client:OnPlayerLoaded' ,
'type' => 'qbcore' ,
'side' => 'client' ,
'description' => 'Triggered when QBCore player data is loaded on client' ,
'parameters' => [],
'lua_example' => "RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() \n local PlayerData = QBCore.Functions.GetPlayerData() \n -- Player is loaded \n end)" ,
'js_example' => "RegisterNetEvent('QBCore:Client:OnPlayerLoaded', () => { \n const PlayerData = QBCore.Functions.GetPlayerData(); \n // Player is loaded \n });" ,
],
[
'name' => 'QBCore:Client:OnJobUpdate' ,
'type' => 'qbcore' ,
'side' => 'client' ,
'description' => 'Triggered when player job changes in QBCore' ,
'parameters' => [
[ 'name' => 'job' , 'type' => 'table' , 'description' => 'New job object' ],
],
'lua_example' => "RegisterNetEvent('QBCore:Client:OnJobUpdate', function(job) \n PlayerData.job = job \n print('Job changed to: ' .. job.name) \n end)" ,
'js_example' => "RegisterNetEvent('QBCore:Client:OnJobUpdate', (job) => { \n PlayerData.job = job; \n console.log(`Job changed to: \$ {job.name}`); \n });" ,
],
];
}
/**
* Get the tool's input schema.
*
* @return array<string, \Illuminate\Contracts\JsonSchema\JsonSchema>
*/
public function schema ( JsonSchema $schema ) : array
{
return [
'event_name' => $schema
-> string ()
2026-03-01 14:30:24 -06:00
-> description ( 'Specific client event name to look up (optional, leave empty to list all events)' ),
2026-02-28 21:53:04 -06:00
'event_type' => $schema
-> string ()
-> enum ([ 'all' , 'core' , 'esx' , 'qbcore' ])
-> description ( 'Filter events by type' )
-> default ( 'all' ),
'language' => $schema
-> string ()
-> enum ([ 'lua' , 'js' ])
-> description ( 'The scripting language for code examples' )
-> default ( 'lua' ),
];
}
}