socrata-mcp-server
Server Details
Search and query government open-data portals (Socrata SODA API).
- 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 toolssocrata_dataframe_describeDescribe DataCanvas TablesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| canvas_id | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Status message when canvas is not enabled or no tables are registered. Absent when tables are present. |
| tables | No | Tables available for SQL queries. Empty when none registered. |
| canvas_id | No | Canvas ID resolved, when canvas is enabled. |
TDQS
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.
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.
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.
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.
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.
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 TableARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | SELECT-only SQL to run against registered canvas tables. DDL, DML, and file-reading functions are rejected. Use table names from socrata_dataframe_describe. | |
| limit | No | Max rows to return (1–10000). Default 1000. | |
| canvas_id | Yes | Canvas ID returned from socrata_query_dataset or socrata_dataframe_describe. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The row limit that was applied when capped. |
| sql | No | SQL that was executed. |
| rows | No | Query result rows. DuckDB may return native JS types (number, boolean, null) for numeric/boolean columns. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Rows returned in this response when capped. |
| notice | No | Guidance when the SQL returned zero rows. Absent when rows are present. |
| canvas_id | No | Canvas ID queried. |
| row_count | No | Number of rows returned. |
| truncated | No | True when results were capped at the limit — more rows match the query. |
TDQS
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.
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.
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.
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.
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.
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 DatasetsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| only | No | Filter by asset type. Omit to include all types. Usually "datasets" is what you want. | |
| tags | No | Filter by tags (e.g. ["covid19", "permits"]). | |
| limit | No | Number of results to return (1–100). Default 10. | |
| order | No | Sort order. Defaults to relevance. Use updated_at to surface recently-refreshed datasets. | |
| query | No | Full-text search across dataset names and descriptions. Omit to browse without filtering. | |
| domain | No | Scope search to a single portal (e.g. data.seattle.gov, data.cityofnewyork.us). Omit to search all portals. | |
| offset | No | Pagination offset. Default 0. | |
| categories | No | Filter by domain categories (e.g. ["Public Safety", "Transportation"]). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Recovery hint when results are empty — echoes filters and suggests how to broaden. Absent on non-empty result pages. |
| results | No | Matching datasets. Empty when no results. |
| totalCount | No | Total matches before pagination. 0 when empty. |
| effectiveQuery | No | Search query applied, for reference. |
TDQS
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.
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.
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.
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.
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.
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 SchemaARead-onlyIdempotentInspect
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').
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Portal domain (e.g. data.seattle.gov). Defaults to SOCRATA_DEFAULT_DOMAIN env var or data.seattle.gov. | |
| dataset_id | Yes | Four-by-four dataset ID matching pattern like kzjm-xkqj. Obtain from socrata_find_datasets. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | Dataset display name. |
| tags | No | Associated tags. |
| error | No | Present when the call failed. Absent on success. |
| domain | No | Portal domain hosting this dataset. |
| columns | No | Column schema. Computed region columns (:@computed_region_*) are excluded to reduce noise. |
| license | No | License name when available. |
| category | No | Domain category when available. |
| row_count | No | Approximate row count when available. See row_count_source for provenance. |
| dataset_id | No | Four-by-four dataset ID. |
| description | No | Dataset description when available. |
| data_updated_at | No | ISO 8601 timestamp of last data update when available. |
| row_count_source | No | 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. |
TDQS
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.
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.
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.
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.
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.
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 PortalsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max portals to return (1–200). Default 50. | |
| query | No | Keyword to filter portal names or organization names (case-insensitive substring match). Omit to list all portals. | |
| offset | No | Pagination offset. Default 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Recovery hint when no portals matched the filter. Absent on non-empty pages. |
| portals | No | Matching portals. Empty when no results. |
| totalCount | No | Total portals before pagination. 0 when empty. |
TDQS
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.
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.
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.
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.
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.
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 DatasetARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | SoQL GROUP BY clause. Requires an aggregate function in select. | |
| limit | No | Max rows to return (1–5000). Default 100. Use with offset for pagination. | |
| order | No | SoQL ORDER BY clause, e.g. "total_deaths DESC" or "date ASC". | |
| where | No | SoQL 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. | |
| domain | No | Portal domain (e.g. data.seattle.gov). Defaults to SOCRATA_DEFAULT_DOMAIN or data.seattle.gov. | |
| having | No | SoQL HAVING clause. Filters on aggregated results, e.g. count > 100. | |
| offset | No | Row offset for pagination. Default 0. | |
| search | No | Full-text search across all text columns ($q). For field-specific filtering, use where instead. | |
| select | No | SoQL SELECT clause — column names, aliases, aggregates: "state, sum(deaths) as total_deaths". Omit for all columns. | |
| canvas_id | No | Optional 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_id | Yes | Four-by-four dataset ID (e.g. kzjm-xkqj). Obtain from socrata_find_datasets. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The row limit that was applied when capped. |
| rows | No | Result rows. Scalar values are strings (SODA 2.1); geo/location columns return nested objects. Use column schema from socrata_get_dataset for type context. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Rows returned in this response when capped. |
| domain | No | Portal domain queried. |
| notice | No | Guidance when the query returned zero rows — suggests narrowing or reviewing the SoQL. Absent on non-empty result sets. |
| canvas_id | No | 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. |
| row_count | No | Rows returned in this response. |
| truncated | No | True when rows filled the limit — more rows may match (see total_count when present). Spills to canvas when enabled. |
| dataset_id | No | Dataset ID queried. |
| total_count | No | 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. |
| assembled_query | No | SoQL clauses assembled for this request — useful for learning the syntax. |
| canvas_row_count | No | 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. |
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
- Changed
socrata_dataframe_describe6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "tables" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "tables" -]
- Changed
socrata_dataframe_query6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "rows", + "row_count", + "sql", + "canvas_id" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "rows", - "row_count", - "sql", - "canvas_id" -]
- Changed
socrata_find_datasets6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "results", - "totalCount" -]
- Changed
socrata_get_dataset6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "dataset_id", + "domain", + "name", + "tags", + "columns" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "dataset_id", - "domain", - "name", - "tags", - "columns" -]
- Changed
socrata_list_portals6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "portals", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "portals", - "totalCount" -]
- Changed
socrata_query_dataset6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "rows", + "row_count", + "assembled_query", + "domain", + "dataset_id" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "rows", - "row_count", - "assembled_query", - "domain", - "dataset_id" -]
1 tool update
- Changed
socrata_query_dataset2 fields changed- changed
Output schema / properties / canvas_id / descriptionPrevious 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." - added
Output schema / properties / canvas_row_countAdded 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" +}
2 tool updates
- Changed
socrata_get_dataset2 fields changed- changed
Output schema / properties / row_count / descriptionPrevious value: -"Approximate row count when available."New value: +"Approximate row count when available. See row_count_source for provenance." - added
Output schema / properties / row_count_sourceAdded 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" +}
- Changed
socrata_list_portals3 fields changed- added
Output schema / properties / portals / items / properties / dataset_count / anyOfAdded value: +[ + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Output schema / properties / portals / items / properties / dataset_count / descriptionPrevious 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." - removed
Output schema / properties / portals / items / properties / dataset_count / typeRemoved value: -"number"
2 tool updates
- Changed
socrata_dataframe_describe1 field changed- changed
Input schema / properties / canvas_id / descriptionPrevious 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."
- Changed
socrata_query_dataset2 fields changed- changed
Output schema / properties / total_count / descriptionPrevious 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." - changed
Output schema / properties / truncated / descriptionPrevious 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."
2 tool updates
- Changed
socrata_dataframe_query3 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "The row limit that was applied when capped.", + "type": "number" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Rows returned in this response when capped.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when results were capped at the limit — more rows match the query.", + "type": "boolean" +}
- Changed
socrata_query_dataset3 fields changed- added
Output schema / properties / capAdded value: +{ + "description": "The row limit that was applied when capped.", + "type": "number" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Rows returned in this response when capped.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when rows filled the limit — more rows match (see total_count). Spills to canvas when enabled.", + "type": "boolean" +}
5 tool updates
- Changed
socrata_dataframe_describe2 fields changed- removed
Output schema / properties / messageRemoved value: -{ - "description": "Status message when canvas is not enabled or no tables are registered. Absent when tables are present.", - "type": "string" -} - added
Output schema / properties / noticeAdded value: +{ + "description": "Status message when canvas is not enabled or no tables are registered. Absent when tables are present.", + "type": "string" +}
- Changed
socrata_dataframe_query1 field changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when the SQL returned zero rows. Absent when rows are present.", + "type": "string" +}
- Changed
socrata_find_datasets7 fields changed- added
Output schema / properties / effectiveQueryAdded value: +{ + "description": "Search query applied, for reference.", + "type": "string" +} - removed
Output schema / properties / messageRemoved value: -{ - "description": "Recovery hint when results are empty — echoes filters and suggests how to broaden. Absent on non-empty result pages.", - "type": "string" -} - added
Output schema / properties / noticeAdded value: +{ + "description": "Recovery hint when results are empty — echoes filters and suggests how to broaden. Absent on non-empty result pages.", + "type": "string" +} - removed
Output schema / properties / queryRemoved value: -{ - "description": "Search query applied, for reference.", - "type": "string" -} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Total matches before pagination. 0 when empty.", + "type": "number" +} - removed
Output schema / properties / total_countRemoved value: -{ - "description": "Total matches before pagination. 0 when empty.", - "type": "number" -} - changed
Output schema / requiredPrevious value: -[ - "results", - "total_count" -]New value: +[ + "results", + "totalCount" +]
- Changed
socrata_list_portals5 fields changed- removed
Output schema / properties / messageRemoved value: -{ - "description": "Recovery hint when no portals matched the filter. Absent on non-empty pages.", - "type": "string" -} - added
Output schema / properties / noticeAdded value: +{ + "description": "Recovery hint when no portals matched the filter. Absent on non-empty pages.", + "type": "string" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Total portals before pagination. 0 when empty.", + "type": "number" +} - removed
Output schema / properties / total_countRemoved value: -{ - "description": "Total portals before pagination. 0 when empty.", - "type": "number" -} - changed
Output schema / requiredPrevious value: -[ - "portals", - "total_count" -]New value: +[ + "portals", + "totalCount" +]
- Changed
socrata_query_dataset1 field changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when the query returned zero rows — suggests narrowing or reviewing the SoQL. Absent on non-empty result sets.", + "type": "string" +}
6 tool updates
- First observed
socrata_dataframe_describe - First observed
socrata_dataframe_query - First observed
socrata_find_datasets - First observed
socrata_get_dataset - First observed
socrata_list_portals - First observed
socrata_query_dataset
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Query and explore Nova Scotia open datasets via the Socrata SODA API.
ArcGIS Hub — open government geospatial data (search + Feature Service query).
Data.gov MCP — wraps Data.gov CKAN API (catalog.data.gov/api/3)
HealthData.gov MCP — wraps HealthData.gov CKAN API (free, no auth)
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables querying and searching the Providence Open Data catalog via Socrata SoQL, including dataset search, data querying, and metadata retrieval.16MIT
- AlicenseNot gradedqualityCmaintenanceEnables querying Seattle open data from data.seattle.gov via the Socrata SODA API.16MIT
- AlicenseNot gradedqualityCmaintenanceEnables searching, querying, and retrieving metadata from Sonoma County Open Data datasets via Socrata SoQL or natural language.15MIT
- AlicenseNot gradedqualityCmaintenanceEnables searching and querying Norfolk Open Data datasets through Socrata SoQL, including metadata retrieval.15MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
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.
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.
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.
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.