trellio-mcp 0.1.1__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.
- trellio_mcp-0.1.1/PKG-INFO +276 -0
- trellio_mcp-0.1.1/README.md +250 -0
- trellio_mcp-0.1.1/pyproject.toml +46 -0
- trellio_mcp-0.1.1/setup.cfg +4 -0
- trellio_mcp-0.1.1/src/trellio_mcp.egg-info/PKG-INFO +276 -0
- trellio_mcp-0.1.1/src/trellio_mcp.egg-info/SOURCES.txt +26 -0
- trellio_mcp-0.1.1/src/trellio_mcp.egg-info/dependency_links.txt +1 -0
- trellio_mcp-0.1.1/src/trellio_mcp.egg-info/entry_points.txt +2 -0
- trellio_mcp-0.1.1/src/trellio_mcp.egg-info/requires.txt +5 -0
- trellio_mcp-0.1.1/src/trellio_mcp.egg-info/top_level.txt +1 -0
- trellio_mcp-0.1.1/src/trello_mcp/__init__.py +14 -0
- trellio_mcp-0.1.1/src/trello_mcp/__main__.py +14 -0
- trellio_mcp-0.1.1/src/trello_mcp/auth.py +154 -0
- trellio_mcp-0.1.1/src/trello_mcp/errors.py +18 -0
- trellio_mcp-0.1.1/src/trello_mcp/prompts.py +44 -0
- trellio_mcp-0.1.1/src/trello_mcp/resources.py +48 -0
- trellio_mcp-0.1.1/src/trello_mcp/server.py +26 -0
- trellio_mcp-0.1.1/src/trello_mcp/tools/__init__.py +0 -0
- trellio_mcp-0.1.1/src/trello_mcp/tools/attachments.py +38 -0
- trellio_mcp-0.1.1/src/trello_mcp/tools/boards.py +87 -0
- trellio_mcp-0.1.1/src/trello_mcp/tools/cards.py +101 -0
- trellio_mcp-0.1.1/src/trello_mcp/tools/checklists.py +67 -0
- trellio_mcp-0.1.1/src/trello_mcp/tools/comments.py +45 -0
- trellio_mcp-0.1.1/src/trello_mcp/tools/labels.py +50 -0
- trellio_mcp-0.1.1/src/trello_mcp/tools/lists.py +48 -0
- trellio_mcp-0.1.1/src/trello_mcp/tools/members.py +42 -0
- trellio_mcp-0.1.1/src/trello_mcp/tools/search.py +22 -0
- trellio_mcp-0.1.1/src/trello_mcp/tools/webhooks.py +77 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: trellio-mcp
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: MCP server for Trello — manage boards, lists, cards, labels, checklists and more
|
|
5
|
+
Author: scaratec
|
|
6
|
+
License: GPL-3.0-or-later
|
|
7
|
+
Project-URL: Homepage, https://github.com/scaratec/trellio-mcp
|
|
8
|
+
Project-URL: Repository, https://github.com/scaratec/trellio-mcp
|
|
9
|
+
Project-URL: Issues, https://github.com/scaratec/trellio-mcp/issues
|
|
10
|
+
Keywords: trello,mcp,model-context-protocol,claude,gemini,ai
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
Requires-Dist: mcp>=1.12.0
|
|
23
|
+
Requires-Dist: trellio-client>=1.0.0
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: behave>=1.2.6; extra == "dev"
|
|
26
|
+
|
|
27
|
+
# trellio-mcp — MCP Server for Trello
|
|
28
|
+
|
|
29
|
+
[](https://www.gnu.org/licenses/gpl-3.0)
|
|
30
|
+
[](https://www.python.org/downloads/)
|
|
31
|
+
[](https://modelcontextprotocol.io)
|
|
32
|
+
|
|
33
|
+
An MCP server that gives Claude Desktop, Claude Code, and
|
|
34
|
+
Gemini CLI full access to the Trello API. Built on the
|
|
35
|
+
[trellio](https://github.com/scaratec/trellio) async client
|
|
36
|
+
library and the official Python MCP SDK. Developed following
|
|
37
|
+
the [BDD Guidelines v1.8.0](https://github.com/scaratec/burn-your-code).
|
|
38
|
+
|
|
39
|
+
## Features
|
|
40
|
+
|
|
41
|
+
- **40 MCP tools** — 1:1 mapping to trellio methods, plus
|
|
42
|
+
one composite `get_board_overview` tool
|
|
43
|
+
- **2 resource templates** — `trello://board/{id}` and
|
|
44
|
+
`trello://card/{id}` for rich context loading
|
|
45
|
+
- **3 prompts** — `summarize_board`, `create_sprint`,
|
|
46
|
+
`daily_standup` as workflow shortcuts
|
|
47
|
+
- **Built-in auth flow** — `python -m trello_mcp auth` opens
|
|
48
|
+
the browser, user clicks "Allow", token stored securely
|
|
49
|
+
- **Structured error handling** — Trello API errors are
|
|
50
|
+
translated into clear, actionable MCP error messages
|
|
51
|
+
- **stdio transport** — runs as a local subprocess, no
|
|
52
|
+
network surface
|
|
53
|
+
|
|
54
|
+
## Tools
|
|
55
|
+
|
|
56
|
+
| Category | Tools | Count |
|
|
57
|
+
|-------------|-------|-------|
|
|
58
|
+
| Discovery | `list_boards`, `search` | 2 |
|
|
59
|
+
| Boards | `get_board_overview`, `create_board`, `get_board`, `update_board`, `delete_board` | 5 |
|
|
60
|
+
| Lists | `list_lists`, `create_list` | 2 |
|
|
61
|
+
| Cards | `list_cards`, `create_card`, `get_card`, `update_card`, `delete_card`, `add_label_to_card`, `remove_label_from_card` | 7 |
|
|
62
|
+
| Labels | `list_board_labels`, `create_label`, `update_label`, `delete_label` | 4 |
|
|
63
|
+
| Checklists | `list_card_checklists`, `create_checklist`, `delete_checklist`, `create_check_item`, `update_check_item`, `delete_check_item` | 6 |
|
|
64
|
+
| Comments | `list_comments`, `add_comment`, `update_comment`, `delete_comment` | 4 |
|
|
65
|
+
| Members | `get_me`, `list_board_members`, `get_member` | 3 |
|
|
66
|
+
| Attachments | `list_attachments`, `create_attachment`, `delete_attachment` | 3 |
|
|
67
|
+
| Webhooks | `list_webhooks`, `create_webhook`, `get_webhook`, `update_webhook`, `delete_webhook` | 5 |
|
|
68
|
+
|
|
69
|
+
Card tools support `pos` (top/bottom), `idLabels`
|
|
70
|
+
(comma-separated), `due` (ISO 8601), and `dueComplete`
|
|
71
|
+
(true/false) on create and update.
|
|
72
|
+
|
|
73
|
+
## Prerequisites
|
|
74
|
+
|
|
75
|
+
- Python 3.10+
|
|
76
|
+
- A [Trello API Key](https://trello.com/power-ups/admin)
|
|
77
|
+
(add `http://localhost:8095` to Allowed Origins)
|
|
78
|
+
|
|
79
|
+
## Installation
|
|
80
|
+
|
|
81
|
+
### From PyPI (recommended)
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
pip install trellio-mcp
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Or run without installing via `pipx` or `uvx`:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
pipx run trellio-mcp
|
|
91
|
+
uvx trellio-mcp
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### From source
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
git clone https://github.com/scaratec/trellio-mcp.git
|
|
98
|
+
cd trellio-mcp
|
|
99
|
+
python3 -m venv .venv
|
|
100
|
+
.venv/bin/pip install -e ".[dev]"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Authentication
|
|
104
|
+
|
|
105
|
+
### Interactive (recommended)
|
|
106
|
+
|
|
107
|
+
Run the auth command on each machine:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
TRELLO_API_KEY=your_api_key trellio-mcp auth
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
If using `pipx run`:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
TRELLO_API_KEY=your_api_key pipx run trellio-mcp auth
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
This opens a browser where you authorize the app. The token
|
|
120
|
+
is captured automatically and stored in
|
|
121
|
+
`~/.config/trellio-mcp/credentials.json` (permissions 0600).
|
|
122
|
+
|
|
123
|
+
After auth, no environment variables are needed — the server
|
|
124
|
+
reads stored credentials on startup.
|
|
125
|
+
|
|
126
|
+
### Environment Variables (fallback)
|
|
127
|
+
|
|
128
|
+
If no stored credentials are found, the server falls back to
|
|
129
|
+
environment variables:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
export TRELLO_API_KEY=your_api_key
|
|
133
|
+
export TRELLO_TOKEN=your_token
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## MCP Client Configuration
|
|
137
|
+
|
|
138
|
+
### Claude Desktop
|
|
139
|
+
|
|
140
|
+
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
141
|
+
(macOS) or `%APPDATA%\Claude\claude_desktop_config.json`
|
|
142
|
+
(Windows):
|
|
143
|
+
|
|
144
|
+
```json
|
|
145
|
+
{
|
|
146
|
+
"mcpServers": {
|
|
147
|
+
"trello": {
|
|
148
|
+
"command": "pipx",
|
|
149
|
+
"args": ["run", "trellio-mcp"]
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
If using env var auth instead of stored credentials, add:
|
|
156
|
+
|
|
157
|
+
```json
|
|
158
|
+
"env": {
|
|
159
|
+
"TRELLO_API_KEY": "your_api_key",
|
|
160
|
+
"TRELLO_TOKEN": "your_token"
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Claude Code
|
|
165
|
+
|
|
166
|
+
Add to `~/.claude/settings.json` or project
|
|
167
|
+
`.claude/settings.json`:
|
|
168
|
+
|
|
169
|
+
```json
|
|
170
|
+
{
|
|
171
|
+
"mcpServers": {
|
|
172
|
+
"trello": {
|
|
173
|
+
"command": "pipx",
|
|
174
|
+
"args": ["run", "trellio-mcp"]
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Gemini CLI
|
|
181
|
+
|
|
182
|
+
Add to `~/.gemini/settings.json`:
|
|
183
|
+
|
|
184
|
+
```json
|
|
185
|
+
{
|
|
186
|
+
"mcpServers": {
|
|
187
|
+
"trello": {
|
|
188
|
+
"command": "pipx",
|
|
189
|
+
"args": ["run", "trellio-mcp"]
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## Architecture
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
MCP Client (Claude / Gemini)
|
|
199
|
+
│ stdio (JSON-RPC)
|
|
200
|
+
▼
|
|
201
|
+
trellio-mcp (FastMCP)
|
|
202
|
+
│ async/await
|
|
203
|
+
▼
|
|
204
|
+
trellio (httpx)
|
|
205
|
+
│ HTTPS
|
|
206
|
+
▼
|
|
207
|
+
Trello API
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**Key decisions** (documented in `docs/adr/`):
|
|
211
|
+
|
|
212
|
+
| ADR | Decision |
|
|
213
|
+
|-----|----------|
|
|
214
|
+
| 001 | Python MCP SDK for language alignment with trellio |
|
|
215
|
+
| 002 | stdio transport — no network attack surface |
|
|
216
|
+
| 003 | Stored credentials with env var fallback |
|
|
217
|
+
| 004 | 1:1 tool mapping — one tool per trellio method |
|
|
218
|
+
| 005 | trellio as Git dependency pinned to v1.0.0 |
|
|
219
|
+
| 006 | Tools + Resources + Prompts as MCP capabilities |
|
|
220
|
+
| 007 | `isError=true` + structured error content |
|
|
221
|
+
|
|
222
|
+
## Testing
|
|
223
|
+
|
|
224
|
+
The project uses BDD with
|
|
225
|
+
[behave](https://behave.readthedocs.io/), following the
|
|
226
|
+
[BDD Guidelines v1.8.0](https://github.com/scaratec/burn-your-code).
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
PYTHONPATH=src .venv/bin/python -m behave
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
15 features passed, 0 failed, 0 skipped
|
|
234
|
+
122 scenarios passed, 0 failed, 0 skipped
|
|
235
|
+
732 steps passed, 0 failed, 0 skipped
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
Test architecture:
|
|
239
|
+
- `AsyncMock(spec=TrellioClient)` — mock at the client
|
|
240
|
+
boundary, not HTTP
|
|
241
|
+
- Persistence validation via mock call records (§4.3)
|
|
242
|
+
- Anti-hardcoding via Scenario Outlines with >= 2 variants
|
|
243
|
+
(§2.3)
|
|
244
|
+
- Layer-by-layer failure path enumeration: 11 error scenarios
|
|
245
|
+
(§4.5)
|
|
246
|
+
- Independent spec audit per §13
|
|
247
|
+
|
|
248
|
+
See [Case Study](docs/case-study-bdd-mcp-server.md) for a
|
|
249
|
+
detailed account of the BDD-driven development process.
|
|
250
|
+
|
|
251
|
+
## Project Structure
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
trellio-mcp/
|
|
255
|
+
├── src/trello_mcp/
|
|
256
|
+
│ ├── __init__.py # Tool registration
|
|
257
|
+
│ ├── __main__.py # Entry point (server + auth)
|
|
258
|
+
│ ├── server.py # FastMCP instance + client mgmt
|
|
259
|
+
│ ├── auth.py # OAuth flow + credential storage
|
|
260
|
+
│ ├── errors.py # Error translation (ADR 007)
|
|
261
|
+
│ ├── tools/ # 10 modules, 40 tools
|
|
262
|
+
│ ├── resources.py # 2 resource templates
|
|
263
|
+
│ └── prompts.py # 3 prompts
|
|
264
|
+
├── features/ # 15 BDD feature files
|
|
265
|
+
│ └── steps/ # Step definitions
|
|
266
|
+
├── docs/
|
|
267
|
+
│ ├── adr/ # 7 Architecture Decision Records
|
|
268
|
+
│ ├── tool-design.md # Scenario-driven tool analysis
|
|
269
|
+
│ └── case-study-bdd-mcp-server.md
|
|
270
|
+
└── pyproject.toml
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## License
|
|
274
|
+
|
|
275
|
+
This project is licensed under the GNU General Public License
|
|
276
|
+
v3.0 — see the [LICENSE](LICENSE) file for details.
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
# trellio-mcp — MCP Server for Trello
|
|
2
|
+
|
|
3
|
+
[](https://www.gnu.org/licenses/gpl-3.0)
|
|
4
|
+
[](https://www.python.org/downloads/)
|
|
5
|
+
[](https://modelcontextprotocol.io)
|
|
6
|
+
|
|
7
|
+
An MCP server that gives Claude Desktop, Claude Code, and
|
|
8
|
+
Gemini CLI full access to the Trello API. Built on the
|
|
9
|
+
[trellio](https://github.com/scaratec/trellio) async client
|
|
10
|
+
library and the official Python MCP SDK. Developed following
|
|
11
|
+
the [BDD Guidelines v1.8.0](https://github.com/scaratec/burn-your-code).
|
|
12
|
+
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
- **40 MCP tools** — 1:1 mapping to trellio methods, plus
|
|
16
|
+
one composite `get_board_overview` tool
|
|
17
|
+
- **2 resource templates** — `trello://board/{id}` and
|
|
18
|
+
`trello://card/{id}` for rich context loading
|
|
19
|
+
- **3 prompts** — `summarize_board`, `create_sprint`,
|
|
20
|
+
`daily_standup` as workflow shortcuts
|
|
21
|
+
- **Built-in auth flow** — `python -m trello_mcp auth` opens
|
|
22
|
+
the browser, user clicks "Allow", token stored securely
|
|
23
|
+
- **Structured error handling** — Trello API errors are
|
|
24
|
+
translated into clear, actionable MCP error messages
|
|
25
|
+
- **stdio transport** — runs as a local subprocess, no
|
|
26
|
+
network surface
|
|
27
|
+
|
|
28
|
+
## Tools
|
|
29
|
+
|
|
30
|
+
| Category | Tools | Count |
|
|
31
|
+
|-------------|-------|-------|
|
|
32
|
+
| Discovery | `list_boards`, `search` | 2 |
|
|
33
|
+
| Boards | `get_board_overview`, `create_board`, `get_board`, `update_board`, `delete_board` | 5 |
|
|
34
|
+
| Lists | `list_lists`, `create_list` | 2 |
|
|
35
|
+
| Cards | `list_cards`, `create_card`, `get_card`, `update_card`, `delete_card`, `add_label_to_card`, `remove_label_from_card` | 7 |
|
|
36
|
+
| Labels | `list_board_labels`, `create_label`, `update_label`, `delete_label` | 4 |
|
|
37
|
+
| Checklists | `list_card_checklists`, `create_checklist`, `delete_checklist`, `create_check_item`, `update_check_item`, `delete_check_item` | 6 |
|
|
38
|
+
| Comments | `list_comments`, `add_comment`, `update_comment`, `delete_comment` | 4 |
|
|
39
|
+
| Members | `get_me`, `list_board_members`, `get_member` | 3 |
|
|
40
|
+
| Attachments | `list_attachments`, `create_attachment`, `delete_attachment` | 3 |
|
|
41
|
+
| Webhooks | `list_webhooks`, `create_webhook`, `get_webhook`, `update_webhook`, `delete_webhook` | 5 |
|
|
42
|
+
|
|
43
|
+
Card tools support `pos` (top/bottom), `idLabels`
|
|
44
|
+
(comma-separated), `due` (ISO 8601), and `dueComplete`
|
|
45
|
+
(true/false) on create and update.
|
|
46
|
+
|
|
47
|
+
## Prerequisites
|
|
48
|
+
|
|
49
|
+
- Python 3.10+
|
|
50
|
+
- A [Trello API Key](https://trello.com/power-ups/admin)
|
|
51
|
+
(add `http://localhost:8095` to Allowed Origins)
|
|
52
|
+
|
|
53
|
+
## Installation
|
|
54
|
+
|
|
55
|
+
### From PyPI (recommended)
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
pip install trellio-mcp
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Or run without installing via `pipx` or `uvx`:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pipx run trellio-mcp
|
|
65
|
+
uvx trellio-mcp
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### From source
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
git clone https://github.com/scaratec/trellio-mcp.git
|
|
72
|
+
cd trellio-mcp
|
|
73
|
+
python3 -m venv .venv
|
|
74
|
+
.venv/bin/pip install -e ".[dev]"
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Authentication
|
|
78
|
+
|
|
79
|
+
### Interactive (recommended)
|
|
80
|
+
|
|
81
|
+
Run the auth command on each machine:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
TRELLO_API_KEY=your_api_key trellio-mcp auth
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
If using `pipx run`:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
TRELLO_API_KEY=your_api_key pipx run trellio-mcp auth
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
This opens a browser where you authorize the app. The token
|
|
94
|
+
is captured automatically and stored in
|
|
95
|
+
`~/.config/trellio-mcp/credentials.json` (permissions 0600).
|
|
96
|
+
|
|
97
|
+
After auth, no environment variables are needed — the server
|
|
98
|
+
reads stored credentials on startup.
|
|
99
|
+
|
|
100
|
+
### Environment Variables (fallback)
|
|
101
|
+
|
|
102
|
+
If no stored credentials are found, the server falls back to
|
|
103
|
+
environment variables:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
export TRELLO_API_KEY=your_api_key
|
|
107
|
+
export TRELLO_TOKEN=your_token
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## MCP Client Configuration
|
|
111
|
+
|
|
112
|
+
### Claude Desktop
|
|
113
|
+
|
|
114
|
+
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
115
|
+
(macOS) or `%APPDATA%\Claude\claude_desktop_config.json`
|
|
116
|
+
(Windows):
|
|
117
|
+
|
|
118
|
+
```json
|
|
119
|
+
{
|
|
120
|
+
"mcpServers": {
|
|
121
|
+
"trello": {
|
|
122
|
+
"command": "pipx",
|
|
123
|
+
"args": ["run", "trellio-mcp"]
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
If using env var auth instead of stored credentials, add:
|
|
130
|
+
|
|
131
|
+
```json
|
|
132
|
+
"env": {
|
|
133
|
+
"TRELLO_API_KEY": "your_api_key",
|
|
134
|
+
"TRELLO_TOKEN": "your_token"
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Claude Code
|
|
139
|
+
|
|
140
|
+
Add to `~/.claude/settings.json` or project
|
|
141
|
+
`.claude/settings.json`:
|
|
142
|
+
|
|
143
|
+
```json
|
|
144
|
+
{
|
|
145
|
+
"mcpServers": {
|
|
146
|
+
"trello": {
|
|
147
|
+
"command": "pipx",
|
|
148
|
+
"args": ["run", "trellio-mcp"]
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Gemini CLI
|
|
155
|
+
|
|
156
|
+
Add to `~/.gemini/settings.json`:
|
|
157
|
+
|
|
158
|
+
```json
|
|
159
|
+
{
|
|
160
|
+
"mcpServers": {
|
|
161
|
+
"trello": {
|
|
162
|
+
"command": "pipx",
|
|
163
|
+
"args": ["run", "trellio-mcp"]
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Architecture
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
MCP Client (Claude / Gemini)
|
|
173
|
+
│ stdio (JSON-RPC)
|
|
174
|
+
▼
|
|
175
|
+
trellio-mcp (FastMCP)
|
|
176
|
+
│ async/await
|
|
177
|
+
▼
|
|
178
|
+
trellio (httpx)
|
|
179
|
+
│ HTTPS
|
|
180
|
+
▼
|
|
181
|
+
Trello API
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
**Key decisions** (documented in `docs/adr/`):
|
|
185
|
+
|
|
186
|
+
| ADR | Decision |
|
|
187
|
+
|-----|----------|
|
|
188
|
+
| 001 | Python MCP SDK for language alignment with trellio |
|
|
189
|
+
| 002 | stdio transport — no network attack surface |
|
|
190
|
+
| 003 | Stored credentials with env var fallback |
|
|
191
|
+
| 004 | 1:1 tool mapping — one tool per trellio method |
|
|
192
|
+
| 005 | trellio as Git dependency pinned to v1.0.0 |
|
|
193
|
+
| 006 | Tools + Resources + Prompts as MCP capabilities |
|
|
194
|
+
| 007 | `isError=true` + structured error content |
|
|
195
|
+
|
|
196
|
+
## Testing
|
|
197
|
+
|
|
198
|
+
The project uses BDD with
|
|
199
|
+
[behave](https://behave.readthedocs.io/), following the
|
|
200
|
+
[BDD Guidelines v1.8.0](https://github.com/scaratec/burn-your-code).
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
PYTHONPATH=src .venv/bin/python -m behave
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
15 features passed, 0 failed, 0 skipped
|
|
208
|
+
122 scenarios passed, 0 failed, 0 skipped
|
|
209
|
+
732 steps passed, 0 failed, 0 skipped
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Test architecture:
|
|
213
|
+
- `AsyncMock(spec=TrellioClient)` — mock at the client
|
|
214
|
+
boundary, not HTTP
|
|
215
|
+
- Persistence validation via mock call records (§4.3)
|
|
216
|
+
- Anti-hardcoding via Scenario Outlines with >= 2 variants
|
|
217
|
+
(§2.3)
|
|
218
|
+
- Layer-by-layer failure path enumeration: 11 error scenarios
|
|
219
|
+
(§4.5)
|
|
220
|
+
- Independent spec audit per §13
|
|
221
|
+
|
|
222
|
+
See [Case Study](docs/case-study-bdd-mcp-server.md) for a
|
|
223
|
+
detailed account of the BDD-driven development process.
|
|
224
|
+
|
|
225
|
+
## Project Structure
|
|
226
|
+
|
|
227
|
+
```
|
|
228
|
+
trellio-mcp/
|
|
229
|
+
├── src/trello_mcp/
|
|
230
|
+
│ ├── __init__.py # Tool registration
|
|
231
|
+
│ ├── __main__.py # Entry point (server + auth)
|
|
232
|
+
│ ├── server.py # FastMCP instance + client mgmt
|
|
233
|
+
│ ├── auth.py # OAuth flow + credential storage
|
|
234
|
+
│ ├── errors.py # Error translation (ADR 007)
|
|
235
|
+
│ ├── tools/ # 10 modules, 40 tools
|
|
236
|
+
│ ├── resources.py # 2 resource templates
|
|
237
|
+
│ └── prompts.py # 3 prompts
|
|
238
|
+
├── features/ # 15 BDD feature files
|
|
239
|
+
│ └── steps/ # Step definitions
|
|
240
|
+
├── docs/
|
|
241
|
+
│ ├── adr/ # 7 Architecture Decision Records
|
|
242
|
+
│ ├── tool-design.md # Scenario-driven tool analysis
|
|
243
|
+
│ └── case-study-bdd-mcp-server.md
|
|
244
|
+
└── pyproject.toml
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## License
|
|
248
|
+
|
|
249
|
+
This project is licensed under the GNU General Public License
|
|
250
|
+
v3.0 — see the [LICENSE](LICENSE) file for details.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68.0"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "trellio-mcp"
|
|
7
|
+
version = "0.1.1"
|
|
8
|
+
description = "MCP server for Trello — manage boards, lists, cards, labels, checklists and more"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = {text = "GPL-3.0-or-later"}
|
|
12
|
+
authors = [
|
|
13
|
+
{name = "scaratec"},
|
|
14
|
+
]
|
|
15
|
+
keywords = ["trello", "mcp", "model-context-protocol", "claude", "gemini", "ai"]
|
|
16
|
+
classifiers = [
|
|
17
|
+
"Development Status :: 4 - Beta",
|
|
18
|
+
"Intended Audience :: Developers",
|
|
19
|
+
"License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Programming Language :: Python :: 3.10",
|
|
22
|
+
"Programming Language :: Python :: 3.11",
|
|
23
|
+
"Programming Language :: Python :: 3.12",
|
|
24
|
+
"Programming Language :: Python :: 3.13",
|
|
25
|
+
"Topic :: Software Development :: Libraries",
|
|
26
|
+
]
|
|
27
|
+
dependencies = [
|
|
28
|
+
"mcp>=1.12.0",
|
|
29
|
+
"trellio-client>=1.0.0",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[project.urls]
|
|
33
|
+
Homepage = "https://github.com/scaratec/trellio-mcp"
|
|
34
|
+
Repository = "https://github.com/scaratec/trellio-mcp"
|
|
35
|
+
Issues = "https://github.com/scaratec/trellio-mcp/issues"
|
|
36
|
+
|
|
37
|
+
[project.scripts]
|
|
38
|
+
trellio-mcp = "trello_mcp.__main__:main"
|
|
39
|
+
|
|
40
|
+
[project.optional-dependencies]
|
|
41
|
+
dev = [
|
|
42
|
+
"behave>=1.2.6",
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
[tool.setuptools.packages.find]
|
|
46
|
+
where = ["src"]
|