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.
- clevertech_mcp_server-0.1.0/.github/workflows/publish.yml +49 -0
- clevertech_mcp_server-0.1.0/.github/workflows/test.yml +38 -0
- clevertech_mcp_server-0.1.0/.gitignore +30 -0
- clevertech_mcp_server-0.1.0/Dockerfile +22 -0
- clevertech_mcp_server-0.1.0/LICENSE +21 -0
- clevertech_mcp_server-0.1.0/PKG-INFO +232 -0
- clevertech_mcp_server-0.1.0/README.md +210 -0
- clevertech_mcp_server-0.1.0/bin/run.js +24 -0
- clevertech_mcp_server-0.1.0/package.json +15 -0
- clevertech_mcp_server-0.1.0/pyproject.toml +40 -0
- clevertech_mcp_server-0.1.0/railway.toml +12 -0
- clevertech_mcp_server-0.1.0/railway_custom_domain.py +50 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/__init__.py +0 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/auth.py +69 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/client.py +54 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/config.py +35 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/rate_limit.py +100 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/server.py +81 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/__init__.py +53 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/building.py +95 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/business.py +60 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/dls.py +119 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/geo.py +43 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/meta.py +49 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/property.py +167 -0
- clevertech_mcp_server-0.1.0/src/clevertech_mcp/tools/zoning.py +58 -0
- clevertech_mcp_server-0.1.0/tests/__init__.py +0 -0
- clevertech_mcp_server-0.1.0/tests/conftest.py +198 -0
- clevertech_mcp_server-0.1.0/tests/test_auth.py +182 -0
- clevertech_mcp_server-0.1.0/tests/test_building.py +181 -0
- clevertech_mcp_server-0.1.0/tests/test_business.py +164 -0
- clevertech_mcp_server-0.1.0/tests/test_dls.py +197 -0
- clevertech_mcp_server-0.1.0/tests/test_property.py +221 -0
- clevertech_mcp_server-0.1.0/tests/test_server.py +94 -0
- clevertech_mcp_server-0.1.0/tests/test_zoning.py +133 -0
- 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
|
+
[](https://pypi.org/project/clevertech-mcp-server/)
|
|
32
|
+
[](https://www.npmjs.com/package/@clevertech/mcp-server)
|
|
33
|
+
[](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
|
+
[](https://pypi.org/project/clevertech-mcp-server/)
|
|
10
|
+
[](https://www.npmjs.com/package/@clevertech/mcp-server)
|
|
11
|
+
[](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
|