Skip to content
Table of contents

donneesqc-mcp: An MCP gateway to public data

donneesqc-mcp is a fork exposing Québec and Montréal open-data operations through MCP tools. Its entry point registers the tool collection and starts an HTTP transport, leaving dataset access and geographic helpers in separate modules.

Application and services Fork Docker
  • Updated
  • Python · 98.28%
  • MIT
Python pytest Upstream credited
Documented components
2Explore modules
Source documents
1Read the instructions
Repository languagesPython 98.28%3

Shares calculated from GitHub Linguist bytes.

Python98.28%
98.28%157,778 bytes
Shell1.36%
1.36%2,183 bytes
Dockerfile0.36%
0.36%574 bytes
Language%Bytes
Python98.28%157,778
Shell1.36%2,183
Dockerfile0.36%574

1. Overview

1.1. Why it exists

Production MCP server connecting AI assistants to Quebec & Montreal open data APIs with strict schema validation.

1.2. Best fit

Natural language querying of public municipal and provincial datasets across transportation, demographics, and municipal services.

2. Use cases

An MCP server that lets AI agents search, query in SQL and map Québec and Montréal open data in conversation.

Use-case diagram for donneesqc-mcp: Search open datasets; Run read-only SQL queries; Find and query in one call; Explore geospatial layers; Geocode, convert coordinatesdonneesqc-mcpSearch open datasetsRun read-only SQL queriesFind and query in one callExplore geospatial layersGeocode, convert coordinatesAnalyst with an agent«system»CKAN open data portals«system»IGO geo services
People on the left, external systems on the right; each oval is a use case backed by the files cited below.
Search open datasets
Analyst with an agentCKAN open data portals

search_datasets and search_montreal_datasets call the CKAN APIs of Données Québec and Montréal (DQ_API_URL, MTL_API_URL) through helpers/ckan_api.py.

Run read-only SQL queries
Analyst with an agentCKAN open data portals

query_resource_sql and query_montreal_sql send SQL to the CKAN DataStore after validate_sql() rejects anything that is not a SELECT.

Find and query in one call
Analyst with an agentCKAN open data portals

find_and_query chains search, resource listing and DataStore query so the agent avoids three round trips.

Explore geospatial layers
Analyst with an agentIGO geo services

list_geospatial_layers, get_geospatial_features and get_map_url query the IGO WFS and build WMS GetMap URLs through helpers/geo_api.py.

Geocode, convert coordinates
Analyst with an agentIGO geo services

geocode and reverse_geocode use the icherche geocoder (GEOCODER_URL); convert_coordinates switches between EPSG:32198 and EPSG:4326.

2.1. Scenario: Counting public trees per borough in Montréal

  1. Start the server with docker compose up -d (or uv sync then uv run python main.py); it listens on port 8000 with streamable HTTP.
  2. Register it in the client, for example claude mcp add --transport http donneesqc http://localhost:8000/mcp.
  3. Ask the agent for public tree data; it calls search_montreal_datasets to find the dataset.
  4. The agent calls query_montreal_data to see the columns of the DataStore resource.
  5. It sends a SELECT … GROUP BY query through query_montreal_sql and answers with the per-borough counts.

Files readREADME.mdmain.pydocker-compose.ymlhelpers/config.pyhelpers/ckan_api.pyhelpers/geo_api.pytools/find_and_query.pytools/query_resource_sql.pytools/convert_coordinates.py

3. Getting started

These commands come from the repository documentation. They were not run during this review.

README.md · Installation manuelle
git clone https://github.com/Stefen-Taime/donneesqc-mcp.git
cd donneesqc-mcp
uv sync
cp .env.example .env
set -a && source .env && set +a
uv run python main.py
README.md · Quick start
git clone https://github.com/Stefen-Taime/donneesqc-mcp.git
cd donneesqc-mcp
docker compose up -d

4. Repository references

Excerpts from the repository’s guides, in their original language. Links open the inspected source revision.

