universal-mcp-applications 0.1.17__py3-none-any.whl → 0.1.18__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.

@@ -1,13 +1,16 @@
1
1
  import os
2
2
  from dotenv import load_dotenv
3
+
3
4
  load_dotenv()
4
5
 
5
6
  from typing import Any
6
7
 
7
8
  from universal_mcp.applications.application import APIApplication
8
- from universal_mcp.agentr.integration import AgentrIntegration
9
9
  from universal_mcp.applications.unipile import UnipileApp
10
10
  from typing import Any, Optional
11
+ from universal_mcp.integrations import Integration
12
+ from loguru import logger
13
+
11
14
 
12
15
  class ScraperApp(APIApplication):
13
16
  """
@@ -15,7 +18,7 @@ class ScraperApp(APIApplication):
15
18
  Provides a simplified interface for LinkedIn search operations.
16
19
  """
17
20
 
18
- def __init__(self, **kwargs: Any) -> None:
21
+ def __init__(self, integration: Integration, **kwargs: Any) -> None:
19
22
  """
20
23
  Initialize the ScraperApp.
21
24
 
@@ -24,17 +27,16 @@ class ScraperApp(APIApplication):
24
27
  It is expected that the integration provides the necessary credentials
25
28
  for LinkedIn API access.
26
29
  """
27
- super().__init__(name="scraper", **kwargs)
30
+ super().__init__(name="scraper", integration=integration, **kwargs)
28
31
  if self.integration:
29
32
  credentials = self.integration.get_credentials()
30
- api_key = credentials.get("SCRAPER_API")
31
- self.account_id = credentials.get("ACCOUNT_ID")
32
- self.integration = AgentrIntegration(name="unipile", api_key=api_key, base_url="https://staging-agentr-306776579029.asia-southeast1.run.app/")
33
+ self.account_id = credentials.get("account_id")
33
34
  self._unipile_app = UnipileApp(integration=self.integration)
34
35
  else:
36
+ logger.warning(f"Integration not found")
35
37
  self.account_id = None
36
38
  self._unipile_app = None
37
-
39
+
38
40
  def linkedin_post_search(
39
41
  self,
40
42
  category: str = "posts",
@@ -48,7 +50,7 @@ class ScraperApp(APIApplication):
48
50
  ) -> dict[str, Any]:
49
51
  """
50
52
  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.
51
-
53
+
52
54
  Args:
53
55
  category: Type of search to perform (defaults to "posts").
54
56
  api: Which LinkedIn API to use - "classic" or "sales_navigator".
@@ -58,17 +60,17 @@ class ScraperApp(APIApplication):
58
60
  sort_by: How to sort the results, e.g., "relevance" or "date".
59
61
  date_posted: Filter posts by when they were posted.
60
62
  content_type: Filter by the type of content in the post. Example: "videos", "images", "live_videos", "collaborative_articles", "documents"
61
-
63
+
62
64
  Returns:
63
65
  A dictionary containing search results and pagination details.
64
-
66
+
65
67
  Raises:
66
68
  httpx.HTTPError: If the API request fails.
67
-
69
+
68
70
  Tags:
69
71
  linkedin, search, posts, api, scrapper, important
70
72
  """
71
-
73
+
72
74
  return self._unipile_app.search(
73
75
  account_id=self.account_id,
74
76
  category=category,
@@ -89,22 +91,22 @@ class ScraperApp(APIApplication):
89
91
  ) -> dict[str, Any]:
90
92
  """
91
93
  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.
92
-
94
+
93
95
  Args:
94
96
  identifier: The entity's provider internal ID (LinkedIn ID).starts with ACo for users, while for companies it's a series of numbers.
95
97
  cursor: Pagination cursor for the next page of entries.
96
98
  limit: Number of items to return (1-100, though spec allows up to 250).
97
-
99
+
98
100
  Returns:
99
101
  A dictionary containing a list of post objects and pagination details.
100
-
102
+
101
103
  Raises:
102
104
  httpx.HTTPError: If the API request fails.
103
-
105
+
104
106
  Tags:
105
107
  linkedin, post, list, user_posts, company_posts, content, api, important
106
108
  """
107
-
109
+
108
110
  return self._unipile_app.list_profile_posts(
109
111
  identifier=identifier,
110
112
  account_id=self.account_id,
@@ -118,27 +120,26 @@ class ScraperApp(APIApplication):
118
120
  ) -> dict[str, Any]:
119
121
  """
120
122
  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.
121
-
123
+
122
124
  Args:
123
125
  identifier: Can be the provider's internal id OR the provider's public id of the requested user.
124
126
  For example, for https://www.linkedin.com/in/manojbajaj95/, the identifier is "manojbajaj95".
125
-
127
+
126
128
  Returns:
127
129
  A dictionary containing the user's profile details.
128
-
130
+
129
131
  Raises:
130
132
  httpx.HTTPError: If the API request fails.
131
-
133
+
132
134
  Tags:
133
135
  linkedin, user, profile, retrieve, get, api, important
134
136
  """
135
-
137
+
136
138
  return self._unipile_app.retrieve_user_profile(
137
139
  identifier=identifier,
138
140
  account_id=self.account_id,
139
141
  )
140
142
 
141
-
142
143
  def linkedin_list_post_comments(
143
144
  self,
144
145
  post_id: str,
@@ -148,23 +149,23 @@ class ScraperApp(APIApplication):
148
149
  ) -> dict[str, Any]:
