universal-mcp 0.1.8rc1__py3-none-any.whl → 0.1.8rc2__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.
- universal_mcp/applications/application.py +6 -5
- universal_mcp/applications/calendly/README.md +78 -0
- universal_mcp/applications/calendly/app.py +954 -0
- universal_mcp/applications/e2b/app.py +18 -12
- universal_mcp/applications/firecrawl/app.py +28 -1
- universal_mcp/applications/github/app.py +150 -107
- universal_mcp/applications/google_calendar/app.py +72 -137
- universal_mcp/applications/google_docs/app.py +35 -15
- universal_mcp/applications/google_drive/app.py +84 -55
- universal_mcp/applications/google_mail/app.py +143 -53
- universal_mcp/applications/google_sheet/app.py +61 -38
- universal_mcp/applications/markitdown/app.py +12 -11
- universal_mcp/applications/notion/app.py +199 -89
- universal_mcp/applications/perplexity/app.py +17 -15
- universal_mcp/applications/reddit/app.py +110 -101
- universal_mcp/applications/resend/app.py +14 -7
- universal_mcp/applications/serpapi/app.py +13 -6
- universal_mcp/applications/tavily/app.py +13 -10
- universal_mcp/applications/wrike/README.md +71 -0
- universal_mcp/applications/wrike/__init__.py +0 -0
- universal_mcp/applications/wrike/app.py +1044 -0
- universal_mcp/applications/youtube/README.md +82 -0
- universal_mcp/applications/youtube/__init__.py +0 -0
- universal_mcp/applications/youtube/app.py +986 -0
- universal_mcp/applications/zenquotes/app.py +13 -3
- universal_mcp/exceptions.py +8 -2
- universal_mcp/integrations/__init__.py +15 -1
- universal_mcp/integrations/integration.py +132 -27
- universal_mcp/servers/__init__.py +6 -15
- universal_mcp/servers/server.py +209 -153
- universal_mcp/stores/__init__.py +7 -2
- universal_mcp/stores/store.py +103 -42
- universal_mcp/tools/__init__.py +3 -0
- universal_mcp/tools/adapters.py +40 -0
- universal_mcp/tools/func_metadata.py +214 -0
- universal_mcp/tools/tools.py +285 -0
- universal_mcp/utils/docgen.py +277 -123
- universal_mcp/utils/docstring_parser.py +156 -0
- universal_mcp/utils/openapi.py +149 -40
- {universal_mcp-0.1.8rc1.dist-info → universal_mcp-0.1.8rc2.dist-info}/METADATA +7 -3
- universal_mcp-0.1.8rc2.dist-info/RECORD +71 -0
- universal_mcp-0.1.8rc1.dist-info/RECORD +0 -58
- /universal_mcp/{utils/bridge.py → applications/calendly/__init__.py} +0 -0
- {universal_mcp-0.1.8rc1.dist-info → universal_mcp-0.1.8rc2.dist-info}/WHEEL +0 -0
- {universal_mcp-0.1.8rc1.dist-info → universal_mcp-0.1.8rc2.dist-info}/entry_points.txt +0 -0
@@ -34,13 +34,20 @@ class GoogleSheetApp(APIApplication):
|
|
34
34
|
|
35
35
|
def create_spreadsheet(self, title: str) -> dict[str, Any]:
|
36
36
|
"""
|
37
|
-
Creates a new blank Google Spreadsheet with the specified title.
|
37
|
+
Creates a new blank Google Spreadsheet with the specified title and returns the API response.
|
38
38
|
|
39
39
|
Args:
|
40
|
-
title:
|
41
|
-
|
40
|
+
title: String representing the desired title for the new spreadsheet
|
41
|
+
|
42
42
|
Returns:
|
43
|
-
|
43
|
+
Dictionary containing the full response from the Google Sheets API, including the spreadsheet's metadata and properties
|
44
|
+
|
45
|
+
Raises:
|
46
|
+
HTTPError: When the API request fails due to invalid authentication, network issues, or API limitations
|
47
|
+
ValueError: When the title parameter is empty or contains invalid characters
|
48
|
+
|
49
|
+
Tags:
|
50
|
+
create, spreadsheet, google-sheets, api, important
|
44
51
|
"""
|
45
52
|
url = self.base_api_url
|
46
53
|
spreadsheet_data = {
|
@@ -48,19 +55,26 @@ class GoogleSheetApp(APIApplication):
|
|
48
55
|
"title": title
|
49
56
|
}
|
50
57
|
}
|
51
|
-
|
52
58
|
response = self._post(url, data=spreadsheet_data)
|
53
59
|
return response.json()
|
54
60
|
|
55
61
|
def get_spreadsheet(self, spreadsheet_id: str) -> dict[str, Any]:
|
56
62
|
"""
|
57
|
-
|
63
|
+
Retrieves detailed information about a specific Google Spreadsheet using its ID.
|
58
64
|
|
59
65
|
Args:
|
60
|
-
spreadsheet_id: The
|
61
|
-
|
66
|
+
spreadsheet_id: The unique identifier of the Google Spreadsheet to retrieve (found in the spreadsheet's URL)
|
67
|
+
|
62
68
|
Returns:
|
63
|
-
|
69
|
+
A dictionary containing the full spreadsheet metadata and contents, including properties, sheets, named ranges, and other spreadsheet-specific information from the Google Sheets API
|
70
|
+
|
71
|
+
Raises:
|
72
|
+
HTTPError: When the API request fails due to invalid spreadsheet_id or insufficient permissions
|
73
|
+
ConnectionError: When there's a network connectivity issue
|
74
|
+
ValueError: When the response cannot be parsed as JSON
|
75
|
+
|
76
|
+
Tags:
|
77
|
+
get, retrieve, spreadsheet, api, metadata, read, important
|
64
78
|
"""
|
65
79
|
url = f"{self.base_api_url}/{spreadsheet_id}"
|
66
80
|
response = self._get(url)
|
@@ -68,40 +82,48 @@ class GoogleSheetApp(APIApplication):
|
|
68
82
|
|
69
83
|
def batch_get_values(self, spreadsheet_id: str, ranges: list[str] = None) -> dict[str, Any]:
|
70
84
|
"""
|
71
|
-
|
85
|
+
Retrieves multiple ranges of values from a Google Spreadsheet in a single batch request.
|
72
86
|
|
73
87
|
Args:
|
74
|
-
spreadsheet_id: The
|
75
|
-
ranges: Optional list of A1 notation or R1C1 notation
|
76
|
-
|
77
|
-
|
88
|
+
spreadsheet_id: The unique identifier of the Google Spreadsheet to retrieve values from
|
89
|
+
ranges: Optional list of A1 notation or R1C1 notation range strings (e.g., ['Sheet1!A1:B2', 'Sheet2!C3:D4']). If None, returns values from the entire spreadsheet
|
90
|
+
|
78
91
|
Returns:
|
79
|
-
|
92
|
+
A dictionary containing the API response with the requested spreadsheet values and metadata
|
93
|
+
|
94
|
+
Raises:
|
95
|
+
HTTPError: If the API request fails due to invalid spreadsheet_id, insufficient permissions, or invalid range format
|
96
|
+
ValueError: If the spreadsheet_id is empty or invalid
|
97
|
+
|
98
|
+
Tags:
|
99
|
+
get, batch, read, spreadsheet, values, important
|
80
100
|
"""
|
81
101
|
url = f"{self.base_api_url}/{spreadsheet_id}/values:batchGet"
|
82
|
-
|
83
102
|
params = {}
|
84
103
|
if ranges:
|
85
104
|
params["ranges"] = ranges
|
86
|
-
|
87
105
|
response = self._get(url, params=params)
|
88
106
|
return response.json()
|
89
107
|
|
90
108
|
def clear_values(self, spreadsheet_id: str, range: str) -> dict[str, Any]:
|
91
109
|
"""
|
92
|
-
Clears values from a
|
93
|
-
of the cell (such as formatting, data validation, etc.) are kept.
|
110
|
+
Clears all values from a specified range in a Google Spreadsheet while preserving cell formatting and other properties
|
94
111
|
|
95
112
|
Args:
|
96
|
-
spreadsheet_id: The
|
97
|
-
range: The A1
|
98
|
-
|
99
|
-
|
113
|
+
spreadsheet_id: The unique identifier of the Google Spreadsheet to modify
|
114
|
+
range: The A1 or R1C1 notation range of cells to clear (e.g., 'Sheet1!A1:B2')
|
115
|
+
|
100
116
|
Returns:
|
101
|
-
|
117
|
+
A dictionary containing the Google Sheets API response
|
118
|
+
|
119
|
+
Raises:
|
120
|
+
HttpError: When the API request fails due to invalid spreadsheet_id, invalid range format, or insufficient permissions
|
121
|
+
ValueError: When spreadsheet_id is empty or range is in invalid format
|
122
|
+
|
123
|
+
Tags:
|
124
|
+
clear, modify, spreadsheet, api, sheets, data-management, important
|
102
125
|
"""
|
103
126
|
url = f"{self.base_api_url}/{spreadsheet_id}/values/{range}:clear"
|
104
|
-
|
105
127
|
response = self._post(url, data={})
|
106
128
|
return response.json()
|
107
129
|
|
@@ -113,31 +135,32 @@ class GoogleSheetApp(APIApplication):
|
|
113
135
|
value_input_option: str = "RAW"
|
114
136
|
) -> dict[str, Any]:
|
115
137
|
"""
|
116
|
-
|
138
|
+
Updates cell values in a specified range of a Google Spreadsheet using the Sheets API
|
117
139
|
|
118
140
|
Args:
|
119
|
-
spreadsheet_id: The
|
120
|
-
range: The A1 notation
|
121
|
-
values:
|
122
|
-
value_input_option:
|
123
|
-
|
124
|
-
- "RAW": The values will be stored as-is
|
125
|
-
- "USER_ENTERED": The values will be parsed as if the user typed them into the UI
|
126
|
-
|
141
|
+
spreadsheet_id: The unique identifier of the target Google Spreadsheet
|
142
|
+
range: The A1 notation range where values will be updated (e.g., 'Sheet1!A1:B2')
|
143
|
+
values: A list of lists containing the data to write, where each inner list represents a row of values
|
144
|
+
value_input_option: Determines how input data should be interpreted: 'RAW' (as-is) or 'USER_ENTERED' (parsed as UI input). Defaults to 'RAW'
|
145
|
+
|
127
146
|
Returns:
|
128
|
-
|
147
|
+
A dictionary containing the Google Sheets API response with update details
|
148
|
+
|
149
|
+
Raises:
|
150
|
+
RequestError: When the API request fails due to invalid parameters or network issues
|
151
|
+
AuthenticationError: When authentication with the Google Sheets API fails
|
152
|
+
|
153
|
+
Tags:
|
154
|
+
update, write, sheets, api, important, data-modification, google-sheets
|
129
155
|
"""
|
130
156
|
url = f"{self.base_api_url}/{spreadsheet_id}/values/{range}"
|
131
|
-
|
132
157
|
params = {
|
133
158
|
"valueInputOption": value_input_option
|
134
159
|
}
|
135
|
-
|
136
160
|
data = {
|
137
161
|
"range": range,
|
138
162
|
"values": values
|
139
163
|
}
|
140
|
-
|
141
164
|
response = self._put(url, data=data, params=params)
|
142
165
|
return response.json()
|
143
166
|
|
@@ -9,8 +9,9 @@ class MarkitdownApp(Application):
|
|
9
9
|
self.markitdown = MarkItDown()
|
10
10
|
|
11
11
|
async def convert_to_markdown(self, uri: str) -> str:
|
12
|
-
"""
|
13
|
-
|
12
|
+
"""
|
13
|
+
Asynchronously converts a URI to markdown format using the markitdown converter.
|
14
|
+
|
14
15
|
This tool aims to extract the main text content from various sources. It supports:
|
15
16
|
- Web Pages: General HTML, specific handlers for RSS/Atom feeds, Wikipedia articles (main content), YouTube (transcripts if available), Bing SERPs.
|
16
17
|
- Documents: PDF (attempts OCR), DOCX, XLSX, PPTX, XLS, EPUB, Outlook MSG, IPYNB notebooks.
|
@@ -19,21 +20,21 @@ class MarkitdownApp(Application):
|
|
19
20
|
- Audio: Extracts metadata and attempts transcription to get text.
|
20
21
|
- Archives: ZIP (extracts and attempts to convert supported files within, concatenating results).
|
21
22
|
|
22
|
-
Note: Conversion quality depends on the source format. Complex layouts, encrypted files, or missing transcripts/OCR data may limit output.
|
23
|
-
Enhanced PDF/Image processing via Azure Document Intelligence may be active if configured server-side.
|
24
|
-
|
25
23
|
Args:
|
26
24
|
uri (str): The URI pointing to the resource. Supported schemes:
|
27
25
|
- http:// or https:// (Web pages, feeds, APIs)
|
28
26
|
- file:// (Local or accessible network files)
|
29
27
|
- data: (Embedded data)
|
30
|
-
|
28
|
+
|
31
29
|
Returns:
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
30
|
+
A string containing the markdown representation of the content at the specified URI
|
31
|
+
|
32
|
+
Raises:
|
33
|
+
ValueError: If the URI is invalid or empty
|
34
|
+
ConnectionError: If the URI cannot be accessed or content cannot be retrieved
|
35
|
+
|
36
|
+
Tags:
|
37
|
+
convert, markdown, async, uri, transform, document
|
37
38
|
"""
|
38
39
|
return self.markitdown.convert_uri(uri).markdown
|
39
40
|
|