Prerequisites and first run

4.1. Installation manuelle

README.md

Variables d’environnement :

VariableDéfautDescription
MCP_HOST0.0.0.0Adresse d’écoute. Utilisez 127.0.0.1 en développement local.
MCP_PORT8000Port du serveur HTTP.
MCP_ENVlocalNom de l’environnement (Sentry).
HTTP_TIMEOUT30.0Timeout HTTP en secondes.
HTTP_MAX_RETRIES3Nombre de tentatives en cas d’erreur réseau ou 5xx.
DOWNLOAD_MAX_BYTES52428800 (50 Mo)Taille maximale pour le téléchargement de fichiers.
LOG_LEVELINFONiveau de journalisation Python.
SENTRY_DSN(non défini)DSN Sentry pour le monitoring.
Read the full instructions ↗
Configuration and usage

4.2. Gemini CLI

README.md

Ajoutez dans ~/.gemini/settings.json :
Read the full instructions ↗
Source documentation

1 documents read from 1 candidates.

5. Features and components 2

Server bootstrap
main.py configures logging, optionally initializes Sentry, calls register_all_tools and runs the MCP object with streamable-http. Monitoring is optional; it is not the mechanism that serves dataset queries.
Data-service boundary
The documented tool groups cover catalog discovery, CKAN DataStore access, resource downloads and geographic enrichment. A catalog result describes a resource; the actual table or file is a separate request and may use a different format.

6. Architecture

Expand a component to follow its connections, or explore the full diagram.

System components Context
Mermaid Interactive diagram

System overview of the components and connections verified in the repository.

Static architecture view for donneesqc-mcp
Static preview. The interactive diagram replaces it after Mermaid loads.
flowchart LR
node_agent(("AI Agent"))
node_dqportal["Données Québec"]
node_mtlportal["Montréal CKAN"]
node_geoservice["IGO Services"]
node_geocoder["Address Geocoder"]

subgraph group_server["MCP Server"]
  node_entry["MCP Entry<br/>[main.py]"]
  node_registry["Tool Registry<br/>[__init__.py]"]
end

subgraph group_geo["Geospatial"]
  node_geo_tools["OGC Tools"]
  node_geocoding["Geocoding Tools"]
  node_coordinates["Coordinate Tools"]
end

subgraph group_shared["Shared Services"]
  node_ckan["CKAN API<br/>[ckan_api.py]"]
  node_geoapi["OGC API<br/>[geo_api.py]"]
  node_coords["Coordinate Conversion<br/>[coords.py]"]
  node_http["HTTP Client<br/>[http_client.py]"]
  node_config["Configuration<br/>[config.py]"]
end

subgraph group_catalog["Catalog &amp; Data"]
  node_dqtools["DQ Catalog Tools"]
  node_mtltools["Montréal Tools"]
  node_intelligence["Data Intelligence"]
  node_downloads["Resource Access"]
end

node_agent -->|"connects MCP"| node_entry
node_entry -->|"registers tools"| node_registry
node_ckan -->|"fetches JSON"| node_http
node_dqtools -->|"queries catalogue"| node_dqportal
node_mtltools -->|"queries catalogue"| node_mtlportal
node_geo_tools -->|"calls"| node_geoapi
node_geoapi -->|"fetches OGC data"| node_http
node_geoapi -->|"requests WFS/WMS"| node_geoservice
node_geocoding -.->|"geocodes addresses"| node_geocoder
node_coordinates -->|"converts coordinates"| node_coords
node_http -->|"uses settings"| node_config
node_geoapi -->|"uses endpoints"| node_config
node_entry -->|"loads server settings"| node_config
group_server -->|"registers"| group_catalog
group_server -->|"registers"| group_geo
group_catalog --> group_shared
class node_entry,node_registry toneBlue
class node_dqtools,node_mtltools,node_intelligence,node_downloads toneAmber
class node_geo_tools,node_geocoding,node_coordinates toneMint
class node_ckan,node_geoapi,node_coords,node_http,node_config toneRose
class node_agent,node_dqportal,node_mtlportal,node_geoservice,node_geocoder toneIndigo

