Skip to main content
Glama
tgju-mcp

tgju-mcp

by sepehr071

tgju-mcp: TGJU MCP server for AI agents (dollar, gold, coin and crypto prices in Iran)

Let your AI agent read live Iranian market prices from TGJU (tgju.org). An unofficial, read-only MCP server for TGJU (شبکه اطلاع‌رسانی طلا، سکه و ارز), Iran's market-price portal: dollar, euro, gold, coin, crypto and commodity prices, category tables and daily history, from Claude, Cursor or Copilot.

PyPI Python CI MCP Registry License: MIT mcpfarsi

Install in VS Code

For AI agents · Why · What it can do · Quick start · Tools · How it works · Good to know · FAQ · Configuration · فارسی · Development


For AI agents

  • What: unofficial MCP server (model context protocol) for tgju.org, the Iranian portal for dollar, gold, coin, crypto and commodity prices. Symbol search takes Persian and English names.

  • Install: uvx tgju-mcp or claude mcp add tgju -- uvx tgju-mcp. Transport: stdio. Needs uv (Python 3.10+).

  • Auth: none, no API key or account. Optional TGJU_MCP_PROXY (HTTP proxy URL, or a comma-separated list); system proxy settings are ignored.

  • Access: read-only. It cannot log in or trade, so no confirmation is needed before calling any tool.

  • Tools: 6, all prefixed tj_. Typical sequence: tj_market_summary -> tj_category_table -> tj_price_history. If you only have a name, call tj_search_symbols first and pass its symbol to the other tools.

  • Use when: the user asks for the dollar, euro, gold, coin, Bitcoin or Brent price in Iran, a price table of a group, or a symbol's daily history.

  • Do not use when: the user wants to trade or buy anything, needs stock-exchange (TSETMC) data, or asks about markets outside the TGJU feed.

  • Output: compact JSON. Iranian prices are quoted by the site in Rial; those symbols also carry *_toman (Rial / 10). Global symbols (ounce, Brent, crypto in USD, currency pairs) keep their listed unit (unit: as_listed).

  • Machine-readable: server.json and the iran-mcp catalog.

Related MCP server: ime-mcp

Why

TGJU is where Iranians check the dollar, gold and coin price, but it is a busy web page with hundreds of symbols. Asking "what is the dollar, the 18k gold gram and the Emami coin right now, and how did the dollar move over the last month?" means several screens. With tgju-mcp an agent answers it in a few calls and returns a short summary instead of raw tables.

You: What are the main rates today, and how has the dollar moved recently?

Agent: calls tj_market_summary -> tj_search_symbols -> tj_price_history

It reads the key rates in one call, finds the dollar symbol, and summarises its recent daily closes.

Every reply is trimmed to stay under about 15 KB, so it does not flood the agent's context.

What it can do

  • Summarise the market in one call: dollar, euro, dirham, pound, lira, gold gram and ounce, coins, silver, Brent, Bitcoin, Ethereum, Tether

  • Quote symbols: live price, change, high and low for one or more symbols

  • List price tables of a group: gold, coin, retail coin, currency, government currency, Sana, Nima, crypto, or any folder id

  • Browse the market tree to find folders and symbols

  • Search symbols by name across internal, global and crypto markets

  • Pull daily history: open, low, high, close and change, with Jalali date filters

  • Read-only by design: no login, no trading

Example prompts:

  • "What is the dollar, euro and 18k gold gram price right now?"

  • "Show the coin price table."

  • "How has the free-market dollar moved over the last 30 days?"

  • "Price of Bitcoin and Tether in Toman."

  • "Find the symbol for Brent oil and show its latest price."

  • قیمت دلار، یورو و طلای ۱۸ عیار الان چند است؟

  • جدول قیمت سکه امروز را نشان بده.

  • روند قیمت دلار در یک ماه گذشته چطور بوده؟

Quick start

You need uv. No API key or account.

claude mcp add tgju -- uvx tgju-mcp

Settings → Developer → Edit Config, then add:

{
  "mcpServers": {
    "tgju": { "command": "uvx", "args": ["tgju-mcp"] }
  }
}

Add the Claude Desktop block above to ~/.cursor/mcp.json (or .cursor/mcp.json in a project).

Click Install in VS Code above, or add to .vscode/mcp.json:

{
  "servers": {
    "tgju": { "type": "stdio", "command": "uvx", "args": ["tgju-mcp"] }
  }
}
codex mcp add tgju -- uvx tgju-mcp

Or in ~/.codex/config.toml:

[mcp_servers.tgju]
command = "uvx"
args = ["tgju-mcp"]

Add to ~/.gemini/settings.json:

{
  "mcpServers": {
    "tgju": { "command": "uvx", "args": ["tgju-mcp"] }
  }
}

Add the Claude Desktop block to ~/.codeium/windsurf/mcp_config.json.

It is a standard stdio MCP server: run uvx tgju-mcp, or pip install tgju-mcp and run tgju-mcp.

Tools

Symbols are lower-case slugs such as price_dollar_rl, geram18 or sekee. If you do not know one, call tj_search_symbols first.

Tool

What it does

tj_market_summary

Key Iranian market rates in one call: dollar, euro, dirham, pound, lira, gold gram and ounce, coins, silver, Brent, Bitcoin, Ethereum, Tether

tj_get_prices

Live price, day change, high and low for one or more TGJU symbols

tj_category_table

Live price table of one TGJU group: price, change, day high/low/open per symbol

tj_list_categories

Browse TGJU's market tree: folders (with ids) and symbols

tj_search_symbols

Find TGJU symbols by name

tj_price_history

Daily history (open, low, high, close, change) of a TGJU symbol, for charts and trend questions

All 6 tools are annotated readOnlyHint: true.

How it works

  AI agent  (Claude, Cursor, Copilot, ...)
      │
      │  MCP over stdio
      ▼
  tgju-mcp  (runs on your machine)
      │
      │  HTTPS
      └──────▶  api.tgju.org, call4.tgju.org   live feed, tables, history, search

tgju-mcp runs locally and calls the same endpoints the tgju.org site uses. It has no hosted server in between and no API key. Requests go out through a Chrome-impersonating client, at most 2 at a time with a little jitter. Answers are kept for 15 seconds, a failed GET is retried, and it only talks to api.tgju.org and call4.tgju.org. It only reads.

Good to know

  • Units: the feed has no unit field. Gold grams, coins, free-market and other price_* currencies and crypto-*-irr are in Rial (*_toman = Rial / 10). ons, silver, oil_*, crypto-* (USD) and pairs like usd-try-ask keep their listed unit (as_listed).

  • Unit rule is a heuristic on the symbol name, so check unusual symbols against tgju.org. Folder-id tables apply it per row (unit: mixed); symbols outside it, such as exchange-house quotes with slug names, stay as_listed.

  • Reply caps: tj_category_table and tj_price_history return at most 50 rows, so replies stay under about 14 KB.

  • Stale quotes: a quote older than 2 days carries stale: true. Illiquid symbols can be delayed, so check time.

  • Symbols missing from the live feed (slugs from tj_search_symbols) are answered by tj_get_prices with the latest daily close (source: history, time = date).

  • Dates: history returns Gregorian and Jalali dates; from_date and to_date filters are Jalali YYYY/MM/DD.

  • Search returns at most 10 hits.

  • What it does not do: no trading or orders, no account features, no prices outside the TGJU feed.

  • Network: tgju.org answered plain requests from both a proxy and a direct connection when tested. If your network blocks it, set TGJU_MCP_PROXY. System proxy variables are ignored on purpose.

FAQ

TGJU has no documented public API. tgju-mcp is an unofficial MCP server with 6 read-only tools that calls the same endpoints the tgju.org web app uses and returns compact JSON for AI agents.

Add the server with claude mcp add tgju -- uvx tgju-mcp, or use the matching config in Quick start, then ask in plain language, in Persian or English.

TGJU quotes Iranian prices in Rial. Those symbols also come back as *_toman (Rial / 10). Global symbols such as the gold ounce, Brent and crypto in USD keep their listed unit.

Call tj_market_summary for the main rates, or tj_search_symbols with a name (Persian or English) and pass the returned symbol to tj_get_prices or tj_price_history.

Some symbols are illiquid or no longer updated. A quote older than 2 days is marked stale: true; check the time field.

No. It has no login and no trading calls, it only reads public prices. Nothing it returns is financial advice.

