universal-mcp 0.1.8rc2__py3-none-any.whl → 0.1.8rc3__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.
Files changed (45) hide show
  1. universal_mcp/__init__.py +0 -2
  2. universal_mcp/analytics.py +75 -0
  3. universal_mcp/applications/application.py +27 -5
  4. universal_mcp/applications/calendly/app.py +413 -160
  5. universal_mcp/applications/coda/README.md +133 -0
  6. universal_mcp/applications/coda/__init__.py +0 -0
  7. universal_mcp/applications/coda/app.py +3704 -0
  8. universal_mcp/applications/e2b/app.py +6 -7
  9. universal_mcp/applications/firecrawl/app.py +1 -1
  10. universal_mcp/applications/github/app.py +41 -42
  11. universal_mcp/applications/google_calendar/app.py +20 -20
  12. universal_mcp/applications/google_docs/app.py +22 -29
  13. universal_mcp/applications/google_drive/app.py +53 -59
  14. universal_mcp/applications/google_mail/app.py +40 -40
  15. universal_mcp/applications/google_sheet/app.py +44 -51
  16. universal_mcp/applications/markitdown/app.py +4 -4
  17. universal_mcp/applications/notion/app.py +93 -83
  18. universal_mcp/applications/perplexity/app.py +5 -5
  19. universal_mcp/applications/reddit/app.py +32 -32
  20. universal_mcp/applications/resend/app.py +4 -4
  21. universal_mcp/applications/serpapi/app.py +4 -4
  22. universal_mcp/applications/tavily/app.py +4 -4
  23. universal_mcp/applications/wrike/app.py +566 -226
  24. universal_mcp/applications/youtube/app.py +626 -166
  25. universal_mcp/applications/zenquotes/app.py +3 -3
  26. universal_mcp/exceptions.py +1 -0
  27. universal_mcp/integrations/__init__.py +11 -2
  28. universal_mcp/integrations/integration.py +2 -2
  29. universal_mcp/logger.py +3 -56
  30. universal_mcp/servers/__init__.py +2 -1
  31. universal_mcp/servers/server.py +76 -77
  32. universal_mcp/stores/store.py +5 -3
  33. universal_mcp/tools/__init__.py +1 -1
  34. universal_mcp/tools/adapters.py +4 -1
  35. universal_mcp/tools/func_metadata.py +5 -6
  36. universal_mcp/tools/tools.py +108 -51
  37. universal_mcp/utils/docgen.py +121 -69
  38. universal_mcp/utils/docstring_parser.py +44 -21
  39. universal_mcp/utils/dump_app_tools.py +33 -23
  40. universal_mcp/utils/openapi.py +121 -47
  41. {universal_mcp-0.1.8rc2.dist-info → universal_mcp-0.1.8rc3.dist-info}/METADATA +2 -2
  42. universal_mcp-0.1.8rc3.dist-info/RECORD +75 -0
  43. universal_mcp-0.1.8rc2.dist-info/RECORD +0 -71
  44. {universal_mcp-0.1.8rc2.dist-info → universal_mcp-0.1.8rc3.dist-info}/WHEEL +0 -0
  45. {universal_mcp-0.1.8rc2.dist-info → universal_mcp-0.1.8rc3.dist-info}/entry_points.txt +0 -0
@@ -47,19 +47,19 @@ class RedditApp(APIApplication):
47
47
  ) -> str:
48
48
  """
49
49
  Retrieves and formats top posts from a specified subreddit within a given timeframe using the Reddit API
50
-
50
+
51
51
  Args:
52
52
  subreddit: The name of the subreddit (e.g., 'python', 'worldnews') without the 'r/' prefix
53
53
  limit: The maximum number of posts to return (default: 5, max: 100)
54
54
  timeframe: The time period for top posts. Valid options: 'hour', 'day', 'week', 'month', 'year', 'all' (default: 'day')
55
-
55
+
56
56
  Returns:
57
57
  A formatted string containing a numbered list of top posts, including titles, authors, scores, and URLs, or an error message if the request fails
58
-
58
+
59
59
  Raises:
60
60
  RequestException: When the HTTP request to the Reddit API fails
61
61
  JSONDecodeError: When the API response contains invalid JSON
62
-
62
+
63
63
  Tags:
64
64
  fetch, reddit, api, list, social-media, important, read-only
65
65
  """
@@ -107,19 +107,19 @@ class RedditApp(APIApplication):
107
107
  ) -> str:
108
108
  """
109
109
  Searches Reddit for subreddits matching a given query string and returns a formatted list of results including subreddit names, subscriber counts, and descriptions.
110
-
110
+
111
111
  Args:
112
112
  query: The text to search for in subreddit names and descriptions
113
113
  limit: The maximum number of subreddits to return, between 1 and 100 (default: 5)
114
114
  sort: The order of results, either 'relevance' or 'activity' (default: 'relevance')
115
-
115
+
116
116
  Returns:
117
117
  A formatted string containing a list of matching subreddits with their names, subscriber counts, and descriptions, or an error message if the search fails or parameters are invalid
118
-
118
+
119
119
  Raises:
120
120
  RequestException: When the HTTP request to Reddit's API fails
121
121
  JSONDecodeError: When the API response contains invalid JSON
122
-
122
+
123
123
  Tags:
124
124
  search, important, reddit, api, query, format, list, validation
125
125
  """
@@ -177,17 +177,17 @@ class RedditApp(APIApplication):
177
177
  def get_post_flairs(self, subreddit: str):
178
178
  """
179
179
  Retrieves a list of available post flairs for a specified subreddit using the Reddit API.
180
-
180
+
181
181
  Args:
182
182
  subreddit: The name of the subreddit (e.g., 'python', 'worldnews') without the 'r/' prefix
183
-
183
+
184
184
  Returns:
185
185
  A list of dictionaries containing flair details if flairs exist, or a string message indicating no flairs are available
186
-
186
+
187
187
  Raises:
188
188
  RequestException: When the API request fails or network connectivity issues occur
189
189
  JSONDecodeError: When the API response contains invalid JSON data
190
-
190
+
191
191
  Tags:
192
192
  fetch, get, reddit, flair, api, read-only
193
193
  """
@@ -210,7 +210,7 @@ class RedditApp(APIApplication):
210
210
  ):
211
211
  """
212
212
  Creates a new Reddit post in a specified subreddit with support for text posts, link posts, and image posts
213
-
213
+
214
214
  Args:
215
215
  subreddit: The name of the subreddit (e.g., 'python', 'worldnews') without the 'r/'
216
216
  title: The title of the post
@@ -218,13 +218,13 @@ class RedditApp(APIApplication):
218
218
  text: The text content of the post; required if kind is 'self'
219
219
  url: The URL of the link or image; required if kind is 'link'. Must end with valid image extension for image posts
220
220
  flair_id: The ID of the flair to assign to the post
221
-
221
+
222
222
  Returns:
223
223
  The JSON response from the Reddit API, or an error message as a string if the API returns an error
224
-
224
+
225
225
  Raises:
226
226
  ValueError: Raised when kind is invalid or when required parameters (text for self posts, url for link posts) are missing
227
-
227
+
228
228
  Tags:
229
229
  create, post, social-media, reddit, api, important
230
230
  """
@@ -263,17 +263,17 @@ class RedditApp(APIApplication):
263
263
  def get_comment_by_id(self, comment_id: str) -> dict:
264
264
  """
265
265
  Retrieves a specific Reddit comment using its unique identifier.
266
-
266
+
267
267
  Args:
268
268
  comment_id: The full unique identifier of the comment (prefixed with 't1_', e.g., 't1_abcdef')
269
-
269
+
270
270
  Returns:
271
271
  A dictionary containing the comment data including attributes like author, body, score, etc. If the comment is not found, returns a dictionary with an error message.
272
-
272
+
273
273
  Raises:
274
274
  HTTPError: When the Reddit API request fails due to network issues or invalid authentication
275
275
  JSONDecodeError: When the API response cannot be parsed as valid JSON
276
-
276
+
277
277
  Tags:
278
278
  retrieve, get, reddit, comment, api, fetch, single-item, important
279
279
  """
@@ -289,18 +289,18 @@ class RedditApp(APIApplication):
289
289
  def post_comment(self, parent_id: str, text: str) -> dict:
290
290
  """
291
291
  Posts a comment to a Reddit post or comment using the Reddit API
292
-
292
+
293
293
  Args:
294
294
  parent_id: The full ID of the parent comment or post (e.g., 't3_abc123' for a post, 't1_def456' for a comment)
295
295
  text: The text content of the comment to be posted
296
-
296
+
297
297
  Returns:
298
298
  A dictionary containing the Reddit API response with details about the posted comment
299
-
299
+
300
300
  Raises:
301
301
  RequestException: If the API request fails or returns an error status code
302
302
  JSONDecodeError: If the API response cannot be parsed as JSON
303
-
303
+
304
304
  Tags:
305
305
  post, comment, social, reddit, api, important
306
306
  """
