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,5 +1,4 @@
1
1
  from typing import Any
2
-
3
2
  import yfinance as yf
4
3
  from universal_mcp.applications.application import APIApplication
5
4
  from universal_mcp.integrations import Integration
@@ -14,7 +13,7 @@ class YahooFinanceApp(APIApplication):
14
13
  def __init__(self, integration: Integration | None = None, **kwargs) -> None:
15
14
  super().__init__(name="yahoo_finance", integration=integration, **kwargs)
16
15
 
17
- def get_stock_info(self, symbol: str) -> dict[str, Any]:
16
+ async def get_stock_info(self, symbol: str) -> dict[str, Any]:
18
17
  """
19
18
  Gets real-time stock information including current price, market cap, financial ratios, and company details.
20
19
 
@@ -34,23 +33,15 @@ class YahooFinanceApp(APIApplication):
34
33
  """
35
34
  if not symbol:
36
35
  raise ValueError("Stock symbol cannot be empty")
37
-
38
36
  symbol = symbol.upper().strip()
39
37
  ticker = yf.Ticker(symbol)
40
-
41
38
  info = ticker.info
42
39
  if not info or info.get("regularMarketPrice") is None:
43
40
  raise KeyError(f"Stock symbol '{symbol}' not found or invalid")
44
-
45
41
  return info
46
42
 
