Skip to main content
Glama

socrata-mcp-server

Server Details

Search and query government open-data portals (Socrata SODA API).

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
cyanheads/socrata-mcp-server
GitHub Stars
3
Server Listing
@cyanheads/socrata-mcp-server

Available Tools

6 tools
socrata_dataframe_describeDescribe DataCanvas TablesA
Read-onlyIdempotent
Inspect

List registered tables in a DataCanvas session — schema, row count, and column names. Shows what datasets are available for SQL queries via socrata_dataframe_query. Only meaningful when CANVAS_PROVIDER_TYPE=duckdb is set. Use after socrata_query_dataset spills a large result set to canvas.

ParametersJSON Schema
NameRequiredDescriptionDefault
canvas_idNoCanvas ID returned by socrata_query_dataset when a large result spills to canvas. Required in practice when canvas is enabled — canvases cannot be enumerated, so omitting it fails with canvas_id_required instead of listing tables.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoStatus message when canvas is not enabled or no tables are registered. Absent when tables are present.
tablesNoTables available for SQL queries. Empty when none registered.
canvas_idNoCanvas ID resolved, when canvas is enabled.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the lack of destructive side effects is covered. The description adds meaningful behavioral context beyond that: the environment requirement (duckdb provider), the session/scoped nature of the data, and the trigger condition tied to canvas spill-over from socrata_query_dataset.

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?

Three tight sentences lead with the core behavior and outputs, then add the relational context, environment prerequisite, and invocation timing. There is no filler or repetition of schema details that are already present.

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 read-only, one-parameter tool with an output schema and strong annotations, the description covers the necessary invocation context: what it lists, when to call it, and the sole parameter's provenance and failure behavior. Nothing critical is missing.

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?

Although the schema already describes canvas_id at 100% coverage, the description adds valuable practical semantics: the canvas ID comes from socrata_query_dataset when a result spills, it is required in practice even though the schema marks it optional, and omitting it yields canvas_id_required. This materially helps an agent invoke the tool correctly.

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?

The description uses a specific verb and resource: it lists registered tables in a DataCanvas session and names the included details (schema, row count, column names). It also positions itself against sibling tools like socrata_dataframe_query and socrata_query_dataset, so an agent can distinguish it from nearby alternatives.

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 clear contextual guidance: use it after socrata_query_dataset writes a large result set to canvas, and note that it only matters when CANVAS_PROVIDER_TYPE=duckdb is set. It stops short of explicitly saying when not to use it or naming an alternative, but the usage context is strong.

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

socrata_dataframe_queryQuery DataCanvas TableA
Read-onlyIdempotent
Inspect

Run SELECT-only SQL against a DataCanvas table populated by socrata_query_dataset. DuckDB infers types from spilled data, so numeric columns that SODA returned as strings become queryable with numeric comparisons (year > 2020, amount < 500). Only works when CANVAS_PROVIDER_TYPE=duckdb is set. Use socrata_dataframe_describe to see registered tables and their schemas.

ParametersJSON Schema
NameRequiredDescriptionDefault
sqlYesSELECT-only SQL to run against registered canvas tables. DDL, DML, and file-reading functions are rejected. Use table names from socrata_dataframe_describe.
limitNoMax rows to return (1–10000). Default 1000.
canvas_idYesCanvas ID returned from socrata_query_dataset or socrata_dataframe_describe.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe row limit that was applied when capped.
sqlNoSQL that was executed.
rowsNoQuery result rows. DuckDB may return native JS types (number, boolean, null) for numeric/boolean columns.
errorNoPresent when the call failed. Absent on success.
shownNoRows returned in this response when capped.
noticeNoGuidance when the SQL returned zero rows. Absent when rows are present.
canvas_idNoCanvas ID queried.
row_countNoNumber of rows returned.
truncatedNoTrue when results were capped at the limit — more rows match the query.

TDQS

A4.7/5.0
Behavior5/5

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

