letin: Power Query (M) MCP server
Inspect, refactor, lint, run and version Power Query (M) in Excel workbooks and Power BI projects.
0 stars14 downloads/wk
Reviews
Write oneNobody has reviewed letin: Power Query (M) yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
letin: Power Query (M) tools (31, 4 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
apply_transformAdd a standard Power Query step without hand-writing M. `action` and `params` come from list_transforms, e.g. action='unpivot_other_columns', params={'keep_columns': ['Region']}; or action='group_by', params={'group_columns': ['Region'], 'aggregations': [{'name': 'Total', 'operation': 'sum', 'column': 'Amount'}]}. The step is appended to the end unless after_step names an earlier step (the next st
copy_queriesCopy queries between workbooks / projects / folders, bringing the queries they depend on along.
delete_querywrite actionDelete a query. Refuses when other queries reference it unless force=true.
dependency_graphQuery-to-query lineage. With `query`, only its upstream and downstream. format: 'json' or 'mermaid'. Also reports roots (read external data), leaves (final outputs), orphans and cyclic references.
diff_queriesCompare the queries of two sources (workbook vs workbook, workbook vs exported folder, PBIP vs PBIP ...). Line endings are ignored. To compare against a snapshot pass its `path` from list_snapshots.
evaluate_mwrite actionRun any M expression and get the result as data. Tables come back with column names, types and the first `rows` rows (cell errors shown as #ERROR); lists, records, scalars and functions (with signature) are described too; an M error comes back as reason + message. With `source`, the expression can reference that source's queries by name (e.g. Table.RowCount(Sales)), including unsaved edits of an o
evaluate_queryFreshly evaluate a query, or the query only up to `step`, and return columns, types and sample rows. Use it to get real column names before apply_transform, to see what a step does to the data, or to find the step where an error first appears (evaluate step by step).
evaluate_stepsEvaluate EVERY step of a query in one engine call and describe each one (columns, types, first `rows` rows, or the error). The fastest way to see how a query transforms its data and to find the step where an error first appears: one call instead of evaluate_query once per step.
export_querieswrite actionWrite every query to `folder` as one .pq file each plus pq-manifest.json: ready to commit to git and diff in a PR. Existing .pq files in the folder are replaced.
extract_parameterTurn a hard-coded text value (path, server, URL) into a Power Query parameter and reference it everywhere. With match_prefix, "C:\Data" also rewrites "C:\Data\sales.csv" to SourceFolder & "\sales.csv".
find_in_queriesSearch the M of every query. scope: all | code | strings | comments. Returns query, step and line for each hit.
format_mPretty-print M (an expression or a section document): one step per line, long calls broken at their arguments, comments kept. The output is verified token-for-token against the input, so meaning can never change.
format_queriesFormat one query, or every query, in place (same guarantees as format_m).
get_queryFull M code of one query plus its parsed steps, data sources, dependencies and dependents.
import_queriesLoad .pq files from `folder` back into `source`. mode='update' changes/adds queries; mode='sync' also deletes queries that are not in the folder.
lint_queriesAudit queries for folding breakers, hard-coded paths/servers, dead steps, brittle column lists, untyped columns, duplicated logic, orphans and cycles. Each finding carries a concrete suggestion. min_severity: info | warning | error.
list_data_sourcesInventory of every external source (files, folders, servers, URLs) each query reads, and whether it is hard-coded or parameterised.
list_queriesEvery query with its kind (query/function/parameter), step count, load destination, and what it depends on / is used by.
list_snapshotsSnapshots taken automatically before each write to this source, newest first.
list_sourcesList workbooks open in Excel and models open in Power BI Desktop (both usable as `source`), and explain the other source forms.
list_transformsCatalog of guided actions for apply_transform (unpivot, pivot, group_by, merge, filter, types, ...) with their params.
m_function_helpLook up the M standard library (generated from the real engine: 850+ members). Give an exact name ('Table.Group') for its signature and description, a namespace ('Table.' or 'List') to list its members, or words to search names and descriptions ('unpivot', 'split text delimiter'). Use it instead of guessing signatures.
preview_queryColumn names and first rows of a query that is loaded to a worksheet table (open Excel workbook only). Use it to get real column names before apply_transform.
refresh_queryRefresh one query in an open Excel workbook and wait for it; returns the mashup engine's error text if it fails.
remove_stepwrite actionDelete a step and rewire the steps that used it to the step it read from.
rename_queryRename a query and rewrite every reference to it in all other queries (token-aware: strings, comments and same-named columns are left alone).
rename_stepRename a step inside a query and every reference to it.
replace_in_queriesFind and replace across all (or the listed) queries in one go, e.g. repoint a server or folder. scope: 'strings' (only inside text literals; safest, the default), 'code' (outside strings and comments), 'all'.
restore_snapshotRoll back to a snapshot. With `queries`, only those are restored; otherwise the whole query set is put back (queries created since are deleted). 'latest' undoes the most recent write.
set_queryReplace a query's M (or create it with create_if_missing). Rejects unbalanced brackets/strings before writing. For standard actions prefer apply_transform; for renames prefer rename_query / rename_step.
validate_mCheck M before using it: syntax errors with line/column and a plain-English cause (missing comma between steps, unquoted step name, if without else ...), unknown steps/queries/functions with did-you-mean, and wrong argument counts for library functions. Pass `formula` (an expression or a whole section document); add `source` so its query names are known. Or pass `source` (+ optional `query`) alone
Public scan report
scanner v0.1.10 · 2026-11-01 · same rubric, same numbers if you re-run it
- Code scan27 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancerepository not readable: repo not found3/15
- Maintainer identityno repository or website to verify2/10
How letin: Power Query (M) compares
Against every graded MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 65/100
- higher than 20% of 48,273 servers
- Tools
- 31
- the typical server has 7
- Tools that change things
- 13%
- typical: 0%. Fewer write tools means less an agent can break
- Downloads a week
- 14
- more than 4% of 11,915 servers with a package
What its tools let an agent do: 19 read · 1 create · 5 change · 2 delete · 4 run or deploy
Install letin: Power Query (M) in Claude Code, Cursor or VS Code
claude mcp add letin -- uvx letin
What the publisher says
From the letin: Power Query (M) repository's README, as published. We do not edit it. Read it on GitHub
letin
<!-- mcp-name: io.github.S-CurveLabs/letin -->
An MCP server that gives an AI assistant (GitHub Copilot in VS Code, Claude, …) real tools for managing Power Query (M) queries, in Excel workbooks and in Power BI projects.
Copilot in Excel / Power BI can suggest M. It cannot see how your queries depend on each other, rename one without breaking the rest, repoint forty queries at a new server, tell you which step killed query folding, put your queries in git, run a query to see what a step really returns, or check the M it just wrote against the real function library. This server does those things.
What it does
Every write snapshots first, returns a unified diff, accepts dryrun=true, and is refused if it would turn valid M into a syntax error. All edits are token-aware**: a query called Sales is never confused with a column [Sales], the string "Sales", or a comment.
Sources
Every tool takes a source:
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Grade history
- 2026-11-01downgradeA → Cscore 65
letin: Power Query (M): common questions
- Is letin: Power Query (M) MCP server safe?
- With care: it is graded C, so read the findings first (65/100). Read the letin: Power Query (M) safety report
- How do I install letin: Power Query (M)?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does letin: Power Query (M) need an API key?
- No secret keys are declared. It reads 1 setting from the environment.
- Is letin: Power Query (M) maintained?
- The last commit was 41 days ago (2026-09-22). The latest release is v0.2.0.
- What can I use instead of letin: Power Query (M)?
- Servers from other publishers that do the same job: e2e MCP server.
- How does letin: Power Query (M) compare with other MCP servers?
- safety score 65/100 (higher than 20% of 48,273 servers); tools 31 (the typical server has 7); tools that change things 13% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.
Alternatives to letin: Power Query (M)
Same job from other publishers: the closest match first, then the best rated.
- e2eOpen live web and mobile app sessions from an e2e project to inspect the app and try locators.not reviewedWidely usedA