149
150
  """
150
151
  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.
151
-
152
+
152
153
  Args:
153
154
  post_id: The social ID of the post. Example rn:li:activity:7342082869034393600
154
155
  comment_id: If provided, retrieves replies to this comment ID instead of top-level comments.
155
156
  cursor: Pagination cursor.
156
157
  limit: Number of comments to return.
157
-
158
+
158
159
  Returns:
159
160
  A dictionary containing a list of comment objects and pagination details.
160
-
161
+
161
162
  Raises:
162
163
  httpx.HTTPError: If the API request fails.
163
-
164
+
164
165
  Tags:
165
166
  linkedin, post, comment, list, content, api, important
166
167
  """
167
-
168
+
168
169
  return self._unipile_app.list_post_comments(
169
170
  post_id=post_id,
170
171
  account_id=self.account_id,
@@ -173,11 +174,10 @@ class ScraperApp(APIApplication):
173
174
  limit=limit,
174
175
  )
175
176
 
176
-
177
177
  def list_tools(self):
178
178
  """
179
179
  Returns a list of available tools/functions in this application.
180
-
180
+
181
181
  Returns:
182
182
  A list of functions that can be used as tools.
183
183
  """
@@ -186,4 +186,4 @@ class ScraperApp(APIApplication):
186
186
  self.linkedin_list_profile_posts,
187
187
  self.linkedin_retrieve_profile,
188
188
  self.linkedin_list_post_comments,
189
- ]
189
+ ]
@@ -36,7 +36,7 @@ class SharepointApp(BaseApplication):
36
36
  @property
37
37
  def client(self):
38
38
  """
39
- A lazy-loaded property that gets or creates an authenticated GraphClient instance. On its first call, it uses integration credentials to initialize the client, fetches the user's profile and root site ID, and caches the instance for subsequent use. This ensures efficient connection management.
39
+ A lazy-loaded property that gets or creates an authenticated GraphClient instance. On first access, it uses integration credentials to initialize the client, fetches initial user and site data, and caches the instance for subsequent use, ensuring efficient connection management for all SharePoint operations.
40
40
 
41
41
  Returns:
42
42
  GraphClient: The authenticated GraphClient instance.
@@ -74,7 +74,7 @@ class SharepointApp(BaseApplication):
74
74
 
75
75
  def list_folders(self, folder_path: str | None = None) -> list[dict[str, Any]]:
76
76
  """
77
- Retrieves the names of all immediate subfolders within a specified directory. If a path is not provided, it defaults to listing folders in the root of the user's drive. This function is distinct from `list_documents`, which lists files.
77
+ Retrieves a list of immediate subfolder names within a specified SharePoint directory. If no path is provided, it defaults to the root drive. This function is distinct from `list_files`, as it exclusively lists directories, not files.
78
78
 
79
79
  Args:
80
80
  folder_path (Optional[str], optional): The path to the parent folder. If None, lists folders in the root.
@@ -97,7 +97,7 @@ class SharepointApp(BaseApplication):
97
97
  self, folder_name: str, folder_path: str | None = None
98
98
  ) -> dict[str, Any]:
99
99
  """
100
- Creates a new folder with a given name inside a specified parent directory on SharePoint. If no path is provided, the folder is created in the root. It then returns an updated list of all folder names within that parent directory.
100
+ Creates a new folder with a given name inside a specified parent directory (or the root). It then returns an updated list of all folder names within that same directory, effectively confirming that the creation operation was successful.
101
101
 
102
102
  Args:
103
103
  folder_name (str): The name of the folder to create.
@@ -118,7 +118,7 @@ class SharepointApp(BaseApplication):
118
118
 
119
119
  def list_files(self, folder_path: str) -> list[dict[str, Any]]:
120
120
  """
121
- Retrieves files from a specified folder path. For each file, it returns a dictionary containing key metadata like its name, URL, size, creation date, and last modified date. This function specifically lists files, distinct from `list_folders` which only lists directories.
121
+ Retrieves metadata for all files in a specified folder. For each file, it returns key details like name, URL, size, and timestamps. This function exclusively lists file properties, distinguishing it from `list_folders` (which lists directories) and `get_document_content` (which retrieves file content).
122
122
 
123
123
  Args:
124
124
  folder_path (str): The path to the folder whose documents are to be listed.
@@ -147,7 +147,7 @@ class SharepointApp(BaseApplication):
147
147
  self, file_path: str, file_name: str, content: str
148
148
  ) -> dict[str, Any]:
149
149
  """
150
- Uploads string content to a new file within a specified SharePoint folder path. After creation, it returns an updated list of all documents and their metadata residing in that folder, effectively confirming the file was added successfully.
150
+ Uploads string content to create a new file in a specified SharePoint folder. To confirm the operation, it returns an updated list of all files and their metadata from that directory, including the newly created file.
151
151
 
152
152
  Args:
153
153
  file_path (str): The path to the folder where the document will be created.
@@ -167,7 +167,7 @@ class SharepointApp(BaseApplication):
167
167
 
168
168
  def get_document_content(self, file_path: str) -> dict[str, Any]:
169
169
  """
170
- Retrieves a document's content from SharePoint. It returns a dictionary with the content, name, and size. Content is decoded as a string for text files or Base64-encoded for binary files. This is distinct from `list_documents` which only returns metadata without content.
170
+ Retrieves a file's content from a specified SharePoint path. It returns a dictionary containing the file's name and size, decoding text files as a string and Base64-encoding binary files. Unlike `list_files`, which only fetches metadata, this function provides the actual file content.
171
171
 
172
172
  Args:
173
173
  file_path (str): The path to the document.
@@ -200,7 +200,7 @@ class SharepointApp(BaseApplication):
200
200
 
201
201
  def delete_document(self, file_path: str):