Despite readOnlyHint and idempotentHint annotations, the description adds real behavioral value: it explains DuckDB's type inference, the numeric-comparison benefit, the CANVAS_PROVIDER_TYPE=duckdb requirement, and the fact that this is a local table query over spilled data. This goes well beyond what annotations communicate.

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?

Four sentences, each carrying distinct value: purpose, type behavior, environment prerequisite, and schema-discovery pointer. No filler or repeated schema information.

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?

With an output schema present and a fully documented input schema, the description covers the essential operational context: what kind of SQL is allowed, how to find table names, the environment prerequisite, and the type-inference behavior. Nothing critical is missing for an agent to invoke this correctly.

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

Parameters4/5

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

The schema already covers all three parameters at 100% coverage, so the baseline is 3. The description adds meaningful semantic context for the sql parameter by explaining type coercion behavior with concrete examples (year > 2020, amount < 500), which helps an agent write effective queries.

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?

The description opens with a specific verb and resource: "Run SELECT-only SQL against a DataCanvas table." It also distinguishes itself from socrata_query_dataset by noting the table is populated by that tool, making the query-layer role clear to an agent.

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?

It gives clear context: use this after socrata_query_dataset has populated a table, use socrata_dataframe_describe to inspect registered tables, and only use it when CANVAS_PROVIDER_TYPE=duckdb is set. It does not explicitly contrast with every sibling alternative, but the workflow guidance is strong.

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

socrata_find_datasetsFind Socrata DatasetsA
Read-onlyIdempotent
Inspect

Search for datasets across all Socrata-powered government open-data portals, or scope to one portal with the domain parameter. Returns dataset IDs, names, abbreviated column lists, domains, and update timestamps. Use socrata_get_dataset to fetch the full typed column schema before writing queries — columnNames here are preview-only and lack type information.

ParametersJSON Schema
NameRequiredDescriptionDefault
onlyNoFilter by asset type. Omit to include all types. Usually "datasets" is what you want.
tagsNoFilter by tags (e.g. ["covid19", "permits"]).
limitNoNumber of results to return (1–100). Default 10.
orderNoSort order. Defaults to relevance. Use updated_at to surface recently-refreshed datasets.
queryNoFull-text search across dataset names and descriptions. Omit to browse without filtering.
domainNoScope search to a single portal (e.g. data.seattle.gov, data.cityofnewyork.us). Omit to search all portals.
offsetNoPagination offset. Default 0.
categoriesNoFilter by domain categories (e.g. ["Public Safety", "Transportation"]).

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery hint when results are empty — echoes filters and suggests how to broaden. Absent on non-empty result pages.
resultsNoMatching datasets. Empty when no results.
totalCountNoTotal matches before pagination. 0 when empty.
effectiveQueryNoSearch query applied, for reference.

TDQS

A5/5.0
Behavior5/5

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

While annotations already declare readOnly, openWorld, and idempotent hints, the description adds transparency about the output quality by warning that columnNames are preview-only and lack type information. No side effects or destructive actions are implied, consistent with the readOnlyHint.

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 succinct, starting with the core purpose, then listing the return values, and ending with a crucial caveat about columnNames. It avoids verbosity while conveying essential information in a clear sequence.

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?

The description covers key aspects: the scope (all portals or one), the output fields (IDs, names, column lists, domains, update timestamps), pagination via offset/limit, sorting via order, and the relationship to socrata_get_dataset. This is sufficient for an agent to decide when and how to invoke the tool.

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?

Every parameter (query, domain, categories, tags, limit, offset, order, only) is described with examples and constraints, such as 'Use updated_at to surface recently-refreshed datasets' and 'Omit to browse without filtering.' The schema provides full coverage, and the description adds semantic context beyond the field names.

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?

The description clearly states the tool's purpose: to search for datasets across all Socrata portals or a specific one via the domain parameter. It also differentiates from socrata_get_dataset by noting that columnNames are preview-only, making it distinct as a discovery tool.

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

