universal-mcp-applications 0.1.13__py3-none-any.whl → 0.1.14__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 (54) hide show
  1. universal_mcp/applications/aws_s3/app.py +71 -71
  2. universal_mcp/applications/calendly/app.py +199 -199
  3. universal_mcp/applications/canva/app.py +189 -189
  4. universal_mcp/applications/domain_checker/app.py +31 -24
  5. universal_mcp/applications/e2b/app.py +6 -7
  6. universal_mcp/applications/elevenlabs/app.py +24 -20
  7. universal_mcp/applications/exa/app.py +25 -20
  8. universal_mcp/applications/falai/app.py +44 -41
  9. universal_mcp/applications/file_system/app.py +20 -12
  10. universal_mcp/applications/firecrawl/app.py +46 -47
  11. universal_mcp/applications/fireflies/app.py +79 -79
  12. universal_mcp/applications/fpl/app.py +83 -74
  13. universal_mcp/applications/github/README.md +0 -1028
  14. universal_mcp/applications/github/app.py +55 -50227
  15. universal_mcp/applications/google_calendar/app.py +63 -65
  16. universal_mcp/applications/google_docs/app.py +78 -78
  17. universal_mcp/applications/google_drive/app.py +361 -440
  18. universal_mcp/applications/google_gemini/app.py +34 -17
  19. universal_mcp/applications/google_mail/app.py +117 -117
  20. universal_mcp/applications/google_searchconsole/app.py +41 -47
  21. universal_mcp/applications/google_sheet/app.py +157 -164
  22. universal_mcp/applications/http_tools/app.py +16 -16
  23. universal_mcp/applications/linkedin/app.py +26 -31
  24. universal_mcp/applications/ms_teams/app.py +190 -190
  25. universal_mcp/applications/openai/app.py +55 -56
  26. universal_mcp/applications/outlook/app.py +57 -57
  27. universal_mcp/applications/perplexity/app.py +17 -17
  28. universal_mcp/applications/reddit/app.py +225 -4053
  29. universal_mcp/applications/replicate/app.py +40 -42
  30. universal_mcp/applications/resend/app.py +157 -154
  31. universal_mcp/applications/scraper/app.py +24 -24
  32. universal_mcp/applications/serpapi/app.py +18 -20
  33. universal_mcp/applications/sharepoint/app.py +46 -36
  34. universal_mcp/applications/slack/app.py +66 -66
  35. universal_mcp/applications/tavily/app.py +7 -7
  36. universal_mcp/applications/twitter/api_segments/compliance_api.py +17 -20
  37. universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +35 -40
  38. universal_mcp/applications/twitter/api_segments/dm_events_api.py +18 -21
  39. universal_mcp/applications/twitter/api_segments/likes_api.py +19 -22
  40. universal_mcp/applications/twitter/api_segments/lists_api.py +59 -68
  41. universal_mcp/applications/twitter/api_segments/spaces_api.py +36 -42
  42. universal_mcp/applications/twitter/api_segments/trends_api.py +7 -8
  43. universal_mcp/applications/twitter/api_segments/tweets_api.py +159 -185
  44. universal_mcp/applications/twitter/api_segments/usage_api.py +5 -6
  45. universal_mcp/applications/twitter/api_segments/users_api.py +230 -264
  46. universal_mcp/applications/unipile/app.py +99 -105
  47. universal_mcp/applications/whatsapp/app.py +86 -82
  48. universal_mcp/applications/whatsapp_business/app.py +147 -147
  49. universal_mcp/applications/youtube/app.py +290 -290
  50. universal_mcp/applications/zenquotes/app.py +6 -6
  51. {universal_mcp_applications-0.1.13.dist-info → universal_mcp_applications-0.1.14.dist-info}/METADATA +1 -1
  52. {universal_mcp_applications-0.1.13.dist-info → universal_mcp_applications-0.1.14.dist-info}/RECORD +54 -54
  53. {universal_mcp_applications-0.1.13.dist-info → universal_mcp_applications-0.1.14.dist-info}/WHEEL +0 -0
  54. {universal_mcp_applications-0.1.13.dist-info → universal_mcp_applications-0.1.14.dist-info}/licenses/LICENSE +0 -0
