iran-brokers-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., "@iran-brokers-mcpshow me today's top gaining stocks on the Tehran Stock Exchange"
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-brokers-mcp: Iranian broker (کارگزاری بورس) market data MCP server for AI agents
iran-brokers-mcp is an unofficial, read-only MCP server that lets an AI agent read Tehran Stock Exchange market data through two Iranian brokers, Mofid Securities (کارگزاری مفید, emofid.com) and Agah (کارگزاری آگاه, agah.com). Its 22 tools cover stocks, ETFs and funds (صندوق سرمایهگذاری), options (آپشن), bonds and sukuk (اوراق), gold coins (سکه) and currency, screeners, Codal announcements and education articles, on Tehran Stock Exchange (بورس تهران) and Fara Bourse (فرابورس). No API key or broker account is needed, and it works in Claude, Cursor, Copilot and any other MCP client.
For AI agents · What it can do · Quick start · Tools · Limits · FAQ · فارسی
Last verified 2026-11-01 against the live Mofid and Agah APIs.
For AI agents
What: unofficial MCP server (model context protocol) for Mofid and Agah: symbol search, stock cards, OHLC candles and daily history, market snapshot, 36 Mofid rankings, Agah market watch and screener, ETFs with price vs NAV, fund detail/history/comparison, options chain and contract, bonds and T-bills, currency/coin/gold/commodity prices and history, Codal filings, valuation scores, technical tally, education articles and courses.
Install:
uvx iran-brokers-mcporclaude mcp add iran-brokers -- uvx iran-brokers-mcp. Transport: stdio. Needs uv (Python 3.10+).Auth: none. Optional
IRAN_BROKERS_MCP_PROXY(one HTTP proxy URL for every request, or a comma-separated list); system proxy settings are ignored.Access: read-only market data. It cannot log in, read a portfolio, cash or orders, place, edit or cancel orders, or pay. No confirmation is needed before calling any tool.
Tools: 22, all prefixed
br_. Typical sequences:br_search->br_stock/br_history;br_market->br_market_toporbr_stocks;br_etfs->br_stockorbr_fund;br_screener;br_rates;br_announcements;br_learn->br_learn(ref=...).sourceargument: each source answers in its own block ({"mofid": ..., "agah": ...}). Withall, a source that fails shows{"error": ...}and the other still answers. Blocks are never blended into one row, because the fields differ.Use when: the user asks for a stock, fund, option, index, gold or dollar price on the Iranian market, a ranking or screen, a chart, a company's Codal filings, or how something in the bourse works.
Do not use when: the user wants to trade, see their own portfolio, or needs real-time tick data (everything here is a polled snapshot). For raw exchange data use tsetmc-mcp; for full financial statements use codal-mcp.
Output: compact JSON. Prices are Rial (divide by 10 for Toman). Text Persian.
Machine-readable:
server.jsonand the iran-mcp catalog.
Related MCP server: codal-mcp
What it can do
Get Tehran Stock Exchange data in Claude: find a symbol, read its price card (P/E, EPS, NAV, buyer and seller flows, order book), candles from 1 minute to weekly, and the market snapshot with indices and movers
Compare Iranian ETFs from an AI agent: list ETFs with price, NAV and the bubble gap (Mofid 375 ETFs, Agah 331 listed ETFs), then read one fund's detail, NAV history or compare several
Read the options chain (call and put contracts) and one contract's detail
Screen stocks, ETFs or funds on any column with the Agah screener, or use Mofid's 36 rankings (top gainers, value, queues and more)
Bonds, sukuk and T-bills with yield, plus currency, crypto, coin (سکه), gold and commodity prices with history
Codal announcements by company, type and date, plus notices, news and research PDFs
Valuation and technical scores: theoretical price, fundamental and technical scores, indicator tally per stock or industry
Education: Mofid blog, Agah Pedia articles and Agah Academy courses
Read-only by design: no login, no orders, no captcha solving
Example prompts:
"Get today's Tehran Stock Exchange summary: indices, top movers and the dollar and coin prices."
"Compare Iranian ETFs by price versus NAV and show which trade at the biggest premium."
"Show the options chain for Foolad and the details of one call contract."
"Which stocks have the lowest P/E and a positive money flow this week?"
قیمت و نسبت قیمت به NAV صندوقهای طلا را مقایسه کن.
بیشترین صف خرید امروز بورس کدام نمادهاست؟
آخرین اطلاعیههای کدال نماد فولاد را بیاور.
Quick start
You need uv. No API key or account.
claude mcp add iran-brokers -- uvx iran-brokers-mcpSettings → Developer → Edit Config, then add:
{
"mcpServers": {
"iran-brokers": { "command": "uvx", "args": ["iran-brokers-mcp"] }
}
}Click Install in Cursor above, or add the Claude Desktop block 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-brokers": { "type": "stdio", "command": "uvx", "args": ["iran-brokers-mcp"] }
}
}It is a standard stdio MCP server: run uvx iran-brokers-mcp, or pip install iran-brokers-mcp and run iran-brokers-mcp.
Tools
Merged tools take source: mofid, agah or all (the default is in brackets). Single-source tools say which broker they use.
Tool | Source | What it does |
| both [all] | Find the id of a stock, fund, option or index by symbol or name |
| both [all] | One stock or ETF in detail: Mofid price card (P/E, EPS, NAV, flows, scores, optional 5-level order book) and Agah card (ratios, returns, flows, order book) |
| both [mofid] | Mofid OHLC candles (1 minute to weekly, any ISIN) or Agah daily rows with buyer/seller flows |
| both [all] | Today's indices, value, queues (Mofid) and total index, money flow, movers, dollar/coin/gold/oil prices (Agah) |
| both [all] | Industry ranking with valuation ratios, returns and money flow; one industry with its stocks |
| both [all] | Index card (Mofid) and daily index history (both) |
| both [mofid] | ETFs with price, NAV and gap/bubble: Mofid 375 ETFs, Agah 331 listed ETFs with NAV returns |
| both [all] | Search and read Mofid blog and Agah Pedia articles, list categories, search Agah Academy courses |
| Mofid | Up to 30 live quotes in one call |
| Mofid | 36 market rankings |
| Mofid | Bonds, sukuk and T-bills with yield |
| Mofid | Currency, crypto, coin, gold and commodity prices and their history |
| Mofid | Notices, Codal letters, Telegram posts and research PDFs |
| Mofid | Codal filings by company, type and date |
| Mofid | Theoretical price, technical and fundamental scores |
| Mofid | Mofid-branded fund catalogue |
| Agah | Market watch of about 750 stocks |
| Agah | Filter stocks, ETFs or all funds on any column |
| Agah | Fund detail, NAV and bubble history, comparison of funds |
| Agah | Options chain, or one contract |
| Agah | Technical indicator tally for a stock or industry |
| Agah | Dividends, capital changes, notices and holders |
Every tool is read-only. If you used the separate mofid-mcp or agah-mcp servers: mf_search and ag_search -> br_search; mf_symbol, mf_depth, ag_stock -> br_stock; mf_history, ag_stock_history -> br_history; mf_market_summary, ag_market_pulse, ag_market_overview -> br_market; mf_industries, ag_industries -> br_industries; mf_index, ag_index_history -> br_index; mf_etfs -> br_etfs; mf_learn, mf_learn_categories, ag_articles, ag_article, ag_academy -> br_learn; mf_fx_gold, mf_rate_history -> br_rates; ag_fund, ag_fund_trend, ag_fund_compare -> br_fund; ag_options, ag_option -> br_options; the others keep their name with the br_ prefix (mf_quote -> br_quotes).
Limits
No portfolio, orders or cash. Those need a broker login (EasyTrader, AsaTrader); nothing here logs in or can place an order, and this is not built.
Agah Pedia and Academy answer only from an Iranian network (
pediaapi.agah.com,academyapi.agah.comtime out from abroad). The error says so; the Mofid side ofbr_learnstill answers. Do not put a foreign proxy in front of them.Mofid depends on the
accept-infoheader of the Bourse View gateway (derived from the server clock; the client resyncs on a 401). If the site changes that check, Mofid tools fail with an HTTP 401 error and the Agah side keeps working.Data is polled snapshots, cached 30 to 60 seconds, delayed or unaudited; the market trades Saturday to Wednesday about 09:00-12:30 Tehran time.
The two sources use different ids for funds (Mofid ISIN, Agah national code like
14010557380_A01) and different fields, so merged tools show them side by side.Prices are Rial; divide by 10 for Toman. Dates follow each site.
FAQ
Add iran-brokers-mcp with claude mcp add iran-brokers -- uvx iran-brokers-mcp, then ask in plain language. The agent finds the symbol with br_search, reads it with br_stock or br_history, and gets the market overview from br_market.
Use br_etfs for the list with price, NAV and gap (bubble), br_fund for one fund's detail, NAV history or a side-by-side comparison, and br_screener to filter funds on any column.
Neither broker documents a public API. This server calls the same public JSON the websites use, without login, and returns compact JSON.
No. It is read-only and has no login. Portfolio, cash and orders need your broker account and are not built.
Yes for Mofid and Agah Research. Agah Pedia and Academy answer only from an Iranian network. Set IRAN_BROKERS_MCP_PROXY to route through a proxy; do not use a foreign one for Pedia and Academy.
It calls the public endpoints the websites use, two requests at a time per broker and with caching, and each client sends the headers its site's web app sends (Chrome TLS fingerprint, Referer, Accept, Mofid's accept-info).
tsetmc-mcp and codal-mcp read the exchange and Codal directly; this server reads the brokers' own views of the same market (rankings, screeners, NAV gaps, options, education).
No to both. Data is polled snapshots cached for 30 to 60 seconds. Nothing it returns is financial advice.
Configuration
Variable | Default | Meaning |
| unset | Optional HTTP proxy URL for all Mofid and Agah requests; 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-brokers-mcp یک سرور MCP غیررسمی و فقطخواندنی است که دادههای عمومی بازار سرمایه را از دو کارگزاری، کارگزاری مفید (emofid.com) و کارگزاری آگاه (agah.com)، در اختیار دستیار هوش مصنوعی (Claude، Cursor، Copilot و ...) میگذارد.
چه کارهایی میکند
سهام بورس تهران و فرابورس: جستجوی نماد، کارت قیمت، کندل، تاریخچه روزانه، خلاصه بازار و شاخصها.
صندوقهای سرمایهگذاری و ETF: قیمت، NAV، حباب، تاریخچه و مقایسه صندوقها.
اوراق و آپشن: اوراق بدهی، صکوک، اوراق خزانه با بازده؛ زنجیره آپشن و جزئیات هر قرارداد.
سکه، طلا و ارز: قیمت و تاریخچه.
غربالگر و رتبهبندی: ۳۶ رتبهبندی مفید و غربالگر آگاه روی هر ستون.
اطلاعیههای کدال، خبر و آموزش: مقالهها و دورههای مفید و آگاه.
نکتهها
فقطخواندنی است: ورود به حساب، سبد دارایی، موجودی و ثبت سفارش ندارد.
پدیا و آکادمی آگاه فقط از اینترنت ایران جواب میدهد.
دادهها لحظهای نیست و هر ۳۰ تا ۶۰ ثانیه تازه میشود. مبلغها ریال است. توصیه سرمایهگذاری نیست.
کلید API لازم نیست و سرور روی سیستم خود شما اجرا میشود.
نصب (اول uv را نصب کنید). در Claude Code:
claude mcp add iran-brokers -- uvx iran-brokers-mcpDevelopment
git clone https://github.com/sepehr071/iran-brokers-mcp && cd iran-brokers-mcp
uv sync
uv run ruff check . && uv run ruff format --check .
uv run python -m pytest -q # offline unit tests on recorded responses
uv run python -m pytest -m live -q # live pass against Mofid and Agah
uv buildReleases: bump the version in pyproject.toml and server.json, then push a v* tag. GitHub Actions publishes to PyPI. Issues and PRs are welcome.
Related servers
tsetmc-mcp for Tehran Stock Exchange prices, order book, real vs legal trading and indices
codal-mcp for Codal disclosures and financial statements
iran-gold-mcp for live 18k gold prices on Iranian platforms
iran-mcp: catalog of all Iranian-service MCP servers
Disclaimer
Unofficial and not affiliated with or endorsed by Mofid Securities or Agah. It is read-only and uses the public endpoints of their websites, which can change without notice. Data is informational, delayed and unaudited. Nothing here is investment 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
22 toolsbr_announcementsCodal announcementsARead-onlyIdempotent
Search Codal filings (financial statements, board notices, AGM invitations, monthly activity) by company, report type and date.
Source: Mofid only (Codal filings through Bourse View). Use br_search if unsure of the symbol; codal-mcp reads Codal directly.
Each row has the title, publish time, company, period, and links to the Codal page, PDF and attachments.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Rows to return. | |
| offset | No | Rows to skip, for paging (next page = offset + limit). | |
| symbol | No | Company symbol in Persian as listed on Codal, e.g. 'فملی'. Omit for all companies. | |
| to_date | No | Last publish day, Gregorian YYYY-MM-DD. Default today. | |
| from_date | No | First publish day, Gregorian YYYY-MM-DD. Default 7 days ago. | |
| report_type | No | Part of the Persian report type name, e.g. 'صورتهای مالی', 'تفسیری', 'مجمع', 'فعالیت ماهانه'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world behavior, so the safety profile needs no restating. The description adds genuinely new context: it is a Mofid-side proxy for Codal rather than a direct Codal reader, and it specifies the shape of each returned row (title, publish time, company, period, links to Codal page, PDF, attachments). The default window is disclosed via the schema rather than the prose.
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 lines, front-loaded with what is searched, then the source/routing caveat, then the return shape. No sentence is redundant with the name or with structured fields.
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 spends its final line on what a row contains, which is what a caller most needs to interpret results. It is a zero-required-parameter, read-only search tool whose pagination and date defaults live in the schema, so little else is owed. Slightly incomplete on whether results are Persian-only or how attachments are fetched.
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 (limit, offset, symbol, to_date, from_date, report_type) is already documented in the schema. The description only restates the filter axes as 'company, report type and date' without adding format, defaults, or example values beyond what the schema supplies. 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 ('Search Codal filings') and enumerates the document classes covered (financial statements, board notices, AGM invitations, monthly activity), plus the three filter axes. It separates itself from br_search and from codal-mcp, but does not state how it differs from filing-adjacent siblings such as br_news or br_stock_events.
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?
'Use br_search if unsure of the symbol' is an explicit routing rule that prevents a wasted call. 'Source: Mofid only ... codal-mcp reads Codal directly' clarifies the data provenance decision. There is no explicit when-not guidance (e.g., use br_news for press coverage rather than filings).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_bondsBonds and sukukARead-onlyIdempotent
List exchange-traded bonds, sukuk and treasury bills with maturity, coupon, price and yield to maturity.
Source: Mofid only. Bonds are not in br_search; list them here by group, symbol or yield.
Prices are Rial per 1,000,000 par. ytm is percent per year; coupon_rate is a fraction (0.18 = 18%).
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | ytm = yield to maturity of the last closing trade, highest first. | ytm |
| group | No | TreasuryBills = government T-bills, GAMBills = Gam, CouponBonds = coupon sukuk/bonds, NonCouponBonds. | |
| limit | No | Rows to return. | |
| query | No | Part of the symbol or name. | |
| min_days | No | Hide bonds maturing in fewer days (very short bills show absurd yields). | |
| traded_only | No | Hide bonds without a price. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower; the description still adds real value with the Mofid-only sourcing limit and the note that very short bills produce absurd yields (explaining the min_days default). It doesn't describe result shape or row ordering beyond the schema, keeping it below 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 tightly packed sentences, front-loaded with the resource and followed by the routing rule and unit conventions; no filler or restatement of the title.
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 six-parameter read-only listing tool with no output schema, the definition covers sourcing, units, and a key statistical caveat. Only the returned row structure and pagination behavior are left implicit, a minor gap given limit is documented.
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 goes further by defining units the schema omits: prices are Rial per 1,000,000 par, ytm is percent per year, and coupon_rate is a fraction (0.18 = 18%). That meaningfully disambiguates interpretation of sort and filter results beyond the schema text.
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 names a specific verb and resource ('List exchange-traded bonds, sukuk and treasury bills') and previews the returned fields (maturity, coupon, price, yield to maturity), which immediately distinguishes it from the generic search sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the alternative and why it doesn't apply: 'Bonds are not in br_search; list them here by group, symbol or yield.' It also names the data source constraint (Mofid only), so an agent knows precisely when this tool is the right call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_etfsETFs with price vs NAVARead-onlyIdempotent
List exchange-traded funds with price, NAV and the gap between them (bubble), traded value and returns.
Use for "cheapest gold ETF" or "fixed-income ETF with the lowest bubble". Mofid rows: price, NAV, gap %, change, value, volume, market cap, signal. Agah rows: price, bubble, NAV, 1-month and 1-year NAV returns, value, manager. Money is Rial. Next: br_stock (Mofid card) or br_fund (Agah detail and history) for one fund; br_screener (kind='etf' or 'mutual') filters funds on any column.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | value = traded value today, change = price change %, nav_gap = market price above(+)/below(-) NAV in %. market_cap is Mofid only. | value |
| type | No | Fund family; omit for all. fixedincome = income funds, goldetf = gold-backed. Agah knows only fixedincome, stock and goldetf (as commodity funds). | |
| limit | No | Rows per source. | |
| query | No | Part of the fund symbol, Persian or Latin. | |
| source | No | mofid (default) = 375 ETFs; agah = 331 listed ETFs with NAV returns and manager; all = both for comparison. | mofid |
| ascending | No | Lowest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world behavior, so safety is covered. The description adds genuinely non-obvious behavior: the two sources return different column sets, Agah lacks several fund families, and all monetary values are in Rial. It stops short of describing what source='all' returns structurally (merged list vs. two blocks) or pagination semantics.
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 examples, then source payloads, then next-step routing — a logical funnel. The dense comma-separated field lists are justified given there is no output schema, though they read more like a spec dump than prose.
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-shape burden and does so by enumerating columns per source and stating the currency. Remaining gaps are the combined behavior of source='all' and whether limit truncates across sources — minor but relevant for a dual-source listing tool.
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 explains sort enums, source counts, and type families in detail. The description's only real parameter-level addition is the Rial currency unit; the per-source row lists describe return values rather than parameter meaning, 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 ("List exchange-traded funds") plus the distinctive fields it returns (price, NAV, gap/bubble, traded value, returns). The per-source row breakdown and the closing routing line separate it from br_screener, br_fund and br_stock without requiring the agent to open 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 concrete task examples ("cheapest gold ETF", "fixed-income ETF with the lowest bubble") and explicit alternatives with the condition that selects them: br_stock/br_fund for a single fund, br_screener for arbitrary column filtering. The agent can route correctly from this text alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_fundFund detail, history or comparisonARead-onlyIdempotent
Show an investment fund from Agah: type, NAV, returns, asset mix and holdings, a daily history, or a side-by-side comparison.
Source: Agah only (Mofid shows ETFs through br_stock and br_etfs, and its own funds through br_mofid_funds). One fund
gives the detail with issue and redeem prices, returns vs index, dollar and gold, and for an ETF the live bubble and
order book. One fund with metric gives NAV, bubble, traded value or NAV gap history, oldest first. Several funds
give returns, NAV, manager and asset mix side by side. Money is Rial, returns percent. Find codes with
br_search(kind='fund') and filter many funds with br_screener.
| Name | Required | Description | Default |
|---|---|---|---|
| funds | Yes | Fund national code (11 digits), name or ETF symbol, e.g. 'هستی بخش آگاه' or '14004856587'. One fund for detail or history; two to six to compare. | |
| metric | No | With one fund: return this daily series instead of the detail. price and returns have unlabeled columns. | |
| points | No | With metric: most recent N daily points. | |
| columns | No | With several funds: screener column names to compare; omit for returns, NAV, size and manager. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. Beyond that the description discloses genuinely useful behavior the annotations do not: data comes from Agah only, monetary values are in Rial and returns in percent, history is ordered oldest first, and the price/returns series have unlabeled columns. It stops short of mentioning rate limits or error behavior, which keeps it at 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?
The structure is strongly front-loaded: capability first, source/routing second, then a compact enumeration keyed to one fund, one fund plus metric, and several funds. It is dense but each clause carries distinct information; the only slight redundancy is restating the metric/history mode that the schema also describes.
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 shapes, and it does so at three levels of granularity (detail fields, daily series, comparison table). Combined with units, ordering, and the 6-fund comparison cap implied by the schema, an agent has enough to call this correctly, though a hint on series length defaults would make it complete.
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 schema already documents each parameter and the baseline is 3. The description still adds meaning not in the schema: units (Rial, percent), the oldest-first ordering of metric series, and the ETF-specific extras (live bubble and order book) that a caller would not infer from parameter names alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb (show) and resource (an Agah investment fund) and enumerates the three output modes: detail, daily history, and side-by-side comparison. The second sentence explicitly separates it from siblings, noting that Mofid funds live in br_mofid_funds and Mofid ETFs in br_stock/br_etfs, so an agent can route correctly 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?
Usage is spelled out per cardinality of the `funds` argument: one fund yields detail (issue/redeem prices, returns vs index, dollar and gold), one fund plus `metric` yields a history series, and several funds yield a comparison. It also names the companion tools for the surrounding steps (br_search with kind='fund' to find codes, br_screener to filter many funds), which is exactly the when/when-not guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_historyPrice historyARead-onlyIdempotent
Return price history of a stock: Mofid OHLC candles (1 minute to weekly) or Agah daily rows with buy and sell flows.
The two shapes differ. Mofid: open, high, low, close, volume, value, oldest first, time in Tehran time, and it works
for indices, funds and options too. Agah: daily last and close price, volume, value and real/legal buyer and seller
counts, no OHLC, daily only. Prices are Rial. Use br_index for index history.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Mofid: calendar days back. Minute candles older than a few weeks may be missing. | |
| limit | No | Newest N rows (Agah: at most 250 trading days). | |
| source | No | mofid (default) = OHLC candles; agah = daily rows with individual vs institutional flows; all = both. | mofid |
| symbol | Yes | Symbol, company name part, or ISIN. Mofid also takes index, fund and option ISINs. | |
| adjusted | No | Mofid: prices adjusted for capital increases and dividends. | |
| resolution | No | Candle size: minutes (1 to 60), '1D' daily or '1W' weekly. Agah has only '1D'. | 1D |
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 description earns credit for what it adds: result ordering (oldest first), Tehran timezone, Rial currency, the absence of OHLC in Agah rows, and data-availability caveats for minute candles. Some of these caveats are duplicated from the schema parameter descriptions rather than being new information.
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 purpose statement followed by a tight comparison of the two shapes; nearly every sentence carries information. Minor deduction for a mid-sentence line break artifact and dense phrasing that makes the shape comparison read as a block.
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 takes on the burden of explaining what is returned for each source, including field lists, ordering, timezone and currency. It stops short of covering pagination interaction between days and limit or behavior when a symbol is not found.
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 enum values, defaults and limits are already fully documented. The description adds conceptual meaning about how source determines the returned shape, but gives no extra syntax or constraint detail for parameters like days/limit interaction. Baseline 3 applies when the schema does the heavy lifting.
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 price history of a stock') and immediately enumerates the two data shapes it can produce. It also distinguishes itself from br_index by name, so an agent can separate it from a sibling 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 routes index queries to br_index and explains when each source mode applies (Mofid for OHLC, Agah for flow data). It does not address the boundary against other siblings like br_technical or br_quotes, so the guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_indexIndex card and index historyARead-onlyIdempotent
Show a market index (Mofid: market cap, free float, P/E and other ratios, intraday move, members) and its daily history.
Without days only Mofid answers, with the index card. With days, Mofid adds daily candles of the index and Agah
returns its total-index series (series 0; Agah does not name its other two series, so they are not offered). Next:
br_industries for sector indices, br_market for today's snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Add this many days of daily history (0 = none). Agah gives about 31 or 365 days. | |
| index | No | Index ISIN: IREXOVERALLINDEX (overall), IRX6XTPI0006 (TEDPIX), IRXZXOCI0006 (Fara-bourse), or an industry index from br_search kind='index'. Agah history exists only for the total index. | IREXOVERALLINDEX |
| source | No | mofid, agah or all. Each source answers in its own block; with all, a source that fails shows {'error': ...} and the other still answers. | all |
| members | No | Mofid: list this many member symbols (0 = none). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive behavior. The description adds useful source-specific behavior: Mofid versus Agah responses change based on `days`, and Agah history is limited to the total-index series.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and appropriately sized for a multi-source index tool. It is mostly efficient, with a slightly dense middle sentence explaining source behavior and Agah series limitations.
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 read-only tool with no output schema, the description is complete enough: it lists the index-card data, explains daily history behavior, describes source-dependent responses, and routes the agent to correct sibling tools.
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. The description adds meaningful interaction semantics beyond the schema by explaining that `days` changes which source answers and what history is returned.
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: 'Show a market index' and 'its daily history.' It also names how it differs from siblings, explicitly routing sector indices to br_industries and today's snapshot to br_market.
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 clear conditional usage: without `days` only Mofid answers with the index card, while with `days` Mofid adds daily candles and Agah returns its total-index series. It also names alternatives for sector indices and today's snapshot.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_industriesIndustriesARead-onlyIdempotent
Rank the bourse industries by value, return, market cap, P/E or money flow, from Mofid and Agah.
Mofid: 53 industries with valuation ratios (P/E, P/B, ROE, margin, beta, dividend yield) and returns. Agah: today's
change, traded value, money flow, advancers and decliners, 30-day and 1-year returns; with industry it shows that
industry's return table and member stocks. Money is Rial. Next: br_technical with an industry ISIN, or br_stock.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | value, return_1m and return_1y work in both sources. Mofid only: market_cap, return_1w, return_3m, p2e, dividend_yield. Agah only: change, money_flow. An unsupported sort is an error in that source's block. | value |
| limit | No | Rows per source. | |
| source | No | mofid, agah or all. Each source answers in its own block; with all, a source that fails shows {'error': ...} and the other still answers. | all |
| industry | No | Agah only: industry ISIN (IRX6...) or name part, to show one industry with its stocks. | |
| ascending | No | Lowest first. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, so the description's added value is in disclosure: money is in Rial, Agah's `industry` mode returns a return table plus member stocks, and sources answer in separate blocks with per-source error isolation. This is genuine behavioral context beyond the annotations, though pagination/return shape is not described.
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 verb and ranking dimensions, then source capabilities, then next steps. The telegraphic style ('Money is Rial') is efficient but slightly clipped; nearly every clause carries information, with only mild redundancy against the schema's sort/source enums.
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 five-parameter, dual-source tool with no output schema, the description covers units, per-source block/error behavior, the industry drill-down mode, and follow-up tools. It stops short of describing the shape of the ranked rows or how limit applies across two blocks, which the schema only partially covers.
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 sort/source/limit/industry semantics, including which sorts work per source. The description reinforces the source capability matrix and the Rial unit, but adds little syntax or format detail beyond what is structured. 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 (rank) plus the resource (bourse industries) and enumerates the ranking dimensions and the two data sources (Mofid, Agah). An agent can immediately distinguish this from br_stocks, br_screener, or br_market_top 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?
Explains the source split (Mofid's 53 industries with valuation ratios vs. Agah's flow/return data) and gives explicit handoff guidance: 'Next: br_technical with an industry ISIN, or br_stock.' It does not state when to prefer br_screener or br_stocks instead, so no true exclusion guidance, but the routing context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_learnLearn: education articles and coursesARead-onlyIdempotent
Search the Mofid learning blog and Agah Pedia for bourse, fund, option and gold explainers, or read one article.
Use it for "what is ROE" or "how do gold ETFs work": search first, then call again with ref from a result to read
it. Mofid ids are numbers, Agah ids are slugs, so ref picks the source itself. kind='categories' lists the Mofid blog
topics; kind='courses' lists Agah Academy topics or searches its courses (titles and links only). Agah Pedia and
Academy answer only from an Iranian network (the error says so elsewhere). Article text is third-party content.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Read one article in full: a number (Mofid post id) or a slug (Agah Pedia, e.g. 'return-on-equity'), taken from a previous result. | |
| kind | No | articles = search or read articles (both sources), categories = Mofid blog topics with ids, courses = Agah Academy topics and course search. | articles |
| page | No | Page number, 1-based. | |
| query | No | Persian search words, e.g. 'صندوق طلا', 'اختیار معامله'. Agah article search needs 4+ characters. | |
| source | No | mofid, agah or all. Each source answers in its own block; with all, a source that fails shows {'error': ...} and the other still answers. | all |
| per_page | No | Articles per page. | |
| max_chars | No | With ref: cut the article text at this many characters. | |
| category_id | No | Browse one category; needs source 'mofid' (id from kind='categories') or 'agah' (category_id of a result). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/openWorld annotations, it discloses a material constraint: Agah Pedia and Academy only answer from an Iranian network. It also explains partial-failure semantics with source='all' (failing source returns {'error': ...}, the other still answers), truncation via max_chars, and that article text is third-party content.
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 workflow, then mode-specific detail, with no filler sentences. It is dense — several facts packed per sentence — but every clause carries operational information. Slightly tighter grouping by parameter would improve scannability.
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, no-required-parameter, no-output-schema tool, it covers the search/read workflow, per-mode outputs (courses give 'titles and links only'), source fallback, and the geo constraint. What is missing is return shape for article search results (fields to expect before using `ref`) and pagination limits, though the schema documents the latter.
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 real meaning: `ref` type encodes the source (Mofid ids are numbers, Agah ids are slugs, so ref selects the source implicitly), and kind='categories' vs. kind='courses' are described by what they enumerate rather than just by enum name. Minor gap: no added guidance on `page`/`per_page` interaction.
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 set ('Search the Mofid learning blog and Agah Pedia ... or read one article') and names the content domain (bourse, fund, option, gold explainers). The two modes — search vs. read one article — are stated explicitly, so an agent can tell this apart from the market-data siblings in the list.
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 concrete triggering examples ('what is ROE', 'how do gold ETFs work') and prescribes the call sequence: search first, then re-invoke with `ref` from a result. It also routes between the three `kind` modes, saying what each returns, which is exactly the when-to-use guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_marketMarket overviewARead-onlyIdempotent
Show today's market snapshot: indices, traded value, money flow and buy/sell queues, from Mofid and Agah.
Start here for "how is the bourse today". Mofid: overall and sector indices (TEDPIX, Fara-bourse, equal-weight), value, volume, market cap, individual net buying and queue counts. Agah: total index, net money flow, symbols moving the index most, plus dollar, coin, gold, oil and crypto prices. Money is Rial. Next: br_market_top or br_stocks for rankings, br_industries for sectors, br_rates for price history.
| Name | Required | Description | Default |
|---|---|---|---|
| movers | No | Agah: how many index-moving symbols to list. | |
| prices | No | Agah: global and local price groups to include; default metals, coins and currencies. | |
| source | No | mofid, agah or all. Each source answers in its own block; with all, a source that fails shows {'error': ...} and the other still answers. | all |
| breadth | No | Also add Agah's whole-market breadth: market P/E, busiest symbols, buyer-power leaders. |
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 does add real behavioral context beyond them: the partial-failure contract ('with all, a source that fails shows {"error": ...} and the other still answers') and the unit ('Money is Rial'). It stops short of freshness/timing or rate-limit details, so this is solid but not 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?
Purpose is front-loaded, the routing sentence is placed last where it helps selection, and the per-source breakdown is scannable. The middle enumeration is dense but each clause maps to something an agent would otherwise have to guess; only minor trimming is possible.
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 well by describing what each source returns and how failures surface. Minor gaps remain around data freshness (only 'today') and response shape, but for a read-only snapshot tool the agent has enough to 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 all four parameters are already documented in the schema, including the same breadth contents and prices default restated here. The description adds little parameter-level meaning beyond noting Rial units and that each source answers in its own block. Baseline 3 applies when the schema does the heavy lifting.
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 ('Show today's market snapshot') and then enumerates exactly what the snapshot contains per source (Mofid indices/value/volume/queues, Agah total index/money flow/movers/prices). It also names the adjacent tools and what each covers, so an agent can separate this from br_market_top, br_industries and br_rates without opening a 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 an explicit entry-point rule ('Start here for "how is the bourse today"') and then routes elsewhere: br_market_top or br_stocks for rankings, br_industries for sectors, br_rates for price history. Both the when-to-use and the when-to-use-something-else conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_market_topMarket rankingsARead-onlyIdempotent
Return one of the market's live top-N lists (most traded, biggest buy queue, best weekly return, lowest P/E, net individual buying, ...).
Source: Mofid only. Agah's own ranking of all stocks (money flow, buyer power, queue, returns) is br_stocks; open a row with br_stock.
Rows carry the symbol, ISIN, price, daily change and the ranking value. Prices are Rial.
| Name | Required | Description | Default |
|---|---|---|---|
| board | Yes | Which ranking. Value/volume: mostvalue, mostvolume, valuetomarketcap, volumetoaveragevolume30. Money flow: netindividual, netinstitutional, mostbuyindpower, institutionalbuypower, mostbidpressure. Size: mostmarketcap, mosteffectonindex. Returns: return1W_desc ... return1Y_desc, DailyChange_desc. Cheapest by ratio (ascending): p2e_asc, p2b_asc, p2s_asc, p2nav_asc, p2d_asc, evtoebit_asc. Queues: bidQueue, askQueue (symbols locked at the limit). | |
| limit | No | Rows to return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, open-world, so the description's job is to add what they don't: it discloses the data source constraint ('Source: Mofid only'), that lists are live, the unit ('Prices are Rial'), and the shape of each row. It does not mention board-specific ordering caveats or what happens when a board has fewer than N symbols.
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: capability first, source and sibling disambiguation second, return shape last. Each sentence carries information the agent needs and 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?
With no output schema, the description compensates by listing the returned fields (symbol, ISIN, price, daily change, ranking value) plus the price unit. It covers everything needed to call the tool, though the ordering guarantee per board and the maximum of 20 rows are only visible in the schema.
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 board enum description already groups every value by category, so the description's category examples largely restate it. The one addition is framing the call as 'top-N', which clarifies that limit is a ranked truncation rather than an arbitrary row count.
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 ('Return one of the market's live top-N lists') and enumerates example rankings, so the agent knows exactly what class of data comes back. It also names the sibling it is NOT ('Agah's own ranking ... is br_stocks'), which removes ambiguity with the most similar tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use br_stocks for Agah-wide rankings across all stocks, use this for Mofid's live top-N boards, and use br_stock to open a single row. Both the alternative tool and the follow-up tool are named with the condition that selects them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_mofid_fundsMofid's own fundsARead-onlyIdempotent
List the 19 investment funds managed under the Mofid brand (Pishtaz, Aram, Atlas, Avand, Ayar, ...) with type, risk level, dividend policy and asset mix.
Source: Mofid only. A marketing catalogue without prices: use br_etfs or br_stock for prices and NAV, br_fund for Agah funds.
This is the marketing catalogue of emofid.com: it has no NAV or price. Use br_etfs or br_stock for prices.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description's real contribution is the repeated warning that no NAV or price is included — useful behavioural context about missing data. It says nothing about freshness, caching, or whether the 19-fund set is fixed or can change.
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 'no NAV or price' point is asserted three times in three consecutive sentences, and the 'Source: Mofid only' line partially duplicates the opening sentence. The front-loaded first sentence is strong, but roughly half the text is repetition that crowds out genuinely new 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?
For a zero-parameter list tool with no output schema, the description covers scope, returned fields, and the boundary against price-oriented siblings — enough to call it correctly. What is missing is only marginal: whether records are static reference data or periodically refreshed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline applies. It does implicitly confirm the call is unfiltered (no selector for fund type or risk), which saves an agent from hunting for a filter 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 specific verb and resource ('List the 19 investment funds managed under the Mofid brand'), names representative funds, and enumerates the attributes returned (type, risk level, dividend policy, asset mix). It also distinguishes itself from br_etfs, br_stock and br_fund, so an agent can route between them without opening 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 explicit when-to-use and when-not-to-use: use this for the Mofid marketing catalogue, but use br_etfs or br_stock for prices and NAV and br_fund for Agah funds. The only mild gap is that it names 'br_stock' while a sibling is 'br_stocks', which could cause a routing slip.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_newsMarket news and noticesARead-onlyIdempotent
Return the newest market news items: exchange notices, Codal letters, Telegram channel posts or Mofid research reports.
Source: Mofid only. Use br_announcements for a company's filing history; codal-mcp reads Codal directly.
Dates are Jalali. For a company's full filing history use br_announcements.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | notices = exchange/Codal notices (trading halts, capital increases), filings = latest Codal letters with PDF links, telegram = market Telegram channel posts, research = Mofid's weekly research PDFs. | notices |
| chars | No | Cut each text at this many characters. | |
| count | No | How many recent items to fetch from the site (it returns the newest N). | |
| symbol | No | Keep only notices/filings of this symbol (Persian, e.g. 'فملی'). Applies to notices and filings. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, so the description only needs to add context — and it does: the Mofid-only source, the Jalali date convention, and the fact that results are the newest N taken from the site. It does not mention rate limits, failure modes, or freshness lag, which would be the remaining useful disclosures for a feed tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then source constraint, then routing — good ordering. The closing sentence repeats the br_announcements routing already stated in line two, which is wasted space in an otherwise tight definition.
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 should hint at what comes back; it implies a list of recent items with text truncated per the chars parameter and confirms the source and date convention. Adequate for a simple read-only feed tool, though it never states the return shape (headline/link/date fields) explicitly.
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 enum values and defaults all documented in the schema itself, so the schema carries the parameter burden. The description adds no parameter-level detail beyond the Jalali date note (which applies to returned values, not inputs). 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 ('Return the newest market news items') and enumerates exactly the four content types covered: exchange notices, Codal letters, Telegram posts, Mofid research. An agent can distinguish this from br_announcements 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?
Explicitly names the alternative ('Use br_announcements for a company's filing history') and a source constraint ('Source: Mofid only'). The one gap is the overlap created by kind='filings', which returns latest Codal letters here while br_announcements covers filing history — the boundary is only loosely drawn, and the alternative is repeated twice rather than used to sharpen that distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_optionsStock options: chain or one contractARead-onlyIdempotent
List stock-option contracts (about 1,600) with strike, expiry, moneyness, open interest and flows, or show one contract.
Source: Agah only. Use the chain for "options on Shepna expiring soon" or "most traded calls"; prices are Rial per
underlying share and each row has its contract size. Pass option (an ISIN from the chain) for one contract: margin,
break-even distance, order book, real/legal flows. Find an underlying with br_search first if unsure of the symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| side | No | Chain filter: call (اختیار خرید) or put (اختیار فروش) only. | |
| sort | No | Chain order. | value |
| limit | No | ||
| expiry | No | Chain filter: expiry date YYYY-MM-DD (Gregorian) as in the results. | |
| option | No | Option ISIN from a previous result, e.g. 'IRO9PNES0A01', to show that one contract. Omit to list the chain. | |
| underlying | No | Chain filter: underlying symbol, e.g. 'شپنا' (Persian), or part of the company name. |
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, but the description adds substantive context the annotations cannot: the data source is Agah only, prices are quoted in Rial per underlying share, each row carries its contract size, and the single-contract mode returns margin, break-even distance, order book and real/legal flows. That is real disclosure of units and return content for a tool with no output schema.
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 chain-versus-single-contract split is front-loaded in the first sentence and the closing sentence handles the prerequisite lookup. The block is a little dense with embedded quoted examples and an awkward source line, but no sentence is genuinely wasteful.
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 six optional parameters and no output schema, the description covers both operating modes, the fields returned in each, currency/units, and the data-source restriction. Pagination and ordering behavior around `limit`/`sort` remain unstated, which is the main residual 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 coverage is 83%, so the baseline is 3; the description goes past that by explaining the mode switch ("Pass `option` (an ISIN from the chain) for one contract") and by tying `underlying` to a search-first workflow. It still leaves the `sort` enum values and the `limit` cap unexplained, so it is good but not complete.
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 names a specific resource (stock-option contracts, ~1,600) and a specific dual behavior: list the chain, or show one contract when `option` is supplied. It also states what each row carries (strike, expiry, moneyness, open interest, flows), so an agent can distinguish this from siblings like br_stocks or br_screener without opening a 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 gives concrete use cases ("options on Shepna expiring soon", "most traded calls") and an explicit routing rule: find the underlying with br_search first if the symbol is unknown. It does not, however, exclude or compare against the other market-data siblings, so the when-not-to-use side is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_quotesGet quotesARead-onlyIdempotent
Return live price rows for 1 to 30 symbols at once: last and closing price, change, volume, limits, best bid and ask, returns.
Source: Mofid only. Use it after br_search to price several symbols at once, or for fund and index ids; br_stock gives one symbol in depth.
Prices are Rial. last is the last trade, close the closing (weighted) price the exchange uses for change. Index and fund ids work too.
| Name | Required | Description | Default |
|---|---|---|---|
| isins | Yes | ISIN-style id from br_search, e.g. IRO1MSMI0001 (فملی), IREXOVERALLINDEX (overall index). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and openWorld, so the safety profile is covered. The description then adds genuinely non-structured context: the data source is Mofid only, prices are denominated in Rial, and 'last' means last trade while 'close' is the weighted closing price the exchange uses for change. The main remaining gap is that it doesn't say whether symbols with no data are omitted or returned as null.
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?
Well front-loaded: the payload and batch size lead, then source, then routing advice, then field semantics. Minor redundancy remains, since 'Index and fund ids work too' repeats the earlier 'for fund and index ids' clause and could be merged.
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 return-value burden, and it does so by enumerating the returned fields and the currency. For a single-parameter read tool this is close to complete; the only unaddressed behaviour is handling of invalid or data-less symbols within a batch.
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 schema already documents the array, its 1-30 bounds and ISIN-style ids with equity and index examples, so the baseline is 3. The description adds some meaning by confirming fund and index ids are accepted and that results are priced in Rial, but it doesn't clarify id formatting edge cases or how mixed equity/index batches are ordered.
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 ('return live price rows') plus the exact payload fields (last, close, change, volume, limits, bid/ask, returns) and the batch range of 1 to 30 symbols. It also distinguishes itself from siblings by naming br_search (for ids) and br_stock (single symbol in depth). An agent can tell br_quotes apart from br_stock 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?
Gives an explicit usage sequence ('use it after br_search to price several symbols at once') and an explicit alternative with its selection condition ('br_stock gives one symbol in depth'). It also states a source constraint ('Source: Mofid only') and calls out that fund and index ids are valid inputs, which are the main cases where an agent might wrongly reach for a different tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_ratesCurrency, gold, coin and commodity pricesARead-onlyIdempotent
Return free-market prices of currencies, crypto, coins, 18k gold, the global ounce, oil and metals, or one code's daily history.
Source: Mofid only. Live rows have price, change, time and 7/30/365-day low and high. Rial prices: divide by 10 for Toman. History rows have close and change % (gold and coin rows also open, high, low), oldest first, back to 2019-2021. Agah's br_market also shows dollar, coin, gold and oil prices as a quick glance.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | currency = free-market currencies and crypto (Rial), gold_coin = coins, 18k gold, ounce and 1-day coin certificates (Rial), commodity = oil, metals (USD). | gold_coin |
| limit | No | History: return only the newest N days. | |
| query | No | Filter by code (USD, EUR, USDT, BTC, IMCOIN, Gold18, WTI, Cu) or Persian name. With history_days it must be the exact code. | |
| history_days | No | 0 = live prices. Above 0 (with an exact code in query) = daily history over this many calendar days. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, idempotent read, and the description builds on that with real operational context: single source ('Mofid only'), unit conventions ('Rial prices: divide by 10 for Toman'), the fields each row carries in live vs history mode, ordering ('oldest first'), and coverage horizon ('back to 2019-2021'). This is information an agent cannot recover from the annotations or schema.
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 resource list and the live/history split, then a compact source-and-shape paragraph. Dense but every sentence carries signal; the trailing sibling reference sits awkwardly at the end of a paragraph about row formats rather than in its own routing sentence.
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 four optional parameters, the description does the heavy lifting: it names the row fields, ordering, unit system and data source. What is missing is failure behavior, e.g. what happens when no code matches or when history is requested for a range beyond the available window.
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 would be 3; the description earns more by explaining that history mode requires an exact code and by clarifying the unit basis behind currency/gold_coin versus commodity values. It does not add much beyond the schema's own per-parameter descriptions, so it stops short of 5.
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 set ('Return free-market prices of currencies, crypto, coins, 18k gold, the global ounce, oil and metals') and adds the distinct history mode ('or one code's daily history'). The two modes are cleanly separated, so an agent can tell this apart from quote/screener siblings 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 names the alternative for a quick glance ('Agah's br_market also shows dollar, coin, gold and oil prices'), which steers agents away from this tool when they only need a top-level view. It also implies the history branch requires an exact code, though it never states a hard when-not condition such as 'do not use for equities or funds'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_scoresValuation scoresARead-onlyIdempotent
Return Bourse View's valuation scores: theoretical price vs market price, a technical rating (Buy/Neutral/Sell) and a fundamental score out of 10.
Source: Mofid only. Pair with br_stock for price and ratios; br_technical (Agah) gives an indicator tally.
Pass ISINs for specific symbols, a section to rank the market on profitability, liquidity, momentum etc., or nothing for the best fundamental scores overall.
| Name | Required | Description | Default |
|---|---|---|---|
| isins | No | ISINs to score. Omit to rank the whole market by section. | |
| limit | No | Rows to return. | |
| section | No | Rank all symbols on one fundamental section (score out of 10). Needs isins to be omitted. Omit both for the overall table. | |
| technical | No | Overall table only: keep this technical rating. | |
| min_fundamental | No | Overall table only: minimum fundamental score (0-10). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds substantive context the annotations cannot: the data source is Mofid only, and the response shape (score scale out of 10, rating vocabulary Buy/Neutral/Sell). It does not mention volume or rate limits, but nothing here suggests those matter for a scored lookup.
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 what is returned, then source/routing, then the three input modes – a sensible order with no filler. The "profitability, liquidity, momentum etc." list is slightly redundant with the enum, but it is a minor cost.
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 five optional parameters, the description carries the return-shape burden and does it: it names the comparison fields, the rating scale and the 10-point fundamental score. Only row ordering and how the theoretical-price delta is signed are left implicit.
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 descriptions already explain the isins/section/neither exclusivity and the "overall table only" filters. The description largely restates this synthesis and only adds example section names, so it does not add meaning beyond the structured fields.
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?
"Return Bourse View's valuation scores" names a specific resource, and the sentence then enumerates the actual payload (theoretical vs market price, technical rating, fundamental score out of 10). It also distinguishes itself from br_stock and br_technical by naming what those siblings return instead.
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?
Explicit mode selection: ISINs for named symbols, `section` to rank the market, nothing for the overall fundamental table. It also routes the agent to alternatives ("Pair with br_stock for price and ratios; br_technical (Agah) gives an indicator tally"), which is exactly the sibling disambiguation an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_screenerScreen stocks or funds by any columnARead-onlyIdempotent
Filter, sort and compare all stocks or all funds on the same data as Agah's screener pages (about 900 stocks, 330 ETFs, 475 funds).
Source: Agah only. Filters stocks or funds on any column; use br_etfs for a plain ETF list with NAV gap and br_fund for one fund.
Use it for "stocks with P/E under 6 and ROE over 30", "best 1-year fixed-income funds", "ETFs with the lowest bubble". Returns are percent; money is Rial; fund Nav is in Rial. Funds also have FundType. Column names are the site's (see list_columns); two return families exist for ETFs: names ending in 2 are NAV returns, the others market-price returns.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | 'stock' all stocks; 'etf' exchange-traded funds with market price; 'mutual' every fund with NAV issue/redeem prices. | |
| sort | No | Column name to sort by (descending unless ascending=true). | |
| limit | No | ||
| columns | No | Column names to return (e.g. ['PToE','Roe'] for stocks, ['Nav','ReturnOf365DaysAgo'] for funds). Omit for a default set; use list_columns=true to see all. | |
| ascending | No | ||
| fund_type | No | Funds only: fixed income, equity, commodity or other. | |
| max_values | No | Keep rows where column <= value, e.g. {'PToE': 6}. | |
| min_values | No | Keep rows where column >= value, e.g. {'Roe': 30}. | |
| list_columns | No | Return the available columns (name, Persian title) instead of rows. | |
| name_contains | No | Keep rows whose name/symbol contains this text (Persian). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description instead spends its words on provenance (Agah only), data units (returns in percent, money in Rial, fund Nav in Rial), and the ETF column-naming trap where names ending in 2 are NAV returns and the rest are market-price returns. That is genuinely non-obvious behavioral context. It stops short of describing the row/response shape or any size or performance limits for a ~1,700-instrument screener, 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?
Front-loaded with the verb, scope, and sibling routing in the first two sentences, then examples, then a dense units paragraph. Every sentence carries information, though the trailing units/column-family paragraph is compressed to the point of being easy to skim past, and the parenthetical dataset sizes sit awkwardly mid-sentence.
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 10-parameter, no-output-schema screener, the description covers the essentials an agent needs to call it correctly: which kind values exist, that columns must be looked up with list_columns, filter direction via max/min examples, and the unit conventions that determine whether a numeric threshold is sane. The remaining gap is that the return shape (rows of dicts keyed by column name) is never stated and there is no output schema to fill it in.
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 80%, so the baseline is 3; the description earns the bump by explaining that column names are the site's own and must be discovered via list_columns, and by clarifying units per column family (percent vs Rial) and the existence of FundType for funds. It still doesn't explain the interaction between sort/ascending/limit or what a default column set contains, which the schema also leaves vague.
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 opening sentence gives a specific verb set (filter, sort, compare) plus the resource (stocks or funds) and scopes it to the Agah screener universe with concrete sizes (~900 stocks, 330 ETFs, 475 funds). It explicitly contrasts itself with siblings: br_etfs for a plain ETF list with NAV gap and br_fund for a single fund.
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?
Usage is stated as concrete example queries ("stocks with P/E under 6 and ROE over 30", "best 1-year fixed-income funds", "ETFs with the lowest bubble"), and the alternatives are named with the condition that selects them (br_etfs for a plain list, br_fund for a single fund). Nothing about when to reach for this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_searchSearch symbols, funds, options and indicesARead-onlyIdempotent
Find the id of a stock, fund, option or index by name or symbol, in Mofid and Agah.
Use it first when you only have a name. Mofid results carry an isin (every Mofid tool takes it); Agah results an
id (stock and option ISIN, national code like '14010557380_A01' for funds, industry ISIN). Pass either to br_stock, br_history,
br_fund or br_options. Funds have a different id in each source, so the two lists are kept apart, not merged.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Instrument group: fund = ETFs and funds, index = market and industry indices. Options are thousands of contracts, so ask for them explicitly. | stock |
| limit | No | Maximum results per source. | |
| query | Yes | Part of a symbol, company or fund name, or an ISIN; Persian or Latin, e.g. 'فولاد', 'اهرم', 'IRO1MSMI'. | |
| source | No | mofid, agah or all. Each source answers in its own block; with all, a source that fails shows {'error': ...} and the other still answers. | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds real context beyond them: results are per-source blocks, and one failing source does not sink the other. It does not describe result ordering or what a zero-hit response looks like, keeping it 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?
Two tight paragraphs, front-loaded with purpose then workflow, with no filler sentences. Minor duplication with the schema's `source` description about partial failure keeps it from a 5.
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, and the description compensates by explaining exactly what identifiers come back and how to consume them downstream. For a four-parameter lookup tool with full annotation coverage, nothing an agent needs 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% (kind, limit, query, source are all documented, including the caution about options), so the baseline is 3. The description still adds value by explaining what the returned identifier means per source (isin for Mofid, id/ISIN or national code for Agah) and why the two lists are kept apart, which is the semantic key to using the results correctly.
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 set: 'Find the id of a stock, fund, option or index by name or symbol, in Mofid and Agah.' It also names the sibling tools it feeds (br_stock, br_history, br_fund, br_options), so an agent can place it precisely in the tool graph.
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 when-to-use rule ('Use it first when you only have a name') and an explicit next step ('Pass either to br_stock, br_history, br_fund or br_options'). It also warns that funds have distinct ids per source, which tells the agent not to deduplicate across sources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_stockOne stock or ETF in detailARead-onlyIdempotent
Show one stock (or, on Mofid, an ETF) in detail: price, ratios, returns, real vs legal flows, from Mofid and Agah.
Use it after br_search. Mofid gives a price card with P/E, EPS, NAV, profile, ownership flow and scores; Agah gives price, ratios, margins, returns vs industry and index, flows and order book. The fields differ, so both are shown, not merged. Prices are Rial. Next: br_history for candles, br_stock_events (Agah) for dividends, br_technical for signals. For an Agah fund use br_fund.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | mofid, agah or all. Each source answers in its own block; with all, a source that fails shows {'error': ...} and the other still answers. | all |
| symbol | Yes | Symbol (فولاد), part of the company name, or ISIN (IRO1FOLD0001). ETF symbols work on Mofid. | |
| order_book | No | Also return Mofid's five best bid and ask levels (Agah's card always has its order book). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the description focuses on genuinely new behavior: the two sources are returned as separate non-merged blocks because their fields differ, prices are denominated in Rial, and the schema notes partial failure for source=all. It doesn't discuss response size, latency, or rate limits, which keeps it 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?
Four sentences, front-loaded with the core purpose, then usage routing, then next-step pointers. The per-source field inventory is slightly long but does real work in telling the agent why output is duplicated rather than merged.
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 characterizing what each source returns and why the shapes differ, plus currency and the partial-failure contract. That is enough for an agent to call it correctly and interpret the result.
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 enum values, symbol formats (فولاد, name fragment, ISIN) and order_book semantics are already documented. The description only reinforces that ETF symbols resolve on Mofid; it adds little meaning beyond the schema, 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 ('Show one stock ... in detail') and enumerates what is returned: price, ratios, returns, real vs legal flows, from Mofid and Agah. It also distinguishes itself from list-orientation siblings (br_stocks) and from br_fund for Agah funds.
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?
Explicit sequencing is given ('Use it after br_search') along with named alternatives for adjacent needs: br_history for candles, br_stock_events for dividends, br_technical for signals, br_fund for an Agah fund. The agent knows both when to pick this tool and where to go instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_stock_eventsDividends, capital changes, notices and major holders of a stockARead-onlyIdempotent
List a stock's cash dividend history, capital increases, recent exchange notices and major shareholders.
Source: Agah only. Use it after br_search or br_stock.
Dividends are per share in Rial with the fiscal year. Shareholders are the latest disclosed, with percent owned.
| Name | Required | Description | Default |
|---|---|---|---|
| stock | Yes | Symbol, company name part, or ISIN. | |
| holders | No | Also list the major shareholders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and openWorld, so the safety profile is covered. The description adds genuinely new context beyond that: the single upstream source (Agah), the dividend unit and fiscal-year scoping, and the freshness basis for shareholder data ("latest disclosed"). It omits failure behavior for an unknown symbol and whether history depth is bounded.
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 front-loads the four returned data types, followed by short, scannable lines for source and unit conventions. Nothing is wasted, though the trailing 'Dividends are per share...' sentence mixes two unrelated output conventions and could have been folded more tightly.
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 read-only, two-parameter tool with no output schema and full annotation coverage, the description supplies what an agent needs: returned content, data provenance, unit conventions, and call sequencing. Remaining gaps (history depth, behavior on ambiguous symbol matches) are minor relative to the tool's simplicity.
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 are already documented, including the holders default and its meaning. The description adds no parameter-level detail beyond the schema — the unit and freshness notes it provides concern output values rather than inputs. Baseline 3 is appropriate where the schema carries the parameter burden.
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 names a specific verb (list) and enumerates the exact resources returned: cash dividend history, capital increases, exchange notices, and major shareholders. That is far more informative than the title alone. It does not, however, explicitly distinguish itself from br_announcements, which by name likely also covers exchange notices.
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?
"Use it after br_search or br_stock" gives a concrete sequencing rule, and "Source: Agah only" states a data-coverage constraint the agent should know before relying on results. It stops short of naming alternatives (e.g., br_announcements for notices, or br_stock for quote-only lookups) or stating when-not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
br_stocksStock market watch with sortingARead-onlyIdempotent
Rank all listed stocks (about 750) by today's change, traded value, money flow, buyer power, queue or past returns.
Source: Agah only. Mofid's equivalents are the br_market_top rankings. Then call br_stock for one symbol.
Use it for "biggest gainers today", "most traded", "where is money entering" questions. Money is Rial, prices Rial. net_money_flow is the net money moving in (positive) or out (negative). buyer_power is the individual buyer vs seller average-size ratio. Then call br_stock for one symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to rank by. | value |
| limit | No | ||
| scale | No | Large, medium or small cap. | |
| market | No | Only Tehran Stock Exchange (بورس) or Fara Bourse (فرابورس). | |
| ascending | No | Lowest first (default highest first). | |
| min_value | No | Minimum traded value today, Rial. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, so the safety profile is covered. The description adds value the annotations cannot: the ~750-symbol universe, the single-source (Agah) constraint, and the Rial currency unit for money and prices. It does not describe output shape or ordering ties, which is the remaining gap.
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 action and kept to a few tight sentences, but the instruction "Then call br_stock for one symbol" appears twice, which is pure duplication in an otherwise economical definition.
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?
Six optional parameters all have defaults, no output schema exists, and the description still conveys enough to call correctly: what gets ranked, in what unit, from which source, and how to drill down. Missing detail on default sort behavior in prose and on the returned list contents keeps it short of perfect.
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 83%, so the baseline is 3, but the description earns above that by defining the two least self-explanatory ranking fields: net_money_flow as signed net inflow/outflow and buyer_power as the individual buyer-vs-seller average-size ratio. Fields like queue_value and volume_vs_avg in the sort enum remain unexplained.
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 with scope: rank all listed stocks (~750) by a named set of metrics. It also delineates siblings by naming br_market_top as the Mofid equivalent and br_stock for single-symbol follow-up, so an agent can pick this tool 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 concrete user-question triggers ("biggest gainers today", "most traded", "where is money entering") plus a source constraint (Agah only; Mofid rankings live in br_market_top). The next-step routing to br_stock for a single symbol is explicit 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.
br_technicalTechnical analysis summary of a stock or industryARead-onlyIdempotent
Show Agah's technical-indicator summary (moving averages and oscillators vote, RSI, MACD and others) for a stock or industry.
Source: Agah only (Mofid has only the coarse Buy/Neutral/Sell rating in br_scores). Use it after br_stock.
action is 2 strong buy, 1 buy, 0 neutral, -1 sell, -2 strong sell (inferred from the buy/sell counts). It is an automatic indicator tally, not advice.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Stock symbol/name/ISIN, or an industry ISIN (IRX6...) from br_industries. | |
| timeframe | No | Daily, weekly or monthly signals. | oneDay |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world behavior, so the bar is lower. The description adds real context beyond them: a source restriction to Agah, the derivation of the action value from buy/sell counts, and a disclaimer that it is an automatic tally rather than advice. It does not cover latency, coverage gaps for symbols with insufficient history, or result shape, 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 purpose is front-loaded in the first sentence, followed by source/routing notes and then output semantics. Every sentence carries information, though the line-broken layout and the parenthetical enumerations are slightly denser than needed.
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 properly takes on the job of explaining the return value by defining the action scale (-2 to 2) and how it is derived. Combined with the source restriction and sibling routing for a 2-parameter read-only tool, nothing essential for correct invocation 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 description coverage is 100%, so both target and timeframe are already documented, including the enum meanings. The description adds no syntax, format, or validation detail for either parameter; its explanation of the action scale is about return values, not inputs. 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?
"Show Agah's technical-indicator summary (moving averages and oscillators vote, RSI, MACD and others) for a stock or industry" gives a specific verb, resource, and content list. It explicitly distinguishes itself from the sibling br_scores, which only offers a coarse Buy/Neutral/Sell rating, so an agent can route between 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 sequencing ("Use it after br_stock") and a source constraint (Agah only, with br_scores named as the alternative for Mofid data). It lacks an explicit when-not-to-use clause, but the alternative routing is clear enough to choose correctly.
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.
22 tool updates
v0.1.2- First observed
br_announcements - First observed
br_bonds - First observed
br_etfs - First observed
br_fund - First observed
br_history - First observed
br_index - First observed
br_industries - First observed
br_learn - First observed
br_market - First observed
br_market_top - First observed
br_mofid_funds - First observed
br_news - First observed
br_options - First observed
br_quotes - First observed
br_rates - First observed
br_scores - First observed
br_screener - First observed
br_search - First observed
br_stock - First observed
br_stock_events - First observed
br_stocks - First observed
br_technical
TDQS
Scored across 22 tools
Most tools target distinct resources or asset classes, and descriptions explicitly cross-reference alternatives such as br_etfs vs br_screener and br_stocks vs br_market_top. However, there is still meaningful overlap between list/screener/detail tools and between source-specific ranking tools, so an agent must read the source and 'Next' guidance carefully.
All tools use a consistent br_ prefix with lowercase snake_case names. Singular/plural distinctions are used meaningfully, e.g. br_stock vs br_stocks and br_fund vs br_mofid_funds.
Twenty-two tools is on the heavy side, but the server covers a wide domain: stocks, ETFs, funds, bonds, options, indices, industries, news, filings, rates, and education. The count is defensible, though a few overlapping list/ranking tools could potentially be consolidated.
The surface covers search, quotes, history, market overview, asset-class detail, screening, rankings, filings, technicals, valuation scores, rates, and educational content. Minor gaps remain, such as structured financial statements or more direct fundamental data beyond announcements and scores, but most workflows have a path.
Maintenance
Related MCP Connectors
Live crypto + IDX stock market intelligence for AI agents — 19 tools, no API key.
Live Iran exchange rates, gold, crypto, and Toman market data for AI agents.
Agentic brokerage access to a US brokerage account: quotes, orders, positions, cash and documents.
Read-only access to your MetaTrader 4 and 5 accounts for AI agents: balances, open positions, trade history with win rate, live quotes, symbol specs and candles. It cannot place, modify or close orders.
Related MCP Servers
- 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 search and read Iranian listed companies’ Codal disclosures, including financial statements, EPS and monthly activity reports as tables, meeting decisions, and PDF/Excel links, plus company and fiscal-year lookups.57MIT
- AlicenseAqualityBmaintenanceEnables AI agents to search, rank, and compare Iranian mutual funds and ETFs; inspect NAV, returns, size, flows, investors, and managers; and retrieve Tehran and Farabourse market overviews, indices, stock quotes, and industry data read-only without an API key.11MIT
- AlicenseAqualityBmaintenanceGives AI agents read-only access to the public trade and supply data of the Iran Mercantile Exchange, covering commodity trades, upcoming supply offers, daily price series, market totals, options, certificates, rankings, news and weekly reports. Requires no API key or account, and works in Claude, Cursor, Copilot and any other MCP client.14MIT