tradingview-mcp 1.1.0__py3-none-any.whl → 26.0.0__py3-none-any.whl

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.
@@ -393,16 +393,18 @@ COLUMNS = {
393
393
  }
394
394
 
395
395
  # Default columns for different query types
396
- DEFAULT_COLUMNS = ["name", "close", "volume", "market_cap_basic"]
396
+ # Always include 'description' for full name (e.g., "Apple Inc." instead of just "AAPL")
397
+ DEFAULT_COLUMNS = ["name", "description", "close", "change", "volume", "market_cap_basic"]
397
398
 
398
- PREMARKET_COLUMNS = ["name", "close", "volume", "premarket_change", "premarket_change_abs", "premarket_volume"]
399
+ PREMARKET_COLUMNS = ["name", "description", "close", "volume", "premarket_change", "premarket_change_abs", "premarket_volume"]
399
400
 
400
- POSTMARKET_COLUMNS = ["name", "close", "volume", "postmarket_change", "postmarket_change_abs", "postmarket_volume"]
401
+ POSTMARKET_COLUMNS = ["name", "description", "close", "volume", "postmarket_change", "postmarket_change_abs", "postmarket_volume"]
401
402
 
402
- CRYPTO_COLUMNS = ["name", "close", "volume", "change", "market_cap_basic", "24h_vol|5"]
403
+ CRYPTO_COLUMNS = ["name", "description", "close", "change", "volume", "market_cap_basic", "24h_vol|5"]
403
404
 
