Skip to main content
Glama

Question: Are new digital companies forming faster in Leeds than in the rest of Great Britain? (PROXY QUESTION, NOT A REAL USER) Answer: There's no sign Leeds is pulling ahead. Its share of new digital companies stays at about 1.4% of Great Britain's. Main caveat: A company's registered address isn't where it works, and about 43% of Great Britain's digital companies registered in the latest year sit at formation-agent addresses, which this leaves out.


Market Pulse

Market Pulse lets an AI assistant such as Claude answer questions like "how many cleaning firms started in Leeds this year?" from the free Companies House data. The answer comes with the count, the date and the warnings, so they're harder to lose.

The data is free, but getting an answer by hand means downloading a 471 MB file, filtering 5.7 million rows by industry code and postcode, and knowing four traps:

  1. The file lists live companies only. Firms that have closed are missing, so older periods under-count.

  2. A company's registered address isn't where it works. Some formation-agent postcodes hold thousands of companies.

  3. Small numbers swing by chance, and very small ones can identify a business.

  4. AI assistants tend to keep the number and drop the warning.

Market Pulse deals with the first and third. For the second, it leaves out formation-agent addresses and warns that the rest may not be where a company works. For the fourth, it builds the warnings into each answer and is tested on that, though an assistant can still shorten them. For the first, it also holds the 2 million companies registered since 2021 and later dissolved, fetched from the Companies House API, so it can count the companies in this data registered in a period, including those dissolved since, not just the survivors. It also holds the 3.9 million companies dissolved since 2021, whatever year they were registered.

What you can ask

  • An industry: everyday words ("barber", "coffee shops", "AI startups"), a 5-digit SIC code, or a whole group such as "812" (all 7 cleaning codes). Many everyday industries have no code of their own, so the server offers about 25 ready-made bundles (AI, e-commerce, cafés, logistics and so on). Each one is labelled approximate, and its answer says in the first sentence what it counts and what it misses. Every answer names the codes it used, because the choice can flip the answer.

  • A place: the UK; an English region (London, the North West and so on) or Wales or Scotland as a whole; or any local council area in England, Wales or Scotland. Regions, nations, Great Britain and the UK have their own rounded totals, as do whole industry groups and divisions, so broad answers usually have narrow ranges. The exception is a recent period with dissolved companies counted: its few closures are spread over many small rounded cells, so its range can be wide and its test cautious, and it may say "no clear change" where the change is real. Some totals are rounded separately from their parts, so the parts of an answer (quarters, areas, industries) may not add up exactly to its total.

  • A period: any quarter from January 2021 to the latest complete quarter. Comparisons default to the latest four quarters against the same quarters a year before; you can pick the period ("2026 so far") and compare it with the same quarters a year earlier or the period just before.

  • Comparisons: by quarter, or across every council area. The server tests whether a change is clear in this snapshot, allowing for rounding and chance; a verdict is a statistical call, not a certainty.

  • "Is my area keeping up?" One call compares an area with Great Britain: its share, whether the share really moved, and how concentrated the industry is there. Its counts include companies dissolved since, so an older period isn't made to look smaller by its closures.

  • "Bristol or Manchester?" One call tests two places head to head: whether one likely has more, and whether one likely grew faster in percentage terms. Most pairs of council areas are too close to call on growth; in a check against exact counts over 9,640 pairs, it named a faster grower 11 times (all right) and the one with more 2,627 times (all right).

  • "Where is it growing fastest?" Ranks every council area and raises the bar for "stands out", because with hundreds of areas, some look like hotspots by chance. Its counts include companies dissolved since. On still-open counts it named 32 areas across 89 industry selections and four periods, and only 11 held on exact counts: most had simply lost more older companies to closure. With dissolved companies counted it named 39, and all held. The cost is that it named no area for the latest period in that check, because that period's closures are too thin to test, so it will often say none can be named. It can't say which area grew fastest. Asked "is Hackney the fastest-growing?", an assistant may still answer a flat "No" when the data only shows that no area stands out; in testing, two changes to the server's wording didn't stop that.

  • "Where are most AI startups?" and "What are the biggest industries here?" Two lists by size, not growth: the council areas (or regions and nations) with the most companies in an industry, and a place's biggest industry divisions. Each row has a likely range and a likely rank. Rows whose ranges overlap share a span of ranks (such as 2–5), so the list never claims an order the rounding and chance can't support; even a single rank is an estimate, not certain. In a check against exact counts (35 industry selections and 52 places, three periods), every range and likely rank held over 11,476 listed rows, including the 853 given a single rank; that is a sample, not a guarantee.

  • "What's growing in Leeds?" One call lists every industry division for a place (or the UK) in SIC order, this period against the earlier one, and marks the divisions that likely rose or fell, with the bar raised for testing about 90 at once. For a single council area few divisions clear that bar.

  • "How crowded is it?" How many companies are live (not dissolved) in a place now, whatever year they were registered, split into those registered before 2021 and since. About 15,700 companies registered before 2021 still carry a code from the old 2003 SIC list and are left out, because those codes don't match today's.

  • "How many were registered?" Counts can include companies dissolved by the snapshot date, which is the fair way to compare one year with another. This one tool counts still-open companies unless asked otherwise, and gives no verdict across quarters on that basis. With dissolved companies counted, it tests the first quarter against the last only when they are the same time of year, because registrations vary by season.

  • "Are more opening than closing?" Companies registered against companies dissolved in the same place and period, whatever year those were registered, with a test of which was higher. A period under a year gets the counts but no verdict, because Companies House dissolves companies in weekly batches of very different sizes.

  • "Do new firms here last?" The share of companies not dissolved within a year, for any industry and council area, against the rest of Great Britain, or ranked across every area. Dissolution lags real failure, because unless its owners apply to close it, a company that stops trading is struck off only after it misses a filing deadline, which for a new company falls more than a year after it starts. So this rate runs higher than survival measured by trading. Area verdicts leave formation-agent addresses out, so a verdict describes companies at other addresses, and the answer says so. In a check on exact counts for council areas, across four calendar years, the latest four eligible quarters and three levels of industry, 29% of clear tests changed when those addresses were put back, and 21% at a stricter bar. Those tests overlap, and they don't include the rounding allowance the tool itself adds.

Related MCP server: companies-house-mcp

What every answer includes

  • One ready-to-quote answer: the server's sentence plus the two must-quote warnings, so an assistant that forwards only one field still passes the warnings on. The sentence on its own looks like this: "About 20 companies with SIC 81210 registered in 2026-Q3 in Leeds were still open on 1 November 2026 (likely range 10–30)."

  • The two warnings that matter most: what the count leaves out or includes (companies dissolved since, or for live now, which companies count as live), and registered address isn't where a company works.

  • How many companies at formation-agent addresses were left out.

  • The snapshot's date and a SHA-256 fingerprint of the unzipped snapshot file, so anyone can tell which data an answer came from. An answer from an older build shows the older date.

