iran-bourse-mcp 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. iran_bourse_mcp-0.4.0/.gitignore +19 -0
  2. iran_bourse_mcp-0.4.0/CHANGELOG.md +67 -0
  3. iran_bourse_mcp-0.4.0/LICENSE +21 -0
  4. iran_bourse_mcp-0.4.0/PKG-INFO +589 -0
  5. iran_bourse_mcp-0.4.0/README.fa.md +169 -0
  6. iran_bourse_mcp-0.4.0/README.md +561 -0
  7. iran_bourse_mcp-0.4.0/benchmarks/README.md +110 -0
  8. iran_bourse_mcp-0.4.0/benchmarks/aggregate_agents.py +74 -0
  9. iran_bourse_mcp-0.4.0/benchmarks/data_plane.py +375 -0
  10. iran_bourse_mcp-0.4.0/benchmarks/grade.py +105 -0
  11. iran_bourse_mcp-0.4.0/benchmarks/ground_truth.py +141 -0
  12. iran_bourse_mcp-0.4.0/benchmarks/results/agent_runs.json +330 -0
  13. iran_bourse_mcp-0.4.0/benchmarks/results/agents.json +375 -0
  14. iran_bourse_mcp-0.4.0/benchmarks/results/data_plane.json +229 -0
  15. iran_bourse_mcp-0.4.0/benchmarks/results/tool_list.txt +28 -0
  16. iran_bourse_mcp-0.4.0/benchmarks/results/truth.json +149 -0
  17. iran_bourse_mcp-0.4.0/benchmarks/tasks.json +67 -0
  18. iran_bourse_mcp-0.4.0/docs/ARCHITECTURE.fa.md +53 -0
  19. iran_bourse_mcp-0.4.0/docs/ARCHITECTURE.md +40 -0
  20. iran_bourse_mcp-0.4.0/docs/DATA_SOURCES.fa.md +188 -0
  21. iran_bourse_mcp-0.4.0/docs/DATA_SOURCES.md +182 -0
  22. iran_bourse_mcp-0.4.0/docs/EXAMPLES.md +1383 -0
  23. iran_bourse_mcp-0.4.0/docs/GUIDE.fa.md +106 -0
  24. iran_bourse_mcp-0.4.0/docs/RELEASING.md +26 -0
  25. iran_bourse_mcp-0.4.0/docs/SCREENER.md +226 -0
  26. iran_bourse_mcp-0.4.0/docs/TOOLS.md +450 -0
  27. iran_bourse_mcp-0.4.0/docs/llms-install.md +57 -0
  28. iran_bourse_mcp-0.4.0/pyproject.toml +86 -0
  29. iran_bourse_mcp-0.4.0/scripts/capture_exchange_fixtures.py +136 -0
  30. iran_bourse_mcp-0.4.0/scripts/capture_fixtures.py +56 -0
  31. iran_bourse_mcp-0.4.0/scripts/e2e_stdio.py +44 -0
  32. iran_bourse_mcp-0.4.0/scripts/gen_assets.py +306 -0
  33. iran_bourse_mcp-0.4.0/scripts/gen_bench_charts.py +100 -0
  34. iran_bourse_mcp-0.4.0/scripts/gen_examples.py +103 -0
  35. iran_bourse_mcp-0.4.0/scripts/gen_readme.py +126 -0
  36. iran_bourse_mcp-0.4.0/scripts/gen_screener_doc.py +107 -0
  37. iran_bourse_mcp-0.4.0/scripts/gen_site_data.py +156 -0
  38. iran_bourse_mcp-0.4.0/scripts/gen_site_preview.py +58 -0
  39. iran_bourse_mcp-0.4.0/scripts/gen_tools_doc.py +47 -0
  40. iran_bourse_mcp-0.4.0/scripts/record_contract.py +692 -0
  41. iran_bourse_mcp-0.4.0/scripts/render_promo.py +85 -0
  42. iran_bourse_mcp-0.4.0/scripts/smoke_live.py +82 -0
  43. iran_bourse_mcp-0.4.0/scripts/tool_groups.py +35 -0
  44. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/__init__.py +3 -0
  45. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/__main__.py +3 -0
  46. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/api.py +355 -0
  47. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/calendar_events.py +314 -0
  48. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/cli.py +197 -0
  49. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/client.py +220 -0
  50. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/clients.py +355 -0
  51. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/commodity.py +472 -0
  52. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/dates.py +310 -0
  53. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/derivatives.py +639 -0
  54. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/energy.py +625 -0
  55. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/funds.py +290 -0
  56. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/glossary.py +118 -0
  57. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/indices.py +641 -0
  58. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/market.py +222 -0
  59. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/resolver.py +125 -0
  60. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/screener.py +898 -0
  61. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/server.py +590 -0
  62. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/service.py +1498 -0
  63. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/shape.py +883 -0
  64. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/status.py +326 -0
  65. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/text.py +44 -0
  66. iran_bourse_mcp-0.4.0/src/iran_bourse_mcp/toplists.py +464 -0
  67. iran_bourse_mcp-0.4.0/tests/README.md +66 -0
  68. iran_bourse_mcp-0.4.0/tests/conftest.py +17 -0
  69. iran_bourse_mcp-0.4.0/tests/contract/contract_helpers.py +77 -0
  70. iran_bourse_mcp-0.4.0/tests/contract/contract_replay.py +380 -0
  71. iran_bourse_mcp-0.4.0/tests/contract/contract_scenarios_exchanges.py +765 -0
  72. iran_bourse_mcp-0.4.0/tests/contract/contract_scenarios_market.py +986 -0
  73. iran_bourse_mcp-0.4.0/tests/contract/contract_scenarios_other.py +87 -0
  74. iran_bourse_mcp-0.4.0/tests/contract/contract_scenarios_symbol.py +795 -0
  75. iran_bourse_mcp-0.4.0/tests/contract/test_contract_meta.py +102 -0
  76. iran_bourse_mcp-0.4.0/tests/contract/test_contract_record.py +340 -0
  77. iran_bourse_mcp-0.4.0/tests/contract/test_contract_replay.py +283 -0
  78. iran_bourse_mcp-0.4.0/tests/contract/test_contract_tools.py +24 -0
  79. iran_bourse_mcp-0.4.0/tests/fixtures/best_limits.json +57 -0
  80. iran_bourse_mcp-0.4.0/tests/fixtures/best_limits_history_head.json +302 -0
  81. iran_bourse_mcp-0.4.0/tests/fixtures/calendar_price_adjust.json +294 -0
  82. iran_bourse_mcp-0.4.0/tests/fixtures/calendar_price_adjust_fara.json +91 -0
  83. iran_bourse_mcp-0.4.0/tests/fixtures/calendar_share_changes.json +130 -0
  84. iran_bourse_mcp-0.4.0/tests/fixtures/calendar_share_changes_base.json +40 -0
  85. iran_bourse_mcp-0.4.0/tests/fixtures/calendar_share_changes_fara.json +40 -0
  86. iran_bourse_mcp-0.4.0/tests/fixtures/client_type.json +12 -0
  87. iran_bourse_mcp-0.4.0/tests/fixtures/client_type_history.json +16 -0
  88. iran_bourse_mcp-0.4.0/tests/fixtures/closing_info.json +38 -0
  89. iran_bourse_mcp-0.4.0/tests/fixtures/codal_letters.json +59 -0
  90. iran_bourse_mcp-0.4.0/tests/fixtures/commodity_ime_rollups.json +18 -0
  91. iran_bourse_mcp-0.4.0/tests/fixtures/commodity_ime_trades.json +4 -0
  92. iran_bourse_mcp-0.4.0/tests/fixtures/daily_prices_capital_increase.json +154 -0
  93. iran_bourse_mcp-0.4.0/tests/fixtures/derivatives_future_watch.json +18 -0
  94. iran_bourse_mcp-0.4.0/tests/fixtures/derivatives_option_watch.json +28 -0
  95. iran_bourse_mcp-0.4.0/tests/fixtures/energy_iee_auction.json +159 -0
  96. iran_bourse_mcp-0.4.0/tests/fixtures/energy_iee_overview.json +157 -0
  97. iran_bourse_mcp-0.4.0/tests/fixtures/energy_iee_physical_offers.json +101 -0
  98. iran_bourse_mcp-0.4.0/tests/fixtures/energy_iee_physical_trades.json +633 -0
  99. iran_bourse_mcp-0.4.0/tests/fixtures/energy_iee_power_offers.json +246 -0
  100. iran_bourse_mcp-0.4.0/tests/fixtures/energy_iee_power_trades.json +225 -0
  101. iran_bourse_mcp-0.4.0/tests/fixtures/exchange_closed_weekdays.json +169 -0
  102. iran_bourse_mcp-0.4.0/tests/fixtures/funds_registry_sample.json +1 -0
  103. iran_bourse_mcp-0.4.0/tests/fixtures/indices_constituents_total.json +1 -0
  104. iran_bourse_mcp-0.4.0/tests/fixtures/indices_effects_total.json +1 -0
  105. iran_bourse_mcp-0.4.0/tests/fixtures/indices_history_closure.json +1 -0
  106. iran_bourse_mcp-0.4.0/tests/fixtures/indices_history_slip.json +1 -0
  107. iran_bourse_mcp-0.4.0/tests/fixtures/indices_history_total.json +1 -0
  108. iran_bourse_mcp-0.4.0/tests/fixtures/indices_intraday_total.json +1 -0
  109. iran_bourse_mcp-0.4.0/tests/fixtures/indices_list_flow1.json +1 -0
  110. iran_bourse_mcp-0.4.0/tests/fixtures/indices_list_flow2.json +1 -0
  111. iran_bourse_mcp-0.4.0/tests/fixtures/info.json +54 -0
  112. iran_bourse_mcp-0.4.0/tests/fixtures/market_watch_sample.json +230 -0
  113. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_10236455588057352-69650398.json +1 -0
  114. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_10589770805157298-98b0ce0b.json +1 -0
  115. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_11964419322927535-dc52fe70.json +1 -0
  116. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_13227300125161435-ab0181c2.json +1 -0
  117. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_1625149423498289-2241a1f8.json +1 -0
  118. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_16405556680571453-4c7bd369.json +1 -0
  119. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_19040514831923530-faccc249.json +1 -0
  120. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_20092044608974663-ac28d875.json +1 -0
  121. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_20562694899904339-469c86b3.json +1 -0
  122. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_22811176775480091-ad85de11.json +1 -0
  123. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_23214828924506640-6eddd91d.json +1 -0
  124. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_23293437377896568-eb61dabb.json +1 -0
  125. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_23441366113375722-7398d251.json +1 -0
  126. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_2400322364771558-6df9e31e.json +1 -0
  127. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_24696953498398744-f9d38fcc.json +1 -0
  128. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_26014913469567886-f9540a9c.json +1 -0
  129. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_28320293733348826-880fea74.json +1 -0
  130. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_28809886765682162-42221850.json +1 -0
  131. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_30199365830132996-9a09564a.json +1 -0
  132. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_30714151942396396-29f1a34b.json +1 -0
  133. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_32357363984168442-535e9ac3.json +1 -0
  134. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_33938004134399485-4479b14f.json +1 -0
  135. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_33973158128384967-3c142490.json +1 -0
  136. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_35026822153186010-1c95065b.json +1 -0
  137. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_35424116338766901-cdde8d44.json +1 -0
  138. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_35425587644337450-73af4569.json +1 -0
  139. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_3722699128879020-e6beed34.json +1 -0
  140. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_3722699128879020_20261103-89b94a68.json +1 -0
  141. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_38437201078089290-6ad4beed.json +1 -0
  142. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_38568786927478796-baa37d3a.json +1 -0
  143. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_40553302624764543-4e380f7b.json +1 -0
  144. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_43552974795606067-5da82914.json +1 -0
  145. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_46348559193224090-80e7fe5c.json +1 -0
  146. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_48010225447410247-9a47c650.json +1 -0
  147. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_49054891736433700-edc630fa.json +1 -0
  148. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_49188729526980541-2781c007.json +1 -0
  149. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_51617145873056483-b2fbb309.json +1 -0
  150. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_56375665074210467-d281155f.json +1 -0
  151. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_60610861509165508-6164d0dd.json +1 -0
  152. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_65004959184388996-bdff331d.json +1 -0
  153. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_7235435095059069-ef35bced.json +1 -0
  154. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_7395271748414592-6d39b91b.json +1 -0
  155. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_778253364357513-103acff5.json +1 -0
  156. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_BestLimits_8175784894140974-a3fa5e72.json +1 -0
  157. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClientType_GetClientTypeAll-187a8bc4.json +1 -0
  158. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClientType_GetClientTypeHistory_46348559193224090-4c0acb5c.json +1 -0
  159. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClientType_GetClientType_46348559193224090_1_0-83f8ee04.json +1 -0
  160. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetClosingPriceDailyList_37226991288790-626862f7.json +1 -0
  161. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetClosingPriceDailyList_46348559193224-d884a3dc.json +1 -0
  162. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetClosingPriceInfo_17914401175772326-ff81c513.json +1 -0
  163. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetClosingPriceInfo_3722699128879020-601a3b3a.json +1 -0
  164. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetClosingPriceInfo_46348559193224090-d9c9fb13.json +1 -0
  165. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetIndexCompany_32453344048876642-cdba927c.json +1 -0
  166. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetInstrmentsHistoryInDay_20261028-fa5508b9.json +1 -0
  167. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetInstrmentsHistoryInDay_20261031-3d69bf56.json +1 -0
  168. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetInstrmentsHistoryInDay_20261101-531f31bf.json +1 -0
  169. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetInstrmentsHistoryInDay_20261102-296119b2.json +1 -0
  170. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetInstrmentsHistoryInDay_20261103-afbe9290.json +1 -0
  171. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetMarketWatch-f1595858.json +1 -0
  172. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetPriceAdjustByFlow_1_300-842167ca.json +1 -0
  173. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetPriceAdjustList_46348559193224090-0200fc75.json +1 -0
  174. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_ClosingPrice_GetTradeTop_PClosingTop_1_10-d710eeb1.json +1 -0
  175. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Codal_GetCodalPublisherBySymbol-59f1350e.json +1 -0
  176. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Fund_GetETFByInsCode_17914401175772326-c210aeb2.json +1 -0
  177. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Fund_GetFunds_5-4124e25e.json +1 -0
  178. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Index_GetIndexB1LastAll_All_1-357a63c4.json +1 -0
  179. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Index_GetIndexB1LastAll_All_2-56da3c98.json +1 -0
  180. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Index_GetIndexB1LastDay_32097828799138957-e740ece6.json +1 -0
  181. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Index_GetIndexB2History_32097828799138957-bd5058ec.json +1 -0
  182. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Index_GetInstEffect_20261105_1_9999-facd1b41.json +1 -0
  183. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Instrument_GetInstrumentFutureMarketWatch_0-936b6021.json +1 -0
  184. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Instrument_GetInstrumentIdentity_46348559193224090-df7e9a85.json +1 -0
  185. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Instrument_GetInstrumentInfo_46348559193224090-73110f46.json +1 -0
  186. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Instrument_GetInstrumentOptionMarketWatch_0-c9321c54.json +1 -0
  187. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Instrument_GetInstrumentSearch-b2463fc3.json +1 -0
  188. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Instrument_GetInstrumentSearch-b280283b.json +1 -0
  189. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Instrument_GetInstrumentSearch-e76af0c4.json +1 -0
  190. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Instrument_GetInstrumentShareChangeByFlow_1_10-9843803b.json +1 -0
  191. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Instrument_GetInstrumentShareChange_4634855919322409-69696d46.json +1 -0
  192. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_MarketData_GetInstrumentStateAll_46348559193224090-a0116d60.json +1 -0
  193. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_MarketData_GetInstrumentStateTop_200-d1b1423d.json +1 -0
  194. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_MarketData_GetInstrumentStatistic_46348559193224090-ff7283a4.json +1 -0
  195. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_MarketData_GetMarketOverview_1-7b68d0b6.json +1 -0
  196. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_MarketData_GetStaticThreshold_3722699128879020_20261-c7f66bab.json +1 -0
  197. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Msg_GetMsgByFlow_1_30-573cfe7f.json +1 -0
  198. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Msg_GetMsgByInsCode_46348559193224090-7afaa8f0.json +1 -0
  199. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Shareholder_46348559193224090_20261103-c4a0bb75.json +1 -0
  200. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Shareholder_GetInstrumentShareHolderLast_46348559193-f306fb8c.json +1 -0
  201. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Shareholder_GetShareHolderChanges_false-3764e33d.json +1 -0
  202. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Shareholder_GetShareHolderCompanyList_1460960-236b9296.json +1 -0
  203. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Shareholder_GetShareHolderHistory_46348559193224090_-8d1ddc97.json +1 -0
  204. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_StaticData_GetStaticData-fe76bd40.json +1 -0
  205. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_StaticData_GetTime-a089aab1.json +1 -0
  206. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Supervision_GetSupervisionByInsCode_4634855919322409-d09279b8.json +1 -0
  207. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Supervision_GetSupervisionListBySourceID_1_3-283e6b28.json +1 -0
  208. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Supervision_GetSupervisionListBySourceID_2_3-f1b0382e.json +1 -0
  209. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Trade_GetTradeHistory_3722699128879020_20261102_fals-c9946f06.json +1 -0
  210. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/cdn__api_Trade_GetTrade_3722699128879020-65bd8d2d.json +1 -0
  211. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/codal__api_search_v2_q-9b051636.json +1 -0
  212. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/iee__api_Home_GetTodayMarketsValues-bc9ae9d5.json +1 -0
  213. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/iee__api_PhysicalMarket_GetMarketAuctionDetailsTradeOnDay_965-9d629e59.json +1 -0
  214. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/iee__api_PhysicalMarket_GetMarketAuctionDetails_96519-2cc85802.json +1 -0
  215. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/iee__api_PhysicalMarket_GetPhysicalMarketAtAGlance-76765e7b.json +1 -0
  216. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/iee__api_PhysicalMarket_GetPhysicalMarketOffersAuction-aaee12ca.json +1 -0
  217. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/iee__api_PhysicalMarket_GetTradesStatistics-93750b5f.json +1 -0
  218. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/iee__api_PowerMarket_GetPowerMarketAtAGlance-181bde6c.json +1 -0
  219. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/iee__api_PowerMarket_GetPowerMarketAuctionAnnouncements-fa0de938.json +1 -0
  220. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/iee__api_PowerMarket_GetPowerTradesStatistics-074de99c.json +1 -0
  221. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/ime__imedata_asmx_GetAmareMoamelatList-3e134e9c.json +1 -0
  222. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/ime__imedata_asmx_GetHajmArzeshMoamelatDateGrid-b1e6265d.json +1 -0
  223. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/ime__imedata_asmx_GetHajmArzeshMoamelatDateGrid-e5e5f635.json +1 -0
  224. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/ime__imedata_asmx_GetHomeExchangeRateData-6c008d09.json +1 -0
  225. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/ime__imedata_asmx_GetHomeFizikiWithDateGrid-012e640a.json +1 -0
  226. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/ime__imedata_asmx_GetHomeFizikiWithDateGrid-500f34b7.json +1 -0
  227. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/ime__imedata_asmx_GetHomeNamaWithDateGrid-73e810a6.json +1 -0
  228. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/ime__imedata_asmx_GetHomeNamaWithDateGrid-af8bb252.json +1 -0
  229. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/webgw__InstrumentProvider_api_v1_MarketWatch_MarketWatchCash_fa-cd561d07.json +1 -0
  230. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/requests/webgw__api_v1_PublicData_MarketDate_fa-6c919db7.json +1 -0
  231. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/capital_calendar_recent.json +9 -0
  232. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/capital_calendar_upcoming.json +8 -0
  233. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/codal_company.json +9 -0
  234. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/codal_filings.json +9 -0
  235. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/commodity_summary.json +11 -0
  236. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/commodity_summary_range.json +11 -0
  237. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/commodity_trades.json +8 -0
  238. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/corporate_actions.json +10 -0
  239. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/energy_auction.json +9 -0
  240. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/energy_offers.json +9 -0
  241. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/energy_overview.json +10 -0
  242. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/energy_trades.json +9 -0
  243. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/etf_nav.json +10 -0
  244. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/fund_ranking.json +8 -0
  245. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/futures_market.json +8 -0
  246. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/glossary.json +6 -0
  247. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/index_constituents.json +11 -0
  248. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/index_contributors.json +10 -0
  249. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/index_history_daily.json +10 -0
  250. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/index_history_intraday.json +10 -0
  251. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/indices.json +8 -0
  252. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/industry_summary.json +11 -0
  253. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/market_holder_moves.json +8 -0
  254. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/market_overview.json +8 -0
  255. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/market_snapshot.json +11 -0
  256. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/market_status.json +10 -0
  257. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/market_watch.json +10 -0
  258. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/option_chain.json +8 -0
  259. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/option_chain_underlyings.json +8 -0
  260. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/order_book.json +11 -0
  261. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/order_book_history.json +10 -0
  262. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/price_history.json +9 -0
  263. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/quote.json +10 -0
  264. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/real_legal_flow.json +11 -0
  265. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/screen_stocks.json +16 -0
  266. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/screener_reference.json +6 -0
  267. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/search_symbol.json +8 -0
  268. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/shareholder_history_holder.json +10 -0
  269. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/shareholder_history_snapshots.json +9 -0
  270. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/shareholder_portfolio.json +8 -0
  271. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/shareholders.json +10 -0
  272. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/supervisor_messages_market.json +8 -0
  273. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/supervisor_messages_symbol.json +9 -0
  274. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/symbol_overview.json +16 -0
  275. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/symbol_statistics.json +9 -0
  276. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/top_lists_catalogue.json +6 -0
  277. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/top_lists_gainers.json +8 -0
  278. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/top_movers_buy_queue.json +53 -0
  279. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/top_movers_real_inflow.json +11 -0
  280. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/trade_summary.json +11 -0
  281. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/trades.json +10 -0
  282. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/trading_status_state_changes.json +8 -0
  283. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/trading_status_suspended.json +9 -0
  284. iran_bourse_mcp-0.4.0/tests/fixtures/recorded/scenarios/trading_status_symbol_history.json +10 -0
  285. iran_bourse_mcp-0.4.0/tests/fixtures/search_folad.json +116 -0
  286. iran_bourse_mcp-0.4.0/tests/fixtures/shareholders_last.json +134 -0
  287. iran_bourse_mcp-0.4.0/tests/fixtures/status_company_state.json +41 -0
  288. iran_bourse_mcp-0.4.0/tests/fixtures/status_state_all.json +172 -0
  289. iran_bourse_mcp-0.4.0/tests/fixtures/status_state_top.json +172 -0
  290. iran_bourse_mcp-0.4.0/tests/fixtures/status_supervision_1_1.json +106 -0
  291. iran_bourse_mcp-0.4.0/tests/fixtures/status_supervision_1_2.json +3 -0
  292. iran_bourse_mcp-0.4.0/tests/fixtures/status_supervision_1_3.json +140 -0
  293. iran_bourse_mcp-0.4.0/tests/fixtures/status_supervision_2_1.json +106 -0
  294. iran_bourse_mcp-0.4.0/tests/fixtures/status_supervision_2_3.json +72 -0
  295. iran_bourse_mcp-0.4.0/tests/fixtures/status_supervision_record.json +15 -0
  296. iran_bourse_mcp-0.4.0/tests/fixtures/status_supervision_record_clean.json +15 -0
  297. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_cap_btm.json +88 -0
  298. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_cap_top.json +88 -0
  299. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_limits_buy.json +109 -0
  300. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_limits_sell.json +109 -0
  301. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_sectors.json +60 -0
  302. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_trade_block.json +148 -0
  303. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_trade_empty.json +3 -0
  304. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_trade_energy.json +100 -0
  305. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_trade_etf.json +148 -0
  306. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_trade_gainers.json +196 -0
  307. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_trade_options.json +148 -0
  308. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_trade_two_price.json +148 -0
  309. iran_bourse_mcp-0.4.0/tests/fixtures/toplists_trade_value.json +148 -0
  310. iran_bourse_mcp-0.4.0/tests/fixtures/trades_head.json +902 -0
  311. iran_bourse_mcp-0.4.0/tests/test_calendar_events.py +252 -0
  312. iran_bourse_mcp-0.4.0/tests/test_client_resolver.py +202 -0
  313. iran_bourse_mcp-0.4.0/tests/test_clients_cli.py +174 -0
  314. iran_bourse_mcp-0.4.0/tests/test_commodity.py +326 -0
  315. iran_bourse_mcp-0.4.0/tests/test_dates.py +184 -0
  316. iran_bourse_mcp-0.4.0/tests/test_derivatives.py +660 -0
  317. iran_bourse_mcp-0.4.0/tests/test_energy.py +511 -0
  318. iran_bourse_mcp-0.4.0/tests/test_exchange_api.py +205 -0
  319. iran_bourse_mcp-0.4.0/tests/test_funds.py +248 -0
  320. iran_bourse_mcp-0.4.0/tests/test_indices.py +525 -0
  321. iran_bourse_mcp-0.4.0/tests/test_market_feed.py +222 -0
  322. iran_bourse_mcp-0.4.0/tests/test_review_fixes.py +266 -0
  323. iran_bourse_mcp-0.4.0/tests/test_screen_stocks.py +211 -0
  324. iran_bourse_mcp-0.4.0/tests/test_screener.py +334 -0
  325. iran_bourse_mcp-0.4.0/tests/test_server.py +68 -0
  326. iran_bourse_mcp-0.4.0/tests/test_service.py +139 -0
  327. iran_bourse_mcp-0.4.0/tests/test_service_derivatives.py +56 -0
  328. iran_bourse_mcp-0.4.0/tests/test_service_exchanges.py +290 -0
  329. iran_bourse_mcp-0.4.0/tests/test_service_extras.py +198 -0
  330. iran_bourse_mcp-0.4.0/tests/test_service_market.py +398 -0
  331. iran_bourse_mcp-0.4.0/tests/test_shape_book.py +118 -0
  332. iran_bourse_mcp-0.4.0/tests/test_shape_misc.py +154 -0
  333. iran_bourse_mcp-0.4.0/tests/test_shape_quote.py +44 -0
  334. iran_bourse_mcp-0.4.0/tests/test_shape_ticks.py +75 -0
  335. iran_bourse_mcp-0.4.0/tests/test_status.py +203 -0
  336. iran_bourse_mcp-0.4.0/tests/test_text.py +21 -0
  337. iran_bourse_mcp-0.4.0/tests/test_toplists.py +292 -0
