iran-tax-mcp
This is an unofficial, read-only MCP server for querying Iranian tax public systems through six tools.
Search e-invoice goods/service IDs (شناسه کالا و خدمات) by description or 13-digit ID, including VAT rate, type, validity, and active general IDs.
Look up tax activity codes (اینتاکد) with VAT status, business group, and official profit ratios by year.
Get official property transaction and rent values per m² for a map coordinate and Jalali year, plus booklet block/row and tax offices.
Search tax laws, regulations, circulars, rulings, opinions, correspondence, and glossary entries, newest first.
Read the full text of a tax document or a specific article/section, with metadata and official PDF link.
Search the tax administration’s official FAQ and return matching questions with links.
Use it for public reference data only: no login, taxpayer data, returns, invoicing, payments, or captcha-based lookups.
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., "@iran-tax-mcpWhat's the VAT rate for laptop e-invoice goods IDs?"
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.
iran-tax-mcp: Iranian tax MCP server for AI agents
Let your AI agent answer Iranian tax questions (مالیات) from the tax administration's own public systems. An unofficial, read-only MCP server over tax.gov.ir, the goods/service ID system stuffid.tax.gov.ir and the tax regulation database regulation.tax.gov.ir: e-invoice goods IDs and VAT rates, activity codes, property transaction values, tax laws, circulars and rulings, and the official FAQ.
For AI agents · Why · What it can do · Quick start · Tools · How it works · Good to know · FAQ · Configuration · فارسی · Development
For AI agents
What: unofficial MCP server (model context protocol) for public services of the Iranian National Tax Administration (سازمان امور مالیاتی کشور): tax.gov.ir, stuffid.tax.gov.ir and regulation.tax.gov.ir. Answers are Persian text.
Install:
uvx iran-tax-mcporclaude mcp add iran-tax -- uvx iran-tax-mcp. Transport: stdio. Needs uv (Python 3.10+).Auth: none, no API key or account. Optional
IRAN_TAX_MCP_PROXY(HTTP proxy URL, or a comma-separated list); system proxy settings are ignored. The sites often refuse foreign IPs: outside Iran, use a proxy that exits in Iran.Access: read-only. No login, filing, invoicing or payment, so no confirmation is needed before calling any tool.
Tools: 6, all prefixed
tx_:tx_goods_search,tx_activity_codes,tx_property_value,tx_regulations_search,tx_regulation_text,tx_faq_search. For a law question, calltx_regulations_searchfirst, then pass the hit'sidandtypetotx_regulation_text.Use when: a company or accountant needs an e-invoice goods/service ID and its VAT rate, an activity code and its VAT stage, the official property value at an address, the text of a tax law article, a circular (بخشنامه) or ruling, or an official FAQ answer.
Do not use when: the task needs a taxpayer's own data (returns, invoices, debts, economic-code lookups). Those need a login or a captcha and are not offered.
Output: compact JSON. Dates and years are Jalali (
1405/07/27,1404). Money is rial as integers. Null and empty fields are omitted. Replies stay under ~15 KB: long texts come in parts of 6000 characters, list sizes are capped.Network: the first
tx_goods_searchfor a phrase takes 15-30 s (cached for an hour).Machine-readable:
server.jsonand the iran-mcp catalog.
Related MCP server: tsetmc-mcp
Why
Iranian tax answers live on three different government sites, each with its own forms, postbacks and search screens. Finding the VAT rate of a product means a slow ID search; finding article 169 bis of the direct tax law means scrolling a 1.6 MB page. With iran-tax-mcp an agent runs the search, picks the right document and returns just the part you asked for.
You: What is the VAT treatment of laptops on the e-invoice system?
Agent: calls
tx_goods_search(query="لپ تاپ", limit=5)It returns the best-ranked active general goods IDs with their VAT rate, type and validity dates.
Every reply is trimmed to stay under about 15 KB, so it does not flood the agent's context.
What it can do
Find e-invoice goods and service IDs (شناسه کالا و خدمات) by description or 13-digit ID, with VAT rate, type and validity
Look up activity codes (اینتاکد) with VAT stage, business group and the official profit ratios
Get the official property value (ارزش معاملاتی) and rent value per m², booklet block and row, and the tax offices for a map point
Search tax laws, regulations, circulars, rulings, opinions, correspondence and glossary, newest first
Read the full text of one document, or a single article such as
ماده 169 مکرر, with the official PDF linkSearch the official FAQ of the tax administration
Read-only by design: no login, no filing, no payment
Example prompts:
"Find the e-invoice goods ID and VAT rate for a laptop."
"Which activity code fits a restaurant, and what are its profit ratios for 1404?"
"What is the official property value per m² at latitude 35.70, longitude 51.40?"
"Show article 169 bis (مکرر) of the direct tax law."
"Latest circulars about VAT on e-invoicing."
شناسه کالا و خدمات برای لپ‌تاپ چیست و نرخ ارزش افزوده آن چقدر است؟
متن ماده ۱۶۹ مکرر قانون مالیات‌های مستقیم را بیاور.
ارزش معاملاتی ملک در این مختصات چقدر است؟
Quick start
You need uv. No API key or account. Outside Iran, see the proxy note in Good to know.
claude mcp add iran-tax -- uvx iran-tax-mcpSettings → Developer → Edit Config, then add:
{
"mcpServers": {
"iran-tax": { "command": "uvx", "args": ["iran-tax-mcp"] }
}
}Add the Claude Desktop block above to ~/.cursor/mcp.json (or .cursor/mcp.json in a project).
Click Install in VS Code above, or add to .vscode/mcp.json:
{
"servers": {
"iran-tax": { "type": "stdio", "command": "uvx", "args": ["iran-tax-mcp"] }
}
}codex mcp add iran-tax -- uvx iran-tax-mcpOr in ~/.codex/config.toml:
[mcp_servers.iran-tax]
command = "uvx"
args = ["iran-tax-mcp"]Add to ~/.gemini/settings.json:
{
"mcpServers": {
"iran-tax": { "command": "uvx", "args": ["iran-tax-mcp"] }
}
}Add the Claude Desktop block to ~/.codeium/windsurf/mcp_config.json.
It is a standard stdio MCP server: run uvx iran-tax-mcp, or pip install iran-tax-mcp and run iran-tax-mcp.
Tools
Tool | What it does |
| E-invoice goods/service IDs (شناسه کالا و خدمات) with VAT rate, type and validity, by description or 13-digit ID ( |
| Activity codes (اینتاکد) with VAT stage, business group and official profit ratios ( |
| Official property transaction value (ارزش معاملاتی) and rent value per m², booklet block and row, and the tax offices for a point ( |
| Search tax laws, regulations and circulars, rulings, opinions, correspondence and glossary, newest first ( |
| Full text of one document, or one article of it such as |
| The tax administration's FAQ: matching questions with links ( |
All 6 tools are annotated readOnlyHint: true.
How it works
AI agent (Claude, Cursor, Copilot, ...)
│
│ MCP over stdio
▼
iran-tax-mcp (runs on your machine)
│
│ HTTPS
├──────▶ tax.gov.ir activity codes, property values, FAQ
├──────▶ stuffid.tax.gov.ir goods/service IDs and VAT
└──────▶ regulation.tax.gov.ir laws, circulars, rulingsiran-tax-mcp runs locally and reads the same public pages and endpoints the three sites use. It has no hosted server in between and no API key. Requests go out through a Chrome-impersonating client, at most 4 at a time with a little jitter, retried up to twice on timeouts, network errors, 5xx and 429. It only talks to the allowed tax hosts and only reads.
Good to know
Network: these sites timed out through a Turkish proxy exit and answered directly from an Iranian connection. Outside Iran, set
IRAN_TAX_MCP_PROXYto an HTTP proxy with an Iranian exit. System proxy variables are ignored on purpose.Slow first goods search: the ID system builds a file for each search (15-30 s for a broad phrase such as «لپ تاپ», which has tens of thousands of rows). The server downloads and ranks it (active general IDs first) and keeps it for an hour. Replies are capped at 20 rows.
Activity codes: the two numeric columns are profit ratios (نسبت سود فعالیت, نسبت سود ناویژه به فروش), not tax rates. The commercial/non-commercial switch (تجاری / غیرتجاری) has no "all" option.
Property values: the result is the official transaction value for a point, for a chosen year.
Regulation text: long documents come in parts of 6000 characters; ask for the next
part, or for a single article. Documents are cached for an hour.Units: years and dates are Jalali, money is rial as integers.
What it does not do: no economic-code (شماره اقتصادی) or invalid-company lookup, no certificates, no returns, invoices or payments, no login and no captcha solving.
FAQ
The tax administration's public sites have no documented open API for these lookups. iran-tax-mcp is an unofficial MCP server with 6 read-only tools that reads the public pages of tax.gov.ir, stuffid.tax.gov.ir and regulation.tax.gov.ir and returns compact JSON for AI agents.
Often not: Iranian government sites drop many foreign connections. It was built and tested on a direct Iranian connection. Set IRAN_TAX_MCP_PROXY to a proxy in Iran if calls fail to connect.
On tax.gov.ir those forms need a captcha, and the e-invoice API needs the taxpayer's signed key. This server only uses what is public without either.
The ID system answers a search by building a file (15-30 s for a broad phrase such as «لپ تاپ»). The server downloads it once, ranks it (active general IDs first) and keeps it for an hour, so repeats are fast.
Call tx_regulations_search to find the document, then tx_regulation_text with its id and type, and article set to something like ماده 169 مکرر.
No. The two numeric columns are the official profit ratios (نسبت سود فعالیت and نسبت سود ناویژه به فروش).
No. It has no login and no write calls, it only reads public information. Nothing it returns is tax or legal advice.
npx @modelcontextprotocol/inspector uvx iran-tax-mcpConfiguration
Variable | Default | Meaning |
| unset | Optional HTTP proxy URL for requests to the tax sites; system proxy settings are ignored. A comma-separated list is used one at a time: the next proxy takes over when one is blocked or cannot connect |
فارسی: سرور MCP مالیات ایران
iran-tax-mcp یک سرور MCP غیررسمی و فقط‌خواندنی برای خدمات عمومی سازمان امور مالیاتی کشور است. این سرور به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می‌دهد در سامانه‌های tax.gov.ir، stuffid.tax.gov.ir و regulation.tax.gov.ir جست‌وجو کند.
چه کارهایی می‌کند
شناسه کالا و خدمات (صورتحساب الکترونیکی، سامانه مودیان) و نرخ ارزش افزوده، با توضیح کالا یا شناسه ۱۳ رقمی.
کد فعالیت (اینتاکد) با مرحله ارزش افزوده و نسبت سود رسمی.
ارزش معاملاتی املاک و ارزش اجاره هر متر مربع بر اساس مختصات.
قوانین، بخشنامه‌ها، دستورالعمل‌ها و آرای مالیاتی از سامانه جامع مقررات مالیاتی، با متن کامل یا یک ماده مشخص مثل «ماده ۱۶۹ مکرر».
پرسش‌های متداول سازمان امور مالیاتی.
نکته‌ها
فقط خواندنی است: وارد حساب نمی‌شود، اظهارنامه نمی‌دهد و پرداخت انجام نمی‌دهد. مشاوره مالیاتی یا حقوقی نیست.
استعلام شماره اقتصادی و شرکت‌های نامعتبر ارائه نمی‌شود (کپچا یا ورود لازم دارد).
سال و تاریخ شمسی است و مبالغ به ریال.
جست‌وجوی اول شناسه کالا ۱۵ تا ۳۰ ثانیه طول می‌کشد و بعد یک ساعت ذخیره می‌شود.
این سامانه‌ها اغلب IP خارجی را قبول نمی‌کنند؛ از اینترنت ایران استفاده کنید یا متغیر
IRAN_TAX_MCP_PROXYرا روی یک پراکسی HTTP با خروجی ایران بگذارید.کلید API لازم نیست و روی سیستم خود شما اجرا می‌شود.
نصب (اول uv را نصب کنید). در Claude Code:
claude mcp add iran-tax -- uvx iran-tax-mcpدر Claude Desktop، Cursor و بقیه برنامه‌ها همان تنظیم بخش Quick start را بگذارید.
نمونه پرسش‌ها
«شناسه کالا و خدمات لپ‌تاپ و نرخ مالیات بر ارزش افزوده آن چیست؟»
«متن ماده ۱۶۹ مکرر قانون مالیات‌های مستقیم را بده.»
«آخرین بخشنامه‌های مربوط به صورتحساب الکترونیکی کدام‌اند؟»
«کد اینتاکد برای رستوران چیست؟»
Development
git clone https://github.com/sepehr071/iran-tax-mcp && cd iran-tax-mcp
uv sync
uv run ruff check . && uv run ruff format --check .
uv run python -m pytest -q # offline unit tests
uv run python -m pytest -m live -q # calls the real tax sites, needs an Iranian connection
uv buildTools live in src/iran_tax_mcp/ (goods.py, taxgov.py, regulation.py); each is a typed async function with a docstring that tells the agent when to use it. Issues and PRs are welcome.
Releases: bump the version in pyproject.toml and server.json, then push a v* tag. GitHub Actions publishes to PyPI.
Related servers
iran-mcp: catalog of all Iranian-service MCP servers
qavanin-mcp for Iranian laws and regulations
iran-news-mcp for Iranian news
tgju-mcp for dollar, gold and coin prices
tsetmc-mcp for the Tehran Stock Exchange
Listed on mcpfarsi.ir, the Persian MCP marketplace
Disclaimer
Unofficial and not affiliated with or endorsed by the Iranian National Tax Administration (سازمان امور مالیاتی کشور). It is read-only and uses public pages of tax.gov.ir, stuffid.tax.gov.ir and regulation.tax.gov.ir, which can change without notice. Information is for reference only and is not tax or legal advice.
Author
Built and maintained by Sepehr Radmard (سپهر رادمرد). Connect on LinkedIn or follow @sepehr071 on GitHub for more MCP servers for Iranian websites, all listed in iran-mcp. If this saves you time, a star on the repo helps other people find it.
License
Available Tools
6 toolstx_activity_codesSearch tax activity codesARead-onlyIdempotent
Find tax activity codes (کد فعالیت / اینتاکد) with their VAT status and official profit ratios.
Source: tax.gov.ir SearchIntaCode. Each row has the code, title, activity type (production/trade/services), vat_status (which VAT stage the activity falls in, or not subject), business group, profit_ratio (نسبت سود فعالیت, %) and gross_profit_to_sales_ratio (%), used for presumptive assessments. The ratios are not tax rates.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Tax year (Jalali), e.g. 1404. Default: the latest year offered. | |
| limit | No | Max rows (1-20). | |
| query | Yes | Part of the activity title in Persian (e.g. 'نرم افزار', 'گندم'), or an activity code (digits). | |
| commercial | No | True: commercial activities (تجاری). False: non-commercial ones (غیرتجاری). The site has no 'both'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so safety is covered. The description adds genuine behavioral context beyond that: each row's full shape, that the ratio fields are profit ratios used in presumptive assessments, and the explicit caveat that they are not tax rates — a meaningful disambiguation an agent could otherwise misread.
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 opening sentence front-loads purpose and Persian aliases, and the second paragraph is mostly load-bearing field enumeration with one useful caveat. The bilingual term pairs add minor length but are justified by the Persian-language query domain.
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 is the only source of return-value meaning, and it does cover every row field plus the crucial 'ratios are not tax rates' clarification. Complete enough to call correctly; only pagination/limit behavior is left entirely to the schema, which handles it.
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 every parameter is already documented, including the commercial 'no both option' nuance and the year default. The description adds no syntax, format, or defaulting detail beyond the schema, so the baseline 3 for full schema coverage is appropriate.
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 (Find) and resource (tax activity codes) and immediately enumerates what is returned: VAT status, profit ratios, activity type. The Persian aliases (کد فعالیت / اینتاکد) and the named upstream source (tax.gov.ir SearchIntaCode) let an agent distinguish this from tx_goods_search and the other regulation/FAQ siblings 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?
The description implies the usage context via 'used for presumptive assessments' and the query-example framing, but it never states when to choose this tool over tx_goods_search or when not to use it. There are no explicit alternatives or exclusion conditions, so the routing signal is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tx_faq_searchSearch the tax FAQARead-onlyIdempotent
Search the tax administration's official FAQ (پرسش های متداول) and return matching questions with links.
Source: tax.gov.ir SearchFAQ. Returns question titles and their page url; open the url for the answer.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Keywords in Persian, e.g. 'اظهارنامه', 'ماده 169'. |
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 value beyond that: it discloses the return shape (question titles plus page URLs) and the two-step workflow needed to actually read an answer, which the annotations do 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?
Two short sentences, front-loaded with purpose and return shape. The 'Source: tax.gov.ir SearchFAQ' line is marginally redundant provenance but is brief and identifies the backing endpoint; nothing else is wasted.
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 correctly carries the burden of describing returns (titles and URLs) and the follow-up step. Minor gaps remain — no mention of result count limits, pagination, or empty-result behavior — but for a one-parameter lookup tool it is close to sufficient.
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% and the single 'query' parameter already documents its Persian-language expectation, example, and minLength. The description adds nothing about query syntax, language, or matching behavior, 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 (Search) and resource (tax administration's official FAQ), plus what comes back ('matching questions with links'). The 'FAQ' resource distinguishes it implicitly from siblings like tx_regulations_search and tx_goods_search, but the description never names or contrasts those alternatives, so differentiation is left to inference.
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?
There is no explicit when-to-use, when-not, or named alternative. The closing note 'open the url for the answer' does imply this is a first-step index lookup rather than an answer source, which is a useful implicit usage signal, but the agent must infer the routing decision itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tx_goods_searchSearch goods and service IDsARead-onlyIdempotent
Find e-invoice goods/service IDs (شناسه کالا و خدمات) and their VAT rate by description or ID.
Source: the tax administration's ID system stuffid.tax.gov.ir. Active general IDs come first. Each row has the
13-digit id, description, vat_percent, type (general/specific, domestic/imported) and dates; expired: true
means the ID can no longer be used. The first search for a phrase takes 15-30 s (the site builds a file);
repeats are cached for an hour. total counts every match, not only the rows returned.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Goods IDs, service IDs or both. | all |
| limit | No | Max rows (1-20). | |
| query | Yes | Part of the goods/service description in Persian, matched as one phrase (e.g. 'لپ تاپ', 'خدمات حسابداری'), or a 13-digit ID. | |
| general_only | No | Only general IDs (شناسه عمومی), the ones most sellers put on e-invoices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, openWorld), yet the description adds substantial operational context: exact source system, ordering of results (active general IDs first), the meaning of `expired: true`, a 15-30 s first-search cold latency, one-hour caching, and the fact that `total` counts all matches rather than returned rows. This is well beyond what annotations provide.
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 organized into source/persistence, result ordering, latency/caching, and counting semantics. Every sentence carries distinct, decision-relevant information with 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?
There is no output schema, so the description carries the burden of describing return contents (id, description, vat_percent, type, dates, expired flag) and does so fully, along with timing and caching expectations an agent needs before calling.
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; the description still adds interpretive value by explaining that IDs are 13 digits, that general vs specific and domestic vs imported types exist, and that expired IDs cannot be used, which informs the kind and general_only choices.
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 precise verb and resource ('Find e-invoice goods/service IDs and their VAT rate by description or ID'), including the scope of what is returned. It is clearly distinguishable from siblings like tx_regulations_search or tx_activity_codes without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for when to use it (looking up goods/service IDs by description or 13-digit ID, with kind and general_only narrowing) but never names a when-not condition or an alternative tool. Sibling domains are distinct enough that routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tx_property_valueProperty transaction valueARead-onlyIdempotent
Return the official property transaction value (ارزش معاملاتی املاک) per square metre at a map point.
Source: tax.gov.ir GetAddressGeoLocation. Gives the booklet block and row, residential/office/commercial values and rent values in rial per m² (text 'عدم وجود اطلاعات' when the booklet has none), and the tax offices for that address. The caller must supply coordinates; this server does not geocode addresses.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Booklet year (Jalali), 1396 to the current year. Default: the latest. | |
| latitude | Yes | Latitude of the property (WGS84). | |
| longitude | Yes | Longitude of the property (WGS84). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds real value beyond that: the upstream source (tax.gov.ir GetAddressGeoLocation), the exact payload shape (booklet block/row, residential/office/commercial and rent values in rial per m²), and the missing-data sentinel string 'عدم وجود اطلاعات'.
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 purpose in the first sentence, then layers output contents and the geocoding caveat. Dense but each sentence carries information; the Persian term and source citation are justified for disambiguation in a tax-data domain.
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 fully carries the burden of describing return values (block/row, per-type values, rent values, tax offices, and the no-data sentinel) and states the coordinate prerequisite. Nothing an agent needs to invoke or interpret this tool appears to be 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 description coverage is 100%, so the schema already documents latitude/longitude (WGS84, bounds) and the Jalali year with default. The description only restates the coordinate requirement rather than adding format or usage nuance, so the baseline 3 is appropriate.
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+resource ('Return the official property transaction value per square metre at a map point') and immediately distinguishes itself from the sibling search/regulation tools. An agent can tell this is a point-lookup valuation tool, not a search tool, 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 a clear prerequisite — the caller must supply coordinates and the server does not geocode — which is exactly the kind of context that prevents a failed call. It stops short of naming alternatives or explicit when-not conditions, but no sibling overlaps meaningfully with this function.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tx_regulations_searchSearch tax regulationsARead-onlyIdempotent
Search the official tax regulation database (laws, circulars, rulings, opinions), newest first.
Source: regulation.tax.gov.ir (سامانه جامع مقررات مالیاتی). Each item has id and type (pass both to tx_regulation_text), title, number, issuer, date (Jalali) and status (معتبر = in force, غیر معتبر = not).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Result page, 20 per page, newest first. | |
| type | No | law = قوانین, regulation = مقررات/بخشنامه/دستورالعمل/آیین نامه, ruling = آرای دیوان و هیئت ها, opinion = نظریه ها, correspondence = مکاتبات, glossary = واژگان. | all |
| query | Yes | Words in Persian, e.g. 'ماده 169 مکرر', 'مالیات حقوق', 'سفته بازی', or a circular number like '200/1405/59'. | |
| title_only | No | Match the title (and number) only, not the full text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the description correctly spends its budget elsewhere: it names the upstream source, the ordering guarantee, and decodes the status field (معتبر = in force). It stops short of pagination limits or rate limits, but adds real operational context.
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 scope, then source and item shape in a compact second paragraph. No filler sentences, though the parenthetical script name and source URL are marginally redundant with each other.
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 carries the return-value burden and does so by enumerating the fields of each result (id, type, title, number, issuer, date, status) and their semantics. An agent can chain into tx_regulation_text without guessing what comes back.
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 each of the four parameters already carries a description with examples and enum decoding, so the schema does the heavy lifting. The description's note about id/type refers to result fields rather than inputs, adding little parameter meaning beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (search the official tax regulation database), enumerates the covered document kinds (laws, circulars, rulings, opinions), and specifies result ordering (newest first). The mention of passing id+type to tx_regulation_text separates it from that sibling without needing 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?
The description implies the retrieval workflow by noting that each result's id and type should be passed to tx_regulation_text, which tells the agent this is the discovery step. However, it never states when to prefer it over unmentioned siblings like tx_faq_search or tx_goods_search, so differentiation is only partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tx_regulation_textRead a tax regulationARead-onlyIdempotent
Return the full text of one tax law, circular, ruling or opinion, or just one article of it.
Source: regulation.tax.gov.ir. Gives title, kind, number, dates, issuer, the official PDF link and the text in
reading order with each article heading on its own line. Long laws come in parts: parts > 1 means call again
with part=2, 3, ... For one article of a big law (the direct tax law is ~300 articles) pass article.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Document id from tx_regulations_search, e.g. txs5000060480 (VAT law) or txs5000060569 (direct tax law). | |
| part | No | Part number for long texts (6000 characters each); see `parts`. | |
| type | Yes | Document type, as returned by tx_regulations_search. | |
| article | No | Optional heading to read only that part, e.g. 'ماده 2', 'ماده 169 مکرر', 'فصل سوم'. Empty = whole document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the description needn't cover safety. It adds genuinely useful behavior beyond annotations: the ~6000-character part size, the parts>1 pagination protocol, and the ability to scope to one article. Return shape (title, kind, number, dates, issuer, PDF link, reading order) is also disclosed.
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 verb+resource sentence, then source, then pagination and article guidance. Three sentences, no filler. Slightly dense but every clause carries actionable 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 compensates by naming the returned fields (title, kind, number, dates, issuer, PDF link, text in reading order) and covering pagination and article scoping. An agent has everything needed to call and re-call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining the pagination semantics of `part` (parts count, 6000-char chunks, call again) and the intent of `article` as an alternative to reading an entire ~300-article law, adding practical meaning to both optional parameters.
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+resource ('Return the full text of one tax law, circular, ruling or opinion, or just one article of it') and implicitly distinguishes itself from the sibling search tool by being a read-one-document operation. The scope (whole document vs single article) is spelled out, so an agent can tell it apart from tx_regulations_search.
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 operational context: source site, the fact that long laws are paginated ('parts > 1 means call again with part=2, 3, ...'), and when to use `article` for large laws. It does not state when NOT to use the tool or name a direct alternative by name (the id dependency on tx_regulations_search appears in the schema, not the description), which keeps it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
tx_activity_codes - First observed
tx_faq_search - First observed
tx_goods_search - First observed
tx_property_value - First observed
tx_regulation_text - First observed
tx_regulations_search
TDQS
Scored across 6 tools
Each tool targets a clearly distinct resource: goods/service IDs, FAQ, regulations, regulation text, activity codes, and property values. The only near-pair (tx_regulations_search vs tx_regulation_text) is cleanly separated as a search/detail relationship, so an agent can reliably pick the right tool.
All names share a consistent tx_ prefix and snake_case, with a tx_<domain>_<action> scheme. Minor deviation is that some names encode an action (search/text) while others are pure nouns (activity_codes, property_value), but the set still reads predictably.
Six tools is well-scoped for a tax reference-data server. Each tool covers a distinct lookup category with no redundant or filler tools.
The surface covers the major tax reference domains (goods IDs, FAQ, regulations including full text, activity codes, property values) reasonably well. The main gap is that tx_property_value requires caller-supplied coordinates with no geocoding support, which a caller must work around.
Maintenance
Related MCP Connectors
Persian and Iranian utilities for agents: Jalali dates, national ID, IBAN, holidays. Paid via x402.
Persian and Iranian utilities for agents plus text tooling. Paid via x402 or MPP.
15 deterministic validation tools for AI agents: tax IDs (15 countries), VAT, IBAN, LEI, HS codes.
Validate EU, UK, AU VAT numbers for AI agents. EU ViDA e-invoicing compliance.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI agents to search roughly 168,000 Iranian laws, regulations, court votes and legal opinions by title or full text, read a law or a single article, and trace amendments, article history and citing documents. Read-only, no authentication, with results returned as compact JSON from Claude, Cursor or Copilot.798 PyPIMIT
- AlicenseAqualityAmaintenanceEnables AI agents to read Tehran Stock Exchange and Iran Fara Bourse market data—quotes, top movers, order books, price history, sector indices, and real vs legal trading—through read-only tools. Requires no API key, returning compact JSON in Rial directly to Claude, Cursor, or Copilot.879 PyPI5MIT
- 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
- AlicenseAqualityBmaintenanceEnables AI agents to query official Statistical Centre of Iran data read-only without an API key, covering CPI and inflation breakdowns, unemployment and participation rates, GDP and producer prices, census population by province and county, macro-indicator workbooks, release calendars, and any Excel table from a published release. Results come back as compact JSON with Jalali periods and Persian titles.12MIT