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,6 +1,5 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
2
|
from typing import Any, Literal
|
|
3
|
-
|
|
4
3
|
from fal_client import AsyncClient, AsyncRequestHandle, Status
|
|
5
4
|
from loguru import logger
|
|
6
5
|
from universal_mcp.applications.application import APIApplication
|
|
@@ -33,28 +32,15 @@ class FalaiApp(APIApplication):
|
|
|
33
32
|
if self._fal_client is None:
|
|
34
33
|
credentials = self.integration.get_credentials()
|
|
35
34
|
logger.info(f"Credentials: {credentials}")
|
|
36
|
-
api_key = (
|
|
37
|
-
credentials.get("api_key")
|
|
38
|
-
or credentials.get("API_KEY")
|
|
39
|
-
or credentials.get("apiKey")
|
|
40
|
-
)
|
|
35
|
+
api_key = credentials.get("api_key") or credentials.get("API_KEY") or credentials.get("apiKey")
|
|
41
36
|
if not api_key:
|
|
42
|
-
logger.error(
|
|
43
|
-
|
|
44
|
-
)
|
|
45
|
-
raise NotAuthorizedError(
|
|
46
|
-
"Integration returned empty or invalid API key."
|
|
47
|
-
)
|
|
37
|
+
logger.error(f"Integration {type(self.integration).__name__} returned credentials in unexpected format.")
|
|
38
|
+
raise NotAuthorizedError("Integration returned empty or invalid API key.")
|
|
48
39
|
self._fal_client = AsyncClient(key=api_key)
|
|
49
40
|
return self._fal_client
|
|
50
41
|
|
|
51
42
|
async def run(
|
|
52
|
-
self,
|
|
53
|
-
arguments: Any,
|
|
54
|
-
application: str = "fal-ai/flux/dev",
|
|
55
|
-
path: str = "",
|
|
56
|
-
timeout: float | None = None,
|
|
57
|
-
hint: str | None = None,
|
|
43
|
+
self, arguments: Any, application: str = "fal-ai/flux/dev", path: str = "", timeout: float | None = None, hint: str | None = None
|
|
58
44
|
) -> Any:
|
|
59
45
|
"""
|
|
60
46
|
Executes a Fal AI application synchronously, waiting for completion and returning the result directly. This method is suited for short-running tasks, unlike `submit` which queues a job for asynchronous processing and returns a request ID instead of the final output.
|
|
@@ -76,18 +62,10 @@ class FalaiApp(APIApplication):
|
|
|
76
62
|
run, execute, ai, synchronous, fal, important
|
|
77
63
|
"""
|
|
78
64
|
try:
|
|
79
|
-
result = await self.fal_client.run(
|
|
80
|
-
application=application,
|
|
81
|
-
arguments=arguments,
|
|
82
|
-
path=path,
|
|
83
|
-
timeout=timeout,
|
|
84
|
-
hint=hint,
|
|
85
|
-
)
|
|
65
|
+
result = await self.fal_client.run(application=application, arguments=arguments, path=path, timeout=timeout, hint=hint)
|
|
86
66
|
return result
|
|
87
67
|
except Exception as e:
|
|
88
|
-
logger.error(
|
|
89
|
-
f"Error running Fal application {application}: {e}", exc_info=True
|
|
90
|
-
)
|
|
68
|
+
logger.error(f"Error running Fal application {application}: {e}", exc_info=True)
|
|
91
69
|
raise ToolError(f"Failed to run Fal application {application}: {e}") from e
|
|
92
70
|
|
|
93
71
|
async def submit(
|
|
@@ -121,29 +99,15 @@ class FalaiApp(APIApplication):
|
|
|
121
99
|
"""
|
|
122
100
|
try:
|
|
123
101
|
handle: AsyncRequestHandle = await self.fal_client.submit(
|
|
124
|
-
application=application,
|
|
125
|
-
arguments=arguments,
|
|
126
|
-
path=path,
|
|
127
|
-
hint=hint,
|
|
128
|
-
webhook_url=webhook_url,
|
|
129
|
-
priority=priority,
|
|
102
|
+
application=application, arguments=arguments, path=path, hint=hint, webhook_url=webhook_url, priority=priority
|
|
130
103
|
)
|
|
131
104
|
request_id = handle.request_id
|
|
132
105
|
return request_id
|
|
133
106
|
except Exception as e:
|
|
134
|
-
logger.error(
|
|
135
|
-
|
|
136
|
-
)
|
|
137
|
-
raise ToolError(
|
|
138
|
-
f"Failed to submit Fal application {application}: {e}"
|
|
139
|
-
) from e
|
|
107
|
+
logger.error(f"Error submitting Fal application {application}: {e}", exc_info=True)
|
|
108
|
+
raise ToolError(f"Failed to submit Fal application {application}: {e}") from e
|
|
140
109
|
|
|
141
|
-
async def check_status(
|
|
142
|
-
self,
|
|
143
|
-
request_id: str,
|
|
144
|
-
application: str = "fal-ai/flux/dev",
|
|
145
|
-
with_logs: bool = False,
|
|
146
|
-
) -> Status:
|
|
110
|
+
async def check_status(self, request_id: str, application: str = "fal-ai/flux/dev", with_logs: bool = False) -> Status:
|
|
147
111
|
"""
|
|
148
112
|
Checks the execution state (e.g., Queued, InProgress) of an asynchronous Fal AI job using its request ID. It provides a non-blocking way to monitor jobs initiated via `submit` without fetching the final `result`, and can optionally include logs.
|
|
149
113
|
|
|
@@ -162,23 +126,14 @@ class FalaiApp(APIApplication):
|
|
|
162
126
|
status, check, async_job, monitoring, ai
|
|
163
127
|
"""
|
|
164
128
|
try:
|
|
165
|
-
handle = self.fal_client.get_handle(
|
|
166
|
-
application=application, request_id=request_id
|
|
167
|
-
)
|
|
129
|
+
handle = self.fal_client.get_handle(application=application, request_id=request_id)
|
|
168
130
|
status = await handle.status(with_logs=with_logs)
|
|
169
131
|
return status
|
|
170
132
|
except Exception as e:
|
|
171
|
-
logger.error(
|
|
172
|
-
|
|
173
|
-
exc_info=True,
|
|
174
|
-
)
|
|
175
|
-
raise ToolError(
|
|
176
|
-
f"Failed to get status for Fal request_id {request_id}: {e}"
|
|
177
|
-
) from e
|
|
133
|
+
logger.error(f"Error getting status for Fal request_id {request_id}: {e}", exc_info=True)
|
|
134
|
+
raise ToolError(f"Failed to get status for Fal request_id {request_id}: {e}") from e
|
|
178
135
|
|
|
179
|
-
async def get_result(
|
|
180
|
-
self, request_id: str, application: str = "fal-ai/flux/dev"
|
|
181
|
-
) -> Any:
|
|
136
|
+
async def get_result(self, request_id: str, application: str = "fal-ai/flux/dev") -> Any:
|
|
182
137
|
"""
|
|
183
138
|
Retrieves the final result of an asynchronous job, identified by its `request_id`. This function waits for the job, initiated via `submit`, to complete. Unlike the non-blocking `check_status`, this method blocks execution to fetch and return the job's actual output upon completion.
|
|
184
139
|
|
|
@@ -196,23 +151,14 @@ class FalaiApp(APIApplication):
|
|
|
196
151
|
result, async-job, status, wait, ai
|
|
197
152
|
"""
|
|
198
153
|
try:
|
|
199
|
-
handle = self.fal_client.get_handle(
|
|
200
|
-
application=application, request_id=request_id
|
|
201
|
-
)
|
|
154
|
+
handle = self.fal_client.get_handle(application=application, request_id=request_id)
|
|
202
155
|
result = await handle.get()
|
|
203
156
|
return result
|
|
204
157
|
except Exception as e:
|
|
205
|
-
logger.error(
|
|
206
|
-
|
|
207
|
-
exc_info=True,
|
|
208
|
-
)
|
|
209
|
-
raise ToolError(
|
|
210
|
-
f"Failed to get result for Fal request_id {request_id}: {e}"
|
|
211
|
-
) from e
|
|
158
|
+
logger.error(f"Error getting result for Fal request_id {request_id}: {e}", exc_info=True)
|
|
159
|
+
raise ToolError(f"Failed to get result for Fal request_id {request_id}: {e}") from e
|
|
212
160
|
|
|
213
|
-
async def cancel(
|
|
214
|
-
self, request_id: str, application: str = "fal-ai/flux/dev"
|
|
215
|
-
) -> None:
|
|
161
|
+
async def cancel(self, request_id: str, application: str = "fal-ai/flux/dev") -> None:
|
|
216
162
|
"""
|
|
217
163
|
Asynchronously cancels a running or queued Fal AI job using its `request_id`. This function complements the `submit` method, providing a way to terminate asynchronous tasks before completion. It raises a `ToolError` if the cancellation request fails.
|
|
218
164
|
|
|
@@ -230,15 +176,11 @@ class FalaiApp(APIApplication):
|
|
|
230
176
|
cancel, async_job, ai, fal, management
|
|
231
177
|
"""
|
|
232
178
|
try:
|
|
233
|
-
handle = self.fal_client.get_handle(
|
|
234
|
-
application=application, request_id=request_id
|
|
235
|
-
)
|
|
179
|
+
handle = self.fal_client.get_handle(application=application, request_id=request_id)
|
|
236
180
|
await handle.cancel()
|
|
237
181
|
return None
|
|
238
182
|
except Exception as e:
|
|
239
|
-
logger.error(
|
|
240
|
-
f"Error cancelling Fal request_id {request_id}: {e}", exc_info=True
|
|
241
|
-
)
|
|
183
|
+
logger.error(f"Error cancelling Fal request_id {request_id}: {e}", exc_info=True)
|
|
242
184
|
raise ToolError(f"Failed to cancel Fal request_id {request_id}: {e}") from e
|
|
243
185
|
|
|
244
186
|
async def upload_file(self, path: str) -> str:
|
|
@@ -301,34 +243,15 @@ class FalaiApp(APIApplication):
|
|
|
301
243
|
generate, image, ai, async, important, flux, customizable, default
|
|
302
244
|
"""
|
|
303
245
|
application = "fal-ai/flux/dev"
|
|
304
|
-
arguments = {
|
|
305
|
-
"prompt": prompt,
|
|
306
|
-
"seed": seed,
|
|
307
|
-
"image_size": image_size,
|
|
308
|
-
"num_images": num_images,
|
|
309
|
-
}
|
|
246
|
+
arguments = {"prompt": prompt, "seed": seed, "image_size": image_size, "num_images": num_images}
|
|
310
247
|
if extra_arguments:
|
|
311
248
|
arguments.update(extra_arguments)
|
|
312
249
|
logger.debug(f"Merged extra_arguments. Final arguments: {arguments}")
|
|
313
250
|
try:
|
|
314
|
-
result = await self.run(
|
|
315
|
-
application=application,
|
|
316
|
-
arguments=arguments,
|
|
317
|
-
path=path,
|
|
318
|
-
timeout=timeout,
|
|
319
|
-
hint=hint,
|
|
320
|
-
)
|
|
251
|
+
result = await self.run(application=application, arguments=arguments, path=path, timeout=timeout, hint=hint)
|
|
321
252
|
return result
|
|
322
253
|
except Exception:
|
|
323
254
|
raise
|
|
324
255
|
|
|
325
256
|
def list_tools(self) -> list[callable]:
|
|
326
|
-
return [
|
|
327
|
-
self.run,
|
|
328
|
-
self.submit,
|
|
329
|
-
self.check_status,
|
|
330
|
-
self.get_result,
|
|
331
|
-
self.cancel,
|
|
332
|
-
self.upload_file,
|
|
333
|
-
self.run_image_generation,
|
|
334
|
-
]
|
|
257
|
+
return [self.run, self.submit, self.check_status, self.get_result, self.cancel, self.upload_file, self.run_image_generation]
|