universal-mcp-applications 0.1.30__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.
- universal_mcp/applications/ahrefs/app.py +52 -198
- universal_mcp/applications/airtable/app.py +23 -122
- universal_mcp/applications/apollo/app.py +111 -464
- universal_mcp/applications/asana/app.py +417 -1567
- universal_mcp/applications/aws_s3/app.py +33 -100
- universal_mcp/applications/bill/app.py +546 -1957
- universal_mcp/applications/box/app.py +1068 -3981
- universal_mcp/applications/braze/app.py +364 -1430
- universal_mcp/applications/browser_use/app.py +2 -8
- universal_mcp/applications/cal_com_v2/app.py +207 -625
- universal_mcp/applications/calendly/app.py +61 -200
- universal_mcp/applications/canva/app.py +45 -110
- universal_mcp/applications/clickup/app.py +207 -674
- universal_mcp/applications/coda/app.py +146 -426
- universal_mcp/applications/confluence/app.py +310 -1098
- universal_mcp/applications/contentful/app.py +36 -151
- universal_mcp/applications/crustdata/app.py +28 -107
- universal_mcp/applications/dialpad/app.py +283 -756
- universal_mcp/applications/digitalocean/app.py +1766 -5777
- universal_mcp/applications/domain_checker/app.py +3 -54
- universal_mcp/applications/e2b/app.py +14 -64
- universal_mcp/applications/elevenlabs/app.py +9 -47
- universal_mcp/applications/exa/app.py +6 -17
- universal_mcp/applications/falai/app.py +23 -100
- universal_mcp/applications/figma/app.py +53 -137
- universal_mcp/applications/file_system/app.py +2 -13
- universal_mcp/applications/firecrawl/app.py +51 -152
- universal_mcp/applications/fireflies/app.py +59 -281
- universal_mcp/applications/fpl/app.py +91 -528
- universal_mcp/applications/fpl/utils/fixtures.py +15 -49
- universal_mcp/applications/fpl/utils/helper.py +25 -89
- universal_mcp/applications/fpl/utils/league_utils.py +20 -64
- universal_mcp/applications/ghost_content/app.py +52 -161
- universal_mcp/applications/github/app.py +19 -56
- universal_mcp/applications/gong/app.py +88 -248
- universal_mcp/applications/google_calendar/app.py +16 -68
- universal_mcp/applications/google_docs/app.py +88 -188
- universal_mcp/applications/google_drive/app.py +140 -462
- universal_mcp/applications/google_gemini/app.py +12 -64
- universal_mcp/applications/google_mail/app.py +28 -157
- universal_mcp/applications/google_searchconsole/app.py +15 -48
- universal_mcp/applications/google_sheet/app.py +101 -578
- universal_mcp/applications/google_sheet/helper.py +10 -37
- universal_mcp/applications/hashnode/app.py +57 -269
- universal_mcp/applications/heygen/app.py +44 -122
- universal_mcp/applications/http_tools/app.py +10 -32
- universal_mcp/applications/hubspot/api_segments/crm_api.py +460 -1573
- universal_mcp/applications/hubspot/api_segments/marketing_api.py +74 -262
- universal_mcp/applications/hubspot/app.py +23 -87
- universal_mcp/applications/jira/app.py +2071 -7986
- universal_mcp/applications/klaviyo/app.py +494 -1376
- universal_mcp/applications/linkedin/README.md +9 -2
- universal_mcp/applications/linkedin/app.py +392 -212
- universal_mcp/applications/mailchimp/app.py +450 -1605
- universal_mcp/applications/markitdown/app.py +8 -20
- universal_mcp/applications/miro/app.py +217 -699
- universal_mcp/applications/ms_teams/app.py +64 -186
- universal_mcp/applications/neon/app.py +86 -192
- universal_mcp/applications/notion/app.py +21 -36
- universal_mcp/applications/onedrive/app.py +14 -36
- universal_mcp/applications/openai/app.py +42 -165
- universal_mcp/applications/outlook/app.py +16 -76
- universal_mcp/applications/perplexity/app.py +4 -19
- universal_mcp/applications/pipedrive/app.py +832 -3142
- universal_mcp/applications/posthog/app.py +163 -432
- universal_mcp/applications/reddit/app.py +40 -139
- universal_mcp/applications/resend/app.py +41 -107
- universal_mcp/applications/retell/app.py +14 -41
- universal_mcp/applications/rocketlane/app.py +221 -934
- universal_mcp/applications/scraper/README.md +7 -4
- universal_mcp/applications/scraper/app.py +216 -102
- universal_mcp/applications/semanticscholar/app.py +22 -64
- universal_mcp/applications/semrush/app.py +43 -77
- universal_mcp/applications/sendgrid/app.py +512 -1262
- universal_mcp/applications/sentry/app.py +271 -906
- universal_mcp/applications/serpapi/app.py +40 -143
- universal_mcp/applications/sharepoint/app.py +15 -37
- universal_mcp/applications/shopify/app.py +1551 -4287
- universal_mcp/applications/shortcut/app.py +155 -417
- universal_mcp/applications/slack/app.py +50 -101
- universal_mcp/applications/spotify/app.py +126 -325
- universal_mcp/applications/supabase/app.py +104 -213
- universal_mcp/applications/tavily/app.py +1 -1
- universal_mcp/applications/trello/app.py +693 -2656
- universal_mcp/applications/twilio/app.py +14 -50
- universal_mcp/applications/twitter/api_segments/compliance_api.py +4 -14
- universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +6 -18
- universal_mcp/applications/twitter/api_segments/likes_api.py +1 -3
- universal_mcp/applications/twitter/api_segments/lists_api.py +5 -15
- universal_mcp/applications/twitter/api_segments/trends_api.py +1 -3
- universal_mcp/applications/twitter/api_segments/tweets_api.py +9 -31
- universal_mcp/applications/twitter/api_segments/usage_api.py +1 -5
- universal_mcp/applications/twitter/api_segments/users_api.py +14 -42
- universal_mcp/applications/whatsapp/app.py +35 -186
- universal_mcp/applications/whatsapp/audio.py +2 -6
- universal_mcp/applications/whatsapp/whatsapp.py +17 -51
- universal_mcp/applications/whatsapp_business/app.py +70 -283
- universal_mcp/applications/wrike/app.py +45 -118
- universal_mcp/applications/yahoo_finance/app.py +19 -65
- universal_mcp/applications/youtube/app.py +75 -261
- universal_mcp/applications/zenquotes/app.py +2 -2
- {universal_mcp_applications-0.1.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/METADATA +2 -2
- {universal_mcp_applications-0.1.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/RECORD +105 -105
- {universal_mcp_applications-0.1.30.dist-info → universal_mcp_applications-0.1.36rc1.dist-info}/WHEEL +0 -0
- {universal_mcp_applications-0.1.30.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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
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()
|