universal-mcp-applications 0.1.2__py3-none-any.whl → 0.1.4__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 (80) hide show
  1. universal_mcp/applications/airtable/app.py +1 -0
  2. universal_mcp/applications/apollo/app.py +1 -0
  3. universal_mcp/applications/aws_s3/app.py +3 -4
  4. universal_mcp/applications/bill/app.py +3 -3
  5. universal_mcp/applications/box/app.py +2 -6
  6. universal_mcp/applications/braze/app.py +2 -6
  7. universal_mcp/applications/cal_com_v2/app.py +22 -64
  8. universal_mcp/applications/confluence/app.py +1 -0
  9. universal_mcp/applications/contentful/app.py +8 -19
  10. universal_mcp/applications/digitalocean/app.py +9 -27
  11. universal_mcp/applications/{domain-checker → domain_checker}/app.py +2 -1
  12. universal_mcp/applications/elevenlabs/app.py +98 -3188
  13. universal_mcp/applications/falai/app.py +1 -0
  14. universal_mcp/applications/file_system/__init__.py +1 -0
  15. universal_mcp/applications/file_system/app.py +96 -0
  16. universal_mcp/applications/fireflies/app.py +4 -3
  17. universal_mcp/applications/fpl/app.py +1 -0
  18. universal_mcp/applications/fpl/utils/fixtures.py +1 -1
  19. universal_mcp/applications/fpl/utils/helper.py +1 -1
  20. universal_mcp/applications/fpl/utils/position_utils.py +0 -1
  21. universal_mcp/applications/{ghost-content → ghost_content}/app.py +2 -1
  22. universal_mcp/applications/github/app.py +3 -1
  23. universal_mcp/applications/google_calendar/app.py +2 -1
  24. universal_mcp/applications/google_docs/app.py +1 -1
  25. universal_mcp/applications/google_drive/app.py +3 -68
  26. universal_mcp/applications/google_gemini/app.py +138 -618
  27. universal_mcp/applications/google_mail/app.py +2 -1
  28. universal_mcp/applications/{google-searchconsole → google_searchconsole}/app.py +1 -1
  29. universal_mcp/applications/google_sheet/app.py +2 -1
  30. universal_mcp/applications/google_sheet/helper.py +156 -116
  31. universal_mcp/applications/hashnode/app.py +1 -0
  32. universal_mcp/applications/{http-tools → http_tools}/app.py +2 -1
  33. universal_mcp/applications/hubspot/app.py +4 -1
  34. universal_mcp/applications/jira/app.py +7 -18
  35. universal_mcp/applications/markitdown/app.py +2 -3
  36. universal_mcp/applications/ms_teams/app.py +1 -1
  37. universal_mcp/applications/openai/app.py +2 -3
  38. universal_mcp/applications/outlook/app.py +1 -3
  39. universal_mcp/applications/pipedrive/app.py +2 -6
  40. universal_mcp/applications/reddit/app.py +1 -0
  41. universal_mcp/applications/replicate/app.py +3 -3
  42. universal_mcp/applications/resend/app.py +1 -2
  43. universal_mcp/applications/rocketlane/app.py +1 -0
  44. universal_mcp/applications/semrush/app.py +1 -1
  45. universal_mcp/applications/sentry/README.md +20 -20
  46. universal_mcp/applications/sentry/app.py +40 -40
  47. universal_mcp/applications/serpapi/app.py +2 -2
  48. universal_mcp/applications/sharepoint/app.py +1 -0
  49. universal_mcp/applications/shopify/app.py +1 -0
  50. universal_mcp/applications/slack/app.py +3 -3
  51. universal_mcp/applications/trello/app.py +9 -27
  52. universal_mcp/applications/twilio/__init__.py +1 -0
  53. universal_mcp/applications/{twillo → twilio}/app.py +2 -2
  54. universal_mcp/applications/twitter/README.md +1 -1
  55. universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +2 -2
  56. universal_mcp/applications/twitter/api_segments/lists_api.py +1 -1
  57. universal_mcp/applications/unipile/app.py +5 -1
  58. universal_mcp/applications/whatsapp/app.py +18 -17
  59. universal_mcp/applications/whatsapp/audio.py +110 -0
  60. universal_mcp/applications/whatsapp/whatsapp.py +398 -0
  61. universal_mcp/applications/whatsapp_business/app.py +1 -1
  62. universal_mcp/applications/youtube/app.py +195 -191
  63. universal_mcp/applications/zenquotes/app.py +1 -1
  64. {universal_mcp_applications-0.1.2.dist-info → universal_mcp_applications-0.1.4.dist-info}/METADATA +4 -2
  65. {universal_mcp_applications-0.1.2.dist-info → universal_mcp_applications-0.1.4.dist-info}/RECORD +76 -75
  66. universal_mcp/applications/google-ads/__init__.py +0 -1
  67. universal_mcp/applications/google-ads/app.py +0 -23
  68. universal_mcp/applications/twillo/README.md +0 -0
  69. universal_mcp/applications/twillo/__init__.py +0 -1
  70. /universal_mcp/applications/{domain-checker → domain_checker}/README.md +0 -0
  71. /universal_mcp/applications/{domain-checker → domain_checker}/__init__.py +0 -0
  72. /universal_mcp/applications/{ghost-content → ghost_content}/README.md +0 -0
  73. /universal_mcp/applications/{ghost-content → ghost_content}/__init__.py +0 -0
  74. /universal_mcp/applications/{google-searchconsole → google_searchconsole}/README.md +0 -0
  75. /universal_mcp/applications/{google-searchconsole → google_searchconsole}/__init__.py +0 -0
  76. /universal_mcp/applications/{http-tools → http_tools}/README.md +0 -0
  77. /universal_mcp/applications/{http-tools → http_tools}/__init__.py +0 -0
  78. /universal_mcp/applications/{google-ads → twilio}/README.md +0 -0
  79. {universal_mcp_applications-0.1.2.dist-info → universal_mcp_applications-0.1.4.dist-info}/WHEEL +0 -0
  80. {universal_mcp_applications-0.1.2.dist-info → universal_mcp_applications-0.1.4.dist-info}/licenses/LICENSE +0 -0