202
202
  """
203
- Permanently deletes a specified file from SharePoint/OneDrive. The function takes the file path as an argument and returns True upon successful deletion. An exception is raised if the file is not found or the deletion fails.
203
+ Permanently deletes a specified file from a SharePoint drive using its full path. This is the sole destructive file operation, contrasting with functions that read or create files. It returns `True` on successful deletion and raises an exception on failure, such as if the file is not found.
204
204
 
205
205
  Args:
206
206
  file_path (str): The path to the file to delete.
@@ -31,7 +31,7 @@ class UnipileApp(APIApplication):
31
31
  @property
32
32
  def base_url(self) -> str:
33
33
  """
34
- A property that lazily constructs and caches the Unipile API base URL using 'subdomain' and 'port' from integration credentials. The URL is built on first access and used by all API methods, raising a ValueError if the required credentials are missing.
34
+ A property that lazily constructs and caches the Unipile API base URL from 'subdomain' and 'port' credentials. Built on first access and used by all API methods, it raises a ValueError if credentials are missing. This is the default construction, unlike the setter which allows manual override.
35
35
  """
36
36
  if not self._base_url:
37
37
  credentials = self.integration.get_credentials()
@@ -50,7 +50,7 @@ class UnipileApp(APIApplication):
50
50
  @base_url.setter
51
51
  def base_url(self, base_url: str) -> None:
52
52
  """
53
- Sets or overrides the base URL for Unipile API requests. This setter allows manually changing the endpoint, bypassing the default URL that is dynamically constructed from integration credentials. It is primarily intended for testing against different environments or for custom deployments.
53
+ Sets or overrides the Unipile API's base URL. This setter allows manually changing the endpoint, bypassing the default URL that is dynamically constructed from integration credentials. It is primarily intended for testing against different environments or for custom deployments.
54
54
 
55
55
  Args:
56
56
  base_url: The new base URL to set.
@@ -154,7 +154,7 @@ class UnipileApp(APIApplication):
154
154
  sender_id: str | None = None,
155
155
  ) -> dict[str, Any]:
156
156
  """
157
- Retrieves messages from a specific chat identified by `chat_id`. It supports pagination and filtering by date or sender. This function is distinct from `list_all_messages`, which fetches messages across all chats, whereas this method targets the contents of a single conversation.
157
+ Retrieves messages from a specific chat identified by `chat_id`. Supports pagination and filtering by date or sender. Unlike `list_all_messages`, which fetches from all chats, this function targets the contents of a single conversation.
158
158
 
159
159
  Args:
160
160
  chat_id: The ID of the chat to retrieve messages from.
@@ -195,7 +195,7 @@ class UnipileApp(APIApplication):
195
195
  text: str,
196
196
  ) -> dict[str, Any]:
197
197
  """
198
- Sends a text message to a specific chat via a POST request to the Unipile API. Given a chat ID and text content, it creates a new message within that conversation and returns the API's response, typically containing the new message's ID.
198
+ Sends a text message to a specific chat conversation using its `chat_id`. This function creates a new message via a POST request, distinguishing it from read-only functions like `list_chat_messages`. It returns the API's response, which typically confirms the successful creation of the message.
199
199
 
200
200
  Args:
201
201
  chat_id: The ID of the chat where the message will be sent.
@@ -221,7 +221,7 @@ class UnipileApp(APIApplication):
221
221
  self, chat_id: str, account_id: str | None = None
222
222
  ) -> dict[str, Any]:
223
223
  """
224
- Retrieves a single chat by its unique Unipile or provider-specific ID. The `account_id` is required when using a provider ID to specify the correct context. This function fetches one specific chat, unlike `list_all_chats` which retrieves a collection of chats.
224
+ Retrieves a single chat's details using its Unipile or provider-specific ID. Requires an `account_id` when using a provider ID for context. This function is distinct from `list_all_chats`, which returns a collection, by targeting one specific conversation.
225
225
 
226
226
  Args:
227
227
  chat_id: The Unipile or provider ID of the chat.
@@ -327,7 +327,7 @@ class UnipileApp(APIApplication):
327
327
  account_id: str,
328
328
  ) -> dict[str, Any]:
329
329
  """
330
- Retrieves the details of a specific account linked to the Unipile service by its unique ID. This function fetches metadata about the connection itself (e.g., a linked LinkedIn account), distinguishing it from functions that fetch end-user profiles from the external platform.
330
+ Retrieves details for a specific account linked to Unipile using its ID. It fetches metadata about the connection itself (e.g., a linked LinkedIn account), differentiating it from `retrieve_user_profile` which fetches a user's profile from the external platform.
331
331
 
332
332
  Args:
333
333
  account_id: The ID of the account to retrieve.
@@ -354,7 +354,7 @@ class UnipileApp(APIApplication):
354
354
  is_company: bool | None = None,
355
355
  ) -> dict[str, Any]:
356
356
  """
357
- Retrieves a paginated list of posts from a specific user or company profile using their provider ID. A Unipile account is required for authorization, and the `is_company` flag must be used to differentiate between entity types.
357
+ Retrieves a paginated list of posts from a specific user or company profile using their provider ID. An authorizing `account_id` is required, and the `is_company` flag must specify the entity type, distinguishing this from `retrieve_post` which fetches a single post by its own ID.
358
358
 
359
359
  Args:
360
360
  identifier: The entity's provider internal ID (LinkedIn ID).
@@ -389,7 +389,7 @@ class UnipileApp(APIApplication):
389
389
  account_id: str,
390
390
  ) -> dict[str, Any]:
391
391
  """
392
- Retrieves the profile details for the user associated with the specified Unipile account ID. This function targets the API's 'me' endpoint to fetch the current authenticated user's profile, distinct from fetching profiles of other users via the `retrieve_profile` function.
392
+ Retrieves the profile details for the user associated with the specified Unipile account ID. This function targets the API's 'me' endpoint to fetch the authenticated user's profile, distinct from `retrieve_user_profile` which fetches profiles of other users by their public identifier.
393
393
 
