[{'Text': '"""Chart generation and access tools."""\n\nfrom typing import Optional\nfrom mcp.server.fastmcp import Context\nfrom mcp.server.session import ServerSession\nfrom dotenv import load_dotenv\nimport os\n\nload_dotenv()\n\n# Public chart tools (no credentials needed) - always available\ndef get_point_topic_public_chart_catalog(ctx: Optional[Context[ServerSession, None]] = None) -> str:\n    """Get all available public charts from the Point Topic Charts API.\n    \n    Fetches the public chart catalog (no authentication required).\n    \n    Returns:\n        JSON string containing public chart catalog with titles, parameters, and example URLs.\n    """\n    import requests\n    import json\n    response = requests.get("https://charts.point-topic.com/public")\n    return json.dumps(response.json())\n\n\ndef get_point_topic_public_chart_csv(url: str, ctx: Optional[Context[ServerSession, None]] = None) -> str:\n    """Get a specific public chart from Point Topic Charts API as CSV.\n    \n    Use this to fetch chart data for context when displaying charts.\n    For iframe embedding, use URL without format parameter.\n    \n    Args:\n        url: Chart URL WITHOUT the format parameter (e.g., no &format=png/csv).\n    \n    Returns: CSV string with chart data\n    """\n    import urllib.parse\n    import requests\n\n    # strip any existing format param and add format=csv\n    parsed = urllib.parse.urlparse(url)\n    query = urllib.parse.parse_qs(parsed.query)\n    query.pop(\'format\', None)\n    query[\'format\'] = \'csv\'\n    csv_url = urllib.parse.urlunparse(parsed._replace(query=urllib.parse.urlencode(query, doseq=True)))\n\n    resp = requests.get(csv_url)\n    if resp.status_code != 200:\n        return f"Error: {resp.status_code} {resp.text}"\n    \n    return resp.text\n\n\n# Authenticated chart tools (require API key) - TEMPORARILY DISABLED\n# Uncomment the block below when the production issues are fixed\n\n# Authenticated chart tools (require API key) - ONLY if API key present\n# if has_chart_api_key:\n#     # Track for status reporting\n#     check_env_vars(\'chart_tools\', [\'CHART_API_KEY\'])\n#     def get_point_topic_chart_catalog(format_type: str = "json", ctx: Optional[Context[ServerSession, None]] = None) -> str:\n#         """Get complete chart catalog with required parameters AND valid values.\n        \n#         CRITICAL: Check \'required_params\' for EACH chart before generating URLs.\n#         Most charts require \'period\' - NOT optional if listed as required.\n        \n#         Catalog now includes valid period values for each chart.\n#         Use the MOST RECENT period shown unless user specifies otherwise.\n        \n#         Args:\n#             format_type: "json" (default) or "html"\n            \n#         Returns:\n#             Chart metadata with required_params AND valid period values.\n#         """\n#         import requests\n#         import os\n        \n#         api_key = os.getenv("CHART_API_KEY")\n#         headers = {\n#             "X-API-Key": api_key,\n#             "User-Agent": "MCP-Server/1.0"\n#         }\n        \n#         # Determine URL based on format\n#         if format_type.lower() == "html":\n#             url = "https://charts.point-topic.com/catalog?pretty=true"\n#         else:\n#             url = "https://charts.point-topic.com/catalog"\n        \n#         try:\n#             response = requests.get(url, headers=headers, timeout=30.0)\n            \n#             if response.status_code == 401:\n#                 return "Error: Invalid API key. Check CHART_API_KEY environment variable."\n#             elif response.status_code != 200:\n#                 return f"Error: API returned status {response.status_code}: {response.text}"\n            \n#             if format_type.lower() == "html":\n#                 return f"HTML catalog retrieved successfully. View at: {url}"\n'}]