universal-mcp-applications 0.1.33__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.
- universal_mcp/applications/ahrefs/app.py +92 -238
- universal_mcp/applications/airtable/app.py +23 -122
- universal_mcp/applications/apollo/app.py +122 -475
- universal_mcp/applications/asana/app.py +605 -1755
- universal_mcp/applications/aws_s3/app.py +36 -103
- universal_mcp/applications/bill/app.py +644 -2055
- universal_mcp/applications/box/app.py +1246 -4159
- universal_mcp/applications/braze/app.py +410 -1476
- universal_mcp/applications/browser_use/README.md +15 -1
- universal_mcp/applications/browser_use/__init__.py +1 -0
- universal_mcp/applications/browser_use/app.py +86 -24
- universal_mcp/applications/cal_com_v2/app.py +207 -625
- universal_mcp/applications/calendly/app.py +103 -242
- universal_mcp/applications/canva/app.py +75 -140
- universal_mcp/applications/clickup/app.py +331 -798
- universal_mcp/applications/coda/app.py +240 -520
- universal_mcp/applications/confluence/app.py +497 -1285
- universal_mcp/applications/contentful/app.py +36 -151
- universal_mcp/applications/crustdata/app.py +42 -121
- universal_mcp/applications/dialpad/app.py +451 -924
- universal_mcp/applications/digitalocean/app.py +2071 -6082
- 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/README.md +8 -4
- universal_mcp/applications/exa/app.py +408 -186
- universal_mcp/applications/falai/app.py +24 -101
- universal_mcp/applications/figma/app.py +91 -175
- universal_mcp/applications/file_system/app.py +2 -13
- universal_mcp/applications/firecrawl/app.py +186 -163
- universal_mcp/applications/fireflies/app.py +59 -281
- universal_mcp/applications/fpl/app.py +92 -529
- 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 +66 -175
- universal_mcp/applications/github/app.py +28 -65
- universal_mcp/applications/gong/app.py +140 -300
- universal_mcp/applications/google_calendar/app.py +26 -78
- universal_mcp/applications/google_docs/app.py +98 -202
- universal_mcp/applications/google_drive/app.py +194 -793
- universal_mcp/applications/google_gemini/app.py +27 -62
- universal_mcp/applications/google_mail/README.md +1 -0
- universal_mcp/applications/google_mail/app.py +93 -214
- universal_mcp/applications/google_searchconsole/app.py +25 -58
- universal_mcp/applications/google_sheet/app.py +171 -624
- universal_mcp/applications/google_sheet/helper.py +26 -53
- universal_mcp/applications/hashnode/app.py +57 -269
- universal_mcp/applications/heygen/app.py +77 -155
- universal_mcp/applications/http_tools/app.py +10 -32
- universal_mcp/applications/hubspot/README.md +1 -1
- universal_mcp/applications/hubspot/app.py +7508 -99
- universal_mcp/applications/jira/app.py +2419 -8334
- universal_mcp/applications/klaviyo/app.py +737 -1619
- universal_mcp/applications/linkedin/README.md +5 -0
- universal_mcp/applications/linkedin/app.py +332 -227
- universal_mcp/applications/mailchimp/app.py +696 -1851
- universal_mcp/applications/markitdown/app.py +8 -20
- universal_mcp/applications/miro/app.py +333 -815
- universal_mcp/applications/ms_teams/app.py +85 -207
- universal_mcp/applications/neon/app.py +144 -250
- universal_mcp/applications/notion/app.py +36 -51
- universal_mcp/applications/onedrive/app.py +26 -48
- universal_mcp/applications/openai/app.py +42 -165
- universal_mcp/applications/outlook/README.md +22 -9
- universal_mcp/applications/outlook/app.py +403 -141
- universal_mcp/applications/perplexity/README.md +2 -1
- universal_mcp/applications/perplexity/app.py +162 -20
- universal_mcp/applications/pipedrive/app.py +1021 -3331
- universal_mcp/applications/posthog/app.py +272 -541
- universal_mcp/applications/reddit/app.py +61 -160
- universal_mcp/applications/resend/app.py +41 -107
- universal_mcp/applications/retell/app.py +23 -50
- universal_mcp/applications/rocketlane/app.py +250 -963
- universal_mcp/applications/scraper/app.py +67 -125
- universal_mcp/applications/semanticscholar/app.py +36 -78
- universal_mcp/applications/semrush/app.py +43 -77
- universal_mcp/applications/sendgrid/app.py +826 -1576
- universal_mcp/applications/sentry/app.py +444 -1079
- universal_mcp/applications/serpapi/app.py +40 -143
- universal_mcp/applications/sharepoint/app.py +27 -49
- universal_mcp/applications/shopify/app.py +1743 -4479
- universal_mcp/applications/shortcut/app.py +272 -534
- universal_mcp/applications/slack/app.py +41 -123
- universal_mcp/applications/spotify/app.py +206 -405
- universal_mcp/applications/supabase/app.py +174 -283
- universal_mcp/applications/tavily/app.py +2 -2
- universal_mcp/applications/trello/app.py +853 -2816
- 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 +86 -299
- universal_mcp/applications/wrike/app.py +80 -153
- universal_mcp/applications/yahoo_finance/app.py +19 -65
- universal_mcp/applications/youtube/app.py +120 -306
- universal_mcp/applications/zenquotes/app.py +3 -3
- {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/METADATA +4 -2
- {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/RECORD +109 -113
- {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/WHEEL +1 -1
- universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
- universal_mcp/applications/hubspot/api_segments/api_segment_base.py +0 -54
- universal_mcp/applications/hubspot/api_segments/crm_api.py +0 -7337
- universal_mcp/applications/hubspot/api_segments/marketing_api.py +0 -1467
- {universal_mcp_applications-0.1.33.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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
]
|