@@ -3,6 +3,7 @@ from typing import Any, Literal
3
3
 
4
4
  from fal_client import AsyncClient, AsyncRequestHandle, Status
5
5
  from loguru import logger
6
+
6
7
  from universal_mcp.applications.application import APIApplication
7
8
  from universal_mcp.exceptions import NotAuthorizedError, ToolError
8
9
  from universal_mcp.integrations import Integration
@@ -0,0 +1 @@
1
+ from .app import FileSystemApp
@@ -0,0 +1,96 @@
1
+ import os
2
+ import shutil
3
+ import uuid
4
+
5
+ from universal_mcp.applications.application import BaseApplication
6
+
7
+
8
+ class FileSystemApp(BaseApplication):
9
+ def __init__(self, **kwargs):
10
+ super().__init__(name="file_system", **kwargs)
11
+
12
+ @staticmethod
13
+ async def _generate_file_path():
14
+ return f"/tmp/{uuid.uuid4()}"
15
+
16
+ @staticmethod
17
+ async def read_file(file_path: str):
18
+ """Reads file data from a file path.
19
+
20
+ Args:
21
+ file_path (str): The path to the file to read.
22
+
23
+ Returns:
24
+ bytes: The file content as bytes.
25
+
26
+ Raises:
27
+ FileNotFoundError: If the file doesn't exist.
28
+ IOError: If there's an error reading the file.
29
+
30
+ Tags:
31
+ important
32
+ """
33
+ with open(file_path, "rb") as f:
34
+ return f.read()
35
+
36
+ @staticmethod
37
+ async def write_file(file_data: bytes, file_path: str = None):
38
+ """Writes file data to a file path.
39
+
40
+ Args:
41
+ file_data (bytes): The data to write to the file.
42
+ file_path (str, optional): The path where to write the file.
43
+ If None, generates a random path in /tmp. Defaults to None.
44
+
45
+ Returns:
46
+ dict: A dictionary containing the operation result with keys:
47
+ - status (str): "success" if the operation completed successfully
48
+ - data (dict): Contains file information with keys:
49
+ - url (str): The file path where the data was written
50
+ - filename (str): The filename (same as url in this implementation)
51
+ - size (int): The size of the written data in bytes
52
+
53
+ Raises:
54
+ IOError: If there's an error writing the file.
55
+ PermissionError: If there are insufficient permissions to write to the path.
56
+
57
+ Tags:
58
+ important
59
+ """
60
+ if file_path is None:
61
+ file_path = await FileSystemApp._generate_file_path()
62
+ with open(file_path, "wb") as f:
63
+ f.write(file_data)
64
+ result = {
65
+ "status": "success",
66
+ "data": {
67
+ "url": file_path,
68
+ "filename": file_path,
69
+ "size": len(file_data),
70
+ },
71
+ }
72
+ return result
73
+
74
+ @staticmethod
75
+ async def delete_file(file_path: str):
76
+ """Deletes a file from the file system."""
77
+ os.remove(file_path)
78
+ return {"status": "success"}
79
+
80
+ @staticmethod
81
+ async def move_file(source_file_path: str, dest_file_path: str):
82
+ """Moves a file from one path to another."""
83
+ os.rename(source_file_path, dest_file_path)
84
+ return {"status": "success"}
85
+
86
+ @staticmethod
87
+ async def copy_file(source_file_path: str, dest_file_path: str):
88
+ """Copies a file from one path to another."""
89
+ shutil.copy(source_file_path, dest_file_path)
90
+ return {"status": "success"}
91
+
92
+ def list_tools(self):
93
+ return [
94
+ FileSystemApp.read_file,
95
+ FileSystemApp.write_file,
96
+ ]
@@ -1,10 +1,11 @@
1
- from collections.abc import Callable # For type hinting
1
+ from collections.abc import Callable
2
2
  from typing import Any