@@ -0,0 +1,19 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ venv/
5
+ dist/
6
+ build/
7
+ *.egg-info/
8
+ .pytest_cache/
9
+ .ruff_cache/
10
+ .mypy_cache/
11
+ .coverage
12
+ htmlcov/
13
+ .env
14
+ *.log
15
+ .idea/
16
+ .vscode/
17
+ exports/
18
+ uv.lock.bak
19
+ .claude/worktrees/
@@ -0,0 +1,67 @@
1
+ # Changelog
2
+
3
+ ## 0.4.0 (2026-11-05)
4
+
5
+ Two exchange tools (40 in total), public holidays in `market_status`, contract tests for every tool, Persian technical notes and a package ready for PyPI.
6
+
7
+ ### Added
8
+ - **Launch film** (2 minutes, Persian narration): on the website (`#film`) with a player, a 16:9 / 9:16 switch, English and Persian subtitles, downloads (web and social files on the site, Full HD and 4K as release assets of `launch-film`), share links, a ready-made post and an embeddable player (`embed.html`). Every number in it is real tool output.
9
+ - **Public holidays in `market_status`** (#7): `holiday`, `is_trading_day`, `day_status`, `next_session` (skips weekends and holidays and lists what it skipped), `upcoming_holidays` and a `holiday_calendar` block. The table is the official calendar of Jalali year 1405 (time.ir) plus the fixed Solar Hijri holidays for any other year, and says so when religious holidays of a year are unknown. `within_session_hours` and the screener's `session_open` now respect holidays. When the exchange's newest data disagrees with the calendar (an unannounced closure), `calendar_check` says so. Both tables are tested against the exchange's own history of non-trading days since 2019.
10
+ - **Contract tests** (#10): recorded real upstream responses (`tests/fixtures/recorded/`) replayed through `respx` exercise every tool (40 now) end to end without network, through the MCP server layer, with the clock frozen. A meta-test fails for any registered tool without a scenario. Re-record with `scripts/record_contract.py --record` (see `tests/README.md`).
11
+ - **`commodity_market` and `energy_market`**: the commodity and energy exchanges, read-only and without an account, from the exchanges' own public sites. `commodity_market` reads the Iran Mercantile Exchange (IME, بورس کالای ایران) physical market: a session's offers and contracts (product, producer, hall, contract type, delivery date, offered, demand and traded tons, weighted-average price in rial per kilogram, value in rial) with totals by hall and contract type and the top products, or IME's own roll-ups by ring and market, one row per session and its dollar rate. `energy_market` reads the Iran Energy Exchange (بورس انرژی ایران): auction results of oil, gas and petrochemical products and of electricity, announced offers, one auction's terms with its buy and sell order levels and trades, and whether the market is open. Units are explicit everywhere: the keys say them (`volume_tons`, `price_rial_per_kg`, `value_rial`) and every energy row carries its `volume_unit` and `price_basis` (rial per kilogram, US dollars per tonne, a premium on a reference price, rial per kWh); volumes of different units are never added, and the exchange's own totals are reproduced to the rial. Glossary: the commodity and energy terms (سلف, مچینگ, عرضه, تحویل, گواهی سپرده کالایی ...).
12
+ - The contract-test recorder and replay match a request's JSON body, so the POSTed IME services are recorded and replayed like any other request; recordings made before are unchanged.
13
+ - **Persian technical notes** (#11): `docs/DATA_SOURCES.fa.md` and `docs/ARCHITECTURE.fa.md`, linked from both READMEs. The English notes were brought up to date with 0.3.0 (the exchange's market-watch feed, the new endpoints, quirks 18 to 28, the holiday calendar).
14
+ - **Packaging** (#8, repository side): a slim sdist, project URLs, a PyPI README whose images and links are absolute, a manually runnable publish workflow and `docs/RELEASING.md` with the one-time PyPI steps.
15
+
16
+ ### Fixed
17
+ - `market_snapshot` through MCP listed every instrument type (bonds topped the table) because the tool's default for `security_type` overrode the service default of stocks.
18
+ - Sector codes `01`-`09` of the market feed matched no industry name (40 of 3,680 rows); both spellings of a code are now registered.
19
+
20
+ ## 0.3.0 (2026-11-04)
21
+
22
+ Ten new tools (38 in total), the whole-market tools moved to the exchange's own feed, and every finding of two independent client reviews fixed.
23
+
24
+ ### Added
25
+ - **Stock screener**: `screen_stocks` and `screener_reference`. A safe expression language (parsed with `ast`, never `eval`) evaluated over every instrument: today's live values, up to 60 past trading days adjusted for capital increases (`close[1]`, `avg(volume, 20)`, `count(close_pct > 0, 5)`, `highest(high, 10)` ...), real/legal flow, a five-level order book, base volume, fund NAV and open interest. Accepts the field names and JavaScript spellings of the filter box on tsetmc.com, ships 15 presets, explains mistakes with suggestions and shows the evidence for each hit. New prompt `find_stocks`. Guide: `docs/SCREENER.md`.
26
+ - `option_chain` (calls and puts by strike and expiry with moneyness, intrinsic and time value, break-even, spread, put/call ratios, open-interest strikes and an estimated max pain) and `futures_market` (with basis).
27
+ - `index_history` (daily since 2008, weekly to yearly bars, or today's 5-minute path), `index_constituents` (members with their effect in index points) and `fund_ranking` (579 funds: NAV, returns, size, portfolio mix).
28
+ - `top_lists` (the exchange's 69 official best-of lists), `capital_calendar` (upcoming capital increases and price adjustments) and `trading_status` (suspended and supervised symbols, state changes, one symbol's history).
29
+ - `price_history(granularity=weekly|monthly|yearly)`, `shareholder_history(holder=...)` (one major holder's position over time), industry-level real money flow in `industry_summary`.
30
+ - Glossary: base volume, P/E, NAV, premium (حباب), TAL.
31
+
32
+ ### Changed
33
+ - `market_watch`, `top_movers`, `industry_summary` and the screener run on `ClosingPrice/GetMarketWatch`, the feed tsetmc.com itself uses: about 3,700 instruments (shares, base market, funds, bonds, rights, options, futures, commodities) with a five-level book, instead of the 582 shares of the TSE gateway (kept as a fallback). `market_watch` and `market_snapshot` default to stocks; `security_type` takes `stock`, `fund`, `bond`, `option`, `future`, `rights`, `commodity`, `base`, `all`.
34
+ - `real_legal_flow` reads the whole history in one request, with exact rial values.
35
+ - Buy and sell queues ignore orders priced beyond the day's limits (an ask above the ceiling cannot trade): queues are no longer missed, and order-book levels outside the limits are flagged.
36
+ - One P/E definition (the exchange's, on the closing price). The server reports its version.
37
+ - The Codex install recipe waits for the server in scripted runs (`required = true`).
38
+
39
+ ### Fixed
40
+ - Codal title filters read further pages instead of filtering one page of 20.
41
+ - `market_snapshot` no longer lists options as stocks; Persian digits in symbols; a ticker listed twice resolves to the record that traded most recently (about 5% of symbols failed with HTTP 500); `real_legal_flow(days=N)` returns N days; supervisor messages are no longer crowded out by pinned notices; loss-makers have no P/E; gainers rank by closing change.
42
+ - HTTP 429 is reported as rate limiting (with a per-host cooldown) instead of as an Iranian-IP problem; a slow optional section no longer stalls `symbol_overview`.
43
+
44
+ ### Verified
45
+ - Independent QA through a real Codex client (58 questions) and a Claude agent (59 questions, 130 tool calls), every number recomputed from raw exchange data: no fabricated figure; the issues found are the fixes above.
46
+ - Screener results checked against an independent re-implementation from raw data: identical on three screens (29/29, 14/14, 32/32).
47
+ - 584 offline tests, 92% line coverage.
48
+
49
+ ## 0.2.0 (2026-11-04)
50
+
51
+ - **Fix:** `top_movers` queue and real-money rankings returned nothing during the session (today's end-of-day table is empty until the close). The instrument index now falls back to the newest published day.
52
+ - **Fix:** gateway failures (HTTP 502/503) are retried more patiently and reported as an overloaded exchange, not as an IP problem.
53
+ - New CLI: `tools`, `call` (every tool from the shell, for agents without MCP), `config <client>` and `install <client>` (safe merge into the client's JSON config, with backup).
54
+ - Install recipes, one-click deep links (Cursor, VS Code, Goose) and framework snippets for 17 agents and IDEs, generated from one table.
55
+ - Website (GitHub Pages) with a promo video, animated README artwork, benchmark harness (`benchmarks/`) with independent ground truth, real example outputs (`docs/EXAMPLES.md`).
56
+ - Container image, AGENTS.md, llms.txt and an install guide written for AI agents, code of conduct, citation file, dependabot.
57
+ - Tests: 142 offline tests, 89% line coverage (service layer 96%).
58
+
59
+ ## 0.1.0 (2026-11-04)
60
+
61
+ First public release.
62
+
63
+ - 28 read-only tools covering market state, indices, whole-market screens, quotes, order book (live and rebuilt history with queue episodes), tick-by-tick trades with aggregation and a coverage check, real/legal flow, shareholders, corporate actions, adjusted price history, fund NAV, Codal filings and supervisor notices.
64
+ - 3 prompts and a glossary resource.
65
+ - Persian/Arabic text normalisation, Jalali/Gregorian date handling.
66
+ - Works with MCP Python SDK 1.x and 2.x.
67
+ - `iran-bourse-mcp doctor` connectivity check; `serve` for stdio / streamable-http / sse.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Mohammad Saleh Mahdinejad
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.