universal-mcp-applications 0.1.33__py3-none-any.whl → 0.1.39rc16__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 (119) hide show
  1. universal_mcp/applications/BEST_PRACTICES.md +1 -1
  2. universal_mcp/applications/ahrefs/app.py +92 -238
  3. universal_mcp/applications/airtable/app.py +36 -135
  4. universal_mcp/applications/apollo/app.py +124 -477
  5. universal_mcp/applications/asana/app.py +605 -1755
  6. universal_mcp/applications/aws_s3/app.py +63 -119
  7. universal_mcp/applications/bill/app.py +644 -2055
  8. universal_mcp/applications/box/app.py +1246 -4159
  9. universal_mcp/applications/braze/app.py +410 -1476
  10. universal_mcp/applications/browser_use/README.md +15 -1
  11. universal_mcp/applications/browser_use/__init__.py +1 -0
  12. universal_mcp/applications/browser_use/app.py +91 -26
  13. universal_mcp/applications/cal_com_v2/app.py +207 -625
  14. universal_mcp/applications/calendly/app.py +103 -242
  15. universal_mcp/applications/canva/app.py +75 -140
  16. universal_mcp/applications/clickup/app.py +331 -798
  17. universal_mcp/applications/coda/app.py +240 -520
  18. universal_mcp/applications/confluence/app.py +497 -1285
  19. universal_mcp/applications/contentful/app.py +40 -155
  20. universal_mcp/applications/crustdata/app.py +44 -123
  21. universal_mcp/applications/dialpad/app.py +451 -924
  22. universal_mcp/applications/digitalocean/app.py +2071 -6082
  23. universal_mcp/applications/domain_checker/app.py +3 -54
  24. universal_mcp/applications/e2b/app.py +17 -68
  25. universal_mcp/applications/elevenlabs/README.md +27 -3
  26. universal_mcp/applications/elevenlabs/app.py +741 -74
  27. universal_mcp/applications/exa/README.md +8 -4
  28. universal_mcp/applications/exa/app.py +415 -186
  29. universal_mcp/applications/falai/README.md +5 -7
  30. universal_mcp/applications/falai/app.py +156 -232
  31. universal_mcp/applications/figma/app.py +91 -175
  32. universal_mcp/applications/file_system/app.py +2 -13
  33. universal_mcp/applications/firecrawl/app.py +198 -176
  34. universal_mcp/applications/fireflies/app.py +59 -281
  35. universal_mcp/applications/fpl/app.py +92 -529
  36. universal_mcp/applications/fpl/utils/fixtures.py +15 -49
  37. universal_mcp/applications/fpl/utils/helper.py +25 -89
  38. universal_mcp/applications/fpl/utils/league_utils.py +20 -64
  39. universal_mcp/applications/ghost_content/app.py +70 -179
  40. universal_mcp/applications/github/app.py +30 -67
  41. universal_mcp/applications/gong/app.py +142 -302
  42. universal_mcp/applications/google_calendar/app.py +26 -78
  43. universal_mcp/applications/google_docs/README.md +15 -14
  44. universal_mcp/applications/google_docs/app.py +103 -206
  45. universal_mcp/applications/google_drive/app.py +194 -793
  46. universal_mcp/applications/google_gemini/app.py +68 -59
  47. universal_mcp/applications/google_mail/README.md +1 -0
  48. universal_mcp/applications/google_mail/app.py +93 -214
  49. universal_mcp/applications/google_searchconsole/app.py +25 -58
  50. universal_mcp/applications/google_sheet/README.md +2 -1
  51. universal_mcp/applications/google_sheet/app.py +226 -624
  52. universal_mcp/applications/google_sheet/helper.py +26 -53
  53. universal_mcp/applications/hashnode/app.py +57 -269
  54. universal_mcp/applications/heygen/README.md +10 -32
  55. universal_mcp/applications/heygen/app.py +339 -811
  56. universal_mcp/applications/http_tools/app.py +10 -32
  57. universal_mcp/applications/hubspot/README.md +1 -1
  58. universal_mcp/applications/hubspot/app.py +7508 -99
  59. universal_mcp/applications/jira/app.py +2419 -8334
  60. universal_mcp/applications/klaviyo/app.py +739 -1621
  61. universal_mcp/applications/linkedin/README.md +18 -1
  62. universal_mcp/applications/linkedin/app.py +729 -251
  63. universal_mcp/applications/mailchimp/app.py +696 -1851
  64. universal_mcp/applications/markitdown/app.py +8 -20
  65. universal_mcp/applications/miro/app.py +333 -815
  66. universal_mcp/applications/ms_teams/app.py +420 -1407
  67. universal_mcp/applications/neon/app.py +144 -250
  68. universal_mcp/applications/notion/app.py +38 -53
  69. universal_mcp/applications/onedrive/app.py +26 -48
  70. universal_mcp/applications/openai/app.py +43 -166
  71. universal_mcp/applications/outlook/README.md +22 -9
  72. universal_mcp/applications/outlook/app.py +403 -141
  73. universal_mcp/applications/perplexity/README.md +2 -1
  74. universal_mcp/applications/perplexity/app.py +161 -20
  75. universal_mcp/applications/pipedrive/app.py +1021 -3331
  76. universal_mcp/applications/posthog/app.py +272 -541
  77. universal_mcp/applications/reddit/app.py +65 -164
  78. universal_mcp/applications/resend/app.py +72 -139
  79. universal_mcp/applications/retell/app.py +23 -50
  80. universal_mcp/applications/rocketlane/app.py +252 -965
  81. universal_mcp/applications/scraper/app.py +114 -142
  82. universal_mcp/applications/semanticscholar/app.py +36 -78
  83. universal_mcp/applications/semrush/app.py +44 -78
  84. universal_mcp/applications/sendgrid/app.py +826 -1576
  85. universal_mcp/applications/sentry/app.py +444 -1079
  86. universal_mcp/applications/serpapi/app.py +44 -146
  87. universal_mcp/applications/sharepoint/app.py +27 -49
  88. universal_mcp/applications/shopify/app.py +1748 -4486
  89. universal_mcp/applications/shortcut/app.py +275 -536
  90. universal_mcp/applications/slack/app.py +43 -125
  91. universal_mcp/applications/spotify/app.py +206 -405
  92. universal_mcp/applications/supabase/app.py +174 -283
  93. universal_mcp/applications/tavily/app.py +2 -2
  94. universal_mcp/applications/trello/app.py +853 -2816
  95. universal_mcp/applications/twilio/app.py +27 -62
  96. universal_mcp/applications/twitter/api_segments/compliance_api.py +4 -14
  97. universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +6 -18
  98. universal_mcp/applications/twitter/api_segments/likes_api.py +1 -3
  99. universal_mcp/applications/twitter/api_segments/lists_api.py +5 -15
  100. universal_mcp/applications/twitter/api_segments/trends_api.py +1 -3
  101. universal_mcp/applications/twitter/api_segments/tweets_api.py +9 -31
  102. universal_mcp/applications/twitter/api_segments/usage_api.py +1 -5
  103. universal_mcp/applications/twitter/api_segments/users_api.py +14 -42
  104. universal_mcp/applications/whatsapp/app.py +35 -186
  105. universal_mcp/applications/whatsapp/audio.py +2 -6
  106. universal_mcp/applications/whatsapp/whatsapp.py +17 -51
  107. universal_mcp/applications/whatsapp_business/app.py +86 -299
  108. universal_mcp/applications/wrike/app.py +80 -153
  109. universal_mcp/applications/yahoo_finance/app.py +19 -65
  110. universal_mcp/applications/youtube/app.py +120 -306
  111. universal_mcp/applications/zenquotes/app.py +3 -3
  112. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc16.dist-info}/METADATA +4 -2
  113. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc16.dist-info}/RECORD +115 -119
  114. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc16.dist-info}/WHEEL +1 -1
  115. universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
  116. universal_mcp/applications/hubspot/api_segments/api_segment_base.py +0 -54
  117. universal_mcp/applications/hubspot/api_segments/crm_api.py +0 -7337
  118. universal_mcp/applications/hubspot/api_segments/marketing_api.py +0 -1467
  119. {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc16.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