universal-mcp-applications 0.1.30rc1__py3-none-any.whl → 0.1.36rc1__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 (106) hide show
  1. universal_mcp/applications/ahrefs/app.py +52 -198
  2. universal_mcp/applications/airtable/app.py +23 -122
  3. universal_mcp/applications/apollo/app.py +111 -464
  4. universal_mcp/applications/asana/app.py +417 -1567
  5. universal_mcp/applications/aws_s3/app.py +33 -100
  6. universal_mcp/applications/bill/app.py +546 -1957
  7. universal_mcp/applications/box/app.py +1068 -3981
  8. universal_mcp/applications/braze/app.py +364 -1430
  9. universal_mcp/applications/browser_use/app.py +2 -8
  10. universal_mcp/applications/cal_com_v2/app.py +207 -625
  11. universal_mcp/applications/calendly/app.py +61 -200
  12. universal_mcp/applications/canva/app.py +45 -110
  13. universal_mcp/applications/clickup/app.py +207 -674
  14. universal_mcp/applications/coda/app.py +146 -426
  15. universal_mcp/applications/confluence/app.py +310 -1098
  16. universal_mcp/applications/contentful/app.py +36 -151
  17. universal_mcp/applications/crustdata/app.py +28 -107
  18. universal_mcp/applications/dialpad/app.py +283 -756
  19. universal_mcp/applications/digitalocean/app.py +1766 -5777
  20. universal_mcp/applications/domain_checker/app.py +3 -54
  21. universal_mcp/applications/e2b/app.py +14 -64
  22. universal_mcp/applications/elevenlabs/app.py +9 -47
  23. universal_mcp/applications/exa/app.py +6 -17
  24. universal_mcp/applications/falai/app.py +23 -100
  25. universal_mcp/applications/figma/app.py +53 -137
  26. universal_mcp/applications/file_system/app.py +2 -13
  27. universal_mcp/applications/firecrawl/app.py +51 -152
  28. universal_mcp/applications/fireflies/app.py +59 -281
  29. universal_mcp/applications/fpl/app.py +91 -528
  30. universal_mcp/applications/fpl/utils/fixtures.py +15 -49
  31. universal_mcp/applications/fpl/utils/helper.py +25 -89
  32. universal_mcp/applications/fpl/utils/league_utils.py +20 -64
  33. universal_mcp/applications/ghost_content/app.py +52 -161
  34. universal_mcp/applications/github/app.py +19 -56
  35. universal_mcp/applications/gong/app.py +88 -248
  36. universal_mcp/applications/google_calendar/app.py +16 -68
  37. universal_mcp/applications/google_docs/app.py +88 -188
  38. universal_mcp/applications/google_drive/app.py +140 -462
  39. universal_mcp/applications/google_gemini/app.py +12 -64
  40. universal_mcp/applications/google_mail/app.py +28 -157
  41. universal_mcp/applications/google_searchconsole/app.py +15 -48
  42. universal_mcp/applications/google_sheet/app.py +101 -578
  43. universal_mcp/applications/google_sheet/helper.py +10 -37
  44. universal_mcp/applications/hashnode/app.py +57 -269
  45. universal_mcp/applications/heygen/app.py +44 -122
  46. universal_mcp/applications/http_tools/app.py +10 -32
  47. universal_mcp/applications/hubspot/api_segments/crm_api.py +460 -1573
  48. universal_mcp/applications/hubspot/api_segments/marketing_api.py +74 -262
  49. universal_mcp/applications/hubspot/app.py +23 -87
  50. universal_mcp/applications/jira/app.py +2071 -7986
  51. universal_mcp/applications/klaviyo/app.py +494 -1376
  52. universal_mcp/applications/linkedin/README.md +23 -4
  53. universal_mcp/applications/linkedin/app.py +392 -212
  54. universal_mcp/applications/mailchimp/app.py +450 -1605
  55. universal_mcp/applications/markitdown/app.py +8 -20
  56. universal_mcp/applications/miro/app.py +217 -699
  57. universal_mcp/applications/ms_teams/app.py +64 -186
  58. universal_mcp/applications/neon/app.py +86 -192
  59. universal_mcp/applications/notion/app.py +21 -36
  60. universal_mcp/applications/onedrive/app.py +14 -36
  61. universal_mcp/applications/openai/app.py +42 -165
  62. universal_mcp/applications/outlook/app.py +16 -76
  63. universal_mcp/applications/perplexity/app.py +4 -19
  64. universal_mcp/applications/pipedrive/app.py +832 -3142
  65. universal_mcp/applications/posthog/app.py +163 -432
  66. universal_mcp/applications/reddit/app.py +40 -139
  67. universal_mcp/applications/resend/app.py +41 -107
  68. universal_mcp/applications/retell/app.py +14 -41
  69. universal_mcp/applications/rocketlane/app.py +221 -934
  70. universal_mcp/applications/scraper/README.md +7 -4
  71. universal_mcp/applications/scraper/app.py +280 -93
  72. universal_mcp/applications/semanticscholar/app.py +22 -64
  73. universal_mcp/applications/semrush/app.py +43 -77
  74. universal_mcp/applications/sendgrid/app.py +512 -1262
  75. universal_mcp/applications/sentry/app.py +271 -906
  76. universal_mcp/applications/serpapi/app.py +40 -143
  77. universal_mcp/applications/sharepoint/app.py +15 -37
  78. universal_mcp/applications/shopify/app.py +1551 -4287
  79. universal_mcp/applications/shortcut/app.py +155 -417
  80. universal_mcp/applications/slack/app.py +50 -101
  81. universal_mcp/applications/spotify/app.py +126 -325
  82. universal_mcp/applications/supabase/app.py +104 -213
  83. universal_mcp/applications/tavily/app.py +1 -1
  84. universal_mcp/applications/trello/app.py +693 -2656
  85. universal_mcp/applications/twilio/app.py +14 -50
  86. universal_mcp/applications/twitter/api_segments/compliance_api.py +4 -14
  87. universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +6 -18
  88. universal_mcp/applications/twitter/api_segments/likes_api.py +1 -3
  89. universal_mcp/applications/twitter/api_segments/lists_api.py +5 -15
  90. universal_mcp/applications/twitter/api_segments/trends_api.py +1 -3
  91. universal_mcp/applications/twitter/api_segments/tweets_api.py +9 -31
  92. universal_mcp/applications/twitter/api_segments/usage_api.py +1 -5
  93. universal_mcp/applications/twitter/api_segments/users_api.py +14 -42
  94. universal_mcp/applications/whatsapp/app.py +35 -186
  95. universal_mcp/applications/whatsapp/audio.py +2 -6
  96. universal_mcp/applications/whatsapp/whatsapp.py +17 -51
  97. universal_mcp/applications/whatsapp_business/app.py +70 -283
  98. universal_mcp/applications/wrike/app.py +45 -118
  99. universal_mcp/applications/yahoo_finance/app.py +19 -65
  100. universal_mcp/applications/youtube/app.py +75 -261
  101. universal_mcp/applications/zenquotes/app.py +2 -2
  102. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/METADATA +2 -2
  103. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/RECORD +105 -106
  104. universal_mcp/applications/scraper/scraper_testers.py +0 -17
  105. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/WHEEL +0 -0
  106. {universal_mcp_applications-0.1.30rc1.dist-info → universal_mcp_applications-0.1.36rc1.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
33
  response = self._delete(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
53
  response = self._get(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
77
  response = self._get(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
98
  response = self._put(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
116
  response = self._put(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
 
@@ -150,7 +135,7 @@ class GoogleSearchconsoleApp(APIApplication):
150
135
  response = self._delete(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
 
@@ -169,7 +154,7 @@ class GoogleSearchconsoleApp(APIApplication):
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
 
@@ -184,11 +169,7 @@ class GoogleSearchconsoleApp(APIApplication):
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
192
  response = self._post(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,8 +261,7 @@ 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
-
264
+ request_body["type"] = search_type
298
265
  response = self._post(url, data=request_body)
299
266
  response.raise_for_status()
300
267
  return response.json()