3
3
 
4
4
  from gql import gql
5
- from universal_mcp.applications import (
5
+
6
+ from universal_mcp.applications.application import (
6
7
  GraphQLApplication,
7
- ) # Assuming this is in a reachable path
8
+ )
8
9
  from universal_mcp.integrations import Integration
9
10
 
10
11
 
@@ -3,6 +3,7 @@ from datetime import datetime
3
3
  from typing import Any
4
4
 
5
5
  import requests
6
+
6
7
  from universal_mcp.applications.application import APIApplication
7
8
  from universal_mcp.integrations import Integration
8
9
 
@@ -3,7 +3,7 @@
3
3
  import logging
4
4
  from typing import Any
5
5
 
6
- from universal_mcp_fpl.utils.api import api
6
+ from .api import api
7
7
 
8
8
  # Set up logging following project conventions
9
9
  logger = logging.getLogger("fpl-mcp-server.fixtures")
@@ -3,7 +3,7 @@ import logging
3
3
  from typing import Any
4
4
 
5
5
  logger = logging.getLogger("fpl-mcp-server.fixtures")
6
- from universal_mcp_fpl.utils.api import api
6
+ from .api import api
7
7
 
8
8
  # Resources
9
9
 
@@ -1,6 +1,5 @@
1
1
  """Utilities for normalizing position terms in FPL context."""
2
2
 
3
-
4
3
  # Comprehensive position mapping dictionary
5
4
  POSITION_MAPPINGS = {
6
5
  # Standard FPL codes
@@ -2,6 +2,7 @@ from collections.abc import Callable
2
2
  from typing import Any
3
3
 
4
4
  from loguru import logger
5
+
5
6
  from universal_mcp.applications.application import APIApplication
6
7
  from universal_mcp.integrations import Integration
7
8
 
@@ -24,7 +25,7 @@ class GhostContentApp(APIApplication):
24
25
  "https://your-ghost-site.com") and 'key' (the Content API key)
25
26
  via `integration.get_credentials()`.
26
27
  """
27
- super().__init__(name="ghost-content", integration=integration)
28
+ super().__init__(name="ghost_content", integration=integration)
28
29
  self._base_url = None
29
30
  self._api_key = None # Cache the API key
30
31
  self._version = None # Cache the version
@@ -1,6 +1,7 @@
1
1
  from typing import Any
2
2
 
3
3
  from loguru import logger
4
+
4
5
  from universal_mcp.applications.application import APIApplication
5
6
  from universal_mcp.integrations import Integration
6
7
 
@@ -4469,7 +4470,8 @@ class GithubApp(APIApplication):
4469
4470
  dependabot_security_updates_enabled_for_new_repositories: bool | None = None,
4470
4471
  dependency_graph_enabled_for_new_repositories: bool | None = None,
4471
4472
  secret_scanning_enabled_for_new_repositories: bool | None = None,
4472
- secret_scanning_push_protection_enabled_for_new_repositories: bool | None = None,
4473
+ secret_scanning_push_protection_enabled_for_new_repositories: bool
4474
+ | None = None,
4473
4475
  secret_scanning_push_protection_custom_link_enabled: bool | None = None,
4474
4476
  secret_scanning_push_protection_custom_link: str | None = None,
4475
4477
  deploy_keys_enabled_for_repositories: bool | None = None,
@@ -2,13 +2,14 @@ from datetime import UTC, datetime, timedelta
2
2
  from typing import Any
3
3
 
4
4
  from loguru import logger
5
+
5
6
  from universal_mcp.applications.application import APIApplication
6
7
  from universal_mcp.integrations import Integration
7
8
 
8
9
 
9
10
  class GoogleCalendarApp(APIApplication):
10
11
  def __init__(self, integration: Integration) -> None:
11
- super().__init__(name="google-calendar", integration=integration)
12
+ super().__init__(name="google_calendar", integration=integration)
12
13
  self.base_api_url = "https://www.googleapis.com/calendar/v3/calendars/primary"
13
14
  self.base_url = "https://www.googleapis.com/calendar/v3"
14
15
 
@@ -6,7 +6,7 @@ from universal_mcp.integrations import Integration
6
6
 
7
7
  class GoogleDocsApp(APIApplication):
8
8
  def __init__(self, integration: Integration) -> None:
9
- super().__init__(name="google-docs", integration=integration)
9
+ super().__init__(name="google_docs", integration=integration)
10
10
  self.base_api_url = "https://docs.googleapis.com/v1/documents"
11
11
 
12
12
  def create_document(self, title: str) -> dict[str, Any]:
@@ -2,6 +2,7 @@ from typing import Any
2
2
 
3
3
  import httpx
4
4
  from loguru import logger
5
+
5
6
  from universal_mcp.applications.application import APIApplication
6
7
  from universal_mcp.integrations import Integration
7
8
 
@@ -13,7 +14,7 @@ class GoogleDriveApp(APIApplication):
13
14
  """