It is what TGJU serves, kept for up to 15 seconds in a local cache, and it may be delayed.

npx @modelcontextprotocol/inspector uvx tgju-mcp

Configuration

Variable

Default

Meaning

TGJU_MCP_PROXY

unset

Optional HTTP proxy URL for tgju.org requests; system proxy settings are ignored. Also accepts a comma-separated list: one is used until it gets blocked or fails to connect, then the next

فارسی: سرور MCP قیمت دلار، طلا و سکه (TGJU)

tgju-mcp یک سرور MCP غیررسمی و فقط‌خواندنی برای سایت TGJU (شبکه اطلاع‌رسانی طلا، سکه و ارز) است. این سرور به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می‌دهد قیمت دلار، یورو، طلا، سکه، ارز دیجیتال و کالاها را از tgju.org بخواند.

چه کارهایی می‌کند

  • خلاصه بازار در یک فراخوانی: دلار، یورو، درهم، پوند، لیر، گرم و اونس طلا، سکه‌ها، نقره، برنت، بیت‌کوین، اتریوم و تتر.

  • قیمت لحظه‌ای نماد با تغییر روز، بیشترین و کمترین قیمت.

  • جدول قیمت گروه‌ها: طلا، سکه، ارز، ارز دولتی، ارز نیما، ارز سنا، ارز دیجیتال.

  • جستجوی نماد و گشت‌وگذار در درخت بازار.

  • تاریخچه روزانه قیمت (باز، کم، زیاد، پایانی و تغییر) با فیلتر تاریخ شمسی، تا ۵۰ ردیف.

نکته‌ها

  • فقط خواندنی است: وارد حساب نمی‌شود و خرید و فروش انجام نمی‌دهد. توصیه مالی نیست.

  • قیمت‌های ایرانی در سایت به ریال است و برای آن‌ها فیلد تومان (ریال تقسیم بر ۱۰) هم برمی‌گردد. نمادهای جهانی (اونس، برنت، ارز دیجیتال به دلار) واحد خودشان را دارند.

  • قیمت نمادهای کم‌معامله ممکن است قدیمی باشد؛ فیلد time را ببینید.

  • کلید API لازم نیست و روی سیستم خود شما اجرا می‌شود. در صورت نیاز به پراکسی، متغیر TGJU_MCP_PROXY را بگذارید.

نصب (اول uv را نصب کنید). در Claude Code:

claude mcp add tgju -- uvx tgju-mcp

در Claude Desktop، Cursor و بقیه برنامه‌ها همان تنظیم بخش Quick start را بگذارید.

نمونه پرسش‌ها

  • «قیمت دلار و طلای ۱۸ عیار الان چند است؟»

  • «جدول قیمت سکه را نشان بده.»

  • «روند دلار آزاد در ۳۰ روز گذشته چطور بوده؟»

  • «قیمت بیت‌کوین و تتر به تومان چقدر است؟»

Development

git clone https://github.com/sepehr071/tgju-mcp && cd tgju-mcp
uv sync
uv run ruff check . && uv run ruff format --check .
uv run python -m pytest -q          # offline unit tests
uv run python -m pytest -m live -q  # calls tgju.org
uv build

All tools live in src/tgju_mcp/markets.py; each is a typed async function with a docstring that tells the agent when to use it. Issues and PRs are welcome.

Releases: bump the version in pyproject.toml and server.json, then push a v* tag. GitHub Actions publishes to PyPI.

Disclaimer

Unofficial and not affiliated with or endorsed by TGJU. It is read-only and uses the endpoints of the tgju.org web app, which can change without notice. Prices are informational, may be delayed, and are not financial 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

MIT

Available Tools

6 tools
tj_category_tableCategory price tableA
Read-onlyIdempotent

Live price table of one TGJU group: price, change, day high/low/open per symbol.

Use for 'all gold prices', 'all coin prices', 'all currency rates'. Rial groups carry price_toman (Rial / 10); crypto is USD. A folder id gets the unit per row from the symbol-name rule (unit: mixed adds a unit to each row); unknown symbols, e.g. exchange-house quotes, stay as_listed. stale marks a quote older than 2 days. The crypto preset lists all ~27,000 coins in no useful order: use tj_get_prices for major coins and tj_search_symbols for the rest.