Usage Guidelines5/5

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

The description provides explicit guidance: use socrata_get_dataset to fetch the full typed column schema before writing queries, highlighting the limitation of preview-only columnNames. It also mentions using order=updated_at to surface recently-refreshed datasets, offering concrete usage advice.

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

socrata_get_datasetGet Dataset SchemaA
Read-onlyIdempotent
Inspect

Fetch full metadata and column schema for a Socrata dataset by ID. Returns field names, data types, descriptions, row count, and licensing. Always call this before writing a socrata_query_dataset — the column types determine correct WHERE clause syntax: Number columns accept bare literals (year=2023) while Text columns require single-quoted strings (year='2023').

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNoPortal domain (e.g. data.seattle.gov). Defaults to SOCRATA_DEFAULT_DOMAIN env var or data.seattle.gov.
dataset_idYesFour-by-four dataset ID matching pattern like kzjm-xkqj. Obtain from socrata_find_datasets.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoDataset display name.
tagsNoAssociated tags.
errorNoPresent when the call failed. Absent on success.
domainNoPortal domain hosting this dataset.
columnsNoColumn schema. Computed region columns (:@computed_region_*) are excluded to reduce noise.
licenseNoLicense name when available.
categoryNoDomain category when available.
row_countNoApproximate row count when available. See row_count_source for provenance.
dataset_idNoFour-by-four dataset ID.
descriptionNoDataset description when available.
data_updated_atNoISO 8601 timestamp of last data update when available.
row_count_sourceNoHow row_count was obtained: 'top_level_cached_contents' — reported directly by the portal's views metadata; 'column_cached_contents' — derived as the maximum per-column cached count when the top-level value is absent. Absent when row_count is absent.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already mark the operation read-only and idempotent, and the description adds behavioral context: it returns field names, types, descriptions, row count, and licensing, and warns about literal quoting conventions. No contradiction.

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?

Two sentences with a front-loaded purpose and a focused syntax example; no filler.

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

Completeness4/5

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

The description covers the call's purpose, prerequisite (dataset_id), result contents, and its role feeding socrata_query_dataset. With an output schema present, return-value details are appropriately left to the schema; it could mention dataframe siblings, but that is not essential.

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

Parameters3/5

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

Input schema is 100% covered, with dataset_id describing the ID pattern and source and domain documenting its default. The description reinforces the ID-based lookup but does not need to add parameter-level detail beyond the schema.

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?

Clearly identifies the operation (fetch metadata/schema by ID) and the resource (Socrata dataset), and differentiates from query tools by focusing on schema rather than rows. The references to column types and WHERE syntax make its role unambiguous.

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

Usage Guidelines5/5

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

Explicitly directs agents to call it before socrata_query_dataset and explains why; it also references socrata_find_datasets as the source of dataset_id in the schema. This is strong when-to-use guidance.

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

socrata_list_portalsList Socrata PortalsA
Read-onlyIdempotent
Inspect

List known Socrata-powered government open-data portals with their domain, organization name, and approximate dataset count. The catalog is a curated list of 40 well-known portals; dataset counts are fetched from the Discovery API and cached for ~24 hours. Filtering is client-side substring match on the query parameter. Use this first when you do not know which portal to target, then pass the domain to socrata_find_datasets.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax portals to return (1–200). Default 50.
queryNoKeyword to filter portal names or organization names (case-insensitive substring match). Omit to list all portals.
offsetNoPagination offset. Default 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery hint when no portals matched the filter. Absent on non-empty pages.
portalsNoMatching portals. Empty when no results.
totalCountNoTotal portals before pagination. 0 when empty.

TDQS

A4.7/5.0
Behavior5/5

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

The annotations already declare readOnlyHint and idempotentHint, but the description adds substantial behavioral context: the catalog is a curated list of 40 portals, dataset counts are fetched from the Discovery API and cached for ~24 hours (so they may be stale), and filtering is client-side substring match. These details are valuable for correct invocation and interpretation.

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?