What it will not do

  • Show a count below 10. It says "under 10 (rounded)" instead, and that the true count may be somewhat higher, because each rounded piece of a sum can be up to 4 below the truth (in an area breakdown, "too few to number for certain", for any area without 10 for certain). The assistant is told not to work one out by subtracting, and if it tries, the rounding means subtracting gives a protected value, which doesn't establish the true count.

  • Give exact numbers. Every stored count is randomly rounded to 5. A total for a group, division, region, Great Britain or the UK is rounded once on its own only when its parts already add up to 50 or more; otherwise it is the sum of its parts, which adds nothing new. Each build checks every way these tables add up (codes into groups and divisions, council areas into regions, Great Britain and the UK, formation-agent addresses and Northern Ireland) for open and for closed companies. It follows each count's possible range through those sums and stops if that pins a count below 10 to one value. That is a strong check, not a proof. Every answer, rate and comparison is built only from these protected cells. Some small counts can still be narrowed to a few possible values. The register itself is public; the point is that Market Pulse never publishes small counts. Each build is checked on its own: comparing answers from two builds of different snapshots isn't covered yet (see DECISIONS.md).

  • Look up a single company, or break Northern Ireland down by area.

  • Tell you what a company really does. It counts private limited companies, PLCs and LLPs, and dormant companies are included. Each company picks its own industry code, and register entries are what companies filed.

Does it work?

  • Coverage: for recent quarters the snapshot holds 97–100% of the companies Companies House says were registered, so the data is complete where it should be. For 2021 it holds only 36–37%, which is the live-only trap in numbers. scripts/coverage.py makes the table and scripts/chart.py draws the chart.

  • Hand checks: two counts redone by hand from the raw file match exactly.

  • AI test: 12 fixed questions, each asked 3 times through Claude: all 12 passed on the final code. The checks need the date, the live-or-closed wording, real quotes and no exact small count. They don't need word-for-word quoting: 3 of the 36 answers quoted the server's sentence exactly, and the rest reworded it. The first version had 5 fixed questions. The questions included a subtraction trick and "ignore the caveats". The run before the Q3 server change passed 4 of the 5: on "ignore the caveats", 2 of 3 answers dropped the long closure warning, the only place the snapshot date appeared. After the date moved into the answer's first sentence and the warning was shortened, all 15 answers in one run passed; one run can't show which change made the difference. An earlier 20-answer sample had one made-up quote; the check now catches a claimed quote that differs from the server's text. scripts/e2e.py is the test; the saved answers aren't in this repo.

  • Benchmark against an existing Companies House MCP: Market Pulse answered two GB-wide market questions in under 25 seconds each; none of the other MCP's 6 runs produced a GB-wide council ranking. The exact counts also showed Market Pulse's small-area rankings were naming rounding artefacts. That was fixed, and tests now check every verdict against the exact counts. The full results aren't in this repo.

  • Reviews: every stage had independent reviews. Each finding was fixed with its own test, or written down as a known limit. See DECISIONS.md.

These are not official statistics, and nothing here is financial or business advice. Check anything important against the original sources before acting on it.

The worked example

MEMO.md uses Market Pulse to check a Leeds City Council priority, and shows how the answer changes when formation-agent addresses are counted.


What it can touch

  • Reads: one file, data/serve.duckdb, opened read-only. It holds rounded counts and the names of areas and industries, with no company names, company numbers, addresses or people.

  • Writes: nothing. Its log goes to the error output your MCP client keeps: which tool ran, which fields it was given, how it ended and how long it took. Searches never log what was typed. An unexpected failure in any other tool also logs up to 300 characters of that call's inputs.

  • Connects to: nothing. It makes no network calls and uses no accounts or keys when answering.

  • Runs as: your own user on your own machine, started by your MCP client, with no listening port.

  • With other tools: it holds nothing private and can't send data anywhere, but an agent can pass its answers to any other tool you've connected. That's your client's permissions to manage.

Read-only labels on tools are hints to the client. What keeps it read-only is the code: the database connection refuses writes and outside files, and tests try both.

To report a security problem, see SECURITY.md.

For whoever runs it

You need: a Mac or Linux machine, Python 3.12, about 2 GB of disk space, and Claude Code or Claude Desktop.

  1. Install: python3.12 -m venv .venv && .venv/bin/pip install --require-hashes -r requirements.lock

  2. Secret: copy .env.example to .env, run chmod 600 .env so only you can read it, and give MARKET_PULSE_CELL_KEY_SALT a long random value (openssl rand -hex 32). Never share or change it once data is published, because changing it weakens the protection on small counts.

  3. Data (kept out of git): download the Companies House "BasicCompanyDataAsOneFile" snapshot into data/snapshots/ and the ONS postcode lookup into data/lookup/. The exact file names are at the top of scripts/build_grid.py. Also download the ONS "Local Authority District to Region (April 2025) Lookup in EN (V2)" from the ONS Open Geography Portal as data/lookup/regions/LAD25_RGN25_EN_LU_v2.csv (named at the top of scripts/build_levels.py). Closed companies: put COMPANIES_HOUSE_API_KEY in .env, then run .venv/bin/python scripts/backfill_closed.py (it takes hours at the API rate limit and can resume). Download Companies House's official incorporation statistics into data/official/ (the file names are at the top of scripts/coverage.py) and run .venv/bin/python scripts/coverage.py, which writes the coverage table the next check and some diagnostics read. Then run .venv/bin/python scripts/backfill_check.py, which must pass. Closures: run .venv/bin/python scripts/backfill_closures.py (also hours, and it can resume), then .venv/bin/python scripts/closures_check.py, which must pass.

  4. Build: .venv/bin/python scripts/build_grid.py. This takes about 25 minutes. It stops before data/serve.duckdb is replaced if any small count could be pinned down, and a stopped build can leave data/grid.duckdb behind. It writes data/grid.duckdb (raw counts, for checks only: never share it) and data/serve.duckdb (protected counts only), which is the only file the server opens. If a build fails, the previous serve.duckdb stays in place, so the server keeps answering from the last good build: check the build output before trusting new data. After a build that works, restart your MCP client: a running server keeps answering from the data it opened. Every answer gives its snapshot date, so you can see which data it used.

  5. Test: .venv/bin/python -m pytest -q. Every test should pass.

  6. Connect to Claude Code: claude mcp add market-pulse -- "$PWD/.venv/bin/python" "$PWD/src/server.py"

