Skip to main content
Glama
WillHsiaoNYC

NYC Open Data Capital Projects MCP Server

by WillHsiaoNYC

NYC Open Data — Capital Projects MCP Server

A local MCP server over the NYC Capital Projects Dashboard (CPD) datasets on NYC Open Data. It ingests four public Socrata datasets into a single local DuckDB and exposes 16 tools so an AI assistant can answer schedule, budget, and lifecycle questions about NYC capital projects — with the domain rules (PID↔FMS many-to-many, role-aware agency attribution, signed variance reporting) baked into the tools instead of left for the caller to rediscover.

Source datasets (Socrata)

ID

Dataset

fb86-vt7u

Citywide Capital Project List Detail (the schedule↔budget edge)

gyhf-rsr3

Citywide Budget & Spend by FY

qj5n-h5qp

Citywide Budget Spend History & Variance

95tx-snak

Citywide Schedule History & Variance

Related MCP server: Spurs Analytics MCP

What's an MCP — and why use one?

MCP (Model Context Protocol) is a standard way to give an AI assistant a new, trusted skill. Instead of pasting a spreadsheet into a chat and hoping the model reads it right, you hand it a set of well-defined tools it can call — with the domain rules already baked in. It's the difference between telling an analyst "here's a spreadsheet, good luck" and hiring one who already knows the data cold.

Why not just ChatGPT + a CSV? Public data is messy in ways a generic chatbot can't see. Ask a raw LLM "what's NYC's biggest library project?" and it'll happily double-count a budget line shared by several projects, call a long-finished branch "still under construction" because its funding line is still open, or — seeing only three reporting periods a year (Jan / May / Sep) — assume months of data have gone missing. It sounds confident — and it's wrong. This server encodes the guardrails once — the PID↔FMS many-to-many, role-aware agency attribution, the 3×-a-year reporting cadence, signed reporting — so every answer is consistent, sourced, and reproducible.

What one prompt can build

This isn't only a query tool. Point an AI agent at it and a single prompt produces a polished, self-contained interactive HTML report — with the domain rules already applied. Three real examples (one prompt → one file; click to open the live report):

1 · Schedule ↔ Budget topologythe many-to-many anatomy of the portfolio

Analyze the schedule and budget many-to-many relationship across NYC capital projects and build a single interactive HTML report — the 1:1-vs-fan-out split, the outlier extremes, a per-agency breakdown, and budget concentration.

Open the report — fan-out rings, a bipartite diagram, the "tangled few" outliers (hover to see the real schedules and budget lines), an agency scatter, and a budget concentration curve.

2 · Parks projects over $50Mevery big build, and what funds it

Build an interactive one-file HTML report on NYC Parks projects over $50M. For each budget line, show every schedule associated with it, with phase and forecast completion.

Open the report — 23 budget lines; hover any to reveal its linked schedules. Quietly applies the category taxonomy, so the $1.9B "Park Pedestrian Bridges" route to Bridges, not Parks.

3 · Budget & schedule change monitorwhat moved this period, by agency

Build an interactive one-file HTML monitor of NYC capital projects' budget and schedule changes by managing agency, with a click-through detail view for each project's schedule and budget history.

Open the report — KPIs, a trend chart, a sortable watchlist, and a per-project popup with schedule-variance bars and a stacked budget-vs-spend chart.

Each report was generated from the prompt shown, then lightly polished. The figures are a snapshot of reporting period 202601 — browse all three in the report gallery.

🚀 Quick Start

Want the data without the setup? If your AI can run commands on your computer, just ask it to install everything for you.

✅ Let your AI install it (easiest)

