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.
- universal_mcp/applications/BEST_PRACTICES.md +1 -1
- universal_mcp/applications/ahrefs/app.py +92 -238
- universal_mcp/applications/airtable/app.py +36 -135
- universal_mcp/applications/apollo/app.py +124 -477
- universal_mcp/applications/asana/app.py +605 -1755
- universal_mcp/applications/aws_s3/app.py +63 -119
- universal_mcp/applications/bill/app.py +644 -2055
- universal_mcp/applications/box/app.py +1246 -4159
- universal_mcp/applications/braze/app.py +410 -1476
- universal_mcp/applications/browser_use/README.md +15 -1
- universal_mcp/applications/browser_use/__init__.py +1 -0
- universal_mcp/applications/browser_use/app.py +91 -26
- universal_mcp/applications/cal_com_v2/app.py +207 -625
- universal_mcp/applications/calendly/app.py +103 -242
- universal_mcp/applications/canva/app.py +75 -140
- universal_mcp/applications/clickup/app.py +331 -798
- universal_mcp/applications/coda/app.py +240 -520
- universal_mcp/applications/confluence/app.py +497 -1285
- universal_mcp/applications/contentful/app.py +40 -155
- universal_mcp/applications/crustdata/app.py +44 -123
- universal_mcp/applications/dialpad/app.py +451 -924
- universal_mcp/applications/digitalocean/app.py +2071 -6082
- universal_mcp/applications/domain_checker/app.py +3 -54
- universal_mcp/applications/e2b/app.py +17 -68
- universal_mcp/applications/elevenlabs/README.md +27 -3
- universal_mcp/applications/elevenlabs/app.py +741 -74
- universal_mcp/applications/exa/README.md +8 -4
- universal_mcp/applications/exa/app.py +415 -186
- universal_mcp/applications/falai/README.md +5 -7
- universal_mcp/applications/falai/app.py +156 -232
- universal_mcp/applications/figma/app.py +91 -175
- universal_mcp/applications/file_system/app.py +2 -13
- universal_mcp/applications/firecrawl/app.py +198 -176
- universal_mcp/applications/fireflies/app.py +59 -281
- universal_mcp/applications/fpl/app.py +92 -529
- 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 +70 -179
- universal_mcp/applications/github/app.py +30 -67
- universal_mcp/applications/gong/app.py +142 -302
- universal_mcp/applications/google_calendar/app.py +26 -78
- universal_mcp/applications/google_docs/README.md +15 -14
- universal_mcp/applications/google_docs/app.py +103 -206
- universal_mcp/applications/google_drive/app.py +194 -793
- universal_mcp/applications/google_gemini/app.py +68 -59
- universal_mcp/applications/google_mail/README.md +1 -0
- universal_mcp/applications/google_mail/app.py +93 -214
- universal_mcp/applications/google_searchconsole/app.py +25 -58
- universal_mcp/applications/google_sheet/README.md +2 -1
- universal_mcp/applications/google_sheet/app.py +226 -624
- universal_mcp/applications/google_sheet/helper.py +26 -53
- universal_mcp/applications/hashnode/app.py +57 -269
- universal_mcp/applications/heygen/README.md +10 -32
- universal_mcp/applications/heygen/app.py +339 -811
- universal_mcp/applications/http_tools/app.py +10 -32
- universal_mcp/applications/hubspot/README.md +1 -1
- universal_mcp/applications/hubspot/app.py +7508 -99
- universal_mcp/applications/jira/app.py +2419 -8334
- universal_mcp/applications/klaviyo/app.py +739 -1621
- universal_mcp/applications/linkedin/README.md +18 -1
- universal_mcp/applications/linkedin/app.py +729 -251
- universal_mcp/applications/mailchimp/app.py +696 -1851
- universal_mcp/applications/markitdown/app.py +8 -20
- universal_mcp/applications/miro/app.py +333 -815
- universal_mcp/applications/ms_teams/app.py +420 -1407
- universal_mcp/applications/neon/app.py +144 -250
- universal_mcp/applications/notion/app.py +38 -53
- universal_mcp/applications/onedrive/app.py +26 -48
- universal_mcp/applications/openai/app.py +43 -166
- universal_mcp/applications/outlook/README.md +22 -9
- universal_mcp/applications/outlook/app.py +403 -141
- universal_mcp/applications/perplexity/README.md +2 -1
- universal_mcp/applications/perplexity/app.py +161 -20
- universal_mcp/applications/pipedrive/app.py +1021 -3331
- universal_mcp/applications/posthog/app.py +272 -541
- universal_mcp/applications/reddit/app.py +65 -164
- universal_mcp/applications/resend/app.py +72 -139
- universal_mcp/applications/retell/app.py +23 -50
- universal_mcp/applications/rocketlane/app.py +252 -965
- universal_mcp/applications/scraper/app.py +114 -142
- universal_mcp/applications/semanticscholar/app.py +36 -78
- universal_mcp/applications/semrush/app.py +44 -78
- universal_mcp/applications/sendgrid/app.py +826 -1576
- universal_mcp/applications/sentry/app.py +444 -1079
- universal_mcp/applications/serpapi/app.py +44 -146
- universal_mcp/applications/sharepoint/app.py +27 -49
- universal_mcp/applications/shopify/app.py +1748 -4486
- universal_mcp/applications/shortcut/app.py +275 -536
- universal_mcp/applications/slack/app.py +43 -125
- universal_mcp/applications/spotify/app.py +206 -405
- universal_mcp/applications/supabase/app.py +174 -283
- universal_mcp/applications/tavily/app.py +2 -2
- universal_mcp/applications/trello/app.py +853 -2816
- universal_mcp/applications/twilio/app.py +27 -62
- 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 +86 -299
- universal_mcp/applications/wrike/app.py +80 -153
- universal_mcp/applications/yahoo_finance/app.py +19 -65
- universal_mcp/applications/youtube/app.py +120 -306
- universal_mcp/applications/zenquotes/app.py +3 -3
- {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc16.dist-info}/METADATA +4 -2
- {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc16.dist-info}/RECORD +115 -119
- {universal_mcp_applications-0.1.33.dist-info → universal_mcp_applications-0.1.39rc16.dist-info}/WHEEL +1 -1
- universal_mcp/applications/hubspot/api_segments/__init__.py +0 -0
- universal_mcp/applications/hubspot/api_segments/api_segment_base.py +0 -54
- universal_mcp/applications/hubspot/api_segments/crm_api.py +0 -7337
- universal_mcp/applications/hubspot/api_segments/marketing_api.py +0 -1467
- {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")
|
|
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,
|
|
87
|
-
converted_key = key.strftime(
|
|
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")
|
|
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,
|
|
158
|
-
converted_key = key.strftime(
|
|
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")
|
|
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:
|
|
236
|
+
else:
|
|
281
237
|
results = lookup.get_all(count=count)
|
|
282
|
-
|
|
283
238
|
try:
|
|
284
|
-
return results.to_dict("records")
|
|
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
|
|