universal-mcp-applications 0.1.22__py3-none-any.whl → 0.1.33__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 (24) hide show
  1. universal_mcp/applications/browser_use/app.py +14 -19
  2. universal_mcp/applications/google_docs/app.py +363 -289
  3. universal_mcp/applications/google_gemini/app.py +3 -3
  4. universal_mcp/applications/google_sheet/app.py +6 -2
  5. universal_mcp/applications/linkedin/README.md +18 -4
  6. universal_mcp/applications/linkedin/app.py +754 -153
  7. universal_mcp/applications/onedrive/README.md +24 -0
  8. universal_mcp/applications/onedrive/__init__.py +1 -0
  9. universal_mcp/applications/onedrive/app.py +338 -0
  10. universal_mcp/applications/outlook/app.py +281 -199
  11. universal_mcp/applications/reddit/app.py +30 -47
  12. universal_mcp/applications/scraper/README.md +7 -4
  13. universal_mcp/applications/scraper/app.py +310 -290
  14. universal_mcp/applications/sharepoint/README.md +16 -14
  15. universal_mcp/applications/sharepoint/app.py +267 -154
  16. universal_mcp/applications/slack/app.py +31 -0
  17. universal_mcp/applications/zenquotes/app.py +2 -2
  18. {universal_mcp_applications-0.1.22.dist-info → universal_mcp_applications-0.1.33.dist-info}/METADATA +2 -2
  19. {universal_mcp_applications-0.1.22.dist-info → universal_mcp_applications-0.1.33.dist-info}/RECORD +21 -21
  20. universal_mcp/applications/unipile/README.md +0 -28
  21. universal_mcp/applications/unipile/__init__.py +0 -1
  22. universal_mcp/applications/unipile/app.py +0 -1077
  23. {universal_mcp_applications-0.1.22.dist-info → universal_mcp_applications-0.1.33.dist-info}/WHEEL +0 -0
  24. {universal_mcp_applications-0.1.22.dist-info → universal_mcp_applications-0.1.33.dist-info}/licenses/LICENSE +0 -0
@@ -44,9 +44,7 @@ class RedditApp(APIApplication):
44
44
  "User-Agent": "agentr-reddit-app/0.1 by AgentR",
45
45
  }
46
46
 
47
- def get_subreddit_posts(
48
- self, subreddit: str, limit: int = 5, timeframe: str = "day"
49
- ) -> dict[str, Any]:
47
+ def get_subreddit_posts(self, subreddit: str, limit: int = 5, timeframe: str = "day") -> dict[str, Any]:
50
48
  """
51
49
  Fetches a specified number of top-rated posts from a particular subreddit, allowing results to be filtered by a specific timeframe (e.g., 'day', 'week'). This is a simplified version compared to `get_subreddit_top_posts`, which uses more complex pagination parameters instead of a direct time filter.
52
50
 
@@ -56,7 +54,7 @@ class RedditApp(APIApplication):
56
54
  timeframe: The time period for top posts. Valid options: 'hour', 'day', 'week', 'month', 'year', 'all' (default: 'day')
57
55
 
58
56
  Returns:
59
- A formatted string containing a numbered list of top posts, including titles, authors, scores, and URLs, or an error message if the request fails
57
+ A dictionary containing a list of top posts with their details, or an error message if the request fails.
60
58
 
61
59
  Raises:
62
60
  RequestException: When the HTTP request to the Reddit API fails
@@ -69,34 +67,29 @@ class RedditApp(APIApplication):
69
67
  if timeframe not in valid_timeframes:
70
68
  return f"Error: Invalid timeframe '{timeframe}'. Please use one of: {', '.join(valid_timeframes)}"
71
69
  if not 1 <= limit <= 100:
72
- return (
73
- f"Error: Invalid limit '{limit}'. Please use a value between 1 and 100."
74
- )
70
+ return f"Error: Invalid limit '{limit}'. Please use a value between 1 and 100."
75
71
  url = f"{self.base_api_url}/r/{subreddit}/top"
76
72
  params = {"limit": limit, "t": timeframe}
77
- logger.info(
78
- f"Requesting top {limit} posts from r/{subreddit} for timeframe '{timeframe}'"
79
- )
73
+ logger.info(f"Requesting top {limit} posts from r/{subreddit} for timeframe '{timeframe}'")
80
74
  response = self._get(url, params=params)
81
75
  return self._handle_response(response)
82
76
 
83
- def search_subreddits(
84
- self, query: str, limit: int = 5, sort: str = "relevance"
85
- ) -> str:
77
+ def search_subreddits(self, query: str, limit: int = 5, sort: str = "relevance") -> dict[str, Any]:
86
78
  """
