clevertech-mcp-server 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. clevertech_mcp_server-0.1.0/.github/workflows/publish.yml +49 -0
  2. clevertech_mcp_server-0.1.0/.github/workflows/test.yml +38 -0
  3. clevertech_mcp_server-0.1.0/.gitignore +30 -0
  4. clevertech_mcp_server-0.1.0/Dockerfile +22 -0
  5. clevertech_mcp_server-0.1.0/LICENSE +21 -0
  6. clevertech_mcp_server-0.1.0/PKG-INFO +232 -0
  7. clevertech_mcp_server-0.1.0/README.md +210 -0
  8. clevertech_mcp_server-0.1.0/bin/run.js +24 -0
  9. clevertech_mcp_server-0.1.0/package.json +15 -0
  10. clevertech_mcp_server-0.1.0/pyproject.toml +40 -0
  11. clevertech_mcp_server-0.1.0/railway.toml +12 -0
  12. clevertech_mcp_server-0.1.0/railway_custom_domain.py +50 -0
  13. clevertech_mcp_server-0.1.0/src/clevertech_mcp/__init__.py +0 -0
  14. clevertech_mcp_server-0.1.0/src/clevertech_mcp/auth.py +69 -0
  15. clevertech_mcp_server-0.1.0/src/clevertech_mcp/client.py +54 -0
  16. clevertech_mcp_server-0.1.0/src/clevertech_mcp/config.py +35 -0
  17. clevertech_mcp_server-0.1.0/src/clevertech_mcp/rate_limit.py +100 -0
  18. clevertech_mcp_server-0.1.0/src/clevertech_mcp/server.py +81 -0
  19. clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/__init__.py +53 -0
  20. clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/building.py +95 -0
  21. clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/business.py +60 -0
  22. clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/dls.py +119 -0
  23. clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/geo.py +43 -0
  24. clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/meta.py +49 -0
  25. clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/property.py +167 -0
  26. clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/zoning.py +58 -0
  27. clevertech_mcp_server-0.1.0/tests/__init__.py +0 -0
  28. clevertech_mcp_server-0.1.0/tests/conftest.py +198 -0
  29. clevertech_mcp_server-0.1.0/tests/test_auth.py +182 -0
  30. clevertech_mcp_server-0.1.0/tests/test_building.py +181 -0
  31. clevertech_mcp_server-0.1.0/tests/test_business.py +164 -0
  32. clevertech_mcp_server-0.1.0/tests/test_dls.py +197 -0
  33. clevertech_mcp_server-0.1.0/tests/test_property.py +221 -0
  34. clevertech_mcp_server-0.1.0/tests/test_server.py +94 -0
  35. clevertech_mcp_server-0.1.0/tests/test_zoning.py +133 -0
  36. clevertech_mcp_server-0.1.0/uv.lock +805 -0
