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.
- universal_mcp/applications/airtable/app.py +1 -0
- universal_mcp/applications/apollo/app.py +1 -0
- universal_mcp/applications/aws_s3/app.py +3 -4
- universal_mcp/applications/bill/app.py +3 -3
- universal_mcp/applications/box/app.py +2 -6
- universal_mcp/applications/braze/app.py +2 -6
- universal_mcp/applications/cal_com_v2/app.py +22 -64
- universal_mcp/applications/confluence/app.py +1 -0
- universal_mcp/applications/contentful/app.py +8 -19
- universal_mcp/applications/digitalocean/app.py +9 -27
- universal_mcp/applications/{domain-checker → domain_checker}/app.py +2 -1
- universal_mcp/applications/elevenlabs/app.py +98 -3188
- universal_mcp/applications/falai/app.py +1 -0
- universal_mcp/applications/file_system/__init__.py +1 -0
- universal_mcp/applications/file_system/app.py +96 -0
- universal_mcp/applications/fireflies/app.py +4 -3
- universal_mcp/applications/fpl/app.py +1 -0
- universal_mcp/applications/fpl/utils/fixtures.py +1 -1
- universal_mcp/applications/fpl/utils/helper.py +1 -1
- universal_mcp/applications/fpl/utils/position_utils.py +0 -1
- universal_mcp/applications/{ghost-content → ghost_content}/app.py +2 -1
- universal_mcp/applications/github/app.py +3 -1
- universal_mcp/applications/google_calendar/app.py +2 -1
- universal_mcp/applications/google_docs/app.py +1 -1
- universal_mcp/applications/google_drive/app.py +3 -68
- universal_mcp/applications/google_gemini/app.py +138 -618
- universal_mcp/applications/google_mail/app.py +2 -1
- universal_mcp/applications/{google-searchconsole → google_searchconsole}/app.py +1 -1
- universal_mcp/applications/google_sheet/app.py +2 -1
- universal_mcp/applications/google_sheet/helper.py +156 -116
- universal_mcp/applications/hashnode/app.py +1 -0
- universal_mcp/applications/{http-tools → http_tools}/app.py +2 -1
- universal_mcp/applications/hubspot/app.py +4 -1
- universal_mcp/applications/jira/app.py +7 -18
- universal_mcp/applications/markitdown/app.py +2 -3
- universal_mcp/applications/ms_teams/app.py +1 -1
- universal_mcp/applications/openai/app.py +2 -3
- universal_mcp/applications/outlook/app.py +1 -3
- universal_mcp/applications/pipedrive/app.py +2 -6
- universal_mcp/applications/reddit/app.py +1 -0
- universal_mcp/applications/replicate/app.py +3 -3
- universal_mcp/applications/resend/app.py +1 -2
- universal_mcp/applications/rocketlane/app.py +1 -0
- universal_mcp/applications/semrush/app.py +1 -1
- universal_mcp/applications/sentry/README.md +20 -20
- universal_mcp/applications/sentry/app.py +40 -40
- universal_mcp/applications/serpapi/app.py +2 -2
- universal_mcp/applications/sharepoint/app.py +1 -0
- universal_mcp/applications/shopify/app.py +1 -0
- universal_mcp/applications/slack/app.py +3 -3
- universal_mcp/applications/trello/app.py +9 -27
- universal_mcp/applications/twilio/__init__.py +1 -0
- universal_mcp/applications/{twillo → twilio}/app.py +2 -2
- universal_mcp/applications/twitter/README.md +1 -1
- universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +2 -2
- universal_mcp/applications/twitter/api_segments/lists_api.py +1 -1
- universal_mcp/applications/unipile/app.py +5 -1
- universal_mcp/applications/whatsapp/app.py +18 -17
- universal_mcp/applications/whatsapp/audio.py +110 -0
- universal_mcp/applications/whatsapp/whatsapp.py +398 -0
- universal_mcp/applications/whatsapp_business/app.py +1 -1
- universal_mcp/applications/youtube/app.py +195 -191
- universal_mcp/applications/zenquotes/app.py +1 -1
- {universal_mcp_applications-0.1.2.dist-info → universal_mcp_applications-0.1.4.dist-info}/METADATA +4 -2
- {universal_mcp_applications-0.1.2.dist-info → universal_mcp_applications-0.1.4.dist-info}/RECORD +76 -75
- universal_mcp/applications/google-ads/__init__.py +0 -1
- universal_mcp/applications/google-ads/app.py +0 -23
- universal_mcp/applications/twillo/README.md +0 -0
- universal_mcp/applications/twillo/__init__.py +0 -1
- /universal_mcp/applications/{domain-checker → domain_checker}/README.md +0 -0
- /universal_mcp/applications/{domain-checker → domain_checker}/__init__.py +0 -0
- /universal_mcp/applications/{ghost-content → ghost_content}/README.md +0 -0
- /universal_mcp/applications/{ghost-content → ghost_content}/__init__.py +0 -0
- /universal_mcp/applications/{google-searchconsole → google_searchconsole}/README.md +0 -0
- /universal_mcp/applications/{google-searchconsole → google_searchconsole}/__init__.py +0 -0
- /universal_mcp/applications/{http-tools → http_tools}/README.md +0 -0
- /universal_mcp/applications/{http-tools → http_tools}/__init__.py +0 -0
- /universal_mcp/applications/{google-ads → twilio}/README.md +0 -0
- {universal_mcp_applications-0.1.2.dist-info → universal_mcp_applications-0.1.4.dist-info}/WHEEL +0 -0
- {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
|
|
1
|
+
from collections.abc import Callable
|
|
2
2
|
from typing import Any
|
|
3
3
|
|
|
4
4
|
from gql import gql
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
from universal_mcp.applications.application import (
|
|
6
7
|
GraphQLApplication,
|
|
7
|
-
)
|
|
8
|
+
)
|
|
8
9
|
from universal_mcp.integrations import Integration
|
|
9
10
|
|
|
10
11
|
|
|
@@ -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="
|
|
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
|
|
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="
|
|
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="
|
|
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="
|
|
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
|
-
|
|
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
|
]
|