universal-mcp-applications 0.1.17__py3-none-any.whl → 0.1.19__py3-none-any.whl
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.
Potentially problematic release.
This version of universal-mcp-applications might be problematic. Click here for more details.
- universal_mcp/applications/ahrefs/README.md +3 -3
- universal_mcp/applications/airtable/README.md +3 -3
- universal_mcp/applications/asana/README.md +3 -3
- universal_mcp/applications/aws_s3/README.md +29 -0
- universal_mcp/applications/bill/README.md +249 -0
- universal_mcp/applications/calendly/README.md +45 -45
- universal_mcp/applications/canva/README.md +35 -35
- universal_mcp/applications/clickup/README.md +4 -4
- universal_mcp/applications/contentful/README.md +1 -2
- universal_mcp/applications/crustdata/README.md +3 -3
- universal_mcp/applications/domain_checker/README.md +2 -2
- universal_mcp/applications/e2b/README.md +4 -4
- universal_mcp/applications/elevenlabs/README.md +3 -77
- universal_mcp/applications/exa/README.md +7 -7
- universal_mcp/applications/falai/README.md +13 -12
- universal_mcp/applications/falai/app.py +6 -6
- universal_mcp/applications/figma/README.md +3 -3
- universal_mcp/applications/file_system/README.md +13 -0
- universal_mcp/applications/firecrawl/README.md +9 -9
- universal_mcp/applications/firecrawl/app.py +10 -10
- universal_mcp/applications/fireflies/README.md +14 -14
- universal_mcp/applications/fpl/README.md +12 -12
- universal_mcp/applications/fpl/app.py +5 -5
- universal_mcp/applications/github/README.md +10 -10
- universal_mcp/applications/github/app.py +9 -9
- universal_mcp/applications/google_calendar/README.md +10 -10
- universal_mcp/applications/google_calendar/app.py +10 -10
- universal_mcp/applications/google_docs/README.md +14 -14
- universal_mcp/applications/google_docs/app.py +12 -12
- universal_mcp/applications/google_drive/README.md +54 -57
- universal_mcp/applications/google_drive/app.py +38 -38
- universal_mcp/applications/google_gemini/README.md +3 -14
- universal_mcp/applications/google_gemini/app.py +13 -12
- universal_mcp/applications/google_mail/README.md +20 -20
- universal_mcp/applications/google_mail/app.py +19 -19
- universal_mcp/applications/google_searchconsole/README.md +10 -10
- universal_mcp/applications/google_searchconsole/app.py +8 -8
- universal_mcp/applications/google_sheet/README.md +25 -25
- universal_mcp/applications/google_sheet/app.py +20 -20
- universal_mcp/applications/http_tools/README.md +5 -5
- universal_mcp/applications/hubspot/__init__.py +1 -1
- universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
- universal_mcp/applications/hubspot/api_segments/api_segment_base.py +25 -0
- universal_mcp/applications/hubspot/api_segments/crm_api.py +7337 -0
- universal_mcp/applications/hubspot/api_segments/marketing_api.py +1467 -0
- universal_mcp/applications/hubspot/app.py +74 -146
- universal_mcp/applications/klaviyo/README.md +0 -36
- universal_mcp/applications/linkedin/README.md +4 -4
- universal_mcp/applications/linkedin/app.py +4 -4
- universal_mcp/applications/mailchimp/README.md +3 -3
- universal_mcp/applications/ms_teams/README.md +31 -31
- universal_mcp/applications/ms_teams/app.py +28 -28
- universal_mcp/applications/neon/README.md +3 -3
- universal_mcp/applications/openai/README.md +18 -17
- universal_mcp/applications/outlook/README.md +9 -9
- universal_mcp/applications/outlook/app.py +9 -9
- universal_mcp/applications/perplexity/README.md +4 -4
- universal_mcp/applications/posthog/README.md +128 -127
- universal_mcp/applications/reddit/README.md +21 -124
- universal_mcp/applications/reddit/app.py +90 -89
- universal_mcp/applications/replicate/README.md +10 -10
- universal_mcp/applications/resend/README.md +29 -29
- universal_mcp/applications/scraper/README.md +4 -4
- universal_mcp/applications/scraper/app.py +31 -31
- universal_mcp/applications/semrush/README.md +3 -0
- universal_mcp/applications/serpapi/README.md +3 -3
- universal_mcp/applications/sharepoint/README.md +17 -0
- universal_mcp/applications/sharepoint/app.py +7 -7
- universal_mcp/applications/shortcut/README.md +3 -3
- universal_mcp/applications/slack/README.md +23 -0
- universal_mcp/applications/spotify/README.md +3 -3
- universal_mcp/applications/supabase/README.md +3 -3
- universal_mcp/applications/tavily/README.md +4 -4
- universal_mcp/applications/twilio/README.md +15 -0
- universal_mcp/applications/twitter/README.md +92 -89
- universal_mcp/applications/twitter/app.py +11 -11
- universal_mcp/applications/unipile/README.md +17 -17
- universal_mcp/applications/unipile/app.py +14 -14
- universal_mcp/applications/whatsapp/README.md +12 -12
- universal_mcp/applications/whatsapp/app.py +13 -13
- universal_mcp/applications/whatsapp_business/README.md +23 -23
- universal_mcp/applications/youtube/README.md +46 -46
- universal_mcp/applications/youtube/app.py +7 -1
- universal_mcp/applications/zenquotes/README.md +1 -1
- {universal_mcp_applications-0.1.17.dist-info → universal_mcp_applications-0.1.19.dist-info}/METADATA +2 -89
- {universal_mcp_applications-0.1.17.dist-info → universal_mcp_applications-0.1.19.dist-info}/RECORD +88 -83
- {universal_mcp_applications-0.1.17.dist-info → universal_mcp_applications-0.1.19.dist-info}/WHEEL +0 -0
- {universal_mcp_applications-0.1.17.dist-info → universal_mcp_applications-0.1.19.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,38 +1,23 @@
|
|
|
1
|
-
from datetime import UTC, datetime
|
|
2
|
-
from typing import Any
|
|
3
|
-
|
|
4
1
|
from universal_mcp.applications.application import APIApplication
|
|
5
2
|
from universal_mcp.integrations import Integration
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
pass
|
|
11
|
-
|
|
12
|
-
def list_tools(self):
|
|
13
|
-
return []
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
class MarketingApi:
|
|
17
|
-
def __init__(self, api_client):
|
|
18
|
-
pass
|
|
19
|
-
|
|
20
|
-
def list_tools(self):
|
|
21
|
-
return []
|
|
22
|
-
|
|
3
|
+
from universal_mcp.applications.hubspot.api_segments.crm_api import CrmApi
|
|
4
|
+
from universal_mcp.applications.hubspot.api_segments.marketing_api import MarketingApi
|
|
5
|
+
from typing import List, Optional, Any
|
|
6
|
+
from datetime import datetime, timezone
|
|
23
7
|
|
|
24
8
|
class HubspotApp(APIApplication):
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
9
|
+
|
|
10
|
+
def __init__(self, integration: Integration=None, **kwargs) -> None:
|
|
11
|
+
super().__init__(name='hubspot', integration=integration, **kwargs)
|
|
12
|
+
self.base_url = 'https://api.hubapi.com'
|
|
28
13
|
self.crm = CrmApi(self)
|
|
29
14
|
self.marketing = MarketingApi(self)
|
|
30
|
-
|
|
15
|
+
|
|
31
16
|
def add_a_note(
|
|
32
17
|
self,
|
|
33
18
|
hs_note_body: str,
|
|
34
|
-
hs_timestamp: str
|
|
35
|
-
associations:
|
|
19
|
+
hs_timestamp: Optional[str] = None,
|
|
20
|
+
associations: Optional[List[dict[str, Any]]] = None,
|
|
36
21
|
) -> dict[str, Any]:
|
|
37
22
|
"""
|
|
38
23
|
Create a note in HubSpot with the given properties and associations.
|
|
@@ -53,30 +38,28 @@ class HubspotApp(APIApplication):
|
|
|
53
38
|
"""
|
|
54
39
|
if hs_note_body is None:
|
|
55
40
|
raise ValueError("Missing required parameter 'hs_note_body'.")
|
|
56
|
-
|
|
41
|
+
|
|
57
42
|
url = f"{self.base_url}/crm/v3/objects/notes"
|
|
58
|
-
|
|
43
|
+
|
|
59
44
|
# Build the properties object
|
|
60
45
|
properties = {
|
|
61
46
|
"hs_note_body": hs_note_body,
|
|
62
|
-
"hs_timestamp": hs_timestamp
|
|
63
|
-
if hs_timestamp
|
|
64
|
-
else datetime.now(UTC).isoformat(),
|
|
47
|
+
"hs_timestamp": hs_timestamp if hs_timestamp else datetime.now(timezone.utc).isoformat()
|
|
65
48
|
}
|
|
66
|
-
|
|
49
|
+
|
|
67
50
|
# Build the request body
|
|
68
|
-
request_body_data: dict[str, Any] = {
|
|
69
|
-
|
|
51
|
+
request_body_data: dict[str, Any] = {
|
|
52
|
+
"properties": properties
|
|
53
|
+
}
|
|
54
|
+
|
|
70
55
|
# Add associations if provided
|
|
71
56
|
if associations:
|
|
72
57
|
request_body_data["associations"] = associations
|
|
73
|
-
|
|
58
|
+
|
|
74
59
|
response = self._post(url, data=request_body_data)
|
|
75
60
|
return self._handle_response(response)
|
|
76
61
|
|
|
77
|
-
def fetch_multiple_lists(
|
|
78
|
-
self, listIds: list[str] | None = None, includeFilters: bool | None = None
|
|
79
|
-
) -> dict[str, Any]:
|
|
62
|
+
def fetch_multiple_lists(self, listIds: Optional[List[str]] = None, includeFilters: Optional[bool] = None) -> dict[str, Any]:
|
|
80
63
|
"""
|
|
81
64
|
Fetch multiple lists in a single request by ILS list ID. The response will include the definitions of all lists that exist for the listIds provided.
|
|
82
65
|
|
|
@@ -94,20 +77,16 @@ class HubspotApp(APIApplication):
|
|
|
94
77
|
Lists
|
|
95
78
|
"""
|
|
96
79
|
url = f"{self.base_url}/crm/v3/lists/"
|
|
97
|
-
query_params = {
|
|
98
|
-
k: v
|
|
99
|
-
for k, v in [("listIds", listIds), ("includeFilters", includeFilters)]
|
|
100
|
-
if v is not None
|
|
101
|
-
}
|
|
80
|
+
query_params = {k: v for k, v in [('listIds', listIds), ('includeFilters', includeFilters)] if v is not None}
|
|
102
81
|
response = self._get(url, params=query_params)
|
|
103
|
-
return self._handle_response(response)
|
|
82
|
+
return self._handle_response(response)
|
|
104
83
|
|
|
105
84
|
def fetch_list_memberships(
|
|
106
85
|
self,
|
|
107
86
|
listId: str,
|
|
108
|
-
after: str
|
|
109
|
-
before: str
|
|
110
|
-
limit: int
|
|
87
|
+
after: Optional[str] = None,
|
|
88
|
+
before: Optional[str] = None,
|
|
89
|
+
limit: Optional[int] = None,
|
|
111
90
|
) -> dict[str, Any]:
|
|
112
91
|
"""
|
|
113
92
|
Fetch the memberships of a list in order sorted by the recordId of the records in the list.
|
|
@@ -129,34 +108,24 @@ class HubspotApp(APIApplication):
|
|
|
129
108
|
"""
|
|
130
109
|
if listId is None:
|
|
131
110
|
raise ValueError("Missing required parameter 'listId'.")
|
|
132
|
-
|
|
111
|
+
|
|
133
112
|
url = f"{self.base_url}/crm/v3/lists/{listId}/memberships"
|
|
134
113
|
query_params = {}
|
|
135
|
-
|
|
114
|
+
|
|
136
115
|
if after is not None:
|
|
137
116
|
query_params["after"] = after
|
|
138
117
|
if before is not None:
|
|
139
118
|
query_params["before"] = before
|
|
140
119
|
if limit is not None:
|
|
141
120
|
query_params["limit"] = limit
|
|
142
|
-
|
|
121
|
+
|
|
143
122
|
response = self._get(url, params=query_params)
|
|
144
123
|
return self._handle_response(response)
|
|
145
124
|
|
|
146
|
-
def create_list(
|
|
147
|
-
self,
|
|
148
|
-
objectTypeId: str,
|
|
149
|
-
processingType: str,
|
|
150
|
-
name: str,
|
|
151
|
-
membershipSettings: dict[str, Any] | None = None,
|
|
152
|
-
customProperties: dict[str, str] | None = None,
|
|
153
|
-
listFolderId: int | None = None,
|
|
154
|
-
listPermissions: dict[str, Any] | None = None,
|
|
155
|
-
filterBranch: Any | None = None,
|
|
156
|
-
) -> dict[str, Any]:
|
|
125
|
+
def create_list(self, objectTypeId: str, processingType: str, name: str, membershipSettings: Optional[dict[str, Any]] = None, customProperties: Optional[dict[str, str]] = None, listFolderId: Optional[int] = None, listPermissions: Optional[dict[str, Any]] = None, filterBranch: Optional[Any] = None) -> dict[str, Any]:
|
|
157
126
|
"""
|
|
158
|
-
Create a new list in HubSpot with the specified object type, processing type, and name.
|
|
159
|
-
Optionally use this to provide membership settings, custom properties, a folder ID, list permissions,
|
|
127
|
+
Create a new list in HubSpot with the specified object type, processing type, and name.
|
|
128
|
+
Optionally use this to provide membership settings, custom properties, a folder ID, list permissions,
|
|
160
129
|
and a filter branch to further configure the list.
|
|
161
130
|
|
|
162
131
|
Args:
|
|
@@ -180,31 +149,22 @@ class HubspotApp(APIApplication):
|
|
|
180
149
|
"""
|
|
181
150
|
request_body_data = None
|
|
182
151
|
request_body_data = {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
192
|
-
request_body_data = {
|
|
193
|
-
k: v for k, v in request_body_data.items() if v is not None
|
|
152
|
+
'membershipSettings': membershipSettings,
|
|
153
|
+
'objectTypeId': objectTypeId,
|
|
154
|
+
'processingType': processingType,
|
|
155
|
+
'customProperties': customProperties,
|
|
156
|
+
'listFolderId': listFolderId,
|
|
157
|
+
'name': name,
|
|
158
|
+
'listPermissions': listPermissions,
|
|
159
|
+
'filterBranch': filterBranch,
|
|
194
160
|
}
|
|
161
|
+
request_body_data = {k: v for k, v in request_body_data.items() if v is not None}
|
|
195
162
|
url = f"{self.base_url}/crm/v3/lists/"
|
|
196
163
|
query_params = {}
|
|
197
|
-
response = self._post(
|
|
198
|
-
url,
|
|
199
|
-
data=request_body_data,
|
|
200
|
-
params=query_params,
|
|
201
|
-
content_type="application/json",
|
|
202
|
-
)
|
|
164
|
+
response = self._post(url, data=request_body_data, params=query_params, content_type='application/json')
|
|
203
165
|
return self._handle_response(response)
|
|
204
166
|
|
|
205
|
-
def get_list_by_id(
|
|
206
|
-
self, listId: str, includeFilters: bool | None = None
|
|
207
|
-
) -> dict[str, Any]:
|
|
167
|
+
def get_list_by_id(self, listId: str, includeFilters: Optional[bool] = None) -> dict[str, Any]:
|
|
208
168
|
"""
|
|
209
169
|
Fetch a single list by ILS list ID.
|
|
210
170
|
|
|
@@ -224,9 +184,7 @@ class HubspotApp(APIApplication):
|
|
|
224
184
|
if listId is None:
|
|
225
185
|
raise ValueError("Missing required parameter 'listId'.")
|
|
226
186
|
url = f"{self.base_url}/crm/v3/lists/{listId}"
|
|
227
|
-
query_params = {
|
|
228
|
-
k: v for k, v in [("includeFilters", includeFilters)] if v is not None
|
|
229
|
-
}
|
|
187
|
+
query_params = {k: v for k, v in [('includeFilters', includeFilters)] if v is not None}
|
|
230
188
|
response = self._get(url, params=query_params)
|
|
231
189
|
return self._handle_response(response)
|
|
232
190
|
|
|
@@ -252,8 +210,8 @@ class HubspotApp(APIApplication):
|
|
|
252
210
|
query_params = {}
|
|
253
211
|
response = self._delete(url, params=query_params)
|
|
254
212
|
return self._handle_response(response)
|
|
255
|
-
|
|
256
|
-
def add_records_to_list(self, listId: str, items:
|
|
213
|
+
|
|
214
|
+
def add_records_to_list(self, listId: str, items: List[str]) -> dict[str, Any]:
|
|
257
215
|
"""
|
|
258
216
|
Add the records provided to the list. Records that do not exist or that are already members of the list are ignored.
|
|
259
217
|
This only works for lists that have a processingType of MANUAL or SNAPSHOT.
|
|
@@ -278,15 +236,10 @@ class HubspotApp(APIApplication):
|
|
|
278
236
|
request_body_data = items
|
|
279
237
|
url = f"{self.base_url}/crm/v3/lists/{listId}/memberships/add"
|
|
280
238
|
query_params = {}
|
|
281
|
-
response = self._put(
|
|
282
|
-
|
|
283
|
-
data=request_body_data,
|
|
284
|
-
params=query_params,
|
|
285
|
-
content_type="application/json",
|
|
286
|
-
)
|
|
287
|
-
return self._handle_response(response)
|
|
239
|
+
response = self._put(url, data=request_body_data, params=query_params, content_type='application/json')
|
|
240
|
+
return self._handle_response(response)
|
|
288
241
|
|
|
289
|
-
def remove_records_from_list(self, listId: str, items:
|
|
242
|
+
def remove_records_from_list(self, listId: str, items: List[str]) -> dict[str, Any]:
|
|
290
243
|
"""
|
|
291
244
|
Remove the records provided from the list. Records that are not members of the list are ignored.
|
|
292
245
|
This only works for lists that have a processingType of MANUAL or SNAPSHOT.
|
|
@@ -311,24 +264,10 @@ class HubspotApp(APIApplication):
|
|
|
311
264
|
request_body_data = items
|
|
312
265
|
url = f"{self.base_url}/crm/v3/lists/{listId}/memberships/remove"
|
|
313
266
|
query_params = {}
|
|
314
|
-
response = self._put(
|
|
315
|
-
url,
|
|
316
|
-
data=request_body_data,
|
|
317
|
-
params=query_params,
|
|
318
|
-
content_type="application/json",
|
|
319
|
-
)
|
|
267
|
+
response = self._put(url, data=request_body_data, params=query_params, content_type='application/json')
|
|
320
268
|
return self._handle_response(response)
|
|
321
269
|
|
|
322
|
-
def search_lists(
|
|
323
|
-
self,
|
|
324
|
-
listIds: list[str] | None = None,
|
|
325
|
-
offset: int | None = None,
|
|
326
|
-
query: str | None = None,
|
|
327
|
-
count: int | None = None,
|
|
328
|
-
processingTypes: list[str] | None = None,
|
|
329
|
-
additionalProperties: list[str] | None = None,
|
|
330
|
-
sort: str | None = None,
|
|
331
|
-
) -> dict[str, Any]:
|
|
270
|
+
def search_lists(self, listIds: Optional[List[str]] = None, offset: Optional[int] = None, query: Optional[str] = None, count: Optional[int] = None, processingTypes: Optional[List[str]] = None, additionalProperties: Optional[List[str]] = None, sort: Optional[str] = None) -> dict[str, Any]:
|
|
332
271
|
"""
|
|
333
272
|
Search lists by list name or page through all lists by providing an empty query value.
|
|
334
273
|
|
|
@@ -360,30 +299,21 @@ class HubspotApp(APIApplication):
|
|
|
360
299
|
"""
|
|
361
300
|
request_body_data = None
|
|
362
301
|
request_body_data = {
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
}
|
|
371
|
-
request_body_data = {
|
|
372
|
-
k: v for k, v in request_body_data.items() if v is not None
|
|
302
|
+
'listIds': listIds,
|
|
303
|
+
'offset': offset,
|
|
304
|
+
'query': query,
|
|
305
|
+
'count': count,
|
|
306
|
+
'processingTypes': processingTypes,
|
|
307
|
+
'additionalProperties': additionalProperties,
|
|
308
|
+
'sort': sort,
|
|
373
309
|
}
|
|
310
|
+
request_body_data = {k: v for k, v in request_body_data.items() if v is not None}
|
|
374
311
|
url = f"{self.base_url}/crm/v3/lists/search"
|
|
375
312
|
query_params = {}
|
|
376
|
-
response = self._post(
|
|
377
|
-
url,
|
|
378
|
-
data=request_body_data,
|
|
379
|
-
params=query_params,
|
|
380
|
-
content_type="application/json",
|
|
381
|
-
)
|
|
313
|
+
response = self._post(url, data=request_body_data, params=query_params, content_type='application/json')
|
|
382
314
|
return self._handle_response(response)
|
|
383
315
|
|
|
384
|
-
def fetch_list_by_name(
|
|
385
|
-
self, objectTypeId: str, listName: str, includeFilters: bool | None = None
|
|
386
|
-
) -> dict[str, Any]:
|
|
316
|
+
def fetch_list_by_name(self, objectTypeId: str, listName: str, includeFilters: Optional[bool] = None) -> dict[str, Any]:
|
|
387
317
|
"""
|
|
388
318
|
Fetch a list by its name and object type ID.
|
|
389
319
|
|
|
@@ -406,25 +336,23 @@ class HubspotApp(APIApplication):
|
|
|
406
336
|
if listName is None:
|
|
407
337
|
raise ValueError("Missing required parameter 'listName'.")
|
|
408
338
|
url = f"{self.base_url}/crm/v3/lists/object-type-id/{objectTypeId}/name/{listName}"
|
|
409
|
-
query_params = {
|
|
410
|
-
k: v for k, v in [("includeFilters", includeFilters)] if v is not None
|
|
411
|
-
}
|
|
339
|
+
query_params = {k: v for k, v in [('includeFilters', includeFilters)] if v is not None}
|
|
412
340
|
response = self._get(url, params=query_params)
|
|
413
341
|
return self._handle_response(response)
|
|
414
342
|
|
|
343
|
+
|
|
415
344
|
def list_tools(self):
|
|
416
345
|
all_tools = [
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
]
|
|
346
|
+
self.add_a_note,
|
|
347
|
+
self.fetch_multiple_lists,
|
|
348
|
+
self.fetch_list_memberships,
|
|
349
|
+
self.create_list,
|
|
350
|
+
self.get_list_by_id,
|
|
351
|
+
self.delete_list_by_id,
|
|
352
|
+
self.add_records_to_list,
|
|
353
|
+
self.remove_records_from_list,
|
|
354
|
+
self.search_lists,
|
|
355
|
+
self.fetch_list_by_name]
|
|
428
356
|
all_tools.extend(self.crm.list_tools())
|
|
429
357
|
all_tools.extend(self.marketing.list_tools())
|
|
430
|
-
return all_tools
|
|
358
|
+
return all_tools
|
|
@@ -275,39 +275,3 @@ This is automatically generated from OpenAPI schema for the KlaviyoApp API.
|
|
|
275
275
|
| `update_webhook` | Updates the webhook resource identified by {id} using partial modifications, requiring a revision header and returning appropriate status codes for success (200), client errors (400), or server errors (500). |
|
|
276
276
|
| `get_webhook_topics` | Retrieves webhook topics with an optional revision header parameter, returning 200, 400, or 500 status codes. |
|
|
277
277
|
| `get_webhook_topic` | Retrieves a webhook topic by its ID using the GET method, supporting revision information via a header parameter, and returns responses for successful retrieval (200), bad requests (400), and internal server errors (500). |
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
## 📁 Project Structure
|
|
281
|
-
|
|
282
|
-
The generated project has a standard layout:
|
|
283
|
-
```
|
|
284
|
-
.
|
|
285
|
-
├── src/ # Source code directory
|
|
286
|
-
│ └── universal_mcp_klaviyoapp/
|
|
287
|
-
│ ├── __init__.py
|
|
288
|
-
│ └── mcp.py # Server is launched here
|
|
289
|
-
│ └── app.py # Application tools are defined here
|
|
290
|
-
├── tests/ # Directory for project tests
|
|
291
|
-
├── .env # Environment variables (for local development)
|
|
292
|
-
├── pyproject.toml # Project dependencies managed by uv
|
|
293
|
-
├── README.md # This file
|
|
294
|
-
```
|
|
295
|
-
|
|
296
|
-
## 📝 License
|
|
297
|
-
|
|
298
|
-
This project is licensed under the MIT License.
|
|
299
|
-
|
|
300
|
-
---
|
|
301
|
-
|
|
302
|
-
_This project was generated using **MCP CLI** — Happy coding! 🚀_
|
|
303
|
-
|
|
304
|
-
## Usage
|
|
305
|
-
|
|
306
|
-
- Login to AgentR
|
|
307
|
-
- Follow the quickstart guide to setup MCP Server for your client
|
|
308
|
-
- Visit Apps Store and enable the KlaviyoApp app
|
|
309
|
-
- Restart the MCP Server
|
|
310
|
-
|
|
311
|
-
### Local Development
|
|
312
|
-
|
|
313
|
-
- Follow the README to test with the local MCP Server
|
|
@@ -9,7 +9,7 @@ This is automatically generated from OpenAPI schema for the LinkedinApp API.
|
|
|
9
9
|
|
|
10
10
|
| Tool | Description |
|
|
11
11
|
|------|-------------|
|
|
12
|
-
| `create_post` |
|
|
13
|
-
| `
|
|
14
|
-
| `delete_post` |
|
|
15
|
-
| `update_post` |
|
|
12
|
+
| `create_post` | Publishes a new text post to a specified LinkedIn author's feed (person or organization). It allows configuring visibility, distribution, and lifecycle state. Upon success, it returns the unique URN and URL for the new post, distinguishing this creation operation from the update or delete functions. |
|
|
13
|
+
| `get_authenticated_user_profile` | Retrieves the authenticated user's profile from the LinkedIn `/v2/userinfo` endpoint. Using credentials from the active integration, it returns a dictionary with basic user details like name and email. This function is for fetching user data, distinct from others that create, update, or delete posts. |
|
|
14
|
+
| `delete_post` | Deletes a LinkedIn post identified by its unique Uniform Resource Name (URN). This function sends a DELETE request to the API, permanently removing the content. Upon a successful HTTP 204 response, it returns a dictionary confirming the post's deletion status. |
|
|
15
|
+
| `update_post` | Modifies an existing LinkedIn post, identified by its URN, by performing a partial update. It selectively changes attributes like commentary or ad context, distinguishing it from `create_post` which creates new content. Returns a confirmation dictionary upon successful completion. |
|
|
@@ -37,7 +37,7 @@ class LinkedinApp(APIApplication):
|
|
|
37
37
|
is_reshare_disabled: bool = False,
|
|
38
38
|
) -> dict[str, str]:
|
|
39
39
|
"""
|
|
40
|
-
Publishes a new text post to a specified LinkedIn author's feed (person or organization). It
|
|
40
|
+
Publishes a new text post to a specified LinkedIn author's feed (person or organization). It allows configuring visibility, distribution, and lifecycle state. Upon success, it returns the unique URN and URL for the new post, distinguishing this creation operation from the update or delete functions.
|
|
41
41
|
|
|
42
42
|
Args:
|
|
43
43
|
commentary (str): The user generated commentary for the post. Supports mentions using format "@[Entity Name](urn:li:organization:123456)" and hashtags using "#keyword". Text linking to annotated entities must match the name exactly (case sensitive). For member mentions, partial name matching is supported.
|
|
@@ -99,7 +99,7 @@ class LinkedinApp(APIApplication):
|
|
|
99
99
|
|
|
100
100
|
def get_authenticated_user_profile(self) -> dict[str, Any]:
|
|
101
101
|
"""
|
|
102
|
-
Retrieves the authenticated user's profile
|
|
102
|
+
Retrieves the authenticated user's profile from the LinkedIn `/v2/userinfo` endpoint. Using credentials from the active integration, it returns a dictionary with basic user details like name and email. This function is for fetching user data, distinct from others that create, update, or delete posts.
|
|
103
103
|
|
|
104
104
|
Returns:
|
|
105
105
|
dict[str, Any]: Dictionary containing your LinkedIn profile information.
|
|
@@ -123,7 +123,7 @@ class LinkedinApp(APIApplication):
|
|
|
123
123
|
|
|
124
124
|
def delete_post(self, post_urn: str) -> dict[str, str]:
|
|
125
125
|
"""
|
|
126
|
-
Deletes a
|
|
126
|
+
Deletes a LinkedIn post identified by its unique Uniform Resource Name (URN). This function sends a DELETE request to the API, permanently removing the content. Upon a successful HTTP 204 response, it returns a dictionary confirming the post's deletion status.
|
|
127
127
|
|
|
128
128
|
Args:
|
|
129
129
|
post_urn (str): The URN of the post to delete. Can be either a ugcPostUrn (urn:li:ugcPost:{id}) or shareUrn (urn:li:share:{id}).
|
|
@@ -163,7 +163,7 @@ class LinkedinApp(APIApplication):
|
|
|
163
163
|
ad_context_status: str | None = None,
|
|
164
164
|
) -> dict[str, str]:
|
|
165
165
|
"""
|
|
166
|
-
Modifies an existing LinkedIn post identified by its URN
|
|
166
|
+
Modifies an existing LinkedIn post, identified by its URN, by performing a partial update. It selectively changes attributes like commentary or ad context, distinguishing it from `create_post` which creates new content. Returns a confirmation dictionary upon successful completion.
|
|
167
167
|
|
|
168
168
|
Args:
|
|
169
169
|
post_urn (str): The URN of the post to update. Can be either a ugcPostUrn (urn:li:ugcPost:{id}) or shareUrn (urn:li:share:{id}).
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# MailchimpApp MCP Server
|
|
2
2
|
|
|
3
|
-
An MCP Server for the
|
|
3
|
+
An MCP Server for the MailchimpApp API.
|
|
4
4
|
|
|
5
5
|
## 🛠️ Tool List
|
|
6
6
|
|
|
7
|
-
This is automatically generated from OpenAPI schema for the
|
|
7
|
+
This is automatically generated from OpenAPI schema for the MailchimpApp API.
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
| Tool | Description |
|
|
@@ -9,34 +9,34 @@ This is automatically generated from OpenAPI schema for the MsTeamsApp API.
|
|
|
9
9
|
|
|
10
10
|
| Tool | Description |
|
|
11
11
|
|------|-------------|
|
|
12
|
-
| `
|
|
13
|
-
| `get_joined_teams` | Fetches a list of
|
|
14
|
-
| `list_channels_for_team` |
|
|
15
|
-
| `send_chat_message` |
|
|
16
|
-
| `send_channel_message` |
|
|
17
|
-
| `reply_to_channel_message` |
|
|
18
|
-
| `
|
|
19
|
-
| `
|
|
20
|
-
| `update_chat_details` |
|
|
21
|
-
| `
|
|
22
|
-
| `list_chat_members` |
|
|
23
|
-
| `add_member_to_chat` |
|
|
24
|
-
| `
|
|
25
|
-
| `delete_chat_member` |
|
|
26
|
-
| `list_chat_messages` |
|
|
27
|
-
| `
|
|
28
|
-
| `
|
|
29
|
-
| `
|
|
30
|
-
| `
|
|
31
|
-
| `create_team_from_group` |
|
|
32
|
-
| `create_team` |
|
|
33
|
-
| `
|
|
34
|
-
| `
|
|
35
|
-
| `
|
|
36
|
-
| `
|
|
37
|
-
| `
|
|
38
|
-
| `
|
|
39
|
-
| `
|
|
40
|
-
| `
|
|
41
|
-
| `get_primary_team_channel` |
|
|
42
|
-
| `
|
|
12
|
+
| `get_user_chats` | Retrieves a collection of chats the authenticated user is participating in. Supports optional OData query parameters for advanced filtering, sorting, pagination, and field selection, enabling customized data retrieval from the Microsoft Graph API. |
|
|
13
|
+
| `get_joined_teams` | Fetches all Microsoft Teams the authenticated user belongs to by querying the `/me/joinedTeams` Graph API endpoint. It returns a list of dictionaries, where each dictionary represents a single team's details, unlike functions that list channels or chats for a specific team. |
|
|
14
|
+
| `list_channels_for_team` | Retrieves the collection of channels for a specified Microsoft Teams team by its ID. It supports advanced OData query parameters for filtering, sorting, and pagination, distinguishing it from functions that fetch single channels like `get_channel_details`. |
|
|
15
|
+
| `send_chat_message` | Posts a new message to a specific Microsoft Teams chat using its unique ID. This function targets direct or group chats, distinguishing it from `send_channel_message`, which posts to public team channels, and `reply_to_chat_message`, which responds to existing messages. |
|
|
16
|
+
| `send_channel_message` | Posts a new message to a specified team channel, initiating a new conversation thread. Unlike `reply_to_channel_message`, which replies to a message, this function starts a new topic. It's distinct from `send_chat_message`, which is for private or group chats, not team channels. |
|
|
17
|
+
| `reply_to_channel_message` | Posts a reply to a specific message within a Microsoft Teams channel. It uses the team, channel, and original message IDs to target an existing conversation thread, distinguishing it from `send_channel_message` which starts a new one. |
|
|
18
|
+
| `create_chat` | Creates a new one-on-one or group chat in Microsoft Teams. This function provisions a new conversation using optional parameters like chatType and members, distinguishing it from functions that create teams (`create_team`) or send messages to existing chats (`send_chat_message`). |
|
|
19
|
+
| `get_chat_details` | Retrieves the properties and relationships of a specific chat conversation by its unique ID. Unlike `get_user_chats` which lists all chats, this targets one chat. Optional parameters can select specific fields or expand related entities like members or apps to customize the returned data. |
|
|
20
|
+
| `update_chat_details` | Updates properties of a specific chat, such as its topic, using its unique ID. This function performs a partial update (PATCH), distinguishing it from `get_chat_details` which only retrieves data, and `create_chat` which creates an entirely new chat conversation. |
|
|
21
|
+
| `list_installed_chat_apps` | Retrieves applications installed in a specific chat, identified by `chat_id`. Differentiating from `list_user_installed_apps`, which targets a user's personal scope, this function queries a single conversation. It supports optional parameters for advanced filtering, sorting, and pagination to customize the returned collection. |
|
|
22
|
+
| `list_chat_members` | Retrieves a collection of all members in a specific chat using its ID. It supports OData query parameters for pagination, filtering, and sorting. Unlike `get_chat_member`, which fetches a single individual, this function returns the entire collection of members for the specified chat. |
|
|
23
|
+
| `add_member_to_chat` | Adds a new member to a specific Microsoft Teams chat using its `chat_id`. This function allows for configuring member roles and chat history visibility. It is the direct counterpart to `delete_chat_member`, performing the 'create' action for a chat's membership. |
|
|
24
|
+
| `get_chat_member` | Retrieves detailed information for a specific member within a chat using their unique ID. This function targets a single individual, distinguishing it from `list_chat_members` which returns all members. The response can be customized by selecting specific properties or expanding related entities. |
|
|
25
|
+
| `delete_chat_member` | Removes a specific member from a chat using their unique ID and the chat's ID. This function sends a DELETE request to the Microsoft Graph API to permanently remove the user from the conversation, acting as the counterpart to `add_member_to_chat`. |
|
|
26
|
+
| `list_chat_messages` | Retrieves messages from a specific chat using its ID. Unlike `get_chat_message`, which fetches a single message, this function returns a collection and supports advanced querying for filtering, sorting, and pagination to refine the results. |
|
|
27
|
+
| `get_chat_message` | Retrieves the full details of a single message from a specific chat using both chat and message IDs. This function targets an individual message, differentiating it from `list_chat_messages`, which retrieves a collection. Optional parameters can customize the response by selecting specific properties or expanding entities. |
|
|
28
|
+
| `list_chat_message_replies` | Retrieves all replies for a specific message within a chat, using the parent message's ID. This function, unlike `get_chat_reply_details`, returns a collection and supports OData query parameters for advanced filtering, sorting, and pagination of the results. |
|
|
29
|
+
| `reply_to_chat_message` | Posts a reply to a specific message within a chat. This comprehensive function allows for detailed configuration of the reply's properties, like its body and attachments. It differs from `reply_to_channel_message`, which sends simpler replies to messages within team channels. |
|
|
30
|
+
| `get_chat_reply_details` | Retrieves a specific reply from a chat message thread using the chat, parent message, and reply IDs. Unlike `list_chat_message_replies`, which fetches all replies, this function targets a single reply for detailed information, allowing for customized field selection. |
|
|
31
|
+
| `create_team_from_group` | Enables Microsoft Teams functionality for a pre-existing Microsoft 365 group using its ID. This 'team-ifies' the group, allowing optional configuration of team properties. It differs from `create_team`, which provisions both a new team and its associated group simultaneously. |
|
|
32
|
+
| `create_team` | Creates a new Microsoft Team and its associated Microsoft 365 group. This method builds a team from scratch, allowing specification of initial properties like display name, description, and members. It differs from `create_team_from_group`, which enables team functionality for an existing group. |
|
|
33
|
+
| `get_channel_details` | Retrieves detailed information for a specific channel within a Microsoft Teams team, identified by both team and channel IDs. Optional parameters can select specific properties or expand related entities in the response, distinguishing it from list_channels_for_team, which retrieves a collection of channels. |
|
|
34
|
+
| `update_channel_message` | Updates an existing message within a Microsoft Teams channel, identified by team, channel, and message IDs. This function modifies the original message's properties, like its body, via a PATCH request, distinguishing it from functions that create new messages or update replies. |
|
|
35
|
+
| `update_channel_message_reply` | Updates an existing reply to a specific message within a Microsoft Teams channel. It identifies the target reply using team, channel, parent message, and reply IDs, modifying its properties (e.g., body content, attachments) via a PATCH request. |
|
|
36
|
+
| `list_channel_tabs` | Retrieves a collection of tabs from a specified channel within a Microsoft Teams team. Unlike `get_channel_tab_details`, which fetches a single tab, this function lists all tabs and supports advanced OData query parameters for filtering, sorting, and pagination of the entire collection. |
|
|
37
|
+
| `create_channel_tab` | Creates a new tab in a specified Microsoft Teams channel using team and channel IDs. This function configures the tab's initial properties, such as display name and application, distinguishing it from functions that list (`list_channel_tabs`) or modify (`update_channel_tab`) existing tabs. |
|
|
38
|
+
| `get_channel_tab_details` | Fetches properties for a single tab within a specific Microsoft Teams channel, identified by its team, channel, and tab IDs. Unlike `list_channel_tabs` which gets all tabs, this targets a specific one, with options to select fields or expand related entities in the response. |
|
|
39
|
+
| `update_channel_tab` | Modifies properties of an existing tab within a specific Microsoft Teams channel. It uses the team, channel, and tab IDs to target the tab, allowing for partial updates to its configuration or display name via a PATCH request, differentiating it from tab creation or deletion functions. |
|
|
40
|
+
| `delete_channel_tab` | Permanently removes a specific tab from a Microsoft Teams channel using its unique ID, along with the parent team and channel IDs. This function is the destructive counterpart to `create_channel_tab`, designed to delete a tab rather than create, list, or update one. |
|
|
41
|
+
| `get_primary_team_channel` | Retrieves the primary channel (usually 'General') for a specified team using its ID. Unlike `get_channel_details`, this function directly accesses the team's default channel without requiring a specific channel ID. Optional parameters can select or expand properties in the returned data. |
|
|
42
|
+
| `list_user_installed_apps` | Retrieves applications installed in a user's personal Microsoft Teams scope, identified by their ID. Unlike `list_installed_chat_apps` which targets chat installations, this focuses on the user's scope. It supports optional OData parameters for filtering, sorting, and pagination to customize the returned app collection. |
|