404
405
  TECHNICAL_COLUMNS = [
405
406
  "name",
407
+ "description",
406
408
  "close",
407
409
  "volume",
408
410
  "change",
@@ -10,7 +10,8 @@ from tradingview_mcp.column import Column
10
10
  from tradingview_mcp.query import Query
11
11
 
12
12
 
13
- DEFAULT_COLUMNS = ["name", "close", "volume", "market_cap_basic"]
13
+ # Always include 'description' for full name (e.g., "Apple Inc." instead of just "AAPL")
14
+ DEFAULT_COLUMNS = ["name", "description", "close", "change", "volume", "market_cap_basic"]
14
15
 
15
16
 
16
17
  class Scanner:
tradingview_mcp/server.py CHANGED
@@ -63,13 +63,29 @@ from tradingview_mcp.docs_data import (
63
63
  # Initialize MCP Server
64
64
  mcp = FastMCP(
65
65
  name="TradingView Screener MCP",
66
- instructions=(
67
- "A comprehensive MCP server for TradingView market screening. "
68
- "Provides tools for stock and cryptocurrency screening, technical analysis, "
69
- "and market data retrieval. Supports 76+ markets and 250+ technical indicators. "
70
- "Docs resources: docs://params, docs://screeners, docs://fields, docs://markets. "
71
- "Set TRADINGVIEW_MCP_DEBUG=1 for detailed debug responses on errors."
72
- ),
66
+ instructions="""TradingView Market Screener MCP - Stocks/Crypto screening tools
67
+
68
+ 🚀 Quick start:
69
+ 1. Call `get_help()` for the full usage guide
70
+ 2. Call `ai_get_reference()` for markets, fields, and filter references
71
+
72
+ 📊 Common tools:
73
+ - `screen_market(market, limit)` - Market screening (stocks, crypto, etc.)
74
+ - `get_top_gainers(market, limit)` - Top gainers
75
+ - `get_top_losers(market, limit)` - Top losers
76
+ - `search_symbols(query, market)` - 🔍 Search by name (e.g., "Apple", "Tesla")
77
+ - `get_symbol_info(symbol)` - Get detailed symbol info
78
+
79
+ ⚠️ Important notes:
80
+ - `limit` controls result count (default 25, max 500)
81
+ - Results include the `description` field with full names (e.g., "Apple Inc.")
82
+ - `market` examples: america (US stocks), crypto, uk, etc.
83
+
84
+ 📖 Resources (read-only):
85
+ - docs://ai-reference - AI quick reference
86
+ - markets://list - All markets
87
+ - columns://list - Available fields
88
+ """,
73
89
  )
74
90
 
75
91
  DEBUG_MODE = os.getenv("TRADINGVIEW_MCP_DEBUG", "0").lower() in {"1", "true", "yes"}
@@ -712,6 +728,265 @@ def get_common_fields_summary(
712
728
  }
713
729
 
714
730
 
731
+ # =============================================================================
732
+ # Help and Discovery Tools - Help AI understand usage
733
+ # =============================================================================
734
+
735
+
736
+ @mcp.tool()
737
+ def get_help(topic: str | None = None) -> dict[str, Any]:
738
+ """📖 Usage guide - required reading for AI!
739
+
740
+ Args:
741
+ topic: Optional topic: 'markets', 'columns', 'filters', 'examples', 'tools'
742
+ If omitted, returns the full guide
743
+
744
+ Returns:
745
+ Usage guide and examples
746
+ """
747
+ guide = {
748
+ "overview": {
749
+ "description": "TradingView MCP is a market screener for stocks and crypto",
750
+ "key_points": [
751
+ "All results include the 'description' field (full name like 'Apple Inc.')",
752
+ "Use the limit parameter to control output size (default 25, max 500)",
753
+ "Symbols are returned in ticker format: 'EXCHANGE:SYMBOL' (e.g., 'NASDAQ:AAPL')",
754
+ ],
755
+ },
756
+ "quick_start": {
757
+ "step_1": "Call get_top_gainers('america', 10) for top 10 US stock gainers",
758
+ "step_2": "Call search_symbols('apple', 'america') to find symbols by name",
759
+ "step_3": "Call get_symbol_info('NASDAQ:AAPL') for Apple details",
760
+ },
761
+ "markets": {
762
+ "stocks": ["america (US)", "uk (UK)", "germany (DE)", "japan (JP)", "china (CN)", "hongkong (HK)", "taiwan (TW)"],
763
+ "crypto": ["crypto (pairs)", "coin (coins)",],
764
+ "others": ["forex", "futures", "bonds"],
765
+ },
766
+ "common_tools": {
767
+ "screen_market": "Custom screening - screen_market(market='america', limit=50, sort_by='volume')",
768
+ "get_top_gainers": "Top gainers - get_top_gainers(market='crypto', limit=25)",
769
+ "get_top_losers": "Top losers - get_top_losers(market='america', limit=25)",
770
+ "search_symbols": "🔍 Name search - search_symbols(query='tesla', market='america')",
771
+ "get_symbol_info": "Symbol info - get_symbol_info(symbol='NASDAQ:AAPL')",
772
+ "get_technical_analysis": "Technical analysis - get_technical_analysis(symbol='NASDAQ:AAPL')",
773
+ },
774
+ "important_columns": {
775
+ "name": "Ticker (e.g., 'NASDAQ:AAPL')",
776
+ "description": "Full name (e.g., 'Apple Inc.')",
777
+ "close": "Close/last price",
778
+ "change": "Change (%)",
779
+ "volume": "Volume",
780
+ "market_cap_basic": "Market cap",
781
+ },
782
+ "filters_example": {
783
+ "description": "Use filters to apply conditions",
784
+ "example": [
785
+ {"column": "change", "operation": "gt", "value": 5},
786
+ {"column": "volume", "operation": "gt", "value": 1000000},
787
+ ],
788
+ "operations": ["gt (>)", "gte (>=)", "lt (<)", "lte (<=)", "eq (=)", "neq (!=)", "between", "isin"],
789
+ },
790
+ }
791
+
792
+ if topic:
793
+ topic_lower = topic.lower()
794
+ if topic_lower in guide:
795
+ return {"topic": topic, "content": guide[topic_lower]}
796
+ if topic_lower == "tools":
797
+ return {"topic": "tools", "content": guide["common_tools"]}
798
+ if topic_lower == "examples":
799
+ return {"topic": "examples", "content": guide["quick_start"]}
800
+ return {
801
+ "error": f"Topic '{topic}' not found",
802
+ "available_topics": list(guide.keys()) + ["tools", "examples"],
803
+ }
804
+
805
+ return guide
806
+
807
+
808
+ @mcp.tool()
809
+ def search_symbols(
810
+ query: str,
811
+ market: str = "america",
812
+ limit: int = 25,
813
+ ) -> dict[str, Any]:
814
+ """🔍 Search symbols by name (fuzzy search)
815
+
816
+ Supports company names or tickers, e.g., "Apple", "Tesla", "Microsoft".
817
+
818
+ Args:
819
+ query: Search keyword (company name or ticker)
820
+ market: Market (america, crypto, uk, etc.)
821
+ limit: Max results (default 25, max 100)
822
+
823
+ Returns:
824
+ Matching symbols with full names
825
+
826
+ Examples:
827
+ search_symbols("apple", "america") -> Apple Inc., Applebee's, etc.
828
+ search_symbols("BTC", "crypto") -> BTC pairs
829
+ """
830
+ market = sanitize_market(market)
831
+ limit = max(1, min(limit, 100))
832
+
833
+ # Search fields: name (ticker) and description (full name)
834
+ cols = ["name", "description", "close", "change", "volume", "market_cap_basic", "type", "exchange"]
835
+
836
+ try:
837
+ # Use TradingView text search
838
+ # Search description (company name)
839
+ query_obj = (
840
+ Query()
841
+ .set_markets(market)
842
+ .select(*cols)
843
+ .where(Column("description").like(query))
844
+ .order_by("market_cap_basic", ascending=False)
845
+ .limit(limit)
846
+ )
847
+
848
+ total, df = query_obj.get_scanner_data()
849
+ results = df.to_dict("records")
850
+
851
+ # If nothing found, try searching the name (ticker) field
852
+ if not results:
853
+ query_obj2 = (
854
+ Query()
855
+ .set_markets(market)
856
+ .select(*cols)
857
+ .where(Column("name").like(query))
858
+ .order_by("market_cap_basic", ascending=False)
859
+ .limit(limit)
860
+ )
861
+ total, df = query_obj2.get_scanner_data()
862
+ results = df.to_dict("records")
863
+
864
+ return {
865
+ "query": query,
866
+ "market": market,
867
+ "total_found": total,
868
+ "returned": len(results),
869
+ "results": results,
870
+ "hint": "Use 'name' field as symbol for other tools (e.g., get_symbol_info)" if results else "No matches found. Try different keywords.",
871
+ }
872
+ except Exception as e:
873
+ # If LIKE isn't supported, use fallback
874
+ return _search_symbols_fallback(query, market, limit, cols, str(e))
875
+
876
+
877
+ def _search_symbols_fallback(
878
+ query: str, market: str, limit: int, cols: list[str], original_error: str
879
+ ) -> dict[str, Any]:
880
+ """Fallback search when LIKE is not supported."""
881
+ try:
882
+ # Fetch more data and filter locally
883
+ query_obj = (
884
+ Query()
885
+ .set_markets(market)
886
+ .select(*cols)
887
+ .order_by("market_cap_basic", ascending=False)
888
+ .limit(500) # Fetch top 500
889
+ )
890
+
891
+ total, df = query_obj.get_scanner_data()
892
+
893
+ # Local filter
894
+ query_lower = query.lower()
895
+ filtered = df[
896
+ df["name"].str.lower().str.contains(query_lower, na=False) |
897
+ df["description"].str.lower().str.contains(query_lower, na=False)
898
+ ].head(limit)
899
+
900
+ results = filtered.to_dict("records")
901
+
902
+ return {
903
+ "query": query,
904
+ "market": market,
905
+ "total_found": len(results),
906
+ "returned": len(results),
907
+ "results": results,
908
+ "note": "Results from local filtering of top 500 by market cap",
909
+ "hint": "Use 'name' field as symbol for other tools" if results else "No matches found",
910
+ }
911
+ except Exception as e:
912
+ return {
913
+ "error": f"Search failed: {str(e)}",
914
+ "original_error": original_error,
915
+ "hint": "Try using screen_market with specific filters instead",
916
+ }
917
+
918
+
919
+ @mcp.tool()
920
+ def get_symbol_info(
921
+ symbol: str,
922
+ include_technical: bool = False,
923
+ ) -> dict[str, Any]:
924
+ """Get detailed information for a symbol.
925
+
926
+ Args:
927
+ symbol: Ticker in 'EXCHANGE:SYMBOL' format (e.g., 'NASDAQ:AAPL')
928
+ or just a ticker (e.g., 'AAPL', auto-search)
929
+ include_technical: Whether to include technical indicators
930
+
931
+ Returns:
932
+ Detailed symbol info including name, price, market cap, etc.
933
+
934
+ Examples:
935
+ get_symbol_info("NASDAQ:AAPL") -> Apple Inc. details
936
+ get_symbol_info("AAPL") -> auto-search
937
+ """
938
+ cols = [
939
+ "name", "description", "close", "open", "high", "low",
940
+ "change", "change_abs", "volume", "market_cap_basic",
941
+ "price_earnings_ttm", "earnings_per_share_basic_ttm",
942
+ "dividend_yield_recent", "sector", "industry", "exchange", "type",
943
+ ]
944
+
945
+ if include_technical:
946
+ cols.extend([
947
+ "RSI", "RSI7", "MACD.macd", "MACD.signal",
948
+ "SMA20", "SMA50", "SMA200", "EMA20", "EMA50", "EMA200",
949
+ "BB.upper", "BB.lower", "ATR", "ADX",
950
+ "Recommend.All", "Recommend.MA", "Recommend.Other",
951
+ ])
952
+
953
+ try:
954
+ # Determine market
955
+ if ":" in symbol:
956
+ exchange, ticker = symbol.split(":", 1)
957
+ market = EXCHANGE_SCREENER.get(exchange.lower(), "america")
958
+ else:
959
+ ticker = symbol
960
+ market = "america"
961
+
962
+ query = (
963
+ Query()
964
+ .set_markets(market)
965
+ .select(*cols)
966
+ .where(Column("name").isin([symbol, ticker, symbol.upper(), ticker.upper()]))
967
+ .limit(5)
968
+ )
969
+
970
+ total, df = query.get_scanner_data()
971
+
972
+ if df.empty:
973
+ # Fallback to search
974
+ return search_symbols(ticker, market, 5)
975
+
976
+ results = df.to_dict("records")
977
+
978
+ if len(results) == 1:
979
+ return {"symbol": symbol, "found": True, "data": results[0]}
980
+ else:
981
+ return {"symbol": symbol, "found": True, "matches": results}
982
+
983
+ except Exception as e:
984
+ return {
985
+ "error": f"Failed to get symbol info: {str(e)}",
986
+ "hint": "Try using search_symbols to find the correct symbol format",
987
+ }
988
+
989
+
715
990
  # =============================================================================
716
991
  # MCP Tools - Basic Screening
717
992
  # =============================================================================
@@ -723,27 +998,33 @@ def screen_market(
723
998
  columns: Optional[list[str]] = None,
724
999
  sort_by: str = "volume",
725
1000
  ascending: bool = False,
726
- limit: int = 50,
1001
+ limit: int = 25,
727
1002
  filters: Optional[list[dict[str, Any]]] = None,
728
- ) -> list[dict[str, Any]]:
729
- """
730
- Execute a custom market screening query.
1003
+ ) -> dict[str, Any]:
1004
+ """Run a custom market screening query.
1005
+
1006
+ ⚠️ Note: Default returns 25 rows. Increase `limit` for more.
731
1007
 
732
1008
  Args:
733
- market: Market to screen (america, crypto, uk, etc.)
734
- columns: Columns to return (default: name, close, volume, market_cap_basic)
735
- sort_by: Column to sort by
736
- ascending: Sort order (True=ascending, False=descending)
737
- limit: Maximum results (1-500)
738
- filters: List of filter conditions as dicts with keys: column, operation, value
739
- Operations: gt, gte, lt, lte, eq, neq, between, isin
1009
+ market: Market (america=US stocks, crypto, uk, etc.)
1010
+ columns: Columns to return (default includes name, description, close, change, volume, market_cap)
1011
+ sort_by: Sort column
1012
+ ascending: Sort order (True=asc, False=desc)
1013
+ limit: Max results (1-500, default 25)
1014
+ filters: Filter list, e.g. [{"column": "change", "operation": "gt", "value": 5}]
1015
+ Supported ops: gt, gte, lt, lte, eq, neq, between, isin
740
1016
 
741
1017
  Returns:
742
- List of matching symbols with requested data
1018
+ Dict with total_count, returned, data.
1019
+ Each row includes description (full name like "Apple Inc.").
743
1020
  """
744
1021
  market = sanitize_market(market)
745
1022
  limit = max(1, min(limit, 500))
1023
+
1024
+ # Ensure description is always included
746
1025
  cols = columns or DEFAULT_COLUMNS
1026
+ if "description" not in cols:
1027
+ cols = ["description"] + list(cols)
747
1028
 
748
1029
  query = Query().set_markets(market).select(*cols).order_by(sort_by, ascending=ascending).limit(limit)
749
1030
 
@@ -779,27 +1060,38 @@ def screen_market(
779
1060
  total_count, df = query.get_scanner_data()
780
1061
  results = df.to_dict("records")
781
1062
 
782
- return [{"total_count": total_count, "returned": len(results), "data": results}]
1063
+ return {
1064
+ "total_count": total_count,
1065
+ "returned": len(results),
1066
+ "market": market,
1067
+ "data": results,
1068
+ }
783
1069
  except Exception as e:
784
- return [{"error": str(e)}]
1070
+ return {"error": str(e), "market": market}
785
1071
 
786
1072
 
787
1073
  @mcp.tool()
788
- def get_top_gainers(market: str = "america", limit: int = 25) -> list[dict[str, Any]]:
789
- """
790
- Get top gaining assets in a market.
1074
+ def get_top_gainers(market: str = "america", limit: int = 25) -> dict[str, Any]:
1075
+ """Get top gainers for a market.
1076
+
1077
+ ⚠️ Note: Default returns 25 rows. Increase `limit` for more.
791
1078
 
792
1079
  Args:
793
- market: Market to scan (america, crypto, uk, etc.)
794
- limit: Number of results (1-100)
1080
+ market: Market (america=US stocks, crypto, uk, etc.)
1081
+ limit: Result count (1-100, default 25)
795
1082
 
796
1083
  Returns:
797
- List of top gainers with price and change data
1084
+ Top gainers with description (full name).
1085
+
1086
+ Example:
1087
+ get_top_gainers("america", 10) -> Top 10 US gainers
1088
+ get_top_gainers("crypto", 25) -> Top 25 crypto gainers
798
1089
  """
799
1090
  market = sanitize_market(market)
800
1091
  limit = max(1, min(limit, 100))
801
1092
 
802
- cols = ["name", "close", "volume", "change", "change_abs", "market_cap_basic"]
1093
+ # Ensure description is included
1094
+ cols = ["name", "description", "close", "change", "change_abs", "volume", "market_cap_basic"]
803
1095
 
804
1096
  query = (
805
1097
  Query()
@@ -812,27 +1104,39 @@ def get_top_gainers(market: str = "america", limit: int = 25) -> list[dict[str,
812
1104
 
813
1105
  try:
814
1106
  total, df = query.get_scanner_data()
815
- return df.to_dict("records")
1107
+ results = df.to_dict("records")
1108
+ return {
1109
+ "market": market,
1110
+ "type": "top_gainers",
1111
+ "total_found": total,
1112
+ "returned": len(results),
1113
+ "data": results,
1114
+ }
816
1115
  except Exception as e:
817
- return [{"error": str(e)}]
1116
+ return {"error": str(e), "market": market}
818
1117
 
819
1118
 
820
1119
  @mcp.tool()
821
- def get_top_losers(market: str = "america", limit: int = 25) -> list[dict[str, Any]]:
822
- """
823
- Get top losing assets in a market.
1120
+ def get_top_losers(market: str = "america", limit: int = 25) -> dict[str, Any]:
1121
+ """Get top losers for a market.
1122
+
1123
+ ⚠️ Note: Default returns 25 rows. Increase `limit` for more.
824
1124
 
825
1125
  Args:
826
- market: Market to scan (america, crypto, uk, etc.)
827
- limit: Number of results (1-100)
1126
+ market: Market (america=US stocks, crypto, uk, etc.)
1127
+ limit: Result count (1-100, default 25)
828
1128
 
829
1129
  Returns:
830
- List of top losers with price and change data
1130
+ Top losers with description (full name).
1131
+
1132
+ Example:
1133
+ get_top_losers("america", 10) -> Top 10 US losers
831
1134
  """
832
1135
  market = sanitize_market(market)
833
1136
  limit = max(1, min(limit, 100))
834
1137
 
835
- cols = ["name", "close", "volume", "change", "change_abs", "market_cap_basic"]
1138
+ # Ensure description is included
1139
+ cols = ["name", "description", "close", "change", "change_abs", "volume", "market_cap_basic"]
836
1140
 
837
1141
  query = (
838
1142
  Query()
@@ -845,47 +1149,61 @@ def get_top_losers(market: str = "america", limit: int = 25) -> list[dict[str, A
845
1149
 
846
1150
  try:
847
1151
  total, df = query.get_scanner_data()
848
- return df.to_dict("records")
1152
+ results = df.to_dict("records")
1153
+ return {
1154
+ "market": market,
1155
+ "type": "top_losers",
1156
+ "total_found": total,
1157
+ "returned": len(results),
1158
+ "data": results,
1159
+ }
849
1160
  except Exception as e:
850
- return [{"error": str(e)}]
1161
+ return {"error": str(e), "market": market}
851
1162
 
852
1163
 
853
1164
  @mcp.tool()
854
- def get_most_active(market: str = "america", limit: int = 25) -> list[dict[str, Any]]:
855
- """
856
- Get most actively traded assets by volume.
1165
+ def get_most_active(market: str = "america", limit: int = 25) -> dict[str, Any]:
1166
+ """Get most active by volume.
1167
+
1168
+ ⚠️ Note: Default returns 25 rows.
857
1169
 
858
1170
  Args:
859
- market: Market to scan
860
- limit: Number of results (1-100)
1171
+ market: Market
1172
+ limit: Result count (1-100)
861
1173
 
862
1174
  Returns:
863
- List of most active assets by volume
1175
+ Most active list with description (full name)
864
1176
  """
865
1177
  market = sanitize_market(market)
866
1178
  limit = max(1, min(limit, 100))
867
1179
 
868
- cols = ["name", "close", "volume", "change", "relative_volume_10d_calc", "market_cap_basic"]
1180
+ cols = ["name", "description", "close", "change", "volume", "relative_volume_10d_calc", "market_cap_basic"]
869
1181
 
870
1182
  query = Query().set_markets(market).select(*cols).order_by("volume", ascending=False).limit(limit)
871
1183
 
872
1184
  try:
873
1185
  total, df = query.get_scanner_data()
874
- return df.to_dict("records")
1186
+ results = df.to_dict("records")
1187
+ return {
1188
+ "market": market,
1189
+ "type": "most_active",
1190
+ "total_found": total,
1191
+ "returned": len(results),
1192
+ "data": results,
1193
+ }
875
1194
  except Exception as e:
876
- return [{"error": str(e)}]
1195
+ return {"error": str(e), "market": market}
877
1196
 
878
1197
 
879
1198
  @mcp.tool()
880
1199
  def get_premarket_movers(
881
1200
  scan_type: str = "gainers", limit: int = 25
882
- ) -> list[dict[str, Any]]:
883
- """
884
- Get pre-market movers (US market only).
1201
+ ) -> dict[str, Any]:
1202
+ """Get pre-market movers (US only).
885
1203
 
886
1204
  Args:
887
- scan_type: Type of scan - 'gainers', 'losers', 'most_active', 'gappers'
888
- limit: Number of results (1-100)
1205
+ scan_type: 'gainers', 'losers', 'most_active', 'gappers'
1206
+ limit: Result count (1-100)
889
1207
 
890
1208
  Returns:
891
1209
  List of pre-market movers
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tradingview-mcp
3
- Version: 1.1.0
3
+ Version: 26.0.0
4
4
  Summary: A comprehensive MCP server for TradingView market screening with integrated screener functionality
5
- Project-URL: Homepage, https://github.com/yourusername/tradingview-mcp
6
- Project-URL: Documentation, https://github.com/yourusername/tradingview-mcp#readme
7
- Project-URL: Repository, https://github.com/yourusername/tradingview-mcp
8
- Project-URL: Issues, https://github.com/yourusername/tradingview-mcp/issues
9
- Project-URL: Changelog, https://github.com/yourusername/tradingview-mcp/blob/main/CHANGELOG.md
5
+ Project-URL: Homepage, https://github.com/k73a/tradingview-mcp
6
+ Project-URL: Documentation, https://github.com/k73a/tradingview-mcp#readme
7
+ Project-URL: Repository, https://github.com/k73a/tradingview-mcp
8
+ Project-URL: Issues, https://github.com/k73a/tradingview-mcp/issues
9
+ Project-URL: Changelog, https://github.com/k73a/tradingview-mcp/blob/main/CHANGELOG.md
10
10
  Author: TradingView MCP Team
11
11
  License: MIT
12
12
  License-File: LICENSE
@@ -39,7 +39,6 @@ Description-Content-Type: text/markdown
39
39
  [![PyPI version](https://badge.fury.io/py/tradingview-mcp.svg)](https://badge.fury.io/py/tradingview-mcp)
40
40
  [![Python](https://img.shields.io/pypi/pyversions/tradingview-mcp.svg)](https://pypi.org/project/tradingview-mcp/)
41
41
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
42
- [![Tests](https://github.com/yourusername/tradingview-mcp/workflows/Test/badge.svg)](https://github.com/yourusername/tradingview-mcp/actions)
43
42
 
44
43
  A comprehensive Model Context Protocol (MCP) server for TradingView market screening with fully integrated screener functionality. This server provides powerful tools for cryptocurrency and stock market analysis directly through the MCP interface.
45
44
 
@@ -58,6 +57,26 @@ Use `uvx` to run directly without installing:
58
57
  }
59
58
  ```
60
59
 
60
+ ## 🤖 For AI Agents
61
+
62
+ **📖 Read [AI.md](AI.md) for the complete guide!** You can copy the entire AI.md file to understand all capabilities.
63
+
64
+ **Quick Start:**
65
+ 1. Call `get_help()` to understand how to use this MCP
66
+ 2. Call `ai_get_reference()` for markets, columns, and filter references
67
+
68
+ Key points:
69
+ - All results include `description` field with full names (e.g., "Apple Inc." not just "AAPL")
70
+ - Use `limit` parameter to control result count (default: 25)
71
+ - Use `search_symbols("apple", "america")` to search by company name
72
+
73
+ ```
74
+ # Quick examples:
75
+ get_top_gainers("america", 10) # Top 10 US stock gainers
76
+ search_symbols("tesla", "america") # Search for Tesla
77
+ get_symbol_info("NASDAQ:AAPL") # Apple Inc. details
78
+ ```
79
+
61
80
  ## Features
62
81
 
63
82
  ### Core Screener Functionality
@@ -65,14 +84,21 @@ Use `uvx` to run directly without installing:
65
84
  - **Multi-Market Support**: 76+ markets including crypto, stocks, forex, futures, and bonds
66
85
  - **SQL-like Query Interface**: Build complex queries with filtering, sorting, and pagination
67
86
  - **250+ Technical Indicators**: Access a comprehensive set of technical analysis columns
68
- - **AI-Friendly Design**: Token-saving output limits, paginated responses, and quick reference tools
87
+ - **AI-Friendly Design**: Includes `description` (full name), token-saving limits, and help tools
69
88
 
70
89
  ### MCP Tools
71
90
 
91
+ #### 🔍 Discovery & Help Tools (AI Start Here!)
92
+ - `get_help(topic)`: **📖 Required reading!** Get usage guide and examples
93
+ - `search_symbols(query, market)`: 🔍 Search by company name (e.g., "Apple", "Tesla")
94
+ - `get_symbol_info(symbol)`: Get detailed symbol information
95
+ - `ai_get_reference()`: AI quick reference guide
96
+
72
97
  #### Screening Tools
73
98
  - `screen_market`: Execute custom market screening queries
74
- - `get_top_gainers`: Find top gaining assets in any market
75
- - `get_top_losers`: Find top losing assets in any market
99
+ - `get_top_gainers`: Find top gaining assets (includes full company names)
100
+ - `get_top_losers`: Find top losing assets (includes full company names)
101
+ - `get_most_active`: Most traded by volume
76
102
  - `get_premarket_movers`: Pre-market gainers, losers, and most active
77
103
  - `get_postmarket_movers`: Post-market activity analysis
78
104
  - `get_technical_analysis`: Detailed technical analysis for specific symbols
@@ -84,7 +110,6 @@ Use `uvx` to run directly without installing:
84
110
  - `advanced_query`: Execute advanced queries with AND/OR logic
85
111
 
86
112
  #### AI-Friendly Reference Tools
87
- - `ai_get_reference`: **Start here!** Get quick reference guide with markets, columns, filters
88
113
  - `search_available_fields`: Search for fields/columns by name or description
89
114
  - `get_field_info`: Get display name and type for a specific field
90
115
  - `get_code_example`: Get Python code examples for screener types
@@ -131,7 +156,7 @@ pip install tradingview-mcp
131
156
 
132
157
  ### From Source
133
158
  ```bash
134
- git clone https://github.com/your-repo/tradingview-mcp.git
159
+ git clone https://github.com/k73a/tradingview-mcp.git
135
160
  cd tradingview-mcp
136
161
  uv sync
137
162
  ```
@@ -239,7 +264,7 @@ See `columns://list` resource for the complete list.
239
264
 
240
265
  ### Setup Development Environment
241
266
  ```bash
242
- git clone https://github.com/yourusername/tradingview-mcp.git
267
+ git clone https://github.com/k73a/tradingview-mcp.git
243
268
  cd tradingview-mcp
244
269
  uv sync --all-extras
245
270
  ```
@@ -1,11 +1,11 @@
1
1
  tradingview_mcp/__init__.py,sha256=V7RLq22Qp1rsMhDYNlXfWkiNaXlo7s4KkNUmSvbGKIM,455
2
2
  tradingview_mcp/column.py,sha256=MC7lWksmyaYF4SkVm97Apr8httwip-N-4aVTSyS0CQo,8871
3
- tradingview_mcp/constants.py,sha256=yGzC9Zie825JqqHKGWukTz4HicGKn0pDiUn8op_Me2Y,12749
3
+ tradingview_mcp/constants.py,sha256=kQUhcG0U1cVLiN6LGgzWPjCGhXh_-jvB5lF15QIX1_4,12927
4
4
  tradingview_mcp/docs_data.py,sha256=3ArdbV8RE3SpNhvkkTHA0RXgrUbQoJqkZh05VVqlLLA,9001
5
5
  tradingview_mcp/models.py,sha256=CHSQ46A2ljhvzI6YP8XRItUdoDJw1yYebiBANt9xeD0,3366
6
6
  tradingview_mcp/query.py,sha256=gkC4t-2_jtuUK3KgzU62wrIcGoaOmY--1EwAshGQb0Q,10871
7
- tradingview_mcp/scanner.py,sha256=CA8GP-N8uCYacpuUzll9IfalKK0hEUSU9ViVEAO8mwU,7535
8
- tradingview_mcp/server.py,sha256=iEnDvDluqZSu7EnM9WJrn9k1zVXG8eSCbMzQMrMB0m4,56280
7
+ tradingview_mcp/scanner.py,sha256=oEfMzaYhQ7ggBdLlPLqKZCMxHkd6MBMaUMcm3p-YvPA,7649
8
+ tradingview_mcp/server.py,sha256=3VosVvI3SQbqDxaahmgYj_aBUyn-0qGxfJf3n2p6OCk,67679
9
9
  tradingview_mcp/utils.py,sha256=6O89qIaZ_eYoN3m12r2q4-D8VpJajP5WuwKQbj4ZVHo,10238
10
10
  tradingview_mcp/data/__init__.py,sha256=3kot_ZG4a6jbZgyksE9z56n3skI407lsd4y2ThHotKY,298
11
11
  tradingview_mcp/data/column_display_names.json,sha256=AFdo6Q2n-wSXWHi2wEExOd2pTItyjocRbrnxqYpCa94,30137
@@ -30,8 +30,8 @@ tradingview_mcp/data/screeners/main_screeners.json,sha256=kU_xGJ7ePoGN3s8g9PwGrc
30
30
  tradingview_mcp/data/screeners/markets.json,sha256=vpdrAKg4E_lgg4FxeX2GHNbnSsKQDmgfnyr2ziSdQsk,1004
31
31
  tradingview_mcp/data/screeners/stocks.json,sha256=gCnntHTJKJ7n7IqY72fZ4EuBfthtnWUpfHvPqNOvnXo,8843
32
32
  tradingview_mcp/data/screeners/stocks_failed.json,sha256=RqBp9XCZ3xvdWZMwuVGysEE2Er_XOQvBZoUHo9uyj6k,1084574
33
- tradingview_mcp-1.1.0.dist-info/METADATA,sha256=yJq7Y5bwoLVW69fILClesCkdkYLDMII16vT_gMsfwH4,9335
34
- tradingview_mcp-1.1.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
35
- tradingview_mcp-1.1.0.dist-info/entry_points.txt,sha256=GZxjGqgVbUlWDp5OzFQoCN_g1UBLyOmfVqCR5uzscnU,57
36
- tradingview_mcp-1.1.0.dist-info/licenses/LICENSE,sha256=ma04jhucIafnA2IaYn--PlxmCUpqhESjKAu4d0c_Ib4,1141
37
- tradingview_mcp-1.1.0.dist-info/RECORD,,
33
+ tradingview_mcp-26.0.0.dist-info/METADATA,sha256=5MvoUOTOvcq2aTdIMX8v-BOMfHm-wqAuVMcHhjPNP9w,10178
34
+ tradingview_mcp-26.0.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
35
+ tradingview_mcp-26.0.0.dist-info/entry_points.txt,sha256=GZxjGqgVbUlWDp5OzFQoCN_g1UBLyOmfVqCR5uzscnU,57
36
+ tradingview_mcp-26.0.0.dist-info/licenses/LICENSE,sha256=1Hdpp7qGWCXVw1BP6vpdAPO4KrgO0T_c0N3ipkYHKAo,1070
37
+ tradingview_mcp-26.0.0.dist-info/RECORD,,
@@ -1,7 +1,5 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2022 Shneor Elmaleh
4
- Copyright (c) 2025 Ahmet Taner Atila
5
3
  Copyright (c) 2026 Henrik (k73a)
6
4
 
7
5
  Permission is hereby granted, free of charge, to any person obtaining a copy