Skip to main content
Glama
moureauf

boe-mcp

by moureauf

boe-mcp

npm CI node license MCP Registry

An MCP (Model Context Protocol) server that gives Claude Code — or any MCP client — live Bank of England data: the base rate (current level, change history, statistics over any period, and the rate in force on any past date), any series from the BoE's IADB statistical database (SONIA, exchange rates, quoted mortgage rates, and thousands more, with a curated catalog to start from), and the Monetary Policy Committee meeting schedule. It runs over stdio by default (with an opt-in Streamable HTTP mode for remote hosting), needs no API key or configuration, and caches responses in memory so repeated questions don't re-hit the BoE.

boe-mcp demo: calling get_current_rate and get_next_mpc_meeting, returning live Bank of England data

Published on npm as boe-mcp with build provenance — install and run it with npx -y boe-mcp.

Tools

Tool

Description

Example output

get_current_rate

Current base rate, effective date, months held at this level

{ "rate": 3.75, "effectiveDate": "2025-12-18", "monthsHeld": 6, "source": "https://www.bankofengland.co.uk/boeapps/iadb/...", "cachedAt": "2026-07-07T04:11:28Z" }

get_rate_history

Last N rate changes (default 10) — date, rate, move in basis points vs previous (null for the earliest known entry)

{ "entries": [{ "date": "2025-12-18", "rate": 3.75, "changeBps": -25 }, ...], "source": "...", "cachedAt": "..." }

get_rate_at

The base rate in force on a specific historical date

{ "date": "2020-03-15", "rate": 0.25, "effectiveDate": "2020-03-11", "source": "...", "cachedAt": "..." }

get_rate_stats

Summary statistics of the base rate over a date range (optional from/to, default full history): min/max with the date each level first applied, time-weighted average, start/end rates and net move in basis points

{ "from": "2025-01-01", "to": "2025-12-31", "min": { "rate": 3.75, "date": "2025-12-18" }, "max": { "rate": 4.75, "date": "2025-01-01" }, "average": 4.2514, "startRate": 4.75, "endRate": 3.75, "changeBps": -100, "source": "...", "cachedAt": "..." }

get_next_mpc_meeting

Date of the next scheduled MPC announcement and days until it

{ "date": "2026-07-30", "daysUntil": 23, "source": "https://www.bankofengland.co.uk/monetary-policy/upcoming-mpc-dates", "cachedAt": "..." }

get_mpc_dates

All upcoming MPC announcement dates on the published schedule, each with days until it

{ "dates": [{ "date": "2026-07-30", "daysUntil": 23 }, { "date": "2026-09-17", "daysUntil": 72 }, ...], "source": "https://www.bankofengland.co.uk/monetary-policy/upcoming-mpc-dates", "cachedAt": "..." }

list_series

Curated catalog of well-known IADB series (policy rates, market rates, FX, household rates) with code, name, description, unit and frequency — a starting point for get_series

{ "series": [{ "code": "IUDSOIA", "name": "SONIA (Sterling Overnight Index Average)", "description": "...", "unit": "percent per annum", "frequency": "daily (business days)" }, ...], "note": "get_series also accepts any other IADB code..." }

get_series

Fetch observations for any BoE IADB series by code, with optional from/to ISO dates and a limit (1–500, default 50) on the most recent points

{ "seriesCode": "IUDSOIA", "name": "SONIA (Sterling Overnight Index Average)", "unit": "percent per annum", "frequency": "daily (business days)", "points": [{ "date": "2025-12-19", "value": 3.69 }, ...], "source": "...", "cachedAt": "..." }

get_series accepts any valid IADB code (not only the catalogued ones); an unknown or empty code returns a clean Unknown or empty IADB series "XXXX" — use list_series for known codes message. Use list_series to discover codes.

If the BoE is unreachable and a previously cached value exists, tools serve the cached data with "stale": true so the caller can flag the caveat. With no cache at all they return a clean error message.

Related MCP server: plinth-fx-mcp

Installation

Add to your Claude Code settings.json:

{
  "mcpServers": {
    "boe": {
      "command": "npx",
      "args": ["-y", "boe-mcp"]
    }
  }
}

