Files
Stefan Broenner 0bb29be3be feat: DAX formula locale handling for European locales (#282)
* Fix #279: Power Query lifecycle cleanup for Data Model connections

BREAKING CHANGES:
- Unload now removes Data Model connections (not just worksheet tables)
- Delete now removes Data Model connections (prevents orphan connections)

IMPROVEMENTS:
- List correctly reports IsConnectionOnly for Data Model-only queries
- Update uses connection.Refresh() fallback for Data Model-only queries
  (no worksheet table to refresh)

NEW TESTS:
- PowerQueryCommandsTests.LifecycleCleanup.cs: 8 tests for Issue #279
- PowerQueryCommandsTests.UpdateErrors.cs: 3 tests for error handling
- DataModelComApiBehaviorTests.cs: 11 diagnostic scenarios
- PowerQueryComApiBehaviorTests.cs: 15 diagnostic scenarios

DOCUMENTATION:
- docs/COM-API-BEHAVIOR-FINDINGS.md: Empirical COM API behavior findings
- excel_powerquery.md: Updated prompt docs for Data Model cleanup

DELETED:
- PowerQueryCommandsTests.ErrorQueries.cs: Referenced non-existent local file

All 53 PowerQuery and DataModel tests pass.

* fix: Use locale-aware format translation instead of global Excel settings

- Renamed DateFormatTranslator to NumberFormatTranslator
- Extended translator to handle decimal/thousands separators (. and ,)
- Removed global UseSystemSeparators/DecimalSeparator/ThousandsSeparator
  settings from ExcelSession and ExcelBatch (these modified Excel app defaults)
- Added IsEnglishNumberLocale property to detect US-style number separators
- Format codes are now translated at point of use, not by changing app defaults
- Updated all references from DateFormatter to FormatTranslator
- Removed unused WithUSFormatSeparators helper from RangeCommands

This approach translates US format codes (like $#,##0.00) to locale-specific
codes (like $#.##0,00 on German Excel) without modifying Excel's global settings.
Previous approach of changing Application.DecimalSeparator affected all
workbooks in the Excel instance, which is not desirable.

* feat: DAX formula locale handling for European locales (#281)

- Add DaxFormulaTranslator to convert US comma separators to semicolons on European locales
- Integrate translator in CreateMeasure and UpdateMeasure operations
- Power Pivot uses system culture (CultureInfo.CurrentCulture), not Excel International settings
- Preserve commas inside string literals and column references
- Add 5 integration tests for DAX locale translation
2025-12-05 13:55:49 +00:00

92 lines
2.2 KiB
JSON

{
"name": "excel-mcp",
"displayName": "Excel MCP Server",
"description": "Excel automation for AI assistants - manage Sheets, Power Query, DAX, VBA, PowerPivot, Tables, Ranges, Charts, Formatting, Validation & more - requires Excel to be installed",
"version": "1.1.3",
"publisher": "sbroenne",
"icon": "icon.png",
"repository": {
"type": "git",
"url": "https://github.com/sbroenne/mcp-server-excel"
},
"bugs": {
"url": "https://github.com/sbroenne/mcp-server-excel/issues"
},
"homepage": "https://excelmcpserver.dev/",
"license": "MIT",
"engines": {
"vscode": "^1.106.0"
},
"os": [
"win32"
],
"categories": [
"AI",
"Chat",
"Data Science"
],
"keywords": [
"mcp",
"model context protocol",
"excel",
"microsoft",
"office",
"spreadsheet",
"automation",
"power query",
"m language",
"dax",
"data model",
"power pivot",
"vba",
"macro",
"table",
"copilot",
"ai",
"github copilot",
"data analysis"
],
"activationEvents": [
"onStartupFinished"
],
"extensionDependencies": [
"ms-dotnettools.vscode-dotnet-runtime"
],
"main": "./out/extension.js",
"files": [
"out/**",
"bin/**",
"README.md",
"CHANGELOG.md",
"LICENSE",
"icon.png"
],
"contributes": {
"mcpServerDefinitionProviders": [
{
"id": "excel-mcp",
"label": "Excel MCP"
}
]
},
"scripts": {
"clean": "cd .. && dotnet clean src/ExcelMcp.McpServer/ExcelMcp.McpServer.csproj -c Release",
"build:mcp-server": "npm run clean && cd .. && dotnet publish src/ExcelMcp.McpServer/ExcelMcp.McpServer.csproj -c Release --no-self-contained -o vscode-extension/bin --verbosity minimal",
"vscode:prepublish": "npm run build:mcp-server && npm run compile",
"compile": "tsc -p ./",
"watch": "tsc -watch -p ./",
"package": "npm run build:mcp-server && vsce package",
"lint": "eslint src --ext ts"
},
"devDependencies": {
"@types/node": "^22.19.1",
"@types/vscode": "^1.106.1",
"@typescript-eslint/eslint-plugin": "^8.46.2",
"@typescript-eslint/parser": "^8.46.2",
"@vscode/vsce": "^3.7.1",
"eslint": "^9.39.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.48.0"
}
}