Three terse sentences with no fluff. The first sentence defines the operation, the second provides essential caveats, and the third gives actionable routing guidance. All content is relevant and front-loaded.

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 read-only, parameterless-required list tool with an output schema, this description is complete. It covers the catalog scope, data freshness, filtering behavior, and suggestions for follow-up actions. No additional context is needed for an agent to select and invoke it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all three parameters thoroughly. The description adds the client-side filtering nuance for 'query', but this is marginal beyond the schema. Baseline 3 is appropriate.

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?

States a specific verb and resource: 'List known Socrata-powered government open-data portals' with fields: domain, organization name, and approximate dataset count. It also names the sibling 'socrata_find_datasets' and explains the relationship, distinguishing the tool clearly.

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

Usage Guidelines5/5

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

Gives explicit guidance: 'Use this first when you do not know which portal to target, then pass the domain to socrata_find_datasets.' This tells the agent when to choose this tool over alternatives and what to do next, leaving nothing to inference.

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

socrata_query_datasetQuery DatasetA
Read-onlyIdempotent
Inspect

Execute a SoQL query against any dataset on any Socrata portal. Use the search parameter for quick full-text lookup, or combine select/where/group/having/order for full analytical control. Returns rows plus the assembled SoQL string so you can learn the pattern. All SODA 2.1 row values are strings even for numeric columns — check dataType from socrata_get_dataset to determine correct WHERE quoting: Number columns use bare literals (year=2023), Text columns use single-quoted strings (year='2023'). To enumerate distinct values, use select="col, count(*) as n" with group="col" and order="n DESC". When CANVAS_PROVIDER_TYPE=duckdb and rows fill the limit, results spill to a DataCanvas table for SQL-based analysis.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupNoSoQL GROUP BY clause. Requires an aggregate function in select.
limitNoMax rows to return (1–5000). Default 100. Use with offset for pagination.
orderNoSoQL ORDER BY clause, e.g. "total_deaths DESC" or "date ASC".
whereNoSoQL WHERE clause. Check column dataType from socrata_get_dataset first — Number columns: year=2023, Text columns: year='2023'. Operators: =, !=, >, <, LIKE, IN(...), BETWEEN, IS NULL, starts_with(), contains(), AND, OR, NOT.
domainNoPortal domain (e.g. data.seattle.gov). Defaults to SOCRATA_DEFAULT_DOMAIN or data.seattle.gov.
havingNoSoQL HAVING clause. Filters on aggregated results, e.g. count > 100.
offsetNoRow offset for pagination. Default 0.
searchNoFull-text search across all text columns ($q). For field-specific filtering, use where instead.
selectNoSoQL SELECT clause — column names, aliases, aggregates: "state, sum(deaths) as total_deaths". Omit for all columns.
canvas_idNoOptional 10-char DataCanvas token from a prior call. Omit on first call when CANVAS_PROVIDER_TYPE=duckdb to mint a fresh canvas. Large result sets spill here automatically.
dataset_idYesFour-by-four dataset ID (e.g. kzjm-xkqj). Obtain from socrata_find_datasets.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe row limit that was applied when capped.
rowsNoResult rows. Scalar values are strings (SODA 2.1); geo/location columns return nested objects. Use column schema from socrata_get_dataset for type context.
errorNoPresent when the call failed. Absent on success.
shownNoRows returned in this response when capped.
domainNoPortal domain queried.
noticeNoGuidance when the query returned zero rows — suggests narrowing or reviewing the SoQL. Absent on non-empty result sets.
canvas_idNoDataCanvas token when results spilled (requires CANVAS_PROVIDER_TYPE=duckdb). Pass to socrata_dataframe_query to run SQL over the staged rows — a bounded copy of the matching set (up to 50,000 rows, reported in canvas_row_count), not the full set when total_count exceeds that cap. Page with offset to reach rows beyond it.
row_countNoRows returned in this response.
truncatedNoTrue when rows filled the limit — more rows may match (see total_count when present). Spills to canvas when enabled.
dataset_idNoDataset ID queried.
total_countNoTotal matching source rows when a plain row query is truncated (row_count < total_count). Absent when the full result fits and for grouped/aggregate queries (group set), where a source-row count would not describe the returned groups.
assembled_queryNoSoQL clauses assembled for this request — useful for learning the syntax.
canvas_row_countNoRows staged onto the DataCanvas — a bounded copy of the matching result set (capped at 50,000). Fewer than total_count when the match exceeds the cap. Present only when canvas_id is.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds important behavior beyond annotations: returned rows include the assembled SoQL string, all SODA 2.1 row values are strings regardless of column type, and results spill to a DataCanvas table under duckdb conditions. These are critical, non-obvious behaviors that materially affect how an agent interprets and uses results.

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 dense but efficient—about six sentences, each with a distinct job: core purpose, usage mode, return format, data-type caveat, distinct-value example, spill behavior. Information is front-loaded with the most important action and purpose first. No filler or repetition that would dilute the message.

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 complex 11-parameter tool, the description covers the main execution modes, a critical data-type gotcha, an advanced aggregation pattern, and the spill-to-DataCanvas behavior. The output schema already covers return values, so the description does not need to restate them. The only minor omission is error handling or authentication, but annotations and schema make this a non-issue for a read-only query tool.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds value by demonstrating how parameters combine into a coherent query strategy, especially the distinct-value example and the quoting rules tied to dataType. Some of this content also appears in the schema, but the description reinforces it in a usage-oriented way that helps an agent compose valid SoQL.

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?

