Skip to main content
Glama

MCP Badge License: MIT Python 3.11+ MCP No Auth Required

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?"

bcrp_get_latest

"Plot Peru's GDP over the last ten years"

bcrp_get_series

"What's the current state of the Peruvian economy?"

bcrp_get_macro_snapshot

"I need the series code for inflation"

bcrp_search_catalog

"Export FX, inflation and GDP together as one CSV"

bcrp_get_series_long

"What period does this series actually cover?"

bcrp_describe_series

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 it

Related MCP server: mcp-bcrp

Quickstart — one command

npx bcrp-mcp

That installs all three pieces, which are designed to work together:

Piece

What it is

bcrp-mcp

The MCP server, so AI clients can query BCRPData

bcrp

The CLI — same tools, for humans and scripts

bcrp skill

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 checkout
uv tool install bcrp-mcp     # recommended
pipx install bcrp-mcp
pip install bcrp-mcp

The 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 higher
# Windows
winget install astral-sh.uv

# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

Installation

Option A — uvx (zero configuration)

uvx bcrp-mcp

# Upgrade later
uv tool upgrade bcrp-mcp

Option B — pip

pip install bcrp-mcp
bcrp-mcp   # starts the server

Option 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-mcp

Command-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

--json

Raw tool-output dict — identical to what the MCP tool returns

--no-color

Disable ANSI colour (also honours NO_COLOR)

--ascii

Plain ASCII tables instead of Unicode box characters

--lang esp|ing

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.py

Configuration (Optional)

All settings have sensible defaults. Override via environment variables or .env file:

Variable

Default

Description

BCRP_CACHE_TTL

300

Response cache in seconds (0 = disabled)

BCRP_TIMEOUT

30

HTTP timeout in seconds

BCRP_MAX_RETRIES

3

Retries on transient errors

BCRP_LANGUAGE

esp

Default language: esp (Spanish) or ing (English)

LOG_LEVEL

INFO

DEBUG · INFO · WARNING · ERROR

No API key required — BCRPData is fully open access.


Configuration by Client

Claude Desktop

Config file:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • macOS: ~/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-mcp

Generic stdio

command:  uvx
args:     ["bcrp-mcp"]

Available Tools (6)

Tool

Description

bcrp_get_series

Fetch 1–10 series with optional date range (all same frequency)

bcrp_get_latest

Get the most recent N data points for 1–10 series

bcrp_describe_series

Metadata only: series names, frequency, available date range

bcrp_search_catalog

Search built-in catalog of important series by keyword

bcrp_list_catalog_categories

List all catalog categories with series counts

bcrp_get_macro_snapshot

Real-time snapshot of Peru's key macroeconomic indicators


Available Prompts (3)

Prompt

Arguments

Description

inflation_and_monetary_analysis

start_year, end_year

Structured workflow: policy rate, liquidity (M2), credit growth

exchange_rate_analysis

start_date, end_date

Exchange rate dynamics, reserves, dollarization

economic_growth_analysis

start_year, end_year

GDP growth, monetary multiplier, credit cycle


Available Resources (3)

Resource URI

Contents

bcrp://api-guide

Complete API reference: URL structure, period formats, response schema

bcrp://period-formats

Quick reference table for all period formats by frequency

bcrp://series-catalog

Curated catalog of important series with codes, names, units


Key Series Codes

Daily (format: DD-MM-YYYY)

Code

Indicator

Unit

PD04637PD

TC Interbancario Compra (USD/PEN)

S/ por US$

PD04638PD

TC Interbancario Venta (USD/PEN)

S/ por US$

PD12301MD

Tasa de Referencia BCRP

% anual

PD04692MD

Tasa Interbancaria, S/

% anual

PD04650MD

Reservas Internacionales Netas

Millones US$

PD38026MD

Índice General Bursátil BVL

Índice

PD04701XD

Precio del Cobre

cUS$ por libra

PD04705XD

Precio del Petróleo WTI

US$ por barril

PD04721XD

Índice Dow Jones

Índice

Monthly (format: YYYY-M)

Code

Indicator

Unit

PN00196MM

Liquidez Total (M2)

Millones S/

PN00178MM

Circulante (M0)

Millones S/

PN00190MM

Liquidez en Soles

Millones S/

PN00180MM

Liquidez var% 12 meses

% anual

PN00496MM

Crédito Sector Privado

Millones S/

PN00500MM

Crédito var% 12 meses

% anual

Quarterly (format: YYYY-Q)

Code

Indicator

Unit

PN03503MQ

PBI Nominal var%

% trimestral

PN03501MQ

Liquidez MN var%

% trimestral

PN03502MQ

Emisión Primaria var%

% trimestral

PN03504MQ

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-formats resource.

  • 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/ -v

Troubleshooting

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.toml

Data 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> --json

The 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 clear

Recipes

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 json

Or 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

CHANGELOG.md

What changed in each release

CONTRIBUTING.md

Dev setup, the CLI contract, how to run the tests

SECURITY.md

What this server sends and where; how to report a vulnerability

server.json

Registry metadata for the official MCP registry

../ARSENAL-SPEC.md

The CLI contract shared by every research server here

Licence

MIT — see LICENSE.

Available Tools

7 tools
bcrp_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNo'esp' (Spanish) or 'ing' (English)esp
series_codesYesList of 1–10 BCRP series codes to describe

TDQS

A4.5/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 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNo'esp' (Spanish) or 'ing' (English)esp
n_periodsNoNumber of most recent periods to return (1–50). Default: 5.
series_codesYesList of 1–10 BCRP series codes (same frequency)

TDQS

A4.2/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 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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNo'esp' (Spanish) or 'ing' (English)esp

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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%)

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNoLanguage for series names: 'esp' (Spanish) or 'ing' (English)esp
end_periodNoEnd of date range. Same format as start_period.
series_codesYesList of 1–10 BCRP series codes (same frequency). E.g. ['PD04637PD', 'PD12301MD']
start_periodNoStart 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

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNo'esp' (Spanish) or 'ing' (English)esp
max_rowsNoHard ceiling on returned rows.
end_periodNoEnd of range, same format as start_period.
all_historyNoFetch each series' full published history.
series_codesYes1–50 BCRP series codes; frequencies may be mixed.
start_periodNoStart of range (Daily DD-MM-YYYY, Monthly/Quarterly YYYY-M).

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 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.

Conciseness5/5

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.

Completeness4/5

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.

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 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.

Purpose5/5

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.

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: 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch term (Spanish or English). E.g. 'exchange rate', 'tipo de cambio'
categoryNoFilter by category ID. E.g. 'exchange_rates_daily', 'liquidity_monthly'. Use bcrp_list_catalog_categories to see all options.
frequencyNoFilter by frequency: 'daily', 'monthly', 'quarterly', 'annual'

TDQS

A4.2/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 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 7 tool updatesv0.1.0
    • First observedbcrp_describe_series
    • First observedbcrp_get_latest
    • First observedbcrp_get_macro_snapshot
    • First observedbcrp_get_series
    • First observedbcrp_get_series_long
    • First observedbcrp_list_catalog_categories
    • First observedbcrp_search_catalog

TDQS

A4.3/5.0

Scored across 7 tools

Disambiguation3/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Model 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.
    3
    4
    -
  • A
    license
    A
    quality
    B
    maintenance
    Provides 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.
    4
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to access SEC EDGAR filings, US Treasury rates, BLS labor statistics, and economic indicators without API keys.
    6
    21 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Connects 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.
    9
    MIT