394
394
  Args:
395
395
  account_id: The ID of the Unipile account to use for retrieving the profile (REQUIRED).
@@ -414,7 +414,7 @@ class UnipileApp(APIApplication):
414
414
  account_id: str,
415
415
  ) -> dict[str, Any]:
416
416
  """
417
- Fetches the details of a specific post by its unique ID. The request is performed using the provided `account_id` for authorization, returning the full post object. This differs from `list_user_posts` which retrieves multiple posts for a specific user or company.
417
+ Fetches a specific post's details by its unique ID, requiring an `account_id` for authorization. Unlike `list_profile_posts`, which retrieves a collection of posts from a user or company profile, this function targets one specific post and returns its full object.
418
418
 
419
419
  Args:
420
420
  post_id: The ID of the post to retrieve.
@@ -443,7 +443,7 @@ class UnipileApp(APIApplication):
443
443
  limit: int | None = None,
444
444
  ) -> dict[str, Any]:
445
445
  """
446
- Fetches comments for a specific post. By providing an optional `comment_id`, the function retrieves replies to that comment instead of top-level comments. This read-only operation contrasts with `create_post_comment`, which adds new comments, and `list_post_reactions`, which retrieves likes.
446
+ Fetches comments for a specific post using an `account_id` for authorization. Providing an optional `comment_id` retrieves threaded replies instead of top-level comments. This read-only operation contrasts with `create_post_comment`, which publishes new comments, and `list_content_reactions`, which retrieves 'likes'.
447
447
 
448
448
  Args:
449
449
  post_id: The social ID of the post.
@@ -481,7 +481,7 @@ class UnipileApp(APIApplication):
481
481
  external_link: str | None = None,
482
482
  ) -> dict[str, Any]:
483
483
  """
484
- Publishes a new post to LinkedIn via the Unipile API from a specified account. The post's content can include text, user mentions, and an external link displayed as a card. This function is for creating top-level posts, distinct from `create_post_comment` which replies to existing posts.
484
+ Publishes a new top-level post from a specified account, including text, user mentions, and an external link. This function creates original content, distinguishing it from `create_post_comment` which adds replies to existing posts.
485
485
 
486
486
  Args:
487
487
  account_id: The ID of the Unipile account that will author the post (added as query parameter).
@@ -523,7 +523,7 @@ class UnipileApp(APIApplication):
523
523
  limit: int | None = None,
524
524
  ) -> dict[str, Any]:
525
525
  """
526
- Retrieves a paginated list of reactions for a given post or, optionally, a specific comment. This read-only operation uses the provided `account_id` for the request, distinguishing it from `add_reaction_to_post` which creates new reactions.
526
+ Retrieves a paginated list of reactions for a given post or, optionally, a specific comment. This read-only operation uses the provided `account_id` for the request, distinguishing it from the `create_reaction` function which adds new reactions.
527
527
 
528
528
  Args:
529
529
  post_id: The social ID of the post.
@@ -613,7 +613,7 @@ class UnipileApp(APIApplication):
613
613
  comment_id: str | None = None,
614
614
  ) -> dict[str, Any]:
615
615
  """
616
- Adds a specified reaction (e.g., 'like', 'love') to a LinkedIn post or, optionally, to a specific comment. This function performs a POST request to create the reaction, differentiating it from `list_post_reactions` which only retrieves existing ones.
616
+ Adds a specified reaction (e.g., 'like', 'love') to a LinkedIn post or, optionally, to a specific comment. This function performs a POST request to create the reaction, differentiating it from `list_content_reactions` which only retrieves existing ones.
617
617
 
618
618
  Args:
619
619
  post_social_id: The social ID of the post or comment to react to.
@@ -784,7 +784,7 @@ class UnipileApp(APIApplication):
784
784
  account_id: str,
785
785
  ) -> dict[str, Any]:
786
786
  """
787
- Retrieves a specific LinkedIn user's profile using their public or internal ID. This is distinct from `retrieve_own_profile`, which retrieves the profile associated with the Unipile account performing the request.
787
+ Retrieves a specific LinkedIn user's profile using their public or internal ID, authorized via the provided `account_id`. Unlike `retrieve_own_profile`, which fetches the authenticated user's details, this function targets and returns data for any specified third-party user profile on the platform.
788
788
 
789
789
  Args:
790
790
  identifier: Can be the provider's internal id OR the provider's public id of the requested user.For example, for https://www.linkedin.com/in/manojbajaj95/, the identifier is "manojbajaj95".
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: universal-mcp-applications
3
- Version: 0.1.17
3
+ Version: 0.1.18
4
4
  Summary: A Universal MCP Application: universal_mcp_applications
5
5
  Project-URL: Homepage, https://github.com/universal-mcp/applications
6
6
  Project-URL: Repository, https://github.com/universal-mcp/applications
@@ -66,7 +66,7 @@ universal_mcp/applications/exa/__init__.py,sha256=Qv8Te8cOLhw9sFI5R7T_vnWsc84KIE
66
66
  universal_mcp/applications/exa/app.py,sha256=zs7Ji24kxS6HvFeHB7mE4ElnPL02oWgBxx-dh0mwV6U,11993
67
67
  universal_mcp/applications/falai/README.md,sha256=jiYqAZ8GF6UCLNW-c2kdWLRCVx82k1nYqfqnYhXUg48,1768
68
68
  universal_mcp/applications/falai/__init__.py,sha256=dDEbnfW_FSTXVZjXrBKU5B-Hp2W-7KnnLSb9n276cdY,26
