letin
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LETIN_HOME | No | Override the root directory where snapshots are stored. By default, snapshots live in %LOCALAPPDATA%\letin\snapshots\<workbook>-<hash>\ (last 50 per source). | %LOCALAPPDATA%\letin\snapshots |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_sourcesA | List workbooks open in Excel and models open in Power BI Desktop (both usable as |
| list_queriesC | Every query with its kind (query/function/parameter), step count, load destination, and what it depends on / is used by. |
| get_queryB | Full M code of one query plus its parsed steps, data sources, dependencies and dependents. |
| dependency_graphA | Query-to-query lineage. With |
| list_data_sourcesB | Inventory of every external source (files, folders, servers, URLs) each query reads, and whether it is hard-coded or parameterised. |
| find_in_queriesB | Search the M of every query. scope: all | code | strings | comments. Returns query, step and line for each hit. |
| lint_queriesA | Audit 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. |
| set_queryA | Replace 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. |
| delete_queryB | Delete a query. Refuses when other queries reference it unless force=true. |
| rename_queryA | Rename a query and rewrite every reference to it in all other queries (token-aware: strings, comments and same-named columns are left alone). |
| rename_stepB | Rename a step inside a query and every reference to it. |
| remove_stepA | Delete a step and rewire the steps that used it to the step it read from. |
| replace_in_queriesA | Find 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'. |
| extract_parameterB | Turn 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". |
| list_transformsA | Catalog of guided actions for apply_transform (unpivot, pivot, group_by, merge, filter, types, ...) with their params. |
| apply_transformB | Add a standard Power Query step without hand-writing M. |
| copy_queriesB | Copy queries between workbooks / projects / folders, bringing the queries they depend on along. |
| export_queriesB | Write every query to |
| import_queriesA | Load .pq files from |
| diff_queriesA | Compare 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 |
| list_snapshotsB | Snapshots taken automatically before each write to this source, newest first. |
| restore_snapshotA | Roll back to a snapshot. With |
| validate_mA | Check 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 |
| format_mA | Pretty-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_queriesA | Format one query, or every query, in place (same guarantees as format_m). |
| m_function_helpA | Look 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. |
| evaluate_mA | Run any M expression and get the result as data. Tables come back with column names, types and the first |
| evaluate_queryA | Freshly evaluate a query, or the query only up to |
| evaluate_stepsA | Evaluate EVERY step of a query in one engine call and describe each one (columns, types, first |
| refresh_queryA | Refresh one query in an open Excel workbook and wait for it; returns the mashup engine's error text if it fails. |
| preview_queryB | Column 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 31 tools
Most tools are clearly distinct (apply_transform vs evaluate_m vs format_m serve different purposes), but a few could be confused: evaluate_query and evaluate_steps overlap in intent, and list_data_sources vs list_sources are similar in name and both deal with sources. Overall, descriptions help clarify, but a couple of pairs require careful reading.
All tool names follow a consistent verb_noun pattern, using snake_case throughout. Verbs like list, get, create, delete, update, rename, remove, validate, format, evaluate, import, export, copy, diff, refresh, preview, replace are all used in a predictable way, making the naming highly consistent and easy to learn.
With 27 tools, the server exceeds the typical well-scoped range of 3-15 tools. The breadth of functionality is impressive, but the high count may overwhelm agents, especially when several tools overlap in purpose (e.g., evaluate_query vs evaluate_steps). The count feels heavy for a single cohesive toolset, though each tool does serve a niche.
The toolset covers the full lifecycle of Power Query management: creating, reading, updating, deleting, renaming, formatting, validating, importing/exporting, diffing, snapshotting, searching, linting, and evaluating queries. It also includes comprehensive dependency analysis and source inventory, with no obvious dead ends for common workflows.