{"ok":true,"site":{"host":"airlock-app.netlify.app","url":"https://airlock-app.netlify.app/","type":"live","desc":"A private in-browser data workbench. Your CSV is parsed and analysed entirely inside the tab; an AI agent calls WebMCP tools and receives only the answers.","tools":[{"name":"describe_dataset","kind":"answer","impl":"imperative","description":"Describe the spreadsheet currently loaded in the page: row count, column names, category list, date range and total amount. Call this first to learn what data is available. Individual rows are never returned. While the human has privacy mode on, the file name is withheld too.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"sum_by_category","kind":"act","impl":"imperative","description":"Total the loaded spending by category, largest first. Optionally pass a category name to visually highlight its rows in the table for the human reading the page. Returns aggregates only, so it answers the same whether or not privacy mode is on.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"highlight":{"type":"string","description":"Exact category name to highlight in the table. Must match a category returned by describe_dataset."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"filter_rows","kind":"act","impl":"imperative","description":"Find rows matching any combination of date range, category and amount bounds. Returns how many matched and their total, and highlights every match in the table. While the human has privacy mode on the matching rows are withheld; with it off a small preview of them is included.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"from":{"type":"string","description":"Earliest date to include, as YYYY-MM-DD."},"to":{"type":"string","description":"Latest date to include, as YYYY-MM-DD."},"category":{"type":"string","description":"Restrict to one category name."},"min_amount":{"type":"number","description":"Smallest amount to include."},"max_amount":{"type":"number","description":"Largest amount to include."},"limit":{"type":"number","description":"How many matching rows to preview. Defaults to 10, capped at 25. Ignored while privacy mode is on."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"monthly_trend","kind":"answer","impl":"imperative","description":"Total the loaded spending per calendar month, oldest first, so month-on-month changes are visible. Answers questions a single glance at the table cannot. Returns aggregates only, so it answers the same whether or not privacy mode is on.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"find_anomalies","kind":"answer","impl":"imperative","description":"Find rows that are unusually large compared with the rest of their own category, using a z-score within each category. Categories with fewer than three rows are skipped. Highlights every outlier in the table. While the human has privacy mode on, only the count and the affected category names come back; with it off, the strongest outliers are listed with their amounts and z-scores.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"threshold":{"type":"number","description":"How many standard deviations above the category mean counts as unusual. Defaults to 2.5; raise it to be stricter, or lower it to surface milder variation."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"top_expenses","kind":"act","impl":"imperative","description":"Find the largest individual rows by amount and highlight them in the table. While the human has privacy mode on, only how many were found and their combined total come back; with it off, the rows themselves are listed.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"How many rows to consider. Defaults to 5, capped at 25."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"},{"name":"clear_highlights","kind":"act","impl":"imperative","description":"Remove any highlighting from the table so every row is legible again. Call this when moving on to an unrelated question.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute"}],"category":"Productivity & Business","favicon":"/favicons/airlock-app.netlify.app.svg","apiSurface":"spec","toolCount":7}}