NameRequiredDescriptionDefault
limitNoMax rows (50 keeps the reply under 15 KB).
offsetNoRows to skip.
categoryYesPreset (gold, coin, coin_retail, currency, currency_government, currency_sana, currency_nima, crypto) or a folder id from tj_list_categories, e.g. '28070'.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, openWorld, non-destructive), and the description adds substantial context on top: Rial groups return price_toman (Rial / 10), crypto is USD, folder ids derive unit per row from the symbol-name rule, `unit: mixed` adds a per-row unit, unknown symbols stay `as_listed`, and `stale` flags quotes older than 2 days. This is exactly the extra behavioral detail annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and field list, then layered with unit/stale semantics and the crypto routing note. Every sentence carries distinct information, though the density of parenthetical asides makes it slightly heavier than it needs to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must describe return values, and it does: price, change, day high/low/open per symbol, plus unit and stale markers. Combined with the category semantics and the crypto-routing caveat, an agent has everything needed to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, and the description earns above baseline by explaining what the category value actually implies: preset groups have known units (Rial/toman vs USD) while a folder id from tj_list_categories resolves unit per row via the symbol-name rule. It does not, however, add anything about limit/offset beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource+scope: a live price table for one TGJU group, listing the exact fields returned (price, change, day high/low/open per symbol). It clearly differentiates itself from siblings by naming tj_get_prices and tj_search_symbols as the right tools for the crypto case.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete use cases ('all gold prices', 'all coin prices', 'all currency rates') and an explicit when-not: the crypto preset lists ~27,000 coins in no useful order, so use tj_get_prices for major coins and tj_search_symbols for the rest. Alternatives and the condition selecting them are stated outright.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tj_get_pricesLive pricesA
Read-onlyIdempotent

Live price, day change, high and low for one or more TGJU symbols.

Use for current rates. Rial symbols also carry *_toman. time is the last update (Tehran time); old values mean the market is closed; stale: true marks a quote older than 2 days. Symbols missing from the live feed (slugs from tj_search_symbols) answer with their latest daily close (source: history, time = date). Unknown symbols are listed in not_found: find them with tj_search_symbols.

NameRequiredDescriptionDefault
symbolsYesSymbol slugs, e.g. ['price_dollar_rl', 'geram18', 'sekee', 'crypto-bitcoin'].

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only cover the read/idempotent safety profile, but the description discloses much more: 'time' semantics in Tehran time, that old values mean the market is closed, that `stale: true` marks quotes older than 2 days, that missing symbols fall back to daily close with `source: history`, and that unknown symbols land in `not_found`. That is rich operational context well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Opens with what is returned, then layers usage, per-symbol fallback semantics, and the recovery path. Four tight sentences carry no filler and every clause adds call-relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must carry the return contract, and it does: fields returned, timestamp meaning, staleness flag, source alternation, and the missing-symbol list. An agent can invoke and interpret the response without further data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description goes beyond it by giving example slugs ('price_dollar_rl', 'geram18', 'sekee', 'crypto-bitcoin') and by defining what happens per-symbol when a slug is absent or unknown (daily-close fallback, `not_found`). It does not restate the 30-item cap, minor since the schema declares it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete resource ('Live price, day change, high and low for one or more TGJU symbols') and a clear scope, and 'Use for current rates' implicitly separates it from tj_price_history. It does not name the historical sibling outright, so an agent must infer the boundary rather than read it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear situation ('Use for current rates') and routes the agent to tj_search_symbols twice for resolving unknown slugs, which is a real alternative-selection signal. It stops short of an explicit when-not (e.g. 'for past dates use tj_price_history'), so it falls just under full guideline coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tj_list_categoriesBrowse categoriesA
Read-onlyIdempotent

Browse TGJU's market tree: folders (with ids) and symbols.

Use to discover a group; call tj_category_table with a folder id to get its prices, or pass a symbol from a 'link' item to tj_get_prices. Top level: 28064 gold, 28066 coin, 28069 currency, 28426 crypto, 28048 precious metals, 28049 oil and energy, 28042 commodities.