Works with AI agents that can run terminal commandsClaude Code, Claude cowork (Claude Desktop's local-agent mode), Codex CLI, or another coding agent like Cursor.

  1. Start your AI agent on this computer.

  2. Paste the message below.

  3. Approve each step (Allow, or press y) as it clones, installs, and connects the server.

Message to paste:

Install the MCP server at
https://github.com/WillHsiaoNYC/NYC-Opendata-Capital-Projects-MCP on this
machine — follow its README to clone the repo, install it with uv, run
`od-cpd init` to download the four NYC Open Data datasets into a local
database, and wire it into my MCP client config. Then run a verification
query to confirm it works.

What "done" looks like: your AI reports the loaded reporting period (e.g. 202601), confirms od-cpd is connected with its 16 tools, and answers a test question like "What's the biggest NYC capital project right now?" Takes a few minutes, mostly the dataset download.

🖥️ Claude Desktop (chat)

Claude Desktop can use a local server but can't install one itself. Run the Manual install, then add od-cpd to its own config (with the absolute path to uv) and fully restart — see Connect an MCP client.

☁️ claude.ai or ChatGPT (web)

These connect only to remote MCP servers, not a local one like this — so they can't run od-cpd directly. Use one of the options above.

Manual install

Requires Python ≥ 3.12 and uv.

git clone https://github.com/WillHsiaoNYC/NYC-Opendata-Capital-Projects-MCP.git
cd NYC-Opendata-Capital-Projects-MCP

uv sync
uv run od-cpd init        # download + materialize all 4 datasets → ./var/cpd.duckdb
uv run od-cpd status      # confirm the loaded reporting period

Optional: set OD_CPD_SOCRATA_APP_TOKEN to a free Socrata app token to avoid anonymous rate limits during ingest.

Connect an MCP client

The server speaks stdio. Use the absolute path to uv (run which uv to find it) — GUI apps like Claude Desktop don't inherit your shell PATH, so a bare uv command fails silently.

Claude Code — from inside the repo folder:

claude mcp add od-cpd --env PYTHONPATH="$(pwd)/src" -- \
  "$(which uv)" run --directory "$(pwd)" od-cpd-server

Claude Desktop — edit its config (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json), add the block below, then fully quit (⌘Q) and reopen Claude Desktop:

{
  "mcpServers": {
    "od-cpd": {
      "command": "/absolute/path/to/uv",
      "args": ["run", "--directory", "/absolute/path/to/repo", "od-cpd-server"],
      "env": { "PYTHONPATH": "/absolute/path/to/repo/src" }
    }
  }
}

(PYTHONPATH keeps the launch robust when uv's editable install is flaky — e.g. on iCloud-synced paths.)

Keeping data fresh

The source datasets report on a Jan / May / Sep cycle, and Socrata typically publishes each period ~2.5–3 months later (so new data usually lands around April, August, and December). od-cpd update is a no-op when nothing is newer, so it's safe to run any time — check around those months:

uv run od-cpd status      # what period is loaded now
uv run od-cpd update      # re-ingest only if Socrata is newer

To keep it fresh automatically, schedule update (e.g. monthly via cron):

# 9am on the 1st of each month
0 9 1 * * cd /path/to/repo && uv run od-cpd update

What's inside

  • docs/FEATURES.md — the canonical inventory: all 16 tools and every domain rule the server encodes. Start here.

The headline domain rules, briefly:

  • "Project" is ambiguous. A PID identifies a schedule; an FMS ID identifies a budget line. They are many-to-many (~3% fan out), so the tools list all counterparts rather than silently picking one.

  • Agency attribution is role-aware. "Agency X's projects" means the sponsor (owner) view for normal agencies, but the managing (builder) view for the three construction-manager agencies (DDC/DCAS/EDC).

  • Values are reported signed and neutral ("moved 45 days later", "budget grew $2.1M") rather than only surfacing one direction.

Layout

  • src/od_cpd/ — ingest, materialization, and the MCP server + tools

  • data/ — curated agency/category dictionaries (YAML, tracked)

  • tests/ — unit tests + golden evals (uv run pytest)

  • var/, exports/ — runtime DuckDB + exports (gitignored, regenerable)

Develop

uv run pytest             # fallback: PYTHONPATH=src python -m pytest

Classification is dictionary-driven: edit data/agencies.yaml / data/categories.yaml (not Python) to adjust agency or category mappings, then re-materialize. See CLAUDE.md for the atomic-swap pattern that applies materialization changes without re-downloading.

Data caveats

This is an independent project, not affiliated with the City of New York. Figures reflect whatever reporting period the underlying Socrata datasets carry at ingest time; always check dataset_info for the current period and per-dataset caveats.

Available Tools

16 tools
budget_breakdownA

Total budget / spend by managing_agency or category, deduped on (fms_id, managing_agency). Category is line-grain (additive). Optional agency scopes to one agency; agency_role ('auto'|'sponsor'|'managing') picks owner vs builder lens. For richer cuts use run_sql.

ParametersJSON Schema
NameRequiredDescriptionDefault
group_byNomanaging_agency
metricNototal_budget
periodNocurrent
agencyNo
agency_roleNoauto

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries full behavioral burden. It discloses dedup logic on (fms_id, managing_agency), granularity (line-grain additive), and the effect of agency_role options. It does not mention read-only status or error behaviors, but the provided details are useful.

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 concise: two sentences plus a third for the alternative. It is front-loaded with the main purpose, and every sentence adds value without waste.

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

Completeness3/5

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

Given 5 parameters with no schema descriptions and no output schema, the description covers the core purpose, dedup logic, and two parameters. However, it omits details on metric and period, and the output format, leaving it slightly incomplete.

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 0%, so the description must compensate. It explains agency and agency_role parameters explicitly, and implies group_by values. However, metric and period parameters are not described, leaving gaps.

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 that the tool returns total budget/spend by managing_agency or category, with dedup logic and optional filtering. It distinguishes itself from the sibling tool run_sql, which is for richer queries.

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 explicitly mentions when to use this tool (for simple budget breakdowns) and provides an alternative (run_sql for richer cuts). It does not explicitly exclude other sibling tools, but the context is clear.

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

budget_changeB

Δ budget/spend for an agency ('agency:DEP') or FMS line ('fms:ABC') between two periods. For an agency target, agency_role ('auto'|'sponsor'|'managing') picks the lens; sponsor scope uses the latest-period owner set (as-of caveat in the result label).

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYes
from_periodYes
to_periodYes
metricNototal_budget
agency_roleNoauto

TDQS

B3.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries full burden. It discloses the 'as-of caveat' in results and explains the behavior of agency_role parameter. However, it does not mention auth requirements, rate limits, or whether the operation is read-only or destructive. The description adds some behavioral context but leaves gaps.

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?

The description is two sentences long, with the core purpose front-loaded. Each sentence provides useful information without redundancy. It is appropriately sized for the tool's complexity.

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

Completeness2/5

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

Given no output schema, 5 parameters, and 0% schema coverage, the description should cover return format, period format, metric options, and any caveats. It mentions an 'as-of caveat' but doesn't specify the result structure. Key details about parameters like metric and period formatting are missing, making the description incomplete for precise invocation.

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 0%, so the description must compensate. It explains the format for target ('agency:DEP' or 'fms:ABC') and the meaning of agency_role. However, it does not describe the exact format for from_period and to_period, or the allowed values for metric. The description adds some meaning beyond the schema but not enough to fully clarify all parameters.

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?

The description clearly states the tool calculates change in budget/spend between two periods for an agency or FMS line, with specific examples ('agency:DEP', 'fms:ABC'). However, it does not explicitly differentiate from sibling tools like budget_breakdown or get_project_budget, which might also relate to budget data.

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

Usage Guidelines3/5

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

The description indicates when to use the tool (for agency or FMS line targets) and mentions the agency_role parameter, but it does not provide explicit guidance on when not to use it or how it compares to alternatives like budget_breakdown or schedule_changes, which are listed as siblings.

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

dataset_infoA

Per-dataset freshness, current period, row counts, and the key caveats.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

The description discloses what information is returned (freshness, period, row counts, caveats), implying a read-only operation. However, it does not mention any additional behavioral traits such as performance, data recency, or required permissions, which would be valuable given no annotations.

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 a single concise sentence that lists the key pieces of information provided. Every word contributes to clarity without waste, earning a top score.

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?

Given zero parameters and no output schema, the description adequately conveys what the tool returns. It lacks details about the return format or whether it applies to a single dataset, but it is fairly complete for a simple metadata 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?

No parameters are defined in the input schema, so the description does not need to add parameter meaning. The baseline score of 4 is appropriate, as there is no burden to compensate for schema coverage.

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?

The description clearly states the tool provides per-dataset freshness, current period, row counts, and key caveats. It specifies the type of information, distinguishing it from sibling tools that focus on budgets, schedules, or other metrics.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives. While sibling tools exist for other analyses, the description does not provide context or criteria for selecting dataset_info.

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

delay_reason_statsA

Distribution of reason-for-delay (only populated when variance>0). Defaults to current period; pass scope='all_history' for lifetime. agency_role ('auto'|'sponsor'|'managing') picks owner vs builder lens.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNocurrent
agencyNo
scopeNocurrent
agency_roleNoauto

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It discloses that the distribution is only populated when variance>0, and explains the effects of the scope and agency_role parameters. However, it does not mention whether the operation is read-only, any required permissions, or potential side effects, though for a stats tool the behavioral assumption is safe.

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 three sentences, each serving a distinct purpose: purpose and condition, defaults and scope options, and agency_role explanation. No redundant or extraneous information; perfectly front-loaded.

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

Completeness3/5

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

While the description covers inputs well and mentions the condition for data availability, it does not describe the output format (e.g., counts, percentages, structure). Since no output schema exists, the description should clarify what the tool returns to be fully complete for an agent.

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 0%, so the description must compensate. It explains period (default 'current'), scope ('all_history' for lifetime), and agency_role (three modes with lens interpretation). However, the 'agency' parameter is not mentioned, leaving one of four parameters undocumented. Overall, it adds significant value beyond the bare 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?

The description clearly states it provides a 'distribution of reason-for-delay', which is a specific verb and resource. It also specifies the condition (variance>0) and differentiates by scope and agency_role, making its purpose unambiguous.

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

Usage Guidelines3/5

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

The description gives usage defaults and options (current period, all_history, agency_role values) but does not explicitly state when to use this tool versus alternatives or when not to use it. Sibling tools like schedule_breakdown and schedule_changes suggest related but distinct purposes, yet no comparative guidance is provided.

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

describe_fieldA

Official field definitions (the NYC Open Data data dictionary): description, allowed values, primary/foreign key, limitations, notes. Filter by field (column name or display name) and/or dataset (RAW table name or socrata_id); omit both for the full dictionary.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldNo
datasetNo

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses the tool returns field definitions with specific attributes, implying a read-only query. However, it lacks details on response format, rate limits, or authentication requirements.

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 two sentences with no redundant words. The first sentence states the purpose and contents, the second explains parameter usage and special behavior (omitting both for full dictionary). Efficient and front-loaded.

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?

Given no output schema, the description should ideally describe the return structure. It lists the contents (description, allowed values, etc.) but does not specify whether the output is an array, object, or key-value pairs. Still, it provides enough context for an agent to understand what to expect.

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?

The schema has 0% description coverage, but the description adds significant meaning: it specifies that 'field' accepts a column name or display name, and 'dataset' accepts a RAW table name or socrata_id. This clarifies the expected values beyond the schema's type definitions.

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 returns 'Official field definitions' and enumerates what they include (description, allowed values, primary/foreign key, limitations, notes). This distinctly identifies the tool's purpose and differentiates it from sibling tools that deal with budgets, projects, and schedules.

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 explains the two optional parameters and their usage, including the effect of omitting both (full dictionary). While it does not explicitly state when not to use this tool or compare to alternatives, the sibling tools are unrelated, making the use case clear.

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

get_project_budgetC

Budget (FMS line): total, spend, variance; lists linked schedules. NB budget has no 'completed' state; spend%=100 ≠ done.

ParametersJSON Schema
NameRequiredDescriptionDefault
fms_idYes
managing_agencyNo

TDQS

C2.6/5.0
Behavior2/5

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

With no annotations, the description bears full burden. It lacks details on read/write nature, authentication, error handling, or side effects. Only mentions output fields and a note on budget state.

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?

Concise, with effective front-loading. Each sentence adds value, though slightly brief. No wasted words.

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

Completeness2/5

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

Lacks essential details about output format, parameter semantics, and behavioral context. With no output schema and incomplete param coverage, the description is too sparse for an agent to use correctly.

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

Parameters1/5

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

Schema description coverage is 0% and the description does not explain the parameters fms_id or managing_agency. It only references 'FMS line' without connecting to parameters.

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?

Description clearly states it retrieves budget data for an FMS line including total, spend, variance, and lists linked schedules. However, it does not differentiate from sibling tools like budget_breakdown and budget_change, which could cause confusion.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives. The note about budget not having a 'completed' state is a contextual caveat but not a usage guideline.

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

get_project_scheduleC

Schedule (PID): phase, lifecycle, signed variance, reason; lists linked budgets.

ParametersJSON Schema
NameRequiredDescriptionDefault
pidYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations provided, so the description must fully disclose behavior. It states the output fields but omits whether the operation is read-only, safe, or has side effects. There is no mention of permissions, rate limits, or error conditions.

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

Conciseness3/5

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

The description is very short and to the point, but the phrasing is awkward and somewhat cryptic. It conveys essential information in one sentence but sacrifices clarity for brevity.

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

Completeness3/5

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

Given no output schema, the description lists some return fields (phase, lifecycle, signed variance, reason, linked budgets), providing a partial picture. However, it does not explain the structure or relationships fully, leaving ambiguity about what 'linked budgets' entails.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must explain parameters. It mentions PID in the text but does not describe what PID represents or its format. The description adds minimal value over the bare schema, lacking detail on constraints or usage.

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?

The description indicates the tool returns schedule data including phase, lifecycle, signed variance, reason, and linked budgets. It clearly identifies the resource (schedule) and the key fields, distinguishing it from generic project tools, but lacks an explicit verb like 'retrieve' or 'get'.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus siblings like schedule_breakdown or schedule_changes. The description does not mention prerequisites, alternatives, or context for use, leaving the agent without differentiation.

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

list_agenciesD

Agency dictionary with live CPD presence + schedule-executor flag.

ParametersJSON Schema
NameRequiredDescriptionDefault
containsNo

TDQS

D1.8/5.0
Behavior2/5

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

No annotations are present, so the description must carry the full behavioral burden. It hints at response fields ('CPD presence', 'schedule-executor flag') but does not clarify if the tool is read-only, filters, or returns a list. No disclosure of destructive potential or required auth.

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

Conciseness2/5

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

The description is short but not effectively concise; it uses unclear jargon without front-loading a clear verb and resource. The single sentence would be better replaced with a clearer explanation.

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

Completeness1/5

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

Given the lack of output schema and simple parameter, the description should provide complete context. It fails to describe what the tool returns, how the parameter works, or how it differs from sibling tools like list_categories. Extremely incomplete.

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

Parameters1/5

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

The schema has one optional parameter 'contains' with zero description coverage (0%). The tool description does not mention this parameter or explain its purpose, leaving the agent without guidance on how to use it.

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

Purpose2/5

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

The description 'Agency dictionary with live CPD presence + schedule-executor flag' is vague and jargon-heavy. It does not clearly state that the tool lists agencies, and the terms 'CPD presence' and 'schedule-executor flag' are unexplained, making the purpose ambiguous.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like dataset_info or resolve_project_reference. The description lacks context for selecting this tool over siblings.

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

list_categoriesA

Program/facility categories (Library, Parks & Recreation, Sewer & Water, …) with budget-line counts and total budget. Use a category name as the category filter on rank_projects. Categories are derived from ten_year_plan_category + sponsor_agency + fms-id prefix — NOT managing_agency or project name.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden. It discloses that categories are derived from ten_year_plan_category + sponsor_agency + fms-id prefix, and explicitly states what they are NOT based on (managing_agency or project name). This adds useful behavioral context beyond a simple list.

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 two sentences, front-loading the output and then providing usage and derivation. Every sentence is informative with no waste.

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?

Given no parameters and no output schema, the description is complete: it specifies the output (categories with counts and total budget), how to use the result (filter for rank_projects), and the derivation logic. No missing information.

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?

There are no parameters, so the description needs to add no parameter info. With 0 parameters, the baseline is 4, and the description adequately explains the output without needing to elaborate on inputs.

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 lists program/facility categories with budget-line counts and total budget, with examples. It distinguishes itself by explaining how categories are derived and that they serve as filter values for rank_projects, differentiating from sibling tools.

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 tells when to use this tool (to retrieve categories with budget stats) and how to use its output (as a filter on rank_projects). It does not explicitly state when not to use or provide alternatives, but the context is clear enough.

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

project_duration_statsA

Duration distribution between two ACTUAL milestones (requires both dates). Optional group_by ('managing_agency'|'borough'|'lifecycle_status') returns per-group stats instead of the citywide block.

ParametersJSON Schema
NameRequiredDescriptionDefault
from_milestoneNoactual_design_start
to_milestoneNoactual_construction_end
group_byNo

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries full burden. It discloses that results are citywide by default and per-group with group_by, but does not mention behaviors like error handling when milestones are missing, read-only nature (implied but not stated), or limits on data volume. It is adequate but not thorough.

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 two sentences long, front-loading the core purpose and adding the optional parameter in the second sentence. No redundant words or restatements of the name. Highly efficient.

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

Completeness3/5

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

Given no output schema and many sibling tools, the description lacks detail on the return format (e.g., is it a list of durations, statistical summary?). It also does not cover edge cases like invalid milestone names or from_milestone after to_milestone. It is sufficient for simple use but incomplete for complex scenarios.

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 0%, so the description must compensate. It explains the group_by parameter with explicit values and implies from_milestone and to_milestone are actual milestones needed in pairs. However, it does not define what 'actual' means or provide examples for milestone string values, leaving some ambiguity.

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?

The description clearly states the tool computes duration distribution between two actual milestones, specifying it requires both dates. It distinguishes from sibling tools like delay_reason_stats and schedule_breakdown by focusing on distribution between milestones rather than reasons or timeline views. However, it could be more specific about what 'distribution' means (e.g., histogram, percentiles).

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

Usage Guidelines3/5

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

The description provides some guidance: it requires both dates and explains the optional group_by parameter with allowed values. It does not, however, mention when not to use this tool or suggest alternatives among the 16 siblings, nor does it clarify prerequisites like milestone existence.

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

project_portfolioA

Cross-section listing of projects (PIDs): filter by category (see list_categories), borough, community_board, lifecycle_status ('in_progress'|'completed'|'cancelled'), and/or agency (+agency_role lens); rows ordered by nearest completion date (NULLs last). Each row carries schedule state + attributed_budget; summary covers the FULL filtered set and reports BOTH budget bases (per-PID attributed vs deduped line_budget_total). Borough matches the PID's boroughs LIST, so multi-borough projects are found by any of their boroughs.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNo
boroughNo
community_boardNo
lifecycle_statusNo
agencyNo
agency_roleNoauto
nNo

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses behavioral traits beyond annotations: ordering by nearest completion date with NULLs last, row content (schedule state, attributed_budget), summary coverage, and multi-borough matching. No contradictions.

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?

The description is a single, dense paragraph that front-loads the core purpose. Each sentence adds value, though some could be tightened. It is efficient for the given complexity.

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?

Despite no output schema or annotations, the description is thorough: it explains filtering, ordering, row content, summary details, and a behavioral nuance about borough matching. It is nearly complete for an agent to use 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?

With 0% schema description coverage, the description adds meaning for several parameters (category, lifecycle_status, borough matching, agency_role default). It explains filtering logic and references list_categories, though not all parameters are fully detailed.

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 lists projects (PIDs) with filtering and ordering options. It distinguishes from sibling tools by specifying it provides a cross-section listing with summary, not a budget breakdown or schedule detail.

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

Usage Guidelines3/5

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

The description lists filter parameters but does not explicitly state when to use this tool versus alternatives like rank_projects or get_project_budget. Usage is implied but not contrasted with siblings.

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

rank_projectsA

Rank schedules (entity='schedule', rows=PIDs) or budgets (entity='budget', rows=FMS lines). rank_by must be NATIVE to entity; the other domain is filter-only. Echoes ranked_entity. Budget rank_by: total_budget | spend_to_date | spend_pct | budget_variance (last-period delta) | cumulative_budget_change (latest - original budget). Optional category (see list_categories) filters to one program type, e.g. 'Library'. Optional agency scopes to one agency; agency_role ('auto'|'sponsor'|'managing') picks the lens — 'auto' uses the owner (sponsor) view, except DDC/DCAS/EDC default to builder (managing). Echoes agency_scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
entityYes
rank_byYes
nNo
directionNotop
min_total_budgetNo
max_total_budgetNo
delayed_onlyNo
categoryNo
agencyNo
agency_roleNoauto

TDQS

A3.6/5.0
Behavior3/5

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

Given no annotations, the description carries full burden. It discloses that the tool echoes ranked_entity and agency_scope and explains agency_role default behavior. However, it does not mention safety traits (read-only, permissions) or response pagination/limitations, leaving some behavioral aspects unclear.

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?

The description is a single paragraph that efficiently conveys core functionality and key parameters. It is front-loaded with purpose and avoids filler. While a bullet list could improve scannability, every sentence contributes meaning, making it concise for the information density.

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

Completeness3/5

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

Given no output schema, the description only hints at return values ('Echoes ranked_entity' and 'agency_scope') without specifying format, fields, or pagination. For a complex tool with 10 parameters, this is a notable gap, though the behavioral details partially compensate.

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?

With 0% schema description coverage, the description explains several parameters (entity, rank_by, category, agency, agency_role) with concrete examples and default logic. However, it omits details for n, direction, min/max_total_budget, and delayed_only, so coverage is partial but adds value beyond 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?

The description clearly states the tool ranks schedules or budgets based on entity and rank_by, with specific examples for budget rank_by values. It distinguishes between two entities (schedule and budget) and lists optional filters, making the purpose unambiguous and distinct from siblings.

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

Usage Guidelines3/5

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

The description does not explicitly state when to use this tool versus alternatives like get_project_budget or schedule_breakdown. It implies usage for ranking but lacks 'when not to use' or comparative guidance, so usage context is only implicit.

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

resolve_project_referenceA

Resolve any project identifier (PID, FMS ID, name, partial) → schedule+budget matches bucketed by entity. Call this first for any named-project question.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

TDQS

A4.5/5.0
Behavior3/5

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

No annotations are provided, so the description must carry the full burden. It describes the mapping from identifier to data but does not mention any side effects, error handling, authentication requirements, or whether the tool is read-only. The lack of behavioral details limits transparency for an agent.

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 two sentences, front-loaded with the core purpose, and contains no unnecessary words. Every sentence adds value, making it highly concise and well-structured.

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?

Given the tool has one required parameter, no output schema, and no annotations, the description explains the return value ('schedule+budget matches bucketed by entity') but does not specify the exact structure or error handling. It is fairly complete for a simple resolver, but could be improved by noting what happens when a query matches no project.

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?

The input schema has one parameter 'query' with no description (0% schema coverage). The description adds significant meaning by specifying what types of identifiers are accepted: PID, FMS ID, name, partial. This fully compensates for the missing schema description.

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 resolves any project identifier (PID, FMS ID, name, partial) into schedule and budget matches bucketed by entity. It explicitly mentions input types and output, and differentiates from siblings by advising to call this first for any named-project question.

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 includes explicit guidance: 'Call this first for any named-project question.' This tells the agent when to use this tool before other project-specific tools like get_project_budget or get_project_schedule.

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

run_sqlA

Run a read-only SELECT against the local CPD DuckDB.

output: 'inline' (default, rows capped) | 'csv' | 'xlsx' (writes a file, returns path).
PREFER the typed tables: latest_project_state (1 row/PID, borough+boroughs,
attributed_budget), schedule_history (PID x period), budget_history (snapshot rows
at the (fms_id, managing_agency) x period grain), original_budget (adopted first
budgets), lifetime_budget_variance (per-line lifetime, original_budget_source),
schedule_budget_link (PID<->FMS edges), pid_funding (per-PID link rollup),
cumulative_schedule_variance (per-PID lifetime days), fms_sponsor (fms_id -> owner),
fms_location (line-level borough/community board), agency_rollup_by_period,
category_dim, agency_dim, project_budget_fy, meta.
GRAIN RULES: budget comparisons key on (managing_agency, fms_id) — never fms_id
alone; sponsor-scoped budget sums use the semi-join
fms_id IN (SELECT fms_id FROM fms_sponsor WHERE sponsor_agency = ...) — a
value-bearing JOIN fans out across a line's agency rows and double-counts.
PERIOD BASIS: fms_location, fms_sponsor, lifetime_budget_variance are ALL-HISTORY
dimensions (latest row per line/owner, NO reporting_period column) — JOIN them to
enrich or for lifetime figures; do NOT COUNT them as a single period's inventory.
For a period count, aggregate raw_project_detail / schedule_history / budget_history
filtered by reporting_period. Every result echoes latest_reporting_period (and warns
via period_basis_note when a query counts an all-history dim) — state the basis.
RAW mirrors (raw_project_detail, raw_budget_fy, raw_budget_history,
raw_schedule_history) are all VARCHAR — cast as needed.
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
outputNoinline

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations provided, the description fully discloses behaviors: read-only nature, output options with row caps and file writing, grain rules, and data type notes (VARCHAR). No contradictions.

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?

The description is front-loaded with the main purpose and well-structured, but it is lengthy. Most sentences add value, but some detail could be condensed.

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?

Given the complexity of a SQL tool with many tables, the description provides comprehensive context: table list, grain rules, period basis, and output options. It is complete for an agent to use 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 description adds meaning to the output parameter (inline/csv/xlsx) but does not describe the query parameter format or constraints. Given 0% schema coverage, the description compensates partially.

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 it runs a read-only SELECT against a specific database. It distinguishes from sibling tools by being a general SQL interface, while siblings are specific analyses.

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 provides extensive usage guidance, including preferred tables, grain rules, period basis, and output options. However, it does not explicitly compare to alternative tools or state when not to use this tool.

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

schedule_breakdownA

Counts/averages of schedule metrics by agency/sponsor/borough/phase/category. agency scopes to one agency; agency_role ('auto'|'sponsor'|'managing') picks owner vs builder lens (auto: sponsor, except DDC/DCAS/EDC -> managing). Category grouping counts a PID once in EACH of its categories (non-additive). Report neutral, signed variance.

ParametersJSON Schema
NameRequiredDescriptionDefault
group_byYes
metricNocount
statisticNocount
periodNocurrent
agencyNo
agency_roleNoauto

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description provides substantial behavioral context: agency_role logic, non-additive category counting, and signed variance. However, it omits details like required permissions or performance implications.

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?

The description is relatively concise and front-loaded with the main purpose, but the dense clauses could be better structured for readability.

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

Completeness3/5

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

While it covers key grouping and behavior nuances, it fails to explain several parameters and does not describe the output format, leaving gaps for a tool with no output schema.

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

Parameters2/5

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

Only 'agency' and 'agency_role' are explained beyond schema names. 'group_by', 'metric', 'statistic', and 'period' lack description, leaving 4 of 6 parameters undocumented despite 0% schema coverage.

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 it computes counts/averages of schedule metrics by specified grouping dimensions, distinguishing it from sibling tools like budget_breakdown which handle budget metrics.

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

Usage Guidelines3/5

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

The description explains agency_role behavior and category grouping nuance, but does not explicitly state when to use this tool versus alternatives like budget_breakdown or delay_reason_stats.

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

schedule_changesB

Newly completed (DR1) or newly delayed projects between two periods. agency scopes to one agency; agency_role ('auto'|'sponsor'|'managing') picks owner vs builder lens.

ParametersJSON Schema
NameRequiredDescriptionDefault
change_typeYes
from_periodYes
to_periodYes
agencyNo
include_cancelledNo
agency_roleNoauto

TDQS

B3.4/5.0
Behavior2/5

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

No annotations provided, so description carries full burden. It mentions 'newly completed' and 'delayed' but lacks details on data freshness, pagination, limits, or side effects. Minimal behavioral context.

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 concise sentences, front-loaded with purpose. Every word is informative with no redundancy.

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

Completeness2/5

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

With 6 parameters, 3 required, no output schema, and no annotations, the description is too sparse. It lacks details on return format, all parameter semantics, and behavioral expectations.

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 0%, so description must compensate. It explains agency and agency_role, but not from_period, to_period, or include_cancelled. Partially adds meaning but misses several parameters.

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 clearly states it retrieves newly completed (DR1) or newly delayed projects between two periods, with a specific verb and resource. It distinguishes from sibling tools like schedule_breakdown.

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

Usage Guidelines3/5

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

Description explains agency and agency_role parameters for scoping, but does not explicitly state when to use this tool vs alternatives like get_project_schedule or schedule_breakdown. Usage context is implied but not fully defined.

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

TDQS

B3.4/5.0
Disambiguation4/5

Most tools have distinct purposes, but some overlap exists between budget-related tools (e.g., budget_breakdown, budget_change, get_project_budget, rank_projects). Detailed descriptions help differentiate, but agents might occasionally misselect.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern (e.g., list_agencies, get_project_budget, resolve_project_reference). No mixing of conventions.

Tool Count5/5

16 tools is appropriate for the domain, covering budget, schedule, agencies, categories, and a SQL interface. Not too few or too many.

Completeness4/5

The tool set covers most essential operations for capital projects data: breakdowns, changes, rankings, portfolio listing, reference resolution, and custom SQL. Minor gaps exist (e.g., no explicit tool for full project history), but the SQL interface fills many needs.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI coding agents to query a pre-built semantic knowledge graph of code, reducing token usage and tool calls. Supports 16 tools for code exploration, analysis, and context building.
    13
    7
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Governed data pipeline for NBA ticketing and attendance data, exposing typed tools for AI agents to query game performance and seat-tier sales without direct database access.
  • A
    license
    A
    quality
    A
    maintenance
    Gives AI agents direct access to databases across 8 engines with 145+ tools, enabling schema-aware query execution and management through natural language.
    17
    63
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/WillHsiaoNYC/NYC-Opendata-Capital-Projects-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server