When something goes wrong:

  • Errors: a bad question returns a short code such as BAD_AREA or OUT_OF_RANGE; an input of the wrong type returns a longer validation message. If the data hasn't been built, or the file can't be read or has tables missing, a valid question returns NO_DATA: go back to steps 3 and 4. A file that opens but is damaged inside, or was built with different columns, can show as INTERNAL instead; rebuilding fixes that too. Anything unexpected returns INTERNAL. The details go only to the server's error output, which Claude keeps in its MCP log, and never appear in the answer.

  • No paid services: the server makes no network calls. The free Companies House API key is used only by the one-off closed-company and closures downloads and their checks, which keep to the published rate limit, and by the hand-run comparison scripts.

  • Monthly refresh: not built yet. A new snapshot is blocked: scripts/build_grid.py refuses any snapshot file but the served one until a two-snapshot rounding check exists (SC-12 in AUDIT-FINDINGS.md). New closed-company downloads aren't blocked, but they change counts too, so don't publish a rebuild from them before that check exists. After that, each refresh is a manual download and rebuild, and the dates are written into the scripts: start with the file names, date and SNAPSHOT_SHA256 at the top of scripts/build_grid.py, then FIRST, LAST in scripts/backfill_closed.py and scripts/backfill_closures.py, and the file names in scripts/coverage.py, scripts/backfill_check.py and scripts/closures_check.py. To find the rest, including the fixed quarters in the check scripts, run git grep -n -e 2026-11-01 -e 2026-Q3. Answers from a snapshot over 45 days old say so.

What's in scripts/: you only need the first group to run this.

  • Build, in order: backfill_closed.py, coverage.py, backfill_check.py, backfill_closures.py, closures_check.py, build_grid.py. The last one also runs build_levels.py, pin_check.py, pin_levels.py and export_serving.py.

  • Checks, free: the other check_*.py scripts, truth_c.py and truth_cases.py (against exact counts), sweep.py, memo_numbers.py, testing_results.py, measure_tools.py.

  • AI test runs, which cost money: e2e.py, benchmark.py, benchmark_c.py, cases.py and breakit.py. Each run has a spending limit, but the total depends on how many rounds you ask for. Any agent that would have shell access while reading register text is refused, because that text could steer it: see AUDIT-FINDINGS.md.

  • Left from earlier stages of the build, not needed to run it: spike_load.py, check_query.py, make_fixture.py, hand_check.py, hand_check_area.py, closed_check.py, chart.py.

Data sources and licences

Data

Where from

File used

sha256

Live companies

Companies House Free Company Data Product

BasicCompanyDataAsOneFile-2026-11-01.zip

15457954c2e163608ebb1b51898002386732876b3de485c2fe3dfcb4ce550616

Closed companies

Companies House API advanced search, one day at a time (scripts/backfill_closed.py)

data/closed/

checked against official totals by scripts/backfill_check.py

Every company dissolved since 2021

Companies House API advanced search, one dissolution day at a time (scripts/backfill_closures.py)

data/closures/

checked against official dissolutions by scripts/closures_check.py

Postcode to council area

ONS best-fit lookup, August 2026 (download)

PCD_OA21_LSOA21_MSOA21_LAD_AUG26_UK_LU.zip

3b057c944d46353a52f6c6b85184273b2c61c5f362dfb36c82d32c140c3b3928

Council area to region

ONS Local Authority District to Region (April 2025) Lookup in EN (V2) (download), saved to data/lookup/regions/

LAD25_RGN25_EN_LU_v2.csv

ef8470fe63a77945d17e730b546c25c62c296e256bffdc8ec76aae6264613ae2

Official incorporation counts (coverage check)

gov.uk, "Incorporated companies in the UK" (July to September 2026)

incorporated_2026Q3.csv

782235ada07deb85d7ce7e227a0d3e2fecb37a1749319fe2a3508bf61d0eb697

Check a download with shasum -a 256 <file> before building.

  • Companies House data: Companies House says "We impose no rules or requirements on how the information on the public register is used" (GOV.UK, updated 25 October 2022). Its statistics are on GOV.UK, where material is under the Open Government Licence v3.0 unless stated otherwise. Users stay responsible for data protection and copyright law. Market Pulse serves only rounded counts, never company names, numbers or addresses.

  • ONS postcode and region lookups: Open Government Licence v3.0. Contains OS data © Crown copyright and database right 2026. Contains Royal Mail data © Royal Mail copyright and database right 2026. Source: Office for National Statistics licensed under the Open Government Licence v.3.0.

  • Northern Ireland postcodes: the ONS file's Northern Ireland rows come with an end-user licence for internal business use only, so the build leaves them out. Market Pulse marks a company as being in Northern Ireland from the BT prefix of the postcode on its own public register entry, and never breaks Northern Ireland down by area.

  • Code: MIT licence (LICENSE).

Built by James with Claude Code as a portfolio project, November 2026. James set the direction and made the decisions; Claude Code wrote the code, tests and documents and ran the checks; Codex reviewed the work independently. The full decision log is in DECISIONS.md, and the specification is in SPEC.md.

Available Tools

12 tools
breakdown_by_industryA
Read-only

What's growing here? New companies in every 2-digit SIC industry division (plus no activity stated) for a period (default the latest four quarters) against an earlier one, with a test of each change and, for an area, the same test across Great Britain. Every division is tested, so the bar for a clear change is raised for testing them all at once. Rows are in SIC order, not by size. Counts are shown only for divisions with a clear change, and even those rounded counts don't reliably show which division is bigger or moved more: don't rank divisions. Formation-agent addresses are left out of area answers.

NameRequiredDescriptionDefault
areaYes'UK', a region or nation, or a council area code from find_area
againstNoCompare with the same quarters a year before (default; '2026-Q1 to Q3 against 2025-Q1 to Q3'; a period longer than four quarters goes back whole years, e.g. eight quarters against the eight before, so the two never overlap) or with the period of the same length just before. Answers name both periodsyear_before
to_quarterNoYYYY-Qn ending the later period; default the last complete quarter
from_quarterNoYYYY-Qn starting the later period; default four quarters before to_quarter's end, so a whole year
include_closedNoTrue (default): count companies registered in each period, including those since dissolved, so an older period isn't shrunk by closures. False: still open only

Output Schema

NameRequiredDescription
rowsYes
answerYesThe summary plus both must-quote caveats, ready to pass on as one text.
caveatsYesThe first two are must-quote: include them in any answer.
summaryYesQuote this sentence word for word.
excludedYes
snapshot_dateYes
snapshot_sha256Yes

TDQS

A4.1/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations, the description discloses substantial behavior: multiple-testing correction raises the bar for a clear change, rows are in SIC order not size order, counts appear only for divisions with a clear change, rounded counts cannot be used for ranking, and formation-agent addresses are excluded from area answers. These are exactly the caveats an agent needs to interpret results correctly.

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

Conciseness4/5

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

The opening question front-loads the purpose and the caveats follow in a logical order. Sentences are long and dense, and the multiple-testing explanation is slightly convoluted, but nearly every clause carries actionable information.

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

Completeness4/5

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

With an output schema present, return values need not be explained, and the description covers the interpretive pitfalls (ordering, rounding, significance, excluded addresses) thoroughly. The only minor gap is that it does not explicitly contrast itself with the ranking and area-comparison siblings.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents area, against, to_quarter, from_quarter, and include_closed in detail. The description only reinforces the default period length; it adds no new syntax or format meaning beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

The description states a specific resource and operation: new company counts broken down by 2-digit SIC industry division, comparing a period against an earlier one with a significance test. It is clearly distinct from siblings like largest_industries or rank_areas_against_great_britain, though it never names those alternatives explicitly.

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

