import argparse, sys, yaml, os import gradio as gr from openapi_loader import prepare_app def ping(message: str) -> str: return f"pong: {message}" def _hello_blocks() -> gr.Blocks: with gr.Blocks() as demo: gr.Markdown("## AnyAPI→MCP Factory (Skeleton)") inp = gr.Textbox(label="Message") out = gr.Textbox(label="Reply") gr.Button("Ping").click(ping, inp, out, api_name="ping") return demo def _load_profile(name: str): path = os.path.join(os.getcwd(), "profiles.yaml") if not os.path.exists(path): raise FileNotFoundError("profiles.yaml not found.") data = yaml.safe_load(open(path, "r", encoding="utf-8")) if name not in data: raise KeyError(f"profile '{name}' not in profiles.yaml. Have: {list(data.keys())}") prof = data[name] or {} return prof.get("spec"), prof.get("base_url"), prof.get("bearer") def main(): parser = argparse.ArgumentParser() parser.add_argument("--spec", type=str, help="OpenAPI spec URL or local path") parser.add_argument("--base-url", type=str, default=None, help="Override API base URL (e.g., https://api.example.com)") parser.add_argument("--bearer", type=str, default=None, help="Bearer token") parser.add_argument("--profile", type=str, default=None, help="Profile name from profiles.yaml") parser.add_argument("--share", action="store_true", help="Share link for quick demos") args = parser.parse_args() spec, base_url, bearer = args.spec, args.base_url, args.bearer # If running in Spaces (no CLI flags), autoload a profile. if not (spec or args.profile): default_profile = os.getenv("DEFAULT_PROFILE", "httpbin") try: p_spec, p_base, p_bearer = _load_profile(default_profile) spec = p_spec base_url = base_url or p_base # only take bearer from profile if user didn't pass one bearer = bearer if (bearer is not None and bearer != "") else (p_bearer or None) args.profile = default_profile print(f"[Space] No flags; auto-loading profile '{default_profile}'") except Exception as e: print(f"[Space] Could not autoload profile '{default_profile}': {e}") if args.profile: p_spec, p_base, p_bearer = _load_profile(args.profile) # CLI flags take precedence if provided, else use profile values spec = spec or p_spec base_url = base_url or p_base bearer = bearer if (bearer is not None and bearer != "") else (p_bearer or None) if spec: demo, origin = prepare_app(spec, base_url=base_url, bearer_token=bearer) print(f"[AnyAPI→MCP] Loaded spec from: {origin}") if bearer: print("[AnyAPI→MCP] Bearer token provided (masked).") else: demo = _hello_blocks() demo.launch(mcp_server=True, share=args.share) if __name__ == "__main__": main()