mcp-server-trello 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.
- mcp_server_trello-0.1.0/.gitignore +10 -0
- mcp_server_trello-0.1.0/.python-version +1 -0
- mcp_server_trello-0.1.0/PKG-INFO +26 -0
- mcp_server_trello-0.1.0/README.md +16 -0
- mcp_server_trello-0.1.0/main.py +6 -0
- mcp_server_trello-0.1.0/mcp_client.py +188 -0
- mcp_server_trello-0.1.0/pyproject.toml +23 -0
- mcp_server_trello-0.1.0/requirements.txt +174 -0
- mcp_server_trello-0.1.0/uv.lock +1314 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mcp-server-trello
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: MCP server for Trello API integration
|
|
5
|
+
Author-email: Liad Goren <khgs2411@gmail.com>
|
|
6
|
+
Requires-Python: >=3.10
|
|
7
|
+
Requires-Dist: fastmcp>=2.12.4
|
|
8
|
+
Requires-Dist: requests>=2.32.5
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
|
|
11
|
+
# MCP Server for Trello
|
|
12
|
+
|
|
13
|
+
A Model Context Protocol (MCP) server that provides integration with the Trello API.
|
|
14
|
+
|
|
15
|
+
## Features
|
|
16
|
+
|
|
17
|
+
- Manage boards, lists, and cards
|
|
18
|
+
- Create and update Trello content
|
|
19
|
+
- Add comments and track actions
|
|
20
|
+
- Full Trello API integration
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
uvx mcp-server-trello
|
|
26
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# MCP Server for Trello
|
|
2
|
+
|
|
3
|
+
A Model Context Protocol (MCP) server that provides integration with the Trello API.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Manage boards, lists, and cards
|
|
8
|
+
- Create and update Trello content
|
|
9
|
+
- Add comments and track actions
|
|
10
|
+
- Full Trello API integration
|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
uvx mcp-server-trello
|
|
16
|
+
```
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Simple Trello MCP Server using FastMCP
|
|
4
|
+
|
|
5
|
+
Setup with uv:
|
|
6
|
+
uv init
|
|
7
|
+
uv add fastmcp requests
|
|
8
|
+
|
|
9
|
+
Run:
|
|
10
|
+
uv run mcp_client.py
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
from typing import Any
|
|
15
|
+
import requests
|
|
16
|
+
from fastmcp import FastMCP
|
|
17
|
+
|
|
18
|
+
# Initialize FastMCP
|
|
19
|
+
mcp = FastMCP("Trello")
|
|
20
|
+
|
|
21
|
+
# Get credentials from environment
|
|
22
|
+
API_KEY = os.getenv("TRELLO_API_KEY")
|
|
23
|
+
API_TOKEN = os.getenv("TRELLO_API_TOKEN")
|
|
24
|
+
# API_KEY = "e4457319090ef485a16b824d03312513"
|
|
25
|
+
# API_TOKEN = (
|
|
26
|
+
# "ATTA04d104eafe6fa39de5f18025157b8da6f15310fcd4dfbf5ae7dc881801907edb14D0EE7B"
|
|
27
|
+
# )
|
|
28
|
+
BASE_URL = "https://api.trello.com/1"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def trello_request(endpoint: str, method: str = "GET", data: dict | None = None) -> Any:
|
|
32
|
+
"""Make a request to Trello API"""
|
|
33
|
+
url = f"{BASE_URL}{endpoint}"
|
|
34
|
+
params = {"key": API_KEY, "token": API_TOKEN}
|
|
35
|
+
|
|
36
|
+
if method == "GET":
|
|
37
|
+
response = requests.get(url, params=params)
|
|
38
|
+
elif method == "POST":
|
|
39
|
+
response = requests.post(url, params=params, json=data)
|
|
40
|
+
elif method == "PUT":
|
|
41
|
+
response = requests.put(url, params=params, json=data)
|
|
42
|
+
elif method == "DELETE":
|
|
43
|
+
response = requests.delete(url, params=params)
|
|
44
|
+
|
|
45
|
+
response.raise_for_status()
|
|
46
|
+
return response.json()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# ============== BOARDS ==============
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@mcp.tool()
|
|
53
|
+
def get_my_boards() -> list[dict]:
|
|
54
|
+
"""Get all boards for the authenticated user"""
|
|
55
|
+
return trello_request("/members/me/boards")
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
@mcp.tool()
|
|
59
|
+
def get_board(board_id: str) -> dict:
|
|
60
|
+
"""Get details of a specific board"""
|
|
61
|
+
return trello_request(f"/boards/{board_id}")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@mcp.tool()
|
|
65
|
+
def create_board(name: str, desc: str = "") -> dict:
|
|
66
|
+
"""Create a new Trello board"""
|
|
67
|
+
return trello_request("/boards", "POST", {"name": name, "desc": desc})
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# ============== LISTS ==============
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@mcp.tool()
|
|
74
|
+
def get_board_lists(board_id: str) -> list[dict]:
|
|
75
|
+
"""Get all lists on a board"""
|
|
76
|
+
return trello_request(f"/boards/{board_id}/lists")
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@mcp.tool()
|
|
80
|
+
def create_list(board_id: str, name: str) -> dict:
|
|
81
|
+
"""Create a new list on a board"""
|
|
82
|
+
return trello_request("/lists", "POST", {"idBoard": board_id, "name": name})
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
# ============== CARDS ==============
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@mcp.tool()
|
|
89
|
+
def get_board_cards(board_id: str) -> list[dict]:
|
|
90
|
+
"""Get all cards on a board"""
|
|
91
|
+
return trello_request(f"/boards/{board_id}/cards")
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@mcp.tool()
|
|
95
|
+
def get_list_cards(list_id: str) -> list[dict]:
|
|
96
|
+
"""Get all cards in a list"""
|
|
97
|
+
return trello_request(f"/lists/{list_id}/cards")
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@mcp.tool()
|
|
101
|
+
def get_card(card_id: str) -> dict:
|
|
102
|
+
"""Get details of a specific card"""
|
|
103
|
+
return trello_request(f"/cards/{card_id}")
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@mcp.tool()
|
|
107
|
+
def create_card(list_id: str, name: str, desc: str = "") -> dict:
|
|
108
|
+
"""Create a new card in a list"""
|
|
109
|
+
return trello_request(
|
|
110
|
+
"/cards", "POST", {"idList": list_id, "name": name, "desc": desc}
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@mcp.tool()
|
|
115
|
+
def update_card(card_id: str, name: str | None = None, desc: str | None = None) -> dict:
|
|
116
|
+
"""Update a card's name or description"""
|
|
117
|
+
data = {}
|
|
118
|
+
if name:
|
|
119
|
+
data["name"] = name
|
|
120
|
+
if desc:
|
|
121
|
+
data["desc"] = desc
|
|
122
|
+
return trello_request(f"/cards/{card_id}", "PUT", data)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
@mcp.tool()
|
|
126
|
+
def move_card(card_id: str, list_id: str) -> dict:
|
|
127
|
+
"""Move a card to a different list"""
|
|
128
|
+
return trello_request(f"/cards/{card_id}", "PUT", {"idList": list_id})
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
# ============== ACTIONS ==============
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
@mcp.tool()
|
|
135
|
+
def get_board_actions(board_id: str, limit: int = 50) -> list[dict]:
|
|
136
|
+
"""Get recent actions (activity) on a board"""
|
|
137
|
+
return trello_request(f"/boards/{board_id}/actions?limit={limit}")
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@mcp.tool()
|
|
141
|
+
def get_card_actions(card_id: str, limit: int = 50) -> list[dict]:
|
|
142
|
+
"""Get actions (activity/comments) on a card"""
|
|
143
|
+
return trello_request(f"/cards/{card_id}/actions?limit={limit}")
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
@mcp.tool()
|
|
147
|
+
def get_action(action_id: str) -> dict:
|
|
148
|
+
"""Get details of a specific action"""
|
|
149
|
+
return trello_request(f"/actions/{action_id}")
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@mcp.tool()
|
|
153
|
+
def update_comment(action_id: str, text: str) -> dict:
|
|
154
|
+
"""Update a comment (action must be a comment type)"""
|
|
155
|
+
return trello_request(f"/actions/{action_id}", "PUT", {"text": text})
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
@mcp.tool()
|
|
159
|
+
def delete_comment(action_id: str) -> dict:
|
|
160
|
+
"""Delete a comment (action must be a comment type)"""
|
|
161
|
+
return trello_request(f"/actions/{action_id}", "DELETE")
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
# ============== COMMENTS ==============
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
@mcp.tool()
|
|
168
|
+
def add_comment(card_id: str, text: str) -> dict:
|
|
169
|
+
"""Add a comment to a card"""
|
|
170
|
+
return trello_request(f"/cards/{card_id}/actions/comments", "POST", {"text": text})
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
# ============== MEMBERS ==============
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
@mcp.tool()
|
|
177
|
+
def get_me() -> dict:
|
|
178
|
+
"""Get information about the authenticated user"""
|
|
179
|
+
return trello_request("/members/me")
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def main():
|
|
183
|
+
"""Entry point for the MCP server"""
|
|
184
|
+
mcp.run()
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
if __name__ == "__main__":
|
|
188
|
+
main()
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "mcp-server-trello"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "MCP server for Trello API integration"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.10"
|
|
7
|
+
authors = [
|
|
8
|
+
{ name = "Liad Goren", email = "khgs2411@gmail.com" }
|
|
9
|
+
]
|
|
10
|
+
dependencies = [
|
|
11
|
+
"fastmcp>=2.12.4",
|
|
12
|
+
"requests>=2.32.5",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
[project.scripts]
|
|
16
|
+
mcp-server-trello = "mcp_client:main"
|
|
17
|
+
|
|
18
|
+
[build-system]
|
|
19
|
+
requires = ["hatchling"]
|
|
20
|
+
build-backend = "hatchling.build"
|
|
21
|
+
|
|
22
|
+
[tool.hatch.build.targets.wheel]
|
|
23
|
+
packages = ["."]
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# This file was autogenerated by uv via the following command:
|
|
2
|
+
# uv pip compile pyproject.toml --all-extras -o requirements.txt
|
|
3
|
+
annotated-types==0.7.0
|
|
4
|
+
# via pydantic
|
|
5
|
+
anyio==4.11.0
|
|
6
|
+
# via
|
|
7
|
+
# httpx
|
|
8
|
+
# mcp
|
|
9
|
+
# sse-starlette
|
|
10
|
+
# starlette
|
|
11
|
+
attrs==25.3.0
|
|
12
|
+
# via
|
|
13
|
+
# cyclopts
|
|
14
|
+
# jsonschema
|
|
15
|
+
# referencing
|
|
16
|
+
authlib==1.6.5
|
|
17
|
+
# via fastmcp
|
|
18
|
+
certifi==2025.10.5
|
|
19
|
+
# via
|
|
20
|
+
# httpcore
|
|
21
|
+
# httpx
|
|
22
|
+
# requests
|
|
23
|
+
cffi==2.0.0
|
|
24
|
+
# via cryptography
|
|
25
|
+
charset-normalizer==3.4.3
|
|
26
|
+
# via requests
|
|
27
|
+
click==8.3.0
|
|
28
|
+
# via uvicorn
|
|
29
|
+
cryptography==46.0.2
|
|
30
|
+
# via authlib
|
|
31
|
+
cyclopts==3.24.0
|
|
32
|
+
# via fastmcp
|
|
33
|
+
dnspython==2.8.0
|
|
34
|
+
# via email-validator
|
|
35
|
+
docstring-parser==0.17.0
|
|
36
|
+
# via cyclopts
|
|
37
|
+
docutils==0.22.2
|
|
38
|
+
# via rich-rst
|
|
39
|
+
email-validator==2.3.0
|
|
40
|
+
# via pydantic
|
|
41
|
+
exceptiongroup==1.3.0
|
|
42
|
+
# via fastmcp
|
|
43
|
+
fastmcp==2.12.4
|
|
44
|
+
# via trello-mcp (pyproject.toml)
|
|
45
|
+
h11==0.16.0
|
|
46
|
+
# via
|
|
47
|
+
# httpcore
|
|
48
|
+
# uvicorn
|
|
49
|
+
httpcore==1.0.9
|
|
50
|
+
# via httpx
|
|
51
|
+
httpx==0.28.1
|
|
52
|
+
# via
|
|
53
|
+
# fastmcp
|
|
54
|
+
# mcp
|
|
55
|
+
httpx-sse==0.4.1
|
|
56
|
+
# via mcp
|
|
57
|
+
idna==3.10
|
|
58
|
+
# via
|
|
59
|
+
# anyio
|
|
60
|
+
# email-validator
|
|
61
|
+
# httpx
|
|
62
|
+
# requests
|
|
63
|
+
isodate==0.7.2
|
|
64
|
+
# via openapi-core
|
|
65
|
+
jsonschema==4.25.1
|
|
66
|
+
# via
|
|
67
|
+
# mcp
|
|
68
|
+
# openapi-core
|
|
69
|
+
# openapi-schema-validator
|
|
70
|
+
# openapi-spec-validator
|
|
71
|
+
jsonschema-path==0.3.4
|
|
72
|
+
# via
|
|
73
|
+
# openapi-core
|
|
74
|
+
# openapi-spec-validator
|
|
75
|
+
jsonschema-specifications==2025.9.1
|
|
76
|
+
# via
|
|
77
|
+
# jsonschema
|
|
78
|
+
# openapi-schema-validator
|
|
79
|
+
lazy-object-proxy==1.12.0
|
|
80
|
+
# via openapi-spec-validator
|
|
81
|
+
markdown-it-py==4.0.0
|
|
82
|
+
# via rich
|
|
83
|
+
markupsafe==3.0.3
|
|
84
|
+
# via werkzeug
|
|
85
|
+
mcp==1.16.0
|
|
86
|
+
# via fastmcp
|
|
87
|
+
mdurl==0.1.2
|
|
88
|
+
# via markdown-it-py
|
|
89
|
+
more-itertools==10.8.0
|
|
90
|
+
# via openapi-core
|
|
91
|
+
openapi-core==0.19.5
|
|
92
|
+
# via fastmcp
|
|
93
|
+
openapi-pydantic==0.5.1
|
|
94
|
+
# via fastmcp
|
|
95
|
+
openapi-schema-validator==0.6.3
|
|
96
|
+
# via
|
|
97
|
+
# openapi-core
|
|
98
|
+
# openapi-spec-validator
|
|
99
|
+
openapi-spec-validator==0.7.2
|
|
100
|
+
# via openapi-core
|
|
101
|
+
parse==1.20.2
|
|
102
|
+
# via openapi-core
|
|
103
|
+
pathable==0.4.4
|
|
104
|
+
# via jsonschema-path
|
|
105
|
+
pycparser==2.23
|
|
106
|
+
# via cffi
|
|
107
|
+
pydantic==2.11.10
|
|
108
|
+
# via
|
|
109
|
+
# fastmcp
|
|
110
|
+
# mcp
|
|
111
|
+
# openapi-pydantic
|
|
112
|
+
# pydantic-settings
|
|
113
|
+
pydantic-core==2.33.2
|
|
114
|
+
# via pydantic
|
|
115
|
+
pydantic-settings==2.11.0
|
|
116
|
+
# via mcp
|
|
117
|
+
pygments==2.19.2
|
|
118
|
+
# via rich
|
|
119
|
+
pyperclip==1.11.0
|
|
120
|
+
# via fastmcp
|
|
121
|
+
python-dotenv==1.1.1
|
|
122
|
+
# via
|
|
123
|
+
# fastmcp
|
|
124
|
+
# pydantic-settings
|
|
125
|
+
python-multipart==0.0.20
|
|
126
|
+
# via mcp
|
|
127
|
+
pyyaml==6.0.3
|
|
128
|
+
# via jsonschema-path
|
|
129
|
+
referencing==0.36.2
|
|
130
|
+
# via
|
|
131
|
+
# jsonschema
|
|
132
|
+
# jsonschema-path
|
|
133
|
+
# jsonschema-specifications
|
|
134
|
+
requests==2.32.5
|
|
135
|
+
# via
|
|
136
|
+
# trello-mcp (pyproject.toml)
|
|
137
|
+
# jsonschema-path
|
|
138
|
+
rfc3339-validator==0.1.4
|
|
139
|
+
# via openapi-schema-validator
|
|
140
|
+
rich==14.1.0
|
|
141
|
+
# via
|
|
142
|
+
# cyclopts
|
|
143
|
+
# fastmcp
|
|
144
|
+
# rich-rst
|
|
145
|
+
rich-rst==1.3.1
|
|
146
|
+
# via cyclopts
|
|
147
|
+
rpds-py==0.27.1
|
|
148
|
+
# via
|
|
149
|
+
# jsonschema
|
|
150
|
+
# referencing
|
|
151
|
+
six==1.17.0
|
|
152
|
+
# via rfc3339-validator
|
|
153
|
+
sniffio==1.3.1
|
|
154
|
+
# via anyio
|
|
155
|
+
sse-starlette==3.0.2
|
|
156
|
+
# via mcp
|
|
157
|
+
starlette==0.48.0
|
|
158
|
+
# via mcp
|
|
159
|
+
typing-extensions==4.15.0
|
|
160
|
+
# via
|
|
161
|
+
# openapi-core
|
|
162
|
+
# pydantic
|
|
163
|
+
# pydantic-core
|
|
164
|
+
# typing-inspection
|
|
165
|
+
typing-inspection==0.4.2
|
|
166
|
+
# via
|
|
167
|
+
# pydantic
|
|
168
|
+
# pydantic-settings
|
|
169
|
+
urllib3==2.5.0
|
|
170
|
+
# via requests
|
|
171
|
+
uvicorn==0.37.0
|
|
172
|
+
# via mcp
|
|
173
|
+
werkzeug==3.1.1
|
|
174
|
+
# via openapi-core
|