@delorenj/mcp-server-trello 1.2.0 → 1.5.1

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.
package/README.md CHANGED
@@ -1,156 +1,105 @@
1
1
  # MCP Server Trello
2
2
 
3
3
  [![Verified on MseeP](https://mseep.ai/badge.svg)](https://mseep.ai/app/27359682-7632-4ba7-981d-7dfecadf1c4b)
4
+ [![MCP Registry](https://img.shields.io/badge/MCP-Registry-blue)](https://registry.modelcontextprotocol.io/servers/io.github.delorenj/mcp-server-trello)
5
+ [![npm version](https://badge.fury.io/js/%40delorenj%2Fmcp-server-trello.svg)](https://badge.fury.io/js/%40delorenj%2Fmcp-server-trello)
4
6
 
5
7
  <a href="https://glama.ai/mcp/servers/klqkamy7wt"><img width="380" height="200" src="https://glama.ai/mcp/servers/klqkamy7wt/badge" alt="Server Trello MCP server" /></a>
6
8
 
7
9
  A Model Context Protocol (MCP) server that provides tools for interacting with Trello boards. This server enables seamless integration with Trello's API while handling rate limiting, type safety, and error handling automatically.
8
10
 
9
- ## 🎉 New in v1.2.0: Complete Checklist Management Suite!
11
+ ## 🎉 New in v1.5.0: Now Powered by Bun!
10
12
 
11
- **Comprehensive Checklist Tools are here!** 🚀 Now you can fully manage Trello checklists with 5 powerful new tools! Search, create, and track checklist items across your boards. Perfect for managing acceptance criteria, development tasks, and project milestones!
13
+ **This project is now powered by Bun!** 🚀 We've migrated the entire project to the Bun runtime, resulting in a 2.8-4.4x performance boost. All existing `npx`, `pnpx`, and `npm` commands will **continue to work perfectly**.
12
14
 
13
- ### ✨ New Checklist Tools:
14
- - 📋 **`get_checklist_items`** - Retrieve all items from any checklist by name
15
- - **`add_checklist_item`** - Add new items to existing checklists
16
- - 🔍 **`find_checklist_items_by_description`** - Search checklist items by text content
17
- - **`get_acceptance_criteria`** - Quick access to "Acceptance Criteria" checklists
18
- - 📊 **`get_checklist_by_name`** - Get complete checklist with completion percentage
15
+ ### ✨ New in This Release:
16
+
17
+ - 🚀 **Performance Boost**: Enjoy a faster, more responsive server.
18
+ - BUN **Bun-Powered**: The project now runs on the lightning-fast Bun runtime.
19
+ - 📖 **Comprehensive Examples**: A new `examples` directory with detailed implementations in JavaScript, Python, and TypeScript.
19
20
 
20
21
  **Plus:** Modern MCP SDK architecture, enhanced type safety, and comprehensive documentation!
21
22
 
22
23
  ## Changelog
23
24
 
24
- ### 1.2.0
25
-
26
- **🎊 Major Feature Release: Complete Checklist Management Suite**
27
-
28
- - **5 New Checklist Tools** for comprehensive checklist management:
29
- - `get_checklist_items(name)` - Retrieve all items from a checklist by name
30
- - `add_checklist_item(text, checkListName)` - Add new items to existing checklists
31
- - `find_checklist_items_by_description(description)` - Search checklist items by text content
32
- - `get_acceptance_criteria()` - Convenience method for "Acceptance Criteria" checklists
33
- - `get_checklist_by_name(name)` - Get complete checklist with completion percentage
34
- - **Modern MCP SDK Architecture:** Refactored to use latest MCP TypeScript SDK patterns with `registerTool()` and Zod validation
35
- - **Enhanced Type Safety:** Full TypeScript support with proper type conversions between Trello API and MCP types
36
- - **New Data Types:** `CheckList` and `CheckListItem` interfaces for structured checklist data
37
- - **Comprehensive Documentation:** Added `CHECKLIST_TOOLS.md` with examples and best practices
38
- - **Improved Error Handling:** Consistent error responses with descriptive messages
39
- - **Runtime Validation:** Zod schemas for all tool inputs with automatic validation
40
-
41
- ### 1.1.0
42
-
43
- **🎊 Major Feature Release: Complete Card Data Extraction**
44
-
45
- - Added powerful `get_card` tool for comprehensive single card data retrieval
46
- - **Enhanced Data Extraction:**
47
- - ✅ **Checklists** - Full checklist support with items, completion states, member assignments, and due dates
48
- - 📎 **Attachments** - Complete attachment data including images, previews, file metadata, and inline image detection
49
- - 🏷️ **Labels** - Full label details (names and colors, not just IDs)
50
- - 👥 **Members** - Card member assignments with full profile information
51
- - 💬 **Comments** - Card activity and comment history
52
- - 📊 **Badges** - Statistics including checklist progress, comment counts, and attachment counts
53
- - 🎨 **Cover Images** - Card cover image support
54
- - 📍 **Context** - Board and list information for complete context
55
- - 🔧 **Custom Fields** - Support for board-specific custom fields
56
- - **Markdown Formatting:** New `includeMarkdown` parameter returns beautifully formatted, human-readable card data
57
- - **Inline Image Parsing:** Automatically detects and extracts images embedded in card descriptions
58
- - **Comprehensive API Integration:** Single API call fetches all card data efficiently using optimized query parameters
59
- - **Type Safety:** Added new TypeScript interfaces for all enhanced data structures
60
- - **Human Parity:** Achieves complete parity with Trello UI - see everything a human sees
61
-
62
- ### 1.0.0
63
-
64
- - Fixed MCP protocol compatibility by removing all console output that interfered with JSON-RPC communication
65
- - Improved pnpx support - now works seamlessly with `pnpx @delorenj/mcp-server-trello`
66
- - Updated installation docs to feature pnpx as the primary installation method
67
- - Added mise installation instructions for convenient tool management
68
- - Production-ready release with stable API
69
-
70
- ### 0.3.0
71
-
72
- - Added multi-board support - all methods now accept optional `boardId` parameter (thanks @blackoutnet!)
73
- - `TRELLO_BOARD_ID` environment variable is now optional and serves as default board
74
- - Added board and workspace management capabilities:
75
- - `list_boards` - List all boards the user has access to
76
- - `set_active_board` - Set the active board for future operations
77
- - `list_workspaces` - List all workspaces the user has access to
78
- - `set_active_workspace` - Set the active workspace for future operations
79
- - `list_boards_in_workspace` - List all boards in a specific workspace
80
- - `get_active_board_info` - Get information about the currently active board
81
- - Added persistent configuration storage to remember active board/workspace
82
- - Improved error handling with MCP-specific error types
83
- - Full backward compatibility maintained
84
-
85
- ### 0.2.1
86
-
87
- - Added detailed JSDoc comments to rate limiter functions
88
- - Improved error handling for image attachment functionality
89
- - Updated documentation for attach_image_to_card tool
90
-
91
- ### 0.2.0
92
-
93
- - Added `attach_image_to_card` tool to attach images to cards from URLs
94
- - Added Docker support with multi-stage build
95
- - Improved security by moving environment variables to `.env`
96
- - Added Docker Compose configuration
97
- - Added `.env.template` for easier setup
98
-
99
- ### 0.1.1
100
-
101
- - Added `move_card` tool to move cards between lists
102
- - Improved documentation
103
-
104
- ### 0.1.0
105
-
106
- - Initial release with basic Trello board management features
25
+ For a detailed list of changes, please refer to the [CHANGELOG.md](CHANGELOG.md) file.
107
26
 
108
27
  ## Features
109
28
 
110
- - **Full Trello Board Integration**: Interact with cards, lists, and board activities
111
- - **🆕 Complete Card Data Extraction**: Fetch all card details including checklists, attachments, labels, members, and comments
112
- - **Built-in Rate Limiting**: Respects Trello's API limits (300 requests/10s per API key, 100 requests/10s per token)
113
- - **Type-Safe Implementation**: Written in TypeScript with comprehensive type definitions
114
- - **Input Validation**: Robust validation for all API inputs
115
- - **Error Handling**: Graceful error handling with informative messages
116
- - **Dynamic Board Selection**: Switch between boards and workspaces without restarting
117
- - **Markdown Formatting**: Export card data in human-readable markdown format
29
+ - **Full Trello Board Integration**: Interact with cards, lists, and board activities
30
+ - **🆕 Complete Card Data Extraction**: Fetch all card details including checklists, attachments, labels, members, and comments
31
+ - **File Attachments**: Attach any type of file to cards (PDFs, documents, videos, images, etc.) from URLs
32
+ - **Built-in Rate Limiting**: Respects Trello's API limits (300 requests/10s per API key, 100 requests/10s per token)
33
+ - **Type-Safe Implementation**: Written in TypeScript with comprehensive type definitions
34
+ - **Input Validation**: Robust validation for all API inputs
35
+ - **Error Handling**: Graceful error handling with informative messages
36
+ - **Dynamic Board Selection**: Switch between boards and workspaces without restarting
37
+ - **Markdown Formatting**: Export card data in human-readable markdown format
118
38
 
119
39
  ## Installation
120
40
 
121
- ### Quick Start with pnpx (Recommended)
41
+ ### 🚀 Install from MCP Registry (Recommended)
42
+
43
+ The MCP Server Trello is now available in the official MCP Registry\! MCP clients can automatically discover and install this server.
44
+
45
+ For clients that support the MCP Registry:
46
+
47
+ 1. Search for "mcp-server-trello" or "io.github.delorenj/mcp-server-trello"
48
+ 2. Install directly from the registry
49
+ 3. Configure with your Trello credentials
50
+
51
+ ### 🚀 Quick Start with Bun (Fastest)
52
+
53
+ If you have [Bun](https://bun.sh) installed, using `bunx` is the fastest way to run the server:
54
+
55
+ ```json
56
+ {
57
+   "mcpServers": {
58
+     "trello": {
59
+       "command": "bunx",
60
+       "args": ["@delorenj/mcp-server-trello"],
61
+       "env": {
62
+         "TRELLO_API_KEY": "your-api-key",
63
+         "TRELLO_TOKEN": "your-token"
64
+       }
65
+     }
66
+   }
67
+ }
68
+ ```
69
+
70
+ ### Quick Start with npx / pnpx / bunx
122
71
 
123
- The easiest way to use the Trello MCP server is with `pnpx`, which doesn't require a global install:
72
+ You can still use `npx` or `pnpx`. This doesn't require a global install and will work just fine, though `bunx` (above) is faster.
124
73
 
125
74
  ```json
126
75
  {
127
- "mcpServers": {
128
- "trello": {
129
- "command": "pnpx",
130
- "args": ["@delorenj/mcp-server-trello"],
131
- "env": {
132
- "TRELLO_API_KEY": "your-api-key",
133
- "TRELLO_TOKEN": "your-token"
134
- }
135
- }
136
- }
76
+   "mcpServers": {
77
+     "trello": {
78
+       "command": "bunx",
79
+       "args": ["@delorenj/mcp-server-trello"],
80
+       "env": {
81
+         "TRELLO_API_KEY": "your-api-key",
82
+         "TRELLO_TOKEN": "your-token"
83
+       }
84
+     }
85
+   }
137
86
  }
138
87
  ```
139
88
 
140
- Or if you're using mise:
89
+ Or if you're using mise, you can explicitly execute `bunx` with `mise exec`:
141
90
 
142
91
  ```json
143
92
  {
144
- "mcpServers": {
145
- "trello": {
146
- "command": "mise",
147
- "args": ["x", "--", "pnpx", "@delorenj/mcp-server-trello"],
148
- "env": {
149
- "TRELLO_API_KEY": "your-api-key",
150
- "TRELLO_TOKEN": "your-token"
151
- }
152
- }
153
- }
93
+   "mcpServers": {
94
+     "trello": {
95
+       "command": "mise",
96
+       "args": ["x", "--", "bunx", "@delorenj/mcp-server-trello"],
97
+       "env": {
98
+         "TRELLO_API_KEY": "your-api-key",
99
+         "TRELLO_TOKEN": "your-token"
100
+       }
101
+     }
102
+   }
154
103
  }
155
104
  ```
156
105
 
@@ -162,63 +111,78 @@ https://trello.com/1/authorize?expiration=never&name=YOUR_APP_NAME&scope=read,wr
162
111
 
163
112
  Replace:
164
113
 
165
- * `YOUR_APP_NAME` with a name for your application (e.g., "My Trello Integration"). This name is shown to the user on the Trello authorization screen.
166
- * `YOUR_API_KEY` with the API key for your Trello Power-Up
114
+ * `YOUR_APP_NAME` with a name for your application (e.g., "My Trello Integration"). This name is shown to the user on the Trello authorization screen.
115
+ * `YOUR_API_KEY` with the API key for your Trello Power-Up
167
116
 
168
117
  This will generate the token required for integration.
169
118
 
170
- > [!NOTE]
119
+ > [\!NOTE]
171
120
  > The `expiration=never` parameter creates a token that does not expire. For enhanced security, consider using `expiration=30days` and renewing the token periodically if your setup allows for it.
172
121
 
122
+ #### Don't have Bun?
173
123
 
174
- #### Don't have pnpm?
175
-
176
- The simplest way to get `pnpm` (and thus `pnpx`) is through [mise](https://mise.jdx.dev/):
124
+ The simplest way to get `bun` (and thus `bunx`) is through [mise](https://mise.jdx.dev/):
177
125
 
178
126
  ```bash
179
127
  # Install mise (if you don't have it)
180
128
  curl https://mise.run | sh
181
129
 
182
- # Install pnpm with mise
183
- mise install pnpm
130
+ # Install bun and make the @latest version your system default
131
+ mise use bun@latest -g
132
+
133
+ # Or just run `mise install` from the project directory to install Bun locally
134
+ cd /path/to/mcp-server-trello
135
+ mise install
184
136
  ```
185
137
 
186
138
  ### Installing via npm
187
139
 
188
- If you prefer using npm directly:
140
+ If you prefer using `npm` directly:
189
141
 
190
142
  ```bash
191
143
  npm install -g @delorenj/mcp-server-trello
192
144
  ```
193
145
 
194
- Then use `mcp-server-trello` as the command in your MCP configuration.
146
+ *(A fast alternative is `bun add -g @delorenj/mcp-server-trello`)*
147
+
148
+ Then use `npx mcp-server-trello` as the command in your MCP configuration.
195
149
 
196
150
  ### Installing via Smithery
197
151
 
198
- To install Trello Server for Claude Desktop automatically via [Smithery](https://smithery.ai/server/@modelcontextprotocol/mcp-server-trello):
152
+ To install Trello Server for Claude Desktop automatically via [Smithery](https://smithery.ai/server/@delorenj/mcp-server-trello):
199
153
 
200
154
  ```bash
201
- npx -y @smithery/cli install @modelcontextprotocol/mcp-server-trello --client claude
155
+ # Using bunx (recommended)
156
+ bunx -y @smithery/cli install @delorenj/mcp-server-trello --client claude
157
+
158
+ # Using npx
159
+ npx -y @smithery/cli install @delorenj/mcp-server-trello --client claude
202
160
  ```
203
161
 
204
162
  ### Docker Installation
205
163
 
206
164
  For containerized environments:
207
165
 
208
- 1. Clone the repository:
166
+ 1. Clone the repository:
167
+
168
+ <!-- end list -->
209
169
 
210
170
  ```bash
211
171
  git clone https://github.com/delorenj/mcp-server-trello
212
172
  cd mcp-server-trello
213
173
  ```
214
174
 
215
- 2. Copy the environment template and fill in your Trello credentials:
175
+ 2. Copy the environment template and fill in your Trello credentials:
176
+
177
+ <!-- end list -->
216
178
 
217
179
  ```bash
218
180
  cp .env.template .env
219
181
  ```
220
182
 
221
- 3. Build and run with Docker Compose:
183
+ 3. Build and run with Docker Compose:
184
+
185
+ <!-- end list -->
222
186
 
223
187
  ```bash
224
188
  docker compose up --build
@@ -244,75 +208,85 @@ TRELLO_WORKSPACE_ID=your-workspace-id
244
208
 
245
209
  You can get these values from:
246
210
 
247
- - API Key: <https://trello.com/app-key>
248
- - Token: Generate using your API key
249
- - Board ID (optional, deprecated): Found in the board URL (e.g., <https://trello.com/b/BOARD_ID/board-name>)
250
- - Workspace ID: Found in workspace settings or using `list_workspaces` tool
211
+ - API Key: [https://trello.com/app-key](https://trello.com/app-key)
212
+ - Token: Generate using your API key
213
+ - Board ID (optional, deprecated): Found in the board URL (e.g., [suspicious link removed])
214
+ - Workspace ID: Found in workspace settings or using `list_workspaces` tool
251
215
 
252
216
  ### Board and Workspace Management
253
217
 
254
218
  Starting with version 0.3.0, the MCP server supports multiple ways to work with boards:
255
219
 
256
- 1. **Multi-board support**: All methods now accept an optional `boardId` parameter
257
- - Omit `TRELLO_BOARD_ID` and provide `boardId` in each API call
258
- - Set `TRELLO_BOARD_ID` as default and optionally override with `boardId` parameter
220
+ 1. **Multi-board support**: All methods now accept an optional `boardId` parameter
221
+    - Omit `TRELLO_BOARD_ID` and provide `boardId` in each API call
222
+    - Set `TRELLO_BOARD_ID` as default and optionally override with `boardId` parameter
259
223
 
260
- 2. **Dynamic board selection**: Use workspace management tools
261
- - The `TRELLO_BOARD_ID` in your `.env` file is used as the initial/default board ID
262
- - You can change the active board at any time using the `set_active_board` tool
263
- - The selected board persists between server restarts (stored in `~/.trello-mcp/config.json`)
264
- - Similarly, you can set and persist an active workspace using `set_active_workspace`
224
+ 2. **Dynamic board selection**: Use workspace management tools
225
+    - The `TRELLO_BOARD_ID` in your `.env` file is used as the initial/default board ID
226
+    - You can change the active board at any time using the `set_active_board` tool
227
+    - The selected board persists between server restarts (stored in `~/.trello-mcp/config.json`)
228
+    - Similarly, you can set and persist an active workspace using `set_active_workspace`
265
229
 
266
230
  This allows you to work with multiple boards and workspaces without restarting the server.
267
231
 
268
232
  #### Example Workflow
269
233
 
270
- 1. Start by listing available boards:
234
+ 1. Start by listing available boards:
235
+
236
+ <!-- end list -->
271
237
 
272
238
  ```typescript
273
239
  {
274
- name: 'list_boards',
275
- arguments: {}
240
+   name: 'list_boards',
241
+   arguments: {}
276
242
  }
277
243
  ```
278
244
 
279
- 2. Set your active board:
245
+ 2. Set your active board:
246
+
247
+ <!-- end list -->
280
248
 
281
249
  ```typescript
282
250
  {
283
- name: 'set_active_board',
284
- arguments: {
285
- boardId: "abc123" // ID from list_boards response
286
- }
251
+   name: 'set_active_board',
252
+   arguments: {
253
+     boardId: "abc123"  // ID from list_boards response
254
+   }
287
255
  }
288
256
  ```
289
257
 
290
- 3. List workspaces if needed:
258
+ 3. List workspaces if needed:
259
+
260
+ <!-- end list -->
291
261
 
292
262
  ```typescript
293
263
  {
294
- name: 'list_workspaces',
295
- arguments: {}
264
+   name: 'list_workspaces',
265
+   arguments: {}
296
266
  }
297
267
  ```
298
268
 
299
- 4. Set active workspace if needed:
269
+ 4. Set active workspace if needed:
270
+
271
+ <!-- end list -->
300
272
 
301
273
  ```typescript
302
274
  {
303
- name: 'set_active_workspace',
304
- arguments: {
305
- workspaceId: "xyz789" // ID from list_workspaces response
306
- }
275
+   name: 'set_active_workspace',
276
+   arguments: {
277
+     workspaceId: "xyz789"  // ID from list_workspaces response
278
+   }
307
279
  }
308
280
  ```
309
281
 
310
- 5. Check current active board info:
282
+ 5. Check current active board info:
283
+
284
+ <!-- end list -->
311
285
 
312
286
  ```typescript
313
287
  {
314
- name: 'get_active_board_info',
315
- arguments: {}
288
+   name: 'get_active_board_info',
289
+   arguments: {}
316
290
  }
317
291
  ```
318
292
 
@@ -320,8 +294,8 @@ This allows you to work with multiple boards and workspaces without restarting t
320
294
 
321
295
  When working with dates in the Trello MCP server, please note the different format requirements:
322
296
 
323
- - **Due Date (`dueDate`)**: Accepts full ISO 8601 format with time (e.g., `2023-12-31T12:00:00Z`)
324
- - **Start Date (`start`)**: Accepts date only in YYYY-MM-DD format (e.g., `2025-08-05`)
297
+ - **Due Date (`dueDate`)**: Accepts full ISO 8601 format with time (e.g., `2023-12-31T12:00:00Z`)
298
+ - **Start Date (`start`)**: Accepts date only in YYYY-MM-DD format (e.g., `2025-08-05`)
325
299
 
326
300
  This distinction follows Trello's API conventions where start dates are day-based markers while due dates can include specific times.
327
301
 
@@ -329,339 +303,358 @@ This distinction follows Trello's API conventions where start dates are day-base
329
303
 
330
304
  ### Checklist Management Tools 🆕
331
305
 
332
- #### get_checklist_items
306
+ #### get\_checklist\_items
333
307
 
334
308
  Get all items from a checklist by name.
335
309
 
336
310
  ```typescript
337
311
  {
338
- name: 'get_checklist_items',
339
- arguments: {
340
- name: string, // Name of the checklist to retrieve items from
341
- boardId?: string // Optional: ID of the board (uses default if not provided)
342
- }
312
+   name: 'get_checklist_items',
313
+   arguments: {
314
+     name: string,        // Name of the checklist to retrieve items from
315
+     boardId?: string     // Optional: ID of the board (uses default if not provided)
316
+   }
343
317
  }
344
318
  ```
345
319
 
346
- #### add_checklist_item
320
+ #### add\_checklist\_item
347
321
 
348
322
  Add a new item to an existing checklist.
349
323
 
350
324
  ```typescript
351
325
  {
352
- name: 'add_checklist_item',
353
- arguments: {
354
- text: string, // Text content of the checklist item
355
- checkListName: string, // Name of the checklist to add the item to
356
- boardId?: string // Optional: ID of the board (uses default if not provided)
357
- }
326
+   name: 'add_checklist_item',
327
+   arguments: {
328
+     text: string,           // Text content of the checklist item
329
+     checkListName: string,  // Name of the checklist to add the item to
330
+     boardId?: string        // Optional: ID of the board (uses default if not provided)
331
+   }
358
332
  }
359
333
  ```
360
334
 
361
- #### find_checklist_items_by_description
335
+ #### find\_checklist\_items\_by\_description
362
336
 
363
337
  Search for checklist items containing specific text.
364
338
 
365
339
  ```typescript
366
340
  {
367
- name: 'find_checklist_items_by_description',
368
- arguments: {
369
- description: string, // Text to search for in checklist item descriptions
370
- boardId?: string // Optional: ID of the board (uses default if not provided)
371
- }
341
+ nbsp; name: 'find_checklist_items_by_description',
342
+   arguments: {
343
+     description: string,  // Text to search for in checklist item descriptions
344
+     boardId?: string      // Optional: ID of the board (uses default if not provided)
345
+ nbsp; }
372
346
  }
373
347
  ```
374
348
 
375
- #### get_acceptance_criteria
349
+ #### get\_acceptance\_criteria
376
350
 
377
351
  Get all items from the "Acceptance Criteria" checklist.
378
352
 
379
353
  ```typescript
380
354
  {
381
- name: 'get_acceptance_criteria',
382
- arguments: {
383
- boardId?: string // Optional: ID of the board (uses default if not provided)
384
- }
355
+   name: 'get_acceptance_criteria',
356
+   arguments: {
357
+     boardId?: string  // Optional: ID of the board (uses default if not provided)
358
+   }
385
359
  }
386
360
  ```
387
361
 
388
- #### get_checklist_by_name
362
+ #### get\_checklist\_by\_name
389
363
 
390
364
  Get a complete checklist with all items and completion percentage.
391
365
 
392
366
  ```typescript
393
367
  {
394
- name: 'get_checklist_by_name',
395
- arguments: {
396
- name: string, // Name of the checklist to retrieve
397
- boardId?: string // Optional: ID of the board (uses default if not provided)
398
- }
368
+   name: 'get_checklist_by_name',
369
+   arguments: {
370
+     name: string,     // Name of the checklist to retrieve
371
+     boardId?: string  // Optional: ID of the board (uses default if not provided)
372
+   }
399
373
  }
400
374
  ```
401
375
 
402
376
  **Returns:** `CheckList` object with:
403
- - `id`: Checklist identifier
404
- - `name`: Checklist name
405
- - `items`: Array of `CheckListItem` objects
406
- - `percentComplete`: Completion percentage (0-100)
407
377
 
408
- ### get_card 🆕
378
+ - `id`: Checklist identifier
379
+ - `name`: Checklist name
380
+ - `items`: Array of `CheckListItem` objects
381
+ - `percentComplete`: Completion percentage (0-100)
382
+
383
+ ### get\_card 🆕
409
384
 
410
385
  Get comprehensive details of a specific Trello card with human-level parity.
411
386
 
412
387
  ```typescript
413
388
  {
414
- name: 'get_card',
415
- arguments: {
416
- cardId: string, // ID of the Trello card (short ID like 'FdhbArbK' or full ID)
417
- includeMarkdown?: boolean // Return formatted markdown instead of JSON (default: false)
418
- }
389
+   name: 'get_card',
390
+   arguments: {
391
+     cardId: string,          // ID of the Trello card (short ID like 'FdhbArbK' or full ID)
392
+     includeMarkdown?: boolean // Return formatted markdown instead of JSON (default: false)
393
+   }
419
394
  }
420
395
  ```
421
396
 
422
397
  **Returns:** Complete card data including:
423
- - ✅ Checklists with item states and assignments
424
- - 📎 Attachments with previews and metadata
425
- - 🏷️ Labels with names and colors
426
- - 👥 Assigned members
427
- - 💬 Comments and activity
428
- - 📊 Statistics (badges)
429
- - 🎨 Cover images
430
- - 📍 Board and list context
431
398
 
432
- ### get_cards_by_list_id
399
+ - ✅ Checklists with item states and assignments
400
+ - 📎 Attachments with previews and metadata
401
+ - 🏷️ Labels with names and colors
402
+ - 👥 Assigned members
403
+ - 💬 Comments and activity
404
+ - 📊 Statistics (badges)
405
+ - 🎨 Cover images
406
+ - 📍 Board and list context
407
+
408
+ ### get\_cards\_by\_list\_id
433
409
 
434
410
  Fetch all cards from a specific list.
435
411
 
436
412
  ```typescript
437
413
  {
438
- name: 'get_cards_by_list_id',
439
- arguments: {
440
- boardId?: string, // Optional: ID of the board (uses default if not provided)
441
- listId: string // ID of the Trello list
442
- }
414
+   name: 'get_cards_by_list_id',
415
+   arguments: {
416
+     boardId?: string, // Optional: ID of the board (uses default if not provided)
417
+     listId: string    // ID of the Trello list
418
+   }
443
419
  }
444
420
  ```
445
421
 
446
- ### get_lists
422
+ ### get\_lists
447
423
 
448
424
  Retrieve all lists from a board.
449
425
 
450
426
  ```typescript
451
427
  {
452
- name: 'get_lists',
453
- arguments: {
454
- boardId?: string // Optional: ID of the board (uses default if not provided)
455
- }
428
+   name: 'get_lists',
429
+   arguments: {
430
+     boardId?: string  // Optional: ID of the board (uses default if not provided)
431
+   }
456
432
  }
457
433
  ```
458
434
 
459
- ### get_recent_activity
435
+ ### get\_recent\_activity
460
436
 
461
437
  Fetch recent activity on a board.
462
438
 
463
439
  ```typescript
464
440
  {
465
- name: 'get_recent_activity',
466
- arguments: {
467
- boardId?: string, // Optional: ID of the board (uses default if not provided)
468
- limit?: number // Optional: Number of activities to fetch (default: 10)
469
- }
441
+   name: 'get_recent_activity',
442
+   arguments: {
443
+     boardId?: string, // Optional: ID of the board (uses default if not provided)
444
+     limit?: number    // Optional: Number of activities to fetch (default: 10)
445
+   }
470
446
  }
471
447
  ```
472
448
 
473
- ### add_card_to_list
449
+ ### add\_card\_to\_list
474
450
 
475
451
  Add a new card to a specified list.
476
452
 
477
453
  ```typescript
478
454
  {
479
- name: 'add_card_to_list',
480
- arguments: {
481
- boardId?: string, // Optional: ID of the board (uses default if not provided)
482
- listId: string, // ID of the list to add the card to
483
- name: string, // Name of the card
484
- description?: string, // Optional: Description of the card
485
- dueDate?: string, // Optional: Due date (ISO 8601 format with time)
486
- start?: string, // Optional: Start date (YYYY-MM-DD format, date only)
487
- labels?: string[] // Optional: Array of label IDs
488
- }
455
+   name: 'add_card_to_list',
456
+   arguments: {
457
+     boardId?: string,     // Optional: ID of the board (uses default if not provided)
458
+     listId: string,       // ID of the list to add the card to
459
+     name: string,         // Name of the card
460
+     description?: string, // Optional: Description of the card
461
+   mbs; dueDate?: string,     // Optional: Due date (ISO 8601 format with time)
462
+     start?: string,       // Optional: Start date (YYYY-MM-DD format, date only)
463
+     labels?: string[]     // Optional: Array of label IDs
464
+   }
489
465
  }
490
466
  ```
491
467
 
492
- ### update_card_details
468
+ ### update\_card\_details
493
469
 
494
470
  Update an existing card's details.
495
471
 
496
472
  ```typescript
497
473
  {
498
- name: 'update_card_details',
499
- arguments: {
500
- boardId?: string, // Optional: ID of the board (uses default if not provided)
501
- cardId: string, // ID of the card to update
502
- name?: string, // Optional: New name for the card
503
- description?: string, // Optional: New description
504
- dueDate?: string, // Optional: New due date (ISO 8601 format with time)
505
- start?: string, // Optional: New start date (YYYY-MM-DD format, date only)
506
- dueComplete?: boolean,// Optional: Mark the due date as complete (true) or incomplete (false)
507
- labels?: string[] // Optional: New array of label IDs
508
- }
474
+   name: 'update_card_details',
475
+   arguments: {
476
+     boardId?: string,     // Optional: ID of the board (uses default if not provided)
477
+     cardId: string,       // ID of the card to update
478
+     name?: string,        // Optional: New name for the card
479
+     description?: string, // Optional: New description
480
+     dueDate?: string,     // Optional: New due date (ISO 8601 format with time)
481
+     start?: string,       // Optional: New start date (YYYY-MM-DD format, date only)
482
+     dueComplete?: boolean,// Optional: Mark the due date as complete (true) or incomplete (false)
483
+     labels?: string[]     // Optional: New array of label IDs
484
+   }
509
485
  }
510
486
  ```
511
487
 
512
- ### archive_card
488
+ ### archive\_card
513
489
 
514
490
  Send a card to the archive.
515
491
 
516
492
  ```typescript
517
493
  {
518
- name: 'archive_card',
519
- arguments: {
520
- boardId?: string, // Optional: ID of the board (uses default if not provided)
521
- cardId: string // ID of the card to archive
522
- }
494
+   name: 'archive_card',
495
+   arguments: {
496
+     boardId?: string, // Optional: ID of the board (uses default if not provided)
497
+     cardId: string    // ID of the card to archive
498
+   }
523
499
  }
524
500
  ```
525
501
 
526
- ### add_list_to_board
502
+ ### add\_list\_to\_board
527
503
 
528
504
  Add a new list to a board.
529
505
 
530
506
  ```typescript
531
507
  {
532
- name: 'add_list_to_board',
533
- arguments: {
534
- boardId?: string, // Optional: ID of the board (uses default if not provided)
535
- name: string // Name of the new list
536
- }
508
+ nbsp; name: 'add_list_to_board',
509
+   arguments: {
510
+     boardId?: string, // Optional: ID of the board (uses default if not provided)
511
+     name: string      // Name of the new list
512
+   }
537
513
  }
538
514
  ```
539
515
 
540
- ### archive_list
516
+ ### archive\_list
541
517
 
542
518
  Send a list to the archive.
543
519
 
544
520
  ```typescript
545
521
  {
546
- name: 'archive_list',
547
- arguments: {
548
- boardId?: string, // Optional: ID of the board (uses default if not provided)
549
- listId: string // ID of the list to archive
550
- }
522
+   name: 'archive_list',
523
+   arguments: {
524
+     boardId?: string, // Optional: ID of the board (uses default if not provided)
525
+     listId: string    // ID of the list to archive
526
+   }
551
527
  }
552
528
  ```
553
529
 
554
- ### get_my_cards
530
+ ### get\_my\_cards
555
531
 
556
532
  Fetch all cards assigned to the current user.
557
533
 
558
534
  ```typescript
559
535
  {
560
- name: 'get_my_cards',
561
- arguments: {}
536
+   name: 'get_my_cards',
537
+   arguments: {}
562
538
  }
563
539
  ```
564
540
 
565
- ### move_card
541
+ ### move\_card
566
542
 
567
543
  Move a card to a different list.
568
544
 
569
545
  ```typescript
570
546
  {
571
- name: 'move_card',
572
- arguments: {
573
- boardId?: string, // Optional: ID of the target board (uses default if not provided)
574
- cardId: string, // ID of the card to move
575
- listId: string // ID of the target list
576
- }
547
+   name: 'move_card',
548
+   arguments: {
549
+     boardId?: string,  // Optional: ID of the target board (uses default if not provided)
550
+ s;   cardId: string,    // ID of the card to move
551
+     listId: string     // ID of the target list
552
+   }
577
553
  }
578
554
  ```
579
555
 
580
- ### attach_image_to_card
556
+ ### attach\_image\_to\_card
581
557
 
582
558
  Attach an image to a card directly from a URL.
583
559
 
584
560
  ```typescript
585
561
  {
586
- name: 'attach_image_to_card',
587
- arguments: {
588
- boardId?: string, // Optional: ID of the board (uses default if not provided)
589
- cardId: string, // ID of the card to attach the image to
590
- imageUrl: string, // URL of the image to attach
591
- name?: string // Optional: Name for the attachment (defaults to "Image Attachment")
592
- }
562
+   name: 'attach_image_to_card',
563
+   arguments: {
564
+     boardId?: string, // Optional: ID of the board (uses default if not provided)
565
+     cardId: string,  nbsp; // ID of the card to attach the image to
566
+     imageUrl: string, // URL of the image to attach
567
+     name?: string     // Optional: Name for the attachment (defaults to "Image Attachment")
568
+   }
569
+ }
570
+ ```
571
+
572
+ ### attach\_file\_to\_card
573
+
574
+ Attach any type of file to a card from a URL or a local file path (e.g., `file:///path/to/your/file.pdf`).
575
+
576
+ ```typescript
577
+ {
578
+   name: 'attach_file_to_card',
579
+ nbsp; arguments: {
580
+     boardId?: string,  // Optional: ID of the board (uses default if not provided)
581
+     cardId: string,s;   // ID of the card to attach the file to
582
+     fileUrl: string,   // URL or local file path (using the file:// protocol) of the file to attach
583
+     name?: string,     // Optional: Name for the attachment (defaults to the file name for local files)
584
+     mimeType?: string  // Optional: MIME type (e.g., "application/pdf", "text/plain", "video/mp4")
585
+   }
593
586
  }
594
587
  ```
595
588
 
596
- ### list_boards
589
+ ### list\_boards
597
590
 
598
591
  List all boards the user has access to.
599
592
 
600
593
  ```typescript
601
594
  {
602
- name: 'list_boards',
603
- arguments: {}
595
+   name: 'list_boards',
596
+   arguments: {}
604
597
  }
605
598
  ```
606
599
 
607
- ### set_active_board
600
+ ### set\_active\_board
608
601
 
609
602
  Set the active board for future operations.
610
603
 
611
604
  ```typescript
612
605
  {
613
- name: 'set_active_board',
614
- arguments: {
615
- boardId: string // ID of the board to set as active
616
- }
606
+   name: 'set_active_board',
607
+   arguments: {
608
+     boardId: string  // ID of the board to set as active
609
+   }
617
610
  }
618
611
  ```
619
612
 
620
- ### list_workspaces
613
+ ### list\_workspaces
621
614
 
622
615
  List all workspaces the user has access to.
623
616
 
624
617
  ```typescript
625
618
  {
626
- name: 'list_workspaces',
627
- arguments: {}
619
+ s; name: 'list_workspaces',
620
+   arguments: {}
628
621
  }
629
622
  ```
630
623
 
631
- ### set_active_workspace
624
+ ### set\_active\_workspace
632
625
 
633
626
  Set the active workspace for future operations.
634
627
 
635
628
  ```typescript
636
629
  {
637
- name: 'set_active_workspace',
638
- arguments: {
639
- workspaceId: string // ID of the workspace to set as active
640
- }
630
+   name: 'set_active_workspace',
631
+   arguments: {
632
+     workspaceId: string  // ID of the workspace to set as active
633
+   }
641
634
  }
642
635
  ```
643
636
 
644
- ### list_boards_in_workspace
637
+ ### list\_boards\_in\_workspace
645
638
 
646
639
  List all boards in a specific workspace.
647
640
 
648
641
  ```typescript
649
642
  {
650
- name: 'list_boards_in_workspace',
651
- arguments: {
652
- workspaceId: string // ID of the workspace to list boards from
653
- }
643
+   name: 'list_boards_in_workspace',
644
+   arguments: {
645
+     workspaceId: string  // ID of the workspace to list boards from
646
+   }
654
647
  }
655
648
  ```
656
649
 
657
- ### get_active_board_info
650
+ ### get\_active\_board\_info
658
651
 
659
652
  Get information about the currently active board.
660
653
 
661
654
  ```typescript
662
655
  {
663
- name: 'get_active_board_info',
664
- arguments: {}
656
+ s; name: 'get_active_board_info',
657
+   arguments: {}
665
658
  }
666
659
  ```
667
660
 
@@ -669,72 +662,76 @@ Get information about the currently active board.
669
662
 
670
663
  ### 🎨 Pairing with Ideogram MCP Server
671
664
 
672
- The Trello MCP server pairs beautifully with [@flowluap/ideogram-mcp-server](https://github.com/flowluap/ideogram-mcp-server) for AI-powered visual content creation. Generate images with Ideogram and attach them directly to your Trello cards!
673
-
674
- ![Ideogram + Trello Integration Example](https://ss.delo.sh/hosted/20250717-0619.png)
665
+ The Trello MCP server pairs beautifully with [@flowluap/ideogram-mcp-server](https://github.com/flowluap/ideogram-mcp-server) for AI-powered visual content creation. Generate images with Ideogram and attach them directly to your Trello cards\!
675
666
 
676
667
  #### Example Workflow
677
668
 
678
- 1. **Generate an image with Ideogram:**
669
+ 1. **Generate an image with Ideogram:**
670
+
671
+ <!-- end list -->
672
+
679
673
  ```typescript
680
674
  // Using ideogram-mcp-server
681
675
  {
682
- name: 'generate_image',
683
- arguments: {
684
- prompt: "A futuristic dashboard design with neon accents",
685
- aspect_ratio: "16:9"
686
- }
676
+   name: 'generate_image',
677
+   arguments: {
678
+     prompt: "A futuristic dashboard design with neon accents",
679
+     aspect_ratio: "16:9"
680
+   }
687
681
  }
688
682
  // Returns: { image_url: "https://..." }
689
683
  ```
690
684
 
691
- 2. **Attach the generated image to a Trello card:**
685
+ 2. **Attach the generated image to a Trello card:**
686
+
687
+ <!-- end list -->
688
+
692
689
  ```typescript
693
690
  // Using trello-mcp-server
694
691
  {
695
- name: 'attach_image_to_card',
696
- arguments: {
697
- cardId: "your-card-id",
698
- imageUrl: "https://...", // URL from Ideogram
699
- name: "Dashboard Mockup v1"
700
- }
692
+   name: 'attach_image_to_card',
693
+   arguments: {
694
+     cardId: "your-card-id",
695
+     imageUrl: "https://...", // URL from Ideogram
696
+     name: "Dashboard Mockup v1"
697
+   }
701
698
  }
702
699
  ```
703
700
 
704
701
  #### Setting up both servers
705
702
 
706
- Add both servers to your Claude Desktop configuration:
703
+ Add both servers to your Claude Desktop configuration. Use `bunx` for the fastest startup.
707
704
 
708
705
  ```json
709
706
  {
710
- "mcpServers": {
711
- "trello": {
712
- "command": "pnpx",
713
- "args": ["@delorenj/mcp-server-trello"],
714
- "env": {
715
- "TRELLO_API_KEY": "your-trello-api-key",
716
- "TRELLO_TOKEN": "your-trello-token"
717
- }
718
- },
719
- "ideogram": {
720
- "command": "pnpx",
721
- "args": ["@flowluap/ideogram-mcp-server"],
722
- "env": {
723
- "IDEOGRAM_API_KEY": "your-ideogram-api-key"
724
- }
725
- }
726
- }
707
+   "mcpServers": {
708
+     "trello": {
709
+       "command": "bunx",
710
+       "args": ["@delorenj/mcp-server-trello"],
711
+ nbsp;   "env": {
712
+         "TRELLO_API_KEY": "your-trello-api-key",
713
+         "TRELLO_TOKEN": "your-trello-token"
714
+       }
715
+     },
716
+     "ideogram": {
717
+       "command": "bunx",
718
+       "args": ["@flowluap/ideogram-mcp-server"],
719
+       "env": {
720
+         "IDEOGRAM_API_KEY": "your-ideogram-api-key"
721
+       }
722
+     }
723
+   }
727
724
  }
728
725
  ```
729
726
 
730
- Now you can seamlessly create visual content and organize it in Trello, all within Claude!
727
+ Now you can seamlessly create visual content and organize it in Trello, all within Claude\!
731
728
 
732
729
  ## Rate Limiting
733
730
 
734
731
  The server implements a token bucket algorithm for rate limiting to comply with Trello's API limits:
735
732
 
736
- - 300 requests per 10 seconds per API key
737
- - 100 requests per 10 seconds per token
733
+ - 300 requests per 10 seconds per API key
734
+ - 100 requests per 10 seconds per token
738
735
 
739
736
  Rate limiting is handled automatically, and requests will be queued if limits are reached.
740
737
 
@@ -742,57 +739,70 @@ Rate limiting is handled automatically, and requests will be queued if limits ar
742
739
 
743
740
  The server provides detailed error messages for various scenarios:
744
741
 
745
- - Invalid input parameters
746
- - Rate limit exceeded
747
- - API authentication errors
748
- - Network issues
749
- - Invalid board/list/card IDs
742
+ - Invalid input parameters
743
+ - Rate limit exceeded
744
+ - API authentication errors
745
+ - Network issues
746
+ - Invalid board/list/card IDs
750
747
 
751
748
  ## Development
752
749
 
753
750
  ### Prerequisites
754
751
 
755
- - Node.js 16 or higher
756
- - npm or yarn
752
+ - [Bun](https://bun.sh) (v1.0.0 or higher)
757
753
 
758
754
  ### Setup
759
755
 
760
- 1. Clone the repository
756
+ 1. Clone the repository
757
+
758
+ <!-- end list -->
761
759
 
762
760
  ```bash
763
761
  git clone https://github.com/delorenj/mcp-server-trello
764
762
  cd mcp-server-trello
765
763
  ```
766
764
 
767
- 2. Install dependencies
765
+ 2. Install dependencies
766
+
767
+ <!-- end list -->
768
768
 
769
769
  ```bash
770
- npm install
770
+ bun install
771
771
  ```
772
772
 
773
- 3. Build the project
773
+ 3. Build the project
774
+
775
+ <!-- end list -->
776
+
777
+ ```bash
778
+ bun run build
779
+ ```
780
+
781
+ ## Running tests
782
+
783
+ To run the tests, run the following command:
774
784
 
775
785
  ```bash
776
- npm run build
786
+ bun test
777
787
  ```
778
788
 
779
789
  ## Running evals
780
790
 
781
- The evals package loads an mcp client that then runs the index.ts file, so there is no need to rebuild between tests. You can load environment variables by prefixing the npx command. Full documentation can be found [here](https://www.mcpevals.io/docs).
791
+ The evals package loads an mcp client that then runs the index.ts file, so there is no need to rebuild between tests. You can load environment variables by prefixing the `bunx` command. Full documentation can be found [here](https://www.mcpevals.io/docs).
782
792
 
783
793
  ```bash
784
- OPENAI_API_KEY=your-key npx mcp-eval src/evals/evals.ts src/index.ts
794
+ OPENAI_API_KEY=your-key bunx mcp-eval src/evals/evals.ts src/index.ts
785
795
  ```
786
796
 
787
797
  ## Contributing
788
798
 
789
- Contributions are welcome!
799
+ Contributions are welcome\!
790
800
 
791
801
  ## License
792
802
 
793
- This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
803
+ This project is licensed under the MIT License - see the [LICENSE](https://www.google.com/search?q=LICENSE) file for details.
794
804
 
795
805
  ## Acknowledgments
796
806
 
797
- - Built with the [Model Context Protocol SDK](https://github.com/modelcontextprotocol/sdk)
798
- - Uses the [Trello REST API](https://developer.atlassian.com/cloud/trello/rest/)
807
+ - Built with the [Model Context Protocol SDK](https://github.com/modelcontextprotocol/typescript-sdk)
808
+ - Uses the [Trello REST API](https://developer.atlassian.com/cloud/trello/rest/)