{"tools":[{"id":"calculator","name":"Calculator","description":"Evaluate a numeric arithmetic expression safely (+ - * / % ^ and parentheses). No code execution.","category":"Utilities","risk":"safe","parameters":{"type":"object","properties":{"expression":{"type":"string","description":"e.g. \"(3 + 4) * 2 / 7\""}},"required":["expression"]}},{"id":"word-count","name":"Word Counter","description":"Count words, characters, and sentences in a piece of text.","category":"Utilities","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}},{"id":"redact","name":"PII Redactor","description":"Detect and redact emails, phone numbers, and API-key-like tokens from text.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}},{"id":"json-format","name":"JSON Formatter","description":"Validate and pretty-print a JSON string, or minify it.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"json":{"type":"string"},"mode":{"type":"string","enum":["pretty","minify"]}},"required":["json"]}},{"id":"hash","name":"Hash Generator","description":"Generate a SHA-256 hash of a text input (useful for fingerprinting content or checking integrity).","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}},{"id":"summarize","name":"Summarizer","description":"Use the language model to compress a long piece of text into a short brief.","category":"Content","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"},"style":{"type":"string","enum":["brief","bullets","executive"]}},"required":["text"]}},{"id":"translate","name":"Translator","description":"Translate text into a target language using the language model.","category":"Content","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"},"targetLanguage":{"type":"string"}},"required":["text","targetLanguage"]}},{"id":"sentiment","name":"Sentiment Analyzer","description":"Classify the sentiment of a piece of text as positive, neutral, or negative with a short rationale.","category":"Content","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}},{"id":"code-explain","name":"Code Explainer","description":"Explain what a snippet of code does in plain language. Does not execute the code.","category":"Content","risk":"safe","parameters":{"type":"object","properties":{"code":{"type":"string"},"language":{"type":"string"}},"required":["code"]}},{"id":"web-fetch","name":"Web Page Fetcher","description":"Fetch a public web page over HTTPS and return its readable text content (first ~4000 characters).","category":"Data","risk":"review","parameters":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}},{"id":"date-math","name":"Date Calculator","description":"Add or subtract days/hours from a date, or compute the difference between two ISO dates.","category":"Utilities","risk":"safe","parameters":{"type":"object","properties":{"mode":{"type":"string","enum":["add","diff"]},"date":{"type":"string","description":"ISO date string"},"days":{"type":"number"},"hours":{"type":"number"},"otherDate":{"type":"string","description":"ISO date string, required for diff mode"}},"required":["mode","date"]}},{"id":"uuid-generate","name":"UUID Generator","description":"Generate one or more random UUIDs (v4).","category":"Utilities","risk":"safe","parameters":{"type":"object","properties":{"count":{"type":"number"}}}},{"id":"risk-score","name":"Content Risk Scorer","description":"Score a piece of text or a planned action from 0-100 for operational risk, using heuristics (destructive verbs, external network calls, credentials).","category":"Ops","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}},{"id":"chunk-text","name":"Text Chunker","description":"Split a long text into chunks of roughly N characters, breaking on sentence boundaries where possible (useful for indexing or feeding to an LLM in pieces).","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"},"chunkSize":{"type":"number"}},"required":["text"]}},{"id":"qr-payload","name":"QR Payload Builder","description":"Build a properly formatted payload string for common QR code use cases (URL, WiFi, vCard, plain text) — does not render an image.","category":"Utilities","risk":"safe","parameters":{"type":"object","properties":{"kind":{"type":"string","enum":["url","wifi","text"]},"url":{"type":"string"},"ssid":{"type":"string"},"password":{"type":"string"},"security":{"type":"string","enum":["WPA","WEP","nopass"]},"text":{"type":"string"}},"required":["kind"]}},{"id":"pdf-extract","name":"PDF Text Extractor","description":"Extract plain text from a PDF file already uploaded via /api/files (pass its fileId). Useful before summarizing or chunking a document.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"fileId":{"type":"string"}},"required":["fileId"]}},{"id":"ocr-image","name":"Image OCR / Describer","description":"Read text out of an image (screenshot, photo of a document, whiteboard, receipt) using the vision-capable LLM, and/or describe the image contents.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"imageUrl":{"type":"string","description":"Publicly reachable image URL"},"mode":{"type":"string","enum":["transcribe","describe"]}},"required":["imageUrl"]}},{"id":"semantic-recall","name":"Semantic Memory Recall","description":"Search stored memories and past messages by meaning (not just keyword) to find the most relevant context for a query. This is real vector/RAG retrieval.","category":"Cognition","risk":"safe","parameters":{"type":"object","properties":{"query":{"type":"string"},"limit":{"type":"number"}},"required":["query"]}},{"id":"entity-extract","name":"Entity Extractor","description":"Extract structured entities (people, organizations, dates, locations, monetary amounts) from free text as JSON, using the language model.","category":"Content","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}},{"id":"classify","name":"Text Classifier","description":"Classify a piece of text into one of a provided set of labels, with a confidence score.","category":"Content","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"},"labels":{"type":"array","items":{"type":"string"}}},"required":["text","labels"]}},{"id":"diff-text","name":"Text Diff","description":"Compute a line-level diff between two pieces of text (added/removed/unchanged lines).","category":"Utilities","risk":"safe","parameters":{"type":"object","properties":{"before":{"type":"string"},"after":{"type":"string"}},"required":["before","after"]}},{"id":"regex-extract","name":"Regex Extractor","description":"Extract all matches of a regular expression from text. Useful for pulling structured tokens (IDs, codes, tags) out of unstructured input.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"},"pattern":{"type":"string"},"flags":{"type":"string"}},"required":["text","pattern"]}},{"id":"unit-convert","name":"Unit Converter","description":"Convert a numeric value between common units of length, weight, temperature, or data size.","category":"Utilities","risk":"safe","parameters":{"type":"object","properties":{"value":{"type":"number"},"from":{"type":"string"},"to":{"type":"string"}},"required":["value","from","to"]}},{"id":"csv-to-json","name":"CSV to JSON","description":"Parse a CSV string (with a header row) into an array of JSON objects.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"csv":{"type":"string"}},"required":["csv"]}},{"id":"schedule-parse","name":"Natural Language Scheduler","description":"Parse a natural-language time expression (e.g. \"tomorrow at 3pm\", \"in 2 hours\", \"next monday\") relative to now into an ISO timestamp, using the language model.","category":"Productivity","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"},"nowIso":{"type":"string"}},"required":["text"]}},{"id":"code-generate","name":"Code Generator","description":"Generate a small code snippet for a described task, in a specified language. Returns code only — never executes it.","category":"Content","risk":"safe","parameters":{"type":"object","properties":{"description":{"type":"string"},"language":{"type":"string"}},"required":["description","language"]}},{"id":"web-search-summary","name":"Multi-Page Web Summary","description":"Fetches multiple public HTTPS pages and produces one combined summary across them (useful for quick multi-source research).","category":"Data","risk":"review","parameters":{"type":"object","properties":{"urls":{"type":"array","items":{"type":"string"}},"focus":{"type":"string"}},"required":["urls"]}},{"id":"kaggle-dataset-search","name":"Kaggle Dataset Search","description":"Search Kaggle for public datasets by keyword. Returns titles, owners, sizes, and popularity so the analyst agent can choose a real dataset to work with.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"query":{"type":"string"},"sortBy":{"type":"string","enum":["hottest","votes","updated","active"]},"maxResults":{"type":"number"}},"required":["query"]}},{"id":"kaggle-dataset-info","name":"Kaggle Dataset Info","description":"Get full metadata (description, license, size, last updated) for a specific Kaggle dataset given its \"owner/dataset\" reference (e.g. from kaggle-dataset-search results).","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"ref":{"type":"string","description":"e.g. \"heptapod/titanic\""}},"required":["ref"]}},{"id":"kaggle-dataset-download","name":"Kaggle Dataset Download","description":"Download a Kaggle dataset (given its \"owner/dataset\" ref), extract the first CSV/JSON file inside it, and return that file as text (truncated to ~50k chars). Also caches the raw zip in R2 (if bound) for reuse. Follow up with csv-to-json or entity-extract to work with the data.","category":"Data","risk":"review","parameters":{"type":"object","properties":{"ref":{"type":"string"},"datasetVersionNumber":{"type":"number"}},"required":["ref"]}},{"id":"kaggle-kernel-search","name":"Kaggle Notebook (Kernel) Search","description":"Search Kaggle for public notebooks (kernels) related to a topic or dataset — useful for finding reference analysis approaches.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"query":{"type":"string"},"maxResults":{"type":"number"}},"required":["query"]}},{"id":"code-execute","name":"Code Executor (E2B Sandbox)","description":"Actually RUNS a code snippet inside an isolated, ephemeral E2B cloud sandbox and returns real stdout/stderr/results/errors. Unlike code-generate (which only writes code) or code-explain (which only reasons about it), this executes it for real. Use for data analysis, calculations, or verifying generated code actually works. Supports python, javascript, typescript, r, and bash.","category":"Ops","risk":"sensitive","parameters":{"type":"object","properties":{"code":{"type":"string"},"language":{"type":"string","enum":["python","javascript","typescript","r","bash"]}},"required":["code"]}},{"id":"supabase-query","name":"Supabase Table Query","description":"Read rows from a table in the user's own Supabase project via PostgREST (e.g. a custom app table). Filters use PostgREST syntax, e.g. {\"status\":\"eq.active\"}.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"table":{"type":"string"},"filters":{"type":"object"},"select":{"type":"string"},"limit":{"type":"number"},"order":{"type":"string"}},"required":["table"]}},{"id":"supabase-write","name":"Supabase Table Write","description":"Insert or upsert rows into a table in the user's own Supabase project via PostgREST. Sensitive: requires confirmation before running.","category":"Data","risk":"sensitive","parameters":{"type":"object","properties":{"table":{"type":"string"},"rows":{"type":"array","items":{"type":"object"}},"onConflict":{"type":"string","description":"Column name to upsert on, e.g. \"id\""}},"required":["table","rows"]}},{"id":"supabase-delete","name":"Supabase Table Delete","description":"Delete rows from a table in the user's own Supabase project via PostgREST, scoped by required filters (never allows an unfiltered delete). Sensitive: requires confirmation before running.","category":"Data","risk":"sensitive","parameters":{"type":"object","properties":{"table":{"type":"string"},"filters":{"type":"object"}},"required":["table","filters"]}},{"id":"web-scrape","name":"Web Page Scrape (Firecrawl)","description":"Fetches a single URL and returns clean, readable markdown of its real rendered content (handles JS-rendered pages and anti-bot-protected sites far better than a raw web-fetch). Use this instead of web-fetch when you need the actual article/page content, not just raw HTML.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"url":{"type":"string"},"onlyMainContent":{"type":"boolean"}},"required":["url"]}},{"id":"web-search-pro","name":"Web Search (Firecrawl, full content)","description":"Full-text web search that can optionally return full scraped markdown content per result (not just a snippet), unlike web-search-summary. Use scrapeContent:true when you need the actual page text to reason over, not just titles/links.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"query":{"type":"string"},"limit":{"type":"number"},"scrapeContent":{"type":"boolean"}},"required":["query"]}},{"id":"web-site-map","name":"Website URL Map (Firecrawl)","description":"Discovers a site's full URL tree quickly (link discovery only, no content fetch) — use this first to decide which specific pages of a large site are worth scraping individually with web-scrape.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"url":{"type":"string"},"search":{"type":"string"},"limit":{"type":"number"}},"required":["url"]}},{"id":"hf-generate-text","name":"Open-Model Text Generation (Hugging Face)","description":"Generates text using an open-weights model via Hugging Face Inference Providers, routed to whichever backend serves it fastest. Use as an alternative/fallback LLM to the primary chat model, e.g. for cost, license, or model-diversity reasons — pass a specific model id to pick a particular open model.","category":"Cognition","risk":"safe","parameters":{"type":"object","properties":{"prompt":{"type":"string"},"model":{"type":"string"},"temperature":{"type":"number"},"maxTokens":{"type":"number"}},"required":["prompt"]}},{"id":"hf-embed-text","name":"Text Embedding (Hugging Face)","description":"Computes a dense embedding vector for a piece of text via Hugging Face feature-extraction, as a higher-quality alternative to the local pseudo-embedding fallback used when Workers AI is unavailable. Mainly used internally by embeddings.ts, exposed here for direct inspection/testing.","category":"Data","risk":"safe","parameters":{"type":"object","properties":{"text":{"type":"string"},"model":{"type":"string"}},"required":["text"]}},{"id":"provider-status","name":"Third-Party Provider Status","description":"Reports which external providers (Supabase, Kaggle, E2B, Firecrawl, Hugging Face) are configured and how many pooled accounts each has, without ever exposing key material. Useful for diagnosing \"why did tool X fail\" before assuming it is a bug.","category":"Ops","risk":"safe","parameters":{"type":"object","properties":{}}}]}