Skip to main content
Glama
briandconnelly

opendata-atlas

opendata-atlas

CI PyPI Python License: MIT

Let your AI assistant answer questions with public government data. opendata-atlas connects an assistant such as Claude or Codex to the open-data portals that cities, counties, states and other public agencies publish on Socrata. Your assistant can find the right portal and dataset, check what its columns mean, and answer with counts, trends and records drawn from the data itself.

It is an MCP server, the standard way to give AI assistants new tools. It only reads public data and never changes anything on a portal.

Status: preview. Version 0.1.0 is on PyPI and in GitHub Releases. Your assistant can search every portal in the server's registry of public Socrata portals. Three portals are curated: Seattle (seattle), Chicago (chicago) and City of Everett (everett).

What you can ask

Once the server is connected, ask your assistant questions like these:

  • "Where can I find Seattle's real-time fire 911 call data, and how current is it?"

  • "How many bikes have crossed the Fremont Bridge this month?"

  • "How many crimes were reported in Chicago's Hyde Park community area last month?"

  • "Show me recent restaurant health inspection results for Everett, WA."

  • "How many jail bookings were there in King County last month?"

Answers come from the live portal, so they change as the data does.

Related MCP server: mcp-data-connecticut

Install

You need an MCP client that can start a local server, such as Claude Desktop, Claude Code or Codex. The uvx commands below also need uv; the server runs on Python 3.13 or later, which uv installs for you if needed. No account or API key is required.

Claude Desktop: download opendata-atlas-<version>.mcpb from the latest release and open it with Claude Desktop.

Claude Code:

claude mcp add opendata-atlas -- uvx opendata-atlas

This makes the server available to you in the current project. To use it in every project, add --scope user after add.

Codex:

codex mcp add opendata-atlas -- uvx opendata-atlas

Any other MCP client: run uvx opendata-atlas as a stdio server. Most clients take an entry like this in their configuration file:

{
  "mcpServers": {
    "opendata-atlas": { "command": "uvx", "args": ["opendata-atlas"] }
  }
}

To set up Claude Desktop this way instead of with the bundle, merge the opendata-atlas entry into mcpServers in claude_desktop_config.json (on macOS, ~/Library/Application Support/Claude/claude_desktop_config.json), then restart Claude Desktop. If it cannot find uvx, set command to the absolute path that which uvx prints.

To check the connection, ask your assistant "Which open-data portals can you search for Seattle?"

Portals and data quality

Finding a portal. Name the place you mean, and your assistant looks up its portal. When a place has more than one, such as a city and its county, the assistant asks which you mean unless your question already says. Each portal also has an id (its hostname, such as data.seattle.gov), and many have a short alias (such as seattle).

Curated portals. Every registered portal can be searched and queried. On a curated portal, contributors have also reviewed key datasets: what one row stands for, which columns hold places, and which time column to count by. Most portals have no such review, and even on a curated one, many datasets don't.

Knowledge levels. For each dataset, the server tells your assistant how much reviewed knowledge it has (reviewed, profiled or none). When a question depends on a column nobody has reviewed, or on a review that has gone stale, the result carries a caveat that your assistant should pass on to you. CONTRIBUTING-portals.md defines the levels exactly.

Limitations

  • Public Socrata data only. The server reads public datasets on portals in its registry. It cannot read private datasets or query other platforms. ArcGIS layers listed in a portal's catalog show up in search, but cannot be queried.

  • Bounded reads. A query returns records a page at a time, and at most 10,000 rows in total. Counts, sums and other summaries can still cover a whole dataset of any size.

  • No geocoding or forecasting. The server cannot turn an address into coordinates, and it reports what the data says rather than predicting.

  • Data quality is the publisher's. Coverage, freshness and accuracy vary by portal and dataset.

Configuration

No configuration is required. Two optional environment variables change the defaults:

  • SOCRATA_APP_TOKEN: a Socrata application token, for example claude mcp add opendata-atlas -e SOCRATA_APP_TOKEN=... -- uvx opendata-atlas. The bundle asks for it in Claude Desktop's settings. If a portal rejects the token, the server reports app_token_rejected rather than silently dropping it. A token may not be accepted by every portal.

  • OPENDATA_ATLAS_PORTALS: limits the server to the portals you list, by id or alias, separated by commas (for example, seattle,chicago). Any other portal fails with portal_not_enabled. Names that match no portal are ignored, so a list in which nothing matches blocks every portal. Unset or blank, every registered portal is served.

