Releases: idfkit/idfkit-mcp
v0.9.0
Highlights
- Extensible objects (e.g.
BuildingSurface:Detailed,Schedule:Compact) are now first-class indescribe_object_type— a dedicatedextensible_groupblock names the wrapper key, lists item fields, and includes a worked example. Heterogeneous fields (e.g.Schedule:Compact's number-or-stringfield) are reported correctly via union types like"number|string". - Deprecation warnings emitted by idfkit are now surfaced on
add_object/update_object/batch_add_objectsresponses under awarningskey, so agents using deprecated forms (flat extensible kwargs likevertex_x_coordinate_2) see the signal and can self-correct. - Peak-load facility totals now correctly account for zone multipliers.
- MCP session resolution is identity-based and no longer breaks when
Mcp-Session-Idrotates.
Dependency bumps
idfkit0.8.0 → 0.10.3
Pull requests
- #58 — fix: account for zone multipliers in peak-load facility totals
- #61 — Support extensible groups in object descriptions
- #62 — Refactor extensible access and richer extensible-group examples
- #63 — chore: bump idfkit to 0.10.2 and surface deprecation warnings on tool responses
- #64 — chore: bump idfkit to 0.10.3 and add flat-kwargs deprecation regression tests
v0.8.1
Full Changelog: v0.8.0...v0.8.1
v0.8.0
What's Changed
- feat: add include_all_fields option to list_objects by @samuelduchesne in #56
Full Changelog: v0.7.0...v0.8.0
v0.7.0
What's New
New Tools
- `migrate_model` (#55) — forward-migrates the loaded model across EnergyPlus versions via `idfkit.async_migrate` (which drives the `IDFVersionUpdater` transition binaries). Replaces the in-memory document on success; call `save_model(path=...)` to persist. `target_version` is optional — explicit `"X.Y.Z"` wins; when omitted, the tool uses the installed EnergyPlus version reported by `find_energyplus()`. Requires a local EnergyPlus install (the transition binaries ship with it).
New Resources
- `idfkit://migration/report` (#55) — the latest migration report with per-step stdout/stderr (tail-truncated to 4 KB), structural schema diff across bundled versions, and version summary. Read after every `migrate_model` call for the full QA picture.
Improvements
- `load_model` accepts uploads from FastMCP's `FileUpload` provider (#54) — remote connectors (Claude.ai, ChatGPT, Cursor) can drag-and-drop IDF/epJSON files directly in chat instead of needing a shared filesystem. The new `upload_name` parameter is mutually exclusive with the existing `file_path`; stdio/local clients are unaffected.
- Custom `IdfUploadStore` keeps `read_file` off the LLM tool surface so `.epJSON` uploads don't round-trip their full content through the model (which would burn hundreds of thousands of tokens per upload). Bytes flow through a server-only `get_bytes()` accessor that materialises to a per-session cache dir; the LLM only sees the upload filename and the bounded `ModelSummary` returned by `load_model`.
- Health check endpoint (and matching Dockerfile healthcheck) for production deployments; the Dockerfile-level HEALTHCHECK was subsequently removed in favour of ECS Express's native check.
- Dockerfile restructured for cleaner user-permission handling.
- Agent instructions updated to surface the new `load_model → migrate_model → validate_model → save_model` flow.
Bug Fixes
- HTML and viewport now enforce a minimum height so the model/schedule/peak-loads viewers don't collapse inside narrow iframes.
Dependencies
- Bumped `idfkit` from 0.7.1 to 0.8.0 — picks up EnergyPlus 26.1.0 schema support (17 versions now covered, 8.9.0 through 26.1.0) and the new `idfkit migrate` CLI that backs the `migrate_model` tool.
Full Changelog: v0.6.0...v0.7.0
v0.6.0
What's New
New Tools
check_model_integrity— domain QA: orphan objects, missing controls, boundary mismatches (#41)get_zone_properties— typed summary of zone geometry, surfaces, constructions, and HVAC (#42)get_change_log— session mutation history (#40)query_simulation_tableandlist_simulation_reports— query any EnergyPlus output table (#43)analyze_peak_loads— peak heating/cooling load decomposition with QA flags (#46)
Interactive Viewers (MCP Apps)
- 3D geometry viewer — interactive WebGL model visualization (#34)
- Schedule heatmap viewer — visual schedule inspection (#35)
- Simulation report viewer — interactive HTML report browser (#53)
Improvements
- Simulation QA diagnostics: unmet hours, end-use breakdown, classified warnings, actionable flags (#44)
- Peak load QA/QC and simulation pre-flight checks (#46)
- Hardened MCP tools against adversarial inputs (#39)
- MCP resources for model summary, objects, references, and simulation results (#26, #30)
- Migration to FastMCP v3 with middleware execution (#21)
- Session persistence across server restarts (#14)
- Per-session state isolation and tool call logging (#17)
- Optimized docs search with pre-computed index (#31)
Bug Fixes
- Fixed resource reads missing session context over streamable-http
- Fixed SQL thread affinity errors with fresh handle per query (#37)
- Fixed resource template MIME type defaulting to text/plain (#32)
Full Changelog: v0.5.1...v0.6.0
v0.5.1
Patch release to fix the v0.5.0 PyPI publish (lock file was out of sync).
See v0.5.0 release notes for the full changelog.
v0.5.0
Breaking Changes
Read tools migrated to MCP resources (#30)
Five read-only tools have been replaced by MCP resource URIs, reducing the tool surface:
| Removed Tool | Replacement Resource |
|---|---|
get_model_summary() |
idfkit://model/summary |
get_object() |
idfkit://model/objects/{type}/{name} |
get_references() |
idfkit://model/references/{name} |
lookup_documentation() |
idfkit://docs/{object_type} |
get_results_summary() |
idfkit://simulation/results |
The check_references() tool has also been removed — its functionality is integrated into validation.
Migration: Use MCP resource reads (resources/read) instead of tool calls for these endpoints.
Improvements
Optimized docs search with pre-computed index (#31)
search_docs and get_doc_section now use a pre-computed tokenized index per EnergyPlus version, avoiding redundant re-tokenization and HTML stripping on every call.
Performance & token efficiency (#30)
- LRU cache for expensive schema introspection in
describe_object_type - Optimized
_find_object_by_name()to use collection index lookups before fallback scan - Field notes omitted from serialized descriptions to reduce token overhead
- Doc URLs removed from validation error output
Internal
v0.4.0
Breaking Changes
Migrate to FastMCP v3 with middleware (#21)
The server now uses fastmcp>=3.1.0 as the MCP framework instead of the older mcp.server.fastmcp. The safe_tool decorator has been replaced by a centralized ToolExecutionMiddleware that handles session binding, error normalization, and logging for all tools. The public create_server() function has been removed — import mcp directly from idfkit_mcp.server instead.
Migration: If you were importing create_server, replace with:
from idfkit_mcp.server import mcpReduced default limits for token efficiency (#25)
Several tools now return fewer results by default to reduce token overhead:
| Tool | Old default | New default |
|---|---|---|
search_schema |
limit=50 | limit=10 |
search_weather_stations |
limit=10 | limit=5 |
search_docs |
max limit=20 | max limit=10 |
search_docs text truncation |
500 chars | 250 chars |
search_schema memo truncation |
200 chars | 100 chars |
Migration: Pass explicit limit values if you need more results than the new defaults.
Tool parameter descriptions moved to schema (#25)
All tool parameters now use Annotated[type, Field(description=...)] instead of docstring Args: blocks. Tool docstrings are shortened to one-line summaries. This produces richer inputSchema in the MCP tools/list response but changes the shape of tool descriptions seen by clients.
New Features
MCP Resources (#26)
Four read-only MCP resources let clients subscribe to model state without tool calls:
| URI | Description |
|---|---|
idfkit://model/summary |
Current model summary |
idfkit://schema/{object_type} |
Full field schema for an object type |
idfkit://model/objects/{object_type}/{name} |
All field values for a specific object |
idfkit://simulation/results |
Latest simulation results summary |
Response size capping (#20)
Tool responses are now capped to prevent client OOM on large models:
- Validation errors/warnings truncated to 50 each (with
errors_truncated/warnings_truncatedflags) check_referencesincludes areturnedcount vs totaldangling_countget_doc_sectionrespectsmax_lengthparameter (default 8000)
Tool registration via decorators (#24)
Tools are now registered with @mcp.tool() decorators instead of explicit register() calls, eliminating boilerplate.
Fixes
- Fix
ctx: Contextparameter leaking into MCP tool schemas (#19) - Fix MCP output discovery and object serialization for
get_object(field order preserved)
Internal
v0.3.0
What's New
Comprehensive logging with configurable verbosity (#18)
--log-levelCLI flag andIDFKIT_MCP_LOG_LEVELenv var — choose betweenDEBUG,INFO,WARNING,ERROR(default:INFO)- idfkit core library logs captured — parser, schema, validation, and geometry logs from the underlying
idfkitlibrary now flow through the server's log output - Per-tool logging — all 7 tool modules (schema, read, write, validation, simulation, weather, docs) emit contextual log messages:
DEBUG: search queries, parameters, resolved paths, result countsINFO: model loads/saves, object mutations, simulation start/completion, weather downloads, validation summariesWARNING: batch add failures, file overwrites, dangling references, empty model validation, simulation failures
- Cleaner default output — CALL/OK per-tool traces demoted from INFO to DEBUG, so the default log stream focuses on significant operations
- Documentation updated — new "Log Verbosity" section in installation docs, "Enable Debug Logging" added to troubleshooting guide
v0.2.0
What's New
Singleton object support
get_object,update_object,remove_object, andduplicate_objectnow correctly handle EnergyPlus singleton types (SimulationControl, GlobalGeometryRules, etc.)- New
resolve_object()helper centralizes object lookup with singleton fallback
Per-session state isolation
- Each
streamable-httpconnection gets its own isolatedServerState, preventing cross-session contamination when multiple clients connect concurrently - LRU eviction at 20 sessions;
stdiotransport behaves as before (single session)
Tool call logging
- Every tool invocation now logs: tool name, session ID, wall-clock timing (ms), and truncated I/O payloads
- Format:
CALL search_schema | session=abc123 | {"query": "Zone"}
Dependencies
- Bumped idfkit minimum to 0.6.2