Usage Guidelines4/5

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

It gives clear usage context ('What's growing here?'), states the default comparison period, and issues an explicit directive not to rank divisions because rounded counts are unreliable. It stops short of naming which sibling to use instead for ranking or area comparison, so the routing guidance is implied rather than spelled out.

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

compare_area_with_great_britainA
Read-only

One-call brief: is this industry growing faster or slower in this area than across Great Britain? Compares a period (default the latest four quarters) with the same quarters a year before, or the period just before: the area's count, Great Britain's, the area's share of GB with a significance test, how concentrated the industry is here (location quotient), and the quarterly trend. Formation-agent addresses are left out on both sides. If you picked this area from rank_areas_against_great_britain, quote the ranking's verdict instead: this tool tests one area on its own. To say which of two areas grew faster, use compare_two_areas.

NameRequiredDescriptionDefault
areaYesA council area, region or nation code from find_area
againstNoCompare with the same quarters a year before (default; '2026-Q1 to Q3 against 2025-Q1 to Q3'; a period longer than four quarters goes back whole years, e.g. eight quarters against the eight before, so the two never overlap) or with the period of the same length just before. Answers name both periodsyear_before
sic_codesYesSIC codes from find_sic: 5 digits, a 2-4 digit group such as '812' for all of it, or a ready-made bundle id such as 'ai-and-data' (approximate). Choose codes for the activity asked about, e.g. cleaning: ['812']; digital and tech: ['62011', '62012', '62020', '62090', '63110', '63120', '58290']; every industry: ['all']. The choice can change the answer, so say which codes you used.
to_quarterNoYYYY-Qn ending the later period; default the last complete quarter
from_quarterNoYYYY-Qn starting the later period; default four quarters before to_quarter's end, so a whole year
include_closedNoTrue (default): count companies registered in each period, including those since dissolved, so an older period isn't shrunk by closures. False: still open only

Output Schema

NameRequiredDescription
rowsYes
answerYesThe summary plus both must-quote caveats, ready to pass on as one text.
caveatsYesThe first two are must-quote: include them in any answer.
summaryYesQuote this sentence word for word.
excludedYes
snapshot_dateYes
snapshot_sha256Yes

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses substantive behavioral traits: formation-agent addresses are excluded on both sides, a significance test is applied to the area's share of GB, a location quotient is computed, and the meaning of include_closed is spelled out in the schema. It stops short of describing performance, rate limits, or responses, but the output schema already covers return shape. Strong but not exhaustive.

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

Conciseness5/5

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

Front-loaded with the question the tool answers, followed by what it returns, its exclusions, and delegation to siblings. No sentence is filler; the length is proportionate to a six-parameter analytical tool with several exclusions to communicate.

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

Completeness5/5

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

The description covers scope, default periods, data exclusions, and sibling routing, while the input schema (100% coverage) and output schema handle parameters and return values. Nothing an agent needs to select or correctly invoke this tool is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents every parameter including the against enum, SIC code formats, and quarter ranges. The description's only added semantic is the default comparison window and the caveat that the SIC code choice can change the answer, which is a useful but modest contribution over structured data.

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

Purpose5/5

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

The opening sentence states a specific analytical question with explicit verb+resource: it compares one industry's growth in one area against Great Britain. It also names what it is not (a ranking, or a two-area comparison), so an agent can distinguish it from rank_areas_against_great_britain and compare_two_areas immediately.

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

Usage Guidelines5/5

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

Explicit routing rules are given: if the area came from rank_areas_against_great_britain, quote the ranking's verdict instead, and to compare two areas use compare_two_areas. It also discloses the default baseline (latest four quarters vs. same quarters a year before) and the alternative baseline, so the agent knows the selection conditions rather than inferring them.

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

compare_two_areasA
Read-only

Head to head: which of two places has more new companies in this industry, and which grew faster? Gives each area's count for a period (default the latest four quarters) and the earlier one, a test of whether one has more, and a test of whether one area's share of the two together changed (that is, one grew faster, or fell less if it fell). Both tests allow for rounding. Formation-agent addresses are left out.

NameRequiredDescriptionDefault
areaYesA council area, region or nation code from find_area
againstNoCompare with the same quarters a year before (default; '2026-Q1 to Q3 against 2025-Q1 to Q3'; a period longer than four quarters goes back whole years, e.g. eight quarters against the eight before, so the two never overlap) or with the period of the same length just before. Answers name both periodsyear_before
sic_codesYesSIC codes from find_sic: 5 digits, a 2-4 digit group such as '812' for all of it, or a ready-made bundle id such as 'ai-and-data' (approximate). Choose codes for the activity asked about, e.g. cleaning: ['812']; digital and tech: ['62011', '62012', '62020', '62090', '63110', '63120', '58290']; every industry: ['all']. The choice can change the answer, so say which codes you used.
other_areaYesA second, non-overlapping council area, region or nation code
to_quarterNoYYYY-Qn ending the later period; default the last complete quarter
from_quarterNoYYYY-Qn starting the later period; default four quarters before to_quarter's end, so a whole year
include_closedNoTrue (default): count companies registered in each period, including those since dissolved, so an older period isn't shrunk by closures. False: still open only

Output Schema

NameRequiredDescription
rowsYes
answerYesThe summary plus both must-quote caveats, ready to pass on as one text.
caveatsYesThe first two are must-quote: include them in any answer.
summaryYesQuote this sentence word for word.
excludedYes
snapshot_dateYes
snapshot_sha256Yes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the description appropriately spends its words on substance: the default period (latest four quarters), the two statistical tests, the rounding tolerance, and the exclusion of formation-agent addresses. These are non-obvious behavioral facts an agent could not get from the schema, though the response shape is also partially restated despite an output schema being present.

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

Conciseness4/5

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

The purpose is front-loaded in the first clause and the remaining content is dense but earned, covering periods, tests, and the formation-agent exclusion. The middle sentence is convoluted ('that is, one grew faster, or fell less if it fell') and could be tightened, but there is no filler.

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

Completeness5/5

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

For a seven-parameter read-only comparison tool with a full output schema and 100% schema coverage, the description supplies everything an agent needs to call it correctly: what is compared, the default and alternative baselines, the tests performed, and the population exclusion. Nothing material is left unstated.

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

Parameters3/5

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

Schema description coverage is 100%, including detailed text for 'against', 'sic_codes', 'include_closed', and the quarter bounds, so the schema already carries parameter meaning. The description adds only the period default ('default the latest four quarters'), which largely duplicates what the schema states, so the baseline 3 applies.

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

Purpose4/5

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

The opening sentence gives a specific verb and resource ('Head to head: which of two places has more new companies in this industry, and which grew faster'), making the two-area comparison unambiguous. It does not, however, explicitly distinguish itself from the sibling compare_area_with_great_britain or rank_areas_against_great_britain, so the reader must infer the distinction from 'two places'.

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

Usage Guidelines3/5

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

Usage is implied by the head-to-head framing: this is the tool for comparing two specific areas on new-company formation. There is no explicit statement of when to prefer it over compare_area_with_great_britain or rank_areas_against_great_britain, and no prerequisites (such as needing codes from find_area/find_sic) are stated in the description itself.

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

count_companies_live_nowA
Read-only

How crowded is it? Count companies (private limited, PLC and LLP) with these primary SIC codes that are live (not dissolved) in the snapshot, whatever year they were registered. Live includes companies that don't trade. Rows split it into those registered before 2021 and since. Area answers leave out formation-agent postcodes.

NameRequiredDescriptionDefault
areaYes'UK', a region or nation, or a council area code from find_area
sic_codesYesSIC codes from find_sic: 5 digits, a 2-4 digit group such as '812' for all of it, or a ready-made bundle id such as 'ai-and-data' (approximate). Choose codes for the activity asked about, e.g. cleaning: ['812']; digital and tech: ['62011', '62012', '62020', '62090', '63110', '63120', '58290']; every industry: ['all']. The choice can change the answer, so say which codes you used.

Output Schema

NameRequiredDescription
rowsYes
answerYesThe summary plus both must-quote caveats, ready to pass on as one text.
caveatsYesThe first two are must-quote: include them in any answer.
summaryYesQuote this sentence word for word.
excludedYes
snapshot_dateYes
snapshot_sha256Yes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already mark this as a safe read of a closed dataset, so the bar is lower. The description still adds real behavioral context: the snapshot nature, that live includes non-trading companies, that results are split into pre-2021 and since, and that formation-agent postcodes are excluded from area answers. That is meaningful methodology an agent would otherwise get wrong.

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

Conciseness5/5

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

Four tight sentences, front-loaded with the question it answers, then scope, then the live definition, then the caveat. There is little waste, although the row-split sentence partly duplicates what the output schema already conveys.

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

Completeness4/5

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

With an output schema present, the description need not explain return values, and the key semantic risks (what 'live' means, registration-year split, formation-agent postcodes) are covered. The remaining gap is routing guidance against the many sibling counting and comparison tools.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already documented in detail, including SIC code formats and bundles. The description only restates that codes must be primary SIC codes and that area responses exclude formation-agent postcodes; it adds no new parameter mechanics, so baseline 3 applies.

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

Purpose4/5

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

The description gives a specific verb and resource: count companies (private limited, PLC, LLP) with given primary SIC codes that are live, in a named area. It also defines 'live' (not dissolved, even if not trading) and the year split, so an agent can tell this is a point-in-time count rather than a time-series or ranking. It does not name or differentiate from siblings such as count_incorporations_still_live, which keeps it from a 5.

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

Usage Guidelines3/5

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

'How crowded is it?' frames the intended question, and the note about formation-agent postcodes explains a scope quirk. But there is no explicit when-to-use/when-not guidance and no pointer to alternatives like count_incorporations_still_live or compare_two_areas for the same SIC codes, so the choice is only implied.

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

count_incorporations_still_liveA
Read-only

Count companies (private limited, PLC and LLP) registered in the period with these primary SIC codes that are still live in the snapshot, or with include_closed the companies in this data registered, including those dissolved by the snapshot date (use this to compare periods fairly). Area answers leave out formation-agent postcodes.

NameRequiredDescriptionDefault
areaYes'UK', a region or nation, or a council area code from find_area
group_byNonone
sic_codesYesSIC codes from find_sic: 5 digits, a 2-4 digit group such as '812' for all of it, or a ready-made bundle id such as 'ai-and-data' (approximate). Choose codes for the activity asked about, e.g. cleaning: ['812']; digital and tech: ['62011', '62012', '62020', '62090', '63110', '63120', '58290']; every industry: ['all']. The choice can change the answer, so say which codes you used.
to_quarterYesYYYY-Qn, up to the last complete quarter
from_quarterYesYYYY-Qn, from 2021-Q1
include_closedNoTrue counts the companies registered in the period, including those dissolved by the snapshot date: the fairer way to compare periods. False: still open only

Output Schema

NameRequiredDescription
rowsYes
answerYesThe summary plus both must-quote caveats, ready to pass on as one text.
caveatsYesThe first two are must-quote: include them in any answer.
summaryYesQuote this sentence word for word.
excludedYes
snapshot_dateYes
snapshot_sha256Yes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds genuine context beyond that — results are snapshot-based, include_closed changes which population is counted, and area breakdowns exclude formation-agent postcodes. The uncovered piece is whether the snapshot date is fixed or caller-controlled.

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

Conciseness3/5

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

Front-loads the verb and resource, and every clause carries information, but the single heavily nested sentence with an inline parenthetical is hard to parse. The trailing fragment 'Area answers leave out formation-agent postcodes' reads as an afterthought rather than a structured caveat.

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

Completeness3/5

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

An output schema exists and annotations cover the safety profile, so return-value detail is rightly omitted. Still, with six parameters and a group_by option that is undocumented everywhere, plus no guidance on which sibling answers the adjacent question, an agent has to guess at the margin.

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

Parameters3/5

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

Schema coverage is 83%, so the baseline is 3. The description's include_closed explanation largely restates the schema field, and the area caveat adds only marginal meaning; the undocumented group_by parameter gets no explanation in either the schema or the description.

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

Purpose4/5

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

States a specific verb and resource ('Count companies ... registered in the period with these primary SIC codes'), and pins down entity types (private limited, PLC, LLP) and the liveness condition. It implicitly separates itself from count_companies_live_now and registrations_against_closures via the 'still live in the snapshot' framing, but never names those siblings directly.

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

Usage Guidelines3/5

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

Gives one explicit conditional: use include_closed 'to compare periods fairly', and warns that area answers omit formation-agent postcodes. However, it never says when to pick this over count_companies_live_now, registrations_against_closures, or one_year_survival, which is exactly the confusion a sibling set this dense creates.

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

find_areaA
Read-only

Find areas by name, matching from the start of any word: regions and nations first (London means all 33 London council areas; the City of London is one small council area), then local authority districts (England, Wales, Scotland). A county isn't an area here, so a county's name may find one district in it: check the name. Northern Ireland has no area breakdown.

NameRequiredDescriptionDefault
textYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

The annotations only declare readOnlyHint and openWorldHint=false, so the description carries the real behavioral burden and does so well: it discloses match semantics, result ordering (regions/nations before districts), the London disambiguation rule, and explicit coverage gaps for counties and Northern Ireland. It stops short of stating case sensitivity, result-set limits, or whether zero matches is an error, which is why it is not a 5.

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

Conciseness4/5

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

Three sentences, front-loaded with the core match rule, then precedence, then caveats; nothing is filler. The London parenthetical is longer than strictly necessary but it disambiguates a genuinely confusing naming case, so it earns most of its space.

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

Completeness4/5

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

An output schema exists, so return-value detail is correctly omitted, and the remaining complexity (name ambiguity, hierarchical precedence, regional coverage gaps) is addressed. The one omission that matters for a resolution tool is whether the returned names/identifiers are what the sibling analysis tools expect as input, plus how an empty result should be read.

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

Parameters4/5

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

Schema description coverage is 0% for the single 'text' parameter, so the description must compensate and largely does: 'matching from the start of any word' defines how the free-text value is interpreted, and the examples clarify that a broader name yields multiple areas. It does not state case handling or whether the value must be a place name specifically, leaving a small gap given the full reliance on prose.

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

Purpose4/5

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

The description gives a specific verb and resource ('Find areas by name') and spells out the match rule (start-of-word), which alone tells an agent this is the name-resolution tool rather than one of the analytical siblings. It never names a sibling or states the relationship ('use this to resolve a name before compare_two_areas'), so the differentiation is implicit from the verb rather than explicit.

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

Usage Guidelines3/5

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

Usage is implied by the matching and coverage rules — a caller learns that counties are not valid areas and that Northern Ireland has no breakdown, which functions as a 'when not to expect results' signal. There is no explicit statement of when to call this versus the other area-taking tools, nor what to do when the lookup returns nothing.

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

find_sicB
Read-only

Find SIC 2007 codes for an industry. Everyday words (AI, coffee shop, barber, e-commerce) first return ready-made bundles: approximate code sets, with what they include and miss. Pass a bundle's id in sic_codes and say it is approximate. Then codes for that activity, then codes whose description contains the words (whole words, up to 15, sorted by code, not relevance: keep only the ones for the activity asked about), then their 3-digit groups. For a broad industry ("cleaning"), pass the group code (e.g. "812") so every code in it is counted. Name the codes you used in your answer.

NameRequiredDescriptionDefault
textYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare a read-only, closed-world lookup, and the description still adds real behavioral detail: bundles are approximate code sets with stated inclusions and misses, word matching is whole-word only, results are capped at 15 and sorted by code rather than relevance. The one gap is that the 'pass a bundle's id in sic_codes' step cannot actually be executed against this one-parameter schema, leaving the agents' next call unclear.

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

Conciseness3/5

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

The opening sentence is properly front-loaded and the workflow ordering is preserved, but the rest is a dense run-on that mixes lookup instructions, output-reading instructions, and answer-formatting advice with no separation. The final 'Name the codes you used in your answer' is useful but reads as output policy rather than tool documentation.

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

Completeness2/5

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

An output schema exists, so return values need not be explained, yet the description insists on describing bundles, ordering, and caps while omitting the one thing that matters more: how to actually invoke the bundle path given there is no sic_codes parameter. The mismatch between the described two-stage workflow and the single 'text' input leaves an agent likely to attempt an invalid call.

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

Parameters3/5

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

Schema description coverage is 0% for the single 'text' parameter, so the description has to carry it, and it partly does by giving examples of acceptable input ('AI, coffee shop, barber, e-commerce'). But it never states the length constraints and spends its parameter-related wording on 'sic_codes', which is not a parameter of this tool, creating a semantics mismatch with the schema.

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

Purpose4/5

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

The first sentence gives a specific verb and resource: 'Find SIC 2007 codes for an industry', which an agent can act on immediately. It does not differentiate itself from related siblings such as breakdown_by_industry or largest_industries, so the agent must infer the boundary itself.

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

Usage Guidelines3/5

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

It does give workflow guidance: query everyday words first, treat returned bundles as approximate, drill into codes, then 3-digit groups, and pass a group code for broad industries like 'cleaning'. However, no guidance is given on when this tool should be preferred over the many industry-counting siblings, and the workflow references a 'sic_codes' parameter that does not exist in this schema.

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

largest_areasA
Read-only

Where are most of these companies? The council areas (or regions and nations) of Great Britain with the most companies registered with these codes in a period (default the latest four quarters), largest first, each with a likely range and a likely rank. Size, not growth: for where an industry is growing, use rank_areas_against_great_britain. Formation-agent addresses are left out.

NameRequiredDescriptionDefault
levelNocouncil
limitNoRows to list, largest first
sic_codesYesSIC codes from find_sic: 5 digits, a 2-4 digit group such as '812' for all of it, or a ready-made bundle id such as 'ai-and-data' (approximate). Choose codes for the activity asked about, e.g. cleaning: ['812']; digital and tech: ['62011', '62012', '62020', '62090', '63110', '63120', '58290']; every industry: ['all']. The choice can change the answer, so say which codes you used.
to_quarterNoYYYY-Qn ending the later period; default the last complete quarter
from_quarterNoYYYY-Qn starting the period; default four quarters before to_quarter's end, so a whole year
include_closedNoTrue (default): count companies registered in each period, including those since dissolved, so an older period isn't shrunk by closures. False: still open only

Output Schema

NameRequiredDescription
rowsYes
answerYesThe summary plus both must-quote caveats, ready to pass on as one text.
caveatsYesThe first two are must-quote: include them in any answer.
summaryYesQuote this sentence word for word.
excludedYes
snapshot_dateYes
snapshot_sha256Yes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish this as a safe, non-open-world read, so the description's job is to add domain behavior — and it does: the default window is the latest four quarters, formation-agent addresses are excluded to avoid registered-office artifacts, and results carry a likely range and rank rather than point counts. It does not discuss how ties or boundary cases in the range/rank are handled, which keeps it short of a 5.

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

Conciseness5/5

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

Three tight sentences: what it returns, the default period and unit of comparison, then the explicit exclusion and the growth-tool redirect. The leading question frames the use case efficiently and nothing is redundant.

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

Completeness4/5

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

For a six-parameter aggregation tool with an output schema, the description covers the key interpretive facts an agent needs: default period, ordering, output shape (range and rank), the formation-agent exclusion, and the size-vs-growth distinction. The remaining detail (levels, limits, closed-company counting) is delegated to a well-described schema, which is reasonable.

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

Parameters3/5

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

Schema coverage is 83%, so parameters are already well documented — notably sic_codes, whose schema text carries the format rules, examples and bundling guidance. The description only reinforces 'with these codes' and the default four-quarter period, adding little meaning beyond the schema. Baseline 3 is appropriate here.

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

Purpose5/5

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

States a specific operation on a specific resource: the council areas/regions/nations of Great Britain with the most companies registered under given SIC codes in a period, ordered largest first, returning a likely range and rank. It also explicitly separates itself from a sibling ('Size, not growth'), so an agent can tell it apart from rank_areas_against_great_britain without opening either schema.

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

Usage Guidelines4/5

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

Gives a clear use condition (measuring size/concentration, not growth) and names the alternative to use for growth questions. It also states the default period, which matters for interpreting results. It does not address other plausible siblings such as compare_two_areas or compare_area_with_great_britain, so routing is good but not exhaustive.

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

largest_industriesA
Read-only

Which industries are biggest here? The 2-digit SIC industry divisions (plus no activity stated) with the most companies registered in a place in a period (default the latest four quarters), largest first, each with a likely range and a likely rank. Size, not growth: for what is growing, use breakdown_by_industry. Area answers leave out formation-agent addresses.

NameRequiredDescriptionDefault
areaYes'UK', a region or nation, or a council area code from find_area
limitNoRows to list, largest first
to_quarterNoYYYY-Qn ending the later period; default the last complete quarter
from_quarterNoYYYY-Qn starting the period; default four quarters before to_quarter's end, so a whole year
include_closedNoTrue (default): count companies registered in each period, including those since dissolved, so an older period isn't shrunk by closures. False: still open only

Output Schema

NameRequiredDescription
rowsYes
answerYesThe summary plus both must-quote caveats, ready to pass on as one text.
caveatsYesThe first two are must-quote: include them in any answer.
summaryYesQuote this sentence word for word.
excludedYes
snapshot_dateYes
snapshot_sha256Yes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=true, openWorldHint=false), and the description adds behavior beyond that: the default four-quarter window, the size-not-growth framing, and the note that area answers omit formation-agent addresses. Return format is left to the output schema, which is acceptable, so this falls just short of the top mark.

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