@@ -316,18 +316,18 @@ class RedditApp(APIApplication):
316
316
  def edit_content(self, content_id: str, text: str) -> dict:
317
317
  """
318
318
  Edits the text content of an existing Reddit post or comment using the Reddit API
319
-
319
+
320
320
  Args:
321
321
  content_id: The full ID of the content to edit (e.g., 't3_abc123' for a post, 't1_def456' for a comment)
322
322
  text: The new text content to replace the existing content
323
-
323
+
324
324
  Returns:
325
325
  A dictionary containing the API response with details about the edited content
326
-
326
+
327
327
  Raises:
328
328
  RequestException: When the API request fails or network connectivity issues occur
329
329
  ValueError: When invalid content_id format or empty text is provided
330
-
330
+
331
331
  Tags:
332
332
  edit, update, content, reddit, api, important
333
333
  """
@@ -343,17 +343,17 @@ class RedditApp(APIApplication):
343
343
  def delete_content(self, content_id: str) -> dict:
344
344
  """
345
345
  Deletes a specified Reddit post or comment using the Reddit API.
346
-
346
+
347
347
  Args:
348
348
  content_id: The full ID of the content to delete (e.g., 't3_abc123' for a post, 't1_def456' for a comment)
349
-
349
+
350
350
  Returns:
351
351
  A dictionary containing a success message with the deleted content ID
352
-
352
+
353
353
  Raises:
354
354
  HTTPError: When the API request fails or returns an error status code
355
355
  RequestException: When there are network connectivity issues or API communication problems
356
-
356
+
357
357
  Tags:
358
358
  delete, content-management, api, reddit, important
359
359
  """
@@ -27,18 +27,18 @@ class ResendApp(APIApplication):
27
27
  def send_email(self, to: str, subject: str, content: str) -> str:
28
28
  """
29
29
  Sends an email using the Resend API with specified recipient, subject, and content
30
-
30
+
31
31
  Args:
32
32
  to: Email address of the recipient
33
33
  subject: Subject line of the email
34
34
  content: Main body text content of the email
35
-
35
+
36
36
  Returns:
37
37
  String message confirming successful email delivery ('Sent Successfully')
38
-
38
+
39
39
  Raises:
40
40
  ValueError: Raised when no valid credentials are found for the API
41
-
41
+
42
42
  Tags:
43
43
  send, email, api, communication, important
44
44
  """
@@ -37,17 +37,17 @@ class SerpapiApp(APIApplication):
37
37
  async def search(self, params: dict[str, any] = None) -> str:
38
38
  """
39
39
  Performs an asynchronous search using the SerpApi service and returns formatted search results.
40
-
40
+
41
41
  Args:
42
42
  params: Dictionary of engine-specific parameters (e.g., {'q': 'Coffee', 'engine': 'google_light', 'location': 'Austin, TX'}). Defaults to None.
43
-
43
+
44
44
  Returns:
45
45
  A formatted string containing search results with titles, links, and snippets, or an error message if the search fails.
46
-
46
+
47
47
  Raises:
48
48
  httpx.HTTPStatusError: Raised when the API request fails due to HTTP errors (401 for invalid API key, 429 for rate limiting)
49
49
  Exception: Raised for general errors such as network issues or invalid parameters
50
-
50
+
51
51
  Tags:
52
52
  search, async, web-scraping, api, serpapi, important
53
53
  """
@@ -30,17 +30,17 @@ class TavilyApp(APIApplication):
30
30
  def search(self, query: str) -> str:
31
31
  """
32
32
  Performs a web search using Tavily's search API and returns either a direct answer or a summary of top results.
33
-
33
+
34
34
  Args:
35
35
  query: The search query string to be processed by Tavily's search engine
36
-
36
+
37
37
  Returns:
38
38
  A string containing either a direct answer from Tavily's AI or a formatted summary of the top 3 search results, with each result containing the title and snippet
39
-
39
+
40
40
  Raises:
41
41
  ValueError: When authentication credentials are invalid or missing (via validate() method)
42
42
  HTTPError: When the API request fails or returns an error response
43
-
43
+
44
44
  Tags:
45
45
  search, ai, web, query, important, api-client, text-processing
46
46
  """