Or use the CLI:

claude mcp add boe -- npx -y boe-mcp

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "boe": {
      "command": "npx",
      "args": ["-y", "boe-mcp"]
    }
  }
}

Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "boe": {
      "command": "npx",
      "args": ["-y", "boe-mcp"]
    }
  }
}

Add to .vscode/mcp.json:

{
  "servers": {
    "boe": {
      "command": "npx",
      "args": ["-y", "boe-mcp"]
    }
  }
}

HTTP mode (remote hosting)

By default the server speaks MCP over stdio as a child process of the client. To host it remotely instead, start it in Streamable HTTP mode:

npx -y boe-mcp --http                  # listen on http://127.0.0.1:3000/mcp
npx -y boe-mcp --http 8080             # explicit port
BOE_MCP_HTTP_PORT=8080 npx -y boe-mcp  # env var instead of the flag

Setting

How

Default

Enable HTTP mode

--http flag or BOE_MCP_HTTP_PORT env var

off (stdio)

Port

--http <port>, else BOE_MCP_HTTP_PORT, else 3000

3000

Bind host

BOE_MCP_HTTP_HOST

127.0.0.1

Endpoints: POST /mcp (JSON-RPC), GET /healthz (returns ok, for hosting platform health checks). The transport is stateless — every POST is served by a fresh server instance, so there are no sessions to resume and no SSE stream; GET/DELETE /mcp return 405. That makes instances safe to scale horizontally behind a load balancer.

Try it with curl:

curl -X POST http://127.0.0.1:3000/mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'