Conciseness4/5

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

Dense and largely front-loaded, moving from the question to the resource, the defaults, and the sibling routing in three sentences. The opening rhetorical question is a small framing cost, but the remaining wording all carries information.

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

Completeness4/5

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

For a question-shaped aggregation tool with five parameters, full schema coverage, annotations, and an output schema, the description covers scope, default period, exclusions, and the alternative tool. Nothing essential to correct invocation is missing, though pagination or limit behavior is only implied by the schema.

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

Parameters3/5

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

Schema coverage is 100%, so every parameter is already documented, including the area format and the from_quarter/to_quarter defaults. The description's period default ('the latest four quarters') restates what the schema says rather than adding new semantics, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource: the 2-digit SIC industry divisions with the most companies registered in a place over a period, returned largest first with a likely range and rank. It explicitly distinguishes itself from breakdown_by_industry on the size-vs-growth axis, so an agent can separate it from the closest sibling without reading either schema.

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

Usage Guidelines5/5

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

Names the alternative and the condition that selects it: 'Size, not growth: for what is growing, use breakdown_by_industry.' It also states the default period and the caveat that area answers exclude formation-agent addresses, so the agent knows what question this tool answers and what it does not.

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

one_year_survivalA
Read-only

Of the companies registered in the period with these primary SIC codes, what share were not dissolved within a year? For one area, compares it with the rest of Great Britain with a significance test; for 'UK', gives the national rate and lists the council areas whose rate passes a test for a difference (the bar is raised for testing hundreds of areas). Only quarters whose companies have all had a full year are allowed.