14
15
 
15
16
  def __init__(self, integration: Integration | None = None) -> None:
16
- super().__init__(name="google-drive", integration=integration)
17
+ super().__init__(name="google_drive", integration=integration)
17
18
  self.base_url = "https://www.googleapis.com/drive/v3"
18
19
 
19
20
  def move_files(
@@ -4750,71 +4751,7 @@ class GoogleDriveApp(APIApplication):
4750
4751
  except ValueError:
4751
4752
  return None
4752
4753
 
4753
- def list_all_members_of_achannel(
4754
- self, channel: str | None = None
4755
- ) -> dict[str, Any]:
4756
- """
4757
- List all members of a channel
4758
-
4759
- Args:
4760
- channel (string): Specifies the channel for which to retrieve conversation members; must be a valid channel identifier. Example: '{{channelId}}'.
4761
-
4762
- Returns:
4763
- dict[str, Any]: Success Response
4764
-
4765
- Raises:
4766
- HTTPError: Raised when the API request fails (e.g., non-2XX status code).
4767
- JSONDecodeError: Raised if the response body cannot be parsed as JSON.
4768
-
4769
- Tags:
4770
- Google Drive API Use Cases, Share file access to a slack channel
4771
- """
4772
- url = f"{self.base_url}/api/conversations.members"
4773
- query_params = {k: v for k, v in [("channel", channel)] if v is not None}
4774
- response = self._get(url, params=query_params)
4775
- response.raise_for_status()
4776
- if (
4777
- response.status_code == 204
4778
- or not response.content
4779
- or not response.text.strip()
4780
- ):
4781
- return None
4782
- try:
4783
- return response.json()
4784
- except ValueError:
4785
- return None
4786
-
4787
- def fetch_user_email(self, user: str | None = None) -> dict[str, Any]:
4788
- """
4789
- Fetch User Email
4790
-
4791
- Args:
4792
- user (string): Specifies the user identifier to retrieve information for; the value should be a unique string. Example: '{{currentUserId}}'.
4793
-
4794
- Returns:
4795
- dict[str, Any]: Fetch User Email
4796
-
4797
- Raises:
4798
- HTTPError: Raised when the API request fails (e.g., non-2XX status code).
4799
- JSONDecodeError: Raised if the response body cannot be parsed as JSON.
4800
-
4801
- Tags:
4802
- Google Drive API Use Cases, Share file access to a slack channel
4803
- """
4804
- url = f"{self.base_url}/api/users.info"
4805
- query_params = {k: v for k, v in [("user", user)] if v is not None}
4806
- response = self._get(url, params=query_params)
4807
- response.raise_for_status()
4808
- if (
4809
- response.status_code == 204
4810
- or not response.content
4811
- or not response.text.strip()
4812
- ):
4813
- return None
4814
- try:
4815
- return response.json()
4816
- except ValueError:
4817
- return None
4754
+
4818
4755
 
4819
4756
  def grant_google_drive_access(
4820
4757
  self,
@@ -4929,8 +4866,6 @@ class GoogleDriveApp(APIApplication):
4929
4866
  self.get_aspecific_revision,
4930
4867
  self.permanently_delete_afile_version,
4931
4868
  self.update_arevision,
4932
- self.list_all_members_of_achannel,
4933
- self.fetch_user_email,
4934
4869
  self.grant_google_drive_access,
4935
4870
  self.move_files,
4936
4871
  ]