Accesses Canadian government transportation infrastructure data through ESRI REST services, enabling queries of bridges, airports, and other infrastructure from provincial open data portals in multiple data formats including GeoJSON.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Government of Canada Open Data MCP Serversfind bridges in Ontario that need repair"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Government of Canada Open Data MCP Servers
Python-based Model Context Protocol (MCP) servers for accessing Canada's Open Government data. This project includes two complementary MCP servers:
GOV CA DATASET MCP - Universal dataset discovery, search, and metadata retrieval across all Canadian government open data
GOV CA TRANSPORTATION MCP - Specialized infrastructure querying for bridges, tunnels, airports, ports, and railways with Statistics Canada cost data
Features
Dataset Discovery (gov_mcp)
Search across 250,000+ datasets from Open Government Canada
Browse by topic, organization, or jurisdiction (federal/provincial/municipal)
Get detailed dataset schemas and download URLs
Track recent dataset updates
Transportation Infrastructure (gov_ca_transportation)
Query bridge conditions using Statistics Canada national data for all provinces
Get infrastructure replacement costs from Statistics Canada surveys
Search airports and ports across Canada
Query railway infrastructure
Search tunnels by province and type
Unified data approach: Uses Statistics Canada Core Public Infrastructure Survey for consistent national coverage
Quick Start
Installation
# Clone and install
cd gov_mcp
pip install -e .
# Or install dependencies directly
pip install -r requirements.txtRunning the Servers
# Dataset Discovery MCP
python -m gov_mcp.server
# Transportation Infrastructure MCP
python -m gov_ca_transportation.serverDocker Deployment
Both MCP servers can be run as Docker containers individually or together using Docker Compose.
Using Docker Compose (Recommended)
# Start all servers
docker-compose up
# Start in background (detached mode)
docker-compose up -d
# Start a specific server
docker-compose up gov-ca-dataset
docker-compose up gov-ca-transportation
# View logs
docker-compose logs -f
# Stop all servers
docker-compose downBuilding Individual Docker Images
# Build Dataset Discovery MCP
docker build -f gov_mcp/Dockerfile -t gov-ca-dataset-mcp .
# Build Transportation Infrastructure MCP
docker build -f gov_ca_transportation/Dockerfile -t gov-ca-transportation-mcp .Running Individual Containers
# Run Dataset Discovery MCP (port 8002)
docker run -d --name gov-ca-dataset -p 8002:8002 gov-ca-dataset-mcp
# Run Transportation Infrastructure MCP (port 8001)
docker run -d --name gov-ca-transportation -p 8001:8001 gov-ca-transportation-mcpDocker Endpoints
Server | Container Port | Host Port | SSE Endpoint |
Dataset Discovery | 8002 | 8002 | |
Transportation | 8001 | 8001 |
SSE (Server-Sent Events) Transport
Both MCP servers support an SSE transport for HTTP-based streaming. Start either server with the --sse flag and a port argument to enable the SSE endpoint:
# Start Transportation MCP with SSE on port 8001
python -m gov_ca_transportation.server --sse --port 8001
# Start Dataset Discovery MCP with SSE on port 8002
python -m gov_mcp.server --sse --port 8002When SSE is enabled, the server logs the SSE endpoint (e.g., http://0.0.0.0:8001/sse). You can connect to that endpoint using a web client, curl, or a Python SSE client.
Example connections:
Curl (raw stream):
curl -H "Accept: text/event-stream" -N http://localhost:8001/sseJavaScript (EventSource):
const es = new EventSource("http://localhost:8001/sse");
es.onmessage = (e) => console.log("SSE message:", e.data);
es.onerror = (err) => console.error("SSE error:", err);Python (httpx-sse):
from httpx_sse import EventSource
with EventSource("http://localhost:8001/sse") as event_source:
for event in event_source:
# event is an object with .event, .data, .id
print(event.data)Notes:
The SSE endpoint serves MCP events and results over HTTP for compatible clients.
The MCP server will print the SSE endpoint URL and port when started with
--sse.SSE-based transports require client support for Server-Sent Events (EventSource), or using Python/HTTP libraries with SSE support like
httpx-sse.
Architecture
gov_mcp/ # Dataset Discovery MCP
├── server.py # MCP server with 7 tools
├── api_client.py # Open Government Canada API wrapper
├── http_client.py # HTTP client with retry logic
└── types.py # Type definitions
gov_ca_transportation/ # Transportation Infrastructure MCP
├── server.py # MCP server with 7 tools
├── api_client.py # Statistics Canada + provincial data fetching
├── http_client.py # HTTP client
└── types.py # Type definitionsData Sources
The Transportation MCP uses Statistics Canada as the primary data source for national coverage:
Data Type | Primary Source | Coverage |
Bridge Conditions | Statistics Canada Table 34-10-0288-01 | All provinces/territories |
Infrastructure Costs | Statistics Canada Table 34-10-0284-01 | All provinces/territories |
Detailed Bridge Records | Provincial Open Data | Ontario, Quebec, Nova Scotia |
Airports | Quebec Open Data, BC OpenMaps | Quebec, British Columbia |
Railways | National Railway Network | National |
Available Tools
Dataset Discovery MCP (gov_mcp) - 7 Tools
Tool | Description |
| Search across all 250,000+ Canadian government datasets |
| Get complete schema with field definitions and download URLs |
| Browse by department/organization |
| Explore datasets by subject area |
| Check which specialized MCPs are available |
| See recently updated datasets |
| Query data directly (fallback mode) |
Transportation Infrastructure MCP (gov_ca_transportation) - 7 Tools
Tool | Description |
| Search bridge infrastructure by province with StatCan condition data |
| Aggregate condition analysis using Statistics Canada data |
| Get replacement costs by condition from Statistics Canada |
| Search airports, ports, marinas, heliports |
| Search railway lines and stations |
| Search tunnel infrastructure |
| Compare infrastructure across provinces |
Example Usage
Search for Datasets
# Search for water datasets in Saskatchewan
result = search_datasets(query="water Saskatchewan", limit=20)
# Returns 103 datasets including water quality monitoring dataAnalyze Bridge Conditions
# Get bridge conditions for any province using Statistics Canada data
result = analyze_bridge_conditions(region="Saskatchewan")
# Returns: Very Poor: 2.4%, Poor: 16.4%, Fair: 23.7%, Good: 32.4%, Very Good: 10.1%Get Infrastructure Costs
# Get bridge replacement costs for Ontario
result = get_infrastructure_costs(infrastructure_type="bridge", location="Ontario")
# Returns: Total $81.4B, Priority investment needed: $2.65B (Poor + Very Poor)Query Bridges
# Get bridge data with StatCan condition distribution
result = query_bridges(province="Ontario", limit=100)
# Returns condition summary + detailed records from provincial sourcesProject Structure
gov_mcp/
├── gov_mcp/ # Dataset Discovery MCP
│ ├── __init__.py
│ ├── server.py # MCP server
│ ├── api_client.py # API wrapper
│ ├── http_client.py # HTTP client
│ ├── types.py # Type definitions
│ └── Dockerfile # Docker build for this server
├── gov_ca_transportation/ # Transportation MCP
│ ├── __init__.py
│ ├── server.py # MCP server
│ ├── api_client.py # StatCan + provincial data fetcher
│ ├── http_client.py # HTTP client
│ ├── types.py # Type definitions
│ └── Dockerfile # Docker build for this server
├── tests/ # Test files
├── documentation/ # Additional docs
├── docker-compose.yml # Docker Compose for all servers
├── .dockerignore # Docker ignore file
├── pyproject.toml # Project config
├── requirements.txt # Dependencies
└── README.md # This fileConfiguration
VS Code MCP Settings
Add to your VS Code settings.json or MCP config:
{
"mcpServers": {
"gov-ca-dataset": {
"command": "python",
"args": ["-m", "gov_mcp.server"],
"cwd": "/path/to/gov_mcp"
},
"gov-ca-transportation": {
"command": "python",
"args": ["-m", "gov_ca_transportation.server"],
"cwd": "/path/to/gov_mcp"
}
}
}Development
Running Tests
pytest tests/Running Validation
python validate.pyKey Capabilities
250,000+ datasets searchable from Open Government Canada
Statistics Canada integration for authoritative national infrastructure data
All provinces covered for bridge conditions and infrastructure costs
Real infrastructure data from provincial/municipal open data portals
Multiple data formats: GeoJSON, CSV, ZIP (StatCan)
Condition analysis: Bridge condition percentages, replacement costs by condition
Geographic filtering: By province or national aggregate
API Sources
Source | Data Types |
Statistics Canada | Infrastructure costs, bridge conditions (national) |
open.canada.ca | Federal datasets |
donnees.montreal.ca | Montreal bridge records |
data.ontario.ca | Ontario bridge records |
openmaps.gov.bc.ca | BC airports, railways |
data.novascotia.ca | Nova Scotia structures |
donneesquebec.ca | Quebec airports |
License
MIT License - See LICENSE file for details
Contributing
Contributions are welcome! Please:
Fork the repository
Create a feature branch
Add tests for new functionality
Submit a pull request
This server cannot be installed
Resources
Looking for Admin?
Admins can modify the Dockerfile, update the server description, and track usage metrics. If you are the server author, to access the admin panel.