NameRequiredDescriptionDefault
areaNo'UK' for the national rate plus the council areas that stand out, or a council area, region or nation code from find_area to compare it with the rest of Great BritainUK
limitNo
sic_codesYesSIC codes from find_sic: 5 digits, a 2-4 digit group such as '812' for all of it, or a ready-made bundle id such as 'ai-and-data' (approximate). Choose codes for the activity asked about, e.g. cleaning: ['812']; digital and tech: ['62011', '62012', '62020', '62090', '63110', '63120', '58290']; every industry: ['all']. The choice can change the answer, so say which codes you used.
to_quarterNoYYYY-Qn; default and latest: four quarters before the last complete one
from_quarterNoYYYY-Qn, from 2021-Q1; default three quarters before to_quarter

Output Schema

NameRequiredDescription
rowsYes
answerYesThe summary plus both must-quote caveats, ready to pass on as one text.
caveatsYesThe first two are must-quote: include them in any answer.
summaryYesQuote this sentence word for word.
excludedYes
snapshot_dateYes
snapshot_sha256Yes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real behavioral detail beyond that: a significance test against the rest of Great Britain for single areas, a raised bar when testing hundreds of areas for 'UK', and the rule that only quarters with a full year of exposure are permitted. It omits any mention of result shape or how many rows the limit truncates, but with an output schema present that is a minor gap.

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

