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.
- 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 +9 -2
- 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 +216 -102
- 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.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/METADATA +2 -2
- {universal_mcp_applications-0.1.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/RECORD +105 -105
- {universal_mcp_applications-0.1.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/WHEEL +0 -0
- {universal_mcp_applications-0.1.30.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
|
-
|
|
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
|
]
|