nomis-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| NOMIS_UID | No | NOMIS API key (starts with 0x). Must be quoted, e.g. NOMIS_UID="0x..." | |
| NOMIS_OUTPUT_DIR | No | Directory for downloaded files (optional, e.g. ~/nomis-downloads) | |
| NOMIS_CONFIG_FILE | No | Path to a YAML config file containing nomis.uid, e.g. ~/projects/config.yml |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| check_authA | Report whether the server holds a NOMIS API key, and test the cell limit. Without a key, every data request is silently capped at 25,000 records: NOMIS answers with HTTP 200 and a truncated body, no error. With a valid unique ID the cap is lifted. Run this when a fetch reports truncation, or to confirm setup. The probe downloads one narrow column of a large query, so it takes a few seconds. To obtain a key: sign in at nomisweb.co.uk, open My Account, and copy the
unique ID (it starts with |
| search_datasetsA | Find NOMIS datasets by keyword. Start here, then call get_dataset_dimensions. Returns dataset ids such as NM_1_1 along with name, description, keywords and status. Prefer datasets whose status is "Current (being actively updated)" over "Historical (not actively being updated)" unless the user asked for a historical series. NOMIS publishes over 1,600 datasets, so a narrow term is better than a broad one. Census topic summary tables are named with a TS prefix, e.g. searching 'TS058' finds the travel-to-work table. |
| get_dataset_dimensionsA | List the dimensions a dataset accepts as filters, and its geography types. Essential before fetching. Dimensions vary per dataset: across NOMIS there are over 480 distinct dimension concepts, and only 'measures', 'freq' and 'geography' are near-universal. A filter this tool does not list will be rejected or silently ignored by fetch_data. The returned 'geography_types' are the vintages available for this dataset, e.g. TYPE424 (local authorities as of April 2023) or TYPE151 (2021 LSOAs). Pick one, then pass it to search_codes to resolve an area name to a code. |
| search_codesA | Resolve dimension values to the numeric codes fetch_data needs. Codes are opaque integers (Bristol, City of is 1778384919 in TYPE424) and cannot be guessed or derived from ONS GSS codes. Always come here first. Geography needs two steps. Searching geography without a type_code returns the list of geography types for the dataset, because the top of the geography codelist holds only a handful of country nodes and a search there matches nothing and returns success. Pick a type, then search within it: Non-geography dimensions are searched directly, no type_code needed. |
| fetch_dataA | Fetch observations from a dataset. Codes must come from search_codes. Returns rows plus 'total', the number of records matching the query, and 'truncated'. Read them. NOMIS answers an oversized query with HTTP 200 and a body cut short with no error, so a result can look complete while holding a small fraction of the data. Never total, average or rank a truncated result; narrow the filters, or use fetch_data_to_file. A worked example, claimant count for Bristol in the latest month: Requesting a whole geography type (e.g. 'TYPE151' for 2021 LSOAs) across several dimensions produces millions of records. Use fetch_data_to_file. |
| fetch_data_to_fileA | Stream an unrestricted query to a CSV file instead of into the reply. For results too large to read: whole geography types, long time series, LSOA-level census tables. Nothing is loaded into memory or context, so use this rather than paging fetch_data hundreds of times. Without an API key the file is still capped at 25,000 records; run check_auth first if the row count looks suspiciously round. Returns the path for onward analysis in R, DuckDB or pandas. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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/stevecrawshaw/nomis-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server