Clean and explore sensitive data by talking to it. Nothing ever leaves your browser.
Faraday WebMCP demonstrates strong tool design with 21 well-named, verb-prefixed tools (highlight_cells, focus_column, describe_table, etc.). All tools have descriptions (avg ~150 chars, within 10-1024 baseline). Input schemas are comprehensive with typed properties and enums. However, output schemas are not documented, LLMs cannot predict return structures. Error handling is minimal; tools return status objects but lack recovery guidance. Tool composition is excellent (single responsibility, proper chaining via column/row references). Security is strong (read-only annotations, no secrets in params). Main gaps: missing output schema documentation, sparse error messages, and no pagination guidance for preview_rows.
Leave a short note on a column in the user's view, which stays there while they work. Use it to record something worth remembering — what a column turned out to mean, or a decision you agreed on. Highlights come and go; notes persist. Changes no data.
Draw a chart of the data: bar chart for categories, histogram for numeric distributions, or scatter plot for two numeric columns.
Remove rows that repeat the same values in the columns you name, keeping one of each. Matching is exact, so trim_whitespace and normalize_values first if the copies are not written identically. The user is always shown what will be removed before anything happens.
Summarise the open file: row count, and every column with its inferred type, how many values are missing, and how many are distinct. Call this first to learn what columns exist before naming one in another tool.
Remove columns from the table. This is destructive and cannot be undone except by reloading the file.
Download the table as a file. The file is saved to the user's machine via a blob URL — nothing is uploaded.
Output schemas not documented. LLMs cannot predict return structures for describe_table, profile_column, preview_rows, find_issues, list_operations, or export_table. This forces agents to guess field names and types, increasing errors and wasting tokens on exploratory calls.
Error handling lacks recovery guidance. Tools return status objects (e.g., 'no_match', 'no_such_rows') but do not suggest next steps. Per pattern:recovery-guide, errors should tell LLMs what to do: 'No rows match those conditions. Try broadening the filter or check column names with describe_table()'.
preview_rows lacks pagination guidance. Description mentions 'limit' (default 5, max 25) but does not explain when to use offset or how to iterate through large tables. Per pattern:paginated-result, tools returning lists should document pagination strategy.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Fill missing values in a column. Without a value, uses the most common one; with a value, uses that everywhere; with a formula, computes it from other columns.
Scan the data for real problems: dates written several ways, duplicate identifiers, values outside a plausible range, end dates before start dates, mixed types, inconsistent formatting, and missing values. Returns findings worst-first, each naming the tool that would fix it. This only reads — call it before proposing any change, and highlight what it finds so the user can see.
Scroll the user's table to a column and pin it, so they are looking at the same one you are. Use it when you move the conversation to a different column. Changes no data.
Find out what the user is currently looking at: which column they have selected, any text they have filtered by, what you have marked or noted, and what has been changed so far. Call this when they say 'this column' or 'these rows' without naming them — it is how you find out what they mean.
Mark cells in the user's view so they can see exactly which ones you mean, with a short reason shown above the column. Call this whenever you describe specific rows — a finding the user cannot see is not much use. Select the rows either by listing row numbers or by giving conditions. Changes no data.
List every change made so far, in order, with a summary of each.
Collapse different spellings of the same value in a column, so 'NY', 'new york' and 'N.Y.' become one value. Without a mapping, variants are grouped by ignoring case and punctuation and the most common spelling in each group wins. Pass a mapping to choose the result yourself.
Show a few actual rows so you can see what the data looks like. Pass columns to narrow the output, which lets more rows fit in the response.
Describe one column in detail: its type, how many values are missing or distinct, the most common values, a few samples, and min/max/mean when it is numeric. For date columns it also reports which written date formats appear.
Mask or hash values in a column so they cannot be read. Masking keeps the last few characters visible; hashing replaces every value with a hash. The user is always shown what will change before anything happens.
Rename one or more columns.
Convert a whole column to one type, normalising every value. Use this on a date column written several ways to rewrite it all as ISO dates. When the column mixes day-first and month-first dates, ask the user which convention they meant and pass day_first, because that cannot be worked out from the data.
Split a column into two by a delimiter, so 'Last, First' becomes two columns. The new column is inserted after the original.
Remove leading and trailing whitespace from every value in a column.
Reverse one or more changes, putting the data back to an earlier state.
Destructive operations (deduplicate, drop_columns) lack confirmation step. Description states 'user is always shown what will be removed before anything happens' but this is a UI affordance, not a tool-level confirmation. Per pattern:confirmation-request, irreversible operations should support dry-run or explicit confirmation parameters.
fill tool has ambiguous parameter relationships. 'value' and 'formula' are mutually exclusive but this is not documented. Per pattern:tool-description, undocumented dependencies cause silent misuse. Add: 'Provide either value (fill with constant) or formula (compute from other columns), not both.'