87
- Searches for subreddits by name and description using a query string, with results sortable by relevance or activity. Unlike the broader `search_reddit` function, this method exclusively discovers subreddits, not posts, comments, or users.
79
+ Finds subreddits based on a query string, searching their names and descriptions.
80
+ Results can be sorted by relevance or activity. This function is for discovering communities and does not search for posts or users, unlike the more general `search_reddit` function.
88
81
 
89
82
  Args:
90
- query: The text to search for in subreddit names and descriptions
91
- limit: The maximum number of subreddits to return, between 1 and 100 (default: 5)
92
- sort: The order of results, either 'relevance' or 'activity' (default: 'relevance')
83
+ query: The search query for subreddit names and descriptions.
84
+ limit: The maximum number of subreddits to return (1-100, default is 5).
85
+ sort: The sorting order for results. Can be 'relevance' or 'activity' (default is 'relevance').
93
86
 
94
87
  Returns:
95
- 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
88
+ A dictionary containing a list of matching subreddits, including their names, subscriber counts, and descriptions. Returns an error message on failure.
96
89
 
97
90
  Raises:
98
- RequestException: When the HTTP request to Reddit's API fails
99
- JSONDecodeError: When the API response contains invalid JSON
91
+ RequestException: If the API request to Reddit fails.
92
+ JSONDecodeError: If the API response is not valid JSON.
100
93
 
101
94
  Tags:
102
95
  search, important, reddit, api, query, format, list, validation
@@ -105,18 +98,14 @@ class RedditApp(APIApplication):
105
98
  if sort not in valid_sorts:
106
99
  return f"Error: Invalid sort option '{sort}'. Please use one of: {', '.join(valid_sorts)}"
107
100
  if not 1 <= limit <= 100:
108
- return (
109
- f"Error: Invalid limit '{limit}'. Please use a value between 1 and 100."
110
- )
101
+ return f"Error: Invalid limit '{limit}'. Please use a value between 1 and 100."
111
102
  url = f"{self.base_api_url}/subreddits/search"
112
103
  params = {
113
104
  "q": query,
114
105
  "limit": limit,
115
106
  "sort": sort,
116
107
  }
117
- logger.info(
118
- f"Searching for subreddits matching '{query}' (limit: {limit}, sort: {sort})"
119
- )
108
+ logger.info(f"Searching for subreddits matching '{query}' (limit: {limit}, sort: {sort})")
120
109
  response = self._get(url, params=params)
121
110
  return self._handle_response(response)
122
111
 
@@ -193,16 +182,10 @@ class RedditApp(APIApplication):
193
182
  logger.info(f"Submitting a new post to r/{subreddit}")
194
183
  response = self._post(url_api, data=data)
195
184
  response_json = response.json()
196
- if (
197
- response_json
198
- and "json" in response_json
199
- and "errors" in response_json["json"]
200
- ):
185
+ if response_json and "json" in response_json and "errors" in response_json["json"]:
201
186
  errors = response_json["json"]["errors"]
202
187
  if errors:
203
- error_message = ", ".join(
204
- [f"{code}: {message}" for code, message in errors]
205
- )
188
+ error_message = ", ".join([f"{code}: {message}" for code, message in errors])
206
189
  return f"Reddit API error: {error_message}"
207
190
  return response_json
208
191
 
@@ -317,7 +300,7 @@ class RedditApp(APIApplication):
317
300
  Retrieves the full profile information for the currently authenticated user by making a GET request to the `/api/v1/me` Reddit API endpoint. This differs from `get_user_profile`, which requires a username, and `get_current_user_karma`, which specifically fetches karma data.