Tools and reference

The server gives your assistant five tools:

Tool

Purpose

atlas_find_portals

Find portals by place name, alias, portal name or host

atlas_search_datasets

Find a portal's datasets by topic

atlas_describe_dataset

A dataset's columns, row count, time coverage, place and map columns, and knowledge level

atlas_query_dataset

Read records or compute summaries, in SoQL, Socrata's SQL-like query language

atlas_get_reference

Built-in help: capability summary, SoQL help, portals, guides, error catalog

The same reference material is also served as MCP resources, for clients that browse them:

Resource

Contents

opendata-atlas://reference

Index of the reference topics

opendata-atlas://capabilities

Capability summary: what the server does and does not do, rules, semantics, failures

opendata-atlas://portals

Curated and profiled portals (atlas_find_portals searches every registered portal)

opendata-atlas://portals/{portal}

One portal: identity, tier, knowledge by dataset, guide index

opendata-atlas://portals/{portal}/guides, .../guides/{guide_id}

A portal's guides, and one guide

opendata-atlas://soql, opendata-atlas://soql/{section_id}

SoQL reference: syntax, filtering, aggregation, dates, geography, paging

opendata-atlas://errors, opendata-atlas://errors/{section_id}

Error catalog

opendata-atlas://contributing

Tier and knowledge definitions, and how to contribute portal knowledge

The {portal}, {section_id} and {guide_id} parameters support completion.

Help and contributing

The rest of the documentation lives in docs/; there is no hosted docs site.

License

MIT

Available Tools

5 tools
atlas_describe_datasetAtlas Describe DatasetA
Read-only

Decide whether and how to query a dataset: columns, live row count, data_coverage (actual time range), place fields for "in " questions (with reliability), and geo columns for near.

Call before querying a dataset whose columns you do not know. For area questions, use detail="full". Filter a place field on its value, never its label; an area may span several values. Illustrative example: {"portal": "example-city", "dataset_id": "abcd-1234", "detail": "full"}. With column_cursor, send only portal, dataset_id, column_query, detail, column_cursor. Typically 1-3 s; fails with query_timeout after 30 s.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNosummary (default) or full: adds place-field values and column stats.
portalYesPortal id (its hostname) or alias, from atlas_find_portals. Repeat it on every page of a paged call.
dataset_idYesSocrata dataset id, e.g. abcd-1234 (from atlas_search_datasets).
sample_rowsNoExample rows to include. Default 0.
column_queryNoOnly columns whose name or description contains this; omit for all.
column_cursorNonext_column_cursor from the previous page; omit for page one.

Output Schema

ParametersJSON Schema
NameRequiredDescription
titleYes
sourceYes
columnsYes
guide_uriNo
knowledgeYesLevel none (nothing recorded), profiled (observations only) or reviewed (interpretations).
row_countYes
dataset_idYes
geo_columnsYes
sample_rowsNo
geo_unusableNo
place_fieldsYes
queryabilityYes
columns_totalYesColumns matching column_query, across all pages.
data_coverageYes
time_semanticsYes
example_queriesNo
stats_availableYes
has_more_columnsYes
next_column_cursorNoSend as column_cursor for the next columns; omitted on the last.
unit_of_observationNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover only readOnlyHint and openWorldHint, so the description carries the rest and does so well: it discloses latency expectations ('Typically 1-3 s'), the failure mode and threshold ('fails with query_timeout after 30 s'), and the exact pagination protocol (which fields to send when column_cursor is present). These are non-obvious operational traits an agent cannot infer from the schema.

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

Conciseness4/5

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

Front-loaded with purpose, then prerequisites, then parameter guidance, then an example, then performance. The opening sentence is a dense colon-list and the illustrative JSON adds bulk, but every sentence supplies decision-relevant information rather than restating the schema.

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?

An output schema exists, so return values need no prose. With annotations covering safety and the description covering triggers, pagination, latency, failure mode, and the area-question special case, an agent has everything needed to call this correctly on the first attempt.

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 coverage is 100%, so the baseline is 3; the description goes beyond it by tying detail="full" to area questions, explaining the column_cursor calling convention, and clarifying that column filtering matches name or description. It does not, however, mention sample_rows semantics, which the schema does cover, so 4 rather than 5.

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?

