amar-mcp
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., "@amar-mcpWhat is Iran's official inflation rate and what's driving it?"
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.
amar-mcp: Statistical Centre of Iran (مرکز آمار ایران) inflation, unemployment and census MCP server
amar-mcp is an unofficial, read-only MCP server that gives AI agents the official numbers of the Statistical Centre of Iran (amar.org.ir). Its 12 tools return the consumer price index and inflation (monthly, year-on-year, 12-month average, by CPI group, household region and province), unemployment and participation rates, GDP growth, producer prices, the monthly macro-indicators workbook (trade, housing price and rent, money, budget, household income and spending, CPI by decile), census population by province and county, news, the publishing calendar, and any Excel table of any release. No API key or account is needed. It works in Claude, Cursor, Copilot and any other MCP client.
For AI agents · Quick start · Tools · FAQ · فارسی
For AI agents
What: unofficial MCP server (model context protocol) for amar.org.ir, Iran's national statistics portal: official CPI and inflation, labour force survey rates, census 1395 population, the release catalog and calendar, and a reader for the portal's Excel tables.
Install:
uvx amar-mcporclaude mcp add amar -- uvx amar-mcp. Transport: stdio. Needs uv (Python 3.10+).Auth: none. Optional
AMAR_MCP_PROXY(HTTP proxy URL, or a comma-separated list); system proxy settings are ignored.Access: read-only. It cannot log in or change anything, so no confirmation is needed before calling any tool.
Network: amar.org.ir answers only from inside Iran (it drops foreign IPs), so run the server on an Iranian connection or set
AMAR_MCP_PROXYto an Iranian proxy.Tools: 12, all prefixed
am_. Typical sequences:am_inflation->am_inflation_groups;am_gdp,am_ppi;am_indicators(topic -> table);am_search->am_release->am_table;am_calendarfor "when is the next release".Use when: the user asks what Iran's official inflation, CPI, unemployment or population is, what drives inflation (food, housing...), how a province compares, when the Statistical Centre publishes something, or wants any table from amar.org.ir.
Do not use when: the user wants central-bank data, exchange or gold prices (other servers cover those), or live market data. The monthly CPI Excel series trails the PDF report by about a week;
am_inflationflags this innewer_reportand reads the newer month's national figures from the PDF.Output: compact JSON. Periods are Jalali (
1405-06= Shahrivar 1405). Percentages are percent. Names and titles are Persian as the Centre has them.Machine-readable:
server.json.
Related MCP server: iran-tax-mcp
Example
You: What is Iran's official inflation, and what drives it?
Agent: calls
am_inflation()andam_inflation_groups()For Shahrivar 1405 the Statistical Centre reports 4.24% monthly, 89.8% year-on-year and 73.6% for the 12-month average. Food and tobacco rose 122% year-on-year, transport 115%, housing 38%.
Numbers from a live call on 2026-11-01.
Other prompts: "unemployment rate by quarter", "population of Yazd province and its counties", "inflation in Fars province", "when is the next CPI release", تورم نقطه به نقطه مسکن شهری چقدر است؟, نرخ بیکاری آخرین فصل؟
Quick start
You need uv. No API key or account.
Claude Code: claude mcp add amar -- uvx amar-mcp
Claude Desktop, Cursor, Windsurf, Gemini CLI: add
{
"mcpServers": {
"amar": { "command": "uvx", "args": ["amar-mcp"] }
}
}VS Code: .vscode/mcp.json with {"servers": {"amar": {"type": "stdio", "command": "uvx", "args": ["amar-mcp"]}}}.
Codex CLI: codex mcp add amar -- uvx amar-mcp. Anything else: uvx amar-mcp, or pip install amar-mcp and run amar-mcp.
Tools
Tool | What it does |
| Official CPI index and inflation per month (monthly, point-to-point, 12-month average) by household region, CPI group or province |
| Compare inflation across CPI groups (food, housing, transport...) for one month |
| Unemployment, youth unemployment and participation rates by quarter, total, urban and rural |
| Population and households by province, or by county in one province, from the 1395 census |
| Search the portal's releases by Persian title words, year, frequency, type and topic (a year, frequency or kind alone searches the portal's own releases) |
| One release: topic, period and its Excel, PDF and Word files |
| Read any Excel table of a release as compact rows (sheet list, filter, paging) |
| The publishing calendar: which statistic comes out on which day of a month |
| GDP growth by quarter or year with agriculture, industry, oil and gas, services; levels in billion rials |
| Producer price index by quarter and sector (index, quarterly, year-on-year, 4-quarter average) |
| The monthly macro workbook (newest release that has an Excel file): trade, housing price and rent, money, budget, household spending, Gini, CPI by decile and province, energy, stock market |
| Latest news and press releases of the Centre, or the text of one item |
All 12 tools are annotated readOnlyHint: true.
How it works
AI agent ──MCP/stdio──▶ amar-mcp ──HTTPS──▶ amar.org.ir (release pages, Excel files)The portal has no JSON API, so the server reads its catalog pages and downloads the Excel files that the portal itself offers, then parses them. It sends browser-like requests (Chrome TLS fingerprint), makes at most 3 concurrent requests, caches answers for 5 minutes and refuses files over 25 MB. The site's certificate chain is incomplete (it omits an intermediate); the server ships that public intermediate certificate to verify the connection normally.
FAQ
Why does it fail from outside Iran? amar.org.ir does not answer foreign IPs. Run it on an Iranian connection or set AMAR_MCP_PROXY.
Why is the newest month missing in am_inflation? The Centre publishes a PDF report first and updates the Excel series about a week later. The answer's newer_report names that release (use am_release for the PDF link); it also carries that month's national index and inflation, read from the PDF.
Are these the same as central-bank figures? No. These are the Statistical Centre's figures; the Central Bank of Iran publishes its own.
Is it affiliated with the Centre? No. It reads public pages and files, no login.
فارسی
amar-mcp یک سرور MCP غیررسمی و فقطخواندنی برای درگاه ملی آمار (مرکز آمار ایران، amar.org.ir) است. با آن میتوانید تورم و شاخص قیمت مصرفکننده (ماهانه، نقطهبهنقطه، متوسط ۱۲ ماه؛ به تفکیک گروه کالا، مناطق شهری و روستایی و استان)، نرخ بیکاری و مشارکت، جمعیت استانها و شهرستانها در سرشماری ۱۳۹۵، تقویم انتشار و هر جدول اکسل منتشرشده را بپرسید.
نصب: claude mcp add amar -- uvx amar-mcp (نیاز به uv). درگاه مرکز آمار فقط از داخل ایران پاسخ میدهد؛ سرور را روی اینترنت ایران اجرا کنید یا AMAR_MCP_PROXY را روی یک پروکسی ایرانی بگذارید.
Author: Sepehr Radmard (سپهر رادمرد), github.com/sepehr071, linkedin.com/in/sepehr-radmard. MIT license.
Available Tools
12 toolsam_calendarRelease calendarARead-onlyIdempotent
Get the Statistical Centre of Iran's publishing calendar: which statistics come out on which day of a month.
Use it to answer "when is the next inflation (or labour force, GDP...) release". Each item gives the product,
the responsible office, the month and day it is scheduled for and the period it covers. id is set once the
release is published: pass it to am_release. Dates are Jalali (month 1 = فروردین). Planned dates can shift.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Jalali year of the calendar | |
| month | No | Month number 1-12 or Persian name (e.g. 'آبان'); omit for the whole year | |
| query | No | Persian words in the product name, all must match, e.g. 'نیروی کار' or 'مصرفی' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, but the description adds real substance beyond them: `id` is only populated after publication (so the field is conditionally absent), the calendar is Jalali with month 1 = فروردین, and planned dates can shift. That last caveat is the kind of data-reliability trait annotations cannot express.
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?
Front-loaded with the purpose, then the use case, then the item shape and caveats, in four tight sentences with no filler. Slightly dense with backtick and parenthetical asides, but every sentence carries information.
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?
With no output schema, the description accepts the burden of describing the returned item's fields and the conditional `id`, which it does. It leaves result volume, ordering and whether the whole-year default paginates unstated, a minor gap for a calendar lookup.
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 schema already explains year, month (1-12 or Persian name, omit for whole year) and the all-terms-must-match `query`. The description adds only the Jalali convention note, which largely duplicates the schema's own 'Jalali year of the calendar' wording and never mentions the `query` filter at all, so baseline 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?
States a specific verb and resource: 'Get the Statistical Centre of Iran's publishing calendar: which statistics come out on which day of a month.' It also enumerates what each item contains (product, responsible office, month/day, covered period), which is far more than the name 'am_calendar' alone conveys.
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?
Gives an explicit use case ('Use it to answer "when is the next inflation (or labour force, GDP...) release"') and routes the agent downstream ('`id` is set once the release is published: pass it to am_release'). Missing an explicit when-not or a contrast against am_search/am_news, but the scenario is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
am_gdpGDP growth (quarterly)ARead-onlyIdempotent
Get Iran's official GDP growth by quarter or year, with the main sectors, latest first.
From the Centre's quarterly national accounts (base year 1400 = 2021). growth_pct is the change at constant
prices on the same quarter a year earlier; gdp_ex_oil_pct leaves out crude oil and gas. Sector growth is
for agriculture, industry (includes oil, mining, manufacturing, construction) and services. Levels are in
billion rials. For the full tables (value added by activity, expenditure side) use am_table with the
source.release id.
| Name | Required | Description | Default |
|---|---|---|---|
| periods | No | How many latest quarters (or years) | |
| frequency | No | quarterly national accounts or yearly totals | quarterly |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds substantial domain context: base year 1400 = 2021, that growth_pct is a constant-price change on the same quarter a year earlier, what gdp_ex_oil_pct excludes, which activities sit under 'industry', and that levels are in billion rials. With no output schema, these field definitions and the 'latest first' ordering are exactly what the agent needs to interpret results.
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 core purpose is front-loaded in the first sentence, with definitions and the am_table escape hatch following. It is dense and mostly earns its length, though the parenthetical listing of industry sub-sectors is slightly padded.
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 two-parameter read tool with no output schema, the description supplies the return-value semantics (measure definitions, units, sector coverage, ordering) and the fallback route for deeper data. Nothing an agent needs to call or interpret this tool 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?
Schema coverage is 100%, so both parameters are already documented in structured data. The description reinforces the meaning of 'latest first' and the quarter-vs-year distinction but adds no format or constraint detail beyond the schema, so the baseline 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?
States a specific verb and resource ('Get Iran's official GDP growth by quarter or year') plus the content returned ('main sectors, latest first'). This clearly separates it from siblings like am_inflation, am_labour_force, and am_table, which cover different datasets.
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?
Explicitly routes the agent elsewhere for detailed breakdowns: 'For the full tables (value added by activity, expenditure side) use am_table with the `source.release` id.' That is a concrete alternative with a condition, though it does not cover other plausible near-neighbours such as am_indicators.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
am_indicatorsMacro indicatorsARead-onlyIdempotent
Read the Centre's monthly macro-indicators workbook: trade, housing, money, budget, prices by decile and more.
The workbook (شاخص های کلان اقتصادی و اجتماعی کشور) stacks about 100 small tables on 12 subjects, mostly
annual and recent quarters or months. Call with no arguments for the topics, with topic for its table list
(n, title), then with topic and table for the data: columns carry the combined header text, rows are
[label, values...]. Dash and '000' placeholders come back as null. Data runs to different dates per table
(housing prices stop at 1400, trade at 1404); the release it came from is in source. The newest file
is found by title, so no id is needed.
| Name | Required | Description | Default |
|---|---|---|---|
| find | No | Only rows whose first cell contains this text (a year, province, month...) | |
| last | No | Rows to return: the latest ones in a time table, else the first | |
| table | No | Table number from the topic's list, or Persian words of its title (e.g. 'اجاره', 'دهک') | |
| topic | No | Subject sheet: population (and labour, education), household (income, expenditure, Gini, deciles), accounts (national accounts), prices (CPI by decile or province, PPI, food prices), money, budget (government finance), trade (exports, imports, balance of payments), stock, energy, industry, housing (permits, price and rent), agriculture. Omit to list all topics. | |
| max_cols | No | Columns to return | |
| col_offset | No | Skip this many columns on the left (wide tables) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so safety is covered; the description adds genuinely new behavior: dash and '000' placeholders are returned as null, data ends at different dates per table, the release is exposed in `source`, and the newest file is located by title rather than id. It does not discuss truncation limits beyond the row/column parameters, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The workbook purpose and the call sequence are front-loaded, and the two paragraphs earn most of their space with caveats about placeholders, per-table date ranges and output row shape. The Persian title and topic parentheticals add some bulk but carry real disambiguation value.
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?
There is no output schema, yet the description explains the return shape (combined header columns, rows as [label, values...]), the null encoding for placeholders, uneven date coverage across tables, and where provenance lives. For a 6-parameter read-only research tool that is enough for an agent to call it correctly in a single pass.
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 schema already documents find, last, table, topic, max_cols and col_offset, establishing a baseline of 3. The description adds procedural meaning by linking topic and table into a drill-down and noting no id is needed because the newest file is found by title, but it does not deepen the filtering or slicing parameters further.
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 states a specific verb and resource: read the Centre's monthly macro-indicators workbook, and it spells out the 12 subject areas (trade, housing, money, budget, prices) plus the ~100 stacked tables. It does not explicitly name a sibling to distinguish itself from, e.g. am_table or am_inflation, so it stays at 4 rather than 5.
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 gives a clear progressive call sequence: no arguments lists topics, `topic` returns the table list, and `topic` + `table` returns data. What is missing is any exclusion or alternative routing (when to use am_inflation or am_ppi instead of this workbook), so it is strong context without explicit 'when not to use'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
am_inflationInflation (CPI)ARead-onlyIdempotent
Get Iran's official consumer price index (CPI) and inflation from the Statistical Centre of Iran, latest first.
Per month: the index, the change on the previous month (monthly_pct), the change on the same month a year
earlier (point_to_point_pct, the headline "inflation" figure) and the change of the 12-month average on the
previous 12 months (twelve_month_avg_pct, "annual inflation"). Use region and group for a breakdown (food,
housing, ...) or province for one province (no index there, no groups). newer_report appears when the portal
has published a later month as PDF before its Excel series is updated.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | A CPI group: Persian name part (e.g. 'مسکن', 'خوراک', 'حمل') or its 2-digit code ('04'). Omit for the all-items index. See am_inflation_groups for the list. | |
| months | No | How many latest months to return | |
| region | No | Households: all of Iran, urban or rural | national |
| province | No | Province name (e.g. 'تهران', 'خوزستان'): returns that province's all-items inflation instead |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior; the description adds valuable return semantics such as monthly_pct, point_to_point_pct, and twelve_month_avg_pct, plus the newer_report edge case. It does not cover rate limits, error behavior, or data revision caveats, so it is useful but not fully rich.
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?
Front-loads the core retrieval purpose, then groups output measures and parameter guidance in a compact flow with no filler. The dense technical detail is warranted because no output schema is provided.
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?
No output schema exists, so the description carries return-value explanation and does so for all four per-month measures plus newer_report. With 100% schema coverage on inputs and annotations covering safety, an agent has enough information to invoke the tool 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 coverage is 100%, so the baseline is 3, but the description adds cross-parameter constraints: region and group enable breakdowns while province is a distinct all-items series with no index and no groups. The months parameter is only summarized as latest months and is not expanded beyond what the schema already says.
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?
Opens with a specific verb and resource — Iran's official CPI and inflation from the Statistical Centre of Iran — and names the exact per-month measures. This clearly distinguishes it from sibling price tools such as am_ppi and from the group-list helper am_inflation_groups.
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?
Explains how to choose region and group for a breakdown versus province for a single-province all-items series, including the limitation that province results have no index and no groups. It does not explicitly route the agent to or away from sibling tools like am_ppi or am_inflation_groups, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
am_inflation_groupsInflation by CPI groupARead-onlyIdempotent
Compare official inflation across CPI groups (food, housing, transport, health...) for one month.
For each main group: the index, the monthly change, the change on the same month a year earlier
(point_to_point_pct) and the 12-month average change. Use it to see what drives inflation. For one group's
history over many months use am_inflation with group.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | Month as YYYY-MM (e.g. '1405-06'); omit for the latest month | |
| region | No | Households: all of Iran, urban or rural | national |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the lower bar applies. The description adds genuine value by disclosing the returned metrics (index, monthly change, point_to_point_pct, 12-month average), which matters because there is no output schema. It stops short of noting units, group coverage, or ordering.
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?
Two short paragraphs, front-loaded with the action and scope, followed by a compact return-value summary and the routing note. Every clause carries information; there is no filler.
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 two-parameter, annotation-covered read tool with no output schema, the description supplies both the routing rule and the shape of the result, which is the main gap an agent would otherwise face. Minor omissions (units, whether all groups are always returned, default-month behavior already in schema) keep it from a 5.
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%, with both `period` (YYYY-MM format, omit for latest) and `region` (enum of national/urban/rural) fully documented in the schema. The description only reinforces the one-month scope and the `group` reference without adding syntax or edge-case detail, so the baseline 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 gives a specific verb and resource ('Compare official inflation across CPI groups') and enumerates the group examples (food, housing, transport, health). It also names the sibling that serves a different purpose (am_inflation with `group` for one group's multi-month history), so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the intended use case ('see what drives inflation') and explicitly routes the alternative case to am_inflation with the `group` parameter. The single-month scope constraint versus multi-month history is spelled out rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
am_labour_forceLabour forceARead-onlyIdempotent
Get Iran's official unemployment and labour-force participation rates by quarter, latest first.
From the Statistical Centre's labour force survey: percent of the active population (unemployment) or of the population 15+ (participation), for the whole country, urban and rural areas. The newest quarter lags about two to three months. For other labour tables (employment by sector, hours, wages) use am_search.
| Name | Required | Description | Default |
|---|---|---|---|
| measure | No | unemployment = rate for people 15 and older; participation = economic participation rate; youth_unemployment = ages 15-24; all = unemployment and participation | all |
| quarters | No | How many latest quarters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this a safe, idempotent, open-world read, so the bar is lower; the description nonetheless adds real context the annotations cannot: the Statistical Centre survey as provenance, what each rate is measured against (active population vs population 15+), full geographic coverage, and a two-to-three-month publication lag. It does not describe the returned record shape, which matters because no output schema exists.
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?
Three tight sentences, front-loaded with what/scope/ordering, then source and measurement definitions, then freshness and the alternative tool. Nothing is redundant and no sentence could be dropped without losing information an agent needs.
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 two-parameter, annotation-covered read tool with no output schema, the description supplies provenance, definitions, lag and routing to the right alternative. The remaining gap is the returned data shape and the undocumented 'youth_unemployment' option, both of which an agent must infer from the schema alone.
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 3 is the floor, but the description genuinely adds meaning by specifying the denominators behind each measure (percent of active population for unemployment, percent of population 15+ for participation) and by establishing the latest-first ordering that gives the 'quarters' count its direction. It never mentions the 'youth_unemployment' measure, leaving that enum value explained only by 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?
Names a specific verb and resource ('Get Iran's official unemployment and labour-force participation rates by quarter'), states scope (whole country, urban, rural), ordering (latest first), and explicitly separates itself from am_search. An agent can distinguish it from am_inflation, am_gdp or am_population without opening the schema.
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?
Gives both a positive condition (labour-force rates) and a negative routing rule: other labour tables such as employment by sector, hours or wages belong to am_search. It does not cover the remaining siblings (e.g. am_population or am_indicators) that might also look plausible to an agent, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
am_newsNews and press releasesARead-onlyIdempotent
List the latest news and press releases of the Statistical Centre of Iran, or read one item.
Without id it returns the newest items (id, title, summary, GMT time, url) from the portal's news feed;
query keeps only items whose title or summary has all those words. With id it returns the item's date,
categories and text (long items are cut at 4000 characters). Use it for announcements such as census news,
interviews and release notes; the numbers themselves are in the data tools.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | News item id from the list, to read its text | |
| count | No | How many latest items to fetch for the list (newest first) | |
| query | No | Persian words that must all appear in the title or summary (list mode) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), and the description adds real behavior on top: the exact fields returned per mode, all-words matching semantics for `query` on title or summary, and the 4000-character truncation on long item text. Truncation and filter semantics are exactly the kind of detail annotations cannot express.
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?
Front-loaded with purpose and mode split, then details per mode, then use-case routing; every sentence carries information. It is somewhat dense, packing field lists and limits into parenthetical clauses, but nothing is filler.
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?
There is no output schema, so the description must describe returns, and it does so for both modes (id, title, summary, GMT time, url; date, categories, text). For a 3-optional-parameter read tool with full annotation coverage, nothing an agent needs in order to call it 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?
Schema coverage is 100%, so baseline is 3, but the description adds cross-parameter semantics the schema does not: `id` switches the call from list to single-item mode, and `query` is scoped to list mode with conjunctive word matching. It does not add detail on `count` beyond what the schema's 'newest first' description already states.
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?
Names a specific verb and resource ('List the latest news and press releases of the Statistical Centre of Iran, or read one item') and explicitly splits the two operating modes by the presence of `id`. The closing clause routes numeric needs to the data siblings, so an agent can distinguish it from am_inflation/am_gdp/am_search without opening any schema.
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?
Gives clear positive context ('announcements such as census news, interviews and release notes') and an explicit exclusion ('the numbers themselves are in the data tools'). It stops short of naming which sibling to call for data, so the routing is directional rather than precise, which keeps it at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
am_populationPopulation of provinces and countiesARead-onlyIdempotent
Get population and households by province, or by county within one province, from Iran's 1395 census.
The latest published full census (Aban 1395 = 2016) with total, urban, rural, male and female population and households. The 1405 census is under way and not published yet. For projections to later years or age groups use am_search ('پیش بینی جمعیت') and am_table.
| Name | Required | Description | Default |
|---|---|---|---|
| province | No | Province name (e.g. 'فارس', 'گیلان'): lists its counties instead of all provinces |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds material context beyond them: the exact census vintage, the fact that a newer census exists but is not released, and the exact measures returned (total, urban, rural, male, female, households). It does not discuss return format or coverage gaps per province, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core capability, then the data vintage caveat, then the alternative-tool routing. Nothing is repeated from the schema and no sentence is filler.
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?
With no output schema and only one parameter, the description appropriately compensates by enumerating the measures returned and the temporal boundary of the data. It stops short of stating units, count of provinces/counties, or what a county-level record looks like, which would fully close the loop.
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% and the single parameter is already described, so the baseline is 3. The description nonetheless restates the mode switch — omitting province lists all provinces, supplying one lists its counties — which confirms the default behavior an agent needs in order to decide whether to pass the argument.
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?
States a concrete verb and resource ('Get population and households'), names the unit of analysis (province, or county within one province), and pins the source ('Iran's 1395 census'). The agent can distinguish this from am_search/am_table data tools without opening the schema.
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?
Explicitly bounds the data to the latest published full census (Aban 1395 = 2016), warns that the 1405 census is unpublished, and routes projection/age-group needs to am_search ('پیش بینی جمعیت') and am_table. This is explicit when-to-use, when-not, and named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
am_ppiProducer price indexARead-onlyIdempotent
Get Iran's producer price index (PPI, factory-gate prices) by quarter and sector, latest first.
Per quarter: the index (100 = 1400), the change on the previous quarter, on the same quarter a year earlier (point_to_point_pct) and of the 4-quarter average (annual_pct). Producer prices lead consumer prices, so use it next to am_inflation. Detailed PPI series (industry sub-sectors, poultry, dairy, mining, services) are separate releases: find them with am_search('شاخص قیمت تولید کننده') and read them with am_table.
| Name | Required | Description | Default |
|---|---|---|---|
| sector | No | Persian name part: 'كل' (default, all sectors), 'كشاورزي', 'معدن', 'صنعت', 'برق', 'خدمات' | |
| quarters | No | How many latest quarters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world access, so the safety profile is covered. The description adds real value beyond that by naming the returned fields (index with 100 = 1400 base, quarter-on-quarter change, point_to_point_pct, annual_pct) and the ordering guarantee, which matters since there is no output schema. It does not mention data lag or the 60-quarter cap, which would have pushed this to a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then return shape, then alternatives — a logical order with no filler. The middle sentence is dense with field names but each one carries information the schema cannot.
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 two-parameter read tool with no output schema, the description covers purpose, return fields, ordering, and sibling routing, which is close to complete. Minor gaps remain around freshness/lag and the maximum quarter window, both of which affect how an agent interprets results.
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 both parameters (sector with its Persian enum-like values, quarters with min/max) are already fully documented in the schema. The description only restates 'by quarter and sector' and adds no format or naming guidance beyond it, so the baseline 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?
States a specific verb and resource ('Get Iran's producer price index (PPI, factory-gate prices)') plus the dimensions of retrieval (by quarter and sector, latest first). It also distinguishes itself from the detailed PPI releases that live in am_search/am_table, so an agent can tell which tool returns the headline 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?
Gives explicit routing: use alongside am_inflation because producer prices lead consumer prices, and use am_search('شاخص قیمت تولید کننده') + am_table for sub-sector detail instead of this tool. Both the when-to-use and the when-to-use-something-else cases are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
am_releaseGet one releaseARead-onlyIdempotent
Get one statistical release from amar.org.ir: title, topic path, period and its downloadable files.
Use it after am_search. Files are Excel (xlsx/xls), PDF or Word links; read an Excel file with am_table (passing this id), open the PDF link yourself. A release the portal removed gives an error.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Release id from am_search, e.g. 58298 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description still adds real behavioral context: the mix of file formats returned, the need for the agent to fetch PDF links externally, and the error behavior for delisted releases. It stops short of describing pagination or field completeness, keeping it a 4 rather than a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs with zero filler: the first states what is returned, the second states when to call it and what to do with the output. The most decision-relevant line ('Use it after am_search') is front-loaded.
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?
With one required parameter, no output schema, and read-only annotations, the remaining burden is telling the agent what a release contains and how to consume its files — and the description does exactly that. Nothing needed to call it 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?
Schema coverage is 100% and the schema already documents 'id' as a release id from am_search with an example, so the description cannot add much. Its only extra signal is that the same id is what you pass onward to am_table, which is a useful chaining hint but marginal. Baseline 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?
States a specific verb and resource ('Get one statistical release from amar.org.ir') and enumerates what comes back: title, topic path, period, downloadable files. That distinguishes it cleanly from am_search (which discovers releases) and am_table (which reads their Excel payloads).
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?
Explicitly sequences the tool: 'Use it after am_search,' and routes each file type to its consumer ('read an Excel file with am_table (passing this id), open the PDF link yourself'). It also flags a failure mode — a removed release returns an error — so the agent knows how to interpret that outcome.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
am_searchSearch statistical releasesARead-onlyIdempotent
Search the Statistical Centre of Iran (amar.org.ir) catalog of releases: tables, time series, reports.
Use it to find a release by Persian title words, year, how often it is published or its type. With no filters
it lists the newest releases. Each result has an id: pass it to am_release for the files, or to am_table to read
an Excel table. Ready tools need no search: am_inflation, am_labour_force, am_population, am_gdp, am_ppi and
am_indicators (trade, housing, money, budget, household income and spending). source and data_type narrow
by the portal's own system and data type (tables, publications, metadata, visual).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Type of publication | |
| page | No | Page of 25 results, 1-based | |
| year | No | Jalali year of the statistical time, e.g. 1404 | |
| query | No | Persian words in the title, e.g. 'نرخ بیکاری', 'تولید ناخالص', 'جمعیت استان' | |
| period | No | How often the release is published | |
| source | No | Which Centre system holds it: the national portal, statistical info services, digital library | |
| category | No | Top-level topic: population = demographic and social, economic, cross-sector = cross-cutting and environment | |
| data_type | No | The portal's data type: statistical tables, publications and reports, metadata and microdata, images |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: unfiltered calls return the newest releases, and every result carries an id that feeds am_release or am_table. It does not mention rate limits, auth, or result size beyond the schema's 25-per-page, which keeps it just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the verb and resource, then usage, then next steps. The enumeration of six ready-made tools is long but earns its place as a routing shortcut; otherwise there is no filler.
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 an 8-parameter, all-optional search tool with no output schema, the description covers default behavior, the key result field (id), and the handoff to am_release and am_table. The shape of a result beyond its id is left implicit, which is the main remaining gap.
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 schema already documents every parameter, including the Persian-language query hint and the enum meanings. The description restates the query language and explains that source and data_type narrow by the portal's own system and type, but it leaves the overlap between kind and data_type unresolved, adding little beyond 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?
States a specific verb and resource: search the Statistical Centre of Iran catalog of releases (tables, time series, reports). It also distinguishes itself from siblings by naming am_release and am_table as follow-ups and listing the ready-made tools (am_inflation, am_labour_force, etc.) that make searching unnecessary.
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?
Gives explicit when-to-use conditions (find a release by Persian title words, year, publication frequency, type) and an explicit alternative path: 'Ready tools need no search' followed by the concrete tool names. It also says what happens with no filters and which tool to call with the returned id, so routing is fully determined.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
am_tableRead an Excel tableARead-onlyIdempotent
Read an Excel table of a statistical release as compact rows (works for any release with an xlsx/xls file).
First call with just the id: you get the sheet list with sizes and titles. Then pass sheet; rows come as
[excel_row_number, cell, cell...] with empty rows removed. Use find to pick rows (e.g. a province or a group
name), offset to page and col_offset for wide monthly series (the newest values are usually at the right
end: see cols in the answer). Files over 25 MB are refused.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Release id from am_search or am_release | |
| file | No | Which Excel file of the release (1-based, see am_release) | |
| find | No | Only rows that contain this text in any cell | |
| sheet | No | Sheet name or 1-based number. Omit to list the sheets first. | |
| offset | No | Skip this many matching rows (for paging) | |
| max_cols | No | Columns to return | |
| max_rows | No | Rows to return | |
| col_offset | No | Skip this many columns on the left (wide time series) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive, open-world), the description discloses the two-step discovery-then-read flow, the exact row shape including excel row numbers, that empty rows are removed, the 25 MB refusal limit, and that `cols` appears in the answer. That is a rich behavioural picture that the annotations alone would not convey.
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 first sentence states what it does and the scope; the second paragraph walks the call sequence in order. No filler, and the discovery-first instruction is front-loaded where an agent will read it.
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?
With 8 parameters and no output schema, the description still explains the return shape (arrays starting with the excel row number) and the `cols` field, plus the size ceiling. An agent has everything needed to make a correct first and second call.
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 already 100%, so the baseline is 3, but the description adds real meaning: `find` matches any cell text such as a province or group name, `offset` is for paging, and `col_offset` matters because newest values in wide monthly series sit at the right end. It does not explain `max_rows`/`max_cols` interplay beyond what the schema says.
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?
"Read an Excel table of a statistical release as compact rows" gives a concrete verb and resource, and the parenthetical "works for any release with an xlsx/xls file" signals it is the generic reader. It stops short of naming the specialized siblings (am_gdp, am_inflation, am_labour_force) that could serve the same data, so an agent must infer the division of labour.
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?
Strong procedural guidance: call first with only `id` to get the sheet list, then pass `sheet`; use `find` for a province or group, `offset` to page, `col_offset` for wide monthly series, and files over 25 MB are refused. The only gap is that it never says when to prefer this generic reader over the topic-specific sibling tools.
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.
12 tool updates
v0.1.1- First observed
am_calendar - First observed
am_gdp - First observed
am_indicators - First observed
am_inflation - First observed
am_inflation_groups - First observed
am_labour_force - First observed
am_news - First observed
am_population - First observed
am_ppi - First observed
am_release - First observed
am_search - First observed
am_table
TDQS
Scored across 12 tools
Each tool targets a distinct facet: search, release metadata, calendar, news, and per-indicator data (GDP, inflation, labour, population, PPI, macro-indicators), plus a generic Excel reader. The only real overlap risk is am_inflation vs am_inflation_groups, but descriptions draw a clear boundary (one-month cross-group vs per-group history) and direct users to the right tool.
All tools share the predictable `am_` prefix and readable snake_case nouns, making the set easy to scan. It mixes verb-style (am_search, am_release) with noun/data-style (am_gdp, am_ppi, am_inflation_groups), which is minor but not confusing.
12 tools is squarely in the well-scoped range for a statistical portal. The ready-made data tools (inflation, GDP, labour, population, PPI, indicators) each cover a distinct high-value dataset, while search/release/table handle the long tail, so every tool earns its place.
The surface covers discovery (search), retrieval (release, table), scheduling (calendar), news, and the major indicator series, with am_table/am_search explicitly handling detailed sub-series. Minor gaps remain (no direct time-series or catalog-browse tool beyond keyword search), but agents can route most requests through the existing set.
Maintenance
Related MCP Connectors
Macro data for AI agents: GDP, inflation, unemployment and more (World Bank, US BLS). No keys.
Macro data for AI agents: GDP, inflation, unemployment and more (World Bank, US BLS). No keys.
Official statistics for AI agents: Eurostat, World Bank, OECD, IMF and WHO data for 150+ countries.
Macroeconomic and other official data from 170+ publishers, resolved from natural language with provenance.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceProvides access to Statistics Canada official statistics without authentication, enabling AI agents to query Canadian economic and demographic data.2 npmMIT
- AlicenseAqualityAmaintenanceEnables AI agents to look up Iranian tax information from the National Tax Administration's public systems without login: e-invoice goods/service IDs and VAT rates, activity codes, official property transaction values, and the text of tax laws, circulars, rulings and FAQ answers. Read-only stdio tools return compact Persian-friendly JSON, making it useful for accountants and businesses that need authoritative tax references.682 PyPIMIT
- AlicenseAqualityBmaintenanceGives AI agents read-only access to IranTalent's public job portal data with no API key, covering job search with filters, full ad details, a company directory, company profiles and rating breakdowns, plus anonymous employee reviews. Also exposes filter lookup slugs, job market counts, similar jobs, and national salary survey percentiles.11MIT
- AlicenseAqualityBmaintenanceEnables AI agents to read official Central Bank of Iran data through 11 read-only tools: historical exchange rates for ~48 currencies, inflation, weekly interbank and policy rates, news, liquidity, monthly statistics tables, sukuk auctions and open market operations, with no API key required. Text is Persian, dates accept Jalali or Gregorian, and output is compact JSON.11MIT