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.
@@ -0,0 +1,10 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
@@ -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,6 @@
1
+ def main():
2
+ print("Hello from trello-mcp!")
3
+
4
+
5
+ if __name__ == "__main__":
6
+ main()
@@ -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