An MCP server that gives agents access to Québec open-data catalogues, DataStore queries, geospatial services, geocoding and coordinate conversion through registered tools and shared HTTP helpers.

Components
19
Connections
24
Evidence-backed links
23/24
Text version of the diagram

The diagram merges parallel links between groups, so it shows 16 of 24. Full list:

  • AI Agent → MCP Entry (connects MCP)
  • MCP Entry → Tool Registry (registers tools)
  • Tool Registry → DQ Catalog Tools (registers)
  • Tool Registry → Montréal Tools (registers)
  • Tool Registry → Data Intelligence (registers)
  • Tool Registry → Resource Access (registers)
  • Tool Registry → OGC Tools (registers)
  • Tool Registry → Geocoding Tools (registers)
  • Tool Registry → Coordinate Tools (registers)
  • DQ Catalog Tools → CKAN API (calls)
  • Montréal Tools → CKAN API (calls)
  • Data Intelligence → CKAN API (searches and queries)
  • Resource Access → CKAN API (gets resource metadata)
  • CKAN API → HTTP Client (fetches JSON)
  • DQ Catalog Tools → Données Québec (queries catalogue)
  • Montréal Tools → Montréal CKAN (queries catalogue)
  • OGC Tools → OGC API (calls)
  • OGC API → HTTP Client (fetches OGC data)
  • OGC API → IGO Services (requests WFS/WMS)
  • Geocoding Tools → Address Geocoder (geocodes addresses)
  • Coordinate Tools → Coordinate Conversion (converts coordinates)
  • HTTP Client → Configuration (uses settings)
  • OGC API → Configuration (uses endpoints)
  • MCP Entry → Configuration (loads server settings)
Follow one path through the code

Follow main into register_all_tools, then choose the dataset-access tool behind a catalog result. Resource identifiers, formats and geographic coordinate systems matter more than a dataset title alone.

7. Technical dossier

Built from the source at commit 53a6ee4 (52 files). Each item comes from a pattern match in the code, so open the linked file before relying on it.

7.1. Layers and modules

Folders are sorted into layers by name, from the user interface down to data access. Because the sorting uses names only, the diagram says nothing about calls between layers.

Mermaid Layered view
flowchart TB
  subgraph L_interface["Entry points and API"]
    direction TB
    interface_0["tools<br/>29 files"]
    interface_1["helpers<br/>2 files"]
    interface_2["(root)<br/>1 file"]
  end
  subgraph L_infrastructure["Data and infrastructure"]
    direction TB
    infrastructure_0["helpers<br/>1 file"]
  end
  subgraph L_core["Core source"]
    direction TB
    core_0["helpers<br/>3 files"]
    core_1["(root)<br/>1 file"]
  end
  subgraph L_tests["Tests"]
    direction TB
    tests_0["tests<br/>10 files"]
  end
  subgraph L_hosting["Build, CI and hosting"]
    direction TB
    hosting_0["(root)<br/>2 files"]
    hosting_1[".github<br/>1 file"]
  end
  L_interface ~~~ L_infrastructure
  L_infrastructure ~~~ L_core
  L_core ~~~ L_tests
  L_core ~~~ L_hosting
Modules and their main layer
ModuleLayerFilesTypesExtensions
toolsEntry points and API290.py
helpersCore source60.py
(root)Entry points and API20.py .sh

7.2. C4 model

From system context to code declarations. Each level reflects the available source evidence.

UML 1 · System context
1 · System context

The widest C4 view: who uses the project and which outside systems and data stores it relies on. Rendered with uml-mcp.

