BCRP MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@BCRP MCP ServerWhat is today's USD/PEN exchange rate?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
BCRP MCP Server
Connects any MCP-compatible AI agent to BCRPData — the official open-access economic statistics database of the Banco Central de Reserva del Perú (BCRP).
Access real-time and historical data for exchange rates, interest rates, international reserves, monetary liquidity, private sector credit, commodity prices, stock market indicators, and GDP — no API key required.
Works with: Claude Desktop · Claude Code · Cursor · VS Code Copilot · Windsurf · Zed · Continue.dev · any MCP client
What you can ask it
Ask | Tool that answers it |
"How much is the dollar in Peru today?" |
|
"Plot Peru's GDP over the last ten years" |
|
"What's the current state of the Peruvian economy?" |
|
"I need the series code for inflation" |
|
"Export FX, inflation and GDP together as one CSV" |
|
"What period does this series actually cover?" |
|
No API key, no registration, nothing to configure. BCRPData is fully public.
Series are identified by opaque codes like PD04637PD, which mean nothing on
sight — so start from the catalog:
bcrp catalog search "tipo de cambio" # find the code
bcrp series latest PD04637PD --n 5 # then fetch itRelated MCP server: mcp-bcrp
Quickstart — one command
npx bcrp-mcpThat installs all three pieces, which are designed to work together:
Piece | What it is |
| The MCP server, so AI clients can query BCRPData |
| The CLI — same tools, for humans and scripts |
| Teaches agents how to use them correctly |
It also registers the server with Claude Code automatically when the claude CLI is
present, and prints the config snippet for other clients.
npx bcrp-mcp --help # all options
npx bcrp-mcp --skill-only # just the agent skill
npx bcrp-mcp --no-skill # just the server + CLI
npx bcrp-mcp --from . # install the Python side from a local checkoutuv tool install bcrp-mcp # recommended
pipx install bcrp-mcp
pip install bcrp-mcpThe npx installer just wraps this and adds the skill. No API key is needed either way — BCRPData is a fully public API.
Then start using it:
> What is the current BCRP policy rate and exchange rate?
> Use bcrp_get_macro_snapshot to get a snapshot of Peru's key economic indicators.
> Show me the evolution of Peru's international reserves since 2020.Prerequisites
Python 3.11+
python --version # needs 3.11 or higheruv (recommended)
# Windows
winget install astral-sh.uv
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | shInstallation
Option A — uvx (zero configuration)
uvx bcrp-mcp
# Upgrade later
uv tool upgrade bcrp-mcpOption B — pip
pip install bcrp-mcp
bcrp-mcp # starts the serverOption C — From source (development)
git clone https://github.com/JOSETRA44/bcrp-mcp.git
cd bcrp-mcp
uv sync
cp .env.example .env # optional — customize settings
uv run bcrp-mcpCommand-Line Interface
Installing this package also puts a standalone bcrp CLI on your PATH. It calls the
exact same tool-core functions as the MCP server (bcrp_mcp.tools.*), so results
never drift between the two — the CLI is just a second transport on top of one shared
implementation. Useful for scripting, cron jobs, or checking data without an AI client.
bcrp --help # full command tree
bcrp series --help
bcrp series latest PD04637PD PD12301MD --n 3
bcrp series get PN00196MM --start 2020-1 --end 2024-12
bcrp series describe PD04637PD
bcrp catalog search "tipo de cambio"
bcrp catalog categories
bcrp macro snapshot
bcrp serve # run the MCP server over stdio (same as `bcrp-mcp`)Output is formatted as box-drawn tables sized to your terminal, with each value rounded to the precision the BCRP actually publishes it at:
Tipo de cambio
daily · 20.Jul.26 → 22.Jul.26 · 3 periods
Series
PD04637PD Tipo de cambio - TC Interbancario (S/ por US$) - Compra
PD12301MD Tasas de interés - Tasa de Referencia de la Política Monetaria
Data
┌───────────┬───────────┬───────────┐
│ Period │ PD04637PD │ PD12301MD │
├───────────┼───────────┼───────────┤
│ 20.Jul.26 │ 3.402 │ 4.25 │
│ 21.Jul.26 │ 3.397 │ 4.25 │
│ 22.Jul.26 │ — │ 4.25 │
└───────────┴───────────┴───────────┘Output flags available on every data command:
Flag | Effect |
| Raw tool-output dict — identical to what the MCP tool returns |
| Disable ANSI colour (also honours |
| Plain ASCII tables instead of Unicode box characters |
| Language for series names |
Exit codes: 0 success, 2 invalid input, 3 series not found, 4 BCRP API error.
bcrp series latest PD04637PD --json | jq '.data[-1]'Agent Skill
The bcrp skill teaches AI agents how to use these tools correctly — the parts that
otherwise produce confidently wrong answers: values are positional rather than keyed,
mixed-frequency requests are silently dropped rather than rejected, period formats differ
per frequency, and n.d. means "not published" rather than zero.
It installs to ~/.claude/skills/bcrp via npx bcrp-mcp (or --skill-only).
The skill's reference files are generated from the package's own catalog and API guides, so they can't drift from what the server actually serves:
uv run python scripts/gen_skill_refs.pyConfiguration (Optional)
All settings have sensible defaults. Override via environment variables or .env file:
Variable | Default | Description |
|
| Response cache in seconds (0 = disabled) |
|
| HTTP timeout in seconds |
|
| Retries on transient errors |
|
| Default language: |
|
|
|
No API key required — BCRPData is fully open access.
Configuration by Client
Claude Desktop
Config file:
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"bcrp": {
"command": "uvx",
"args": ["bcrp-mcp"]
}
}
}Restart Claude Desktop after saving. You'll see a hammer icon (🔨) confirming the server is loaded.
Claude Code (CLI)
Add to your .mcp.json or .antigravity.json:
{
"mcpServers": {
"bcrp": {
"command": "uvx",
"args": ["bcrp-mcp"]
}
}
}From source:
{
"mcpServers": {
"bcrp": {
"command": "uv",
"args": [
"--directory", "/absolute/path/to/bcrp-mcp",
"run", "bcrp-mcp"
]
}
}
}Run /mcp in the Claude Code prompt to confirm — you should see bcrp with 6 tools.
Cursor
{
"mcpServers": {
"bcrp": {
"command": "uvx",
"args": ["bcrp-mcp"]
}
}
}VS Code + GitHub Copilot
Create .vscode/mcp.json:
{
"servers": {
"bcrp": {
"type": "stdio",
"command": "uvx",
"args": ["bcrp-mcp"]
}
}
}Windsurf
Config: %APPDATA%\Codeium\windsurf\mcp_config.json
{
"mcpServers": {
"bcrp": {
"command": "uvx",
"args": ["bcrp-mcp"]
}
}
}Zed
Edit ~/.config/zed/settings.json:
{
"context_servers": {
"bcrp": {
"command": {
"path": "uvx",
"args": ["bcrp-mcp"]
}
}
}
}Continue.dev
Edit .continue/config.yaml:
mcpServers:
- name: bcrp
command: uvx
args:
- bcrp-mcpGeneric stdio
command: uvx
args: ["bcrp-mcp"]Available Tools (6)
Tool | Description |
| Fetch 1–10 series with optional date range (all same frequency) |
| Get the most recent N data points for 1–10 series |
| Metadata only: series names, frequency, available date range |
| Search built-in catalog of important series by keyword |
| List all catalog categories with series counts |
| Real-time snapshot of Peru's key macroeconomic indicators |
Available Prompts (3)
Prompt | Arguments | Description |
|
| Structured workflow: policy rate, liquidity (M2), credit growth |
|
| Exchange rate dynamics, reserves, dollarization |
|
| GDP growth, monetary multiplier, credit cycle |
Available Resources (3)
Resource URI | Contents |
| Complete API reference: URL structure, period formats, response schema |
| Quick reference table for all period formats by frequency |
| Curated catalog of important series with codes, names, units |
Key Series Codes
Daily (format: DD-MM-YYYY)
Code | Indicator | Unit |
| TC Interbancario Compra (USD/PEN) | S/ por US$ |
| TC Interbancario Venta (USD/PEN) | S/ por US$ |
| Tasa de Referencia BCRP | % anual |
| Tasa Interbancaria, S/ | % anual |
| Reservas Internacionales Netas | Millones US$ |
| Índice General Bursátil BVL | Índice |
| Precio del Cobre | cUS$ por libra |
| Precio del Petróleo WTI | US$ por barril |
| Índice Dow Jones | Índice |
Monthly (format: YYYY-M)
Code | Indicator | Unit |
| Liquidez Total (M2) | Millones S/ |
| Circulante (M0) | Millones S/ |
| Liquidez en Soles | Millones S/ |
| Liquidez var% 12 meses | % anual |
| Crédito Sector Privado | Millones S/ |
| Crédito var% 12 meses | % anual |
Quarterly (format: YYYY-Q)
Code | Indicator | Unit |
| PBI Nominal var% | % trimestral |
| Liquidez MN var% | % trimestral |
| Emisión Primaria var% | % trimestral |
| Multiplicador Monetario var% | % trimestral |
Example Queries
# Get the current exchange rate (last 5 trading days)
bcrp_get_latest(series_codes=["PD04637PD", "PD04638PD"], n_periods=5)
# BCRP policy rate since 2022
bcrp_get_series(
series_codes=["PD12301MD"],
start_period="01-01-2022",
end_period="30-06-2026"
)
# Monthly liquidity (M2) and credit growth last 2 years
bcrp_get_series(
series_codes=["PN00196MM", "PN00496MM", "PN00500MM"],
start_period="2024-1",
end_period="2026-6"
)
# Complete macro snapshot
bcrp_get_macro_snapshot()
# Search for more series
bcrp_search_catalog(query="tipo de cambio", frequency="monthly")
bcrp_search_catalog(query="exportaciones")API Notes
No authentication required — BCRPData is fully public.
Multiple series in one call must be the same frequency (all daily, all monthly, etc.).
Period formats differ by frequency — see
bcrp://period-formatsresource.The BCRP database has 8,000+ monthly, 2,700+ quarterly, and 800+ daily series. Browse the full catalog at estadisticas.bcrp.gob.pe.
Verify It's Working
# Interactive browser UI
npx @modelcontextprotocol/inspector uvx bcrp-mcp
# Quick smoke test
echo "" | uvx bcrp-mcp
# Unit tests (from source)
uv sync --group dev
uv run pytest tests/ -vTroubleshooting
command not found: uvx
Install uv: https://docs.astral.sh/uv/getting-started/installation/
Empty results for a series
The series code may be discontinued or the period range may not have data.
Run bcrp_describe_series first to check available date range.
Series codes with mismatched frequencies All series in a single call must share the same frequency. Daily and monthly series cannot be mixed — make two separate calls.
Slow first start uv downloads and caches the package on first run. Subsequent starts take ~0.2s.
Project Structure
bcrp-mcp/
├── src/bcrp_mcp/
│ ├── server.py # FastMCP entry point
│ ├── config.py # Settings (pydantic-settings, no auth required)
│ ├── client.py # Async HTTP client + TTL cache + retry
│ ├── exceptions.py # Error hierarchy
│ ├── formatters.py # Raw BCRP JSON → clean AI-friendly dicts
│ ├── catalog.py # Curated series catalog + search
│ ├── tools/ # 6 MCP tools (thin wrappers around shared core logic)
│ ├── cli/ # `bcrp` CLI — same tool-core functions, argparse transport
│ ├── prompts/ # 3 MCP prompts (analysis workflows)
│ └── resources/ # 3 MCP resources (guides + catalog)
├── skills/bcrp/ # Agent skill (references/ generated from catalog.py)
├── npm/ # `npx bcrp-mcp` one-command installer
├── scripts/ # gen_skill_refs.py — regenerates skill references
├── tests/ # Unit tests (no network required)
├── .env.example # Optional configuration
└── pyproject.tomlData Source
All data comes from BCRPData — the official open statistics platform of the Banco Central de Reserva del Perú. For terms of use, see: https://estadisticas.bcrp.gob.pe/estadisticas/series/ayuda/condicionesUso
CLI for agents
Peru's central bank series, straight from the source and updated daily.
This CLI follows ARSENAL-SPEC.md, the contract every research
tool in this workspace shares: an agent that can drive one can drive all of them.
Discover it without reading this file
bcrp describe --json # every command, argument, row field and example
bcrp describe <command> --jsonThe manifest is derived from the parser itself, so it cannot drift out of date.
Output
-f, --format accepts table, json, jsonl, csv, md; -o FILE writes to a file; -q silences notes.
Data goes to stdout, notes and progress to stderr — piping to jq always yields
parseable JSON.
--format json returns the standard envelope:
{
"ok": true,
"command": "series get",
"source": "bcrp",
"fetched_at": "2026-08-21T14:03:11Z",
"cached": false,
"count": 10,
"meta": {},
"data": {},
"rows": []
}count always equals len(rows). An empty result is exit 0, not an error. Failures
return an error envelope carrying error.code, error.message and an actionable
error.hint, printed to stdout in machine formats so a pipeline can inspect it.
Exit codes
Code | Meaning |
0 | success (including an empty result set) |
1 | API returned an error or an unexpected response |
2 | usage error (bad flag, bad argument, unknown format) |
3 | resource not found (unknown series code) |
4 | auth or configuration error |
5 | rate limited or quota exhausted |
6 | network failure or timeout |
Cache
Results are cached on disk and survive between invocations, so a repeated query is
instant. --refresh refetches and rewrites; --no-cache skips it entirely; the
envelope reports cached.
bcrp cache stats -f json
bcrp cache clearRecipes
bcrp series get PN01288PM --start 2015-1 --end 2025-1 -f csv -o pbi.csv
bcrp series get PD04637PD PD04638PD --start 01-01-2024 -f jsonl
bcrp series latest PD04637PD --n 10 -f json
bcrp series latest PD04637PD PN01288PM -f md
bcrp series describe PD04637PD -f jsonOr through the workspace-wide entry point: arsenal run bcrp <command> ...,
and arsenal doctor bcrp --live to check this CLI still honours the contract.
Troubleshooting
"I don't know the series code"
That is what the catalog is for: bcrp catalog search <keyword>, or
bcrp catalog categories to browse. Codes are not guessable.
Not found for a code that looks right
BCRP codes encode frequency in their suffix (...PD daily, ...PM monthly).
A code exists only at its own frequency. Confirm with bcrp series describe.
"Cannot mix frequencies"
A single series get call takes series that share one frequency. Split daily and
monthly series into separate calls.
Accented series names look wrong on Windows
Fixed — the CLI forces UTF-8 output. If you still see mojibake, you are on an old
installed copy: uv tool install --force bcrp-mcp.
Documentation
Document | What's in it |
What changed in each release | |
Dev setup, the CLI contract, how to run the tests | |
What this server sends and where; how to report a vulnerability | |
Registry metadata for the official MCP registry | |
The CLI contract shared by every research server here |
Licence
MIT — see LICENSE.
Available Tools
7 toolsbcrp_describe_seriesA
Get metadata about 1–10 BCRP series without fetching all data points.
Returns series names, frequency, decimal precision, and available date range.
Use this to verify series codes exist and understand what they measure before
fetching large date ranges with bcrp_get_series.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | 'esp' (Spanish) or 'ing' (English) | esp |
| series_codes | Yes | List of 1–10 BCRP series codes to describe |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It communicates that the operation is lightweight ('without fetching all data points'), read-only in nature, and that it returns series names, frequency, decimal precision, and available date range. This is meaningful behavioral context, though it does not cover error behavior or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The core purpose is front-loaded, the return fields are listed compactly, and the usage guidance names the sibling tool explicitly. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with two parameters and no output schema, the description provides sufficient context: what it does, what it returns, when to use it, and how it differs from the related fetching tool. An agent can correctly decide to call it and knows what kind of result to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage of both parameters, including min/max items for series_codes and the language options. The description does not add parameter-level detail beyond what the schema states, so it meets the baseline without exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get metadata about 1–10 BCRP series without fetching all data points.' It clearly distinguishes this tool from bcrp_get_series by emphasizing the metadata-only scope and the batch limit, so an agent can tell what it is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool: 'Use this to verify series codes exist and understand what they measure before fetching large date ranges with bcrp_get_series.' This names the alternative tool and the exact condition that should trigger this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bcrp_get_latestA
Get the most recent data points for 1–10 BCRP series (same frequency).
Convenience wrapper around bcrp_get_series that fetches latest data without
specifying a date range, then returns only the last n_periods values.
Use this for quick snapshots of current economic conditions.
Example codes:
Daily rates/prices: PD04637PD, PD12301MD, PD04650MD, PD04701XD
Monthly monetary: PN00196MM, PN00496MM, PN00178MM
Quarterly growth: PN03503MQ, PN03501MQ
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | 'esp' (Spanish) or 'ing' (English) | esp |
| n_periods | No | Number of most recent periods to return (1–50). Default: 5. | |
| series_codes | Yes | List of 1–10 BCRP series codes (same frequency) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full disclosure burden, and it does disclose the two non-obvious behaviors: automatic date-range selection (fetches without specifying a date range) and truncation to the last n_periods values. It does not cover error behavior such as mixed frequencies or insufficient history, but the operational meaning of 'latest' is clearly explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded: core purpose first, then wrapper mechanism, usage context, and example codes. The example section is scoped and earns its place given the cryptic domain codes, though it is the longest section and could be tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has three well-documented parameters but no output schema or annotations, so the description must cover return and edge-case behavior. It states that it returns only the last n_periods values but does not describe the response shape, error cases (different frequencies, insufficient history), or rate limits. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds genuinely useful example codes for series_codes (PD04637PD, PN00196MM, PN03503MQ), which is real value for a parameter whose values are otherwise opaque numeric strings. It also reinforces the n_periods truncation semantics, pushing it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb (Get), a precise resource (most recent data points for 1-10 BCRP series), and a constraint (same frequency). It further identifies itself as a convenience wrapper around bcrp_get_series, which cleanly distinguishes it from sibling tools without requiring the reader to inspect other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The line 'Use this for quick snapshots of current economic conditions' provides explicit when-to-use context. The wrapper explanation ('fetches latest data without specifying a date range') implies that bcrp_get_series is the alternative when a date range is needed, though it stops short of an explicit when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bcrp_get_macro_snapshotA
Fetch a real-time snapshot of Peru's key macroeconomic indicators in one call.
Returns the latest values for: Daily indicators:
Exchange rate (TC Interbancario S/ por US$)
BCRP policy rate (%)
International reserves (millions US$)
Copper price (cUS$ per pound)
Lima stock market index (BVL)
Monthly indicators (last 3 months):
Total liquidity M2 (millions S/)
Private sector credit (millions S/)
Currency in circulation (millions S/)
Credit growth 12-month (%)
Use bcrp_get_series for custom date ranges or additional series.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | 'esp' (Spanish) or 'ing' (English) | esp |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It clearly indicates a read-only fetch operation ('Fetch'), and discloses what data is returned (daily vs. monthly, specific indicators, time spans). It doesn't discuss rate limits or output format, but for a simple read-only snapshot tool, the behavioral context is largely covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with a leading purpose sentence, clear bulleted breakdown of daily and monthly indicators, and a final one-line routing hint. Every sentence earns its place, and the structure makes the content scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one optional parameter, no output schema, and no annotations. The description compensates well by enumerating the returned indicator groups and values, specifying the monthly lookback period, and naming the sibling for extended use cases. Nothing essential for calling this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, language, is fully documented in the schema with its allowed values ('esp'/'ing') and default. The description adds nothing beyond the schema, but with 100% schema description coverage the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch a real-time snapshot of Peru's key macroeconomic indicators in one call.' It enumerates exactly which indicators are included, and explicitly names bcrp_get_series as the alternative for custom date ranges, distinguishing this tool from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when to use this tool (for a quick snapshot of standard daily and monthly indicators) and explicitly directs the agent to bcrp_get_series for custom date ranges or additional series. This gives concrete routing guidance relative to at least one sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bcrp_get_seriesA
Fetch time series data from the BCRP (Banco Central de Reserva del Perú) API.
Accepts 1–10 series codes of the SAME frequency. Series codes can be found using
bcrp_search_catalog or the bcrp://series-catalog resource.
Period format by frequency:
Monthly:
YYYY-M(e.g.2024-1= January 2024,2024-12= December 2024)Quarterly:
YYYY-Q(e.g.2024-1= Q1 2024,2024-4= Q4 2024)Daily:
DD-MM-YYYY(e.g.01-01-2025)Annual:
YYYY(e.g.2024)Leave both periods empty to get the most recent available data.
Important: All series in one call must have the same frequency (all daily, all monthly, etc.).
Example codes: PD04637PD (exchange rate), PD12301MD (policy rate), PN00196MM (total liquidity), PN03503MQ (GDP var%)
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Language for series names: 'esp' (Spanish) or 'ing' (English) | esp |
| end_period | No | End of date range. Same format as start_period. | |
| series_codes | Yes | List of 1–10 BCRP series codes (same frequency). E.g. ['PD04637PD', 'PD12301MD'] | |
| start_period | No | Start of date range. Format depends on series frequency: - Monthly: YYYY-M (e.g. '2020-1') - Quarterly: YYYY-Q (e.g. '2020-1') - Daily: DD-MM-YYYY (e.g. '01-01-2025') Leave empty for most recent data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It explains the 1–10 series limit, the same-frequency requirement, per-frequency period formats, and the empty-period behavior. It does not mention authentication, errors, or return shape, but for a data-fetching tool the provided behavior is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections and front-loaded purpose. It is slightly redundant by stating the same-frequency rule twice, but the overall length is justified by the frequency-format complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers code discovery, parameter constraints, and period formatting well. The main gap is not explaining how this tool relates to bcrp_get_latest or bcrp_get_series_long, and not describing what the response looks like, though that is somewhat inferable from the tool name.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine value: consolidated period format examples for monthly, quarterly, daily, and annual frequencies, concrete example series codes, and the explicit same-frequency rule. This goes beyond the schema's individual parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it fetches time series data from the BCRP API, naming the resource and the specific verb. It does not explicitly differentiate itself from siblings like bcrp_get_latest or bcrp_get_series_long, but the main purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context: how many series codes are accepted, how to discover codes via bcrp_search_catalog, the period format by frequency, and the same-frequency constraint. It does not explicitly state when to prefer bcrp_get_latest or bcrp_get_series_long, so it falls 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.
bcrp_get_series_longA
Fetch MANY BCRP series at once as one tidy long-format table.
Unlike bcrp_get_series, the codes do NOT have to share a frequency and the
limit is 50 rather than 10 — each series is fetched separately, so the
code→value mapping is always correct.
Returns rows of {series_code, period, date, value}. date is an
ISO-sortable rendering of BCRP's human period label. Missing observations
are omitted rather than emitted as nulls.
Set all_history=true to pull each series' entire published history (bounded by max_rows).
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | 'esp' (Spanish) or 'ing' (English) | esp |
| max_rows | No | Hard ceiling on returned rows. | |
| end_period | No | End of range, same format as start_period. | |
| all_history | No | Fetch each series' full published history. | |
| series_codes | Yes | 1–50 BCRP series codes; frequencies may be mixed. | |
| start_period | No | Start of range (Daily DD-MM-YYYY, Monthly/Quarterly YYYY-M). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the row schema, the date rendering, that missing observations are omitted rather than null, that each series is fetched separately, and that all_history is bounded by max_rows.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, then clearly moves to sibling differentiation, return semantics, and parameter guidance. Every sentence adds needed information and no filler is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description specifies the exact returned row fields and their semantics, explains key edge-case behavior, and names the main alternative. Given the schema already documents parameters and formats, this is complete enough for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, and the description adds meaningful extra context: series_codes can mix frequencies up to 50, all_history behavior is bounded by max_rows, and the output mapping is always correct because series are fetched separately. This goes beyond simply restating the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch MANY BCRP series at once as one tidy long-format table.' It also explicitly contrasts itself with bcrp_get_series, so an agent can immediately tell this tool apart from the closest sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative bcrp_get_series and gives concrete selection criteria: use this when series codes do not share a frequency or when more than 10 codes are needed. It also provides an explicit trigger for all_history=true and notes the max_rows bound.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bcrp_list_catalog_categoriesA
List all available categories in the BCRP series catalog.
Returns category IDs (usable as the category filter in bcrp_search_catalog),
the number of series per category, and their frequency.
Categories include: exchange rates, interest rates, international reserves, liquidity (M1/M2), credit, financial markets, commodities, and GDP.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral disclosure burden. It discloses that this is a read-only listing operation and describes the returned elements: category IDs, number of series per category, and frequency. However, it does not specify output shape, ordering, or any edge cases, though this is acceptable for a simple parameterless tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: one sentence states the purpose, one states the outputs and downstream use, and one lists example categories. Every sentence adds useful information, and the category list helps set expectations without unnecessary padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter catalog-listing tool, this definition is nearly complete: it explains the purpose, the output elements, and how the results connect to a sibling tool. The only slight gap is ambiguity in 'their frequency'—whether that means data update frequency or frequency of occurrences—and the lack of an explicit output schema, but neither prevents correct selection or invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema already has 100% coverage for that fact. The description adds no parameter-level detail because none is needed. A baseline of 4 is appropriate for a zero-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a clear action and resource: 'List all available categories in the BCRP series catalog.' It also states that the returned category IDs are usable as the `category` filter in `bcrp_search_catalog`, which differentiates this tool as a lookup/enumeration utility rather than a series retrieval or search tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool: when an agent needs the full set of valid catalog categories, especially before calling bcrp_search_catalog. It connects the output to a sibling tool but does not explicitly state when not to use it or list alternative tools, so it lacks a formal exclusion statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bcrp_search_catalogA
Search the built-in catalog of important BCRP series by keyword.
Returns matching series codes, names, descriptions, frequency, units, and
the period format needed to query them with bcrp_get_series.
Example queries:
'tipo de cambio' → exchange rate series
'tasa referencia' → BCRP policy rate
'reservas internacionales' → international reserves
'cobre' → copper price
'liquidez' → monetary liquidity (M1/M2)
'credito' → private sector credit
'BVL' → Lima stock exchange index
'PBI' → GDP quarterly series
Use bcrp_list_catalog_categories to see all available categories.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search term (Spanish or English). E.g. 'exchange rate', 'tipo de cambio' | |
| category | No | Filter by category ID. E.g. 'exchange_rates_daily', 'liquidity_monthly'. Use bcrp_list_catalog_categories to see all options. | |
| frequency | No | Filter by frequency: 'daily', 'monthly', 'quarterly', 'annual' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It states what is returned — series codes, names, descriptions, frequency, units, and period format — and how that output connects to bcrp_get_series. It does not discuss result limits or matching semantics, but the disclosed scope is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and return value, followed by a compact list of useful examples and a cross-reference to a related tool. Every sentence and bullet earns its place without digression.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter search tool with no output schema, the description explains the return fields, provides representative queries, and points to the relevant sibling tool for category browsing. It is sufficiently complete for an agent to invoke it correctly, though it leaves minor details like result limits unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline for parameter semantics is 3. The description adds example query intents, but does not substantially extend the parameter meaning beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search the built-in catalog of important BCRP series by keyword.' It also lists the exact fields returned, clearly distinguishing it from sibling tools such as bcrp_list_catalog_categories and bcrp_get_series.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context via example queries and explicitly routes the agent to bcrp_list_catalog_categories to explore categories. It does not explicitly state an alternative for when a series code is already known, but the search intent is clear.
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.
7 tool updates
v0.1.0- First observed
bcrp_describe_series - First observed
bcrp_get_latest - First observed
bcrp_get_macro_snapshot - First observed
bcrp_get_series - First observed
bcrp_get_series_long - First observed
bcrp_list_catalog_categories - First observed
bcrp_search_catalog
TDQS
Scored across 7 tools
The data-retrieval tools overlap: bcrp_get_series, bcrp_get_latest, bcrp_get_series_long, and bcrp_get_macro_snapshot all return series data. Descriptions clarify their intended use cases, but an agent could easily pick bcrp_get_latest when bcrp_get_series would suffice, since get_series already supports fetching most recent data.
All tools follow a clean bcrp_<verb>_<object> snake_case pattern, e.g. get_series, search_catalog, list_catalog_categories, describe_series. The naming is predictable and consistent across the entire set.
Seven tools is well-scoped for a BCRP economic data server. Each tool fills a distinct role: catalog discovery, metadata lookup, series retrieval, latest values, long-form multi-series retrieval, and a curated macro snapshot.
The tool surface covers the full workflow: discover series via search/categories, inspect metadata, fetch data in multiple formats, and get quick snapshots. There are no obvious dead ends or missing operations for the stated purpose of accessing BCRP time series.
Maintenance
Related MCP Connectors
Banco Central de Reserva del Perú (BCRP) statistics series API MCP. Keyless.
Live & historical FX rates and currency conversion for AI agents. No API keys.
Live & historical FX rates and currency conversion for AI agents. No API keys.
Equip AI with tools for researching economic data from Federal Reserve Economic Data (FRED).
Related MCP Servers
- FlicenseAqualityDmaintenanceModel Context Protocol server that provides access to economic and financial time series data from Peru's Central Reserve Bank, enabling AI agents to search, explore, and analyze Peru's economic indicators through a standardized interface.34-
- AlicenseAqualityBmaintenanceProvides access to over 5,000 macroeconomic indicators from the Banco Central de Reserva del Perú (BCRP) statistical database. It enables AI agents to search for indicators, fetch time-series data, and generate professional economic charts.41MIT
- AlicenseAqualityDmaintenanceEnables AI agents to access SEC EDGAR filings, US Treasury rates, BLS labor statistics, and economic indicators without API keys.621 npmMIT
- AlicenseAqualityBmaintenanceConnects MCP-compatible AI agents to Peru's official statistics platform (INEI Estadist), providing access to Census 2017 data, population indicators, and geographic profiles for all Peruvian departments, provinces, and districts without requiring an API key.9MIT