""" Central registry for every tool exposed by this Space. Each entry describes: name -- matches the module name in tools/ and the route /tools/{name} category -- for grouping in docs / a future UI auth -- "none" | "key" | "cookie" | "oauth" | "account_pool" tool_keys -- the `tool` value to look up in Supabase tool_keys (None if auth == "none") params -- list of {name, type, required, default, description} app.py uses this to validate incoming requests before dispatching to the matching tools/.py's run(params) function, and to auto-generate a /registry endpoint agents can introspect. """ TOOLS = [ # ---------- Free APIs ---------- { "name": "google_trends", "category": "free_apis", "auth": "none", "tool_keys": None, "params": [ {"name": "geo", "type": "str", "required": False, "default": "US"}, {"name": "days_back", "type": "int", "required": False, "default": 1}, ], }, { "name": "kalshi", "category": "free_apis", "auth": "none", "tool_keys": None, "params": [ {"name": "status", "type": "str", "required": False, "default": "open"}, {"name": "title_contains", "type": "str", "required": False, "default": None}, {"name": "event_ticker", "type": "str", "required": False, "default": None}, {"name": "limit", "type": "int", "required": False, "default": 100}, ], }, { "name": "polymarket", "category": "free_apis", "auth": "none", "tool_keys": None, "params": [ {"name": "query", "type": "str", "required": False, "default": None}, {"name": "active", "type": "bool", "required": False, "default": True}, {"name": "sort_by", "type": "str", "required": False, "default": "volume_24hr"}, {"name": "limit", "type": "int", "required": False, "default": 50}, ], }, # ---------- Scrapers ---------- { "name": "youtube_email_scraper", "category": "scrapers", "auth": "none", "tool_keys": None, "params": [ {"name": "mode", "type": "str", "required": True, "default": None, "description": "'urls' or 'keyword'"}, {"name": "channels", "type": "list", "required": False, "default": None}, {"name": "keyword", "type": "str", "required": False, "default": None}, {"name": "max_results", "type": "int", "required": False, "default": 20}, ], }, { "name": "walmart_scraper", "category": "scrapers", "auth": "none", "tool_keys": None, "params": [ {"name": "keyword", "type": "str", "required": True, "default": None}, {"name": "sort", "type": "str", "required": False, "default": "best_match"}, {"name": "max_results", "type": "int", "required": False, "default": 25}, ], }, { "name": "amazon_scraper", "category": "scrapers", "auth": "none", "tool_keys": None, "params": [ {"name": "keyword", "type": "str", "required": True, "default": None}, {"name": "country", "type": "str", "required": False, "default": "US"}, {"name": "max_results", "type": "int", "required": False, "default": 25}, ], }, # ---------- Marketplaces ---------- { "name": "etsy", "category": "marketplaces", "auth": "key", "tool_keys": "etsy", "params": [ {"name": "keywords", "type": "str", "required": True, "default": None}, {"name": "min_price", "type": "float", "required": False, "default": None}, {"name": "max_price", "type": "float", "required": False, "default": None}, {"name": "sort_on", "type": "str", "required": False, "default": "score"}, {"name": "limit", "type": "int", "required": False, "default": 50}, ], }, { "name": "ebay", "category": "marketplaces", "auth": "key", "tool_keys": "ebay", "params": [ {"name": "keywords", "type": "str", "required": True, "default": None}, {"name": "sold_only", "type": "bool", "required": False, "default": False}, {"name": "condition", "type": "str", "required": False, "default": None}, {"name": "max_results", "type": "int", "required": False, "default": 25}, ], }, { "name": "craigslist", "category": "marketplaces", "auth": "none", "tool_keys": None, "params": [ {"name": "city", "type": "str", "required": True, "default": None, "description": "craigslist subdomain, e.g. 'phoenix'"}, {"name": "keyword", "type": "str", "required": True, "default": None}, {"name": "category", "type": "str", "required": False, "default": "sss"}, ], }, { "name": "target", "category": "marketplaces", "auth": "none", "tool_keys": None, "params": [ {"name": "keyword", "type": "str", "required": True, "default": None}, {"name": "sort", "type": "str", "required": False, "default": "relevance"}, {"name": "max_results", "type": "int", "required": False, "default": 25}, ], }, { "name": "depop", "category": "marketplaces", "auth": "none", "tool_keys": None, "params": [ {"name": "keyword", "type": "str", "required": True, "default": None}, {"name": "country", "type": "str", "required": False, "default": "us"}, {"name": "limit", "type": "int", "required": False, "default": 24}, ], }, { "name": "poshmark", "category": "marketplaces", "auth": "cookie", "tool_keys": "poshmark", "params": [ {"name": "keyword", "type": "str", "required": True, "default": None}, {"name": "department", "type": "str", "required": False, "default": "Women"}, {"name": "sold_only", "type": "bool", "required": False, "default": False}, {"name": "count", "type": "int", "required": False, "default": 48}, ], }, { "name": "shopify_products", "category": "marketplaces", "auth": "none", "tool_keys": None, "params": [ {"name": "store_domain", "type": "str", "required": True, "default": None, "description": "e.g. 'examplestore.myshopify.com'"}, {"name": "max_pages", "type": "int", "required": False, "default": 5}, ], }, { "name": "facebook_marketplace", "category": "marketplaces", "auth": "cookie", "tool_keys": "facebook_marketplace", "params": [ {"name": "city", "type": "str", "required": True, "default": None}, {"name": "keyword", "type": "str", "required": True, "default": None}, {"name": "max_results", "type": "int", "required": False, "default": 25}, ], }, { "name": "offerup", "category": "marketplaces", "auth": "none", "tool_keys": None, "params": [ {"name": "keyword", "type": "str", "required": True, "default": None}, {"name": "limit", "type": "int", "required": False, "default": 50}, ], }, # ---------- Social Intelligence ---------- { "name": "twitter_twscrape", "category": "social", "auth": "account_pool", "tool_keys": "twitter_twscrape", "params": [ {"name": "query", "type": "str", "required": True, "default": None, "description": "supports X search operators"}, {"name": "limit", "type": "int", "required": False, "default": 50}, ], }, { "name": "instagram", "category": "social", "auth": "none", "tool_keys": "instagram", "params": [ {"name": "mode", "type": "str", "required": True, "default": None, "description": "'profile' or 'hashtag'"}, {"name": "target", "type": "str", "required": True, "default": None}, {"name": "max_posts", "type": "int", "required": False, "default": 20}, ], }, { "name": "tiktok", "category": "social", "auth": "oauth", "tool_keys": "tiktok", "params": [ {"name": "keyword", "type": "str", "required": True, "default": None}, {"name": "start_date", "type": "str", "required": True, "default": None, "description": "YYYYMMDD"}, {"name": "end_date", "type": "str", "required": True, "default": None, "description": "YYYYMMDD"}, {"name": "max_count", "type": "int", "required": False, "default": 50}, ], }, { "name": "linkedin", "category": "social", "auth": "cookie", "tool_keys": "linkedin", "params": [ {"name": "mode", "type": "str", "required": True, "default": None, "description": "'profile' | 'people_search' | 'company'"}, {"name": "target", "type": "str", "required": True, "default": None}, {"name": "limit", "type": "int", "required": False, "default": 25}, ], }, { "name": "reddit", "category": "social", "auth": "key", "tool_keys": "reddit", "params": [ {"name": "query", "type": "str", "required": True, "default": None}, {"name": "subreddit", "type": "str", "required": False, "default": "all"}, {"name": "sort", "type": "str", "required": False, "default": "new"}, {"name": "time_filter", "type": "str", "required": False, "default": "month"}, {"name": "limit", "type": "int", "required": False, "default": 50}, ], }, # ---------- Crypto & DeFi ---------- { "name": "coingecko", "category": "crypto", "auth": "none", "tool_keys": None, "params": [ {"name": "mode", "type": "str", "required": False, "default": "markets", "description": "'markets' | 'trending' | 'ohlc'"}, {"name": "coin_id", "type": "str", "required": False, "default": None}, {"name": "days", "type": "int", "required": False, "default": 30}, {"name": "per_page", "type": "int", "required": False, "default": 100}, ], }, { "name": "binance", "category": "crypto", "auth": "none", "tool_keys": None, "params": [ {"name": "mode", "type": "str", "required": False, "default": "ticker", "description": "'ticker' | 'klines' | 'depth'"}, {"name": "symbol", "type": "str", "required": False, "default": "BTCUSDT"}, {"name": "interval", "type": "str", "required": False, "default": "1d"}, {"name": "limit", "type": "int", "required": False, "default": 30}, ], }, { "name": "defillama", "category": "crypto", "auth": "none", "tool_keys": None, "params": [ {"name": "mode", "type": "str", "required": False, "default": "protocols", "description": "'protocols' | 'protocol' | 'chains' | 'stablecoins' | 'dex_volume'"}, {"name": "protocol_slug", "type": "str", "required": False, "default": None}, ], }, # ---------- News & Macro Intel ---------- { "name": "gdelt", "category": "news_macro", "auth": "none", "tool_keys": None, "params": [ {"name": "query", "type": "str", "required": True, "default": None}, {"name": "mode", "type": "str", "required": False, "default": "artlist", "description": "'artlist' | 'timelinevolnorm' | 'timelinetone'"}, {"name": "max_records", "type": "int", "required": False, "default": 100}, ], }, { "name": "sec_edgar", "category": "news_macro", "auth": "none", "tool_keys": None, "params": [ {"name": "mode", "type": "str", "required": True, "default": None, "description": "'facts' | 'filings' | 'search'"}, {"name": "cik", "type": "str", "required": False, "default": None}, {"name": "company", "type": "str", "required": False, "default": None}, {"name": "form_type", "type": "str", "required": False, "default": None}, ], }, { "name": "fred", "category": "news_macro", "auth": "key", "tool_keys": "fred", "params": [ {"name": "series_id", "type": "str", "required": True, "default": None}, ], }, { "name": "hackernews", "category": "news_macro", "auth": "none", "tool_keys": None, "params": [ {"name": "mode", "type": "str", "required": False, "default": "top", "description": "'top' | 'search'"}, {"name": "query", "type": "str", "required": False, "default": None}, {"name": "min_points", "type": "int", "required": False, "default": 50}, {"name": "limit", "type": "int", "required": False, "default": 30}, ], }, { "name": "github", "category": "news_macro", "auth": "key", "tool_keys": "github", "params": [ {"name": "mode", "type": "str", "required": False, "default": "search", "description": "'search' | 'org' | 'commit_activity'"}, {"name": "query", "type": "str", "required": False, "default": None}, {"name": "org", "type": "str", "required": False, "default": None}, {"name": "owner", "type": "str", "required": False, "default": None}, {"name": "repo", "type": "str", "required": False, "default": None}, {"name": "sort", "type": "str", "required": False, "default": "stars"}, {"name": "per_page", "type": "int", "required": False, "default": 30}, ], }, ] BY_NAME = {t["name"]: t for t in TOOLS}