69
- universal_mcp/applications/falai/app.py,sha256=-DxBfQ529GhXvKIInyie7Udb_Da2MvygJv9KtnJd74Q,13999
69
+ universal_mcp/applications/falai/app.py,sha256=wKIajeMCMG9OYOQhb16-ObMC0kcY-cl6AgBiq2ma2U4,13981
70
70
  universal_mcp/applications/figma/README.md,sha256=-pVipcK_itywZ_LoXutq-bX5ls5EKtNyLzsQs1lxxAU,5906
71
71
  universal_mcp/applications/figma/__init__.py,sha256=eIW1-VV7H133xmLrAjx8bm0qNOxC_tdH39aWInKfAq0,26
72
72
  universal_mcp/applications/figma/app.py,sha256=1gRA-ycluJq0qgy-JExRmYqlqgOvE0TSamjqFPFpdoM,47382
@@ -74,7 +74,7 @@ universal_mcp/applications/file_system/__init__.py,sha256=ZW4Iac5_Gho-FYaxIsnCs1
74
74
  universal_mcp/applications/file_system/app.py,sha256=vcDo_S7Pt0G5q7R_00nLdbJ5GTG48_m346_7lqkPDQE,4261
75
75
  universal_mcp/applications/firecrawl/README.md,sha256=BeUZ2IPckHC_JuxW6daai5qxfw2SbLjIsfh6PNcDbBU,1189
76
76
  universal_mcp/applications/firecrawl/__init__.py,sha256=Sl2LuCKsNHoFf-3dGE31CYVGJkF_lJBvx34XVtZPr5I,30
77
- universal_mcp/applications/firecrawl/app.py,sha256=3_hh7aDh6DRjTAJCgZfPYujDsllOEhleXUyS2H0FHuE,21913
77
+ universal_mcp/applications/firecrawl/app.py,sha256=dh2G8y5-I4ITxV1vV916P4eaS0VqtMcnihOzHd1cYc4,22024
78
78
  universal_mcp/applications/fireflies/README.md,sha256=l5iDCzF-diIh9gHptB8g4UzzWNLqUCq9rR164bhU7A4,1203
79
79
  universal_mcp/applications/fireflies/__init__.py,sha256=SMEk3MeSk6aFzX8GX_NZwcjBvnEeTRQDlA1RZMrwKxA,30
80
80
  universal_mcp/applications/fireflies/app.py,sha256=VREgLSsCI0AdUsMK4htajxVUDIKwBWeSeiex3a9jNwY,19022
@@ -91,31 +91,31 @@ universal_mcp/applications/ghost_content/__init__.py,sha256=FZpzgPwkJU54Y-7XfrR7
91
91
  universal_mcp/applications/ghost_content/app.py,sha256=pZGrKNkWi1F9UTETKc76HL-Z_UgsOIw6k6remDJIwwM,24235
92
92
  universal_mcp/applications/github/README.md,sha256=F6azpS6iwzr0dFQhhVBH8i8LgiJc9vnRzSixBNYuYgc,1388
93
93
  universal_mcp/applications/github/__init__.py,sha256=3_T202KYSp3Wq9bV9spJBK1lf0NFPyGGoCsGSL_x8vk,27
94
- universal_mcp/applications/github/app.py,sha256=gF3uNslHFe1pZkLakC3BFmV9lsMnVrL3j4qeq4R1IHU,20153
94
+ universal_mcp/applications/github/app.py,sha256=EmVF1xrM8dEa07Vpl_fpRUaKDLwrfYCbjMHmp50iTqs,20195
95
95
  universal_mcp/applications/gong/README.md,sha256=mz9W81VYPwdwbQ2_Yz9TF5oP7lfgFRkn70xNHkZV534,6383
96
96
  universal_mcp/applications/gong/__init__.py,sha256=Sev0qQ31JkJGnVwMdkV7DH6iAU8695dLxd1D2jMpcK8,25
97
97
  universal_mcp/applications/gong/app.py,sha256=WRpa8tpgj9TiJwPzP5ZH7W4fiM8F59jlDSpn2McHsC4,100495
98
98
  universal_mcp/applications/google_calendar/README.md,sha256=wmm3GZeKHRhaRA22r0GTSpYjzDUyGeWYopxafHRPrz0,1350
99
99
  universal_mcp/applications/google_calendar/__init__.py,sha256=qxVxf_Q5lOdxXRHzmE78o1aYZoY1MRlmnR_lCGh7fe4,35
100
- universal_mcp/applications/google_calendar/app.py,sha256=ged4aZlafgc1cUdmjcs9IWSPfT7YJirXnD3B0joNWJs,26071
100
+ universal_mcp/applications/google_calendar/app.py,sha256=FCdAbTRBM5St4NyUgmjiZWWv33LIre_quE-k_5FzF20,26167
101
101
  universal_mcp/applications/google_docs/README.md,sha256=aL2EN1V3JIb4cHXefPFIFM0NjpcXtfJICCakc0jO5SM,1483
102
102
  universal_mcp/applications/google_docs/__init__.py,sha256=U0pWagxnj0VD-AcKNd8eS0orzaMmlUOgvW9vkYBNH40,31
103
- universal_mcp/applications/google_docs/app.py,sha256=PuivY_dkE3GW5shVAuZ-G_xTKheobbr3vK4S9VvCSjI,33487
103
+ universal_mcp/applications/google_docs/app.py,sha256=xlnWvAs45FAbYJPU6wD8AqUGWqj7sUhIuUonyH2opKg,33575
104
104
  universal_mcp/applications/google_drive/README.md,sha256=HNTQCqBU0wlmJEIgrlW1j3bKya5XtR7mvemcgPHJFD0,4089
105
105
  universal_mcp/applications/google_drive/__init__.py,sha256=DTyed4ADcCmALSyPT8whjXoosPXl3m-i8JrilPJ3ijU,32
106
- universal_mcp/applications/google_drive/app.py,sha256=7hWfidgOp3TSHBqaB6E3zQQ_9b99QejU4_-uBL46iHE,257953
106
+ universal_mcp/applications/google_drive/app.py,sha256=u3eyZfV4Dkjj_lYe3vyaCgaPF-UNg8pH0EeLCtZDwmI,258417
107
107
  universal_mcp/applications/google_gemini/README.md,sha256=o5cWenioUnNhn7L2fxwPLasBXzQ7mNmYp-aLLj9bHzY,2042
108
108
  universal_mcp/applications/google_gemini/__init__.py,sha256=KZWdPU74VKBBabLpAcPNEPRPLFk8v2i0ULnT4wVHM9U,33
109
- universal_mcp/applications/google_gemini/app.py,sha256=ssOrJDmemg_djz-SzVwtk9YjJU6Zj1egXXMrrKRKgYY,8671
109
+ universal_mcp/applications/google_gemini/app.py,sha256=pp2T1nuLUy3yAEOWssBssY3Oudj3YG8ofC757QRJQhY,8743
110
110
  universal_mcp/applications/google_mail/README.md,sha256=TVLbil9-qjjp9kZziuWWhkiVNR1tf5XJ_q37xd6iUsg,2422
111
111
  universal_mcp/applications/google_mail/__init__.py,sha256=_VpJPPBAJvPX3urxUD2_kiQmld91tkVFSvAcdt5XbmI,31
112
- universal_mcp/applications/google_mail/app.py,sha256=OuIvadMz-XlJzF6mFYK58dlZ1MYg6Yvdg1TL61QMxh4,60661
112
+ universal_mcp/applications/google_mail/app.py,sha256=iTUtsscSHbtiSE0UQXBRJHD_yy0fiHg6DQHqYmGcxNQ,60970
113
113
  universal_mcp/applications/google_searchconsole/README.md,sha256=LIrDGFYmTHwRso014DNMyhOSgCOVybeTBejQpxeQIQ0,1129
114
114
  universal_mcp/applications/google_searchconsole/__init__.py,sha256=PHuwQFk0_a-jbnAUNkAq3ODarxHIcu3z3AZXfwPhdbQ,40
115
- universal_mcp/applications/google_searchconsole/app.py,sha256=vIGqHg4q_v7M897wjnl-r-nxQJVtt2ZBcliZ7GazwYQ,14175
115
+ universal_mcp/applications/google_searchconsole/app.py,sha256=5fXhgYrFrKs3Mm9IZdCW4ylq2cj8BB1DxWp3a1oMblY,14272
116
116
  universal_mcp/applications/google_sheet/README.md,sha256=79WnJ8wP52CV_6IENfXjb0sZm5vGsx2lbSvJBbNT0qA,3838
117
117
  universal_mcp/applications/google_sheet/__init__.py,sha256=sl1VQKQMlYuzZGHUIyVsFvnar6APaIFb4Y_nl7TA0us,32
118
- universal_mcp/applications/google_sheet/app.py,sha256=mYcT0DmK7w7HeZ9Aj3prLRRdFKnRTCMUZJJryj7Pyww,88306
118
+ universal_mcp/applications/google_sheet/app.py,sha256=sGnypqRgmm9_GdwYVpgZ8RNXSN4qAKGlBCOKAmbURGY,88425
119
119
  universal_mcp/applications/google_sheet/helper.py,sha256=rC_2I4oKfd-rpj3UIWXGH4pZlMX1vI9kixryxBFymSY,11996
120
120
  universal_mcp/applications/hashnode/README.md,sha256=O_k8h3w3tVwigqRMSiYCl2XchoBM_p66sPLGFcexNQo,866
121
121
  universal_mcp/applications/hashnode/__init__.py,sha256=ty459WmLiNoGM4XZAKWNASp-0MCMBV15J3LstDbZWPw,29
@@ -137,7 +137,7 @@ universal_mcp/applications/klaviyo/__init__.py,sha256=YS2GhW7my_I1tfyLlxlkeTFmlz
137
137
  universal_mcp/applications/klaviyo/app.py,sha256=xHQxEZFVIWPCBmL6YoYxuVREibwPRH21izw0psmOzFc,423692
138
138
  universal_mcp/applications/linkedin/README.md,sha256=ybHYEJ9rQ6MxNvh89Nd553iG1UNt4skz6yJoMPrx5OI,415
139
139
  universal_mcp/applications/linkedin/__init__.py,sha256=Yj-713vb4ZYykIlXlwOkKkIXIOB3opCW8wvp_CCqlKk,29
140
- universal_mcp/applications/linkedin/app.py,sha256=4WLbv3wdD7Cnmo4I5oQ2kgnjfgLRU6In6RGeLi1hLpo,11303
140
+ universal_mcp/applications/linkedin/app.py,sha256=QZd24THXCZcuxhiTmXUulott9WqXmcA5foGnHyIXtR4,11334
141
141
  universal_mcp/applications/mailchimp/README.md,sha256=2eLln_2S4xJoNV4Fqe2Oy4Xe6QO3SUp-wAxsugXR8v0,33793
142
142
  universal_mcp/applications/mailchimp/__init__.py,sha256=wmXVl-NJyTNkFT5db29OZmeiLWAGu9jXwdZC5o2jZBw,30
143
143
  universal_mcp/applications/mailchimp/app.py,sha256=_a6iByjDK1SuM3UoT5lTokptdEryUzrS8JsYNLCTwi4,466723
@@ -149,7 +149,7 @@ universal_mcp/applications/miro/__init__.py,sha256=60-PalZbgF6QF506qaaGRkMNNzkiy
149
149
  universal_mcp/applications/miro/app.py,sha256=Jvghd4TRBUubHaG-IEniSVdd7LwlrULpUEepjWzHC7I,198132
150
150
  universal_mcp/applications/ms_teams/README.md,sha256=0jpMpO5o7mB2qUk45FwR5jsUbGqg8w7V6s3SMIyy9G0,1853
151
151
  universal_mcp/applications/ms_teams/__init__.py,sha256=mSSsERDFHWbg1621pCBGn_DYVU-s4YOKOvWLzDflo9Y,28
152
- universal_mcp/applications/ms_teams/app.py,sha256=GwA9kv4ajyk1Yz5Ijgq4GbQfkbilG8aaFKURiVBvjMw,82947
152
+ universal_mcp/applications/ms_teams/app.py,sha256=kOA0K68kdtayJPUqBYwht6kHM0s2ij_0rkqa3xUeBS0,83526
153
153
  universal_mcp/applications/neon/README.md,sha256=O2JPvjJirRi8GNcLGAk-p0qa_KfV8ClTHvXk_LbT_dA,7132
154
154
  universal_mcp/applications/neon/__init__.py,sha256=9QeNV4cvMyVDE3jlxiUYqECHS9EdN8tkPk01udScaVI,25
155
155
  universal_mcp/applications/neon/app.py,sha256=ISwBIKfZn-xnCICrpQZI_BGz_6dhlPcV4EdOFn-My-8,83512
@@ -161,7 +161,7 @@ universal_mcp/applications/openai/__init__.py,sha256=7h2xDZdb1pRh7ZDLtFK9BNDEbRH
161
161
  universal_mcp/applications/openai/app.py,sha256=77dS3FdbeSkLJx5NkAuzd87QdphKh6ZjGjvN8WjWtr4,34418
162
162
  universal_mcp/applications/outlook/README.md,sha256=h6jUIYyO20YJaEJ34pmov7ywhfnwP9qLQC9fwbpP9A4,1603
163
163
  universal_mcp/applications/outlook/__init__.py,sha256=yExFpo0apWqcpP7l4qCjAYwMyzomUaEeNDhY7Gi-We0,28
164
- universal_mcp/applications/outlook/app.py,sha256=OYBM8x3vKOlrSj8naAnrRYWX2QcgGxU0FCOc8IOPb_w,19709
164
+ universal_mcp/applications/outlook/app.py,sha256=FRDr5svowc-uY3azs9VRxNoD_r50FD3K_eooBLIMmTk,19816
165
165
  universal_mcp/applications/perplexity/README.md,sha256=mUXKJHhBgK6H8oyjhlrxcsfuvDrOniIceTBmcR_Oeao,335
166
166
  universal_mcp/applications/perplexity/__init__.py,sha256=f4uz8qlw-uek6AlyWxoWxukubaHb6YV4riTcvQhfvO0,31
167
167
  universal_mcp/applications/perplexity/app.py,sha256=JgzBdviTyXtUrYePJJbmUcKDuTWJJpvUphT0a5OYVKs,2847
@@ -173,7 +173,7 @@ universal_mcp/applications/posthog/__init__.py,sha256=2j8vH09Xqz51BlfNehaEvY2A2L
173
173
  universal_mcp/applications/posthog/app.py,sha256=-T0hOSxPT3qQEVG8IrRY0MVi0YI8yHHeKPgl5jRexGY,275182
174
174
  universal_mcp/applications/reddit/README.md,sha256=3krLCogha_GekeqACyIx8G_mHmOmQbcyZJn8ZUHQtjE,8594
175
175
  universal_mcp/applications/reddit/__init__.py,sha256=JHA_BMVnuQyoDMbQt5dRNxKPrAxyZZL6zzQyNbvyjHs,27
176
- universal_mcp/applications/reddit/app.py,sha256=ERBIKs730IjbzLeQB-BxdNrcUhepo9HTvSFvUusnt8I,31441
176
+ universal_mcp/applications/reddit/app.py,sha256=NZWx4cYcCOKzonIr9VrYsq7gYmEk-56QBa2ICG0hGGY,36394
177
177
  universal_mcp/applications/replicate/README.md,sha256=1N9UgpeU1G_Yt6pBIFuty1ii6yJe2hLbfDJUKFPrYk0,1288
178
178
  universal_mcp/applications/replicate/__init__.py,sha256=W3thUM5OFDKregi9E4EjzrcLY4ya_ZLMQKXAF2fiYV4,30
179
179
  universal_mcp/applications/replicate/app.py,sha256=QIHReOEnF3QUkSi0DME1jrBn24WC8r2hVQHtr7SryEo,21836
@@ -188,7 +188,7 @@ universal_mcp/applications/rocketlane/__init__.py,sha256=jl3PjnTvPdjnbFXJgLywSlE
188
188
  universal_mcp/applications/rocketlane/app.py,sha256=Re5-OoUWIIxL_ZJZ_RpEqz82hymgAWtdcOSJtJFzzs0,240690
189
189
  universal_mcp/applications/scraper/README.md,sha256=ys9f2dRHGsnFkauAuGdBo3_Z_51PRn2cqGlnEv8kjPI,590
190
190
  universal_mcp/applications/scraper/__init__.py,sha256=RnkyFDeNR1tOsY_PskHdv4C8AYRbcjMt7KyYQWiGGD8,27