47
- def get_stock_history(
48
- self,
49
- symbol: str,
50
- period: str = "1mo",
51
- interval: str = "1d",
52
- start_date: str | None = None,
53
- end_date: str | None = None,
43
+ async def get_stock_history(
44
+ self, symbol: str, period: str = "1mo", interval: str = "1d", start_date: str | None = None, end_date: str | None = None
54
45
  ) -> dict:
55
46
  """
56
47
  Gets historical price data for a stock with OHLCV data, dividends, and stock splits.
@@ -70,21 +61,16 @@ class YahooFinanceApp(APIApplication):
70
61
  """
71
62
  if not symbol:
72
63
  raise ValueError("Stock symbol cannot be empty")
73
-
74
64
  symbol = symbol.upper().strip()
75
65
  ticker = yf.Ticker(symbol)
76
-
77
- df = ticker.history(
78
- period=period, interval=interval, start=start_date, end=end_date
79
- )
80
-
66
+ df = ticker.history(period=period, interval=interval, start=start_date, end=end_date)
81
67
  try:
82
- data = df.to_dict("index") # type: ignore
68
+ data = df.to_dict("index")
83
69
  if data:
84
70
  converted_data = {}
85
71
  for key, value in data.items():
86
- if hasattr(key, 'strftime'):
87
- converted_key = key.strftime('%Y-%m-%d')
72
+ if hasattr(key, "strftime"):
73
+ converted_key = key.strftime("%Y-%m-%d")
88
74
  else:
89
75
  converted_key = str(key)
90
76
  converted_data[converted_key] = value
@@ -93,7 +79,7 @@ class YahooFinanceApp(APIApplication):
93
79
  except:
94
80
  return {}
95
81
 
96
- def get_stock_news(self, symbol: str, limit: int = 10) -> list[Any]:
82
+ async def get_stock_news(self, symbol: str, limit: int = 10) -> list[Any]:
97
83
  """
98
84
  Gets latest news articles for a stock from Yahoo Finance.
99
85
 
@@ -109,16 +95,12 @@ class YahooFinanceApp(APIApplication):
109
95
  """
110
96
  if not symbol:
111
97
  raise ValueError("Stock symbol cannot be empty")
112
-
113
98
  symbol = symbol.upper().strip()
114
99
  ticker = yf.Ticker(symbol)
115
-
116
100
  news = ticker.news
117
101
  return news[:limit] if news else []
118
102
 
119
- def get_financial_statements(
120
- self, symbol: str, statement_type: str = "income"
121
- ) -> dict:
103
+ async def get_financial_statements(self, symbol: str, statement_type: str = "income") -> dict:
122
104
  """
123
105
  Gets financial statements for a stock from Yahoo Finance.
124
106
 
@@ -134,10 +116,8 @@ class YahooFinanceApp(APIApplication):
134
116
  """
135
117
  if not symbol:
136
118
  raise ValueError("Stock symbol cannot be empty")
137
-
138
119
  symbol = symbol.upper().strip()
139
120
  ticker = yf.Ticker(symbol)
140
-
141
121
  if statement_type == "income":
142
122
  df = ticker.income_stmt
143
123
  elif statement_type == "balance":
@@ -148,14 +128,13 @@ class YahooFinanceApp(APIApplication):
148
128
  df = ticker.earnings
149
129
  else:
150
130
  df = ticker.income_stmt
151
-
152
131
  try:
153
- data = df.to_dict("dict") # type: ignore
132
+ data = df.to_dict("dict")
154
133
  if data:
155
134
  converted_data = {}
156
135
  for key, value in data.items():
157
- if hasattr(key, 'strftime'):
158
- converted_key = key.strftime('%Y-%m-%d')
136
+ if hasattr(key, "strftime"):
137
+ converted_key = key.strftime("%Y-%m-%d")
159
138
  else:
160
139
  converted_key = str(key)
161
140
  converted_data[converted_key] = value
@@ -164,9 +143,7 @@ class YahooFinanceApp(APIApplication):
164
143
  except:
165
144
  return {}
166
145
 
167
- def get_stock_recommendations(
168
- self, symbol: str, rec_type: str = "recommendations"
169
- ) -> list[dict]:
146
+ async def get_stock_recommendations(self, symbol: str, rec_type: str = "recommendations") -> list[dict]:
170
147
  """
171
148
  Gets analyst recommendations for a stock from Yahoo Finance.
172
149
 
@@ -182,27 +159,18 @@ class YahooFinanceApp(APIApplication):
182
159
  """
183
160
  if not symbol:
184
161
  raise ValueError("Stock symbol cannot be empty")
185
-
186
162
  symbol = symbol.upper().strip()
187
163
  ticker = yf.Ticker(symbol)
188
-
189
164
  if rec_type == "upgrades_downgrades":
190
165
  df = ticker.upgrades_downgrades
191
166
  else:
192
167
  df = ticker.recommendations
193
-
194
168
  try:
195
- return df.to_dict("records") # type: ignore
169
+ return df.to_dict("records")
196
170
  except:
197
171
  return []
198
172
 
199
- def search(
200
- self,
201
- query: str,
202
- max_results: int = 10,
203
- news_count: int = 5,
204
- include_research: bool = False,
205
- ) -> dict[str, Any]:
173
+ async def search(self, query: str, max_results: int = 10, news_count: int = 5, include_research: bool = False) -> dict[str, Any]:
206
174
  """
207
175
  Search Yahoo Finance for quotes, news, and research using yfinance Search.
208
176
 
@@ -220,14 +188,7 @@ class YahooFinanceApp(APIApplication):
220
188
  """
221
189
  if not query:
222
190
  raise ValueError("Search query cannot be empty")
223
-
224
- search = yf.Search(
225
- query,
226
- max_results=max_results,
227
- news_count=news_count,
228
- include_research=include_research,
229
- )
230
-
191
+ search = yf.Search(query, max_results=max_results, news_count=news_count, include_research=include_research)
231
192
  result = {}
232
193
  for attr in dir(search):
233
194
  if not attr.startswith("_"):
@@ -237,12 +198,9 @@ class YahooFinanceApp(APIApplication):
237
198
  result[attr] = value
238
199
  except:
239
200
  continue
240
-
241
201
  return result
242
202
 
243
- def lookup_ticker(
244
- self, query: str, lookup_type: str = "all", count: int = 25
245
- ) -> list[dict]:
203
+ async def lookup_ticker(self, query: str, lookup_type: str = "all", count: int = 25) -> list[dict]:
246
204
  """
247
205
  Look up ticker symbols by type using yfinance Lookup.
248
206
 
@@ -259,10 +217,8 @@ class YahooFinanceApp(APIApplication):
259
217
  """
260
218
  if not query:
261
219
  raise ValueError("Lookup query cannot be empty")
262
-
263
220
  try:
264
221
  lookup = yf.Lookup(query)
265
-
266
222
  if lookup_type == "stock":
267
223
  results = lookup.get_stock(count=count)
268
224
  elif lookup_type == "mutualfund":
@@ -277,14 +233,12 @@ class YahooFinanceApp(APIApplication):
277
233
  results = lookup.get_currency(count=count)
278
234
  elif lookup_type == "cryptocurrency":
279
235
  results = lookup.get_cryptocurrency(count=count)
280
- else: # default to 'all'
236
+ else:
281
237
  results = lookup.get_all(count=count)
282
-
283
238
  try:
284
- return results.to_dict("records") # type: ignore
239
+ return results.to_dict("records")
285
240
  except:
286
241
  return []
287
-
288
242
  except Exception as e:
289
243
  return [{"query": query, "error": f"Lookup failed: {str(e)}"}]
290
244