universal-mcp-applications 0.1.30__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.

Files changed (105) hide show
  1. universal_mcp/applications/ahrefs/app.py +52 -198
  2. universal_mcp/applications/airtable/app.py +23 -122
  3. universal_mcp/applications/apollo/app.py +111 -464
  4. universal_mcp/applications/asana/app.py +417 -1567
  5. universal_mcp/applications/aws_s3/app.py +33 -100
  6. universal_mcp/applications/bill/app.py +546 -1957
  7. universal_mcp/applications/box/app.py +1068 -3981
  8. universal_mcp/applications/braze/app.py +364 -1430
  9. universal_mcp/applications/browser_use/app.py +2 -8
  10. universal_mcp/applications/cal_com_v2/app.py +207 -625
  11. universal_mcp/applications/calendly/app.py +61 -200
  12. universal_mcp/applications/canva/app.py +45 -110
  13. universal_mcp/applications/clickup/app.py +207 -674
  14. universal_mcp/applications/coda/app.py +146 -426
  15. universal_mcp/applications/confluence/app.py +310 -1098
  16. universal_mcp/applications/contentful/app.py +36 -151
  17. universal_mcp/applications/crustdata/app.py +28 -107
  18. universal_mcp/applications/dialpad/app.py +283 -756
  19. universal_mcp/applications/digitalocean/app.py +1766 -5777
  20. universal_mcp/applications/domain_checker/app.py +3 -54
  21. universal_mcp/applications/e2b/app.py +14 -64
  22. universal_mcp/applications/elevenlabs/app.py +9 -47
  23. universal_mcp/applications/exa/app.py +6 -17
  24. universal_mcp/applications/falai/app.py +23 -100
  25. universal_mcp/applications/figma/app.py +53 -137
  26. universal_mcp/applications/file_system/app.py +2 -13
  27. universal_mcp/applications/firecrawl/app.py +51 -152
  28. universal_mcp/applications/fireflies/app.py +59 -281
  29. universal_mcp/applications/fpl/app.py +91 -528
  30. universal_mcp/applications/fpl/utils/fixtures.py +15 -49
  31. universal_mcp/applications/fpl/utils/helper.py +25 -89
  32. universal_mcp/applications/fpl/utils/league_utils.py +20 -64
  33. universal_mcp/applications/ghost_content/app.py +52 -161
  34. universal_mcp/applications/github/app.py +19 -56
  35. universal_mcp/applications/gong/app.py +88 -248
  36. universal_mcp/applications/google_calendar/app.py +16 -68
  37. universal_mcp/applications/google_docs/app.py +88 -188
  38. universal_mcp/applications/google_drive/app.py +140 -462
  39. universal_mcp/applications/google_gemini/app.py +12 -64
  40. universal_mcp/applications/google_mail/app.py +28 -157
  41. universal_mcp/applications/google_searchconsole/app.py +15 -48
  42. universal_mcp/applications/google_sheet/app.py +101 -578
  43. universal_mcp/applications/google_sheet/helper.py +10 -37
  44. universal_mcp/applications/hashnode/app.py +57 -269
  45. universal_mcp/applications/heygen/app.py +44 -122
  46. universal_mcp/applications/http_tools/app.py +10 -32
  47. universal_mcp/applications/hubspot/api_segments/crm_api.py +460 -1573
  48. universal_mcp/applications/hubspot/api_segments/marketing_api.py +74 -262
  49. universal_mcp/applications/hubspot/app.py +23 -87
  50. universal_mcp/applications/jira/app.py +2071 -7986
  51. universal_mcp/applications/klaviyo/app.py +494 -1376
  52. universal_mcp/applications/linkedin/README.md +9 -2
  53. universal_mcp/applications/linkedin/app.py +392 -212
  54. universal_mcp/applications/mailchimp/app.py +450 -1605
  55. universal_mcp/applications/markitdown/app.py +8 -20
  56. universal_mcp/applications/miro/app.py +217 -699
  57. universal_mcp/applications/ms_teams/app.py +64 -186
  58. universal_mcp/applications/neon/app.py +86 -192
  59. universal_mcp/applications/notion/app.py +21 -36
  60. universal_mcp/applications/onedrive/app.py +14 -36
  61. universal_mcp/applications/openai/app.py +42 -165
  62. universal_mcp/applications/outlook/app.py +16 -76
  63. universal_mcp/applications/perplexity/app.py +4 -19
  64. universal_mcp/applications/pipedrive/app.py +832 -3142
  65. universal_mcp/applications/posthog/app.py +163 -432
  66. universal_mcp/applications/reddit/app.py +40 -139
  67. universal_mcp/applications/resend/app.py +41 -107
  68. universal_mcp/applications/retell/app.py +14 -41
  69. universal_mcp/applications/rocketlane/app.py +221 -934
  70. universal_mcp/applications/scraper/README.md +7 -4
  71. universal_mcp/applications/scraper/app.py +216 -102
  72. universal_mcp/applications/semanticscholar/app.py +22 -64
  73. universal_mcp/applications/semrush/app.py +43 -77
  74. universal_mcp/applications/sendgrid/app.py +512 -1262
  75. universal_mcp/applications/sentry/app.py +271 -906
  76. universal_mcp/applications/serpapi/app.py +40 -143
  77. universal_mcp/applications/sharepoint/app.py +15 -37
  78. universal_mcp/applications/shopify/app.py +1551 -4287
  79. universal_mcp/applications/shortcut/app.py +155 -417
  80. universal_mcp/applications/slack/app.py +50 -101
  81. universal_mcp/applications/spotify/app.py +126 -325
  82. universal_mcp/applications/supabase/app.py +104 -213
  83. universal_mcp/applications/tavily/app.py +1 -1
  84. universal_mcp/applications/trello/app.py +693 -2656
  85. universal_mcp/applications/twilio/app.py +14 -50
  86. universal_mcp/applications/twitter/api_segments/compliance_api.py +4 -14
  87. universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +6 -18
  88. universal_mcp/applications/twitter/api_segments/likes_api.py +1 -3
  89. universal_mcp/applications/twitter/api_segments/lists_api.py +5 -15
  90. universal_mcp/applications/twitter/api_segments/trends_api.py +1 -3
  91. universal_mcp/applications/twitter/api_segments/tweets_api.py +9 -31
  92. universal_mcp/applications/twitter/api_segments/usage_api.py +1 -5
  93. universal_mcp/applications/twitter/api_segments/users_api.py +14 -42
  94. universal_mcp/applications/whatsapp/app.py +35 -186
  95. universal_mcp/applications/whatsapp/audio.py +2 -6
  96. universal_mcp/applications/whatsapp/whatsapp.py +17 -51
  97. universal_mcp/applications/whatsapp_business/app.py +70 -283
  98. universal_mcp/applications/wrike/app.py +45 -118
  99. universal_mcp/applications/yahoo_finance/app.py +19 -65
  100. universal_mcp/applications/youtube/app.py +75 -261
  101. universal_mcp/applications/zenquotes/app.py +2 -2
  102. {universal_mcp_applications-0.1.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/METADATA +2 -2
  103. {universal_mcp_applications-0.1.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/RECORD +105 -105
  104. {universal_mcp_applications-0.1.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/WHEEL +0 -0
  105. {universal_mcp_applications-0.1.30.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