PlantUML source
@startuml
!include <C4/C4_Context>
LAYOUT_LEFT_RIGHT()
Person(P_mcp, "MCP client")
System(SYS, "donneesqc-mcp", "donneesqc-mcp is a fork exposing Québec and Montréal open-data operat…")
System_Ext(E0, "Open data portal (CKAN)")
System_Ext(E1, "Sentry")
Rel(P_mcp, SYS, "Uses")
Rel(SYS, E0, "Calls")
Rel(SYS, E1, "Calls")
@enduml
UML 2 · Containers
2 · Containers

One level closer: the parts that run separately inside the project, their main language and how calls flow between them. Rendered with uml-mcp.

PlantUML source
@startuml
!include <C4/C4_Container>
LAYOUT_LEFT_RIGHT()
Person(P_mcp, "MCP client")
System_Boundary(SYS, "donneesqc-mcp") {
  Container(C0, "donneesqc-mcp", "Docker")
}
System_Ext(E0, "Open data portal (CKAN)")
System_Ext(E1, "Sentry")
Rel(P_mcp, C0, "Uses")
Rel(C0, E0, "Calls")
Rel(C0, E1, "Calls")
@enduml
UML 3 · Components and layers
3 · Components and layers

Modules grouped by source-layer classification. Boundaries show organization, not runtime isolation or call relationships. Rendered with uml-mcp.

PlantUML source
@startuml
!include <C4/C4_Component>
LAYOUT_TOP_DOWN()
System_Boundary(SYS, "donneesqc-mcp") {
Boundary(L0, "Entry points and API", "layer") {
Component(M0_0, "tools", "Python", "29 files")
Component(M0_1, "helpers", "Python", "2 files")
Component(M0_2, "(root)", "Python", "1 files")
}
Boundary(L1, "Data and infrastructure", "layer") {
Component(M1_0, "helpers", "Python", "1 files")
}
Boundary(L2, "Core source", "layer") {
Component(M2_0, "helpers", "Python", "3 files")
Component(M2_1, "(root)", ".sh", "1 files")
}
Boundary(L3, "Tests", "layer") {
Component(M3_0, "tests", "Python", "10 files")
}
Boundary(L4, "Build, CI and hosting", "layer") {
Component(M4_0, "(root)", "Dockerfile, .yml", "2 files")
Component(M4_1, ".github", ".yml", "1 files")
}
}
@enduml
UML 4 · Code
4 · Code

Selected declarations, fields and methods grouped by source file. No inheritance or call edges are inferred. Rendered with uml-mcp.

PlantUML source
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
top to bottom direction
hide empty members
package "donneesqc-mcp" {
object "tools/list_tools_with_examples.py" as FN0 {
  list_tools_with_examples()
}
object "tools/download_resource.py" as FN1 {
  download_resource()
  _parse_csv()
  _parse_json()
  _parse_xlsx_headers()
}
object "helpers/geo_api.py" as FN2 {
  _get_cached()
  _set_cached()
  clear_cache()
  get_wfs_capabilities()
  get_wms_capabilities()
  get_features()
}
object "tools/find_and_query.py" as FN3 {
  find_and_query()
}
object "helpers/http_client.py" as FN4 {
  get_client()
  _get_retry_after()
  _retry()
  fetch_json()
  fetch_text()
  fetch_bytes()
}
object "tools/suggest_sql.py" as FN5 {
  suggest_sql()
}
}
@enduml

7.3. Data flow

The calls from the GitDiagram graph, in the order you meet them from the entry points. GitDiagram generates the graph with AI; the file paths it cites were checked against the repository tree.

