@@ -313,6 +313,82 @@ def run_report_dimension_filter_hints():
313313 )
314314
315315
316+ @mcp .tool (
317+ title = (
318+ "Provide hints about the expected values for the order_bys argument for the run_report and run_realtime_report tools"
319+ )
320+ )
321+ def run_report_order_bys_hints ():
322+ """Returns examples of valid order_bys arguments for the run_report and run_realtime_report tools."""
323+ dimension_alphanumeric_ascending = data_v1beta .OrderBy (
324+ dimension = data_v1beta .OrderBy .DimensionOrderBy (
325+ dimension_name = "eventName" ,
326+ order_type = data_v1beta .OrderBy .DimensionOrderBy .OrderType .ALPHANUMERIC ,
327+ ),
328+ desc = False ,
329+ )
330+ dimension_alphanumeric_no_case_descending = data_v1beta .OrderBy (
331+ dimension = data_v1beta .OrderBy .DimensionOrderBy (
332+ dimension_name = "campaignName" ,
333+ order_type = data_v1beta .OrderBy .DimensionOrderBy .OrderType .CASE_INSENSITIVE_ALPHANUMERIC ,
334+ ),
335+ desc = True ,
336+ )
337+ dimension_numeric_ascending = data_v1beta .OrderBy (
338+ dimension = data_v1beta .OrderBy .DimensionOrderBy (
339+ dimension_name = "audienceId" ,
340+ order_type = data_v1beta .OrderBy .DimensionOrderBy .OrderType .NUMERIC ,
341+ ),
342+ desc = False ,
343+ )
344+ metric_ascending = data_v1beta .OrderBy (
345+ metric = data_v1beta .OrderBy .MetricOrderBy (
346+ metric_name = "eventCount" ,
347+ ),
348+ desc = False ,
349+ )
350+ metric_descending = data_v1beta .OrderBy (
351+ metric = data_v1beta .OrderBy .MetricOrderBy (
352+ metric_name = "eventValue" ,
353+ ),
354+ desc = True ,
355+ )
356+
357+ return f"""Example order_bys arguments:
358+
359+ 1. Order by ascending 'eventName':
360+ [ { proto_to_json (dimension_alphanumeric_ascending )} ]
361+
362+ 2. Order by descending 'eventName', ignoring case:
363+ [ { proto_to_json (dimension_alphanumeric_no_case_descending )} ]
364+
365+ 3. Order by ascending 'audienceId':
366+ [ { proto_to_json (dimension_numeric_ascending )} ]
367+
368+ 4. Order by descending 'eventCount':
369+ [ { proto_to_json (metric_descending )} ]
370+
371+ 5. Order by ascending 'eventCount':
372+ [ { proto_to_json (metric_ascending )} ]
373+
374+ 6. Combination of dimension and metric order bys:
375+ [
376+ { proto_to_json (dimension_alphanumeric_ascending )} ,
377+ { proto_to_json (metric_descending )} ,
378+ ]
379+
380+ 7. Order by multiple dimensions and metrics:
381+ [
382+ { proto_to_json (dimension_alphanumeric_ascending )} ,
383+ { proto_to_json (dimension_numeric_ascending )} ,
384+ { proto_to_json (metric_descending )} ,
385+ ]
386+
387+ The dimensions and metrics in order_bys must also be present in the report
388+ request's "dimensions" and "metrics" arguments, respectively.
389+ """
390+
391+
316392@mcp .tool (title = "Run a Google Analytics report using the Data API" )
317393async def run_report (
318394 property_id : str ,
@@ -321,6 +397,7 @@ async def run_report(
321397 metrics : List [str ],
322398 dimension_filter : Dict [str , Any ] = None ,
323399 metric_filter : Dict [str , Any ] = None ,
400+ order_bys : List [Dict [str , Any ]] = None ,
324401 limit : int = None ,
325402 offset : int = None ,
326403 currency_code : str = None ,
@@ -360,6 +437,11 @@ async def run_report(
360437 `get_metrics` tools.
361438 For more information about the expected format of this argument, see
362439 the `run_report_metric_filter_hints` tool.
440+ order_bys: A list of Data API OrderBy
441+ (https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/OrderBy)
442+ objects to apply to the dimensions and metrics.
443+ For more information about the expected format of this argument, see
444+ the `run_report_order_bys_hints` tool.
363445 limit: The maximum number of rows to return in each response. Value must
364446 be a positive integer <= 250,000. Used to paginate through large
365447 reports, following the guide at
@@ -391,6 +473,11 @@ async def run_report(
391473 if metric_filter :
392474 request .metric_filter = data_v1beta .FilterExpression (metric_filter )
393475
476+ if order_bys :
477+ request .order_bys = [
478+ data_v1beta .OrderBy (order_by ) for order_by in order_bys
479+ ]
480+
394481 if limit :
395482 request .limit = limit
396483 if offset :
0 commit comments