universal-mcp-applications 0.1.30rc1__py3-none-any.whl → 0.1.36rc1__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/app.py +52 -198
- universal_mcp/applications/airtable/app.py +23 -122
- universal_mcp/applications/apollo/app.py +111 -464
- universal_mcp/applications/asana/app.py +417 -1567
- universal_mcp/applications/aws_s3/app.py +33 -100
- universal_mcp/applications/bill/app.py +546 -1957
- universal_mcp/applications/box/app.py +1068 -3981
- universal_mcp/applications/braze/app.py +364 -1430
- universal_mcp/applications/browser_use/app.py +2 -8
- universal_mcp/applications/cal_com_v2/app.py +207 -625
- universal_mcp/applications/calendly/app.py +61 -200
- universal_mcp/applications/canva/app.py +45 -110
- universal_mcp/applications/clickup/app.py +207 -674
- universal_mcp/applications/coda/app.py +146 -426
- universal_mcp/applications/confluence/app.py +310 -1098
- universal_mcp/applications/contentful/app.py +36 -151
- universal_mcp/applications/crustdata/app.py +28 -107
- universal_mcp/applications/dialpad/app.py +283 -756
- universal_mcp/applications/digitalocean/app.py +1766 -5777
- universal_mcp/applications/domain_checker/app.py +3 -54
- universal_mcp/applications/e2b/app.py +14 -64
- universal_mcp/applications/elevenlabs/app.py +9 -47
- universal_mcp/applications/exa/app.py +6 -17
- universal_mcp/applications/falai/app.py +23 -100
- universal_mcp/applications/figma/app.py +53 -137
- universal_mcp/applications/file_system/app.py +2 -13
- universal_mcp/applications/firecrawl/app.py +51 -152
- universal_mcp/applications/fireflies/app.py +59 -281
- universal_mcp/applications/fpl/app.py +91 -528
- universal_mcp/applications/fpl/utils/fixtures.py +15 -49
- universal_mcp/applications/fpl/utils/helper.py +25 -89
- universal_mcp/applications/fpl/utils/league_utils.py +20 -64
- universal_mcp/applications/ghost_content/app.py +52 -161
- universal_mcp/applications/github/app.py +19 -56
- universal_mcp/applications/gong/app.py +88 -248
- universal_mcp/applications/google_calendar/app.py +16 -68
- universal_mcp/applications/google_docs/app.py +88 -188
- universal_mcp/applications/google_drive/app.py +140 -462
- universal_mcp/applications/google_gemini/app.py +12 -64
- universal_mcp/applications/google_mail/app.py +28 -157
- universal_mcp/applications/google_searchconsole/app.py +15 -48
- universal_mcp/applications/google_sheet/app.py +101 -578
- universal_mcp/applications/google_sheet/helper.py +10 -37
- universal_mcp/applications/hashnode/app.py +57 -269
- universal_mcp/applications/heygen/app.py +44 -122
- universal_mcp/applications/http_tools/app.py +10 -32
- universal_mcp/applications/hubspot/api_segments/crm_api.py +460 -1573
- universal_mcp/applications/hubspot/api_segments/marketing_api.py +74 -262
- universal_mcp/applications/hubspot/app.py +23 -87
- universal_mcp/applications/jira/app.py +2071 -7986
- universal_mcp/applications/klaviyo/app.py +494 -1376
- universal_mcp/applications/linkedin/README.md +23 -4
- universal_mcp/applications/linkedin/app.py +392 -212
- universal_mcp/applications/mailchimp/app.py +450 -1605
- universal_mcp/applications/markitdown/app.py +8 -20
- universal_mcp/applications/miro/app.py +217 -699
- universal_mcp/applications/ms_teams/app.py +64 -186
- universal_mcp/applications/neon/app.py +86 -192
- universal_mcp/applications/notion/app.py +21 -36
- universal_mcp/applications/onedrive/app.py +14 -36
- universal_mcp/applications/openai/app.py +42 -165
- universal_mcp/applications/outlook/app.py +16 -76
- universal_mcp/applications/perplexity/app.py +4 -19
- universal_mcp/applications/pipedrive/app.py +832 -3142
- universal_mcp/applications/posthog/app.py +163 -432
- universal_mcp/applications/reddit/app.py +40 -139
- universal_mcp/applications/resend/app.py +41 -107
- universal_mcp/applications/retell/app.py +14 -41
- universal_mcp/applications/rocketlane/app.py +221 -934
- universal_mcp/applications/scraper/README.md +7 -4
- universal_mcp/applications/scraper/app.py +280 -93
- universal_mcp/applications/semanticscholar/app.py +22 -64
- universal_mcp/applications/semrush/app.py +43 -77
- universal_mcp/applications/sendgrid/app.py +512 -1262
- universal_mcp/applications/sentry/app.py +271 -906
- universal_mcp/applications/serpapi/app.py +40 -143
- universal_mcp/applications/sharepoint/app.py +15 -37
- universal_mcp/applications/shopify/app.py +1551 -4287
- universal_mcp/applications/shortcut/app.py +155 -417
- universal_mcp/applications/slack/app.py +50 -101
- universal_mcp/applications/spotify/app.py +126 -325
- universal_mcp/applications/supabase/app.py +104 -213
- universal_mcp/applications/tavily/app.py +1 -1
- universal_mcp/applications/trello/app.py +693 -2656
- universal_mcp/applications/twilio/app.py +14 -50
- universal_mcp/applications/twitter/api_segments/compliance_api.py +4 -14
- universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +6 -18
- universal_mcp/applications/twitter/api_segments/likes_api.py +1 -3
- universal_mcp/applications/twitter/api_segments/lists_api.py +5 -15
- universal_mcp/applications/twitter/api_segments/trends_api.py +1 -3
- universal_mcp/applications/twitter/api_segments/tweets_api.py +9 -31
- universal_mcp/applications/twitter/api_segments/usage_api.py +1 -5
- universal_mcp/applications/twitter/api_segments/users_api.py +14 -42
- universal_mcp/applications/whatsapp/app.py +35 -186
- universal_mcp/applications/whatsapp/audio.py +2 -6
- universal_mcp/applications/whatsapp/whatsapp.py +17 -51
- universal_mcp/applications/whatsapp_business/app.py +70 -283
- universal_mcp/applications/wrike/app.py +45 -118
- universal_mcp/applications/yahoo_finance/app.py +19 -65
- universal_mcp/applications/youtube/app.py +75 -261
- universal_mcp/applications/zenquotes/app.py +2 -2
- {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/METADATA +2 -2
- {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/RECORD +105 -106
- universal_mcp/applications/scraper/scraper_testers.py +0 -17
- {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/WHEEL +0 -0
- {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
from datetime import UTC, datetime
|
|
2
2
|
from typing import Any
|
|
3
|
-
|
|
4
3
|
from universal_mcp.applications.application import APIApplication
|
|
5
4
|
from universal_mcp.integrations import Integration
|
|
6
|
-
|
|
7
5
|
from universal_mcp.applications.hubspot.api_segments.crm_api import CrmApi
|
|
8
6
|
from universal_mcp.applications.hubspot.api_segments.marketing_api import MarketingApi
|
|
9
7
|
|
|
@@ -15,11 +13,8 @@ class HubspotApp(APIApplication):
|
|
|
15
13
|
self.crm = CrmApi(self)
|
|
16
14
|
self.marketing = MarketingApi(self)
|
|
17
15
|
|
|
18
|
-
def add_a_note(
|
|
19
|
-
self,
|
|
20
|
-
hs_note_body: str,
|
|
21
|
-
hs_timestamp: str | None = None,
|
|
22
|
-
associations: list[dict[str, Any]] | None = None,
|
|
16
|
+
async def add_a_note(
|
|
17
|
+
self, hs_note_body: str, hs_timestamp: str | None = None, associations: list[dict[str, Any]] | None = None
|
|
23
18
|
) -> dict[str, Any]:
|
|
24
19
|
"""
|
|
25
20
|
Create a note in HubSpot with the given properties and associations.
|
|
@@ -40,30 +35,15 @@ class HubspotApp(APIApplication):
|
|
|
40
35
|
"""
|
|
41
36
|
if hs_note_body is None:
|
|
42
37
|
raise ValueError("Missing required parameter 'hs_note_body'.")
|
|
43
|
-
|
|
44
38
|
url = f"{self.base_url}/crm/v3/objects/notes"
|
|
45
|
-
|
|
46
|
-
# Build the properties object
|
|
47
|
-
properties = {
|
|
48
|
-
"hs_note_body": hs_note_body,
|
|
49
|
-
"hs_timestamp": hs_timestamp
|
|
50
|
-
if hs_timestamp
|
|
51
|
-
else datetime.now(UTC).isoformat(),
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
# Build the request body
|
|
39
|
+
properties = {"hs_note_body": hs_note_body, "hs_timestamp": hs_timestamp if hs_timestamp else datetime.now(UTC).isoformat()}
|
|
55
40
|
request_body_data: dict[str, Any] = {"properties": properties}
|
|
56
|
-
|
|
57
|
-
# Add associations if provided
|
|
58
41
|
if associations:
|
|
59
42
|
request_body_data["associations"] = associations
|
|
60
|
-
|
|
61
43
|
response = self._post(url, data=request_body_data)
|
|
62
44
|
return self._handle_response(response)
|
|
63
45
|
|
|
64
|
-
def fetch_multiple_lists(
|
|
65
|
-
self, listIds: list[str] | None = None, includeFilters: bool | None = None
|
|
66
|
-
) -> dict[str, Any]:
|
|
46
|
+
async def fetch_multiple_lists(self, listIds: list[str] | None = None, includeFilters: bool | None = None) -> dict[str, Any]:
|
|
67
47
|
"""
|
|
68
48
|
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.
|
|
69
49
|
|
|
@@ -81,20 +61,12 @@ class HubspotApp(APIApplication):
|
|
|
81
61
|
Lists
|
|
82
62
|
"""
|
|
83
63
|
url = f"{self.base_url}/crm/v3/lists/"
|
|
84
|
-
query_params = {
|
|
85
|
-
k: v
|
|
86
|
-
for k, v in [("listIds", listIds), ("includeFilters", includeFilters)]
|
|
87
|
-
if v is not None
|
|
88
|
-
}
|
|
64
|
+
query_params = {k: v for k, v in [("listIds", listIds), ("includeFilters", includeFilters)] if v is not None}
|
|
89
65
|
response = self._get(url, params=query_params)
|
|
90
66
|
return self._handle_response(response)
|
|
91
67
|
|
|
92
|
-
def fetch_list_memberships(
|
|
93
|
-
self,
|
|
94
|
-
listId: str,
|
|
95
|
-
after: str | None = None,
|
|
96
|
-
before: str | None = None,
|
|
97
|
-
limit: int | None = None,
|
|
68
|
+
async def fetch_list_memberships(
|
|
69
|
+
self, listId: str, after: str | None = None, before: str | None = None, limit: int | None = None
|
|
98
70
|
) -> dict[str, Any]:
|
|
99
71
|
"""
|
|
100
72
|
Fetch the memberships of a list in order sorted by the recordId of the records in the list.
|
|
@@ -116,21 +88,18 @@ class HubspotApp(APIApplication):
|
|
|
116
88
|
"""
|
|
117
89
|
if listId is None:
|
|
118
90
|
raise ValueError("Missing required parameter 'listId'.")
|
|
119
|
-
|
|
120
91
|
url = f"{self.base_url}/crm/v3/lists/{listId}/memberships"
|
|
121
92
|
query_params = {}
|
|
122
|
-
|
|
123
93
|
if after is not None:
|
|
124
94
|
query_params["after"] = after
|
|
125
95
|
if before is not None:
|
|
126
96
|
query_params["before"] = before
|
|
127
97
|
if limit is not None:
|
|
128
98
|
query_params["limit"] = limit
|
|
129
|
-
|
|
130
99
|
response = self._get(url, params=query_params)
|
|
131
100
|
return self._handle_response(response)
|
|
132
101
|
|
|
133
|
-
def create_list(
|
|
102
|
+
async def create_list(
|
|
134
103
|
self,
|
|
135
104
|
objectTypeId: str,
|
|
136
105
|
processingType: str,
|
|
@@ -176,22 +145,13 @@ class HubspotApp(APIApplication):
|
|
|
176
145
|
"listPermissions": listPermissions,
|
|
177
146
|
"filterBranch": filterBranch,
|
|
178
147
|
}
|
|
179
|
-
request_body_data = {
|
|
180
|
-
k: v for k, v in request_body_data.items() if v is not None
|
|
181
|
-
}
|
|
148
|
+
request_body_data = {k: v for k, v in request_body_data.items() if v is not None}
|
|
182
149
|
url = f"{self.base_url}/crm/v3/lists/"
|
|
183
150
|
query_params = {}
|
|
184
|
-
response = self._post(
|
|
185
|
-
url,
|
|
186
|
-
data=request_body_data,
|
|
187
|
-
params=query_params,
|
|
188
|
-
content_type="application/json",
|
|
189
|
-
)
|
|
151
|
+
response = self._post(url, data=request_body_data, params=query_params, content_type="application/json")
|
|
190
152
|
return self._handle_response(response)
|
|
191
153
|
|
|
192
|
-
def get_list_by_id(
|
|
193
|
-
self, listId: str, includeFilters: bool | None = None
|
|
194
|
-
) -> dict[str, Any]:
|
|
154
|
+
async def get_list_by_id(self, listId: str, includeFilters: bool | None = None) -> dict[str, Any]:
|
|
195
155
|
"""
|
|
196
156
|
Fetch a single list by ILS list ID.
|
|
197
157
|
|
|
@@ -211,13 +171,11 @@ class HubspotApp(APIApplication):
|
|
|
211
171
|
if listId is None:
|
|
212
172
|
raise ValueError("Missing required parameter 'listId'.")
|
|
213
173
|
url = f"{self.base_url}/crm/v3/lists/{listId}"
|
|
214
|
-
query_params = {
|
|
215
|
-
k: v for k, v in [("includeFilters", includeFilters)] if v is not None
|
|
216
|
-
}
|
|
174
|
+
query_params = {k: v for k, v in [("includeFilters", includeFilters)] if v is not None}
|
|
217
175
|
response = self._get(url, params=query_params)
|
|
218
176
|
return self._handle_response(response)
|
|
219
177
|
|
|
220
|
-
def delete_list_by_id(self, listId: str) -> Any:
|
|
178
|
+
async def delete_list_by_id(self, listId: str) -> Any:
|
|
221
179
|
"""
|
|
222
180
|
Delete a list by ILS list ID. Lists deleted through this endpoint can be restored for up to 90 days. After 90 days, the list is permanently purged and cannot be restored
|
|
223
181
|
|
|
@@ -240,7 +198,7 @@ class HubspotApp(APIApplication):
|
|
|
240
198
|
response = self._delete(url, params=query_params)
|
|
241
199
|
return self._handle_response(response)
|
|
242
200
|
|
|
243
|
-
def add_records_to_list(self, listId: str, items: list[str]) -> dict[str, Any]:
|
|
201
|
+
async def add_records_to_list(self, listId: str, items: list[str]) -> dict[str, Any]:
|
|
244
202
|
"""
|
|
245
203
|
Add the records provided to the list. Records that do not exist or that are already members of the list are ignored.
|
|
246
204
|
This only works for lists that have a processingType of MANUAL or SNAPSHOT.
|
|
@@ -261,19 +219,13 @@ class HubspotApp(APIApplication):
|
|
|
261
219
|
if listId is None:
|
|
262
220
|
raise ValueError("Missing required parameter 'listId'.")
|
|
263
221
|
request_body_data = None
|
|
264
|
-
# Using array parameter 'items' directly as request body
|
|
265
222
|
request_body_data = items
|
|
266
223
|
url = f"{self.base_url}/crm/v3/lists/{listId}/memberships/add"
|
|
267
224
|
query_params = {}
|
|
268
|
-
response = self._put(
|
|
269
|
-
url,
|
|
270
|
-
data=request_body_data,
|
|
271
|
-
params=query_params,
|
|
272
|
-
content_type="application/json",
|
|
273
|
-
)
|
|
225
|
+
response = self._put(url, data=request_body_data, params=query_params, content_type="application/json")
|
|
274
226
|
return self._handle_response(response)
|
|
275
227
|
|
|
276
|
-
def remove_records_from_list(self, listId: str, items: list[str]) -> dict[str, Any]:
|
|
228
|
+
async def remove_records_from_list(self, listId: str, items: list[str]) -> dict[str, Any]:
|
|
277
229
|
"""
|
|
278
230
|
Remove the records provided from the list. Records that are not members of the list are ignored.
|
|
279
231
|
This only works for lists that have a processingType of MANUAL or SNAPSHOT.
|
|
@@ -294,19 +246,13 @@ class HubspotApp(APIApplication):
|
|
|
294
246
|
if listId is None:
|
|
295
247
|
raise ValueError("Missing required parameter 'listId'.")
|
|
296
248
|
request_body_data = None
|
|
297
|
-
# Using array parameter 'items' directly as request body
|
|
298
249
|
request_body_data = items
|
|
299
250
|
url = f"{self.base_url}/crm/v3/lists/{listId}/memberships/remove"
|
|
300
251
|
query_params = {}
|
|
301
|
-
response = self._put(
|
|
302
|
-
url,
|
|
303
|
-
data=request_body_data,
|
|
304
|
-
params=query_params,
|
|
305
|
-
content_type="application/json",
|
|
306
|
-
)
|
|
252
|
+
response = self._put(url, data=request_body_data, params=query_params, content_type="application/json")
|
|
307
253
|
return self._handle_response(response)
|
|
308
254
|
|
|
309
|
-
def search_lists(
|
|
255
|
+
async def search_lists(
|
|
310
256
|
self,
|
|
311
257
|
listIds: list[str] | None = None,
|
|
312
258
|
offset: int | None = None,
|
|
@@ -355,22 +301,13 @@ class HubspotApp(APIApplication):
|
|
|
355
301
|
"additionalProperties": additionalProperties,
|
|
356
302
|
"sort": sort,
|
|
357
303
|
}
|
|
358
|
-
request_body_data = {
|
|
359
|
-
k: v for k, v in request_body_data.items() if v is not None
|
|
360
|
-
}
|
|
304
|
+
request_body_data = {k: v for k, v in request_body_data.items() if v is not None}
|
|
361
305
|
url = f"{self.base_url}/crm/v3/lists/search"
|
|
362
306
|
query_params = {}
|
|
363
|
-
response = self._post(
|
|
364
|
-
url,
|
|
365
|
-
data=request_body_data,
|
|
366
|
-
params=query_params,
|
|
367
|
-
content_type="application/json",
|
|
368
|
-
)
|
|
307
|
+
response = self._post(url, data=request_body_data, params=query_params, content_type="application/json")
|
|
369
308
|
return self._handle_response(response)
|
|
370
309
|
|
|
371
|
-
def fetch_list_by_name(
|
|
372
|
-
self, objectTypeId: str, listName: str, includeFilters: bool | None = None
|
|
373
|
-
) -> dict[str, Any]:
|
|
310
|
+
async def fetch_list_by_name(self, objectTypeId: str, listName: str, includeFilters: bool | None = None) -> dict[str, Any]:
|
|
374
311
|
"""
|
|
375
312
|
Fetch a list by its name and object type ID.
|
|
376
313
|
|
|
@@ -393,9 +330,7 @@ class HubspotApp(APIApplication):
|
|
|
393
330
|
if listName is None:
|
|
394
331
|
raise ValueError("Missing required parameter 'listName'.")
|
|
395
332
|
url = f"{self.base_url}/crm/v3/lists/object-type-id/{objectTypeId}/name/{listName}"
|
|
396
|
-
query_params = {
|
|
397
|
-
k: v for k, v in [("includeFilters", includeFilters)] if v is not None
|
|
398
|
-
}
|
|
333
|
+
query_params = {k: v for k, v in [("includeFilters", includeFilters)] if v is not None}
|
|
399
334
|
response = self._get(url, params=query_params)
|
|
400
335
|
return self._handle_response(response)
|
|
401
336
|
|
|
@@ -414,4 +349,5 @@ class HubspotApp(APIApplication):
|
|
|
414
349
|
]
|
|
415
350
|
all_tools.extend(self.crm.list_tools())
|
|
416
351
|
all_tools.extend(self.marketing.list_tools())
|
|
352
|
+
|
|
417
353
|
return all_tools
|