@@ -58,7 +58,9 @@ class WhatsappApp(BaseApplication):
58
58
  self._api_key: str | None = None
59
59
 
60
60
  def get_api_key(self) -> str:
61
- """Get the AgentR API key to use as for WhatsApp authentication."""
61
+ """
62
+ Extracts the 'X-API-KEY' from the AgentR integration client's headers to authenticate WhatsApp API requests. A ValueError is raised if the integration is missing or the key cannot be found, ensuring all operations are properly authorized before execution.
63
+ """
62
64
  if not self.integration:
63
65
  raise ValueError("No integration available to get API key from")
64
66
 
@@ -75,7 +77,9 @@ class WhatsappApp(BaseApplication):
75
77
 
76
78
  @property
77
79
  def api_key(self) -> str:
78
- """Gets the API key from the integration, triggering authentication if needed."""
80
+ """
81
+ A cached property that retrieves the API key from the AgentrIntegration. It calls the `get_api_key` method on its first access and stores the result for efficient subsequent lookups, ensuring the integration object is queried only once.
82
+ """
79
83
  if self._api_key:
80
84
  return self._api_key
81
85
  self._api_key = self.get_api_key()
@@ -155,17 +159,17 @@ class WhatsappApp(BaseApplication):
155
159
  query: str,
156
160
  ) -> list[dict[str, Any]]:
157
161
  """
158
- Search WhatsApp contacts by name or phone number.
159
-
162
+ Searches for WhatsApp contacts by name or phone number. This function takes a query string, handles user authentication, and calls the underlying API to find and return a list of matching contacts. It serves as the primary method to look up contact information within the application.
163
+
160
164
  Args:
161
165
  query (string): Search term to match against contact names or phone numbers
162
-
166
+
163
167
  Returns:
164
168
  List[Dict[str, Any]]: Retrieved collection
165
-
169
+
166
170
  Raises:
167
171
  ValueError: Raised when required parameters are missing.
168
-
172
+
169
173
  Tags:
170
174
  whatsapp.contacts, important
171
175
  """
@@ -179,7 +183,7 @@ class WhatsappApp(BaseApplication):
179
183
  contacts = whatsapp_search_contacts(query, user_id)
180
184
  return contacts
181
185
 
182
- def list_messages(
186
+ def search_messages(
183
187
  self,
184
188
  after: str | None = None,
185
189
  before: str | None = None,
@@ -193,8 +197,8 @@ class WhatsappApp(BaseApplication):
193
197
  context_after: int = 1,
194
198
  ) -> list[dict[str, Any]]:
195
199
  """
196
- Get WhatsApp messages matching specified criteria with optional context.
197
-
200
+ Searches for and retrieves a paginated list of WhatsApp messages using various filters like date, sender, chat, or content query. It can optionally include surrounding contextual messages for each result, unlike `get_message_context` which targets a single message ID.
201
+
198
202
  Args:
199
203
  after (string): Optional ISO-8601 formatted string to only return messages after this date
200
204
  before (string): Optional ISO-8601 formatted string to only return messages before this date
@@ -206,13 +210,13 @@ class WhatsappApp(BaseApplication):
206
210
  include_context (boolean): Whether to include messages before and after matches (default True)
207
211
  context_before (integer): Number of messages to include before each match (default 1)
208
212
  context_after (integer): Number of messages to include after each match (default 1)
209
-
213
+
210
214
  Returns:
211
215
  List[Dict[str, Any]]: Retrieved collection
212
-
216
+
213
217
  Raises:
214
218
  ValueError: Raised when required parameters are missing.
215
-
219
+
216
220
  Tags:
217
221
  whatsapp.messages, important
218
222
  """
@@ -235,7 +239,7 @@ class WhatsappApp(BaseApplication):
235
239
  )
236
240
  return messages
237
241
 