Opens with a specific verb+resource+decision framing ('Decide whether and how to query a dataset') and enumerates exactly what is returned: columns, live row count, data_coverage, place fields with reliability, geo columns. This clearly separates it from atlas_query_dataset (executes queries) and atlas_search_datasets (finds datasets).

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 states the trigger condition ('Call before querying a dataset whose columns you do not know') and a conditional branch ('For area questions, use detail="full"'). It also gives a correctness rule that prevents a common error ('Filter a place field on its `value`, never its label'), which is when-to-use guidance of the most actionable kind.

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

atlas_find_portalsAtlas Find PortalsA
Read-only

Find portals by place name; the portal id it returns goes in every other tool's portal.

Call this before any tool that takes portal when you lack its id. It never picks a portal for you: an ambiguous place returns every candidate, told apart by jurisdiction.level (a city portal and its county portal can both match). When candidates differ in jurisdiction.level, ask the user which they mean, unless the request already says. Candidates are ordered by match (alias, name, place_name, host), then tier, then id. No match is an empty candidates list, not an error. With cursor, send only cursor and optionally page_size. Example: {"query": "Chicago"}. Reads the shipped registry; no network call.

ParametersJSON Schema
NameRequiredDescriptionDefault
tierNoOnly portals of this tier; omit for all tiers.
levelNoOnly portals of this jurisdiction level; omit for all.
queryNoPlace, portal name, alias or host label, e.g. Chicago. Every word must appear in one name; drop extra words if nothing matches. Omit, with no other argument, to page through every portal, curated first.
cursorNonext_cursor from the previous page; omit for page one.
countryNoISO 3166-1 alpha-2 country code, e.g. US (any case); omit for all.
page_sizeNoDefault 10.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourceYes
has_moreYes
candidatesYes
next_cursorNo
registry_versionYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover readOnly/openWorld, but the description adds nontrivial behavior: empty candidates list is not an error, results are ordered by match alias/name/place_name/host then tier then id, pagination requires sending cursor alone, and no network call is made. These are exactly the traits annotations cannot convey.

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

Conciseness4/5

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

Front-loaded with the purpose and the portal-id contract, then constraints in order of use. Dense and slightly choppy ('told apart by jurisdiction.level'), but nearly every line carries operational 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?

For a 6-param, zero-required lookup with an output schema, the description covers the pieces the schema cannot: ambiguity handling, ordering, pagination discipline, empty-result semantics, and the fact that the registry is local. Nothing an agent needs to call it correctly is missing.

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 coverage is 100%, so the baseline is 3; the description still earns credit by adding a cross-parameter constraint ('With cursor, send only cursor and optionally page_size') and a concrete invocation example, which the per-parameter schema text cannot express.

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 ('Find portals by place name') and adds the tool's role in the workflow: the returned id is what every other tool's `portal` parameter expects, which separates it from the dataset-oriented atlas_* siblings. An agent immediately knows what this returns and why it matters.

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?

Explicit precondition: 'Call this before any tool that takes `portal` when you lack its id.' It also gives disambiguation policy — when candidates differ in jurisdiction.level, ask the user unless the request already specifies — so the agent knows what to do with ambiguous results.

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

atlas_get_referenceAtlas Get ReferenceA
Read-only

Read the server's reference: capability summary, portals, dataset guides, SoQL help, error catalog, and tier definitions. Call with no arguments for the index.

Example: {"topic": "soql", "item_id": "dates"}. With cursor, repeat only topic and, for guides, portal.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicNoDefault index.
cursorNonext_cursor from the previous page; omit for page one.
portalNoPortal id or alias. Required for topic guides; rejected on other topics.
item_idNoAn item from the topic's entries, or for portals a portal id or alias; omit for the index.

Output Schema

ParametersJSON Schema
NameRequiredDescription
uriYes
bodyNo
titleYes
topicYes
sourceYes
entriesNo
summaryYes
versionYes
has_moreNo
next_cursorNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint=false, so the safety profile is covered. The description adds behavioral context the annotations don't: index-by-default behavior and the argument-repetition protocol across paginated calls.

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 short sentences, front-loaded with the purpose and content list, followed by the default-call rule and a compact example. No filler, and the most important guidance arrives first.

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?

An output schema exists, so return-format explanation is unnecessary. Between the description (what the reference covers, index default, pagination protocol) and the schema (topic enum, portal constraints), an agent has everything needed to call 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?

