// Your data model
public record YourData
{
    public SteamId SteamId { get; set; }
    public string FirstName { get; set;}
}

// Create your struct request
private struct GetDataRequest( int dataId ) : IRpcRequest
{
    public Guid CallbackId { get; set; }
    public readonly int DataId = dataId;
}

// Create your struct response
private struct GetDataResponse( YourData data ) : IRpcResponse
{
    public Guid CallbackId { get; set; }
    public readonly YourData Data = data;
}

// Called on the host
private static GetDataResponse OnGetDataRequest( GetDataRequest request )
{
    // Do your work here and return the result
    var data = ...

    return new GetDataResponse( data );
}

In your custom script, e.g Character.cs
// Register your rpc callback here
protected override void OnStart()
{
    if ( IsProxy ) return;

    RpcServer.RegisterHandler<GetDataRequest, GetDataResponse>( OnGetDataRequest );
}

// Call this function on the client to get your data
public static async Task<YourData> GetDataAsync( int dataId )
{
    var request = new GetDataRequest( dataId );
        
    // Your data is store in the result variable
    var result = await RpcClient.SendRpc<GetDataRequest, GetDataResponse>( request );
    return result.Data;
}