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,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]