Mermaid Sequence diagram
sequenceDiagram
  autonumber
  participant P0 as AI Agent
  participant P1 as MCP Entry
  participant P2 as Tool Registry
  participant P3 as Configuration
  participant P4 as DQ Catalog Tools
  participant P5 as Montréal Tools
  participant P6 as Data Intelligence
  participant P7 as Resource Access
  participant P8 as OGC Tools
  participant P9 as Geocoding Tools
  participant P10 as Coordinate Tools
  participant P11 as CKAN API
  participant P12 as Données Québec
  participant P13 as Montréal CKAN
  P0->>P1: connects MCP
  P1->>P2: registers tools
  P1->>P3: loads server settings
  P2->>P4: registers
  P2->>P5: registers
  P2->>P6: registers
  P2->>P7: registers
  P2->>P8: registers
  P2->>P9: registers
  P2->>P10: registers
  P4->>P11: calls
  P4->>P12: queries catalogue
  P5->>P11: calls
  P5->>P13: queries catalogue
  P6->>P11: searches and queries
  P7->>P11: gets resource metadata
Steps as text
  1. AI Agent to MCP Entry connects MCP
  2. MCP Entry to Tool Registry registers tools
  3. MCP Entry to Configuration loads server settings
  4. Tool Registry to DQ Catalog Tools registers
  5. Tool Registry to Montréal Tools registers
  6. Tool Registry to Data Intelligence registers
  7. Tool Registry to Resource Access registers
  8. Tool Registry to OGC Tools registers
  9. Tool Registry to Geocoding Tools registers
  10. Tool Registry to Coordinate Tools registers
  11. DQ Catalog Tools to CKAN API calls
  12. DQ Catalog Tools to Données Québec queries catalogue
  13. Montréal Tools to CKAN API calls
  14. Montréal Tools to Montréal CKAN queries catalogue
  15. Data Intelligence to CKAN API searches and queries
  16. Resource Access to CKAN API gets resource metadata
  17. OGC Tools to OGC API calls
  18. Geocoding Tools to Address Geocoder geocodes addresses
  19. Coordinate Tools to Coordinate Conversion converts coordinates
  20. CKAN API to HTTP Client fetches JSON
  21. OGC API to HTTP Client fetches OGC data
  22. OGC API to IGO Services requests WFS/WMS
  23. OGC API to Configuration uses endpoints
  24. HTTP Client to Configuration uses settings

7.4. Public interface

Outside code can use everything listed here. The project also declares 0 public types.

UML Use cases
Use cases

Each actor is a kind of caller, linked to what it can ask the project to do. Rendered with uml-mcp.

PlantUML source
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
left to right direction
actor "MCP client" as A_mcp
rectangle "donneesqc-mcp" {
  usecase "Tool auto_detect_resource" as U0
  usecase "Tool compare_datasets" as U1
  usecase "Tool convert_coordinates" as U2
  usecase "Tool describe_geospatial_layer" as U3
  usecase "Tool download_resource" as U4
  usecase "Tool find_and_query" as U5
}
A_mcp --> U0
A_mcp --> U1
A_mcp --> U2
A_mcp --> U3
A_mcp --> U4
A_mcp --> U5
@enduml

MCP tools, resources and prompts 28

Entry points

7.5. Private interface

These names are internal by the language’s conventions: a leading underscore, private, static or pub(crate).

underscore helper
11

7.6. Business logic

No classes were extracted, so these are the largest source files and their functions.

tools/list_tools_with_examples.py
list_tools_with_examples
tools/download_resource.py
download_resource, _parse_csv, _parse_json, _parse_xlsx_headers
helpers/geo_api.py
_get_cached, _set_cached, clear_cache, get_wfs_capabilities, get_wms_capabilities, get_features
helpers/http_client.py
get_client, _get_retry_after, _retry, fetch_json, fetch_text, fetch_bytes

7.7. External integrations

HTTP clients

httpx

Hosts named in the code

7.8. Stack and dependencies

Python pyproject.toml 6 runtime, 6 dev

Python >=3.11

Open the manifest

External dependencies

11 declared packages (5 runtime, 6 development) in pyproject.toml.