NameRequiredDescriptionDefault
limitNoMax items.
offsetNoItems to skip (big folders such as crypto have thousands).
parent_idNoFolder id to open, e.g. '28064' (gold market) or 'currencies'. Omit for the top level.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent and openWorld, so the safety profile is covered. The description adds genuinely non-derivable behavior: the tree yields folders with ids and symbols that arrive as 'link' items, which tells the agent how to chain calls. It does not mention pagination limits or result ordering beyond what the schema implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the resource and the routing advice, then a compact id list. The trailing top-level enumeration is dense but each entry earns its place as a usable parent_id value; it could be moved to a schema enum, but it does not bloat the core message.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-shape burden and does so adequately: it tells the agent the tree contains folder entries with ids and symbol entries with 'link' values. Pagination behavior for very large folders (noted only in the schema's offset text) is the one gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline would be 3, but the description supplies concrete top-level folder ids (28064 gold, 28066 coin, etc.) that are not in the schema and let the agent call parent_id correctly without a probe. It adds real value over the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Browse TGJU's market tree') and names exactly what is returned (folders with ids, and symbols). That distinguishes it cleanly from siblings like tj_get_prices or tj_category_table, which consume its output rather than produce the tree.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: call tj_category_table with a folder id for prices, or pass a 'link' symbol to tj_get_prices. It positions itself as the discovery entry point in a named workflow, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tj_market_summaryKey rates summaryA
Read-onlyIdempotent

Key Iranian market rates in one call: dollar, euro, dirham, pound, lira, gold gram and ounce, coins, silver, Brent, Bitcoin, Ethereum, Tether.

Use first for 'what are today's rates'. Rial values carry *_toman; ounce, Brent, Bitcoin USD and Ethereum are USD. Drill into a group with tj_category_table.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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 bar is lower. The description adds genuinely new behavioral context by defining unit conventions (*_toman for rial figures, USD for ounce, Brent, Bitcoin and Ethereum), which prevents unit misreads. It does not note data freshness/latency or update cadence, which would matter for a 'today's rates' tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the capability, then the usage rule, then the routing hint — a sensible order with no filler. The long instrument enumeration is slightly list-heavy, though it earns its place by signalling scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description partially compensates by naming the returned instrument groups and clarifying units, which is the key ambiguity for this tool. It stops short of describing the response structure (grouping, ordering, timestamp), which is the remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so the baseline is 4. The schema is trivially complete and the description correctly spends no space inventing parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Concrete verb-and-resource framing ('Key Iranian market rates in one call') followed by an explicit enumeration of what is returned: dollar, euro, dirham, gold gram/ounce, coins, silver, Brent, Bitcoin, Ethereum, Tether. It also names the drill-down sibling tj_category_table, so an agent can distinguish it from the other price tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use first for what are today's rates' is an explicit default-selection rule, and 'Drill into a group with tj_category_table' names the alternative and the condition that routes to it. Nothing about when to pick this over its siblings 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.

tj_price_historyPrice historyA
Read-onlyIdempotent

Daily history (open, low, high, close, change) of a TGJU symbol, for charts and trend questions.

Use after tj_get_prices. Each row has Gregorian date and Jalali jalali; Rial symbols also carry *_toman. Days without a quote are missing. total is the number of rows in range: page with offset.

NameRequiredDescriptionDefault
limitNoMax daily rows (50 keeps the reply under 15 KB).
offsetNoRows to skip (for older pages).
symbolYesSymbol slug, e.g. 'price_dollar_rl', 'geram18', 'sekee', 'ons', 'crypto-bitcoin'.
to_dateNoJalali end date, e.g. '1405/07/10'.
from_dateNoJalali start date, e.g. '1405/07/01'.
oldest_firstNoSort ascending by date (default newest first).

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/openWorld, and the description adds real behavioral detail beyond them: dual Gregorian/Jalali dates, extra `*_toman` fields for Rial symbols, that gap days are simply absent rather than zero-filled, and that `total` counts rows in range for paging. That is exactly the kind of data-shape caveat an agent cannot infer otherwise.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short paragraphs, purpose and when-to-use front-loaded, then return-shape and paging caveats. Every sentence carries information; nothing is repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must describe the return payload, and it does: row fields, calendar duality, toman variants, missing-day semantics, and the paging counter. An agent can call and interpret this tool correctly without further reading.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the schema. The description's 'page with offset' note adds only marginal context on how `offset`/`limit` relate to `total`; it adds no date-format, default, or boundary detail not already present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Daily history (open, low, high, close, change) of a TGJU symbol' — and even names the row fields returned. The sibling relationship is made clear via 'Use after tj_get_prices', so an agent can separate this historical tool from the current-price tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use after tj_get_prices' plus 'for charts and trend questions' tells the agent when this tool is the right follow-up. It gives clear positive context but no explicit exclusion (e.g., when to prefer tj_get_prices on its own or tj_market_summary for aggregates).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

tj_search_symbolsSearch symbolsA
Read-onlyIdempotent

Find TGJU symbols by name.

Use when you do not know the symbol slug; pass a result's symbol to tj_get_prices or tj_price_history. Main symbols come back as their short live symbol; the rest as a slug, which tj_get_prices answers from the latest daily history row (source: history).

NameRequiredDescriptionDefault
limitNoMax matches (the site returns at most 10).
queryYesName or code, Persian or English, e.g. 'سکه امامی', 'bitcoin', 'brent'.
scopeNointernal = Iranian markets (gold, coins, currencies, funds), global = world markets and pairs, crypto = coins.internal

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/non-destructive. The description adds genuinely new behavioral context: main symbols return a short live symbol while others return a slug, and that slug is answered by tj_get_prices from the latest daily history row with `source: history`. That result-shape disclosure is valuable and not in 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core action and usage trigger. The final sentence about live symbols vs slugs is slightly dense but earns its place by explaining return semantics absent from any output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully compensates by explaining what a result contains (short live symbol vs slug) and how slugs resolve downstream. Scope/limit behavior is left to the schema, which fully covers it, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so query, scope, and limit are already documented with examples and enum meanings. The description adds no parameter-level detail beyond 'by name' (which maps to query), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (find TGJU symbols by name) and implicitly distinguishes itself from the price-fetching siblings by positioning itself as the slug-discovery step. An agent can tell immediately this is a search/lookup tool, not a data-retrieval tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger condition: 'Use when you do not know the symbol slug,' and names the downstream tools to call with the result (tj_get_prices, tj_price_history). It does not state when NOT to use it (e.g., when you already have the slug), but the routing is clear enough to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observedtj_category_table
    • First observedtj_get_prices
    • First observedtj_list_categories
    • First observedtj_market_summary
    • First observedtj_price_history
    • First observedtj_search_symbols

TDQS

A4.4/5.0

Scored across 6 tools

Disambiguation4/5

Each tool has a distinct scope: symbol-level live prices (tj_get_prices), symbol discovery (tj_search_symbols), category browsing (tj_list_categories), group price tables (tj_category_table), a curated key-rates snapshot (tj_market_summary), and daily history (tj_price_history). The three price-returning tools overlap somewhat but are differentiated by breadth (single symbol vs. group vs. key subset), so an agent can pick correctly.

Naming Consistency5/5

All six tools use a uniform tj_ prefix followed by a snake_case verb_noun pattern (get_prices, search_symbols, list_categories, category_table, market_summary, price_history). The convention is predictable throughout with no mixing of styles.

Tool Count5/5

Six tools is well-scoped for a read-only market-data server, covering discovery, live quotes, group tables, a summary, and history without redundancy. Each tool earns its place with a clear role.

Completeness4/5

The surface covers the full read-only lifecycle: discovery (search, categories), current pricing (symbol, group, summary), and historical data. Since the domain is read-only market data, no write operations are expected; minor gaps like bulk multi-symbol history or explicit pagination helpers exist but are workable.

Maintenance

ActivityNo data
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Read-only MCP server for Tehran Stock Exchange (TSETMC) live market data and authenticated TSE portal pages, enabling quotes, order books, market watch, and session-safe page reads via natural language.
    11
    1
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Enables access to Iran Mercantile Exchange official public statistics and live board snapshots through MCP tools, covering physical, futures, options, certificates, salaf, funds, and financial market data.
    14
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to compare cryptocurrency prices, order books, recent trades, candles, and top movers across seven Iranian exchanges in Toman or USDT. Provides read-only, unauthenticated access to public market data from Nobitex, Wallex, Bitpin, Ramzinex, Tabdeal, OMPFinex, and Exir.
    12
    383 PyPI
    8
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    8
    79 PyPI
    5
    MIT