Description opens with a specific verb+resource: 'Execute a SoQL query against any dataset on any Socrata portal.' It clearly distinguishes itself from siblings like socrata_get_dataset (metadata) and socrata_dataframe_query (dataframe-based) by focusing on raw SoQL execution. The distinction between full-text search and analytical querying further sharpens purpose.

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?

Provides clear conditions: use `search` for quick full-text lookup, or combine `select/where/group/having/order` for analytical control. References socrata_get_dataset as a prerequisite for checking data types, and gives a concrete pattern for distinct-value enumeration. It does not explicitly state when to prefer sibling alternatives, but the within-tool guidance is strong and actionable.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 6 tool updates
    • Changedsocrata_dataframe_describe6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "tables"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_id_required`: Canvas is enabled but canvas_id was omitted or blank. `canvas_not_found`: Provided canvas_id does not match any registered canvas. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_id_required",
        +            "canvas_not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "tables"
        -]
    • Changedsocrata_dataframe_query6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "rows",
        +      "row_count",
        +      "sql",
        +      "canvas_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `canvas_disabled`: CANVAS_PROVIDER_TYPE is not set to duckdb — DataCanvas is unavailable. `canvas_not_found`: canvas_id does not match any registered canvas. `table_not_found`: The SQL referenced a canvas table that does not exist — expired, dropped, or a mistyped name. `sql_rejected`: SQL was not a SELECT statement, referenced a system catalog, or contained disallowed functions. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_disabled",
        +            "canvas_not_found",
        +            "table_not_found",
        +            "sql_rejected"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "rows",
        -  "row_count",
        -  "sql",
        -  "canvas_id"
        -]
    • Changedsocrata_find_datasets6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `rate_limited`: Discovery API returned 429. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results",
        -  "totalCount"
        -]
    • Changedsocrata_get_dataset6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "dataset_id",
        +      "domain",
        +      "name",
        +      "tags",
        +      "columns"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_id`: Dataset ID does not match the four-by-four pattern. `not_found`: Valid ID format but dataset does not exist on this domain. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_id",
        +            "not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "dataset_id",
        -  "domain",
        -  "name",
        -  "tags",
        -  "columns"
        -]
    • Changedsocrata_list_portals6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "portals",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `rate_limited`: Discovery API returned 429. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "portals",
        -  "totalCount"
        -]
    • Changedsocrata_query_dataset6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "rows",
        +      "row_count",
        +      "assembled_query",
        +      "domain",
        +      "dataset_id"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_id`: Dataset ID does not match the four-by-four pattern. `not_found`: Dataset does not exist on this domain. `soql_error`: SoQL syntax error or unknown column name. `rate_limited`: SODA endpoint returned 429. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_id",
        +            "not_found",
        +            "soql_error",
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "rows",
        -  "row_count",
        -  "assembled_query",
        -  "domain",
        -  "dataset_id"
        -]
  2. 1 tool update
    • Changedsocrata_query_dataset2 fields changed
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"DataCanvas token when results spilled (requires CANVAS_PROVIDER_TYPE=duckdb). Pass to socrata_dataframe_query for SQL over the full result set."New value: +"DataCanvas token when results spilled (requires CANVAS_PROVIDER_TYPE=duckdb). Pass to socrata_dataframe_query to run SQL over the staged rows — a bounded copy of the matching set (up to 50,000 rows, reported in canvas_row_count), not the full set when total_count exceeds that cap. Page with offset to reach rows beyond it."
      • addedOutput schema / properties / canvas_row_count
        Added value: +{
        +  "description": "Rows staged onto the DataCanvas — a bounded copy of the matching result set (capped at 50,000). Fewer than total_count when the match exceeds the cap. Present only when canvas_id is.",
        +  "type": "number"
        +}
  3. 2 tool updates
    • Changedsocrata_get_dataset2 fields changed
      • changedOutput schema / properties / row_count / description
        Previous value: -"Approximate row count when available."New value: +"Approximate row count when available. See row_count_source for provenance."
      • addedOutput schema / properties / row_count_source
        Added value: +{
        +  "description": "How row_count was obtained: 'top_level_cached_contents' — reported directly by the portal's views metadata; 'column_cached_contents' — derived as the maximum per-column cached count when the top-level value is absent. Absent when row_count is absent.",
        +  "enum": [
        +    "top_level_cached_contents",
        +    "column_cached_contents"
        +  ],
        +  "type": "string"
        +}
    • Changedsocrata_list_portals3 fields changed
      • addedOutput schema / properties / portals / items / properties / dataset_count / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / portals / items / properties / dataset_count / description
        Previous value: -"Number of datasets on this portal."New value: +"Approximate count of dataset-type assets on this portal from the Discovery API catalog (point-in-time, refreshed ~daily). 0 means the portal exposes no dataset assets to the catalog; null means the live count is temporarily unavailable."
      • removedOutput schema / properties / portals / items / properties / dataset_count / type
        Removed value: -"number"
  4. 2 tool updates
    • Changedsocrata_dataframe_describe1 field changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"Canvas ID returned from socrata_query_dataset. Omit to list all tables visible in the current session."New value: +"Canvas ID returned by socrata_query_dataset when a large result spills to canvas. Required in practice when canvas is enabled — canvases cannot be enumerated, so omitting it fails with canvas_id_required instead of listing tables."
    • Changedsocrata_query_dataset2 fields changed
      • changedOutput schema / properties / total_count / description
        Previous value: -"Total matching rows when result is truncated (row_count < total_count). Absent when the full result fits."New value: +"Total matching source rows when a plain row query is truncated (row_count < total_count). Absent when the full result fits and for grouped/aggregate queries (group set), where a source-row count would not describe the returned groups."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when rows filled the limit — more rows match (see total_count). Spills to canvas when enabled."New value: +"True when rows filled the limit — more rows may match (see total_count when present). Spills to canvas when enabled."
  5. 2 tool updates
    • Changedsocrata_dataframe_query3 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The row limit that was applied when capped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Rows returned in this response when capped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when results were capped at the limit — more rows match the query.",
        +  "type": "boolean"
        +}
    • Changedsocrata_query_dataset3 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The row limit that was applied when capped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Rows returned in this response when capped.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when rows filled the limit — more rows match (see total_count). Spills to canvas when enabled.",
        +  "type": "boolean"
        +}
  6. 5 tool updates
    • Changedsocrata_dataframe_describe2 fields changed
      • removedOutput schema / properties / message
        Removed value: -{
        -  "description": "Status message when canvas is not enabled or no tables are registered. Absent when tables are present.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Status message when canvas is not enabled or no tables are registered. Absent when tables are present.",
        +  "type": "string"
        +}
    • Changedsocrata_dataframe_query1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when the SQL returned zero rows. Absent when rows are present.",
        +  "type": "string"
        +}
    • Changedsocrata_find_datasets7 fields changed
      • addedOutput schema / properties / effectiveQuery
        Added value: +{
        +  "description": "Search query applied, for reference.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / message
        Removed value: -{
        -  "description": "Recovery hint when results are empty — echoes filters and suggests how to broaden. Absent on non-empty result pages.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Recovery hint when results are empty — echoes filters and suggests how to broaden. Absent on non-empty result pages.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / query
        Removed value: -{
        -  "description": "Search query applied, for reference.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total matches before pagination. 0 when empty.",
        +  "type": "number"
        +}
      • removedOutput schema / properties / total_count
        Removed value: -{
        -  "description": "Total matches before pagination. 0 when empty.",
        -  "type": "number"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "results",
        -  "total_count"
        -]New value: +[
        +  "results",
        +  "totalCount"
        +]
    • Changedsocrata_list_portals5 fields changed
      • removedOutput schema / properties / message
        Removed value: -{
        -  "description": "Recovery hint when no portals matched the filter. Absent on non-empty pages.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Recovery hint when no portals matched the filter. Absent on non-empty pages.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total portals before pagination. 0 when empty.",
        +  "type": "number"
        +}
      • removedOutput schema / properties / total_count
        Removed value: -{
        -  "description": "Total portals before pagination. 0 when empty.",
        -  "type": "number"
        -}
      • changedOutput schema / required
        Previous value: -[
        -  "portals",
        -  "total_count"
        -]New value: +[
        +  "portals",
        +  "totalCount"
        +]
    • Changedsocrata_query_dataset1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when the query returned zero rows — suggests narrowing or reviewing the SoQL. Absent on non-empty result sets.",
        +  "type": "string"
        +}
  7. 6 tool updates
    • First observedsocrata_dataframe_describe
    • First observedsocrata_dataframe_query
    • First observedsocrata_find_datasets
    • First observedsocrata_get_dataset
    • First observedsocrata_list_portals
    • First observedsocrata_query_dataset

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables querying and searching the Providence Open Data catalog via Socrata SoQL, including dataset search, data querying, and metadata retrieval.
    16
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables searching, querying, and retrieving metadata from Sonoma County Open Data datasets via Socrata SoQL or natural language.
    15
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.7/5.0
Disambiguation5/5

Each tool has a distinct role: discovery (list_portals), search (find_datasets), metadata (get_dataset), query (query_dataset), and post-query analysis (dataframe_describe and dataframe_query). The only potential overlap is between find_datasets and get_dataset, but they are clearly separated by preview vs full schema.

Naming Consistency5/5

All tools follow a consistent 'socrata_<verb>_<noun>' pattern (e.g., socrata_find_datasets, socrata_get_dataset). The dataframe tools extend with a clear prefix (socrata_dataframe_describe/query), maintaining the pattern and clarity.

Tool Count5/5

With 6 tools, the server covers the full discovery-to-query workflow without excess. Each tool serves a necessary step in the pipeline, from portal selection to result analysis, and the count feels well-scoped for a data access tool.

Completeness5/5

The surface covers the entire lifecycle: discover portals, search datasets, fetch metadata, execute queries, and handle large results via DataCanvas spill. There are no obvious gaps for the stated purpose of querying Socrata open-data portals.