Package table 11
External dependencies
PackageVersionScopePurposeRegistry
mcp>=1.9.0runtimeModel Context Protocolpypi.org
uvicorn>=0.34.0runtimeApplication serverpypi.org
sentry-sdk>=2.19.0runtimeLogging and observabilitypypi.org
defusedxml>=0.7.1runtimeXML bomb protection for Python stdlib modulespypi.org
pyproj>=3.6.0runtimePython interface to PROJ (cartographic projections and coordinate transformations library)pypi.org
pytest>=8.0developmentTestingpypi.org
pytest-asyncio>=0.25.0developmentTestingpypi.org
respx>=0.22.0developmentA utility for mocking out the Python HTTPX and HTTP Core libraries.pypi.org
ruff>=0.9.0developmentLinting and formattingpypi.org
ty>=0.0.1a0developmentAn extremely fast Python type checker, written in Rust.pypi.org
pre-commit>=4.0.0developmentLinting and formattingpypi.org

7.9. CI/CD pipeline

1 GitHub Actions workflow, 2 jobs. Each box is a job; double-bordered boxes publish or deploy, and arrows follow needs.

Mermaid Pipeline flow
flowchart LR
  subgraph wf0["CI"]
    direction LR
    wf0_lint["Lint & Format<br/>ubuntu-latest"]
    wf0_test[["Tests<br/>ubuntu-latest"]]
  end
  t0(["push · pull request"])
  t0 --> wf0_lint
  wf0_lint --> wf0_test
Workflows, triggers, jobs and targets
WorkflowTriggersJobsPublishes to
CI
.github/workflows/ci.yml
push, pull request
  • Lint & Format ubuntu-latest
    actions/checkout · Install uv · Set up Python · Install dependencies · Ruff lint and import sorting · Ruff format check
  • Tests ← lint ubuntu-latest
    actions/checkout · Install uv · Set up Python · Install dependencies · Run tests · Upload test results
—

7.10. Deployment

Mermaid Deployment diagram
flowchart LR
  repo[("GitHub repository")]
  ci[["GitHub Actions<br/>1 workflow"]]
  image["Docker image<br/>FROM python:3.12-slim"]
  subgraph compose["Docker Compose"]
    svc_donneesqc_mcp["donneesqc-mcp"]
  end
  repo -->|"push or pull request"| ci
  ci -->|"docker build"| image
  image -->|"docker compose up"| compose
UML Deployment
Deployment

The outer node is where the code runs. Each base image points to what it builds, solid arrows lead to databases and dashed ones to outside services. Rendered with uml-mcp.

PlantUML source
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
node "Docker Compose" as H {
  node "donneesqc-mcp" as N0 <<container>>
}
artifact "FROM python:3.12-slim" as IMG0
IMG0 ..> N0 : builds
cloud "Open data portal (CKAN)" as E0
N0 ..> E0
cloud "Sentry" as E1
N0 ..> E1
@enduml

Where it runs

Compose services

donneesqc-mcp

Docker base images

python:3.12-slim

7.11. Monitoring

What the code logs, measures and exposes to tell whether it is working.

Container health checks

7.12. Security

Supply chain

Environment variables 16

The page lists names without their values and underlines the ones that look like secrets.

SENTRY_DSN DOWNLOAD_MAX_BYTES DQ_API_URL DQ_BASE_URL GEOCODER_URL GEO_WFS_URL GEO_WMS_URL HTTP_MAX_RETRIES HTTP_TIMEOUT LOG_LEVEL MCP_ENV MCP_HOST MCP_PORT MTL_API_URL MTL_BASE_URL SENTRY_SAMPLE_RATE

7.13. Testing

Test files
10
Source files
37
Test cases, about
101
Unit tests
10

No measured coverage report in the analyzed sources.

Where the tests are

tests 10

Continuous integration

CI
ruff, pytest
UML CI pipeline
CI pipeline

The main GitHub Actions workflow runs these steps. Jobs that run in parallel sit side by side. Rendered with uml-mcp.