318
301
 
319
302
  Returns:
320
- Any: API response data.
303
+ A dictionary containing the authenticated user's profile information.
321
304
 
322
305
  Tags:
323
306
  users
@@ -333,7 +316,7 @@ class RedditApp(APIApplication):
333
316
  Fetches the karma breakdown for the authenticated user from the Reddit API. This function specifically targets the `/api/v1/me/karma` endpoint, returning karma statistics per subreddit, which is more specific than `get_current_user_info` that retrieves general profile information.
334
317
 
335
318
  Returns:
336
- Any: API response data.
319
+ A dictionary containing the authenticated user's karma breakdown by subreddit.
337
320
 
338
321
  Tags:
339
322
  account
@@ -349,10 +332,10 @@ class RedditApp(APIApplication):
349
332
  Fetches a specific Reddit post's details and its complete comment tree using the post's unique ID. This function returns the entire discussion, including the original post and all associated comments, providing broader context than `get_comment_by_id` which only retrieves a single comment.
350
333
 
351
334
  Args:
352
- post_id (string): The Reddit post ID ( e.g. '1m734tx' for https://www.reddit.com/r/mcp/comments/1m734tx/comment/n4occ77/)
335
+ post_id (str): The Reddit post ID ( e.g. '1m734tx' for https://www.reddit.com/r/mcp/comments/1m734tx/comment/n4occ77/)
353
336
 
354
337
  Returns:
355
- Any: API response data containing post details and comments.
338
+ A dictionary containing the post details and its comment tree.
356
339
 
357
340
  Tags:
358
341
  listings, comments, posts, important
@@ -384,7 +367,7 @@ class RedditApp(APIApplication):
384
367
  sr_detail: Optional. Expand subreddit details.
385
368
 
386
369
  Returns:
387
- Any: API response data containing a list of controversial posts.
370
+ A dictionary containing a listing of controversial posts.
388
371
 
389
372
  Tags:
390
373
  listings, posts, controversial, read-only
@@ -429,7 +412,7 @@ class RedditApp(APIApplication):
429
412
  sr_detail: Optional. Expand subreddit details.
430
413
 
431
414
  Returns:
432
- Any: API response data containing a list of hot posts.
415
+ A dictionary containing a listing of hot posts.
433
416
 
434
417
  Tags:
435
418
  listings, posts, hot, read-only
@@ -473,7 +456,7 @@ class RedditApp(APIApplication):
473
456
  sr_detail: Optional. Expand subreddit details.
474
457
 
475
458
  Returns:
476
- Any: API response data containing a list of new posts.
459
+ A dictionary containing a listing of new posts.
477
460
 
478
461
  Tags:
479
462
  listings, posts, new, read-only
@@ -520,7 +503,7 @@ class RedditApp(APIApplication):
520
503
  sr_detail: Optional. Expand subreddit details.
521
504
 
522
505
  Returns:
523
- Any: API response data containing a list of hot posts from the subreddit.
506
+ A dictionary containing a listing of hot posts from the specified subreddit.
524
507
 
525
508
  Tags:
526
509
  listings, posts, subreddit, hot, read-only
@@ -568,7 +551,7 @@ class RedditApp(APIApplication):
568
551
  sr_detail: Optional. Expand subreddit details.
569
552
 
570
553
  Returns:
571
- Any: API response data containing a list of new posts from the subreddit.
554
+ A dictionary containing a listing of new posts from the specified subreddit.
572
555
 
573
556
  Tags:
574
557
  listings, posts, subreddit, new, read-only
@@ -615,7 +598,7 @@ class RedditApp(APIApplication):
615
598
  sr_detail: Optional. Expand subreddit details.
616
599
 
617
600
  Returns:
618
- Any: API response data containing a list of top posts from the subreddit.
601
+ A dictionary containing a listing of top posts from the specified subreddit.
619
602
 
620
603
  Tags:
621
604
  listings, posts, subreddit, top, read-only
@@ -660,7 +643,7 @@ class RedditApp(APIApplication):
660
643
  sr_detail: Optional. Expand subreddit details.
661
644
 
662
645
  Returns:
663
- Any: API response data containing a list of rising posts.
646
+ A dictionary containing a listing of rising posts.
664
647
 
665
648
  Tags:
666
649
  listings, posts, rising, read-only
@@ -703,7 +686,7 @@ class RedditApp(APIApplication):
703
686
  sr_detail: Optional. Expand subreddit details.
704
687
 
705
688
  Returns:
706
- Any: API response data containing a list of top posts.
689
+ A dictionary containing a listing of top posts.
707
690
 
708
691
  Tags:
709
692
  listings, posts, top, read-only
@@ -760,7 +743,7 @@ class RedditApp(APIApplication):
760
743
  type: Optional. A comma-separated list of result types ('sr', 'link', 'user').
761
744
 
762
745
  Returns:
763
- Any: API response data containing search results.
746
+ A dictionary containing the search results.
764
747
 
765
748
  Tags:
766
749
  search, reddit, posts, comments, users, read-only
@@ -9,7 +9,10 @@ This is automatically generated from OpenAPI schema for the ScraperApp API.
9
9
 
10
10
  | Tool | Description |
11
11
  |------|-------------|
12
- | `linkedin_post_search` | Performs a general LinkedIn search for posts using keywords and filters like date and content type. It supports pagination and can utilize either the 'classic' or 'sales_navigator' API, searching broadly across the platform rather than fetching posts from a specific user's profile. |
13
- | `linkedin_list_profile_posts` | Fetches a paginated list of all LinkedIn posts from a specific user or company profile using their unique identifier. This function retrieves content directly from a profile, unlike `linkedin_post_search` which finds posts across LinkedIn based on keywords and other filters. |
14
- | `linkedin_retrieve_profile` | Retrieves a specific LinkedIn user's profile by their unique identifier, which can be an internal provider ID or a public username. This function simplifies data access by delegating the actual profile retrieval request to the integrated Unipile application, distinct from functions that list posts or comments. |
15
- | `linkedin_list_post_comments` | Fetches comments for a specified LinkedIn post. If a `comment_id` is provided, it retrieves replies to that comment instead of top-level comments. This function supports pagination and specifically targets comments, unlike others in the class that search for or list entire posts. |
12
+ | `linkedin_list_profile_posts` | Fetches a paginated list of posts from a specific user or company profile using its provider ID. The `is_company` flag must specify the entity type. Unlike `linkedin_search_posts`, this function directly retrieves content from a known profile's feed instead of performing a global keyword search. |
13
+ | `linkedin_retrieve_profile` | Fetches a specific LinkedIn user's profile using their public or internal ID. Unlike `linkedin_search_people`, which discovers multiple users via keywords, this function targets and retrieves detailed data for a single, known individual based on a direct identifier. |
14
+ | `linkedin_list_post_comments` | Fetches a paginated list of comments for a specified LinkedIn post. It can retrieve either top-level comments or threaded replies if an optional `comment_id` is provided. This is a read-only operation, distinct from functions that search for posts or list user-specific content. |
15
+ | `linkedin_search_people` | Performs a paginated search for people on LinkedIn, distinct from searches for companies or jobs. It filters results using keywords, location, industry, and company, internally converting filter names like 'United States' into their required API IDs before making the request. |
16
+ | `linkedin_search_companies` | Executes a paginated LinkedIn search for companies, filtering by optional keywords, location, and industry. Unlike `linkedin_search_people` or `linkedin_search_jobs`, this function specifically sets the API search category to 'companies' to ensure that only company profiles are returned in the search results. |
17
+ | `linkedin_search_posts` | Performs a keyword-based search for LinkedIn posts, allowing results to be filtered by date and sorted by relevance. This function specifically queries the 'posts' category, distinguishing it from other search methods in the class that target people, companies, or jobs, and returns relevant content. |
18
+ | `linkedin_search_jobs` | Executes a LinkedIn search specifically for job listings using keywords and filters like region, industry, and minimum salary. Unlike other search functions targeting people or companies, this is specialized for job listings and converts friendly filter names (e.g., "United States") into their required API IDs. |