@@ -0,0 +1,49 @@
1
+ name: Publish
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ jobs:
9
+ pypi-publish:
10
+ name: Build and publish to PyPI
11
+ runs-on: ubuntu-latest
12
+ environment: release
13
+ permissions:
14
+ id-token: write
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+
18
+ - name: Install uv
19
+ uses: astral-sh/setup-uv@v5
20
+ with:
21
+ enable-cache: true
22
+
23
+ - name: Set up Python
24
+ uses: actions/setup-python@v5
25
+ with:
26
+ python-version: '3.12'
27
+
28
+ - name: Build package
29
+ run: uv build
30
+
31
+ - name: Publish to PyPI
32
+ run: uv publish --token ${{ secrets.PYPI_TOKEN }}
33
+
34
+ npm-publish:
35
+ name: Publish npm shim
36
+ runs-on: ubuntu-latest
37
+ needs: pypi-publish
38
+ steps:
39
+ - uses: actions/checkout@v4
40
+
41
+ - uses: actions/setup-node@v4
42
+ with:
43
+ node-version: '20'
44
+ registry-url: 'https://registry.npmjs.org'
45
+
46
+ - name: Publish to npm
47
+ run: npm publish --access public
48
+ env:
49
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -0,0 +1,38 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ name: Python ${{ matrix.python-version }}
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ python-version: ['3.11', '3.12']
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - name: Install uv
22
+ uses: astral-sh/setup-uv@v5
23
+ with:
24
+ enable-cache: true
25
+
26
+ - name: Set up Python ${{ matrix.python-version }}
27
+ uses: actions/setup-python@v5
28
+ with:
29
+ python-version: ${{ matrix.python-version }}
30
+
31
+ - name: Install dependencies
32
+ run: uv sync --all-extras
33
+
34
+ - name: Lint with ruff
35
+ run: uv run ruff check src/ tests/
36
+
37
+ - name: Test with pytest
38
+ run: uv run pytest -v tests/
@@ -0,0 +1,30 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ *.egg-info/
7
+ dist/
8
+ build/
9
+
10
+ # Virtual environments
11
+ .venv/
12
+ env/
13
+ venv/
14
+
15
+ # IDE
16
+ .vscode/
17
+ .idea/
18
+ *.swp
19
+ *.swo
20
+
21
+ # OS
22
+ .DS_Store
23
+ Thumbs.db
24
+
25
+ # Environment
26
+ .env
27
+ .env.local
28
+
29
+ # uv (lockfile is committed for reproducible builds — keep commented)
30
+ # uv.lock
@@ -0,0 +1,22 @@
1
+ FROM python:3.12-slim
2
+
3
+ WORKDIR /app
4
+
5
+ RUN apt-get update && \
6
+ apt-get install -y --no-install-recommends ca-certificates && \
7
+ rm -rf /var/lib/apt/lists/*
8
+
9
+ COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
10
+
11
+ COPY pyproject.toml README.md uv.lock ./
12
+ COPY src/ ./src/
13
+
14
+ RUN uv sync --frozen --no-dev
15
+
16
+ # PORT is set by Railway platform automatically — don't override
17
+ # The CMD defaults to $PORT (from env) or 8001 locally
18
+ ENV LOG_LEVEL=INFO
19
+ ENV TRANSPORT=sse
20
+
21
+ # Use shell form so $PORT from Railway is respected (default 8001 locally)
22
+ CMD uv run clevertech-mcp-server --transport sse --host 0.0.0.0 --port ${PORT:-8001}
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CleverTech
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,232 @@
1
+ Metadata-Version: 2.4
2
+ Name: clevertech-mcp-server
3
+ Version: 0.1.0
4
+ Summary: MCP Server for CleverTech Canadian government data APIs
5
+ Author-email: CleverTech <dev@clevertech.ca>
6
+ License: MIT
7
+ License-File: LICENSE
8
+ Keywords: canada,dls,gis,land-survey,mcp,property
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Requires-Python: >=3.11
15
+ Requires-Dist: httpx>=0.27.0
16
+ Requires-Dist: mcp>=1.0.0
17
+ Requires-Dist: pydantic>=2.0.0
18
+ Requires-Dist: python-dotenv>=1.0.0
19
+ Requires-Dist: starlette>=0.36.0
20
+ Requires-Dist: uvicorn>=0.27.0
21
+ Description-Content-Type: text/markdown
22
+
23
+ # CleverTech MCP Server
24
+
25
+ **Canadian government data for AI agents.** Property assessments, building permits, zoning, business registry, DLS grid conversion — 50 free queries/day, no signup.
26
+
27
+ ```bash
28
+ npx @clevertech/mcp-server
29
+ ```
30
+
31
+ [![PyPI version](https://badge.fury.io/py/clevertech-mcp-server.svg)](https://pypi.org/project/clevertech-mcp-server/)
32
+ [![npm version](https://badge.fury.io/npm/%40clevertech%2Fmcp-server.svg)](https://www.npmjs.com/package/@clevertech/mcp-server)
33
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
34
+
35
+ ---
36
+
37
+ ## Quick Start
38
+
39
+ ### Claude Code
40
+
41
+ Add to your `~/.claude/claude_desktop_config.json`:
42
+
43
+ ```json
44
+ {
45
+ "mcpServers": {
46
+ "clevertech": {
47
+ "command": "npx",
48
+ "args": ["-y", "@clevertech/mcp-server"]
49
+ }
50
+ }
51
+ }
52
+ ```
53
+
54
+ ### Cursor / Cline
55
+
56
+ Add to your MCP configuration:
57
+
58
+ ```json
59
+ {
60
+ "mcpServers": {
61
+ "clevertech": {
62
+ "command": "uvx",
63
+ "args": ["clevertech-mcp-server"]
64
+ }
65
+ }
66
+ }
67
+ ```
68
+
69
+ ### GitHub Copilot
70
+
71
+ ```json
72
+ {
73
+ "mcpServers": {
74
+ "clevertech": {
75
+ "command": "npx",
76
+ "args": ["-y", "@clevertech/mcp-server"]
77
+ }
78
+ }
79
+ }
80
+ ```
81
+
82
+ ### Direct CLI
83
+
84
+ ```bash
85
+ # npm (Node.js)
86
+ npx @clevertech/mcp-server
87
+
88
+ # uv / PyPI
89
+ uvx clevertech-mcp-server
90
+ ```
91
+
92
+ ---
93
+
94
+ ## Available Tools (11)
95
+
96
+ | Tool | Description |
97
+ |------|-------------|
98
+ | `dls_convert` | GPS ↔ Dominion Land Survey (DLS) coordinate conversion for Western Canada |
99
+ | `dls_batch` | Batch GPS ↔ DLS conversion — up to 100 coordinates at once |
100
+ | `property_search` | Property assessment search by address across 13+ Canadian cities |
101
+ | `property_report` | Consolidated property report — assessment, permits, zoning, and DLS in one call |
102
+ | `property_by_roll` | Direct property lookup by roll number — faster than address search |
103
+ | `building_permit_search` | Building permit search by address, contractor, applicant, or permit number |
104
+ | `building_permit_recent` | Recently issued building permits feed — monitor new construction activity |
105
+ | `zoning_lookup` | Zoning district lookup by GPS coordinates or street address |
106
+ | `business_registry_search` | Federal corporation search — find Canadian businesses by name, province, or city |
107
+ | `reverse_geocode` | GPS → address, city, neighborhood, province, and DLS grid reference |
108
+ | `list_cities` | Discover available cities, their API capabilities, and property counts |
109
+
110
+ ### What Agents Can Do
111
+
112
+ - **Ask**: *"What's 1532 14 Ave SW in Calgary worth?"* — Gets assessed value, land value, building value, year built, lot size, and DLS coordinates.
113
+ - **Ask**: *"Show me recent building permits in Vancouver"* — Returns the latest construction permits with type, value, status, and issue dates.
114
+ - **Ask**: *"What zone is this GPS point in?"* — Looks up zoning district, land use, and boundary info.
115
+ - **Ask**: *"Convert these 50 GPS points to DLS"* — Batch converts in a single API call.
116
+ - **Ask**: *"Is Shopify still an active corporation?"* — Searches the federal business registry.
117
+
118
+ ---
119
+
120
+ ## Cities Supported
121
+
122
+ **20 cities** across Canada — and growing:
123
+
124
+ | Province | Cities |
125
+ |----------|--------|
126
+ | Alberta | Calgary, Edmonton, High River |
127
+ | British Columbia | Vancouver, Victoria |
128
+ | Ontario | Toronto, Ottawa, Hamilton, Kitchener, London, Mississauga, Markham, Vaughan |
129
+ | Quebec | Montreal, Quebec City |
130
+ | Manitoba | Winnipeg |
131
+ | Saskatchewan | Saskatoon, Regina |
132
+ | Nova Scotia | Halifax |
133
+ | Newfoundland | St. John's |
134
+
135
+ Use `list_cities` to see live availability, API capabilities per city, and property counts.
136
+
137
+ ---
138
+
139
+ ## Pricing
140
+
141
+ No signup required to start. Free tier gives you 50 queries/day out of the box.
142
+
143
+ | Tier | Queries/Day | Price | API Key |
144
+ |------|-------------|-------|---------|
145
+ | **Free** | 50 | $0 | Not required |
146
+ | **Developer** | 200 | Free | [Sign up →](https://clevertech.ca/keys) |
147
+ | **Pro** | 2,000 | $10/mo | [Sign up →](https://clevertech.ca/keys) |
148
+ | **Enterprise** | 10,000 | $40/mo | [Sign up →](https://clevertech.ca/keys) |
149
+
150
+ [Get your API key →](https://clevertech.ca/keys)
151
+
152
+ ### Using an API Key
153
+
154
+ ```bash
155
+ npx @clevertech/mcp-server --api-key YOUR_KEY
156
+ ```
157
+
158
+ Or via environment variable:
159
+
160
+ ```bash
161
+ export CLEVERTECH_API_KEY=your_key_here
162
+ npx @clevertech/mcp-server
163
+ ```
164
+
165
+ ---
166
+
167
+ ## Features
168
+
169
+ - **No signup required** — 50 free queries/day out of the box
170
+ - **11 MCP tools** covering property, permits, zoning, business registry, and DLS
171
+ - **Batch DLS conversion** — convert up to 100 coordinates in one call
172
+ - **Consolidated property reports** — assessment + permits + zoning + DLS in a single response
173
+ - **stdio + SSE transport** — works with Claude Code, Cursor, Cline, GitHub Copilot, and any MCP-compatible agent
174
+ - **Clean text output** — formatted for easy LLM parsing and reformatting
175
+ - **20 Canadian cities** — urban and rural coverage with regular additions
176
+ - **MIT licensed** — use it anywhere, no restrictions
177
+
178
+ ---
179
+
180
+ ## Development
181
+
182
+ ```bash
183
+ # Clone and set up
184
+ git clone https://github.com/anteriorclever/clevertech-mcp-server.git
185
+ cd clevertech-mcp-server
186
+ uv sync
187
+
188
+ # Run locally (stdio transport)
189
+ uv run clevertech-mcp-server --transport stdio
190
+
191
+ # Run with SSE transport (for HTTP-based agents)
192
+ uv run clevertech-mcp-server --transport sse --port 8000
193
+ ```
194
+
195
+ ### Run Tests
196
+
197
+ ```bash
198
+ uv run pytest
199
+ ```
200
+
201
+ ### Project Structure
202
+
203
+ ```
204
+ src/clevertech_mcp/
205
+ ├── tools/
206
+ │ ├── property.py # property_search, property_report, property_by_roll
207
+ │ ├── building.py # building_permit_search, building_permit_recent
208
+ │ ├── zoning.py # zoning_lookup
209
+ │ ├── dls.py # dls_convert, dls_batch
210
+ │ ├── business.py # business_registry_search
211
+ │ ├── geo.py # reverse_geocode
212
+ │ └── meta.py # list_cities
213
+ ├── server.py # FastMCP server entry point
214
+ ├── client.py # HTTP client for CleverTech API
215
+ ├── auth.py # API key authentication
216
+ ├── rate_limit.py # Rate limiting
217
+ └── config.py # Configuration management
218
+ ```
219
+
220
+ ---
221
+
222
+ ## Documentation
223
+
224
+ - [Tool Reference](docs/tools.md)
225
+ - [MCP Protocol Specification](https://modelcontextprotocol.io)
226
+ - [CleverTech API Keys](https://clevertech.ca/keys)
227
+
228
+ ---
229
+
230
+ ## License
231
+
232
+ MIT © 2026 CleverTech — see [LICENSE](LICENSE) for details.
@@ -0,0 +1,210 @@
1
+ # CleverTech MCP Server
2
+
3
+ **Canadian government data for AI agents.** Property assessments, building permits, zoning, business registry, DLS grid conversion — 50 free queries/day, no signup.
4
+
5
+ ```bash
6
+ npx @clevertech/mcp-server
7
+ ```
8
+
9
+ [![PyPI version](https://badge.fury.io/py/clevertech-mcp-server.svg)](https://pypi.org/project/clevertech-mcp-server/)
10
+ [![npm version](https://badge.fury.io/npm/%40clevertech%2Fmcp-server.svg)](https://www.npmjs.com/package/@clevertech/mcp-server)
11
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
12
+
13
+ ---
14
+
15
+ ## Quick Start
16
+
17
+ ### Claude Code
18
+
19
+ Add to your `~/.claude/claude_desktop_config.json`:
20
+
21
+ ```json
22
+ {
23
+ "mcpServers": {
24
+ "clevertech": {
25
+ "command": "npx",
26
+ "args": ["-y", "@clevertech/mcp-server"]
27
+ }
28
+ }
29
+ }
30
+ ```
31
+
32
+ ### Cursor / Cline
33
+
34
+ Add to your MCP configuration:
35
+
36
+ ```json
37
+ {
38
+ "mcpServers": {
39
+ "clevertech": {
40
+ "command": "uvx",
41
+ "args": ["clevertech-mcp-server"]
42
+ }
43
+ }
44
+ }
45
+ ```
46
+
47
+ ### GitHub Copilot
48
+
49
+ ```json
50
+ {
51
+ "mcpServers": {
52
+ "clevertech": {
53
+ "command": "npx",
54
+ "args": ["-y", "@clevertech/mcp-server"]
55
+ }
56
+ }
57
+ }
58
+ ```
59
+
60
+ ### Direct CLI
61
+
62
+ ```bash
63
+ # npm (Node.js)
64
+ npx @clevertech/mcp-server
65
+
66
+ # uv / PyPI
67
+ uvx clevertech-mcp-server
68
+ ```
69
+
70
+ ---
71
+
72
+ ## Available Tools (11)
73
+
74
+ | Tool | Description |
75
+ |------|-------------|
76
+ | `dls_convert` | GPS ↔ Dominion Land Survey (DLS) coordinate conversion for Western Canada |
77
+ | `dls_batch` | Batch GPS ↔ DLS conversion — up to 100 coordinates at once |
78
+ | `property_search` | Property assessment search by address across 13+ Canadian cities |
79
+ | `property_report` | Consolidated property report — assessment, permits, zoning, and DLS in one call |
80
+ | `property_by_roll` | Direct property lookup by roll number — faster than address search |
81
+ | `building_permit_search` | Building permit search by address, contractor, applicant, or permit number |
82
+ | `building_permit_recent` | Recently issued building permits feed — monitor new construction activity |
83
+ | `zoning_lookup` | Zoning district lookup by GPS coordinates or street address |
84
+ | `business_registry_search` | Federal corporation search — find Canadian businesses by name, province, or city |
85
+ | `reverse_geocode` | GPS → address, city, neighborhood, province, and DLS grid reference |
86
+ | `list_cities` | Discover available cities, their API capabilities, and property counts |
87
+
88
+ ### What Agents Can Do
89
+
90
+ - **Ask**: *"What's 1532 14 Ave SW in Calgary worth?"* — Gets assessed value, land value, building value, year built, lot size, and DLS coordinates.
91
+ - **Ask**: *"Show me recent building permits in Vancouver"* — Returns the latest construction permits with type, value, status, and issue dates.
92
+ - **Ask**: *"What zone is this GPS point in?"* — Looks up zoning district, land use, and boundary info.
93
+ - **Ask**: *"Convert these 50 GPS points to DLS"* — Batch converts in a single API call.
94
+ - **Ask**: *"Is Shopify still an active corporation?"* — Searches the federal business registry.
95
+
96
+ ---
97
+
98
+ ## Cities Supported
99
+
100
+ **20 cities** across Canada — and growing:
101
+
102
+ | Province | Cities |
103
+ |----------|--------|
104
+ | Alberta | Calgary, Edmonton, High River |
105
+ | British Columbia | Vancouver, Victoria |
106
+ | Ontario | Toronto, Ottawa, Hamilton, Kitchener, London, Mississauga, Markham, Vaughan |
107
+ | Quebec | Montreal, Quebec City |
108
+ | Manitoba | Winnipeg |
109
+ | Saskatchewan | Saskatoon, Regina |
110
+ | Nova Scotia | Halifax |
111
+ | Newfoundland | St. John's |
112
+
113
+ Use `list_cities` to see live availability, API capabilities per city, and property counts.
114
+
115
+ ---
116
+
117
+ ## Pricing
118
+
119
+ No signup required to start. Free tier gives you 50 queries/day out of the box.
120
+
121
+ | Tier | Queries/Day | Price | API Key |
122
+ |------|-------------|-------|---------|
123
+ | **Free** | 50 | $0 | Not required |
124
+ | **Developer** | 200 | Free | [Sign up →](https://clevertech.ca/keys) |
125
+ | **Pro** | 2,000 | $10/mo | [Sign up →](https://clevertech.ca/keys) |
126
+ | **Enterprise** | 10,000 | $40/mo | [Sign up →](https://clevertech.ca/keys) |
127
+
128
+ [Get your API key →](https://clevertech.ca/keys)
129
+
130
+ ### Using an API Key
131
+
132
+ ```bash
133
+ npx @clevertech/mcp-server --api-key YOUR_KEY
134
+ ```
135
+
136
+ Or via environment variable:
137
+
138
+ ```bash
139
+ export CLEVERTECH_API_KEY=your_key_here
140
+ npx @clevertech/mcp-server
141
+ ```
142
+
143
+ ---
144
+
145
+ ## Features
146
+
147
+ - **No signup required** — 50 free queries/day out of the box
148
+ - **11 MCP tools** covering property, permits, zoning, business registry, and DLS
149
+ - **Batch DLS conversion** — convert up to 100 coordinates in one call
150
+ - **Consolidated property reports** — assessment + permits + zoning + DLS in a single response
151
+ - **stdio + SSE transport** — works with Claude Code, Cursor, Cline, GitHub Copilot, and any MCP-compatible agent
152
+ - **Clean text output** — formatted for easy LLM parsing and reformatting
153
+ - **20 Canadian cities** — urban and rural coverage with regular additions
154
+ - **MIT licensed** — use it anywhere, no restrictions
155
+
156
+ ---
157
+
158
+ ## Development
159
+
160
+ ```bash
161
+ # Clone and set up
162
+ git clone https://github.com/anteriorclever/clevertech-mcp-server.git
163
+ cd clevertech-mcp-server
164
+ uv sync
165
+
166
+ # Run locally (stdio transport)
167
+ uv run clevertech-mcp-server --transport stdio
168
+
169
+ # Run with SSE transport (for HTTP-based agents)
170
+ uv run clevertech-mcp-server --transport sse --port 8000
171
+ ```
172
+
173
+ ### Run Tests
174
+
175
+ ```bash
176
+ uv run pytest
177
+ ```
178
+
179
+ ### Project Structure
180
+
181
+ ```
182
+ src/clevertech_mcp/
183
+ ├── tools/
184
+ │ ├── property.py # property_search, property_report, property_by_roll
185
+ │ ├── building.py # building_permit_search, building_permit_recent
186
+ │ ├── zoning.py # zoning_lookup
187
+ │ ├── dls.py # dls_convert, dls_batch
188
+ │ ├── business.py # business_registry_search
189
+ │ ├── geo.py # reverse_geocode
190
+ │ └── meta.py # list_cities
191
+ ├── server.py # FastMCP server entry point
192
+ ├── client.py # HTTP client for CleverTech API
193
+ ├── auth.py # API key authentication
194
+ ├── rate_limit.py # Rate limiting
195
+ └── config.py # Configuration management
196
+ ```
197
+
198
+ ---
199
+
200
+ ## Documentation
201
+
202
+ - [Tool Reference](docs/tools.md)
203
+ - [MCP Protocol Specification](https://modelcontextprotocol.io)
204
+ - [CleverTech API Keys](https://clevertech.ca/keys)
205
+
206
+ ---
207
+
208
+ ## License
209
+
210
+ MIT © 2026 CleverTech — see [LICENSE](LICENSE) for details.
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ const { execSync, spawn } = require('child_process');
3
+ const path = require('path');
4
+
5
+ function checkCommand(cmd) {
6
+ try { execSync(`which ${cmd}`, { stdio: 'ignore' }); return true; }
7
+ catch { return false; }
8
+ }
9
+
10
+ if (!checkCommand('python3') && !checkCommand('python')) {
11
+ console.error('Python 3.11+ is required. Install from https://python.org');
12
+ process.exit(1);
13
+ }
14
+ if (!checkCommand('uv') && !checkCommand('uvx')) {
15
+ console.error('uv is required. Install: curl -LsSf https://astral.sh/uv/install.sh | sh');
16
+ process.exit(1);
17
+ }
18
+
19
+ const args = process.argv.slice(2);
20
+ const child = spawn('uvx', ['clevertech-mcp-server', ...args], {
21
+ stdio: 'inherit',
22
+ env: process.env
23
+ });
24
+ child.on('exit', code => process.exit(code));
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "@clevertech/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "MCP Server for CleverTech Canadian government data APIs — property assessments, building permits, zoning, DLS grid conversion, business registry.",
5
+ "bin": {
6
+ "clevertech-mcp-server": "./bin/run.js"
7
+ },
8
+ "files": ["bin/", "README.md"],
9
+ "keywords": ["mcp", "clevertech", "canada", "property", "assessment", "dls", "building-permits", "zoning", "real-estate", "gis"],
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/anteriorclever/clevertech-mcp-server.git"
13
+ },
14
+ "license": "MIT"
15
+ }
@@ -0,0 +1,40 @@
1
+ [project]
2
+ name = "clevertech-mcp-server"
3
+ version = "0.1.0"
4
+ description = "MCP Server for CleverTech Canadian government data APIs"
5
+ readme = "README.md"
6
+ requires-python = ">=3.11"
7
+ license = {text = "MIT"}
8
+ authors = [{name = "CleverTech", email = "dev@clevertech.ca"}]
9
+ keywords = ["mcp", "canada", "property", "land-survey", "dls", "gis"]
10
+ classifiers = [
11
+ "Development Status :: 3 - Alpha",
12
+ "Intended Audience :: Developers",
13
+ "License :: OSI Approved :: MIT License",
14
+ "Programming Language :: Python :: 3.12",
15
+ "Programming Language :: Python :: 3.11",
16
+ ]
17
+ dependencies = [
18
+ "mcp>=1.0.0",
19
+ "httpx>=0.27.0",
20
+ "pydantic>=2.0.0",
21
+ "python-dotenv>=1.0.0",
22
+ "starlette>=0.36.0",
23
+ "uvicorn>=0.27.0",
24
+ ]
25
+
26
+ [project.scripts]
27
+ clevertech-mcp-server = "clevertech_mcp.server:main"
28
+
29
+ [build-system]
30
+ requires = ["hatchling"]
31
+ build-backend = "hatchling.build"
32
+
33
+ [tool.hatch.build.targets.wheel]
34
+ packages = ["src/clevertech_mcp"]
35
+
36
+ [dependency-groups]
37
+ dev = [
38
+ "pytest>=9.0.3",
39
+ "pytest-asyncio>=1.4.0",
40
+ ]
@@ -0,0 +1,12 @@
1
+ [deploy]
2
+ healthcheckPath = "/health"
3
+ healthcheckTimeout = 120
4
+ restartPolicyType = "ON_FAILURE"
5
+ restartPolicyMaxRetries = 3
6
+
7
+ # Environment variables set in Railway dashboard:
8
+ # CLEVERTECH_API_URL = https://clevertech.ca
9
+ # CLEVERTECH_API_KEY = ctk_mcp_svc_... (internal server key)
10
+ # TRANSPORT = sse
11
+ # LOG_LEVEL = INFO
12
+ # RATE_LIMIT_ANON_DAILY = 50