238
- def list_chats(
242
+ def search_chats(
239
243
  self,
240
244
  query: str | None = None,
241
245
  limit: int = 20,
@@ -244,21 +248,21 @@ class WhatsappApp(BaseApplication):
244
248
  sort_by: str = "last_active",
245
249
  ) -> list[dict[str, Any]]:
246
250
  """
247
- Get WhatsApp chats matching specified criteria.
248
-
251
+ Retrieves a paginated list of WhatsApp chats, allowing filtering by a search query and sorting by activity or name. Unlike `get_chat`, which fetches a single known chat, this function provides broad search and discovery capabilities across multiple user conversations.
252
+
249
253
  Args:
250
254
  query (string): Optional search term to filter chats by name or JID
251
255
  limit (integer): Maximum number of chats to return (default 20)
252
256
  page (integer): Page number for pagination (default 0)
253
257
  include_last_message (boolean): Whether to include the last message in each chat (default True)
254
258
  sort_by (string): Field to sort results by, either "last_active" or "name" (default "last_active")
255
-
259
+
256
260
  Returns:
257
261
  List[Dict[str, Any]]: Retrieved collection
258
-
262
+
259
263
  Raises:
260
264
  ValueError: Raised when required parameters are missing.
261
-
265
+
262
266
  Tags:
263
267
  whatsapp.chats, important
264
268
  """
@@ -276,24 +280,24 @@ class WhatsappApp(BaseApplication):
276
280
  )
277
281
  return chats
278
282
 
