uk-schools-mcp
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., "@uk-schools-mcpFind primary schools near MK9 3BZ"
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.
UK Schools MCP Server
A Model Context Protocol server that provides AI assistants with access to comprehensive UK school data from official government sources.
Features
Search schools by name, postcode, or local authority (GIAS bulk data)
Get detailed school information (type, phase, age range, capacity, contact details)
Find schools near a postcode with distance sorting (Postcodes.io geocoding)
Compare schools side-by-side
Browse and query 23+ DfE education datasets (absence, exclusions, performance, SEND, admissions, workforce, funding, destinations, and more)
One-step dataset discovery: find the right dataset for any education topic
Get Ofsted inspection grades and judgements from Management Information data
Links to Ofsted inspection reports
Related MCP server: teadata-mcp
Data Sources
Source | Type | Auth | What it provides |
Bulk CSV (daily) | None | All ~65k schools: name, URN, type, phase, address, capacity, pupils, head teacher, SEN, etc. | |
REST JSON API | None | UK postcode geocoding (lat/lng) for catchment area searches | |
REST JSON API | None | DfE publications: performance tables, absence, exclusions, applications & offers, workforce | |
Monthly Excel + report links | None | Inspection grades, judgement areas, dates, and report URLs |
Installation
Using uv (recommended)
git clone https://github.com/yourusername/uk-schools-mcp.git
cd uk-schools-mcp
uv sync --all-extras
uv run python -m uk_schools_mcp.serverUsing pip
pip install mcp httpx polars pydantic openpyxlUsage with Claude Desktop
Add to your Claude Desktop configuration (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"uk-schools": {
"command": "uv",
"args": [
"--directory",
"/path/to/uk-schools-mcp",
"run",
"python",
"-m",
"uk_schools_mcp.server"
]
}
}
}Available Tools
search_schools
Search for UK schools by name, postcode, or local authority using GIAS data.
Example: "Find primary schools in Milton Keynes"
get_school_details
Get comprehensive details for a specific school by URN, including links to Ofsted reports and the GIAS page.
Example: "Show me details for URN 109825"
find_schools_near_postcode
Find schools within a radius of a UK postcode, sorted by distance. Uses Postcodes.io for geocoding and GIAS data for school locations.
Example: "Find all primary schools within 2km of MK9 3BZ"
compare_schools
Compare multiple schools side-by-side by URN.
Example: "Compare schools with URNs 109825, 110234, and 110567"
search_education_statistics
Search the DfE Explore Education Statistics catalogue for publications on school performance, absence, exclusions, applications & offers, workforce, etc.
Example: "Search for publications about school absence"
get_publication_datasets
List available datasets for a DfE publication (use after search_education_statistics).
get_dataset_metadata
Get available filters, indicators, geographic levels, and time periods for a DfE dataset. Essential before querying to discover what data is available and what IDs to use.
Example: "What filters and indicators are available for dataset ds-123?"
query_dataset
Query a DfE Explore Education Statistics dataset with specific indicators, filters, time periods, and geographic levels. Enables access to school-level data on absence, exclusions, performance, admissions, workforce, and more.
Example: "Query the absence dataset for 2023 academic year at national level"
get_ofsted_ratings
Get Ofsted inspection ratings and grades for a school by URN. Returns overall effectiveness grade and grades for each inspection area (Quality of Education, Behaviour and Attitudes, Personal Development, Leadership and Management), plus inspection dates, type, and previous grades.
Example: "Get Ofsted ratings for URN 109825"
list_ees_topics
List all 23 available education data topics from the DfE Explore Education Statistics API, organized by category (performance, welfare, demographics, admissions, workforce, finance, destinations, early years).
discover_dataset
Automatically find the publications and datasets for a given education topic. Replaces the manual 4-step workflow with a single call. Returns dataset IDs ready for use with get_dataset_metadata and query_dataset.
Example: "Discover datasets for topic 'absence'" or "Find SEND data"
Available topics: absence, exclusions, ks2_performance, gcse_performance, a_level_performance, applications_offers, workforce, sen, school_pupils_characteristics, free_school_meals, school_capacity, admission_appeals, destinations, children_looked_after, children_in_need, mat_performance, school_funding, la_school_expenditure, further_education, early_years, early_years_foundation, neet, elective_home_education
Development
Setup
git clone https://github.com/yourusername/uk-schools-mcp.git
cd uk-schools-mcp
uv sync --all-extras
uv run pytest
uv run ruff check src/ tests/Project Structure
uk-schools-mcp/
├── src/
│ └── uk_schools_mcp/
│ ├── server.py # MCP server + tool handlers
│ └── clients/
│ ├── gias.py # GIAS bulk CSV client
│ ├── postcodes.py # Postcodes.io geocoding client
│ ├── ees.py # Explore Education Statistics API client
│ └── ofsted.py # Ofsted report URL helper
├── tests/
│ └── test_server.py
├── NEXT_STEPS.md # Roadmap for additional data sources
└── pyproject.tomlHow GIAS Data Works
On first use, the server downloads the daily GIAS bulk CSV (~65k schools, ~30MB) from:
https://ea-edubase-api-prod.azurewebsites.net/edubase/downloads/public/edubasealldata{YYYYMMDD}.csvThe CSV is cached locally at ~/.cache/uk-schools-mcp/ and refreshed daily. All search and lookup operations run against this cached data using polars for fast filtering.
Contributing
Contributions welcome! See NEXT_STEPS.md for planned enhancements.
License
MIT License - See LICENSE file for details.
Acknowledgments
Built with data from:
Department for Education (DfE) - GIAS and Explore Education Statistics
Office for Standards in Education (Ofsted) - Inspection reports
Postcodes.io - Open-source UK postcode geocoding
Available Tools
11 toolscompare_schoolsA
Compare multiple schools side-by-side by their URNs. Shows key facts for each school including type, phase, pupil numbers, capacity, admissions policy, and Ofsted info.
| Name | Required | Description | Default |
|---|---|---|---|
| urns | Yes | List of URNs to compare (2-6 schools) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the info fields shown (type, phase, pupil numbers, etc.) but does not mention potential missing data, response format, or any operational caveats. It adds some value but lacks deeper 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?
The description is two concise sentences, front-loaded with the core action ('Compare multiple schools side-by-side by their URNs') followed by the key facts shown. No unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a simple input (one array param), no output schema, and no annotations. The description adequately explains what it does and what it returns. Some details like geographic scope are missing, but the sibling-tool context and straightforward nature make the description 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 coverage is 100%, so the description of the 'urns' parameter in the schema already explains it fully. The description's phrase 'by their URNs' adds no new meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Compare') and resource ('multiple schools'), and it distinguishes from siblings by emphasizing side-by-side comparison via URNs. The list of shown facts further clarifies what the tool does.
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 usage context — you need URNs to compare schools — and the schema's minItems=2 reinforces that. It doesn't explicitly name alternatives like search_schools for finding URNs, but the context is clear enough for an agent to decide when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_datasetA
Discover the publications and datasets available for a specific education data topic. This replaces the manual 4-step workflow (search_education_statistics -> get_publication_datasets -> get_dataset_metadata -> query_dataset) by automatically finding the right publication and listing its datasets with IDs. Use list_ees_topics first to see available topic keys, then use the dataset ID from the results with get_dataset_metadata and query_dataset.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Topic key from list_ees_topics, e.g. 'absence', 'exclusions', 'gcse_performance', 'sen', 'workforce', 'applications_offers', 'school_funding', 'destinations' |
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 adds useful behavioral context by explaining that the tool automatically finds the right publication and lists datasets with IDs, and that it replaces a multi-step workflow. It doesn't disclose side effects or limitations, but for a discovery/read tool, this is sufficient context beyond the name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that flow logically: first states the purpose and the workflow it replaces, second gives the recommended next steps. No wasted words, though the second sentence is slightly dense. Still appropriately concise for an orchestration 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?
For a single-parameter tool with no output schema, the description is complete: it explains what it does, the prerequisite (list_ees_topics), and the follow-up tools (get_dataset_metadata, query_dataset). It also notes that it lists dataset IDs, which is the key information the agent needs to proceed.
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 covers the single 'topic' parameter 100%, including examples. The description reinforces this by directing users to list_ees_topics first, adding semantic linkage beyond the schema. This adds value while not repeating verbatim.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Discover the publications and datasets available for a specific education data topic.' It also distinguishes itself by referencing the manual 4-step workflow and naming sibling tools like get_dataset_metadata and query_dataset as follow-up steps.
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?
Explicit usage guidance is provided: 'Use list_ees_topics first to see available topic keys, then use the dataset ID from the results with get_dataset_metadata and query_dataset.' This tells the agent exactly when to use this tool and what to do before/after, effectively replacing the manual workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_schools_near_postcodeA
Find schools within a specified distance of a UK postcode. Geocodes the postcode using Postcodes.io, then searches GIAS data for nearby schools sorted by distance. Useful for finding schools in a catchment area.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results (default: 20) | |
| phase | No | Filter by phase (e.g., 'Primary', 'Secondary') | |
| postcode | Yes | UK postcode (e.g., 'MK9 3BZ', 'SW1A 1AA') | |
| radius_km | No | Search radius in kilometres (default: 3, max: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It reveals internal steps (geocoding via Postcodes.io, searching GIAS data, sorting by distance), which is useful context. However, it does not disclose potential limitations like invalid postcode handling, rate limits, or maximum radius constraints beyond what's in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary purpose, then details the method and use case. Every sentence adds value with no redundant or filler content.
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 straightforward search tool with fully described parameters and no output schema, the description covers the main workflow (geocoding and searching) and expected sort order. It could mention result format or edge cases, but the current information is sufficient for a typical 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?
The schema already provides 100% coverage with descriptions for all parameters, including defaults and max. The tool description adds a little nuance by mentioning distance and catchment, but it does not substantially enhance understanding beyond the schema fields.
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 finds schools within a distance of a UK postcode, using a specific verb ('Find') and resource ('schools near a postcode'). It distinguishes itself from sibling tools like search_schools by emphasizing location-based search and catchment area use.
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 a clear usage context ('Useful for finding schools in a catchment area'), but does not explicitly mention when to avoid this tool or point to alternatives. This meets 'clear context, no exclusions' but lacks the explicit alternative naming seen in the highest benchmarks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dataset_metadataA
Get the available filters, indicators, geographic levels, locations, and time periods for a DfE dataset. Use this to discover what data is available and what filter/indicator IDs to use with query_dataset. This is essential before querying - it tells you what indicators (e.g. absence rate, number of exclusions) and filters (e.g. school type, gender) are available, along with their IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | Dataset ID from get_publication_datasets |
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 uses the non-mutating verb 'Get' and clearly describes the output (filters, indicators, locations, time periods), which implies a read-only discovery operation. However, it does not explicitly state that it has no side effects or mention any rate limits/auth needs, which would be additional useful 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?
The description is only two sentences, both of which provide essential value: the first states the tool's output; the second explains its role in the workflow and gives concrete examples (e.g., 'absence rate, number of exclusions'). There is no fluff or repetition.
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 a single parameter, no output schema, and no annotations, the description covers all necessary aspects: what it returns (filters, indicators, etc.), why it is needed (to obtain IDs for query_dataset), and when to use it (before querying). It is fully sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description for dataset_id already provides the semantic context ('Dataset ID from get_publication_datasets'), achieving 100% coverage. The tool description does not add further detail about the parameter beyond that, so it relies on the schema as baseline.
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 what the tool does with a specific verb ('Get') and the resource ('available filters, indicators, geographic levels, locations, and time periods for a DfE dataset'). It also distinguishes itself from the sibling query_dataset by explaining that it provides the IDs needed for that tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this to discover what data is available and what filter/indicator IDs to use with query_dataset' and 'This is essential before querying'. This provides clear when-to-use guidance and names the downstream tool, effectively differentiating it from alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ofsted_ratingsA
Get Ofsted inspection ratings and grades for a school by URN. Returns the overall effectiveness grade (Outstanding/Good/Requires Improvement/Inadequate) along with grades for each inspection area: Quality of Education, Behaviour and Attitudes, Personal Development, Leadership and Management, and where applicable Early Years and Sixth Form provision. Also includes inspection dates, type, and previous grades. Data comes from Ofsted Management Information files published monthly.
| Name | Required | Description | Default |
|---|---|---|---|
| urn | Yes | The school's URN (Unique Reference Number) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for transparency. It thoroughly discloses what is returned: overall effectiveness grade, grades for each inspection area, inspection dates, type, and previous grades. It also reveals the data source (Ofsted Management Information files published monthly). While it does not discuss error handling or permissions, the detailed output description gives a solid behavioral picture.
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 compact, front-loaded, and every sentence earns its place. It starts with the core purpose, then details return values, and ends with the data source. There is no redundant wording or filler, making it highly efficient for an agent to parse quickly.
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 simple tool with one required parameter and no output schema, the description is largely complete. It explains what data is returned in detail and the source/frequency of the data. It omits edge-case behavior (e.g., invalid URN, missing data) but covers the essential functionality well. The absence of an output schema makes the description's detailed list of returned fields especially valuable.
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 already describes the only parameter (`urn`) with 100% coverage, so the baseline is 3. The tool description reinforces that the URN is the lookup key and explains how it is used, but does not add new semantic details about the parameter format or constraints beyond the schema. Therefore, it neither undercuts nor significantly elevates the schema's explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get Ofsted inspection ratings and grades for a school by URN.' This clearly states the tool's function and differentiates it from siblings like search_schools and get_school_details, which focus on discovery or broader details. No ambiguity remains about what the tool does.
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 clearly states the prerequisite ('by URN') and the purpose, implying the tool should be used when a URN is known and Ofsted ratings are needed. It does not explicitly mention when to prefer this over siblings like get_school_details, but the dedicated focus on Ofsted data provides sufficient context. Lacking explicit exclusions or alternative references, it earns a 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_publication_datasetsA
List the available datasets for a DfE Explore Education Statistics publication. Use after search_education_statistics to find specific data sets, then use get_dataset_metadata to explore available filters and indicators before querying.
| Name | Required | Description | Default |
|---|---|---|---|
| publication_id | Yes | Publication ID from search_education_statistics |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of indicating safety. 'List' clearly implies a read‑only operation with no side effects. It adds workflow context but does not mention potential rate limits or auth requirements, though these are not critical for a simple list operation.
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 main purpose, and the second sentence provides efficient workflow guidance. No redundant 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 single‑parameter tool with no output schema, the description tells the agent what the tool does, how to get the input, and what to do next. It fully equips the agent for correct 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 coverage is 100%, and the description reinforces the source of the parameter by stating to use it after search_education_statistics. The schema itself describes publication_id as 'from search_education_statistics', so the description adds complementary context.
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 action ('List the available datasets') on a specific resource ('a DfE Explore Education Statistics publication'). It clearly distinguishes itself from sibling tools like get_dataset_metadata (which explores filters/indicators) and query_dataset.
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 provides a workflow: use after search_education_statistics and before get_dataset_metadata. This tells the agent exactly when to use this tool relative to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_school_detailsA
Get comprehensive details for a specific school by its URN (Unique Reference Number). Returns all GIAS data including type, phase, address, capacity, pupil numbers, head teacher, religious character, admissions policy, SEN provision, and more. Also provides links to the school's GIAS page and Ofsted reports.
| Name | Required | Description | Default |
|---|---|---|---|
| urn | Yes | The school's URN (Unique Reference Number) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the return contents in detail ('type, phase, address, capacity, pupil numbers...') and mentions links. It doesn't cover error handling for invalid URNs, but the behavior is clear for a read operation.
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 reasonably concise with a long first sentence listing return fields, followed by a short sentence about links. It's front-loaded and each sentence adds value, though the list could be trimmed.
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?
There is no output schema, so the description compensates by naming many data fields. It doesn't mention pagination, error responses, or how to obtain a URN, but for a single-parameter read tool it is 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 coverage is 100% with 'urn' clearly described as 'The school's URN'. The description adds minimal extra meaning beyond restating the parameter's purpose. Baseline of 3 applies.
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 identifies the tool's function: 'Get comprehensive details for a specific school by its URN.' It distinguishes itself from siblings like search_schools by specifying the input (URN) and the breadth of data returned.
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 the appropriate usage context by requiring a URN, making it clear this tool is for when you already know the school's identifier. It doesn't explicitly name alternatives, but the prerequisite is evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ees_topicsA
List all available education data topics from the DfE Explore Education Statistics API. Shows topic keys, titles, and descriptions for 23 datasets covering absence, exclusions, performance, SEND, admissions, workforce, funding, destinations, and more. Use the topic key with discover_dataset to find the actual dataset IDs needed for querying.
| 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 full burden. It explains the output contents (topic keys, titles, descriptions, count of 23 datasets) and coverage areas, which adds useful context. However, it does not disclose whether authentication is required, if the operation is read-only, or any potential limitations (e.g., no pagination details). For a simple list tool this is adequate but not fully transparent.
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: the first front-loads the purpose, the second provides actionable guidance for using the output. Every word earns its place, with no redundancy or filler. Perfectly sized for a simple listing 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?
The description provides enough context for a tool with no parameters and no output schema: it lists what the response contains (topic keys, titles, descriptions, 23 datasets) and how to proceed next (use with discover_dataset). While it doesn't detail the exact response format, that is less critical for a simple list operation and the integration hint fills the gap.
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 tool has zero parameters, so schema coverage is trivially 100%. There is no parameter information to add, and the baseline for 0 params is 4. The description focuses on output rather than inputs, which is appropriate. No additional parameter semantics are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'List all available education data topics from the DfE Explore Education Statistics API.' The verb 'List' and specific resource 'education data topics' make the purpose unambiguous. It also differentiates from siblings by explicitly referencing the companion tool 'discover_dataset' and the topic key relationship.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance by stating 'Use the topic key with discover_dataset to find the actual dataset IDs needed for querying.' This tells the agent when and how to use this tool in sequence. It does not explicitly mention when not to use it or list alternatives, but the integration advice is strong enough for a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_datasetA
Query a DfE Explore Education Statistics dataset with specific indicators and filters. Use get_dataset_metadata first to discover available indicator and filter IDs. This tool enables access to school-level data on absence, exclusions, performance, admissions, workforce, and more. Time periods use format 'YYYY|CODE' where CODE is: AY (academic year), CY (calendar year), FY (financial year), etc. Geographic levels include: NAT (national), REG (regional), LA (local authority), SCH (school). Locations use format 'LEVEL|id_type|id_value' e.g. 'LA|code|823'.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 1) | |
| filters | No | Filter option IDs (from get_dataset_metadata) | |
| locations | No | Locations in 'LEVEL|id_type|id_value' format | |
| page_size | No | Results per page (default: 100, max: 1000) | |
| dataset_id | Yes | Dataset ID from get_publication_datasets | |
| indicators | Yes | List of indicator IDs to retrieve (from get_dataset_metadata) | |
| time_periods | No | Time periods in 'YYYY|CODE' format, e.g. ['2023|AY'] | |
| geographic_levels | No | Geographic levels: NAT, REG, LA, SCH, etc. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It explains critical format requirements: time periods use 'YYYY|CODE' with code meanings, geographic levels include NAT/REG/LA/SCH, and locations use a specific 'LEVEL|id_type|id_value' format with an example. It also describes the data scope. This goes beyond the schema and gives the agent the context needed to call this read-only query tool correctly, though it doesn't mention pagination or response structure.
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 and well-structured: a purpose statement, a prerequisite instruction, a scope statement, and format clarifications. Each sentence earns its place with no redundant filler. For a tool with 8 parameters and multiple format requirements, this length is appropriate 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?
The description plus fully-described schema provides sufficient context for correct invocation: it identifies prerequisite metadata, data domains, and all key parameter formats. It lacks explicit details about pagination behavior and response shape, but the schema includes page/page_size fields and there is no output schema to detail. Given the tool's complexity, this is reasonably complete, though a note on filter semantics would elevate it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, providing a baseline of 3. The description adds semantic enrichment beyond the schema: it expands the meaning of time codes ('AY' = academic year, 'CY' = calendar year), and provides a concrete location example ('LA|code|823'). This depth helps the agent understand the format in a way the schema's terse field descriptions do not.
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 explicitly states 'Query a DfE Explore Education Statistics dataset with specific indicators and filters', using a specific verb (Query) and resource (DfE dataset). This clearly distinguishes it from sibling tools like compare_schools or search_schools, which serve different purposes. It also lists the data domains (absence, exclusions, performance, etc.), reinforcing its unique role.
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 an explicit prerequisite: 'Use get_dataset_metadata first to discover available indicator and filter IDs.' This guides the agent on when to use this tool relative to its metadata companion. However, it does not explicitly mention when not to use this tool or name alternative query tools (e.g., search_education_statistics), so it lacks that exclusionary guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_education_statisticsA
Search the DfE Explore Education Statistics catalogue for publications on topics like school performance, absence, exclusions, applications and offers, workforce, and more. Returns publication IDs that can be used with get_publication_datasets and then get_dataset_metadata/query_dataset to access the actual data.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Topic to search for, e.g. 'school absence', 'GCSE results', 'applications and offers', 'exclusions', 'school workforce' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description bears the full burden. It clearly states that the tool returns publication IDs only, not the actual data, and directs users to other tools for data access. This sets expectations about the tool's output and its role in the pipeline. However, it does not discuss result limits, pagination, or search behavior details, which would further enhance transparency.
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. The first sentence states the purpose and gives examples; the second sentence explains the return value and the subsequent steps. Every word earns its place—no fluff, no repetition. It is front-loaded and easily scannable.
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 simple search tool with one parameter, the description delivers complete context. It doesn't just say 'search for publications'; it explains what the results are (IDs), how they integrate into the broader tool ecosystem, and hints at the types of topics covered. No output schema exists, but the description clarifies what the return value will be used for, which is adequate for the tool's simplicity.
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 single parameter 'topic' is fully described in the input schema with examples. The description repeats these examples but does not add new meaning beyond what the schema provides. The schema coverage is 100%, so the baseline of 3 is appropriate; the description adds marginal value by reinforcing the types of topics, but it doesn't clarify syntax or search nuances.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search') and identifies the exact resource ('DfE Explore Education Statistics catalogue'). It also lists example topics, making the scope clear. By contrasting with 'get_publication_datasets', 'get_dataset_metadata', and 'query_dataset', it effectively distinguishes this search tool from its 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 provides a clear workflow: search for topics, get publication IDs, then use those IDs with 'get_publication_datasets' and 'get_dataset_metadata/query_dataset'. This implies this tool is the entry point for data discovery. It does not explicitly mention when to avoid using this tool or list alternative search tools, but the workflow guidance is strong enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_schoolsA
Search for UK schools by name, postcode, or local authority. Uses live data from GIAS (Get Information About Schools). Returns a list of matching schools with name, URN, type, phase, address, and contact details.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default: 10, max: 50) | |
| phase | No | Education phase filter (e.g., 'Primary', 'Secondary', 'Nursery') | |
| query | No | School name or postcode to search for | |
| local_authority | No | Local authority name (e.g., 'Milton Keynes', 'Camden') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It adds that data is live from GIAS and that results are a list with specific fields, but it does not disclose whether at least one search criterion is required, how matching works (exact vs partial), pagination behavior, or potential rate limits. These are significant gaps for a live-data search tool.
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 concise sentences that front-load the action and scope. Every phrase earns its place, and it avoids boilerplate repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description states purpose, data source, and the fields returned, which is adequate for a simple search tool. However, it omits important constraints like the need to supply at least one search criterion despite all parameters being optional, and it does not describe ordering or output limits beyond the 'limit' parameter's existence. Given no output schema and no annotations, this leaves the agent with meaningful unknowns.
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 coverage is 100%, so the baseline is 3. The description does restate the meaning of 'query' as name or postcode and 'local_authority' as local authority name, but it adds little beyond the schema. It does not clarify partial matching, the relationship between query and phase, or the behavior when no parameters are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific verb 'Search' and the resource 'UK schools', then defines the exact scope: by name, postcode, or local authority. This clearly distinguishes it from sibling tools like find_schools_near_postcode, which focuses narrowly on proximity searches, and get_school_details, which targets individual institutions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool by listing the three supported search criteria and noting the live GIAS data source. However, it does not explicitly direct the agent to alternative tools when appropriate (e.g., 'for proximity-based searches use find_schools_near_postcode'), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
The tools are clearly divided into school lookup (search, details, compare, near, Ofsted) and education statistics (topics, discovery, metadata, query). Each tool has a distinct purpose, and even the overlapping statistical tools (list_ees_topics, search_education_statistics, discover_dataset) are clearly differentiated by their descriptions.
All tool names follow a consistent lowercase snake_case convention with a verb prefix: compare_, get_, search_, find_, query_, list_, discover_. There are no stylistic deviations or mixed conventions.
11 tools is well within the ideal 3-15 range and appropriately scoped for a UK schools data server covering both school information and education statistics. Each tool contributes to the overall functionality without unnecessary bloat.
The tool set provides comprehensive coverage for its domain: school search, details, comparison, geolocation, Ofsted ratings, and a full pipeline for exploring and querying education statistics. No critical operations are missing for a read-only data retrieval server.
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
This MCP server provides seamless access to Malaysia's government open data, including datasets, w…
Hosted MCP server for finding authoritative primary data sources and official portals.
Hosted MCP server for live public-data APIs and Skills for AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server that wraps UDIR's open registries for Norwegian schools (NSR) and kindergartens (NBR), enabling search by municipality and retrieval of full details including coordinates and enrollment.475MIT
- AlicenseAqualityDmaintenanceMCP server for exploring Texas public school data through conversational interfaces, enabling campus search, district details, geospatial lookup, comparisons, and transfer insights using TEA data.161Apache 2.0
- FlicenseNot gradedqualityCmaintenanceUnifies school information, real estate transaction data, and school zone lookup into a single MCP server, allowing users to query school details, property prices, and attendance boundaries.
- AlicenseAqualityBmaintenanceMCP server to query UK higher-education open data including National Student Survey results, student outcomes, and graduate earnings. Data is downloaded locally from official sources and compared against benchmarks.5MIT
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/mkb-123/uk-schools-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server