Security: the default bind of 127.0.0.1 only accepts connections from the local machine, and DNS-rebinding protection (Host-header validation) is enabled automatically for loopback binds. Setting BOE_MCP_HTTP_HOST=0.0.0.0 exposes the server, with no authentication, to every network the machine is attached to — only do that behind a reverse proxy or firewall that controls who can reach it (DNS-rebinding protection is disabled for non-loopback binds, since the server can't know the legitimate public hostname).

Configuration

Env var

Default

Description

BOE_CACHE_TTL_MINUTES

60

How long to cache BoE responses in memory (0 disables caching)

BOE_MCP_HTTP_PORT

unset

Enable HTTP mode on this port (see HTTP mode)

BOE_MCP_HTTP_HOST

127.0.0.1

Bind host for HTTP mode — 0.0.0.0 exposes the server to the network; see the security note above

Data sources

  • Base rate: the Bank of England Statistical Interactive Database (IADB), series IUDBEDR, via its public CSV endpoint. No auth, no key. Honest caveat: the IADB is not officially documented as a public API — it has been stable for many years and is widely used, but the Bank makes no compatibility promises, so a breaking change is possible in principle.

  • MPC dates: parsed from the BoE's public upcoming MPC dates page. The parser deliberately avoids depending on the page's markup (it scans the visible text for dates), so cosmetic redesigns won't break it.

Running from source

git clone https://github.com/moureauf/boe-mcp.git
cd boe-mcp
npm install
npm run build
npm start            # runs the stdio server

Contributing & releasing

See CONTRIBUTING.md for the development workflow (making changes, testing, adding tools, versioning) and how the release pipeline connects GitHub, npm, and the MCP registry. Publishing is automated: pushing a v* tag runs .github/workflows/publish.yml, which builds, tests, and publishes to npm via trusted publishing (OIDC — no token secret, with a provenance attestation) and to the official MCP registry. Exact commands and one-time setup are in RELEASING.md.

License

MIT

Available Tools

8 tools
get_current_rateCurrent BoE base rateA

Get the current Bank of England base rate, the date it took effect, and how many whole months it has been held at this level.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
rateYesCurrent base rate in percent, e.g. 3.75
staleNoPresent and true when the BoE was unreachable and this is stale cached data
sourceYesURL the data was fetched from
cachedAtYesWhen the data was fetched (ISO 8601 timestamp)
monthsHeldYesWhole months the rate has been at this level
effectiveDateYesDate the current level took effect

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of disclosing behavior. It clearly states what data is returned, which is helpful, but it does not explicitly mention that this is a read-only operation or disclose any other behavioral traits such as rate limits or required permissions. The word 'Get' implies non-mutating behavior, but this is not overtly stated.

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?

The description is a single, well-structured sentence that front-loads the primary purpose and lists the outputs. Every word contributes meaning, with no filler or redundant information.

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 the low complexity (zero parameters), the presence of an output schema, and the description's clear enumeration of the returned fields, the description is complete. It provides sufficient context for an agent to select and invoke the tool correctly without additional details.

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?

The tool has zero parameters, so the description does not need to explain parameter semantics. Per the rubric, a baseline of 4 is appropriate when there are no parameters, as the schema and description together fully cover the input requirements.

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 uses a specific verb ('Get') and resource ('current Bank of England base rate') and details the exact information returned (rate, effective date, months held). It clearly distinguishes from siblings like get_rate_history and get_rate_at by emphasizing 'current'.

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?

The description provides clear context for when to use the tool: when the current base rate is needed. While it does not explicitly list alternatives or exclusions, the 'current' qualifier implicitly differentiates it from historical or date-specific tools, making the usage scope obvious.

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

get_mpc_datesUpcoming MPC announcement datesA

Get every upcoming Bank of England Monetary Policy Committee announcement date on the published schedule (typically a year or more ahead), each with the number of calendar days until it. Use get_next_mpc_meeting when only the next date is needed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
datesYesAll published announcement dates on or after today, ascending
staleNoPresent and true when the BoE was unreachable and this is stale cached data
sourceYesURL the data was fetched from
cachedAtYesWhen the data was fetched (ISO 8601 timestamp)

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the full disclosure burden. It clearly states that the tool returns the published schedule (typically a year or more ahead) and that each result includes a calendar-day count, which indicates a read-only, list-like behavior. It does not mention edge cases like schedule updates or timezone handling, but for a simple zero-parameter read tool the core behavior is transparently described.

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?

The description is two concise sentences, with the primary purpose stated first and the alternative-tool pointer in the second. Every clause adds meaningful information, and there is no repetition of the title or obvious 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?

Given that the tool has no parameters and an output schema is present, the description does not need to enumerate return fields. It explains the scope ('every upcoming'), the scheduling horizon, and the day-count detail, which fully covers contextual needs for a simple listing tool. The reference to the sibling tool also places it well in the surrounding tool ecosystem.

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?

The tool has zero parameters, so the description needs to add no parameter-level detail. The description still enhances understanding by specifying that the returned schedule is the published MPC announcement schedule and that results are upcoming dates with day counts, which is useful context beyond the empty schema.

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 uses a specific verb ('Get') and a clearly defined resource ('every upcoming Bank of England Monetary Policy Committee announcement date on the published schedule'), including the extra detail that each date comes with the number of calendar days until it. It explicitly distinguishes itself from get_next_mpc_meeting by contrasting the scope (all upcoming vs. only the next).

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?

The description provides explicit usage guidance by stating 'Use get_next_mpc_meeting when only the next date is needed,' naming the alternative tool and the specific condition under which it should be preferred. This is exactly the kind of when-to-use versus when-not-to-use direction expected.

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

get_next_mpc_meetingNext MPC meetingA

Get the date of the next scheduled Bank of England Monetary Policy Committee announcement and the number of days until it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYesDate of the next MPC announcement
staleNoPresent and true when the BoE was unreachable and this is stale cached data
sourceYesURL the data was fetched from
cachedAtYesWhen the data was fetched (ISO 8601 timestamp)
daysUntilYesCalendar days from today until the announcement

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden. It fully discloses the output: the date and days until. It implies a read-only operation, though it doesn't explicitly state lack of side effects or permission requirements. However, for a simple lookup tool, this is adequate.

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?

A single, compact sentence delivers all essential information without any filler. It states both the primary output (date) and the secondary output (days until) efficiently.

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?

Given the tool's simplicity, the description provides a complete picture. An output schema exists, so return structure is presumably defined. The description covers the key purpose and output, and no further context is needed for likely use cases.

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?

The tool has zero parameters, and the schema coverage is 100% (vacuously). Per the rubric, a baseline of 4 is appropriate since no parameter documentation is needed. The description adds no parameter details because there are none.

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 uses a specific verb ('Get') and resource ('next scheduled Bank of England Monetary Policy Committee announcement'), plus the additional output of days until. This clearly distinguishes it from sibling tools like get_mpc_dates, which likely lists multiple dates.

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?

The description clearly implies when to use this tool (to get the next MPC announcement date) and the context is clear. It does not explicitly mention alternatives, but the sibling name 'get_mpc_dates' suggests a different use case, and the description's specificity is sufficient.

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

get_rate_atBoE base rate on a dateA

Get the Bank of England base rate that was in force on a specific historical date, and when that level took effect.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesThe date to look up, ISO 8601 (YYYY-MM-DD)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYesThe queried date
rateYesBase rate in percent in force on that date
staleNoPresent and true when the BoE was unreachable and this is stale cached data
sourceYesURL the data was fetched from
cachedAtYesWhen the data was fetched (ISO 8601 timestamp)
effectiveDateYesDate this rate level took effect

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations present, the description carries the burden of explaining behavior. It transparently states that the tool returns the rate in force on the given date and also provides the effective date of that level. This goes beyond a simple 'gets a rate' by disclosing the additional returned value, though it leaves out minor details like error conditions or boundary behavior.

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?

The description is a single, front-loaded sentence. It states the action ('Get'), the resource ('Bank of England base rate'), the qualifier ('on a specific historical date'), and the additional output ('when that level took effect') with no filler or redundant wording.

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 simple one-parameter lookup tool with an output schema present, the description provides the core purpose and one key behavioral detail. It is sufficient for an agent to understand what this tool does and when to invoke it. However, it could be more complete by noting that it is for point-in-time lookups rather than range queries, but this is a minor gap given the simplicity.

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?

The input schema already documents the single 'date' parameter with type, pattern, and description, so schema coverage is 100%. The description repeats that it is a historical date but adds no syntax or format details beyond the schema. This aligns with the baseline 3 for well-covered schemas where the description need not compensate.

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 begins with 'Get the Bank of England base rate' which is a specific verb and resource, and immediately narrows scope to 'a specific historical date' plus 'when that level took effect.' This clearly distinguishes it from sibling tools like get_current_rate (current rate) and get_rate_history (history/range), making the tool's purpose unmistakable.

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

Usage Guidelines2/5

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

No explicit guidance is provided about when to use this tool versus alternatives. It is evident from the description that it takes a specific date, but there are no exclusions, comparisons to sibling tools, or notes on edge cases. The tool names suggest overlap with get_rate_history and get_current_rate, but the description does not address this.

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

get_rate_historyBoE base rate historyA

Get the last N Bank of England base rate changes: date, new rate, and the move in basis points vs the previous level (null for the earliest known entry).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of rate changes to return (default 10)

Output Schema

ParametersJSON Schema
NameRequiredDescription
staleNoPresent and true when the BoE was unreachable and this is stale cached data
sourceYesURL the data was fetched from
entriesYes
cachedAtYesWhen the data was fetched (ISO 8601 timestamp)

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses the return fields (date, new rate, move in basis points) and specifies that the earliest known entry has a null move. This provides meaningful behavioral insight beyond the schema, though it does not mention ordering (e.g., descending chronological) or edge cases like limit exceeding available data.

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?

The description is a single, information-dense sentence that front-loads the core action and then specifies the output fields. Every word contributes value, with no redundancy or fluff.

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 simple tool with one parameter and a provided output schema, the description adequately covers what the tool returns. The null-handling note adds useful edge-case context. A minor gap is the lack of explicit statement about ordering, but this is inferable from 'last N changes'.

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?

The input schema already fully describes the 'limit' parameter, including default value and range. The description merely refers to it as 'N' without adding new semantics. Since schema coverage is 100%, the baseline score of 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?

The description clearly states the verb ('Get'), the resource ('Bank of England base rate changes'), and the scope ('last N'), with explicit output fields. It effectively distinguishes itself from sibling tools like get_current_rate and get_rate_at, which target a single point in time.

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 does not explicitly state when to use this tool versus alternatives or provide exclusionary guidance. However, the phrase 'last N changes' implies it is for historical change data, and siblings like get_current_rate imply current rate. The usage context is present but only implicitly.

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

get_rate_statsBoE base rate statistics over a rangeA

Get summary statistics of the Bank of England base rate over a date range: minimum and maximum (with the date each level first applied), the time-weighted average, and the rates in force at the start and end of the window with the net move in basis points. Both dates are optional — omit them for the full available history through today. The rate level in force on the start date counts even if it took effect earlier.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd of the window (inclusive), ISO 8601 (YYYY-MM-DD). Defaults to today; must not be in the future
fromNoStart of the window, ISO 8601 (YYYY-MM-DD). Defaults to the start of the available series

Output Schema

ParametersJSON Schema
NameRequiredDescription
toYesEffective window end used (today when `to` was omitted)
maxYes
minYes
fromYesEffective window start used (the first available data point when `from` was omitted or predates the series)
staleNoPresent and true when the BoE was unreachable and this is stale cached data
sourceYesURL the data was fetched from
averageYesTime-weighted average rate in percent: each level weighted by the number of calendar days it was in force within the window (not a plain mean of the sparse change points), rounded to 4 decimal places
endRateYesRate in percent in force on the window end date
cachedAtYesWhen the data was fetched (ISO 8601 timestamp)
changeBpsYesNet move over the window: endRate minus startRate, in basis points
startRateYesRate in percent in force on the window start date

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and meets it well. It discloses optional date behavior, inclusive end, the nuance that the start-date rate counts even if applied earlier, and what the net move represents. This goes beyond merely restating the tool's function.

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?

The description is three sentences, front-loaded with the purpose, and uses no filler. Every sentence adds distinct information: the computed stats, the default behavior, and a subtle inclusion rule. Efficient and well-structured.

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 the tool's moderate complexity, the description covers the essential behavioral nuances, return contents, and parameter defaults. The output schema exists, so not detailing every field is acceptable. It also handles edge cases (start date rate applied earlier) and full history defaults, making it complete for agent use.

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?

The schema already documents both parameters (100% coverage), providing baseline 3. The description adds semantic value by explaining defaults ('Defaults to today' for to, 'Defaults to the start of the available series' for from) and how the inclusive range works with the start-date nuance. This enhances understanding beyond the schema.

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 starts with a specific verb and resource: 'Get summary statistics of the Bank of England base rate over a date range.' It enumerates the exact outputs (min/max with dates, time-weighted average, start/end rates, net move), which clearly distinguishes it from siblings like get_rate_history (raw rates) or get_rate_at (single point).

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?

The description provides clear context for when to use it: when summary statistics are needed over a range. It clarifies optional dates and defaults ('omit them for the full available history through today'), but it does not explicitly name alternatives or say when not to use it. This is clear context without exclusions, so a 4 is appropriate.

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

get_seriesGet a BoE IADB time seriesA

Fetch observations for any Bank of England IADB statistical series by its code (e.g. IUDSOIA for SONIA, XUDLUSS for USD/GBP). Optionally restrict to a date range and cap how many of the most recent points are returned. Use list_series to discover codes; any valid IADB code works, not only catalogued ones.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoOnly return observations on or before this ISO 8601 date (YYYY-MM-DD)
fromNoOnly return observations on or after this ISO 8601 date (YYYY-MM-DD)
limitNoMaximum number of most-recent observations to return after date filtering (default 50, max 500)
seriesCodeYesIADB series code, e.g. IUDSOIA, XUDLUSS, IUMBV34 (case-insensitive)

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoSeries name, present when the code is catalogued
unitNoValue unit, present when the code is catalogued
staleNoPresent and true when the BoE was unreachable and this is stale cached data
pointsYes
sourceYesURL the data was fetched from
cachedAtYesWhen the data was fetched (ISO 8601 timestamp)
frequencyNoObservation cadence, present when the code is catalogued
seriesCodeYesThe resolved (uppercased) IADB series code

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses optional date filtering and a limit on most-recent points, and notes that any valid IADB code is accepted. However, it omits details on error handling, authentication, or rate limits, though these may be less critical for a read-only fetch.

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?

Two succinct sentences; the first front-loads the primary purpose with examples, the second adds guidance about discovery and scope. No filler or repetition.

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?

Given the presence of an output schema and the simplicity of a read-only fetch, the description is mostly complete. It covers the main use case, optional parameters, and points to the discovery tool, though it could mention sibling tools for rate-specific data.

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?

The input schema already describes all four parameters with 100% coverage, so the baseline is 3. The description reinforces the meaning of limit by specifying 'most recent' and gives example codes, but does not add new semantic details beyond the schema.

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 clearly states the action ('Fetch observations') and the resource ('any Bank of England IADB statistical series'), with concrete examples and a scope note ('any valid IADB code works'). This distinguishes it from sibling rate-specific tools and from list_series, which is for discovery.

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 explicitly directs users to list_series for discovering codes, which is an alternative. It also states that any valid IADB code works, not only catalogued ones, which frames when to use this tool broadly. However, it doesn't explicitly contrast with other sibling tools like get_current_rate or get_rate_at.

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

list_seriesList known BoE IADB seriesA

List a curated catalog of well-known Bank of England IADB statistical series (policy rates, market rates, exchange rates, household rates) with their code, name, description, unit and frequency. Use this to discover series codes to pass to get_series. get_series also accepts any other IADB code, not only these.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYesNote explaining that get_series accepts any IADB code, not only the listed ones
seriesYes

TDQS

A4.7/5.0
Behavior4/5

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

No annotations are present, so the description carries the burden. It openly discloses the curated nature (not exhaustive) and that get_series accepts more codes, setting correct expectations about coverage and scope.

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?

Two sentences, front-loaded with the verb and outcome. Every clause adds value—scope, fields returned, usage intent, and alternative. No wasted words.

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 tool is simple (list operation, no params) and the output schema exists. The description covers purpose, output fields, scope limitations, and relationship to sibling tools, making it fully complete for an agent.

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?

The tool has zero parameters, so the schema is empty and no parameter-specific guidance is needed. The description effectively explains the output, which is the sole input-agnostic behavior.

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 clearly states the tool lists a curated catalog of BoE IADB series with specific fields (code, name, description, unit, frequency). It also distinguishes itself from siblings like get_series by explicitly noting its role in discovering codes.

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 explicitly says 'Use this to discover series codes to pass to get_series' and notes that get_series accepts any IADB code, not just these. This gives clear when-to-use guidance and alternative behavior.

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. 8 tool updatesv0.2.0
    • First observedget_current_rate
    • First observedget_mpc_dates
    • First observedget_next_mpc_meeting
    • First observedget_rate_at
    • First observedget_rate_history
    • First observedget_rate_stats
    • First observedget_series
    • First observedlist_series

TDQS

A4.4/5.0

Scored across 8 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: current rate, historical rate, rate changes, rate statistics, next MPC meeting, all MPC dates, series discovery, and series data. The descriptions explicitly clarify boundaries, such as using get_next_mpc_meeting when only the next date is needed.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (get_rate_at, get_next_mpc_meeting). The only non-get tool is list_series, which is a standard verb for collection listing and fits the pattern well.

Tool Count5/5

8 tools is well-scoped for a Bank of England data server, covering base rate queries, MPC meeting schedules, and statistical series. There is no unnecessary overlap or bloat.

Completeness5/5

The tool set provides comprehensive coverage for its domain: full base rate lifecycle (current, history, at-date, stats), all MPC meeting dates (next and full schedule), and series discovery plus arbitrary data retrieval. No obvious gaps exist.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables querying Bank of England statistical data including Bank Rate, SONIA, and exchange rates via the IADB.
    8
    MIT
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    MCP server that provides real exchange-rate data from the European Central Bank, including latest rates, currency conversion, historical rates, and time series.
    -
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that provides AI assistants with access to over 40 Bank of Japan statistical databases (interest rates, money supply, exchange rates, tankan, etc.) via the BOJ time-series data search API.
    4
    23
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Banco Central do Brasil MCP server that enables querying Brazilian central bank economic indicators via SGS codes.
    6
    MIT