279
- def get_chat(
283
+ def get_chat_by_jid(
280
284
  self,
281
285
  chat_jid: str,
282
286
  include_last_message: bool = True,
283
287
  ) -> dict[str, Any]:
284
288
  """
285
- Get WhatsApp chat metadata by JID.
286
-
289
+ Retrieves metadata for a specific WhatsApp chat (direct or group) using its unique JID. It can optionally include the most recent message. This precise JID-based lookup distinguishes it from `get_direct_chat_by_contact`, which uses a phone number, and `list_chats`, which performs a broader search.
290
+
287
291
  Args:
288
292
  chat_jid (string): The JID of the chat to retrieve
289
293
  include_last_message (boolean): Whether to include the last message (default True)
290
-
294
+
291
295
  Returns:
292
296
  Dict[str, Any]: Retrieved chat metadata
293
-
297
+
294
298
  Raises:
295
299
  ValueError: Raised when required parameters are missing.
296
-
300
+
297
301
  Tags:
298
302
  whatsapp.chat, important
299
303
  """
@@ -307,22 +311,22 @@ class WhatsappApp(BaseApplication):
307
311
  chat = whatsapp_get_chat(chat_jid, include_last_message, user_id)
308
312
  return chat
309
313
 
310
- def get_direct_chat_by_contact(
314
+ def get_direct_chat_by_phone_number(
311
315
  self,
312
316
  sender_phone_number: str,
313
317
  ) -> dict[str, Any]:
314
318
  """
315
- Get WhatsApp chat metadata by sender phone number.
316
-
319
+ Retrieves metadata for a direct (one-on-one) WhatsApp chat using a contact's phone number. Unlike `get_chat` which requires a JID, this provides a simpler way to find direct conversations. Returns a dictionary containing the chat's details, such as its JID and name.
320
+
317
321
  Args:
318
322
  sender_phone_number (string): The phone number to search for
319
-
323
+
320
324
  Returns:
321
325
  Dict[str, Any]: Retrieved chat metadata
322
-
326
+
323
327
  Raises:
324
328
  ValueError: Raised when required parameters are missing.
325
-
329
+
326
330
  Tags:
327
331
  whatsapp.chat, important
328
332
  """
@@ -336,26 +340,26 @@ class WhatsappApp(BaseApplication):
336
340
  chat = whatsapp_get_direct_chat_by_contact(sender_phone_number, user_id)
337
341
  return chat
338
342
 
339
- def get_contact_chats(
343
+ def list_chats_by_contact_jid(
340
344
  self,
341
345
  jid: str,
342
346
  limit: int = 20,
343
347
  page: int = 0,
344
348
  ) -> list[dict[str, Any]]:
345
349
  """
346
- Get all WhatsApp chats involving the contact.
347
-
350
+ Retrieves a paginated list of all WhatsApp chats, including direct messages and groups, that a specific contact participates in. The contact is identified by their unique JID. This differs from `get_direct_chat_by_contact` which only finds one-on-one chats.
351
+
348
352
  Args:
349
353
  jid (string): The contact's JID to search for
350
354
  limit (integer): Maximum number of chats to return (default 20)
351
355
  page (integer): Page number for pagination (default 0)
352
-
356
+
353
357
  Returns:
354
358
  List[Dict[str, Any]]: Retrieved collection
355
-
359
+
356
360
  Raises:
357
361
  ValueError: Raised when required parameters are missing.
358
-
362
+
359
363
  Tags:
360
364
  whatsapp.contact_chats, important
361
365
  """
@@ -369,22 +373,22 @@ class WhatsappApp(BaseApplication):
369
373
  chats = whatsapp_get_contact_chats(jid, limit, page, user_id)
370
374
  return chats
371
375
 
372
- def get_last_interaction(
376
+ def get_last_message_by_jid(
373
377
  self,
374
378
  jid: str,
375
379
  ) -> str:
376
380
  """
377
- Get most recent WhatsApp message involving the contact.
378
-
381
+ Retrieves the content of the most recent message involving a specific contact, identified by their JID. It authenticates the user and returns the message directly as a string, offering a quick way to view the last communication without fetching full message objects or chat histories.
382
+
379
383
  Args:
380
384
  jid (string): The JID of the contact to search for
381
-
385
+
382
386
  Returns:
383
387
  string: Retrieved message
384
-
388
+
385
389
  Raises:
386
390
  ValueError: Raised when required parameters are missing.
387
-
391
+
388
392
  Tags:
389
393
  whatsapp.interaction, important
390
394
  """
@@ -405,19 +409,19 @@ class WhatsappApp(BaseApplication):
405
409
  after: int = 5,
406
410
  ) -> dict[str, Any]:
407
411
  """
408
- Get context around a specific WhatsApp message.
409
-
412
+ Fetches the conversational context surrounding a specific WhatsApp message ID. It retrieves a configurable number of messages immediately preceding and following the target message. This provides a focused view of a dialogue, unlike `list_messages` which performs broader, filter-based searches.
413
+
410
414
  Args:
411
415
  message_id (string): The ID of the message to get context for
412
416
  before (integer): Number of messages to include before the target message (default 5)
413
417
  after (integer): Number of messages to include after the target message (default 5)
414
-
418
+
415
419
  Returns:
416
420
  Dict[str, Any]: Retrieved message context
417
-
421
+
418
422
  Raises:
419
423
  ValueError: Raised when required parameters are missing.
420
-
424
+
421
425
  Tags:
422
426
  whatsapp.message_context, important
423
427
  """
@@ -431,25 +435,25 @@ class WhatsappApp(BaseApplication):
431
435
  context = whatsapp_get_message_context(message_id, before, after, user_id)
432
436
  return context
433
437
 
434
- def send_message(
438
+ def send_text_message(
435
439
  self,
436
440
  recipient: str,
437
441
  message: str,
438
442
  ) -> dict[str, Any]:
439
443
  """
440
- Send a WhatsApp message to a person or group. For group chats use the JID.
441
-
444
+ Authenticates the user and sends a text message to a specified WhatsApp recipient. The recipient can be an individual (via phone number) or a group (via JID). It returns a dictionary indicating the operation's success status and a corresponding message.
445
+
442
446
  Args:
443
447
  recipient (string): The recipient - either a phone number with country code but no + or other symbols,
444
448
  or a JID (e.g., "123456789@s.whatsapp.net" or a group JID like "123456789@g.us")
445
449
  message (string): The message text to send
446
-
450
+
447
451
  Returns:
448
452
  Dict[str, Any]: A dictionary containing success status and a status message
449
-
453
+
450
454
  Raises:
451
455
  ValueError: Raised when required parameters are missing.
452
-
456
+
453
457
  Tags:
454
458
  whatsapp.send_message, important
455
459
  """
@@ -469,25 +473,25 @@ class WhatsappApp(BaseApplication):
469
473
  "message": status_message,
470
474
  }
471
475
 
472
- def send_file(
476
+ def send_attachment(
473
477
  self,
474
478
  recipient: str,
475
479
  media_path: str,
476
480
  ) -> dict[str, Any]:
477
481
  """
478
- Send a file such as a picture, raw audio, video or document via WhatsApp to the specified recipient. For group messages use the JID.
479
-
482
+ Sends a media file (image, video, document, raw audio) as a standard attachment to a WhatsApp contact or group using their phone number or JID. Unlike `send_audio_message`, which creates a playable voice note, this function handles general file transfers. Returns a success status dictionary.
483
+
480
484
  Args:
481
485
  recipient (string): The recipient - either a phone number with country code but no + or other symbols,
482
486
  or a JID (e.g., "123456789@s.whatsapp.net" or a group JID like "123456789@g.us")
483
487
  media_path (string): The absolute path to the media file to send (image, video, document)
484
-
488
+
485
489
  Returns:
486
490
  Dict[str, Any]: A dictionary containing success status and a status message
487
-
491
+
488
492
  Raises:
489
493
  ValueError: Raised when required parameters are missing.
490
-
494
+
491
495
  Tags:
492
496
  whatsapp.send_file, important
493
497
  """
@@ -507,25 +511,25 @@ class WhatsappApp(BaseApplication):
507
511
  "message": status_message,
508
512
  }
509
513
 
510
- def send_audio_message(
514
+ def send_voice_message(
511
515
  self,
512
516
  recipient: str,
513
517
  media_path: str,
514
518
  ) -> dict[str, Any]:
515
519
  """
516
- Send any audio file as a WhatsApp audio message to the specified recipient. For group messages use the JID. If it errors due to ffmpeg not being installed, use send_file instead.
517
-
520
+ Sends a local audio file as a playable WhatsApp voice message, converting it to the required format. Unlike `send_file` which sends audio as a document attachment, this function formats the audio as a voice note. It can be sent to an individual contact or a group chat.
521
+
518
522
  Args:
519
523
  recipient (string): The recipient - either a phone number with country code but no + or other symbols,
520
524
  or a JID (e.g., "123456789@s.whatsapp.net" or a group JID like "123456789@g.us")
521
525
  media_path (string): The absolute path to the audio file to send (will be converted to Opus .ogg if it's not a .ogg file)
522
-
526
+
523
527
  Returns:
524
528
  Dict[str, Any]: A dictionary containing success status and a status message
525
-
529
+
526
530
  Raises:
527
531
  ValueError: Raised when required parameters are missing.
528
-
532
+
529
533
  Tags:
530
534
  whatsapp.send_audio_message, important
531
535
  """
@@ -546,24 +550,24 @@ class WhatsappApp(BaseApplication):
546
550
  "message": status_message,
547
551
  }
548
552
 
549
- def download_media(
553
+ def download_media_from_message(
550
554
  self,
551
555
  message_id: str,
552
556
  chat_jid: str,
553
557
  ) -> dict[str, Any]:
554
558
  """
555
- Download media from a WhatsApp message and get the local file path.
556
-
559
+ Downloads media from a specific WhatsApp message, identified by its ID and chat JID. It saves the content to a local file and returns the file's path upon success. The function automatically handles user authentication before initiating the download.
560
+
557
561
  Args:
558
562
  message_id (string): The ID of the message containing the media
559
563
  chat_jid (string): The JID of the chat containing the message
560
-
564
+
561
565
  Returns:
562
566
  Dict[str, Any]: A dictionary containing success status, a status message, and the file path if successful
563
-
567
+
564
568
  Raises:
565
569
  ValueError: Raised when required parameters are missing.
566
-
570
+
567
571
  Tags:
568
572
  whatsapp.download_media, important
569
573
  """
@@ -596,15 +600,15 @@ class WhatsappApp(BaseApplication):
596
600
  """
597
601
  return [
598
602
  self.search_contacts,
599
- self.list_messages,
600
- self.list_chats,
601
- self.get_chat,
602
- self.get_direct_chat_by_contact,
603
- self.get_contact_chats,
604
- self.get_last_interaction,
603
+ self.search_messages,
604
+ self.search_chats,
605
+ self.get_chat_by_jid,
606
+ self.get_direct_chat_by_phone_number,
607
+ self.list_chats_by_contact_jid,
608
+ self.get_last_message_by_jid,
605
609
  self.get_message_context,
606
- self.send_message,
607
- self.send_file,
608
- self.send_audio_message,
609
- self.download_media,
610
+ self.send_text_message,
611
+ self.send_attachment,
612
+ self.send_voice_message,
613
+ self.download_media_from_message,
610
614
  ]