import click import sys import subprocess import os from rich.console import Console from rich.panel import Panel console = Console() @click.group() def cli(): """TechRadar MCP โ€” Universal Tech Hiring Intelligence & MCP Ecosystem across India & Remote.""" pass @cli.command() @click.option("--live/--no-live", default=True, help="Fetch real-time live internet jobs from RemoteOK, Jobicy, WWR") def seed(live): """Seed SQLite database & Vector Engine with curated + live internet job postings.""" console.print(f"[bold green]๐ŸŒฑ Seeding TechRadar Database (Live Scraping: {live})...[/bold green]") from tech_radar.scrapers.seeder import seed_database seed_database(fetch_live=live) @cli.command() def scrape_live(): """Trigger real-time live internet job scraping pipeline.""" console.print("[bold cyan]๐ŸŒ Executing Live Internet Job Scraper Pipeline...[/bold cyan]") from tech_radar.scrapers.live_scraper import LiveInternetScraper from tech_radar.db.database import DatabaseManager from tech_radar.db.vector_store import SemanticVectorStore scraper = LiveInternetScraper() live_jobs = scraper.fetch_all_live_jobs() db = DatabaseManager() for job in live_jobs: db.save_job_posting(job) vector_store = SemanticVectorStore() all_jobs = db.get_all_jobs() vector_store.index_jobs(all_jobs) console.print(f"[bold green]โœ… Ingested {len(live_jobs)} live jobs! Total jobs in database: {len(all_jobs)}[/bold green]") @cli.command() @click.option("--transport", default="stdio", type=click.Choice(["stdio", "sse"]), help="MCP transport protocol") def serve(transport): """Start the FastMCP Protocol Server for Claude Desktop or Cursor IDE.""" console.print(Panel.fit( f"[bold magenta]โšก Starting TechRadar FastMCP Server ({transport} mode)...[/bold magenta]\n" "[dim]Exposing tools: search_tech_jobs, analyze_skill_gap, generate_tailored_resume_patch, get_market_insights, generate_interview_prep_kit[/dim]", title="TechRadar MCP" )) from tech_radar.mcp.server import mcp if transport == "stdio": mcp.run(transport="stdio") else: mcp.run(transport="sse") @cli.command() @click.option("--port", default=8000, help="Port to run 3D Web App frontend on") def web(port): """Launch the 3D Cyber-Glassmorphic Web App frontend.""" console.print(f"[bold cyan]๐ŸŒ Launching 3D Cyber-Glassmorphic TechRadar Web App on http://localhost:{port}...[/bold cyan]") import uvicorn uvicorn.run("tech_radar.ui.static_server:app", host="0.0.0.0", port=port, reload=True) @cli.command() @click.option("--port", default=8501, help="Port to run Streamlit dashboard on") def ui(port): """Launch the Interactive Streamlit Dashboard.""" console.print(f"[bold cyan]๐Ÿš€ Launching TechRadar Streamlit Dashboard on http://localhost:{port}...[/bold cyan]") app_path = os.path.join(os.path.dirname(__file__), "ui", "app.py") subprocess.run([sys.executable, "-m", "streamlit", "run", app_path, "--server.port", str(port)]) @cli.command() def test_mcp(): """Run automated end-to-end verification of all FastMCP tools.""" console.print("[bold yellow]๐Ÿงช Running Automated FastMCP Server Verification...[/bold yellow]") from tech_radar.mcp.tools import ( tool_search_tech_jobs, tool_analyze_skill_gap, tool_generate_resume_patch, tool_get_market_insights, tool_generate_interview_prep_kit ) console.print("\n1. Testing 'search_tech_jobs' (Backend in Bengaluru)...") res1 = tool_search_tech_jobs(domain="Backend Engineering", city="Bengaluru", query="Go") console.print(f" Success! Retreived response size: {len(res1)} bytes") console.print("\n2. Testing 'get_market_insights' (Cloud in Hyderabad)...") res2 = tool_get_market_insights(domain="Cloud & DevOps", city="Hyderabad") console.print(f" Success! Retreived response size: {len(res2)} bytes") console.print("\n3. Testing 'analyze_skill_gap' (BLR-BACKEND-101)...") res3 = tool_analyze_skill_gap(resume_text="Go & Docker developer", target_job_id="BLR-BACKEND-101") console.print(f" Success! Retreived response size: {len(res3)} bytes") console.print("\n4. Testing 'generate_tailored_resume_patch' (PUNE-FULLSTACK-202)...") res4 = tool_generate_resume_patch(resume_text="Python React dev", target_job_id="PUNE-FULLSTACK-202") console.print(f" Success! Retreived response size: {len(res4)} bytes") console.print("\n5. Testing 'generate_interview_prep_kit' (BLR-FRONTEND-201)...") res5 = tool_generate_interview_prep_kit(target_job_id="BLR-FRONTEND-201") console.print(f" Success! Retreived response size: {len(res5)} bytes") console.print("\n[bold green]โœ… All 5 FastMCP Tools verified successfully![/bold green]") if __name__ == "__main__": cli()