Spaces:
Sleeping
Sleeping
| 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() | |