Conciseness4/5

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

Three sentences, purpose front-loaded, then the two output modes, then the temporal eligibility constraint. Every sentence carries information and there is no filler, though the phrasing ('the bar is raised for testing hundreds of areas') is parenthetical and slightly compressed.

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

Completeness4/5

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

For a five-parameter analytical tool with annotations and an output schema, the description covers the metric definition, both modes, the significance-testing behavior, and the quarter-eligibility rule. The one visible hole is the 'limit' parameter, which neither schema nor description explains — likely the cap on council areas listed for 'UK'.

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

Parameters4/5

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

Schema coverage is 80%, so most parameters are already documented, and the description partly repeats that (area modes, SIC bundle ids). It does add meaning beyond the schema: the constraint that only quarters whose companies have completed a full year are allowed, which governs from_quarter/to_quarter selection, plus the caveat that SIC choice can change the answer and should be reported. The 'limit' parameter remains unexplained in both schema and description.

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

Purpose4/5

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

The description states a precise metric — the share of companies registered in a period with given SIC codes that were not dissolved within a year — which is a specific verb-free but unambiguous resource definition. It is clearly a survival-rate tool rather than a raw count, distinguishing it from count_incorporations_still_live or registrations_against_closures. It never names a sibling, so it stops short of a 5.

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

Usage Guidelines3/5

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

The description explains the two operating modes (single area vs 'UK') and the eligibility rule for quarters, which is genuine usage context. However, it gives no explicit when-to-use/when-not guidance relative to siblings like compare_area_with_great_britain or registrations_against_closures, and no prerequisites are stated. Usage is implied by the mode descriptions rather than prescribed.

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

rank_areas_against_great_britainA
Read-only

Hotspots: in which council areas did this industry's share of Great Britain's new companies rise (or fall) most, in a period (default the latest four quarters) against an earlier one (see against)? Every area is tested, so the bar for "stands out" is raised to allow for testing hundreds of areas at once. Only areas that stand out are listed, strongest evidence first. Areas without at least 10 companies for certain in both periods aren't tested. Counts include companies dissolved since, so an area isn't made to look like a hotspot by closures in the older period. This doesn't say which area grew fastest: an area missing from the rows may have grown as fast on less evidence. To check one named area, use compare_area_with_great_britain.

NameRequiredDescriptionDefault
limitNo
againstNoCompare with the same quarters a year before (default; '2026-Q1 to Q3 against 2025-Q1 to Q3'; a period longer than four quarters goes back whole years, e.g. eight quarters against the eight before, so the two never overlap) or with the period of the same length just before. Answers name both periodsyear_before
directionNogrowing
sic_codesYesSIC codes from find_sic: 5 digits, a 2-4 digit group such as '812' for all of it, or a ready-made bundle id such as 'ai-and-data' (approximate). Choose codes for the activity asked about, e.g. cleaning: ['812']; digital and tech: ['62011', '62012', '62020', '62090', '63110', '63120', '58290']; every industry: ['all']. The choice can change the answer, so say which codes you used.
to_quarterNoYYYY-Qn ending the later period; default the last complete quarter
from_quarterNoYYYY-Qn starting the later period; default four quarters before to_quarter's end, so a whole year
include_closedNoTrue (default): count companies registered in each period, including those since dissolved, so an older period isn't shrunk by closures. False: still open only

