Commit ef1c1d6
* fix(powerquery): refresh error propagation (#399)
BREAKING FIX: refresh action now properly throws on Power Query errors
ROOT CAUSE: Connection.Refresh() silently swallowed errors for worksheet
queries (InModel=false), returning success even when M code had errors.
FIX: Route worksheet queries through QueryTable.Refresh(false) which
properly throws exceptions. Data Model queries continue using
Connection.Refresh() which does throw errors correctly.
- Added RefreshQueryTableByName() helper for worksheet query refresh
- Updated Refresh() to detect query type and route accordingly
- 6 regression tests covering error propagation scenarios
Closes #399
* feat(powerquery): add Evaluate action for ad-hoc M code execution (#400)
New 'evaluate' action executes M code directly and returns tabular results
WITHOUT creating a permanent query in the workbook. Useful for:
- Testing M code before creating a permanent query
- One-off queries without polluting the workbook
- Ad-hoc data exploration and M code debugging
Implementation:
- Creates temp query + worksheet, refreshes, reads data, cleans up
- Errors propagate properly (invalid M code throws with error message)
- Returns PowerQueryEvaluateResult with columns, rows, counts
Changes:
- Added Evaluate to PowerQueryAction enum and ActionExtensions
- Added IPowerQueryCommands.Evaluate interface method
- Added PowerQueryCommands.Evaluate.cs implementation
- Added PowerQueryEvaluateResult type
- MCP Server: ExcelPowerQueryTool handler
- CLI: ExcelDaemon handler + PowerQueryCommand case
- 7 integration tests covering success/error scenarios
- Updated skills/prompts with evaluate guidance
- Updated operation counts: 210 → 211
Closes #400
* feat(powerquery): add mCodeFile parameter for M code from file
MCP Server excel_powerquery now accepts mCodeFile parameter as alternative to
inline mCode for create, update, and evaluate actions.
Same behavior as CLI --mcode-file option:
- If mCodeFile is provided, reads M code from file
- If both provided, mCodeFile takes precedence
- FileNotFoundException if file doesn't exist
Useful for large/complex queries stored in .m or .pq files.
* feat(vba): add vbaCodeFile parameter for VBA code from file
MCP Server excel_vba now accepts vbaCodeFile parameter as alternative to
inline vbaCode for import and update actions.
Same behavior as CLI --code-file option:
- If vbaCodeFile is provided, reads VBA code from file
- If both provided, vbaCodeFile takes precedence
- FileNotFoundException if file doesn't exist
Useful for large modules stored in .bas or .vba files.
* fix(table): auto-expand single cell range using CurrentRegion
* test(llm): add allowed_tools filter to MCP test for faster LLM execution
* docs: update CHANGELOG with mCodeFile, vbaCodeFile, and table CurrentRegion fix
* fix: use specific COMException instead of generic catch clause
Addresses CodeQL security finding - generic catch clause should specify
exception type. The catch handles expected COMException when ListObject
doesn't have a QueryTable.
---------
Co-authored-by: Stefan Broenner <[email protected]>
1 parent e09743f commit ef1c1d6
File tree
28 files changed
+1126
-34
lines changed- gh-pages
- mcpb
- src
- ExcelMcp.CLI
- Commands
- Daemon
- ExcelMcp.Core
- Commands
- PowerQuery
- Table
- Models
- Actions
- ExcelMcp.McpServer
- Prompts/Content
- Tools
- tests
- ExcelMcp.Core.Tests/Integration/Commands/PowerQuery
- ExcelMcp.McpServer.LLM.Tests/Scenarios
- vscode-extension
28 files changed
+1126
-34
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
13 | 45 | | |
14 | 46 | | |
15 | 47 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
| 18 | + | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| 32 | + | |
32 | 33 | | |
33 | 34 | | |
34 | 35 | | |
| |||
390 | 391 | | |
391 | 392 | | |
392 | 393 | | |
393 | | - | |
| 394 | + | |
394 | 395 | | |
395 | 396 | | |
396 | 397 | | |
| |||
402 | 403 | | |
403 | 404 | | |
404 | 405 | | |
405 | | - | |
| 406 | + | |
406 | 407 | | |
407 | 408 | | |
408 | 409 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| |||
81 | 81 | | |
82 | 82 | | |
83 | 83 | | |
84 | | - | |
| 84 | + | |
85 | 85 | | |
86 | 86 | | |
87 | 87 | | |
| |||
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
100 | | - | |
| 100 | + | |
101 | 101 | | |
102 | 102 | | |
103 | 103 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | | - | |
| 20 | + | |
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
102 | 102 | | |
103 | 103 | | |
104 | 104 | | |
105 | | - | |
| 105 | + | |
106 | 106 | | |
107 | 107 | | |
108 | 108 | | |
| |||
182 | 182 | | |
183 | 183 | | |
184 | 184 | | |
185 | | - | |
| 185 | + | |
186 | 186 | | |
187 | 187 | | |
188 | 188 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
28 | 28 | | |
29 | 29 | | |
30 | 30 | | |
| 31 | + | |
31 | 32 | | |
32 | 33 | | |
33 | 34 | | |
| |||
49 | 50 | | |
50 | 51 | | |
51 | 52 | | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
52 | 69 | | |
53 | 70 | | |
54 | 71 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
50 | 50 | | |
51 | 51 | | |
52 | 52 | | |
| 53 | + | |
53 | 54 | | |
54 | 55 | | |
55 | 56 | | |
| |||
92 | 93 | | |
93 | 94 | | |
94 | 95 | | |
95 | | - | |
| 96 | + | |
96 | 97 | | |
97 | 98 | | |
98 | 99 | | |
| |||
0 commit comments