PlantUML source
@startuml
skinparam backgroundColor transparent
skinparam shadowing false
skinparam roundCorner 10
skinparam defaultFontName Arial
skinparam defaultFontSize 13
skinparam ArrowColor #4e6070
skinparam ArrowFontColor #3d4f5f
skinparam titleFontSize 14
skinparam actorBorderColor #006a62
skinparam actorBackgroundColor #e9f3f4
skinparam usecaseBorderColor #006a62
skinparam usecaseBackgroundColor #e9f3f4
skinparam componentBorderColor #006a62
skinparam componentBackgroundColor #e9f3f4
skinparam interfaceBorderColor #006a62
skinparam interfaceBackgroundColor #ffffff
skinparam nodeBorderColor #4e6070
skinparam nodeBackgroundColor #f4f8fb
skinparam databaseBorderColor #006a62
skinparam databaseBackgroundColor #ffffff
skinparam cloudBorderColor #4e6070
skinparam cloudBackgroundColor #f0f5fa
skinparam artifactBorderColor #006a62
skinparam artifactBackgroundColor #ffffff
skinparam rectangleBorderColor #b0c2d3
skinparam activityBorderColor #006a62
skinparam activityBackgroundColor #e9f3f4
skinparam partitionBorderColor #b0c2d3
skinparam stereotypeCBackgroundColor #ffffff
title CI
start
partition "Lint & Format" {
  :actions/checkout;
  :Install uv;
  :Set up Python;
  :Install dependencies;
  :Ruff lint and import sorting;
  :Ruff format check;
  :Type check (ty);
}
partition "Tests" {
  :actions/checkout;
  :Install uv;
  :Set up Python;
  :Install dependencies;
  :Run tests;
  :Upload test results;
}
stop
@enduml

Nothing found for: Services, Entities, Database.

8. Deployment and operations

The ports, storage, and startup relationships below come from the repository configuration. depends_on records startup order, not service readiness.

9. Types and file structure

1 declared types, with 1 in the base-relationship overview.

Type diagram
classDiagram
direction TB
class t5a13289447b1["TestValidateSQL"] {
  test_select_simple()
  test_select_with_where()
  test_select_with_semicolon()
  test_select_with_whitespace()
}

Unresolved bases remain labelled; full signatures are not reconstructed.

10. Reference

50 / 50 eligible files read (59 in the tree); 0 oversized, 0 failed reads and 0 syntax diagnostics.

What the scan covers

Known dependency/build folders, credential files and binaries are excluded. The scan covers READMEs, recognized manifests and parser-supported source files.

Linguist statistics cover the whole repository and may include other languages.

12. Files to read 3

13. Glossary

Repository

The versioned source files, configuration, and history of a project.

README

The repository’s entry document, usually covering its purpose and initial setup.

Dependency

A library, tool, or service that another component needs to build or run.

HTTP

A request-and-response protocol used by browsers and web services. A method, path, headers, and optional body describe a request.

Container

An isolated process environment created from an image. Persistent data needs storage outside the container’s disposable filesystem.

Published port

A host port mapped to a service’s container port. Publishing a port can expose that service beyond its container network.

CLI

A text interface in which commands and arguments select operations. Exit codes let scripts detect success or failure.

MCP

Model Context Protocol: a protocol through which an AI client discovers and calls tools and reads resources from a server.

Fork

A separate repository derived from another project. A change in a fork is not automatically a change in the upstream project.

14. References

  1. antoinebou12. (2026, November 5). donneesqc-mcp. [Software repository] github.com.
  2. antoinebou12. (2026, November 5). donneesqc-mcp: README. [Repository documentation] github.com.
  3. antoinebou12. (2026, November 5). main.py. [Source file] github.com.
  4. antoinebou12. (2026, November 5). tools/__init__.py. [Source file] github.com.
  5. antoinebou12. (2026, November 5). README.md. [Source file] github.com.
  6. Boucher, A. (2026, October 23). donneesqc-mcp: An MCP gateway to public data. [Project article] antoineboucher.info.

Sources without a publication date show the date they were last checked, November 5, 2026. File links retain the inspected revision where available.