universal-mcp-applications 0.1.30rc2__py3-none-any.whl → 0.1.36rc2__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.
Files changed (105) 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 +36 -103
  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 +24 -101
  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 +141 -463
  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 +103 -580
  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 +9 -2
  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 +16 -38
  61. universal_mcp/applications/openai/app.py +42 -165
  62. universal_mcp/applications/outlook/app.py +24 -84
  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 +216 -102
  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 +17 -39
  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.30rc2.dist-info → universal_mcp_applications-0.1.36rc2.dist-info}/METADATA +2 -2
  103. {universal_mcp_applications-0.1.30rc2.dist-info → universal_mcp_applications-0.1.36rc2.dist-info}/RECORD +105 -105
  104. {universal_mcp_applications-0.1.30rc2.dist-info → universal_mcp_applications-0.1.36rc2.dist-info}/WHEEL +0 -0
  105. {universal_mcp_applications-0.1.30rc2.dist-info → universal_mcp_applications-0.1.36rc2.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
- f"Integration {type(self.integration).__name__} returned credentials in unexpected format."
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
- f"Error submitting Fal application {application}: {e}", exc_info=True
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
- f"Error getting status for Fal request_id {request_id}: {e}",
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
- f"Error getting result for Fal request_id {request_id}: {e}",
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
- 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
- ]
256
+ def list_tools(self):
257
+ return [self.run, self.submit, self.check_status, self.get_result, self.cancel, self.upload_file, self.run_image_generation]