NYC Open Data Capital Projects MCP Server
The NYC Open Data Capital Projects MCP Server lets you query, analyze, and explore NYC capital projects data — covering schedules, budgets, history, and variances — using 16 domain-aware tools backed by a local DuckDB database.
Query & Explore Data
Run custom SQL queries against the local DuckDB, including tables for project state, schedule/budget history, funding, variance, and agency/category dimensions
Check data freshness — view per-dataset row counts, current reporting period, and key caveats (data is refreshed ~3×/year: Jan/May/Sep)
Look up field definitions — access the official NYC Open Data data dictionary for any column or dataset
Browse & Resolve
List agencies and categories — see active agencies, their schedule-executor roles, and budget/line counts by program type
Resolve project references — map any project name, PID, FMS ID, or partial identifier to matching schedule and budget entities
Drill Into Projects
Get project schedules — retrieve phase, lifecycle status, signed schedule variance, delay reasons, and linked budget lines
Get project budgets — retrieve total budget, spend-to-date, variance, and linked schedules for a given FMS line
Aggregate & Analyze
Break down schedules or budgets — aggregate counts, averages, or totals by agency, sponsor, borough, phase, or category with role-aware attribution
Track schedule changes — identify projects newly completed or newly delayed between any two reporting periods
Analyze delay reasons — view the distribution of delay drivers for the current period or across all history
Measure budget changes — compute budget/spend deltas for an agency or specific FMS line between two reporting periods
Rank projects — rank schedules or budget lines by total budget, spend %, variance, or cumulative change, with optional filters
Analyze project durations — compute duration distributions between actual milestones, grouped by agency, borough, or lifecycle status
Browse the project portfolio — filter and list projects by category, borough, community board, lifecycle status, and/or agency
Domain Rules Built In
PID ↔ FMS many-to-many relationships handled correctly
Role-aware agency attribution: sponsor (owner) view for normal agencies; managing (builder) view for DDC/DCAS/EDC
Signed, neutral variance reporting (e.g., "moved 45 days later", "budget grew $2.1M")
3×-a-year reporting cadence acknowledged in all period-based tools
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@NYC Open Data Capital Projects MCP ServerShow me the capital projects with largest schedule delays"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Citywide Capital Project List Detail (the schedule↔budget edge) |
| Citywide Budget & Spend by FY |
| Citywide Budget Spend History & Variance |
| 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 topology — the 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 $50M — every 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 monitor — what 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 commands — Claude Code, Claude cowork (Claude Desktop's local-agent mode), Codex CLI, or another coding agent like Cursor.
Start your AI agent on this computer.
Paste the message below.
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 periodOptional: 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-serverClaude 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 newerTo 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 updateWhat'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 + toolsdata/— 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 pytestClassification 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 toolsbudget_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.
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | No | managing_agency | |
| metric | No | total_budget | |
| period | No | current | |
| agency | No | ||
| agency_role | No | auto |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| from_period | Yes | ||
| to_period | Yes | ||
| metric | No | total_budget | |
| agency_role | No | auto |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | current | |
| agency | No | ||
| scope | No | current | |
| agency_role | No | auto |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| field | No | ||
| dataset | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fms_id | Yes | ||
| managing_agency | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pid | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| contains | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| from_milestone | No | actual_design_start | |
| to_milestone | No | actual_construction_end | |
| group_by | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | ||
| borough | No | ||
| community_board | No | ||
| lifecycle_status | No | ||
| agency | No | ||
| agency_role | No | auto | |
| n | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | ||
| rank_by | Yes | ||
| n | No | ||
| direction | No | top | |
| min_total_budget | No | ||
| max_total_budget | No | ||
| delayed_only | No | ||
| category | No | ||
| agency | No | ||
| agency_role | No | auto |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| output | No | inline |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | Yes | ||
| metric | No | count | |
| statistic | No | count | |
| period | No | current | |
| agency | No | ||
| agency_role | No | auto |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| change_type | Yes | ||
| from_period | Yes | ||
| to_period | Yes | ||
| agency | No | ||
| include_cancelled | No | ||
| agency_role | No | auto |
TDQS
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.
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.
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.
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.
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.
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
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.
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.
16 tools is appropriate for the domain, covering budget, schedule, agencies, categories, and a SQL interface. Not too few or too many.
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
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
SaaS intelligence for AI agents. 5 unified tools cover 1,000+ services with 91-96% token savings.
Connect AI agents to financial institution origination, analytics, and compliance workflows.
45 AI data tools for agents — crypto, DeFi risk, audits, equities, energy, and more.
See, price, and control every tool call your AI agents make: policy checks, cost, and audit tools.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables 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.137MIT
- FlicenseNot gradedqualityBmaintenanceGoverned 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.
- AlicenseNot gradedqualityAmaintenanceEnables AI clients to interact with OfficeRnD coworking space management platform via natural language, exposing 130+ tools for CRUD operations and business logic.MIT
- AlicenseAqualityAmaintenanceGives AI agents direct access to databases across 8 engines with 145+ tools, enabling schema-aware query execution and management through natural language.1763MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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