Schema coverage is 100%, so the baseline is 3, but the description adds real value beyond it: a concrete example pairing topic and item_id, and the non-obvious pagination rule that on subsequent pages you repeat only topic and (for guides) portal.

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 (read) and resource (the server's reference) and enumerates exactly what that reference contains: capabilities, portals, guides, SoQL help, errors, tiers. This clearly distinguishes it from the dataset-oriented siblings (atlas_query_dataset, atlas_search_datasets, atlas_find_portals).

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?

Gives concrete invocation guidance: no arguments yields the index, and a worked example shows topic/item_id usage. It stops short of routing the agent away from overlaps with atlas_find_portals (topic=portals) or atlas_describe_dataset, so usage is clear but not fully disambiguated.

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

atlas_query_datasetAtlas Query DatasetA
Read-only

Run a bounded read or aggregate on one dataset; paging stops at 10,000 rows.

For counts and breakdowns, use count() with group_by, not row paging. With cursor, send only portal, dataset_id, cursor, and optionally page_size or detail. For all rows, give the user download_url (detail="full") instead of paging. Illustrative example: {"portal": "example-city", "dataset_id": "abcd-1234", "select": ["type", "count() AS n"], "group_by": ["type"], "order_by": ["n DESC"]}. Typically 1-5 s; fails with query_timeout after 30 s.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoclauses (default): built from the clause arguments, paged by cursor. soql: run `soql` verbatim, one page.
nearNoRows within radius_m meters of a point; omit for no distance filter.
soqlNoFull SoQL statement; set mode='soql' and no clause arguments. Not paged: use LIMIT <= page_size and advance OFFSET.
whereNoSoQL predicate, e.g. "datetime >= '2026-09-01T00:00:00'". Never append Z or call now(); both fail. Omit for all rows.
cursorNonext_cursor from the previous page; omit for page one.
detailNosummary (default) or full: adds query_url and download_url (CSV of all matching rows).
havingNoPredicate on aggregated rows, e.g. "n > 10"; omit for none.
portalYesPortal id (its hostname) or alias, from atlas_find_portals. Repeat it on every page of a paged call.
selectNoColumns or expressions, e.g. ["type", "count(*) AS n"]. Omit for all data columns.
group_byNoe.g. ["type"]; omit for no grouping.
order_byNoe.g. ["n DESC"]; omit for arbitrary order. DESC lists nulls first: for most recent, add `col IS NOT NULL` to where.
page_sizeNoMost rows to return (default 100; wide rows may return fewer). Omit on a continuation to keep the first page's size.
dataset_idYesSocrata dataset id, e.g. abcd-1234 (from atlas_search_datasets).
search_textNoFull-text search across text columns; omit for none.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsYes
hintsNo
sourceYes
columnsYes
has_moreYes
query_urlNo
truncatedYes
dataset_idYes
consistencyYes
next_cursorNo
download_urlNo
returned_rowsYes
effective_queryNo
truncation_hintNo
knowledge_noticeNoWhat this result relies on that no reviewed claim covers; level is the dataset's.
coverage_warningsNo
query_url_omittedNo
truncation_reasonNo
download_url_omittedNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint, openWorldHint), and the description adds substantial behavior beyond them: the 10,000-row paging cap, typical 1-5 s latency, failure mode query_timeout after 30 s, and the cursor protocol requirement to repeat portal (confirmed also in the schema). This is exactly the kind of operational context an agent needs before committing to a call.

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?

Front-loads the core operation and its bound, then layers routing rules, the cursor-only parameter subset, the download escape hatch, and a compact illustrative call. Every sentence carries distinct information and the worked example is the densest way to convey the group_by/order_by idiom.

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

Completeness5/5

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

For a 14-parameter tool with an output schema and full schema coverage, the description supplies what the schema cannot: the paging ceiling, aggregate-vs-page routing, continuation-parameter discipline, download fallback, and timeout behavior. Return-value explanation is rightly delegated to the output schema.

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% across 14 params, so baseline is 3. The description goes further by stating cross-parameter rules the schema only implies per-parameter: which fields to send on a cursor continuation, and that aggregates should use count(*) with group_by rather than paging. It doesn't cover the soql/near/search_text modes at all, so not a 5.

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

Purpose4/5

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

States a specific verb+resource ('Run a bounded read or aggregate on one dataset') and adds the hard scope limit (paging stops at 10,000 rows). It does not name or contrast against any sibling (atlas_describe_dataset, atlas_search_datasets), so the agent must infer that this is the query/aggregate tool rather than the discovery or metadata 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?

