Skip to main content
Glama

Georgia Civic Data

aggregate

Compute a grouped aggregate over one topic — the aggregation-first path. agg is one of avg/sum/min/max/count/weighted_rate; metric is a metric column (DEFAULTS to the topic key_metric; ignored for count); group_by is a list of grain columns (year, FK codes like district_code or county_fips, or categoricals — see describe_dataset). weighted_rate computes a true population-weighted SUM(numerator)/SUM(denominator) for a rate key metric (when the contract declares the components) — prefer it over avg for a rate across multiple places/years, since avg means the per-row rates and ignores population. Supports the same filters / year / year_min-year_max / detail as query_dataset, plus order_by+order for top-N (order_by 'value' for the aggregated column; NULL cells sort LAST in either direction). Returns one small row per group with <metric>_<agg> (or row_count) plus coverage diagnostics (input_rows / non-null counts) so suppression is visible; aggregation_scope flags whether rows are source-published at this grain or recomputed from a finer detail (prefer source-published — see the advisory). Aggregates SKIP NULLs and NULL means SUPPRESSED not zero. No raw SQL: all identifiers are contract-allowlisted.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
aggNoavg
yearNo
limitNo
orderNoasc
topicYes
detailNo
metricNo
offsetNo
filtersNo
group_byNo
order_byNo
year_maxNo
year_minNo
main_topicNoeducation

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden — and it is exceptional: it discloses NULL handling ("SKIP NULLs and NULL means SUPPRESSED not zero"), the true population-weighted SUM(numerator)/SUM(denominator) semantics of weighted_rate versus avg's per-row rates, NULL sort placement ("sort LAST in either direction"), and output behaviors like aggregation_scope flagging source-published vs recomputed grains with coverage diagnostics so suppression is visible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then moves through agg semantics, shared-parameter cross-reference, output shape, and interpretation warnings. Every sentence earns its place — param semantics, weighted_rate vs avg, NULL behavior, aggregation_scope, and the allowlisting constraint are all non-redundant. The density is justified by 14 params and 0% schema coverage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-param tool with no annotations and a bare schema, this is complete: it covers all functional parameters, output structure (even exceeding the requirement since an output schema exists), interpretation of suppression, and the security model ("No raw SQL: all identifiers are contract-allowlisted"). Cross-references to describe_dataset, query_dataset, the advisory, and the contract give the agent precise next steps. Only main_topic and limit/offset are left implicit, which is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description is the sole source of parameter meaning and it compensates thoroughly: it enumerates all agg values, explains weighted_rate's formula, states that metric "DEFAULTS to the topic key_metric; ignored for count", defines group_by grain types with concrete FK examples (district_code, county_fips), and specifies order_by/order usage including 'value' and NULL ordering. Pagination params (limit/offset) are left implicit but are standard.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Compute a grouped aggregate over one topic — the aggregation-first path" names a specific verb (compute), a resource (grouped aggregate), and a scope (one topic). The "aggregation-first path" phrasing positions it against sibling query_dataset, and the detailed agg/group_by semantics make it clearly distinct from describe_dataset, distinct_values, and query_dataset.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives rich routing guidance: "prefer it over `avg` for a rate across multiple places/years", "prefer source-published — see the advisory", and "Supports the same filters/year/year_min-year_max/detail as query_dataset", which cross-references the sibling and reuses its parameter semantics. However, it never states an explicit when-not-to-use rule against query_dataset (e.g., "use query_dataset for raw rows"), so it earns 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.5/5.0
Disambiguation5/5

Each tool maps to a distinct capability: discovery, schema, values, entity resolution, row query, aggregation, cross-dataset joins, and dimension reads. Even the pairs that sound closest (list_datasets vs search_datasets, describe_dataset vs get_contract) are explicitly differentiated by behavior and use case.

Naming Consistency4/5

Names are uniformly lowercase snake_case and mostly follow a clear verb_noun pattern (describe_dataset, query_dataset, resolve_entity, link_tables). Only aggregate (bare verb) and distinct_values (noun phrase without a verb) deviate slightly from that pattern.

Tool Count5/5

Twelve tools is a well-scoped size for a data-access MCP server. Each tool adds a non-redundant capability, supporting the full workflow from discovery and schema inspection to querying, aggregation, and cross-dataset joins.

Completeness5/5

The surface covers the complete read-only lifecycle: catalog discovery, schema/dimension inspection, value and entity lookup, row-level queries, grouped aggregation, cross-dataset analysis, and dimension table reads. Bulk data access is handled via pointers in query results rather than a dedicated tool, which is a deliberate non-gap for this query-focused server.

Resources