Skip to main content
Glama

IDS MCP Server

CLAUDE.md26.4 kB
# IDS MCP Server - AI Agent Guide **For:** Claude, GPT, and other AI agents working on this project **Last Updated:** 2025-11-02 **Project Status:** ✅ Implementation Complete - Fully Functional with Early Validation --- ## Quick Start This project is an **MCP (Model Context Protocol) server** that enables AI agents to create buildingSMART **IDS (Information Delivery Specification)** files that are 100% compliant with the IDS 1.0 standard. **What you need to know:** - ✅ **Design complete** - Full specification documented - ✅ **PRDs complete** - 9 implementation phases planned - ✅ **Implementation complete** - Following TDD methodology with early validation - 🎯 **Goal:** 100% IDS 1.0 XSD compliance using IfcTester library ✅ ACHIEVED --- ## Project Overview ### What is IDS? Information Delivery Specification (IDS) is a buildingSMART standard for: - Defining what information is required in BIM models - Automatically checking IFC models for compliance - Standardizing requirements across different BIM software tools ### What Does This Server Do? This MCP server provides AI agents with tools to: 1. **Create** IDS documents programmatically 2. **Load** existing IDS files 3. **Add specifications** with applicability and requirements 4. **Add facets** (Entity, Property, Attribute, Classification, Material, PartOf) 5. **Add restrictions** (enumeration, pattern, bounds, length) 6. **Validate** IDS documents and IFC models 7. **Export** to standards-compliant XML 8. **Early validation** - Catch IDS 1.0 constraint violations before XML generation --- ## Essential Reading (In Order) ### 1. Project Constitution 📜 **File:** [`constitution.md`](./constitution.md) **Read this FIRST.** Contains the 6 non-negotiable principles: 1. 100% IDS Schema Compliance 2. Test-Driven Development (95%+ coverage) 3. IfcTester Integration First 4. Deterministic Generation 5. FastMCP Context-Based Session Management 6. Python Best Practices **Key Takeaway:** Every decision must align with these principles. --- ### 2. Design Specification 📐 **File:** [`DESIGN_SPECIFICATION.md`](./DESIGN_SPECIFICATION.md) **Complete technical specification** covering: - IDS 1.0 standard deep dive (all 6 facet types) - FastMCP framework architecture - IfcTester integration strategy - MCP tool design (all 15+ tools) - Data models and session management - Validation and error handling - **Test-Driven Development methodology** (Section 10) **Sections:** 1. Executive Summary 2. System Overview 3. IDS Standard Deep Dive 4. FastMCP Framework Architecture 5. System Architecture 6. MCP Tool Design (15+ tools) 7. Data Models 8. Validation and Compliance 9. Error Handling Strategy 10. **Testing Strategy** - TDD with IfcTester validation 11. Deployment Considerations 12. Future Enhancements **Key Takeaway:** Comprehensive guide to what we're building and how. --- ### 3. Product Requirements Documents (PRDs) 📋 **Location:** [`specs/`](./specs/) **9 implementation phases** breaking down the design into executable work: #### Phase 001: Project Setup & Infrastructure **File:** [`specs/001-project-setup/plan.md`](./specs/001-project-setup/plan.md) - Python project structure (`src/` layout) - Dependencies: fastmcp, ifctester, pytest - Configuration management - Entry points and server initialization - **Start here** for implementation #### Phase 002: Session Management with FastMCP Context **File:** [`specs/002-session-management/plan.md`](./specs/002-session-management/plan.md) - Automatic session ID via `Context.session_id` - In-memory session storage - Background cleanup tasks - Thread-safe session access #### Phase 003: Document Management Tools **File:** [`specs/003-document-management/plan.md`](./specs/003-document-management/plan.md) **4 core tools:** - `create_ids` - Create new IDS document - `load_ids` - Load from file or XML string - `export_ids` - Export to XML with XSD validation - `get_ids_info` - Introspection tool #### Phase 004: Specification Management **File:** [`specs/004-specification-management/plan.md`](./specs/004-specification-management/plan.md) **1 tool:** - `add_specification` - Add specification to IDS document - IFC version validation (IFC2X3, IFC4, IFC4X3) - Cardinality support (minOccurs, maxOccurs) #### Phase 005: Basic Facets **File:** [`specs/005-basic-facets/plan.md`](./specs/005-basic-facets/plan.md) **3 tools:** - `add_entity_facet` - IFC entity types (e.g., IFCWALL) - `add_property_facet` - Property sets and properties - `add_attribute_facet` - IFC attributes (Name, Description, etc.) #### Phase 006: Advanced Facets **File:** [`specs/006-advanced-facets/plan.md`](./specs/006-advanced-facets/plan.md) **3 tools:** - `add_classification_facet` - Classification systems (Uniclass, OmniClass) - `add_material_facet` - Material specifications - `add_partof_facet` - Spatial relationships (containment, aggregation) #### Phase 007: Restriction Management **File:** [`specs/007-restrictions/plan.md`](./specs/007-restrictions/plan.md) **4 tools:** - `add_enumeration_restriction` - Allowed value lists - `add_pattern_restriction` - Regex patterns - `add_bounds_restriction` - Numeric ranges - `add_length_restriction` - String length constraints #### Phase 008: Validation Tools **File:** [`specs/008-validation/plan.md`](./specs/008-validation/plan.md) **2 tools:** - `validate_ids` - IDS document validation - `validate_ifc_model` - IFC model validation (bonus feature) #### Phase 009: Testing Framework & TDD Infrastructure **File:** [`specs/009-testing-framework/plan.md`](./specs/009-testing-framework/plan.md) - Pytest configuration and fixtures - TDD workflow (Red-Green-Refactor) - Pre-commit hooks - CI/CD pipeline - 95%+ coverage requirements --- ## Architecture Quick Reference ### Technology Stack ``` ┌─────────────────────────────────────────────────┐ │ AI Agent (Claude, GPT, etc.) │ └────────────────────┬────────────────────────────┘ │ MCP Protocol ┌────────────────────▼────────────────────────────┐ │ FastMCP Server │ │ ┌─────────────────────────────────────────┐ │ │ │ MCP Tools Layer │ │ │ │ • create_ids() • add_specification()│ │ │ │ • add_*_facet() • add_*_restriction()│ │ │ │ • validate_ids() • export_ids() │ │ │ └──────────────────┬──────────────────────┘ │ │ │ │ │ ┌─────────────────▼──────────────────────┐ │ │ │ Business Logic Layer │ │ │ │ • SessionManager • ValidationService │ │ │ │ • FacetFactory • RestrictionFactory│ │ │ │ • EarlyValidators (IDS constraints) │ │ │ └──────────────────┬──────────────────────┘ │ │ │ │ │ ┌─────────────────▼──────────────────────┐ │ │ │ IfcTester Integration Layer │ │ │ │ • ids.Ids() • ids.Specification()│ │ │ │ • ids.Entity() • ids.Property() │ │ │ │ • ids.Restriction() • to_xml() │ │ │ └─────────────────────────────────────────┘ │ └─────────────────────────────────────────────────┘ │ ▼ IDS XML File (100% XSD compliant) ``` ### Key Dependencies ```toml [dependencies] fastmcp = ">=0.4.0" # MCP server framework ifctester = ">=0.0.1" # IDS authoring & validation pydantic = ">=2.0.0" # Data validation [dev-dependencies] pytest = ">=7.0.0" # Testing framework pytest-asyncio = ">=0.21.0" # Async test support pytest-cov = ">=4.0.0" # Coverage reporting black = ">=23.0.0" # Code formatting ruff = ">=0.1.0" # Linting ``` --- ## Development Workflow ### 1. TDD Methodology (MANDATORY) All features MUST follow **Red-Green-Refactor** cycle: ``` ┌─────────────────────────────────────────────────┐ │ RED: Write a failing test │ │ ├─ Define expected behavior │ │ ├─ Write test that exercises functionality │ │ └─ Run test: MUST FAIL │ ├─────────────────────────────────────────────────┤ │ GREEN: Make the test pass │ │ ├─ Write minimal implementation │ │ ├─ Run test: MUST PASS │ │ └─ No optimization yet │ ├─────────────────────────────────────────────────┤ │ REFACTOR: Improve code quality │ │ ├─ Clean up implementation │ │ ├─ Remove duplication │ │ └─ All tests still pass │ └─────────────────────────────────────────────────┘ ``` ### 2. Three-Level Validation Every test MUST validate at 3 levels: ```python # Level 1: MCP Tool Input → IfcTester Object result = await client.call_tool("add_property_facet", {...}) # Level 2: Validate IfcTester Object Structure ids_obj = session.ids_obj assert isinstance(ids_obj.specifications[0], ids.Specification) # Level 3: Validate Generated XML xml = ids_obj.to_string() validated = ids.from_string(xml, validate=True) # XSD validation assert validated is not None ``` ### 3. Session Management Pattern All tools use FastMCP Context for automatic session handling: ```python @mcp.tool async def create_ids( title: str, ctx: Context, # Auto-injected by FastMCP author: str = None ) -> dict: """Create IDS document.""" # Get session automatically session_id = ctx.session_id # No manual ID needed! # Log with context await ctx.info(f"Creating IDS: {title}") # Create using IfcTester ids_obj = ids.Ids(title=title, author=author) # Store in session _session_storage[session_id] = ids_obj return {"status": "created", "title": title} ``` --- ## File Structure ``` ifc-ids-mcp/ ├── constitution.md # ← Project principles (READ FIRST) ├── DESIGN_SPECIFICATION.md # ← Complete technical spec ├── CLAUDE.md # ← This file ├── README.md # User-facing documentation ├── .gitignore ├── .coveragerc # ← Coverage configuration ├── .mcp.json # ← MCP server config for Claude Code │ ├── specs/ # ← Product Requirements Documents │ ├── 001-project-setup/ │ │ └── plan.md │ ├── 002-session-management/ │ │ └── plan.md │ ├── 003-document-management/ │ │ └── plan.md │ ├── 004-specification-management/ │ │ └── plan.md │ ├── 005-basic-facets/ │ │ └── plan.md │ ├── 006-advanced-facets/ │ │ └── plan.md │ ├── 007-restrictions/ │ │ └── plan.md │ ├── 008-validation/ │ │ └── plan.md │ └── 009-testing-framework/ │ └── plan.md │ ├── src/ # ← Source code │ └── ids_mcp_server/ │ ├── __init__.py │ ├── __main__.py │ ├── server.py │ ├── config.py │ ├── version.py │ ├── session/ │ │ ├── __init__.py │ │ ├── manager.py │ │ ├── storage.py │ │ ├── cleanup.py │ │ └── models.py # Session data models │ └── tools/ │ ├── __init__.py │ ├── document.py │ ├── specification.py │ ├── facets.py │ ├── restrictions.py # Phase 007 │ ├── validation.py # Phase 008 │ └── validators.py # Early validation helpers │ ├── tests/ # ← Test suite (168 tests, 94% coverage) │ ├── conftest.py │ ├── unit/ │ │ ├── test_config.py │ │ ├── test_main.py │ │ ├── test_project_structure.py │ │ ├── session/ │ │ │ ├── test_manager.py │ │ │ ├── test_storage.py │ │ │ └── test_cleanup.py │ │ └── tools/ │ │ ├── test_document_tools.py │ │ ├── test_specification_tools.py │ │ ├── test_facet_tools.py │ │ ├── test_restriction_tools.py │ │ ├── test_validation_tools.py │ │ └── test_validators.py # Early validation tests │ ├── component/ │ │ ├── test_coverage_boosters.py │ │ ├── test_edge_cases.py │ │ └── test_error_handling.py │ ├── integration/ │ │ ├── test_complete_workflows.py │ │ └── test_restriction_workflows.py │ └── validation/ │ ├── test_xsd_compliance.py │ └── fixtures/ │ ├── valid_ids_files/ │ │ └── simple_wall_requirement.ids │ ├── invalid_ids_files/ │ │ ├── missing_title.ids │ │ └── no_applicability.ids │ └── sample_ifc_files/ │ ├── samples/ # ← Sample IDS/IFC files for testing │ ├── wall_fire_rating.ids │ └── walls-fire-rating.ifc │ ├── pyproject.toml # ← Python project config ├── pytest.ini # ← Pytest configuration ├── requirements.txt # ← Dependencies └── requirements-dev.txt # ← Development dependencies ``` --- ## Common Tasks ### Starting Implementation 1. **Read constitution.md** - Understand non-negotiable principles 2. **Read DESIGN_SPECIFICATION.md** - Understand technical approach 3. **Start with 001-project-setup** - Create project structure 4. **Follow TDD** - Write tests first, always ### Adding a New Tool 1. **Write failing test** (RED phase) ```python @pytest.mark.asyncio async def test_new_tool(): result = await client.call_tool("new_tool", {...}) assert result["status"] == "success" # Validate with IfcTester ids_obj = get_session_ids() assert isinstance(ids_obj, ids.Ids) ``` 2. **Implement minimal code** (GREEN phase) ```python @mcp.tool async def new_tool(ctx: Context) -> dict: return {"status": "success"} ``` 3. **Refactor** if needed, keeping tests passing 4. **Validate** with IfcTester at all 3 levels ### Running Tests ```bash # All tests pytest tests/ -v # Specific category pytest tests/unit/ -v pytest tests/integration/ -v # With coverage pytest tests/ --cov=src/ids_mcp_server --cov-report=html # Must pass 95% coverage pytest tests/ --cov-fail-under=95 ``` --- ## Critical Reminders ### ✅ DO - Use IfcTester for ALL IDS operations - Write tests BEFORE implementation (TDD) - Use `ctx: Context` in all tools - Validate with `ids.from_string(xml, validate=True)` - Maintain 95%+ test coverage - Follow Python type hints - Use async/await for tools ### ❌ DON'T - ❌ Generate XML manually (use IfcTester) - ❌ Use manual `session_id` parameters (use Context) - ❌ Skip tests or write tests after implementation - ❌ Accept <95% coverage - ❌ Create non-deterministic outputs (timestamps, UUIDs) - ❌ Bypass IfcTester with custom XML parsing --- ## Reference Links ### IDS Standard - **Specification:** https://www.buildingsmart.org/standards/bsi-standards/information-delivery-specification-ids/ - **XSD Schema:** https://standards.buildingsmart.org/IDS/1.0/ids.xsd - **GitHub:** https://github.com/buildingSMART/IDS - **Documentation:** https://github.com/buildingSMART/IDS/tree/development/Documentation ### Libraries - **IfcTester Docs:** https://docs.ifcopenshell.org/ifctester.html - **IfcOpenShell:** https://ifcopenshell.org/ - **FastMCP:** https://github.com/jlowin/fastmcp - **FastMCP Docs:** https://gofastmcp.com/ ### Tools - **pytest:** https://docs.pytest.org/ - **Pydantic:** https://docs.pydantic.dev/ --- ## IDS 1.0 Schema Constraints & Workarounds ### Critical Limitation #1: One Entity Facet Per Applicability **Issue:** The IDS 1.0 XSD schema only allows **ONE entity facet** per specification's applicability section. **Impact:** You cannot group multiple IFC element types under a single specification like this: ```python # ❌ THIS WILL FAIL XSD VALIDATION add_specification(name="Structural Elements") add_entity_facet(spec_id="S1", location="applicability", entity_name="IFCFOOTING") add_entity_facet(spec_id="S1", location="applicability", entity_name="IFCCOLUMN") # INVALID! add_entity_facet(spec_id="S1", location="applicability", entity_name="IFCBEAM") # INVALID! ``` **Workaround:** Create **one specification per IFC element type**: ```python # ✅ CORRECT APPROACH add_specification(name="IFCFOOTING - Requirements") add_entity_facet(spec_id="S1", location="applicability", entity_name="IFCFOOTING") add_specification(name="IFCCOLUMN - Requirements") add_entity_facet(spec_id="S2", location="applicability", entity_name="IFCCOLUMN") add_specification(name="IFCBEAM - Requirements") add_entity_facet(spec_id="S3", location="applicability", entity_name="IFCBEAM") ``` **Result:** While this creates more specifications (~20-25 instead of 5-6), each specification is: - XSD compliant - Easier to debug (validation errors point to specific element types) - More maintainable - Clearer for BIM coordinators **Early Validation:** The `add_entity_facet` tool now validates this constraint **before** adding facets: ```python # ✅ First entity facet - succeeds await add_entity_facet(spec_id="S1", location="applicability", entity_name="IFCWALL", ctx=ctx) # ❌ Second entity facet - fails immediately with clear error await add_entity_facet(spec_id="S1", location="applicability", entity_name="IFCDOOR", ctx=ctx) # Returns ToolError: # "IDS 1.0 XSD constraint violation: Only ONE entity facet is allowed per # specification's applicability section. # # WORKAROUND: Create a separate specification for each entity type. # Example: # - Specification 1: Applicability = IFCWALL # - Specification 2: Applicability = IFCDOOR # # Current specification 'S1' already has an entity facet." ``` **Benefits:** - ✅ Errors caught immediately (not during XML export) - ✅ Clear, actionable error messages with workarounds - ✅ Prevents invalid IDS documents from being created - ✅ Guides AI agents toward correct structure --- ### Critical Limitation #2: Property Facets Require Property Set **Issue:** IfcTester's XSD validation requires the `property_set` parameter when adding property facets, even though it's technically optional in the IDS schema. **Impact:** Omitting `property_set` causes validation failure: ```python # ❌ THIS WILL FAIL VALIDATION add_property_facet( spec_id="S1", location="requirements", property_name="AssemblyCode", data_type="IFCLABEL" ) ``` **Error Message:** ``` Unexpected child with tag 'baseName' at position 1. Tag ('ids:propertySet' | 'ids:baseName') expected. ``` **Workaround:** Always specify `property_set` parameter: ```python # ✅ CORRECT APPROACH add_property_facet( spec_id="S1", location="requirements", property_name="AssemblyCode", property_set="Pset_Common", # ← REQUIRED for validation data_type="IFCLABEL" ) ``` **Recommendations:** - Use `Pset_Common` as a generic property set name for custom properties - Use IFC standard property sets when applicable (e.g., `Pset_WallCommon`, `Pset_DoorCommon`) - Document which property set contains custom properties in project documentation **Early Validation:** The `add_property_facet` tool now validates this requirement **before** adding facets: ```python # ❌ Missing property_set - fails immediately with clear error await add_property_facet( spec_id="S1", location="requirements", property_name="AssemblyCode", ctx=ctx ) # Returns ToolError: # "Property facet validation error: 'property_set' parameter is required. # # Property 'AssemblyCode' must belong to a property set for valid IDS export. # # COMMON PROPERTY SETS: # - Pset_WallCommon (for walls) # - Pset_DoorCommon (for doors) # - Pset_WindowCommon (for windows) # - Pset_SpaceCommon (for spaces) # ... # # CUSTOM PROPERTY SETS: # - Pset_Common (generic custom properties) # - Pset_CustomProperties (organization-specific) # # This requirement ensures valid XML export via IfcTester." # ✅ With property_set - succeeds await add_property_facet( spec_id="S1", location="requirements", property_name="AssemblyCode", property_set="Pset_Common", # ← Required ctx=ctx ) ``` **Benefits:** - ✅ Immediate feedback on missing required parameters - ✅ Error message includes list of common property sets - ✅ Prevents XSD validation failures at export time - ✅ Guides users toward correct IDS structure --- ### Implementation Notes These limitations were discovered during real-world IDS file generation. The MCP server successfully works around both limitations: 1. **Element-specific specifications** - Each of 22 IFC element types gets its own specification 2. **Explicit property sets** - All property facets specify `property_set="Pset_Common"` 3. **Early validation** - Input validation catches constraint violations **before** XML generation The server includes three validator functions in `src/ids_mcp_server/tools/validators.py`: - **`validate_single_entity_in_applicability()`** - Enforces single entity per applicability - **`validate_property_set_required()`** - Enforces property_set requirement - **`count_facets_by_type()`** - Helper utility for facet counting **Validation Strategy:** - Validators are called at the start of `add_entity_facet()` and `add_property_facet()` - Errors raised immediately as `ToolError` with actionable messages - Error messages include workarounds, examples, and common property set lists - 18 comprehensive unit tests ensure validator reliability (100% coverage) The resulting IDS files are **100% IDS 1.0 XSD compliant** and successfully validate using IfcTester's built-in validation. Early validation ensures errors are caught at tool invocation time with clear, actionable guidance for AI agents. --- ## Quick Q&A **Q: Where do I start implementing?** A: Start with `specs/001-project-setup/plan.md`. Follow the TDD phases. **Q: How do I create an IDS document?** A: Use IfcTester: `ids_obj = ids.Ids(title="My IDS")`. Never generate XML manually. **Q: How do I handle sessions?** A: Use `ctx: Context` in tools. Access `ctx.session_id` automatically. No manual session IDs. **Q: What test coverage is required?** A: Minimum 95% across all modules. Enforced via pytest-cov. **Q: How do I validate IDS compliance?** A: Use `ids.from_string(xml, validate=True)` in tests. This validates against XSD. **Q: Can I use lxml to generate XML?** A: **NO.** Constitution Principle 3 prohibits custom XML generation. Use IfcTester only. **Q: What if IfcTester doesn't support something?** A: Check IfcTester documentation first. If truly missing, contribute to IfcTester or raise issue. **Q: How do I add a new facet type?** A: Follow PRD 005 or 006. Write tests first using `ids.Entity()`, `ids.Property()`, etc. **Q: What is early validation?** A: Input validation that catches IDS 1.0 constraint violations (like multiple entities in applicability or missing property_set) before XML generation. Provides immediate, actionable error messages with workarounds at tool invocation time. --- ## Status & Next Steps **Current Phase:** Implementation Complete ✅ **Status:** - ✅ Phases 001-009 Implemented - ✅ 94% Test Coverage (168 tests passing) - ✅ 17 MCP Tools Fully Functional - ✅ All Tools Validated with IfcTester - ✅ XSD Compliance Verified - ✅ Early Validation for IDS 1.0 Constraints **Available Now:** - All 17 MCP tools working and tested - Complete TDD infrastructure with pytest - XSD compliance testing suite - Early validation for IDS 1.0 constraints (3 validators, 18 tests) - Sample IDS and IFC files for testing - Claude Code integration via `.mcp.json` **Optional Future Enhancements:** 1. CI/CD pipeline setup (.github/workflows/) 2. Pre-commit hooks configuration 3. Additional buildingSMART validation test examples 4. Increase coverage from 94% to 95%+ (early validation added 32 tests: 136 → 168) **Questions?** Check: 1. Constitution for principles 2. Design Spec for technical details 3. Relevant PRD for implementation guidance --- **Last Updated:** 2025-11-02 **Version:** 1.0.0 **Status:** ✅ Implementation Complete - Fully Functional

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/vinnividivicci/ifc-ids-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server