Skip to content

Commit 6c8f364

Browse files
vosesoftclaude
andcommitted
v0.3.0-alpha.8: e2e integration test passes live; document launch-order caveat
The 7 integration tests in tests/integration/test_e2e_run_simulation.py all pass against a real Excel + ModelRisk XLL + MRService.dll round-trip on a developer machine (18.85s, including the actual Monte Carlo run). Empirical moments of Y = 2*N(0,1) match the analytic ones inside the documented tolerance bands. First validation that the v0.3 pipeline works end-to-end against the real stack. The test run surfaced one real operational caveat — now documented in the README's "Known caveats" section: Excel must be running interactively (Start menu / taskbar) before the MCP server tries to drive run_simulation. When Excel is launched programmatically by an automation client, ModelRisk's XLL skips part of its xlAutoOpen initialisation. XLL functions still register as worksheet UDFs (so VoseNormal(0,1) in a cell works), but XLL commands (VoseStartSimulCustom12 etc.) never get added to Excel's Application.Run table — and run_simulation depends on those commands. If run_simulation fails with "macro may not be available", restart Excel by hand and try again. This is a ModelRisk XLL behaviour, not a server bug, but the launch- order requirement is operationally important. The earlier ad-hoc test worked because Excel had been open interactively. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 71f96b5 commit 6c8f364

7 files changed

Lines changed: 19 additions & 6 deletions

File tree

CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@ All notable changes to ModelRisk MCP. Follows [Keep a Changelog](https://keepach
44

55
## [Unreleased]
66

7+
## [0.3.0-alpha.8] — 2026-05-21
8+
9+
End-to-end integration test passed live for the first time, surfacing one operational caveat now documented.
10+
11+
### Verified
12+
13+
- All 7 integration tests in `tests/integration/test_e2e_run_simulation.py` pass against a real Excel + ModelRisk XLL + MRService.dll round-trip (18.85s total). The empirical moments of `Y = 2 * N(0, 1)` over 1000 iterations match the analytic moments inside the documented tolerance bands. All v0.3 read-path tools (`list_vmrs_variables`, `get_samples`, `diagnose_workbook`) work end-to-end.
14+
15+
### Documented
16+
17+
- **Launch order caveat in the README's "Known caveats" section.** Excel must be running interactively (Start menu / taskbar) before the MCP server tries to drive `run_simulation`. When Excel is launched programmatically by an automation client, ModelRisk's XLL skips part of its `xlAutoOpen` initialisation — XLL functions still register as worksheet UDFs (so cell formulas work), but XLL commands (`VoseStartSimulCustom12` etc.) never get added to Excel's `Application.Run` table, and the simulation pipeline depends on those commands. This is a ModelRisk XLL behaviour, not a bug in this server, but the launch-order requirement is now explicit. The integration test discovered this; the earlier real-workbook test by hand worked because Excel had been open interactively.
18+
719
## [0.3.0-alpha.7] — 2026-05-21
820

921
Hotfix for the MCP Registry publish step that failed in 0.3.0-alpha.6.

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ More: [docs/architecture.md](docs/architecture.md), [docs/com-surface.md](docs/c
217217

218218
## Known caveats
219219

220+
- **Launch order: Excel first, MCP server second.** Excel must already be running interactively (started from the Start menu, taskbar, or by double-clicking an `.xlsx`) before the MCP server tries to drive `run_simulation`. When Excel is launched programmatically by an automation client, ModelRisk's XLL skips part of its `xlAutoOpen` initialisation — the XLL functions still register as worksheet UDFs, but the XLL commands (`VoseStartSimulCustom12` etc.) never get added to Excel's `Application.Run` table. The simulation pipeline depends on those commands. If `run_simulation` fails with "macro may not be available", restart Excel by hand and try again.
220221
- **OneDrive-hosted workbooks**: xlwings can fail to resolve the workbook's full path without `ONEDRIVE_COMMERCIAL_WIN` set. The bridge degrades gracefully — name-based operations still work, and `run_simulation` defaults the `.vmrs` save location to the user's Desktop when the workbook folder can't be resolved.
221222
- **Active simulation results**: `get_simulation_results` reads from the `.vmrs` file produced by the most recent `run_simulation` call, or the most recent sibling `.vmrs` next to the workbook. Use `set_active_vmrs(path)` or `read_vmrs(path)` to point at a specific file.
222223

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "modelrisk-mcp"
3-
version = "0.3.0a7"
3+
version = "0.3.0a8"
44
description = "Open MCP server bridging Anthropic Claude (and any MCP-compatible client) with the ModelRisk Excel add-in."
55
readme = "README.md"
66
requires-python = ">=3.11"

server.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
"name": "io.github.vosesoftware/modelrisk-mcp",
44
"title": "ModelRisk",
55
"description": "Read, build, fit, and run Monte Carlo risk models in Excel through Vose Software's ModelRisk.",
6-
"version": "0.3.0a7",
6+
"version": "0.3.0a8",
77
"packages": [
88
{
99
"registryType": "pypi",
1010
"identifier": "modelrisk-mcp",
11-
"version": "0.3.0a7",
11+
"version": "0.3.0a8",
1212
"transport": {
1313
"type": "stdio"
1414
}

src/modelrisk_mcp/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.3.0a7"
1+
__version__ = "0.3.0a8"

tests/unit/test_server_boot.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66

77
def test_version_is_set() -> None:
8-
assert __version__ == "0.3.0a7"
8+
assert __version__ == "0.3.0a8"
99

1010

1111
def test_server_name() -> None:

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)