Skip to content

Commit 5c60a3d

Browse files
authored
feat: add support for order_bys argument (#13)
1 parent 044e5db commit 5c60a3d

2 files changed

Lines changed: 98 additions & 0 deletions

File tree

analytics_mcp/tools/reporting/core.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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")
317393
async 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:

analytics_mcp/tools/reporting/realtime.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ async def run_realtime_report(
4747
metrics: List[str],
4848
dimension_filter: Dict[str, Any] = None,
4949
metric_filter: Dict[str, Any] = None,
50+
order_bys: List[Dict[str, Any]] = None,
5051
limit: int = None,
5152
offset: int = None,
5253
return_property_quota: bool = False,
@@ -77,6 +78,11 @@ async def run_realtime_report(
7778
`get_metrics` tools.
7879
For more information about the expected format of this argument, see
7980
the `run_report_metric_filter_hints` tool.
81+
order_bys: A list of Data API OrderBy
82+
(https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/OrderBy)
83+
objects to apply to the dimensions and metrics.
84+
For more information about the expected format of this argument, see
85+
the `run_report_order_bys_hints` tool.
8086
limit: The maximum number of rows to return in each response. Value must
8187
be a positive integer <= 250,000. Used to paginate through large
8288
reports, following the guide at
@@ -107,6 +113,11 @@ async def run_realtime_report(
107113
if metric_filter:
108114
request.metric_filter = data_v1beta.FilterExpression(metric_filter)
109115

116+
if order_bys:
117+
request.order_bys = [
118+
data_v1beta.OrderBy(order_by) for order_by in order_bys
119+
]
120+
110121
if limit:
111122
request.limit = limit
112123
if offset:

0 commit comments

Comments
 (0)