Open Collaboration Platform (OCP) MCP server for Claude Desktop [BETA]
Project description
OCP MCP Server — Claude Desktop Integration
Gives Claude Desktop direct access to the Open Collaboration Platform (OCP) — 394 API endpoints plus smart tools for searching and managing BIM objects.
Prerequisites
| Requirement | Notes |
|---|---|
| macOS or Windows | macOS 12+ or Windows 10/11 |
| Python 3.10+ | macOS: python3 --version · Windows: python --version. Download from python.org if needed |
| Claude desktop | Download from claude.ai/download |
| BimPlus account | You need your Nemetschek email and password |
Security Notes
⚠️ Token storage in runtime_config.json
When you authenticate, your token is saved locally. This file contains live tokens and should NEVER be committed to version control.
| Platform | Config file location |
|---|---|
| macOS | ~/.config/ocp-mcp/runtime_config.json |
| Windows | %APPDATA%\ocp-mcp\runtime_config.json |
Guidelines:
- ✅
.gitignorealready containsruntime_config.json— verify this before committing - ✅ macOS: restrict file permissions with
chmod 600 runtime_config.json(owner read-only) - ✅ Never share this file or its contents with others
- ✅ Tokens automatically expire; re-authenticate when needed
SSL Verification (Advanced)
By default, SSL certificate verification is enabled (verify_ssl=true). For staging environments with self-signed certificates, you can disable it via environment variable:
export BIMPLUS_VERIFY_SSL=false
Or in runtime_config.json:
{
"verify_ssl": "false"
}
⚠️ Only disable for development/staging — always enable for production.
Installation (2 minutes)
macOS — Option A: uvx (recommended, no git clone needed)
1. Open Terminal — press Cmd+Space, type Terminal, press Enter.
2. Add to Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"ocp": {
"command": "uvx",
"args": ["--prerelease=allow", "ocp-mcp-server"]
}
}
}
3. Restart Claude Desktop — quit (Cmd+Q) and reopen it.
4. Authenticate — in a new Claude conversation, type:
Use authenticate_bimplus to log me in
Claude will ask for your email and password and save the token for future sessions.
Requires: uv installed (
curl -LsSf https://astral.sh/uv/install.sh | sh)
macOS — Option B: local install (from source)
1. Download and extract the zip file to a permanent location on your Mac.
Tip: put it somewhere it won't be accidentally deleted, e.g.
~/Applications/bimplus-mcp/
2. Open Terminal — press Cmd+Space, type Terminal, press Enter.
3. Run the installer:
cd /path/to/bimplus-api-mcp
bash install.sh
4. Restart Claude Desktop — quit (Cmd+Q) and reopen it.
5. Authenticate — same as step 4 above.
Windows — Option A: uvx (recommended)
1. Open Claude Desktop config at %APPDATA%\Claude\claude_desktop_config.json (paste this path into Explorer's address bar) and add:
{
"mcpServers": {
"ocp": {
"command": "uvx",
"args": ["--prerelease=allow", "ocp-mcp-server"]
}
}
}
2. Restart Claude Desktop.
3. Authenticate — in a new Claude conversation, type:
Use authenticate_bimplus to log me in
Requires: uv installed. Run in PowerShell:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Windows — Option B: PowerShell installer (from source)
1. Download and extract the zip to a permanent location, e.g. C:\Users\<you>\AppData\Local\bimplus-mcp\.
2. Open PowerShell and run:
cd C:\path\to\bimplus-api-mcp
.\install.ps1
If you see an execution-policy error, run this first:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
3. Restart Claude Desktop.
4. Authenticate — same as step 3 above.
Config is saved to
%APPDATA%\ocp-mcp\runtime_config.json.
What you can do after setup
Just ask Claude in plain English:
- "Show me all models in team acme-corp"
- "Find all doors on the second floor"
- "What are the properties of element XYZ?"
- "Search for walls with fire rating EI60"
Smart tools (LLM-friendly)
This server exposes all API endpoints from swagger.json and also provides higher-level tools that combine multiple API calls.
ocp_help
- Purpose: Front-door routing tool. Returns available capabilities and example prompts.
- Use when: Prompt contains "OCP", "BimPlus", "construction platform", or when unsure which tool to use.
- Trigger phrases: "what can OCP do", "help with OCP", "what tools are available", "open OCP".
- Output: Full list of capabilities with example prompts.
set_bimplus_config
- Purpose: Save runtime connection settings (token, base URL, team, credentials).
- Use when: Authentication or API calls fail due to missing config.
- Output: Saved config with sensitive fields masked.
get_bimplus_config
- Purpose: Read current runtime settings.
- Use when: You want to verify what token/team/base URL is active.
- Output: Current config with sensitive fields masked. Shows a first-run hint if no config file exists yet.
authenticate_bimplus
- Purpose: Log in with stored credentials and save a fresh token.
- Primary tool for: "login to OCP", "log in to OCP", "authenticate OCP", "connect to BimPlus".
- Required config first:
user_id,password,application_id. - Output: Auth status and token metadata.
start_sso_login
- Purpose: Full browser-based SSO login — opens the Allplan login page and captures the token automatically via OAuth2 PKCE. No manual token copy-paste required.
- Use when: "Login to OCP with SSO", "browser login", "login via portal".
- Flow: browser opens → user logs in → token saved automatically.
- Optional input:
clear_password(defaulttrue),timeout_seconds(default120). - Output: Login status and masked token metadata.
set_bimplus_sso_token
- Purpose: Manually paste a Bearer token (fallback when browser login isn't possible).
- Use when: You already have an OCP/BimPlus access token from another source.
- Required input:
token. - Optional input:
token_type(defaultBearer),clear_password(defaulttrue). - Output: Token validation status and masked token metadata.
list_my_teams
- Purpose: List teams available to the current user.
- Use when: You ask "list my teams" / "show available teams" / "search team".
- Optional input:
query,limit. - Output: Normalized team rows (
id,name,slug).
list_team_projects
- Purpose: List projects in a team and optionally search by name/ID.
- Use when: You ask "list all projects" / "search team project".
- Optional input:
team_slug,query,limit. - Output: Normalized project rows (
id,name,number,status).
list_project_models
- Purpose: List models (project divisions) in the current project and optionally filter them.
- Use when: You ask "show the model names" / "which models are available here" / "list models" / "what models are in this project".
- Optional input:
team_slug,project_id,query,limit. - Output: Normalized model rows (
id,name) plus the current model when available.
search_objects
- Purpose: Run object search across project topology with optional filters.
- Required input:
project_id. - Filter options:
conditions: structured equality filters.filter_string: raw advanced BIMPlus filter syntax.
- Output: Filtered result hierarchy/export payload.
count_elements_by_type
- Purpose: Count objects per element type in a project.
- Required input:
project_id. - Optional input:
team_slug,include_zero,max_concurrency. - Output: Per-type counts, per-discipline totals, and errors.
count_elements_by_property_value
- Purpose: Count objects where a property equals a value for a specific type.
- Required input:
project_id,type_name_or_id,property_name,property_value. - Optional input:
case_sensitive,trim_whitespace,sample_limit. - Output: Matched count, sample IDs, and top value distribution.
bulk_update_property_by_filter
- Purpose: Safely update an attribute for all objects matched by a filter.
- Required input:
project_id,type_name_or_id,filter_property_name,filter_property_value,attribute_id,new_value. - Safety flow:
- Preview first with
dry_run=true. - Apply only with
dry_run=falseandconfirm=true. - Optionally verify read-back with
verify=trueandtarget_property_name.
- Preview first with
- Output: Match summary, update status, failed IDs, verification details.
project_dashboard_insights
- Purpose: Build a one-call project dashboard with project details, issue summaries, element totals, top types, and area/volume insights.
- Required input:
project_id. - Optional input:
team_slug,top_n_types,sample_issue_limit,include_element_samples,area_property_names,volume_property_names. - Output: Normalized dashboard JSON suitable for charts/tables and follow-up analysis.
Generic API endpoint tools
- Purpose: Direct access to each endpoint in the BIMPlus OpenAPI spec.
- Naming: Derived from HTTP method and path, for example
get_by_teamslug_projects_by_projectid_element_types. - Output: HTTP status and raw endpoint response.
Example prompts
Getting started
- "What can OCP do?" (routes to ocp_help)
- "Login to OCP." (credentials in config)
- "Login to OCP with SSO." (browser opens automatically)
- "Login to OCP with SSO token ." (manual paste fallback)
Discovery
- "List my teams."
- "List all projects in my current team."
- "Which models are available here?"
- "Show OCP projects in team ."
Analysis
- "Count all object types in project <project_id>."
- "How many Columns have material C30/37?"
- "Show project dashboard for <project_id>."
- "Search OCP objects where material is C30/37."
Edits
- "Preview updating Product name to Claude for Columns where material is C30/37."
- "Apply that update now with confirm=true and verify using target property Product name."
Low-level
- "Call get_by_teamslug_projects_by_projectid_element_types for team <team_slug> and project <project_id>."
Tool Catalog Modes And Fallback
This server supports three catalog modes:
smart: smart tools only (lowest token usage)hybrid: smart tools + curated autogenerated endpointsfull: smart tools + full autogenerated endpoint catalog (can be capped)
To reduce "tool not available" responses while staying efficient, smart mode can expose a fallback slice:
tool_catalog_fallback_mode:off|hybrid|fulltool_catalog_fallback_limit: number of fallback autogenerated tools to expose in smart mode
You can set these via set_bimplus_config:
Set tool_catalog_mode to "smart"
Set tool_catalog_fallback_mode to "hybrid"
Set tool_catalog_fallback_limit to 25
Or directly in runtime_config.json / env vars (BIMPLUS_TOOL_CATALOG_*).
Session1 Regression Script
You can run a full scenario regression matching the historical session1.md workflow.
Safe mode (default, no writes)
.venv/bin/python scripts/session1_regression.py
This runs authentication, read-only checks, the new model discovery step, and the bulk-update dry-run safety step. If stored credentials are stale, the auth step falls back to validating the existing session token so the rest of the regression can still complete.
Full parity mode (includes write apply)
.venv/bin/python scripts/session1_regression.py --apply-writes
This also executes the bulk update apply step and writes data (same target value used in session: Claude).
Useful flags
.venv/bin/python scripts/session1_regression.py \
--team-slug ctf-nemetschek-allplan-gmbh-ft \
--project-id 3e9fed73-0c06-48fb-888a-d5b2ad7b3c05 \
--model-id 9deba3db-2c4a-4ce6-b1ec-45c5b2b35929 \
--keep-config
Notes:
- Exit code is
0when all scenarios pass, otherwise1. - By default, the script restores your previous runtime config after execution.
Changing your team or project
Set the BimPlus team slug to "my-team-name"
Set the BimPlus project ID to "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Claude will remember these settings between sessions.
Troubleshooting
"bimplus-api" does not appear in Claude's tools
- Make sure you fully quit and reopened Claude desktop after installation.
- macOS: Re-run
bash install.shto check for errors. - Windows: Re-run
.\install.ps1to check for errors.
Authentication fails
- Ask Claude: "What is the current BimPlus config?" to verify the token field.
- Try authenticating again: "Run authenticate_bimplus"
- If you see HTTP 401 Unauthorized, update
passwordand/orapplication_idviaset_bimplus_config, then retry. - Do not store masked values (e.g.
Micr...09) inruntime_config.json; authentication requires the full plaintext password.
Prefer SSO Login (No Password In Config)
The easiest way — no password, no copy-paste:
Login to OCP with SSO.
Claude opens the Allplan login page in your browser. Once you complete login, the token is captured and saved automatically. The whole flow takes about 15 seconds.
How it works under the hood:
- A temporary local HTTP server starts on port
8766. - Your browser opens to the Allplan Keycloak login page (OAuth2 PKCE flow).
- After login, Keycloak redirects to
http://localhost:8766/callbackwith an authorization code. - The server exchanges the code for a Keycloak token, then exchanges that for a BimPlus Identity token via
/v2/cross-token→/v2/cross-authorize. - The Identity token is saved to config; the local server shuts down.
Fallback — paste a token manually:
If the browser flow isn't available, call set_bimplus_sso_token and paste a token directly:
Use set_bimplus_sso_token with:
- token: <PASTE_ACCESS_TOKEN>
- token_type: Identity
- clear_password: true
The server validates via GET /v2/authorize before saving.
Config knobs:
sso_callback_port— local port for the OAuth redirect (default8766)sso_auth_server— Keycloak base URL (auto-derived frombase_urlif empty)
Python not found
- Install Python 3.10+ from python.org and re-run the installer (
install.shon macOS,install.ps1on Windows).
What the installers do
Both install.sh (macOS) and install.ps1 (Windows) do the same thing:
- Check that Python 3.10+ is installed.
- If
uvxis available, use it directly — no local venv needed. - Otherwise, create a local
.venvvirtual environment and installmcp,httpx, andhttpx-sse. - Patch the Claude Desktop config file to register the
ocpMCP server entry.
| Platform | Config patched |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
Both scripts are safe to re-run — they update an existing installation in place.
Sharing with colleagues
Send them the zip and this message:
Extract the zip somewhere permanent (e.g.
~/Applications/bimplus-mcp/), open Terminal, runbash install.sh, restart Claude desktop, then ask Claude to runauthenticate_bimpluswith your Nemetschek credentials.
Files in this package
| File | Purpose |
|---|---|
server.py |
The MCP server (all logic lives here) |
swagger.json |
Full BimPlus API specification |
pyproject.toml |
Python package metadata |
install.sh |
Automated setup script (macOS) |
install.ps1 |
Automated setup script (Windows) |
README.md |
This file |
runtime_config.json is created automatically the first time you authenticate — it stores your token locally and is never sent anywhere except to the BimPlus API.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ocp_mcp_server-0.2.0b11.tar.gz.
File metadata
- Download URL: ocp_mcp_server-0.2.0b11.tar.gz
- Upload date:
- Size: 265.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ffb93c73420b71e4d319a67c74426d639cd64b84da00fafd3862e8eec443e9ca
|
|
| MD5 |
3cfad3d91051491c4d1b4b839376239b
|
|
| BLAKE2b-256 |
e8366b7de165665cfd8fcc390086183518ded96b40e7903cb61af709d6569ff2
|
File details
Details for the file ocp_mcp_server-0.2.0b11-py3-none-any.whl.
File metadata
- Download URL: ocp_mcp_server-0.2.0b11-py3-none-any.whl
- Upload date:
- Size: 232.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7de4a9feede9fd2925d845471918458877c18ddfabfb86f3461f7c0d9e86251b
|
|
| MD5 |
01228e027d296d1155801e5923d34e19
|
|
| BLAKE2b-256 |
955ab83a0c275c60fd2e6c5ce8cebebf51a984861bb6be0e8b64174125aeac54
|