# IFC MCP (npm · ifc-mcp)

Local IFC/BIM MCP server with IfcOpenShell Python in Pyodide and an IFC viewer.

- Trust score: 76/100 (medium)
- Change this week: +33
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `ifc-mcp`: 76/100 (this document), [markdown](https://verifymcp.io/servers/flinker-app-ifc-mcp/ifc-mcp.md), [page](https://verifymcp.io/servers/flinker-app-ifc-mcp/ifc-mcp)

## Channel facts

- Registry: `npm`
- Package: `ifc-mcp`
- Version: `0.1.16`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (114 of 118), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (114 of 118), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to flinker-app/ifc-mcp).
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 23 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 59/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 1044 tokens (~208/item across 5 items; 5 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add flinker-app-ifc-mcp -- npx -y ifc-mcp
```

### Codex

```bash
codex mcp add flinker-app-ifc-mcp -- npx -y ifc-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "flinker-app-ifc-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "ifc-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add flinker-app-ifc-mcp --command npx --arg -y --arg ifc-mcp
```

### Hermes

```yaml
mcp_servers:
  flinker-app-ifc-mcp:
    command: "npx"
    args: ["-y", "ifc-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "flinker-app-ifc-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "ifc-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 76, +58)

- [security improvement] Known CVEs: unverified → partial
- [security improvement] Install scripts: unverified → pass
- [security improvement] Provenance: unverified → pass
- [security improvement] Malware scan: unverified → pass
- [security] The attested source repository moved: flinker-app/ifc-mcp
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Stability: unverified → 0.23
- [functional improvement] Schema quality: unverified → good
- [functional] Licence: Apache-2.0

### 2026-07-31 (score 18, −25)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 43, +19)

- [functional improvement] Tool coverage: unverified → 100

### 2026-07-28 (score 24, −19)

- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 43)

First indexed and scored.

## MCP tools (5)

### `run-python` (~330 tokens)

run Python

Execute LLM-created Python in the SDK Node/Pyodide IFC runtime.
Use this tool for IFC inspection, validation, reports, exports, and creating
new IFC files.

Runtime context: Pyodide uses
the bundled Pyodide 0.28.2 runtime. The package set includes
micropip, ifcopenshell, numpy, pandas, matplotlib, shapely, and
typing-extensions. The Python code is passed directly to the SDK.

File inputs: pass IFC/IFCXML/IFCZIP file paths in the files array. In the
desktop Node server these are local filesystem paths; in a browser host they
are browser-defined paths resolved by that host. Generated Python can open
those files by name, e.g. ifcopenshell.open("model.ifc") or open("model.ifc", "rb").

Return contract: this tool exposes stdout, stderr, saved_files, uploaded_files,
and any result returned by the raw SDK. Generated files are returned as
temporary localhost download URLs in saved_files. Do not assume files were
written to the user's working directory.

Input parameters:

- `code` (string, required): Raw Python code to execute through the SDK. Files passed through files can be opened by name, e.g. ifcopenshell.open("model.ifc") or open("model.ifc", "rb").
- `files` (array): Optional array of IFC/IFCXML/IFCZIP file paths. Desktop hosts use local filesystem paths; browser hosts use browser-defined paths.
- `timeout_seconds` (integer): Timeout in seconds.

### `open-ifc-viewer` (~119 tokens)

open IFC viewer

Open or show the local IFC viewer and return its stable viewer URL. This tool does not load IFC files and does not change selection/isolation state. After this tool returns, use the returned URL as the viewer address. If the client can open links, open that local URL; otherwise tell the user to open the URL in a browser or webview. Use show-ifc-file to show IFC files. Use set-bcf-view to apply a BCF viewpoint file. Do not use browser automation to click or select elements in the viewer.

### `show-ifc-file` (~151 tokens)

show IFC file

Show one IFC file in the already-open local IFC viewer. Pass either a local IFC/IFCXML/IFCZIP file path or a generated IFC download URL from run Python saved_files. Use this for IFC model display only. Repeated calls add multiple IFC files to the same viewer. Returns the same stable viewer URL; after this tool returns, use that URL as the viewer address. Use open-ifc-viewer to open the viewer and set-bcf-view to apply a BCF viewpoint file.

Input parameters:

- `file_path` (string, required): Local IFC/IFCXML/IFCZIP file path, or a generated IFC localhost download URL from run Python saved_files, to load into the viewer.

### `clear-ifc-viewer` (~59 tokens)

clear IFC viewer

Clear the already-open local IFC viewer by removing all loaded IFC files and BCF viewpoint state. This keeps the same stable viewer URL and does not close the browser tab. Use show-ifc-file after this to load a fresh IFC model.

### `set-bcf-view` (~385 tokens)

set BCF view

Set the view state in the already-open local IFC viewer by applying a BCF/BCFZIP viewpoint file.
Pass either a local BCF/BCFZIP file path or a generated BCF download URL from run Python saved_files.
This tool does not show/load IFC files; use show-ifc-file for that.
It should not open a new browser tab and should not use browser automation.
To generate a BCFZIP with run-python, write a .bcfzip file, then call set-bcf-view with saved_files[0].url:
\```python
from uuid import uuid4
import ifcopenshell
from bcf.v3 import model as mdl
from bcf.v3.bcfxml import BcfXml
from bcf.v3.visinfo import VisualizationInfoHandler

model = ifcopenshell.open("sample.ifc")
gid = model.by_type("IfcWall")[0].GlobalId
component = mdl.Component(ifc_guid=gid)
visinfo = mdl.VisualizationInfo(
    guid=str(uuid4()),
    components=mdl.Components(
        selection=mdl.ComponentSelection(component=[component]),
        visibility=mdl.ComponentVisibility(
            default_visibility=False,
            exceptions=mdl.ComponentVisibilityExceptions(component=[component]),
        ),
    ),
)
bcf = BcfXml.create_new(project_name="IFC MCP")
topic = bcf.add_topic("Review wall", "Review wall", "ifc-mcp", topic_type="Issue", topic_status="Open")
topic.add_visinfo_handler(VisualizationInfoHandler(visinfo))
bcf_path = "view.bcfzip"
bcf.save(bcf_path)
print(str(bcf_path))
\```

Input parameters:

- `bcf_path` (string, required): Local BCF/BCFZIP file path, or a generated BCF download URL from run Python saved_files, to apply in the viewer.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/flinker-app-ifc-mcp/ifc-mcp#diagnostics

## Score history

- 2026-08-03: 76
- 2026-08-02: 76
- 2026-08-01: 18
- 2026-07-31: 18
- 2026-07-30: 43
- 2026-07-28: 24
- 2026-07-27: 43

## Links

- npm package: https://www.npmjs.com/package/ifc-mcp
- Socket report: https://socket.dev/npm/package/ifc-mcp
- Repository: https://github.com/flinker-app/ifc-mcp
- Changelog RSS feed: https://verifymcp.io/servers/flinker-app-ifc-mcp/ifc-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/flinker-app-ifc-mcp/ifc-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/flinker-app-ifc-mcp/ifc-mcp
