Skip to content

krunal16-c/gov-ca-mcp

Repository files navigation

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:

  1. GOV CA DATASET MCP - Universal dataset discovery, search, and metadata retrieval across all Canadian government open data
  2. 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.txt

Running the Servers

# Dataset Discovery MCP
python -m gov_mcp.server

# Transportation Infrastructure MCP  
python -m gov_ca_transportation.server

Docker 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 down

Building 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-mcp

Docker Endpoints

Server Container Port Host Port SSE Endpoint
Dataset Discovery 8002 8002 http://localhost:8002/sse
Transportation 8001 8001 http://localhost:8001/sse

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 8002

When 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/sse
  • JavaScript (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 definitions

Data 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_datasets Search across all 250,000+ Canadian government datasets
get_dataset_schema Get complete schema with field definitions and download URLs
list_organizations Browse by department/organization
browse_by_topic Explore datasets by subject area
check_available_mcps Check which specialized MCPs are available
get_activity_stream See recently updated datasets
query_datastore Query data directly (fallback mode)

Transportation Infrastructure MCP (gov_ca_transportation) - 7 Tools

Tool Description
query_bridges Search bridge infrastructure by province with StatCan condition data
analyze_bridge_conditions Aggregate condition analysis using Statistics Canada data
get_infrastructure_costs Get replacement costs by condition from Statistics Canada
query_ports_airports Search airports, ports, marinas, heliports
query_railways Search railway lines and stations
query_tunnels Search tunnel infrastructure
compare_across_regions 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 data

Analyze 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 sources

Project 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 file

Configuration

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.py

Key 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:

  1. Fork the repository
  2. Create a feature branch
  3. Add tests for new functionality
  4. Submit a pull request

About

Python-based Model Context Protocol (MCP) servers for accessing Canada's Open Government data.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors