universal-mcp-applications 0.1.33__py3-none-any.whl → 0.1.39rc8__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 (113) hide show
  1. universal_mcp/applications/ahrefs/app.py +92 -238
  2. universal_mcp/applications/airtable/app.py +23 -122
  3. universal_mcp/applications/apollo/app.py +122 -475
  4. universal_mcp/applications/asana/app.py +605 -1755
  5. universal_mcp/applications/aws_s3/app.py +36 -103
  6. universal_mcp/applications/bill/app.py +644 -2055
  7. universal_mcp/applications/box/app.py +1246 -4159
  8. universal_mcp/applications/braze/app.py +410 -1476
  9. universal_mcp/applications/browser_use/README.md +15 -1
  10. universal_mcp/applications/browser_use/__init__.py +1 -0
  11. universal_mcp/applications/browser_use/app.py +86 -24
  12. universal_mcp/applications/cal_com_v2/app.py +207 -625
  13. universal_mcp/applications/calendly/app.py +103 -242
  14. universal_mcp/applications/canva/app.py +75 -140
  15. universal_mcp/applications/clickup/app.py +331 -798
  16. universal_mcp/applications/coda/app.py +240 -520
  17. universal_mcp/applications/confluence/app.py +497 -1285
  18. universal_mcp/applications/contentful/app.py +36 -151
  19. universal_mcp/applications/crustdata/app.py +42 -121
  20. universal_mcp/applications/dialpad/app.py +451 -924
  21. universal_mcp/applications/digitalocean/app.py +2071 -6082
  22. universal_mcp/applications/domain_checker/app.py +3 -54
  23. universal_mcp/applications/e2b/app.py +14 -64
  24. universal_mcp/applications/elevenlabs/app.py +9 -47
  25. universal_mcp/applications/exa/README.md +8 -4
  26. universal_mcp/applications/exa/app.py +408 -186
  27. universal_mcp/applications/falai/app.py +24 -101
  28. universal_mcp/applications/figma/app.py +91 -175
  29. universal_mcp/applications/file_system/app.py +2 -13
  30. universal_mcp/applications/firecrawl/app.py +186 -163
  31. universal_mcp/applications/fireflies/app.py +59 -281
  32. universal_mcp/applications/fpl/app.py +92 -529
  33. universal_mcp/applications/fpl/utils/fixtures.py +15 -49
  34. universal_mcp/applications/fpl/utils/helper.py +25 -89
  35. universal_mcp/applications/fpl/utils/league_utils.py +20 -64
  36. universal_mcp/applications/ghost_content/app.py +66 -175
  37. universal_mcp/applications/github/app.py +28 -65
  38. universal_mcp/applications/gong/app.py +140 -300
  39. universal_mcp/applications/google_calendar/app.py +26 -78
  40. universal_mcp/applications/google_docs/app.py +98 -202
  41. universal_mcp/applications/google_drive/app.py +194 -793
  42. universal_mcp/applications/google_gemini/app.py +27 -62
  43. universal_mcp/applications/google_mail/README.md +1 -0
  44. universal_mcp/applications/google_mail/app.py +93 -214
  45. universal_mcp/applications/google_searchconsole/app.py +25 -58
  46. universal_mcp/applications/google_sheet/app.py +171 -624
  47. universal_mcp/applications/google_sheet/helper.py +26 -53
  48. universal_mcp/applications/hashnode/app.py +57 -269
  49. universal_mcp/applications/heygen/app.py +77 -155
  50. universal_mcp/applications/http_tools/app.py +10 -32
  51. universal_mcp/applications/hubspot/README.md +1 -1
  52. universal_mcp/applications/hubspot/app.py +7508 -99
  53. universal_mcp/applications/jira/app.py +2419 -8334
  54. universal_mcp/applications/klaviyo/app.py +737 -1619
  55. universal_mcp/applications/linkedin/README.md +5 -0
  56. universal_mcp/applications/linkedin/app.py +332 -227
  57. universal_mcp/applications/mailchimp/app.py +696 -1851
  58. universal_mcp/applications/markitdown/app.py +8 -20
  59. universal_mcp/applications/miro/app.py +333 -815
  60. universal_mcp/applications/ms_teams/app.py +85 -207
  61. universal_mcp/applications/neon/app.py +144 -250
  62. universal_mcp/applications/notion/app.py +36 -51
  63. universal_mcp/applications/onedrive/app.py +26 -48
  64. universal_mcp/applications/openai/app.py +42 -165
  65. universal_mcp/applications/outlook/README.md +22 -9
  66. universal_mcp/applications/outlook/app.py +403 -141
  67. universal_mcp/applications/perplexity/README.md +2 -1
  68. universal_mcp/applications/perplexity/app.py +162 -20
  69. universal_mcp/applications/pipedrive/app.py +1021 -3331
  70. universal_mcp/applications/posthog/app.py +272 -541
  71. universal_mcp/applications/reddit/app.py +61 -160
  72. universal_mcp/applications/resend/app.py +41 -107
  73. universal_mcp/applications/retell/app.py +23 -50
  74. universal_mcp/applications/rocketlane/app.py +250 -963
  75. universal_mcp/applications/scraper/app.py +67 -125
  76. universal_mcp/applications/semanticscholar/app.py +36 -78
  77. universal_mcp/applications/semrush/app.py +43 -77
  78. universal_mcp/applications/sendgrid/app.py +826 -1576
  79. universal_mcp/applications/sentry/app.py +444 -1079
  80. universal_mcp/applications/serpapi/app.py +40 -143
  81. universal_mcp/applications/sharepoint/app.py +27 -49
  82. universal_mcp/applications/shopify/app.py +1743 -4479
  83. universal_mcp/applications/shortcut/app.py +272 -534
  84. universal_mcp/applications/slack/app.py +41 -123
  85. universal_mcp/applications/spotify/app.py +206 -405
  86. universal_mcp/applications/supabase/app.py +174 -283
  87. universal_mcp/applications/tavily/app.py +2 -2
  88. universal_mcp/applications/trello/app.py +853 -2816
  89. universal_mcp/applications/twilio/app.py +14 -50
  90. universal_mcp/applications/twitter/api_segments/compliance_api.py +4 -14
  91. universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +6 -18
  92. universal_mcp/applications/twitter/api_segments/likes_api.py +1 -3
  93. universal_mcp/applications/twitter/api_segments/lists_api.py +5 -15
  94. universal_mcp/applications/twitter/api_segments/trends_api.py +1 -3
  95. universal_mcp/applications/twitter/api_segments/tweets_api.py +9 -31
  96. universal_mcp/applications/twitter/api_segments/usage_api.py +1 -5
  97. universal_mcp/applications/twitter/api_segments/users_api.py +14 -42
  98. universal_mcp/applications/whatsapp/app.py +35 -186
  99. universal_mcp/applications/whatsapp/audio.py +2 -6
  100. universal_mcp/applications/whatsapp/whatsapp.py +17 -51
  101. universal_mcp/applications/whatsapp_business/app.py +86 -299
  102. universal_mcp/applications/wrike/app.py +80 -153
  103. universal_mcp/applications/yahoo_finance/app.py +19 -65
  104. universal_mcp/applications/youtube/app.py +120 -306
  105. universal_mcp/applications/zenquotes/app.py +3 -3
  106. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/METADATA +4 -2
  107. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/RECORD +109 -113
  108. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/WHEEL +1 -1
  109. universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
  110. universal_mcp/applications/hubspot/api_segments/api_segment_base.py +0 -54
  111. universal_mcp/applications/hubspot/api_segments/crm_api.py +0 -7337
  112. universal_mcp/applications/hubspot/api_segments/marketing_api.py +0 -1467
  113. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc8.dist-info}/licenses/LICENSE +0 -0
@@ -1,7 +1,6 @@
1
1
  import logging
2
2
  import urllib.parse
3
3
  from typing import Any
4
-
5
4
  from universal_mcp.applications.application import APIApplication
6
5
  from universal_mcp.integrations import Integration
7
6
 
@@ -14,7 +13,7 @@ class GoogleSearchconsoleApp(APIApplication):
14
13
  self.webmasters_base_url = "https://www.googleapis.com/webmasters/v3"
15
14
  self.searchconsole_base_url = "https://searchconsole.googleapis.com/v1"
16
15
 
17
- def delete_sitemap(self, siteUrl: str, feedpath: str) -> None:
16
+ async def delete_sitemap(self, siteUrl: str, feedpath: str) -> None:
18
17
  """
19
18
  Deletes a specific sitemap from a Google Search Console property using its URL (`feedpath`). This function is distinct from `delete_site`, which removes the entire site property, not just a single sitemap file. It issues an HTTP DELETE request to the specified API endpoint.
20
19
 
@@ -28,15 +27,13 @@ class GoogleSearchconsoleApp(APIApplication):
28
27
  Tags:
29
28
  sitemap_management
30
29
  """
31
- # Encode URL parts used as path segments
32
30
  siteUrl_encoded = urllib.parse.quote(siteUrl, safe="")
33
31
  feedpath_encoded = urllib.parse.quote(feedpath, safe="")
34
-
35
32
  url = f"{self.webmasters_base_url}/sites/{siteUrl_encoded}/sitemaps/{feedpath_encoded}"
36
- response = self._delete(url)
33
+ response = await self._adelete(url)
37
34
  response.raise_for_status()
38
35
 
39
- def get_sitemap(self, siteUrl: str, feedpath: str) -> dict[str, Any]:
36
+ async def get_sitemap(self, siteUrl: str, feedpath: str) -> dict[str, Any]:
40
37
  """
41
38
  Retrieves detailed information for a single sitemap from a specified Google Search Console property. Unlike `list_sitemaps` which fetches all sitemaps, this function targets one sitemap by its URL (`feedpath`) to return its resource details, including status and last processed date.
42
39
 
@@ -52,15 +49,12 @@ class GoogleSearchconsoleApp(APIApplication):
52
49
  """
53
50
  siteUrl_encoded = urllib.parse.quote(siteUrl, safe="")
54
51
  feedpath_encoded = urllib.parse.quote(feedpath, safe="")
55
-
56
52
  url = f"{self.webmasters_base_url}/sites/{siteUrl_encoded}/sitemaps/{feedpath_encoded}"
57
- response = self._get(url)
53
+ response = await self._aget(url)
58
54
  response.raise_for_status()
59
55
  return response.json()
60
56
 
61
- def list_sitemaps(
62
- self, siteUrl: str, sitemapIndex: str | None = None
63
- ) -> dict[str, Any]:
57
+ async def list_sitemaps(self, siteUrl: str, sitemapIndex: str | None = None) -> dict[str, Any]:
64
58
  """
65
59
  Retrieves a list of sitemaps for a specific site property. It can optionally list sitemaps contained within a specified sitemap index file. This function contrasts with `get_sitemap`, which fetches details for only a single, specified sitemap rather than a collection.
66
60
 
@@ -77,16 +71,14 @@ class GoogleSearchconsoleApp(APIApplication):
77
71
  """
78
72
  siteUrl_encoded = urllib.parse.quote(siteUrl, safe="")
79
73
  url = f"{self.webmasters_base_url}/sites/{siteUrl_encoded}/sitemaps"
80
-
81
74
  query_params = {}
82
75
  if sitemapIndex is not None:
83
76
  query_params["sitemapIndex"] = sitemapIndex
84
-
85
- response = self._get(url, params=query_params if query_params else None)
77
+ response = await self._aget(url, params=query_params if query_params else None)
86
78
  response.raise_for_status()
87
79
  return response.json()
88
80
 
89
- def submit_sitemap(self, siteUrl: str, feedpath: str) -> None:
81
+ async def submit_sitemap(self, siteUrl: str, feedpath: str) -> None:
90
82
  """
91
83
  Submits a sitemap to a specified Google Search Console property using its URL (feedpath). It notifies Google to crawl the sitemap's location, complementing other sitemap management functions (`list_sitemaps`, `delete_sitemap`) by adding or updating a sitemap's registration for a given site.
92
84
 
@@ -102,15 +94,11 @@ class GoogleSearchconsoleApp(APIApplication):
102
94
  """
103
95
  siteUrl_encoded = urllib.parse.quote(siteUrl, safe="")
104
96
  feedpath_encoded = urllib.parse.quote(feedpath, safe="")
105
-
106
97
  url = f"{self.webmasters_base_url}/sites/{siteUrl_encoded}/sitemaps/{feedpath_encoded}"
107
- # PUT requests for submitting/notifying often don't have a body.
108
- response = self._put(url, data=None)
98
+ response = await self._aput(url, data=None)
109
99
  response.raise_for_status()
110
100
 
111
- # --- Sites ---
112
-
113
- def add_site(self, siteUrl: str) -> dict[str, Any]:
101
+ async def add_site(self, siteUrl: str) -> dict[str, Any]:
114
102
  """
115
103
  Adds a site property to the user's Google Search Console account using its URL. This action requires subsequent ownership verification. Unlike `list_sites`, which only retrieves existing properties, this function creates a new entry and returns the corresponding site resource upon successful creation.
116
104
 
@@ -125,14 +113,11 @@ class GoogleSearchconsoleApp(APIApplication):
125
113
  """
126
114
  siteUrl_encoded = urllib.parse.quote(siteUrl, safe="")
127
115
  url = f"{self.webmasters_base_url}/sites/{siteUrl_encoded}"
128
- # This specific PUT for adding a site generally does not require a body;
129
- # the resource identifier is the siteUrl itself.
130
- # Google API docs state it returns a site resource.
131
- response = self._put(url, data=None)
116
+ response = await self._aput(url, data=None)
132
117
  response.raise_for_status()
133
118
  return response.json()
134
119
 
135
- def delete_site(self, siteUrl: str) -> None:
120
+ async def delete_site(self, siteUrl: str) -> None:
136
121
  """
137
122
  Removes a website property from the user's Google Search Console account using its URL. Unlike `delete_sitemap`, which only targets a sitemap file, this function deletes the entire site property, revoking management access and removing it from the user's list of managed sites.
138
123
 
@@ -147,10 +132,10 @@ class GoogleSearchconsoleApp(APIApplication):
147
132
  """
148
133
  siteUrl_encoded = urllib.parse.quote(siteUrl, safe="")
149
134
  url = f"{self.webmasters_base_url}/sites/{siteUrl_encoded}"
150
- response = self._delete(url)
135
+ response = await self._adelete(url)
151
136
  response.raise_for_status()
152
137
 
153
- def get_site(self, siteUrl: str) -> dict[str, Any]:
138
+ async def get_site(self, siteUrl: str) -> dict[str, Any]:
154
139
  """
155
140
  Retrieves detailed information for a specific site property from Google Search Console using its URL. Unlike `list_sites`, which fetches all properties associated with the user's account, this function targets and returns the resource for a single, known site.
156
141
 
@@ -165,11 +150,11 @@ class GoogleSearchconsoleApp(APIApplication):
165
150
  """
166
151
  siteUrl_encoded = urllib.parse.quote(siteUrl, safe="")
167
152
  url = f"{self.webmasters_base_url}/sites/{siteUrl_encoded}"
168
- response = self._get(url)
153
+ response = await self._aget(url)
169
154
  response.raise_for_status()
170
155
  return response.json()
171
156
 
172
- def list_sites(self) -> dict[str, Any]:
157
+ async def list_sites(self) -> dict[str, Any]:
173
158
  """
174
159
  Retrieves all websites and domain properties the authenticated user manages in Google Search Console. While `get_site` fetches a single, specific property, this function returns a comprehensive list of all sites linked to the user's account, providing a complete overview of managed properties.
175
160
 
@@ -180,15 +165,11 @@ class GoogleSearchconsoleApp(APIApplication):
180
165
  site_management
181
166
  """
182
167
  url = f"{self.webmasters_base_url}/sites"
183
- response = self._get(url)
168
+ response = await self._aget(url)
184
169
  response.raise_for_status()
185
170
  return response.json()
186
171
 
187
- # --- URL Inspection ---
188
-
189
- def inspect_url(
190
- self, inspectionUrl: str, siteUrl: str, languageCode: str | None = None
191
- ) -> dict[str, Any]:
172
+ async def inspect_url(self, inspectionUrl: str, siteUrl: str, languageCode: str | None = None) -> dict[str, Any]:
192
173
  """
193
174
  Retrieves the Google Index status for a specified URL within a given Search Console property. This function queries the URL Inspection API to return detailed information about how Google sees the page, including its indexing eligibility and any detected issues.
194
175
 
@@ -205,21 +186,14 @@ class GoogleSearchconsoleApp(APIApplication):
205
186
  url_inspection, indexing
206
187
  """
207
188
  url = f"{self.searchconsole_base_url}/urlInspection/index:inspect"
208
- request_body: dict[str, Any] = {
209
- "inspectionUrl": inspectionUrl,
210
- "siteUrl": siteUrl,
211
- }
189
+ request_body: dict[str, Any] = {"inspectionUrl": inspectionUrl, "siteUrl": siteUrl}
212
190
  if languageCode is not None:
213
191
  request_body["languageCode"] = languageCode
214
-
215
- # Assuming _post handles dict as JSON payload, similar to ExaApp
216
- response = self._post(url, data=request_body)
192
+ response = await self._apost(url, data=request_body)
217
193
  response.raise_for_status()
218
194
  return response.json()
219
195
 
220
- # --- Search Analytics ---
221
-
222
- def query_search_analytics(
196
+ async def query_search_analytics(
223
197
  self,
224
198
  siteUrl: str,
225
199
  startDate: str,
@@ -230,7 +204,7 @@ class GoogleSearchconsoleApp(APIApplication):
230
204
  rowLimit: int | None = None,
231
205
  startRow: int | None = None,
232
206
  dataState: str | None = None,
233
- search_type: str | None = None, # 'type' is a reserved keyword in Python
207
+ search_type: str | None = None,
234
208
  ) -> dict[str, Any]:
235
209
  """
236
210
  Queries and retrieves search traffic data for a specified site within a given date range. Supports advanced filtering, grouping by various dimensions (e.g., query, page, device), and aggregation to customize the analytics report from the Google Search Console API.
@@ -272,14 +246,8 @@ class GoogleSearchconsoleApp(APIApplication):
272
246
  search_analytics, reporting
273
247
  """
274
248
  siteUrl_encoded = urllib.parse.quote(siteUrl, safe="")
275
- url = (
276
- f"{self.webmasters_base_url}/sites/{siteUrl_encoded}/searchAnalytics/query"
277
- )
278
-
279
- request_body: dict[str, Any] = {
280
- "startDate": startDate,
281
- "endDate": endDate,
282
- }
249
+ url = f"{self.webmasters_base_url}/sites/{siteUrl_encoded}/searchAnalytics/query"
250
+ request_body: dict[str, Any] = {"startDate": startDate, "endDate": endDate}
283
251
  if dimensions is not None:
284
252
  request_body["dimensions"] = dimensions
285
253
  if dimensionFilterGroups is not None:
@@ -293,9 +261,8 @@ class GoogleSearchconsoleApp(APIApplication):
293
261
  if dataState is not None:
294
262
  request_body["dataState"] = dataState
295
263
  if search_type is not None:
296
- request_body["type"] = search_type # API expects 'type'
297
-
298
- response = self._post(url, data=request_body)
264
+ request_body["type"] = search_type
265
+ response = await self._apost(url, data=request_body)
299
266
  response.raise_for_status()
300
267
  return response.json()
301
268