universal-mcp-applications 0.1.22__py3-none-any.whl → 0.1.39rc8__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 (120) hide show
  1. universal_mcp/applications/ahrefs/app.py +92 -238
  2. universal_mcp/applications/airtable/app.py +23 -122
  3. universal_mcp/applications/apollo/app.py +122 -475
  4. universal_mcp/applications/asana/app.py +605 -1755
  5. universal_mcp/applications/aws_s3/app.py +36 -103
  6. universal_mcp/applications/bill/app.py +644 -2055
  7. universal_mcp/applications/box/app.py +1246 -4159
  8. universal_mcp/applications/braze/app.py +410 -1476
  9. universal_mcp/applications/browser_use/README.md +15 -1
  10. universal_mcp/applications/browser_use/__init__.py +1 -0
  11. universal_mcp/applications/browser_use/app.py +94 -37
  12. universal_mcp/applications/cal_com_v2/app.py +207 -625
  13. universal_mcp/applications/calendly/app.py +103 -242
  14. universal_mcp/applications/canva/app.py +75 -140
  15. universal_mcp/applications/clickup/app.py +331 -798
  16. universal_mcp/applications/coda/app.py +240 -520
  17. universal_mcp/applications/confluence/app.py +497 -1285
  18. universal_mcp/applications/contentful/app.py +36 -151
  19. universal_mcp/applications/crustdata/app.py +42 -121
  20. universal_mcp/applications/dialpad/app.py +451 -924
  21. universal_mcp/applications/digitalocean/app.py +2071 -6082
  22. universal_mcp/applications/domain_checker/app.py +3 -54
  23. universal_mcp/applications/e2b/app.py +14 -64
  24. universal_mcp/applications/elevenlabs/app.py +9 -47
  25. universal_mcp/applications/exa/README.md +8 -4
  26. universal_mcp/applications/exa/app.py +408 -186
  27. universal_mcp/applications/falai/app.py +24 -101
  28. universal_mcp/applications/figma/app.py +91 -175
  29. universal_mcp/applications/file_system/app.py +2 -13
  30. universal_mcp/applications/firecrawl/app.py +186 -163
  31. universal_mcp/applications/fireflies/app.py +59 -281
  32. universal_mcp/applications/fpl/app.py +92 -529
  33. universal_mcp/applications/fpl/utils/fixtures.py +15 -49
  34. universal_mcp/applications/fpl/utils/helper.py +25 -89
  35. universal_mcp/applications/fpl/utils/league_utils.py +20 -64
  36. universal_mcp/applications/ghost_content/app.py +66 -175
  37. universal_mcp/applications/github/app.py +28 -65
  38. universal_mcp/applications/gong/app.py +140 -300
  39. universal_mcp/applications/google_calendar/app.py +26 -78
  40. universal_mcp/applications/google_docs/app.py +324 -354
  41. universal_mcp/applications/google_drive/app.py +194 -793
  42. universal_mcp/applications/google_gemini/app.py +29 -64
  43. universal_mcp/applications/google_mail/README.md +1 -0
  44. universal_mcp/applications/google_mail/app.py +93 -214
  45. universal_mcp/applications/google_searchconsole/app.py +25 -58
  46. universal_mcp/applications/google_sheet/app.py +174 -623
  47. universal_mcp/applications/google_sheet/helper.py +26 -53
  48. universal_mcp/applications/hashnode/app.py +57 -269
  49. universal_mcp/applications/heygen/app.py +77 -155
  50. universal_mcp/applications/http_tools/app.py +10 -32
  51. universal_mcp/applications/hubspot/README.md +1 -1
  52. universal_mcp/applications/hubspot/app.py +7508 -99
  53. universal_mcp/applications/jira/app.py +2419 -8334
  54. universal_mcp/applications/klaviyo/app.py +737 -1619
  55. universal_mcp/applications/linkedin/README.md +23 -4
  56. universal_mcp/applications/linkedin/app.py +861 -155
  57. universal_mcp/applications/mailchimp/app.py +696 -1851
  58. universal_mcp/applications/markitdown/app.py +8 -20
  59. universal_mcp/applications/miro/app.py +333 -815
  60. universal_mcp/applications/ms_teams/app.py +85 -207
  61. universal_mcp/applications/neon/app.py +144 -250
  62. universal_mcp/applications/notion/app.py +36 -51
  63. universal_mcp/applications/onedrive/README.md +24 -0
  64. universal_mcp/applications/onedrive/__init__.py +1 -0
  65. universal_mcp/applications/onedrive/app.py +316 -0
  66. universal_mcp/applications/openai/app.py +42 -165
  67. universal_mcp/applications/outlook/README.md +22 -9
  68. universal_mcp/applications/outlook/app.py +606 -262
  69. universal_mcp/applications/perplexity/README.md +2 -1
  70. universal_mcp/applications/perplexity/app.py +162 -20
  71. universal_mcp/applications/pipedrive/app.py +1021 -3331
  72. universal_mcp/applications/posthog/app.py +272 -541
  73. universal_mcp/applications/reddit/app.py +88 -204
  74. universal_mcp/applications/resend/app.py +41 -107
  75. universal_mcp/applications/retell/app.py +23 -50
  76. universal_mcp/applications/rocketlane/app.py +250 -963
  77. universal_mcp/applications/scraper/README.md +7 -4
  78. universal_mcp/applications/scraper/app.py +245 -283
  79. universal_mcp/applications/semanticscholar/app.py +36 -78
  80. universal_mcp/applications/semrush/app.py +43 -77
  81. universal_mcp/applications/sendgrid/app.py +826 -1576
  82. universal_mcp/applications/sentry/app.py +444 -1079
  83. universal_mcp/applications/serpapi/app.py +40 -143
  84. universal_mcp/applications/sharepoint/README.md +16 -14
  85. universal_mcp/applications/sharepoint/app.py +245 -154
  86. universal_mcp/applications/shopify/app.py +1743 -4479
  87. universal_mcp/applications/shortcut/app.py +272 -534
  88. universal_mcp/applications/slack/app.py +58 -109
  89. universal_mcp/applications/spotify/app.py +206 -405
  90. universal_mcp/applications/supabase/app.py +174 -283
  91. universal_mcp/applications/tavily/app.py +2 -2
  92. universal_mcp/applications/trello/app.py +853 -2816
  93. universal_mcp/applications/twilio/app.py +14 -50
  94. universal_mcp/applications/twitter/api_segments/compliance_api.py +4 -14
  95. universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +6 -18
  96. universal_mcp/applications/twitter/api_segments/likes_api.py +1 -3
  97. universal_mcp/applications/twitter/api_segments/lists_api.py +5 -15
  98. universal_mcp/applications/twitter/api_segments/trends_api.py +1 -3
  99. universal_mcp/applications/twitter/api_segments/tweets_api.py +9 -31
  100. universal_mcp/applications/twitter/api_segments/usage_api.py +1 -5
  101. universal_mcp/applications/twitter/api_segments/users_api.py +14 -42
  102. universal_mcp/applications/whatsapp/app.py +35 -186
  103. universal_mcp/applications/whatsapp/audio.py +2 -6
  104. universal_mcp/applications/whatsapp/whatsapp.py +17 -51
  105. universal_mcp/applications/whatsapp_business/app.py +86 -299
  106. universal_mcp/applications/wrike/app.py +80 -153
  107. universal_mcp/applications/yahoo_finance/app.py +19 -65
  108. universal_mcp/applications/youtube/app.py +120 -306
  109. universal_mcp/applications/zenquotes/app.py +4 -4
  110. {universal_mcp_applications-0.1.22.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/METADATA +4 -2
  111. {universal_mcp_applications-0.1.22.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/RECORD +113 -117
  112. {universal_mcp_applications-0.1.22.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/WHEEL +1 -1
  113. universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
  114. universal_mcp/applications/hubspot/api_segments/api_segment_base.py +0 -54
  115. universal_mcp/applications/hubspot/api_segments/crm_api.py +0 -7337
  116. universal_mcp/applications/hubspot/api_segments/marketing_api.py +0 -1467
  117. universal_mcp/applications/unipile/README.md +0 -28
  118. universal_mcp/applications/unipile/__init__.py +0 -1
  119. universal_mcp/applications/unipile/app.py +0 -1077
  120. {universal_mcp_applications-0.1.22.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,5 @@
1
1
  from datetime import UTC, datetime, timedelta
2
2
  from typing import Any
3
-
4
3
  from loguru import logger
5
4
  from universal_mcp.applications.application import APIApplication
6
5
  from universal_mcp.integrations import Integration
@@ -24,34 +23,19 @@ class GoogleCalendarApp(APIApplication):
24
23
  """
25
24
  if not dt_string or dt_string == "Unknown":
26
25
  return "Unknown"
27
-
28
- # Check if it's just a date (all-day event) or a datetime
29
26
  if "T" in dt_string:
30
- # It's a datetime - parse and format it
31
27
  try:
32
- # Handle Z (UTC) suffix by replacing with +00:00 timezone
33
28
  if dt_string.endswith("Z"):
34
29
  dt_string = dt_string.replace("Z", "+00:00")
35
-
36
- # Parse the ISO datetime string
37
30
  dt = datetime.fromisoformat(dt_string)
38
-
39
- # Format to a more readable form
40
31
  return dt.strftime("%Y-%m-%d %I:%M %p")
41
32
  except ValueError:
42
- # In case of parsing error, return the original
43
33
  logger.warning(f"Could not parse datetime string: {dt_string}")
44
34
  return dt_string
45
35
  else:
46
- # It's just a date (all-day event)
47
36
  return f"{dt_string} (All day)"
48
37
 
49
- def get_upcoming_events(
50
- self,
51
- days: int = 1,
52
- max_results: int | None = None,
53
- time_zone: str | None = None,
54
- ) -> dict[str, Any]:
38
+ async def get_upcoming_events(self, days: int = 1, max_results: int | None = None, time_zone: str | None = None) -> dict[str, Any]:
55
39
  """
56
40
  Retrieves events for a specified number of days, starting from today. This function simplifies date-range queries by auto-calculating start/end times, unlike the more comprehensive `list_events` function, which offers granular control with explicit time filters, text search, and custom sorting.
57
41
 
@@ -74,28 +58,17 @@ class GoogleCalendarApp(APIApplication):
74
58
  time_min = f"{today.isoformat()}T00:00:00Z"
75
59
  time_max = f"{end_date.isoformat()}T00:00:00Z"
76
60
  url = f"{self.base_api_url}/events"
77
- params = {
78
- "timeMin": time_min,
79
- "timeMax": time_max,
80
- "singleEvents": "true",
81
- "orderBy": "startTime",
82
- }
61
+ params = {"timeMin": time_min, "timeMax": time_max, "singleEvents": "true", "orderBy": "startTime"}
83
62
  if max_results is not None:
84
63
  params["maxResults"] = str(max_results)
85
64
  if time_zone:
86
65
  params["timeZone"] = time_zone
87
66
  date_range = "today" if days == 1 else f"the next {days} days"
88
67
  logger.info(f"Retrieving calendar events for {date_range}")
89
- response = self._get(url, params=params)
90
-
68
+ response = await self._aget(url, params=params)
91
69
  return self._handle_response(response)
92
70
 
93
- def get_event_by_id(
94
- self,
95
- event_id: str,
96
- max_attendees: int | None = None,
97
- time_zone: str | None = None,
98
- ) -> dict[str, Any]:
71
+ async def get_event_by_id(self, event_id: str, max_attendees: int | None = None, time_zone: str | None = None) -> dict[str, Any]:
99
72
  """
100
73
  Retrieves a specific calendar event using its unique ID. Unlike `list_events`, which fetches multiple events based on date ranges or search queries, this function targets a single, known event. It can optionally limit attendees returned and specify a time zone for date formatting in the response.
101
74
 
@@ -121,10 +94,10 @@ class GoogleCalendarApp(APIApplication):
121
94
  if time_zone:
122
95
  params["timeZone"] = time_zone
123
96
  logger.info(f"Retrieving calendar event with ID: {event_id}")
124
- response = self._get(url, params=params)
97
+ response = await self._aget(url, params=params)
125
98
  return self._handle_response(response)
126
99
 
127
- def list_events(
100
+ async def list_events(
128
101
  self,
129
102
  max_results: int = 10,
130
103
  time_min: str | None = None,
@@ -159,16 +132,11 @@ class GoogleCalendarApp(APIApplication):
159
132
  list, retrieve, calendar, events, pagination, api, important
160
133
  """
161
134
  url = f"{self.base_api_url}/events"
162
- params = {
163
- "maxResults": str(max_results),
164
- "orderBy": order_by,
165
- "singleEvents": str(single_events).lower(),
166
- }
135
+ params = {"maxResults": str(max_results), "orderBy": order_by, "singleEvents": str(single_events).lower()}
167
136
  if time_min:
168
137
  params["timeMin"] = time_min
169
138
  else:
170
- # Default to current time if not specified
171
- now = datetime.utcnow().isoformat() + "Z" # 'Z' indicates UTC time
139
+ now = datetime.utcnow().isoformat() + "Z"
172
140
  params["timeMin"] = now
173
141
  if time_max:
174
142
  params["timeMax"] = time_max
@@ -179,11 +147,10 @@ class GoogleCalendarApp(APIApplication):
179
147
  if page_token:
180
148
  params["pageToken"] = page_token
181
149
  logger.info(f"Retrieving calendar events with params: {params}")
182
- response = self._get(url, params=params)
183
-
150
+ response = await self._aget(url, params=params)
184
151
  return self._handle_response(response)
185
152
 
186
- def create_event(
153
+ async def create_event(
187
154
  self,
188
155
  start: dict[str, Any],
189
156
  end: dict[str, Any],
@@ -231,7 +198,6 @@ class GoogleCalendarApp(APIApplication):
231
198
  Tags:
232
199
  create, calendar, event, insert, recurring, important
233
200
  """
234
-
235
201
  request_body_data = {
236
202
  "start": start,
237
203
  "end": end,
@@ -241,19 +207,12 @@ class GoogleCalendarApp(APIApplication):
241
207
  "attendees": attendees,
242
208
  "recurrence": recurrence,
243
209
  }
244
- request_body_data = {
245
- k: v for k, v in request_body_data.items() if v is not None
246
- }
247
-
210
+ request_body_data = {k: v for k, v in request_body_data.items() if v is not None}
248
211
  url = f"{self.base_url}/calendars/{calendar_id}/events"
249
-
250
- response = self._post(url, data=request_body_data)
251
-
212
+ response = await self._apost(url, data=request_body_data)
252
213
  return self._handle_response(response)
253
214
 
254
- def create_event_from_text(
255
- self, text: str, send_updates: str = "none"
256
- ) -> dict[str, Any]:
215
+ async def create_event_from_text(self, text: str, send_updates: str = "none") -> dict[str, Any]:
257
216
  """
258
217
  Creates a calendar event by parsing a natural language string (e.g., "Meeting tomorrow at 10am"). This offers a user-friendly shortcut, contrasting with the structured `create_event` function which requires explicit fields like start and end times.
259
218
 
@@ -273,11 +232,10 @@ class GoogleCalendarApp(APIApplication):
273
232
  url = f"{self.base_api_url}/events/quickAdd"
274
233
  params = {"text": text, "sendUpdates": send_updates}
275
234
  logger.info(f"Creating event via quickAdd: '{text}'")
276
- response = self._post(url, data=None, params=params)
277
-
235
+ response = await self._apost(url, data=None, params=params)
278
236
  return self._handle_response(response)
279
237
 
280
- def list_recurring_event_instances(
238
+ async def list_recurring_event_instances(
281
239
  self,
282
240
  event_id: str,
283
241
  max_results: int = 25,
@@ -310,10 +268,7 @@ class GoogleCalendarApp(APIApplication):
310
268
  list, retrieve, calendar, events, recurring, pagination, api, important
311
269
  """
312
270
  url = f"{self.base_api_url}/events/{event_id}/instances"
313
- params = {
314
- "maxResults": str(max_results),
315
- "showDeleted": str(show_deleted).lower(),
316
- }
271
+ params = {"maxResults": str(max_results), "showDeleted": str(show_deleted).lower()}
317
272
  if time_min:
318
273
  params["timeMin"] = time_min
319
274
  if time_max:
@@ -323,11 +278,10 @@ class GoogleCalendarApp(APIApplication):
323
278
  if page_token:
324
279
  params["pageToken"] = page_token
325
280
  logger.info(f"Retrieving instances of recurring event with ID: {event_id}")
326
- response = self._get(url, params=params)
327
-
281
+ response = await self._aget(url, params=params)
328
282
  return self._handle_response(response)
329
283
 
330
- def delete_event(
284
+ async def delete_event(
331
285
  self,
332
286
  calendarId,
333
287
  eventId,
@@ -383,10 +337,10 @@ class GoogleCalendarApp(APIApplication):
383
337
  ]
384
338
  if v is not None
385
339
  }
386
- response = self._delete(url, params=query_params)
340
+ response = await self._adelete(url, params=query_params)
387
341
  return self._handle_response(response)
388
342
 
389
- def replace_event(
343
+ async def replace_event(
390
344
  self,
391
345
  event_id: str,
392
346
  start: dict[str, Any],
@@ -443,21 +397,16 @@ class GoogleCalendarApp(APIApplication):
443
397
  "attendees": attendees,
444
398
  "recurrence": recurrence,
445
399
  }
446
- request_body_data = {
447
- k: v for k, v in request_body_data.items() if v is not None
448
- }
449
-
400
+ request_body_data = {k: v for k, v in request_body_data.items() if v is not None}
450
401
  url = f"{self.base_url}/calendars/{calendar_id}/events/{event_id}"
451
402
  params = {"sendUpdates": send_updates}
452
403
  if max_attendees is not None:
453
404
  params["maxAttendees"] = str(max_attendees)
454
-
455
405
  logger.info(f"Updating calendar event with ID: {event_id}")
456
- response = self._put(url, data=request_body_data, params=params)
457
-
406
+ response = await self._aput(url, data=request_body_data, params=params)
458
407
  return self._handle_response(response)
459
408
 
460
- def get_primary_calendar_details(self) -> dict[str, Any]:
409
+ async def get_primary_calendar_details(self) -> dict[str, Any]:
461
410
  """
462
411
  Retrieves metadata for the user's primary calendar, including its default timezone. This information is essential for creating new events with accurate, timezone-aware start and end times using other functions like `create_event`, preventing potential scheduling errors across different regions.
463
412
 
@@ -472,10 +421,10 @@ class GoogleCalendarApp(APIApplication):
472
421
  """
473
422
  url = f"{self.base_api_url}"
474
423
  logger.info("Retrieving user's calendar timezone settings")
475
- response = self._get(url)
424
+ response = await self._aget(url)
476
425
  return self._handle_response(response)
477
426
 
478
- def get_free_busy_info(
427
+ async def get_free_busy_info(
479
428
  self,
480
429
  alt=None,
481
430
  fields=None,
@@ -554,7 +503,7 @@ class GoogleCalendarApp(APIApplication):
554
503
  ]
555
504
  if v is not None
556
505
  }
557
- response = self._post(url, data=request_body, params=query_params)
506
+ response = await self._apost(url, data=request_body, params=query_params)
558
507
  response.raise_for_status()
559
508
  return response.json()
560
509
 
@@ -568,7 +517,6 @@ class GoogleCalendarApp(APIApplication):
568
517
  self.replace_event,
569
518
  self.list_recurring_event_instances,
570
519
  self.get_primary_calendar_details,
571
- # Auto Generated from Openapi spec
572
520
  self.delete_event,
573
521
  self.get_free_busy_info,
574
522
  ]