SACS.ai MCP — California School District Financial Data
Server Details
SACS California school finance: public district financial data, CDE filings, comparisons, briefings.
- Status
- Healthy
- Uptime
- 19.9% over 29 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 12 tools
Most tools have clearly distinct resources and actions: district search, dataset listing, financial summaries, attendance, comparison, code explanation, CSAM search, and CSAM graph retrieval are easy to separate. The main ambiguity is between the single and batch district context packs, and minor overlap exists between code explanation and CSAM related-content lookup.
All tools use a consistent sacs_ prefix and snake_case, generally following a verb_noun pattern such as sacs_search_districts, sacs_query_attendance, and sacs_compare_districts. The district_context_pack and district_context_pack_batch names are noun phrases rather than verb-led, a minor deviation.
Twelve tools is well within a reasonable range for a domain-specific data and reference server. Each tool covers a recognizable role: discovery, dataset access, comparison, contextual fiscal analysis, CSAM lookup, code explanation, registration, and feedback.
The surface covers the major workflows: finding districts, listing datasets, querying financial and attendance data, comparing districts, building fiscal-distress context, explaining codes, and searching CSAM. Minor gaps remain, such as direct dataset metadata/retrieval or a browse-codes operation, but agents can likely work around them.
Available Tools
12 toolssacs_compare_districtsCRead-onlyIdempotentInspect
Compare deterministic object-category totals for two explicit official datasets.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | ||
| fund_codes | No | ||
| resource_codes | No | ||
| base_dataset_ref | Yes | ||
| compare_dataset_ref | Yes | ||
| base_district_identifier | Yes | ||
| compare_district_identifier | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| request_id | Yes | |
| limitations | No | |
| data_version | Yes | |
| contract_version | No | |
| source_provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false). The description adds only 'deterministic' and 'official' without explaining return behavior, error conditions, rate limits, or any operational constraint beyond the 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 front-loaded sentence with no wasted words, so it is appropriately concise. However, its terseness is part of the problem: it is short but not sufficiently informative for a 7-parameter comparison tool.
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?
Although an output schema exists and annotations cover safety, the input side is complex (7 parameters, 4 required) and schema description coverage is 0%. A one-sentence description does not provide enough guidance on required identifiers, dataset refs, optional scoping, or comparison semantics.
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 7 parameters and 0% schema description coverage, the description provides no parameter-level semantics. It does not explain base vs compare district/dataset refs, the default behavior for fund_codes, what resource_codes mean, or the role of client_id.
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 states a specific verb ('Compare') and resource ('object-category totals') for two datasets, which makes the core action clear. It does not, however, differentiate this tool from siblings like sacs_query_financial_summary, and the name says 'districts' while the description says 'datasets', leaving a mild ambiguity.
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 implies use when comparing two explicit official datasets, but gives no explicit when-to-use guidance, no exclusions, and no named alternatives among the many sibling tools. An agent must infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sacs_district_context_packCRead-onlyIdempotentInspect
Build fiscal-distress rows with source filing details. Deficit spending is signed net operating result / expenditure; negative means deficit.
| Name | Required | Description | Default |
|---|---|---|---|
| basis | No | estimated_actuals | |
| detail | No | full | |
| client_id | No | ||
| fund_codes | No | ||
| fiscal_year_max | No | ||
| fiscal_year_min | No | ||
| district_identifier | Yes | ||
| one_time_resource_codes | No | ||
| include_balance_sheet_from_actuals | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| request_id | Yes | |
| limitations | No | |
| data_version | Yes | |
| contract_version | No | |
| source_provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is fully covered. The description adds the signed convention for deficit spending (negative means deficit), which is genuinely useful for reading results, but says nothing about source coverage, defaults (Fund 01, balance sheet from actuals), or error behavior for unknown districts.
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 tight sentences with no filler, and the primary purpose is front-loaded before the metric convention. Nothing extraneous, though the space saved is not spent on the missing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with an output schema and a batch sibling, the description omits the district_identifier format, the fiscal-year windowing, the basis/detail tradeoff, and any notion of what a row contains. It is far too thin for the surface area involved.
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% across 9 parameters, and the description compensates for none of them: basis, detail, client_id, fiscal_year_min/max, one_time_resource_codes, and include_balance_sheet_from_actuals are all left to inference. The self-describing enums and defaults in the schema keep this above a 1, but the burden clearly isn't met.
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?
It names a verb and an outcome ('build fiscal-distress rows with source filing details'), so the agent knows roughly what comes back. But 'fiscal-distress rows' and 'context pack' are unexplained domain jargon, and nothing distinguishes this from sacs_query_financial_summary or sacs_district_context_pack_batch among the 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?
There is no statement of when to reach for this tool, no prerequisites (e.g. registration via sacs_register_client), and no pointer to the batch variant or the summary-query sibling. The only guidance is a metric definition, not usage selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sacs_district_context_pack_batchCRead-onlyIdempotentInspect
Build bounded district packs with source filing details. Deficit spending is signed net operating result / expenditure; negative means deficit.
| Name | Required | Description | Default |
|---|---|---|---|
| basis | No | estimated_actuals | |
| detail | No | summary | |
| client_id | No | ||
| fund_codes | No | ||
| fiscal_year_max | No | ||
| fiscal_year_min | No | ||
| district_identifiers | Yes | ||
| one_time_resource_codes | No | ||
| include_balance_sheet_from_actuals | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| request_id | Yes | |
| limitations | No | |
| data_version | Yes | |
| contract_version | No | |
| source_provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered structurally. The description adds only that packs are "bounded" (scope limit) and includes source filing details, but says nothing about batch size limits (25 districts, 20 funds per schema), failure behavior for unknown districts, or what the deficit metric is computed against.
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 short sentences with the operation front-loaded, no filler or marketing language. The second sentence is arguably tangential to invoking the tool, but it is dense and earns partial credit as domain context.
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 9 parameters, only 1 required, two enums, and a sibling single-district variant, a two-sentence description is far too thin — batching semantics, defaults (Fund 01, estimated_actuals, summary), and the relationship to the singular tool are all absent. The output schema exists so return values need not be explained, but input behavior is not covered.
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% across 9 parameters, so the description carries the full burden and fails to do so. It explains nothing about basis (five filing stages), detail (summary vs full), fiscal_year_min/max, one_time_resource_codes, or include_balance_sheet_from_actuals — an agent must guess at the fiscal-impact of each. The only term defined (deficit spending) describes output, not an input.
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?
"Build bounded district packs with source filing details" names a verb (build) and a resource (district packs) but "bounded" and "pack" are internal jargon, and the description never distinguishes this batch tool from the sibling sacs_district_context_pack (singular). The second sentence defines a metric rather than the tool's purpose, so an agent must infer the batch-vs-single distinction from the name alone.
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?
There is no when-to-use guidance, no mention of when to pick this over sacs_district_context_pack or sacs_query_financial_summary, and no stated batching limits or prerequisites. The deficit-spending definition is a glossary note, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sacs_explain_codeBRead-onlyIdempotentInspect
Explain current public fund, resource, goal, function, or object codes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| offset | No | ||
| client_id | No | ||
| code_type | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| request_id | Yes | |
| limitations | No | |
| data_version | Yes | |
| contract_version | No | |
| source_provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world, non-destructive behavior, so the safety profile is covered. The description contributes one meaningful detail — it only explains *current public* codes, implying historical or non-published codes are out of scope — but says nothing about pagination or whether it returns one match or many.
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?
A single sentence with no filler, with the verb and the scope qualifier front-loaded. Its brevity is appropriate in form, though it is thin on substance rather than padded.
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?
An output schema exists, so return values need not be described. However, with 5 parameters including an ambiguous free-text field and an opaque client_id, and with only two required inputs, the description leaves the agent guessing about how to construct a call and what a match means.
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% across 5 parameters, so the description must compensate and does not. Most critically, it never explains whether 'query' is a literal code value, a prefix, or free-text matching, nor what client_id represents — the single most consequential ambiguity for an 'explain' tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Explain") and resource (SACS codes), and enumerates the five code types that match the code_type enum, so the agent knows exactly what domain it covers. It doesn't explicitly contrast itself with any sibling, but no sibling appears to overlap this 'look up a code's definition' function.
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?
"current public" hints at scope (only current, published codes), but there is no statement of when to choose this tool over sacs_search_districts, sacs_query_financial_summary, or others, and no prerequisites or exclusions. The agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sacs_list_public_datasetsCRead-onlyIdempotentInspect
List versioned official public SACS datasets for one district.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| client_id | No | ||
| district_identifier | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| request_id | Yes | |
| limitations | No | |
| data_version | Yes | |
| contract_version | No | |
| source_provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered. The description adds that datasets are 'versioned' and 'official public', which is meaningful context about what is returned, but it says nothing about pagination behavior, result volume, or whether an unregistered client can call it.
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?
A single front-loaded sentence with zero wasted words, and the resource scope appears before the qualifier. It is efficient, though its brevity reflects underspecification rather than disciplined editing.
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?
An output schema exists, so return values need not be described. However, for a four-parameter paginated tool with 0% schema coverage and a sibling sacs_register_client implying an auth/registration flow, the description leaves the client_id requirement and pagination semantics entirely unaddressed.
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, and it only covers district_identifier ('for one district'). limit and offset are conventional, but client_id (pattern sacs_client_[0-9a-f]{32}) is entirely unexplained, and no mention is made of the limit cap of 50 or offset cap of 500.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and a well-defined resource ('versioned official public SACS datasets') scoped to one district. It does not explicitly distinguish itself from siblings such as sacs_district_context_pack or sacs_query_financial_summary, so an agent must infer that this is the dataset-discovery entry point.
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?
There is no statement of when to use this versus alternatives, nor any prerequisites or sequencing guidance (e.g., that it might be a discovery step before sacs_query_financial_summary). The 'for one district' phrasing only implies the required parameter, not the usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sacs_query_attendanceCRead-onlyIdempotentInspect
Return recovered Form A ADA observations for one official district filing.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| client_id | No | ||
| dataset_ref | Yes | ||
| district_identifier | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| request_id | Yes | |
| limitations | No | |
| data_version | Yes | |
| contract_version | No | |
| source_provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, closed-world and non-destructive behavior, so the safety profile is covered. The description adds little beyond the scope hint, and it never explains what 'recovered' means (backfilled? re-derived?), how large results can be, or the meaning of the limit/offset window.
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?
A single front-loaded sentence with no filler or repetition. It is short and easy to scan, though the compactness comes partly at the cost of information covered under other dimensions.
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?
An output schema exists, so return shape need not be described. However, for a tool with five undocumented parameters, no annotations gap-filling needed but no parameter or constraint detail either, the description leaves an agent unable to construct a correct call without reading the raw 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?
Schema description coverage is 0% across five parameters, so the description must carry the burden and it does not. It never explains the 'official:<id>' dataset_ref pattern, the district_identifier format, the client_id requirement, or pagination defaults and caps.
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 names a resource ('recovered Form A ADA observations') and a scope ('one official district filing'), so the general intent is inferable. But 'recovered' and 'Form A ADA' are unexplained domain jargon, and nothing distinguishes it from siblings like sacs_query_financial_summary or sacs_district_context_pack.
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?
There is no indication of when to use this tool versus the eleven sibling query tools, no prerequisites, and no note on when a dataset_ref is appropriate. The agent must infer usage entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sacs_query_financial_summaryCRead-onlyIdempotentInspect
Return bounded aggregate financial summaries for one explicit official dataset.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | No | ||
| dataset_ref | Yes | ||
| group_limit | No | ||
| fund_code_max | No | 01 | |
| fund_code_min | No | 01 | |
| goal_code_max | No | ||
| goal_code_min | No | ||
| object_code_max | No | ||
| object_code_min | No | ||
| function_code_max | No | ||
| function_code_min | No | ||
| resource_code_max | No | ||
| resource_code_min | No | ||
| district_identifier | Yes | ||
| include_zero_categories | No | Include zero-amount object category and group rows. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| request_id | Yes | |
| limitations | No | |
| data_version | Yes | |
| contract_version | No | |
| source_provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so safety is covered. Beyond that the description adds only the word 'bounded', which hints at aggregation caps (group_limit max 25) without explaining what is bounded, how amounts are aggregated, or what happens when code ranges are omitted.
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?
A single front-loaded sentence with no filler. It is efficient, but the brevity is achieved by omitting information rather than by compressing it.
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?
Invalid: a 15-parameter tool with 7% schema coverage and a single-sentence description leaves large gaps around filter pairing, defaults (Fund 01) and aggregation behavior. Annotations and an output schema cover the safety and return-shape burdens, but the input side remains under-explained.
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 only 7% — just three of fifteen parameters (fund_code_min/max, include_zero_categories) carry any documentation. The description does not explain district_identifier, the 'official:<id>' form of dataset_ref, the min/max code-range pairing pattern, or group_limit and defaults; 'one explicit official dataset' and 'bounded' are only faint hints.
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 names a specific verb ('Return') and a specific resource ('aggregate financial summaries'), scoped to 'one explicit official dataset'. That is enough to separate it from siblings like sacs_compare_districts or sacs_query_attendance, though it never names an alternative explicitly.
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?
There is no guidance on when to choose this over sacs_compare_districts or sacs_district_context_pack, and no mention of prerequisites such as needing a registered client or a dataset ref obtained from sacs_list_public_datasets. The agent must infer usage entirely from the name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sacs_register_clientAInspect
Optionally register this MCP installation. Before calling, tell the operator registration is voluntary, data access works without it, list the fields to be stored, and obtain consent. Never infer or submit personal or confidential information.
| Name | Required | Description | Default |
|---|---|---|---|
| use_case | No | ||
| client_id | No | ||
| user_type | No | ||
| agent_client | No | ||
| consent_to_store | Yes | Must be true, and only after the operator accepts the disclosed storage. | |
| home_district_cds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| request_id | Yes | |
| limitations | No | |
| data_version | Yes | |
| contract_version | No | |
| source_provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, idempotentHint=false and destructiveHint=false, so the description's real value is the privacy and consent contract it adds: voluntary participation, mandatory disclosure, and a prohibition on inferring or submitting personal/confidential data. Somewhat missing is what actually happens on registration, e.g. whether passing an existing client_id re-registers or updates the record, which matters given idempotentHint=false.
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 tightly packed sentences with no waste; the optionality and consent precondition are front-loaded before the privacy prohibition.
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?
Annotations and the output schema cover safety and return semantics, and the consent protocol is well specified, but with 6 parameters at 17% schema coverage the description leaves the agent guessing about five fields it is told to disclose to the operator.
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 only 17% – just consent_to_store is documented. The description tells the agent to 'list the fields to be stored' but never enumerates them or explains use_case, user_type, agent_client, home_district_cds, or the meaning/format of client_id, so an agent cannot tell whether to supply a pre-existing client_id or omit 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?
States a specific verb and resource: registering 'this MCP installation' with the SACS service, and flags that it is optional. It is clearly distinguishable from the sibling tools, which are all read-only data query tools, though the description never explicitly says so.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition sequence: disclose that registration is voluntary, confirm data access works without it, list stored fields, and obtain consent before calling. The 'before calling' framing plus the optionality statement effectively answers when and when-not to call, with no sibling alternative needed since none exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sacs_search_csamARead-onlyIdempotentInspect
Search California School Accounting Manual (CSAM 2024) by keywords and topic, procedure number or a returned chunk_id. Use chunk_id with direction=previous or next and limit (1–10) to read adjacent source chunks within the same procedure; navigation.continuation supplies the next request. Results include extracted text plus Markdown with conservative code-definition/journal tables, topic path, procedure revision, printed/PDF page and a CDE PDF citation. All non-stopword keywords must match; topic filters heading words. Use short accounting terms rather than a long question. Read citations for surrounding tables/context; later correspondence is excluded. No login or model-provider key required.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| topic | No | ||
| offset | No | ||
| chunk_id | No | ||
| client_id | No | ||
| direction | No | current | |
| procedure | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| request_id | Yes | |
| limitations | No | |
| data_version | Yes | |
| contract_version | No | |
| source_provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, closed-world), and the description adds real behavioral detail: all non-stopword keywords must match (AND semantics), topic matches heading words, results carry extracted text plus Markdown tables, topic path, revision, page numbers and a CDE citation, navigation.continuation supplies the next request, and no login or provider key is needed.
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?
Front-loaded with the core search purpose and modes, then supporting detail; nearly every clause carries information. It is a dense semicolon-chained block though, and the citation/return-detail sentence could be trimmed since an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-param, all-optional tool with an output schema, the description covers the search modes, adjacency navigation, match semantics, and what results contain. The unexplained offset/client_id parameters and the opaque phrase "topic filters heading words" are the only material omissions.
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 carry the load, and it does for six of eight params: query semantics (short accounting terms), topic (heading-word filter), procedure number, chunk_id format/use, direction (previous/next adjacent reading), and limit (1–10). offset and client_id are never explained, leaving a real gap for a zero-coverage 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?
Opens with a specific verb and resource ("Search California School Accounting Manual (CSAM 2024)") and enumerates the three access modes: keywords/topic, procedure number, or chunk_id. That clearly separates it from siblings like sacs_explain_code or sacs_get_csam_related, which do not search the manual text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage guidance: use chunk_id with direction=previous/next plus limit to read adjacent chunks, and "Use short accounting terms rather than a long question." It also warns that later correspondence is excluded and to read citations for surrounding context. It stops short of naming sibling alternatives (e.g., when to prefer sacs_get_csam_related), so it doesn't reach a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sacs_search_districtsARead-onlyIdempotentInspect
Search current public California districts by name, 7-digit LEA, or 14-digit CDS.
Omit query or pass an empty string to browse all current districts.
Follow page.next_offset while page.has_more is true; pages contain at most 50 rows.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | ||
| offset | No | ||
| client_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| request_id | Yes | |
| limitations | No | |
| data_version | Yes | |
| contract_version | No | |
| source_provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower. The description still adds genuine operational context beyond them: the 50-row page cap and the next_offset/has_more pagination loop, which an agent would otherwise have to infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the verb and scope, then browse semantics, then pagination. Every sentence carries actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value shape and the page.next_offset field need not be explained. The remaining shortfall is the undocumented client_id parameter and no guidance on how this search relates to adjacent district tools.
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 has to carry parameter meaning. It clarifies that query accepts name, 7-digit LEA, or 14-digit CDS and that empty string means browse-all, which is real added value, but it says nothing about client_id or about limit/offset beyond the implicit page cap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) plus a precisely scoped resource: current public California districts, searchable by name, 7-digit LEA, or 14-digit CDS. This is enough to distinguish it from siblings like sacs_query_financial_summary or sacs_district_context_pack.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit operational context: omit query or pass an empty string to browse everything, and follow page.next_offset while page.has_more is true. It does not, however, contrast with sibling tools (e.g. sacs_compare_districts or sacs_district_context_pack) to tell the agent when this search is the wrong entry point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sacs_submit_feedbackAInspect
Report a wrong, stale, incomplete, or failed result, or send a feature request. Ask the operator to report issues here; explain the exact fields and submit only with consent. Include request ID and data version when available. Anonymous feedback is welcome. Never include personal, student, personnel, or confidential information.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| client_id | No | ||
| sentiment | Yes | ||
| feedback_type | No | general | |
| related_request_id | No | ||
| related_data_version | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| request_id | Yes | |
| limitations | No | |
| data_version | Yes | |
| contract_version | No | |
| source_provenance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as a non-read-only, non-destructive, non-idempotent write, and the description adds the missing context: consent is required, anonymity is accepted, and personal/student/personnel/confidential data must never be included. These privacy and consent constraints are exactly the kind of behavioral detail annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the purpose before the operating rules and the privacy constraint. Dense but every sentence carries a distinct instruction; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the consent/privacy rules are well covered. However, with six parameters at 0% schema coverage and two enums, the description should say something about choosing a feedback_type or sentiment to be fully sufficient.
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 carry the parameter load, and it only covers two of six (request ID and data version). It says nothing about what sentiment 'good/bad/mixed' means, how feedback_type categories differ, or what client_id identifies, leaving the opaque client_id pattern entirely unexplained.
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?
Opening sentence gives a specific verb (report) and a precise resource/scope: wrong, stale, incomplete, or failed results plus feature requests. That clearly separates it from the query/search siblings, though it never names another tool explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real operating instructions: ask the operator to file issues here, explain the exact fields, and submit only with consent. That establishes a clear precondition for invocation, but it offers no explicit when-not guidance or alternative destinations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
- First observed
sacs_compare_districts - First observed
sacs_district_context_pack - First observed
sacs_district_context_pack_batch - First observed
sacs_explain_code - First observed
sacs_get_csam_related - First observed
sacs_list_public_datasets - First observed
sacs_query_attendance - First observed
sacs_query_financial_summary - First observed
sacs_register_client - First observed
sacs_search_csam - First observed
sacs_search_districts - First observed
sacs_submit_feedback
Related MCP Connectors
ca-debtwatch — California municipal bond issuance (CDIAC / DebtWatch)
School enrollment, graduation rates, demographics, finance, and Title I data
California school data for AI agents — scores, comparisons, feeder paths, TK ages, applications.
Financial data, fiscal health scores, and economic indicators for 20,000+ U.S. municipalities.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables searching and retrieving detailed California municipal bond issuance data from CDIAC/DebtWatch, including issue terms, costs, participants, and issuer profiles.310 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables natural-language queries about US K-12 public schools, districts, per-pupil funding and spending, and child poverty estimates from keyless federal data.11 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables querying and analyzing US federal grant single-audit filings, including audits, findings, and federal awards, using data from the Federal Audit Clearinghouse.426 npmMIT
- AlicenseAqualityBmaintenanceEnables users to answer California drinking water questions about public water systems, SAFER risk/violation status, source-water chemistry, school lead sampling, and latest tap/treated-water results by ZIP code or water system ID, using curated Databricks Gold views over State Water Board open data.7MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.