Output Schema

NameRequiredDescription
rowsYes
answerYesThe summary plus both must-quote caveats, ready to pass on as one text.
caveatsYesThe first two are must-quote: include them in any answer.
summaryYesQuote this sentence word for word.
excludedYes
snapshot_dateYes
snapshot_sha256Yes

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the read-only annotation, the description discloses the statistical testing burden, the raised significance bar for testing many areas, the minimum-count threshold, and that only standout areas are returned strongest first. It also explains why dissolved companies are counted, preventing closure-driven false hotspots in older periods.

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

Conciseness4/5

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

The description is dense but front-loads the core question and follows with the testing caveats needed to interpret results. It is somewhat long as a single paragraph, but most sentences carry necessary nuance for a statistical ranking tool.

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

Completeness5/5

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

Given output schema exists, the description correctly focuses on interpretation: testing, thresholds, inclusion of dissolved companies, ordering, and the key limitation that a missing area may still have grown quickly on weaker evidence. It also names the sibling tool for a single-area comparison, making the definition complete for this complexity level.

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

Parameters3/5

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

Schema coverage is 71%, with against, sic_codes, to_quarter, from_quarter, and include_closed already documented in the schema. The description adds the latest-four-quarters default and points to against, but it does not add meaningful interpretation for parameters such as limit or direction beyond what the schema provides.

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

Purpose5/5

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

The description states a specific analytical operation: ranking council areas by how much an industry's share of Great Britain's new companies rose or fell versus an earlier period. It clearly frames the output as evidence-ranked hotspots, and explicitly distinguishes itself from compare_area_with_great_britain for single-area checks.

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

Usage Guidelines5/5

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

It explains the default comparison period, notes that every area is tested, and warns that only standout areas are listed so absence is not proof of slower growth. It directly routes the agent to compare_area_with_great_britain when checking one named area, giving a clear alternative for a different task.

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

registrations_against_closuresA
Read-only

Were more companies registered or dissolved? In one place (default the UK) and period (default the latest four quarters), compares companies registered with companies dissolved, whatever year those were registered, and tests which was higher, allowing for rounding. A period under a year gets the counts but no verdict, because closures come in weekly batches. It can't show whether closures are speeding up. Area answers leave out formation-agent addresses.

NameRequiredDescriptionDefault
areaNo'UK', a region or nation, or a council area code from find_areaUK
sic_codesYesSIC codes from find_sic: 5 digits, a 2-4 digit group such as '812' for all of it, or a ready-made bundle id such as 'ai-and-data' (approximate). Choose codes for the activity asked about, e.g. cleaning: ['812']; digital and tech: ['62011', '62012', '62020', '62090', '63110', '63120', '58290']; every industry: ['all']. The choice can change the answer, so say which codes you used.
to_quarterNoYYYY-Qn ending the later period; default the last complete quarter
from_quarterNoYYYY-Qn starting the period; default four quarters before to_quarter's end, so a whole year

Output Schema

NameRequiredDescription
rowsYes
answerYesThe summary plus both must-quote caveats, ready to pass on as one text.
caveatsYesThe first two are must-quote: include them in any answer.
summaryYesQuote this sentence word for word.
excludedYes
snapshot_dateYes
snapshot_sha256Yes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations only declare readOnlyHint and openWorldHint, so the description carries the real burden and does so well: it discloses the rounding tolerance in the verdict, the weekly batching that blocks sub-year verdicts, and that area answers omit formation-agent addresses. These are exactly the caveats an agent needs to interpret results honestly; only the omission of any note on what the comparison returns structurally keeps it at 4.

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

Conciseness4/5

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

Four compact sentences, front-loaded with the core comparison and followed by scope, limits and caveats in priority order. The leading rhetorical question costs a few words but does orient the reader quickly; nothing else is padded.

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

Completeness4/5

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

With an output schema present the description does not need to explain return values, and it covers scope, defaults, verdict behavior and area caveats. It does not tell the agent what to do when the question requires a sub-year verdict or a trend, which is the one informational gap for a tool of this complexity.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents area, sic_codes, from_quarter and to_quarter with defaults and formats. The description restates the defaults and adds no syntax or edge-case meaning beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

The opening question is rhetorical framing, but the body states a concrete operation: compares companies registered against companies dissolved in a given area and period and tests which was higher. That is a specific verb pair plus resource that separates it from siblings like count_incorporations_still_live or breakdown_by_industry, though the agent has to read past the question to get there.

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

Usage Guidelines4/5

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

Gives clear operating conditions: defaults to UK and the latest four quarters, sub-year periods return counts with no verdict, and the counts cannot show whether closures are accelerating. It does not name a sibling alternative for the cases it refuses (e.g. where to go for acceleration or sub-year verdicts), which keeps it 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.1.0
    • First observedbreakdown_by_industry
    • First observedcompare_area_with_great_britain
    • First observedcompare_two_areas
    • First observedcount_companies_live_now
    • First observedcount_incorporations_still_live
    • First observedfind_area
    • First observedfind_sic
    • First observedlargest_areas
    • First observedlargest_industries
    • First observedone_year_survival
    • First observedrank_areas_against_great_britain
    • First observedregistrations_against_closures

TDQS

A3.9/5.0

Scored across 12 tools

Disambiguation4/5

Most tools have clearly distinct analytical purposes, and descriptions explicitly cross-reference alternatives (e.g. largest_areas vs rank_areas_against_great_britain, breakdown_by_industry vs largest_industries). The main overlap is among the counting tools: count_incorporations_still_live, count_companies_live_now, and registrations_against_closures address similar-sounding company counts but differ in period and live/dissolved treatment.

Naming Consistency4/5

All names are snake_case and mostly follow a verb_noun or action-object pattern (find_sic, find_area, count_*, compare_*, rank_*). A few are noun phrases rather than actions (breakdown_by_industry, registrations_against_closures, largest_areas, one_year_survival), but the overall convention remains readable and predictable.

Tool Count5/5

Twelve tools is well scoped for a focused market-intelligence server covering lookups, counts, comparisons, rankings, and survival analysis. Each tool appears to earn its place without obvious redundancy.

Completeness4/5

The surface covers the core workflow well: finding SIC codes and areas, counting live/registered/dissolved companies, comparing areas and industries, ranking hotspots, and survival analysis. Minor gaps remain around explicit time-series exploration and custom multi-area or multi-industry comparisons, but agents can work around them using the existing comparison tools.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides verified UK company lookup and number validation for AI agents using official Companies House data. Enables lookup of registered details by number, validation of company number format, and search by company name.
    3
    85 npm
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to search and retrieve UK Companies House data including company profiles, officers, and filing history via the official API.
    4
    178 npm
    1
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    Provides access to UK Companies House public data, enabling search and retrieval of company profiles, officers, filing history, and more through natural language queries.
    12
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables querying UK company data including search, profiles, officers, filings, and persons with significant control via Companies House API.
    178 npm
    MIT