191
- universal_mcp/applications/scraper/app.py,sha256=jCRa5ys5MPrd-xLpso4r9io9-GaKyLB0z2SLLvQi53o,7530
191
+ universal_mcp/applications/scraper/app.py,sha256=DPdsmsWuYWXccaUe5_lurHhVeVs1DHbUP8JvIDeWJys,7255
192
192
  universal_mcp/applications/semanticscholar/README.md,sha256=JpLY_698pvstgoNfQ5Go8C8ehQ-o68uFDX5kr86upK0,2834
193
193
  universal_mcp/applications/semanticscholar/__init__.py,sha256=eR36chrc0pbBsSE1GadvmQH0OmtKnSC91xbE7HcDPf0,36
194
194
  universal_mcp/applications/semanticscholar/app.py,sha256=OHTFkR-IwRU5Rvb1bEu7XmRHikht3hEgZxszLQu6kFI,22234
@@ -206,7 +206,7 @@ universal_mcp/applications/serpapi/__init__.py,sha256=1lErMm8HVSYiNEnDDjQr8_5h-s
206
206
  universal_mcp/applications/serpapi/app.py,sha256=ki3yzVxwrYQU9JQI6gblLNBaq0pwiBy-JwR85nTyqRo,13518
207
207
  universal_mcp/applications/sharepoint/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
208
208
  universal_mcp/applications/sharepoint/__init__.py,sha256=Aj4fG4SQCzpbRMovrq5McIvKCAzl03FtROh7SUQ0Unk,31
209
- universal_mcp/applications/sharepoint/app.py,sha256=GUCzrevXYAxTtvXD0IN3Y3LIn3uwnOdfKEuAr1PNnhE,9379
209
+ universal_mcp/applications/sharepoint/app.py,sha256=zBxzTWn1OIDkYso3bGHiS0CncTwg8mixHlzHE4N_K28,9488
210
210
  universal_mcp/applications/shopify/README.md,sha256=vXUNUmcR70PYG9Ojqlg8m1w3M5AXI10CZ-Or2oGrbuU,48415
211
211
  universal_mcp/applications/shopify/__init__.py,sha256=_TyHBCgryXtqpUTngnUnPmJmnTzQvi1jNyi4VIlsoXQ,28
212
212
  universal_mcp/applications/shopify/app.py,sha256=MFEOqWcL-rtJf5ccyxkKVLPHf0Q6fmEmFIRDYKQXgDI,615058
@@ -249,7 +249,7 @@ universal_mcp/applications/twitter/api_segments/usage_api.py,sha256=aBhjTzYUN16s
249
249
  universal_mcp/applications/twitter/api_segments/users_api.py,sha256=aypLs5_66TRtliSi2TjrQO9l6NuJa2LZn3Ywgwt8hEk,82349
250
250
  universal_mcp/applications/unipile/README.md,sha256=fe4fT2amFnX8wtU4xIy2x5nZg3WKG9S7FyGoc24mmxU,1604
251
251
  universal_mcp/applications/unipile/__init__.py,sha256=0UZVOiYo_dDXbvTmtHrZ_fgvrbpasjWV17EEm4pZq9E,28
252
- universal_mcp/applications/unipile/app.py,sha256=uj8FTRtP8iiph2VgMzNeRUmAweeH1-9wHF5y2CkkVm8,33324
252
+ universal_mcp/applications/unipile/app.py,sha256=Ssf7a3GijATbgPAGOeZgEvtCxlQd9nRZ750skEO3szE,33483
253
253
  universal_mcp/applications/whatsapp/README.md,sha256=eYXIHHpsNIhc2xBLyzStoATXnlvnOZHAxGsBoLC1vd0,1364
254
254
  universal_mcp/applications/whatsapp/__init__.py,sha256=miHfSBpu5lx226T8dMbvOw_5H6MJCWOKVK_WbqMma-8,29
255
255
  universal_mcp/applications/whatsapp/app.py,sha256=CDNTjoPh8j5e4X_i22a0UtCHKj9VsocpNvqcDXyarsk,23520
@@ -267,7 +267,7 @@ universal_mcp/applications/youtube/app.py,sha256=GxTtXbwda044bIqmzxIGX6x3WNejHx0
267
267
  universal_mcp/applications/zenquotes/README.md,sha256=x1mZHjNKD4WOgsIhedcbbaR1nvbt794GSrKud1tSLD0,296
268
268
  universal_mcp/applications/zenquotes/__init__.py,sha256=IkASLYaZiHJXlkGwEMk1HgIq5GwEZp5GhAIiJyjBd3g,30
269
269
  universal_mcp/applications/zenquotes/app.py,sha256=S88JEoVFsyqow-56zcYPgRzhcz59AG_L_RdTFqtSwdA,1323
270
- universal_mcp_applications-0.1.17.dist-info/METADATA,sha256=xFaxd2g6UzYUjbpO9b9IDUyOAIdsQgvfK6xbGfUPt7U,4024
271
- universal_mcp_applications-0.1.17.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
272
- universal_mcp_applications-0.1.17.dist-info/licenses/LICENSE,sha256=NweDZVPslBAZFzlgByF158b85GR0f5_tLQgq1NS48To,1063
273
- universal_mcp_applications-0.1.17.dist-info/RECORD,,
270
+ universal_mcp_applications-0.1.18.dist-info/METADATA,sha256=j6bc4EjuAk23ybKeAk-uLpWfKznVFLbVVLplFYahcGw,4024
271
+ universal_mcp_applications-0.1.18.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
272
+ universal_mcp_applications-0.1.18.dist-info/licenses/LICENSE,sha256=NweDZVPslBAZFzlgByF158b85GR0f5_tLQgq1NS48To,1063
273
+ universal_mcp_applications-0.1.18.dist-info/RECORD,,