Canadian Building Code MCP Server
# Canadian Building Code MCP
[](https://pypi.org/project/building-code-mcp/)
[](https://opensource.org/licenses/MIT)
[](https://smithery.ai/server/davidcho/ca-building-code-mcp)
**AI-powered search for 24,000+ Canadian building code sections.**
Enable AI assistants to search, navigate, and cite building regulations across NBC, OBC, BCBC, and 13 other Canadian codes.
> Works with Claude Desktop and any MCP-compatible client (Cursor, Windsurf, etc.)
<!-- TODO: Add GIF demo here

-->
---
## Why This Exists
Architects and engineers waste hours searching through thousands of pages of building codes. This MCP server lets AI do the heavy lifting:
```
You: "What are the fire separation requirements for a 3-storey
residential building in Saskatchewan?"
Claude: [Searches NBC 2025, finds relevant sections, extracts text]
"According to NBC 2025 Section 3.2.2.55, Group C buildings
up to 3 storeys with sprinklers require:
- Maximum area: 1,800 m²
- Floor assemblies: 45-min fire-resistance rating
- Load-bearing walls: Same rating as supported assembly"
```
---
## Features
| Feature | Description |
|---------|-------------|
| **24,000+ Sections** | NBC, OBC, BCBC, ABC, QCC + 11 more codes indexed |
| **Smart Search** | Fuzzy matching, synonyms, "Did you mean?" suggestions |
| **Token Optimized** | 81% reduction vs naive approach (v1.2.0) |
| **Copyright Safe** | BYOD model - coordinates only, you provide the PDF |
| **Jurisdiction Aware** | Knows which code applies where (ON→OBC, BC→BCBC) |
---
## Architecture
```
┌─────────────────────────────────────────────────────────────┐
│ MCP Client (Claude, Cursor, etc.) │
└─────────────────────────┬───────────────────────────────────┘
│ MCP Protocol
▼
┌─────────────────────────────────────────────────────────────┐
│ Building Code MCP Server │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ search_code │ │ get_section │ │ get_table │ │
│ │ (fuzzy+TF-IDF│ │ (BYOD text) │ │ (markdown) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ maps/*.json (15.9 MB) │ │
│ │ Section IDs, pages, keywords, bbox │ │
│ └─────────────────────────────────────────────────┘ │
│ │ │
│ ▼ (BYOD mode only) │
│ ┌─────────────────────────────────────────────────┐ │
│ │ User's PDF (via PyMuPDF) │ │
│ │ Text extraction at runtime │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
**Two Modes:**
- **Map-Only** (default): Returns page numbers & coordinates. No PDF needed.
- **BYOD**: Connect your PDF via `set_pdf_path` for full text extraction.
---
## Quick Start (1 minute)
### Option 1: uvx (Recommended)
```bash
# Install uv (one-time)
pip install uv
```
Add to `claude_desktop_config.json`:
```json
{
"mcpServers": {
"building-code": {
"command": "uvx",
"args": ["building-code-mcp"]
}
}
}
```
### Option 2: pip
```bash
pip install building-code-mcp
```
```json
{
"mcpServers": {
"building-code": {
"command": "building-code-mcp"
}
}
}
```
---
## Example Conversations
### Finding Requirements
```
You: "I'm designing a 6-storey office building in Vancouver.
What are the fire separation requirements?"
Claude: Let me search the BC Building Code...
[Uses search_code("fire separation office", code="BCBC")]
[Uses get_section("3.2.2.57", code="BCBC")]
Based on BCBC 2024 Section 3.2.2.57, a 6-storey Group D
(business) building requires:
- Sprinkler system: Required
- Floor assemblies: 1-hour fire-resistance rating
- Maximum building area: 7,200 m²
```
### Checking Specific Sections
```
You: "What does OBC section 9.10.14.1 say about spatial separation?"
Claude: [Uses get_section("9.10.14.1", code="OBC_Vol1")]
OBC Section 9.10.14.1 - Spatial Separation Between Buildings:
"Buildings on the same property shall have spatial separation
between them based on the aggregate area of unprotected openings
in exposing building faces..."
```
### Jurisdiction Lookup
```
You: "Which building code applies in Calgary?"
Claude: [Uses get_applicable_code("Calgary, Alberta")]
Calgary follows the Alberta Building Code (ABC) 2023.
Primary codes: ABC, AFC (Fire), APC (Plumbing)
Also check: National codes (NBC, NFC) for reference
```
---
## Supported Codes
### National Codes (4)
NBC 2025, NFC 2025, NPC 2025, NECB 2025
### Provincial Codes (9)
- **Ontario**: OBC 2024 (Vol 1 & 2), OFC
- **British Columbia**: BCBC 2024
- **Alberta**: ABC 2023
- **Quebec**: QCC, QECB, QPC, QSC (2020)
### User's Guides (3)
IUGP9 (Part 9 Housing), UGP4 (Structural), UGNECB (Energy)
**Total: 24,000+ indexed sections**
---
## Token Efficiency (v1.2.0)
Built-in optimizations reduce token usage:
| Optimization | Reduction |
|--------------|-----------|
| `list_codes` compact mode | 81% |
| `disclaimer` as resource | 61% |
| Default `verbose=false` | ~50% |
**Best practice:** Use `limit=5-10` and only request `verbose=true` when needed.
See [Token Efficiency Guide](docs/CLAUDE_RULES.md) for details.
---
## Tools Available
| Tool | Purpose |
|------|---------|
| `list_codes` | Show available codes and connection status |
| `search_code` | Find sections by keywords |
| `get_section` | Get section details (page, citation, text) |
| `get_table` | Get table content as markdown |
| `get_hierarchy` | Navigate parent/child sections |
| `verify_section` | Check if section ID exists |
| `get_applicable_code` | Find codes for a location |
| `set_pdf_path` | Connect PDF for text extraction |
---
## API Access
REST API: https://canada-aec-code-mcp.onrender.com
```bash
curl https://canada-aec-code-mcp.onrender.com/search/fire+separation
```
> Note: Hosted API runs in Map-Only mode. Use local MCP for full text.
---
## Development
```bash
git clone https://github.com/DavidCho1999/Canada_building_code_mcp.git
cd Canada_building_code_mcp
pip install -e ".[all]"
python src/mcp_server.py
```
---
## License
MIT License - See [LICENSE](LICENSE)
---
## Links
- [PyPI](https://pypi.org/project/building-code-mcp/)
- [Smithery](https://smithery.ai/server/davidcho/ca-building-code-mcp)
- [Token Efficiency Guide](docs/CLAUDE_RULES.md)
TDQS
Scored across 7 tools
Each tool has a clearly distinct purpose with no overlap: get_applicable_code determines location-based applicability, get_hierarchy navigates section relationships, get_section retrieves section details, list_codes enumerates available codes, search_code performs keyword searches, set_pdf_path handles PDF integration, and verify_section validates section existence. The descriptions make it unambiguous which tool to use for each task.
All tool names follow a consistent verb_noun pattern with snake_case: get_applicable_code, get_hierarchy, get_section, list_codes, search_code, set_pdf_path, and verify_section. The verbs (get, list, search, set, verify) are appropriately chosen for their actions, and the nouns clearly indicate the target resources, creating a predictable and readable naming scheme.
With 7 tools, this server is well-scoped for its purpose of accessing and navigating Canadian building codes. The count is sufficient to cover core operations like listing, searching, retrieving details, verifying sections, managing hierarchies, handling location applicability, and integrating PDFs, without being overwhelming or sparse. Each tool earns its place in the workflow.
The toolset provides strong coverage for the domain of building code access and navigation, including listing codes, searching, retrieving section details, verifying existence, and handling hierarchies and location applicability. A minor gap is the lack of update or modification tools, but this is reasonable for a read-only reference server, and the PDF integration via set_pdf_path adds flexibility for text extraction.