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.

Files changed (106) 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 +23 -4
  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 +280 -93
  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.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/METADATA +2 -2
  103. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/RECORD +105 -106
  104. universal_mcp/applications/scraper/scraper_testers.py +0 -17
  105. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/WHEEL +0 -0
  106. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.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,12 +58,7 @@ 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:
@@ -87,15 +66,9 @@ class GoogleCalendarApp(APIApplication):
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
68
  response = self._get(url, params=params)
90
-
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
 
@@ -124,7 +97,7 @@ class GoogleCalendarApp(APIApplication):
124
97
  response = self._get(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
@@ -180,10 +148,9 @@ class GoogleCalendarApp(APIApplication):
180
148
  params["pageToken"] = page_token
181
149
  logger.info(f"Retrieving calendar events with params: {params}")
182
150
  response = self._get(url, params=params)
183
-
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
212
  response = self._post(url, data=request_body_data)
251
-
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
 
@@ -274,10 +233,9 @@ class GoogleCalendarApp(APIApplication):
274
233
  params = {"text": text, "sendUpdates": send_updates}
275
234
  logger.info(f"Creating event via quickAdd: '{text}'")
276
235
  response = self._post(url, data=None, params=params)
277
-
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:
@@ -324,10 +279,9 @@ class GoogleCalendarApp(APIApplication):
324
279
  params["pageToken"] = page_token
325
280
  logger.info(f"Retrieving instances of recurring event with ID: {event_id}")
326
281
  response = self._get(url, params=params)
327
-
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,
@@ -386,7 +340,7 @@ class GoogleCalendarApp(APIApplication):
386
340
  response = self._delete(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
406
  response = self._put(url, data=request_body_data, params=params)
457
-
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
 
@@ -475,7 +424,7 @@ class GoogleCalendarApp(APIApplication):
475
424
  response = self._get(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,
@@ -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
  ]