Gives explicit routing rules: aggregates via count(*)+group_by instead of row paging, send only portal/dataset_id/cursor plus optional page_size or detail on continuations, and give the user download_url with detail='full' rather than paging all rows. These are concrete when-to-use and when-not-to-paging instructions, not vague hints.

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

atlas_search_datasetsAtlas Search DatasetsA
Read-only

Find a portal's datasets by topic. Call when you lack a dataset id.

Results are candidates: match_evidence lists the query words each one's metadata lacks. Only queryability "supported" can be described or queried; a tabular search also returns up to 3 external_matches, which cannot. Illustrative example: {"portal": "example-city", "query": "fire 911"}. Typically 1-3 s.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoWords to match; omit to list the most-viewed.
cursorNonext_cursor from the previous page; omit for page one.
detailNosummary (default) or full: adds descriptions.
portalYesPortal id (its hostname) or alias, from atlas_find_portals. Repeat it on every page of a paged call.
categoryNoExact category name, e.g. Public Safety; omit for all.
page_sizeNoDefault 10.
asset_scopeNotabular (default): queryable datasets and filter views. all: adds federated ArcGIS and external links, which cannot be queried.

Output Schema

ParametersJSON Schema
NameRequiredDescription
sourceYes
datasetsYes
has_moreYes
suggestionNo
next_cursorNo
match_evidenceNo
external_matchesNo
external_search_statusNo
foreign_results_droppedNo

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the readOnly/openWorld annotations: results are candidates, match_evidence discloses which query words the metadata lacks, only queryability 'supported' entries can be described or queried, tabular searches may add up to 3 non-queryable external_matches, and latency is 'typically 1-3 s.' This is exactly the downstream-behavior context annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with purpose and trigger, then the candidate/queryability caveats, then a minimal example and latency note. Dense but nearly every clause carries information; the phrasing around external_matches ('which cannot') is slightly compressed but not wasteful.

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?

An output schema exists so return values need not be restated, yet the description still surfaces the two result fields an agent must interpret (match_evidence, external_matches). Combined with the paging hint and portal-id sourcing, nothing needed to call this correctly is missing.

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 already 100%, so the baseline is 3. The description earns extra credit by explaining the operational consequence of asset_scope (federated/external links 'cannot' be queried) and by showing a concrete call shape ({portal, query}). It does not add syntax detail for cursor, page_size, or 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?

States a specific verb and resource ('Find a portal's datasets by topic') and immediately distinguishes itself from id-based siblings with 'Call when you lack a dataset id.' An agent can route here versus atlas_describe_dataset or atlas_query_dataset without opening any schema.

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?

'Call when you lack a dataset id' gives an explicit trigger condition that separates this from the id-requiring siblings. It also implicitly points to atlas_find_portals for the portal id (reinforced in the schema). It stops short of stating when *not* to use it or naming the alternatives directly.

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.

  1. 5 tool updatesv0.1.0
    • First observedatlas_describe_dataset
    • First observedatlas_find_portals
    • First observedatlas_get_reference
    • First observedatlas_query_dataset
    • First observedatlas_search_datasets

TDQS

A4.7/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: finding portals, searching datasets, describing dataset structure, querying data, and reading reference material. There is no overlap in the actions or resources they target, making selection unambiguous.

Naming Consistency5/5

All tool names follow a consistent atlas_verb_noun pattern in snake_case. The verbs (describe, find, get, query, search) are appropriate and predictable, with no mixing of conventions.

Tool Count5/5

Five tools are well-scoped for the server's purpose of exploring and querying open data portals. Each tool covers a necessary step in the workflow (discover portal, find dataset, inspect schema, query, reference), and none feel redundant.

Completeness4/5

The tool set covers the core lifecycle from portal discovery to data querying, including metadata inspection and reference help. A minor gap is the absence of a direct way to list all datasets within a portal without a topic query, which could hinder broad exploration.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to search, explore, and query San Francisco's open data portal through a standardized interface for public datasets. It supports SQL-like querying via the Socrata platform and includes features like fuzzy column matching and schema caching.
    4
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables querying and searching Connecticut Open Data via Socrata SoQL API, allowing AI agents to access state agency, public health, education, and transportation datasets using natural language or structured queries.
    20 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables searching and querying Orlando Open Data datasets via Socrata SoQL, providing access to metadata and data rows through natural language or direct tool calls.
    19 npm
    MIT