universal-mcp-applications 0.1.19__py3-none-any.whl → 0.1.21__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.

@@ -0,0 +1,258 @@
1
+ import yfinance as yf
2
+ from typing import Any
3
+ from universal_mcp.applications.application import APIApplication
4
+ from universal_mcp.integrations import Integration
5
+
6
+
7
+ class YahooFinanceApp(APIApplication):
8
+ """
9
+ Application for interacting with Yahoo Finance data using yfinance library.
10
+ Provides tools to retrieve stock information, historical data, news, and financial statements.
11
+ """
12
+
13
+ def __init__(self, integration: Integration | None = None, **kwargs) -> None:
14
+ super().__init__(name="yahoo_finance", integration=integration, **kwargs)
15
+
16
+ def get_stock_info(self, symbol: str) -> dict[str, Any]:
17
+ """
18
+ Gets real-time stock information including current price, market cap, financial ratios, and company details.
19
+
20
+ Args:
21
+ symbol: Stock ticker symbol (e.g., 'AAPL', 'GOOGL', 'MSFT')
22
+
23
+ Returns:
24
+ Complete dictionary with all available stock data fields from Yahoo Finance
25
+
26
+ Raises:
27
+ ValueError: Invalid or empty symbol
28
+ KeyError: Stock symbol not found
29
+ ConnectionError: Network or API issues
30
+
31
+ Tags:
32
+ stock, info, real-time, price, financials, company-data, important
33
+ """
34
+ if not symbol:
35
+ raise ValueError("Stock symbol cannot be empty")
36
+
37
+ symbol = symbol.upper().strip()
38
+ ticker = yf.Ticker(symbol)
39
+
40
+ info = ticker.info
41
+ if not info or info.get('regularMarketPrice') is None:
42
+ raise KeyError(f"Stock symbol '{symbol}' not found or invalid")
43
+
44
+ return info
45
+
46
+ def get_stock_history(
47
+ self,
48
+ symbol: str,
49
+ period: str = "1mo",
50
+ interval: str = "1d",
51
+ start_date: str | None = None,
52
+ end_date: str | None = None
53
+ )-> Any:
54
+ """
55
+ Gets historical price data for a stock with OHLCV data, dividends, and stock splits.
56
+
57
+ Args:
58
+ symbol: Stock ticker symbol (e.g., 'AAPL', 'GOOGL', 'MSFT')
59
+ period: Time period ('1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max')
60
+ interval: Data interval ('1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo')
61
+ start_date: Start date in 'YYYY-MM-DD' format (overrides period)
62
+ end_date: End date in 'YYYY-MM-DD' format (used with start_date)
63
+
64
+ Returns:
65
+ Complete DataFrame with Open, High, Low, Close, Volume, Dividends, Stock Splits columns
66
+
67
+ Tags:
68
+ stock, history, ohlcv, price-data, time-series, important
69
+ """
70
+ if not symbol:
71
+ raise ValueError("Stock symbol cannot be empty")
72
+
73
+ symbol = symbol.upper().strip()
74
+ ticker = yf.Ticker(symbol)
75
+
76
+ return ticker.history(period=period, interval=interval, start=start_date, end=end_date)
77
+
78
+ def get_stock_news(self, symbol: str, limit: int = 10)-> list[Any]:
79
+ """
80
+ Gets latest news articles for a stock from Yahoo Finance.
81
+
82
+ Args:
83
+ symbol: Stock ticker symbol (e.g., 'AAPL', 'GOOGL', 'MSFT')
84
+ limit: Maximum number of articles to return (1-50). Defaults to 10
85
+
86
+ Returns:
87
+ Raw list of news articles from Yahoo Finance
88
+
89
+ Tags:
90
+ stock, news, articles, sentiment, important
91
+ """
92
+ if not symbol:
93
+ raise ValueError("Stock symbol cannot be empty")
94
+
95
+ symbol = symbol.upper().strip()
96
+ ticker = yf.Ticker(symbol)
97
+
98
+ news = ticker.news
99
+ return news[:limit] if news else []
100
+
101
+ def get_financial_statements(self, symbol: str, statement_type: str = "income") -> dict:
102
+ """
103
+ Gets financial statements for a stock from Yahoo Finance.
104
+
105
+ Args:
106
+ symbol: Stock ticker symbol (e.g., 'AAPL', 'GOOGL', 'MSFT')
107
+ statement_type: Type of statement ('income', 'balance', 'cashflow', 'earnings'). Defaults to 'income'
108
+
109
+ Returns:
110
+ Dictionary with financial statement data
111
+
112
+ Tags:
113
+ stock, financial-statements, earnings, important
114
+ """
115
+ if not symbol:
116
+ raise ValueError("Stock symbol cannot be empty")
117
+
118
+ symbol = symbol.upper().strip()
119
+ ticker = yf.Ticker(symbol)
120
+
121
+ if statement_type == "income":
122
+ df = ticker.income_stmt
123
+ elif statement_type == "balance":
124
+ df = ticker.balance_sheet
125
+ elif statement_type == "cashflow":
126
+ df = ticker.cashflow
127
+ elif statement_type == "earnings":
128
+ df = ticker.earnings
129
+ else:
130
+ df = ticker.income_stmt
131
+
132
+ try:
133
+ return df.to_dict('dict') # type: ignore
134
+ except:
135
+ return {}
136
+
137
+ def get_stock_recommendations(self, symbol: str, rec_type: str = "recommendations") -> list[dict]:
138
+ """
139
+ Gets analyst recommendations for a stock from Yahoo Finance.
140
+
141
+ Args:
142
+ symbol: Stock ticker symbol (e.g., 'AAPL', 'GOOGL', 'MSFT')
143
+ rec_type: Type of recommendation data ('recommendations', 'upgrades_downgrades'). Defaults to 'recommendations'
144
+
145
+ Returns:
146
+ List of dictionaries with analyst recommendation data
147
+
148
+ Tags:
149
+ stock, recommendations, analyst-ratings, important
150
+ """
151
+ if not symbol:
152
+ raise ValueError("Stock symbol cannot be empty")
153
+
154
+ symbol = symbol.upper().strip()
155
+ ticker = yf.Ticker(symbol)
156
+
157
+ if rec_type == "upgrades_downgrades":
158
+ df = ticker.upgrades_downgrades
159
+ else:
160
+ df = ticker.recommendations
161
+
162
+ try:
163
+ return df.to_dict('records') # type: ignore
164
+ except:
165
+ return []
166
+
167
+ def search(self, query: str, max_results: int = 10, news_count: int = 5, include_research: bool = False) -> dict[str, Any]:
168
+ """
169
+ Search Yahoo Finance for quotes, news, and research using yfinance Search.
170
+
171
+ Args:
172
+ query: Search query (company name, ticker symbol, or keyword)
173
+ max_results: Maximum number of quote results to return. Defaults to 10
174
+ news_count: Number of news articles to return. Defaults to 5
175
+ include_research: Whether to include research data. Defaults to False
176
+
177
+ Returns:
178
+ Dictionary containing quotes, news, and optionally research data
179
+
180
+ Tags:
181
+ search, quotes, news, research, important
182
+ """
183
+ if not query:
184
+ raise ValueError("Search query cannot be empty")
185
+
186
+ search = yf.Search(query, max_results=max_results, news_count=news_count, include_research=include_research)
187
+
188
+ result = {}
189
+ for attr in dir(search):
190
+ if not attr.startswith('_'):
191
+ try:
192
+ value = getattr(search, attr)
193
+ if not callable(value):
194
+ result[attr] = value
195
+ except:
196
+ continue
197
+
198
+ return result
199
+
200
+ def lookup_ticker(self, query: str, lookup_type: str = "all", count: int = 25) -> list[dict]:
201
+ """
202
+ Look up ticker symbols by type using yfinance Lookup.
203
+
204
+ Args:
205
+ query: Search query for ticker lookup
206
+ lookup_type: Type of lookup ('all', 'stock', 'mutualfund', 'etf', 'index', 'future', 'currency', 'cryptocurrency'). Defaults to 'all'
207
+ count: Maximum number of results to return. Defaults to 25
208
+
209
+ Returns:
210
+ List of dictionaries with ticker lookup results
211
+
212
+ Tags:
213
+ lookup, ticker, symbols, important
214
+ """
215
+ if not query:
216
+ raise ValueError("Lookup query cannot be empty")
217
+
218
+ try:
219
+ lookup = yf.Lookup(query)
220
+
221
+ if lookup_type == "stock":
222
+ results = lookup.get_stock(count=count)
223
+ elif lookup_type == "mutualfund":
224
+ results = lookup.get_mutualfund(count=count)
225
+ elif lookup_type == "etf":
226
+ results = lookup.get_etf(count=count)
227
+ elif lookup_type == "index":
228
+ results = lookup.get_index(count=count)
229
+ elif lookup_type == "future":
230
+ results = lookup.get_future(count=count)
231
+ elif lookup_type == "currency":
232
+ results = lookup.get_currency(count=count)
233
+ elif lookup_type == "cryptocurrency":
234
+ results = lookup.get_cryptocurrency(count=count)
235
+ else: # default to 'all'
236
+ results = lookup.get_all(count=count)
237
+
238
+ try:
239
+ return results.to_dict('records') # type: ignore
240
+ except:
241
+ return []
242
+
243
+ except Exception as e:
244
+ return [{
245
+ "query": query,
246
+ "error": f"Lookup failed: {str(e)}"
247
+ }]
248
+
249
+ def list_tools(self):
250
+ return [
251
+ self.get_stock_info,
252
+ self.get_stock_history,
253
+ self.get_stock_news,
254
+ self.get_financial_statements,
255
+ self.get_stock_recommendations,
256
+ self.search,
257
+ self.lookup_ticker,
258
+ ]
@@ -1,15 +1,15 @@
1
1
  from typing import Any
2
+ import os
2
3
 
3
4
  from youtube_transcript_api import YouTubeTranscriptApi
4
- from youtube_transcript_api.proxies import GenericProxyConfig
5
-
5
+ from youtube_transcript_api.proxies import WebshareProxyConfig
6
6
 
7
7
  from universal_mcp.applications.application import APIApplication
8
8
  from universal_mcp.integrations import Integration
9
9
 
10
10
 
11
11
  class YoutubeApp(APIApplication):
12
- def __init__(self, integration: Integration = None, **kwargs) -> None:
12
+ def __init__(self, integration: Integration | None = None, **kwargs) -> None:
13
13
  """
14
14
  Initializes an instance of a YouTube application integration.
15
15
 
@@ -298,10 +298,20 @@ class YoutubeApp(APIApplication):
298
298
  raise ValueError("Missing required parameter 'video_id'")
299
299
 
300
300
  try:
301
- api = YouTubeTranscriptApi(
302
- proxy_config=GenericProxyConfig(
303
- http_url="http://xgixgown:lp2wabq23752@142.111.48.253:7030/"
301
+ proxy_username = os.getenv("PROXY_USERNAME")
302
+ proxy_password = os.getenv("PROXY_PASSWORD")
303
+ proxy_port = int(os.getenv("PROXY_PORT", 80))
304
+
305
+ if not proxy_username or not proxy_password:
306
+ raise ValueError(
307
+ "PROXY_USERNAME and PROXY_PASSWORD must be set when using proxy"
304
308
  )
309
+ api = YouTubeTranscriptApi(
310
+ proxy_config=WebshareProxyConfig(
311
+ proxy_username=proxy_username,
312
+ proxy_password=proxy_password,
313
+ proxy_port=proxy_port,
314
+ ),
305
315
  )
306
316
  transcript = api.fetch(video_id)
307
317
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: universal-mcp-applications
3
- Version: 0.1.19
3
+ Version: 0.1.21
4
4
  Summary: A Universal MCP Application: universal_mcp_applications
5
5
  Project-URL: Homepage, https://github.com/universal-mcp/applications
6
6
  Project-URL: Repository, https://github.com/universal-mcp/applications
@@ -35,6 +35,7 @@ Requires-Dist: requests>=2.31.0
35
35
  Requires-Dist: resend>=2.10.0
36
36
  Requires-Dist: twilio>=9.8.0
37
37
  Requires-Dist: universal-mcp>=0.1.24rc21
38
+ Requires-Dist: yfinance>=0.2.66
38
39
  Requires-Dist: youtube-transcript-api==1.2.2
39
40
  Provides-Extra: dev
40
41
  Requires-Dist: pre-commit; extra == 'dev'
@@ -78,7 +78,7 @@ universal_mcp/applications/firecrawl/__init__.py,sha256=Sl2LuCKsNHoFf-3dGE31CYVG
78
78
  universal_mcp/applications/firecrawl/app.py,sha256=dh2G8y5-I4ITxV1vV916P4eaS0VqtMcnihOzHd1cYc4,22024
79
79
  universal_mcp/applications/fireflies/README.md,sha256=f6Yak4ys_bxau0n5nEakADderIAZ9vaSrOBR78ETN08,4083
80
80
  universal_mcp/applications/fireflies/__init__.py,sha256=SMEk3MeSk6aFzX8GX_NZwcjBvnEeTRQDlA1RZMrwKxA,30
81
- universal_mcp/applications/fireflies/app.py,sha256=VREgLSsCI0AdUsMK4htajxVUDIKwBWeSeiex3a9jNwY,19022
81
+ universal_mcp/applications/fireflies/app.py,sha256=7hYnCdwd2eObJx7lUQYImhEpkcwTkyM-kKgYCyvkoVI,21610
82
82
  universal_mcp/applications/fpl/README.md,sha256=xI0BnOxetc0u2E198v8Zn08vIsupnyAWEjUu0dSLmXg,3930
83
83
  universal_mcp/applications/fpl/__init__.py,sha256=m9fC6hJ4EKM1KE12p2XFaUCFZU9p3v-5Nm9KFl-GyIk,24
84
84
  universal_mcp/applications/fpl/app.py,sha256=BE7IdfaO11PV9aG8u16M_A_42eCWCl_7tVGMhDo1LzE,55247
@@ -102,9 +102,9 @@ universal_mcp/applications/google_calendar/app.py,sha256=FCdAbTRBM5St4NyUgmjiZWW
102
102
  universal_mcp/applications/google_docs/README.md,sha256=KDy_X4SRELegE5sEdixAP0YeXZOXdADTX2D-tAUlCJM,4512
103
103
  universal_mcp/applications/google_docs/__init__.py,sha256=U0pWagxnj0VD-AcKNd8eS0orzaMmlUOgvW9vkYBNH40,31
104
104
  universal_mcp/applications/google_docs/app.py,sha256=xlnWvAs45FAbYJPU6wD8AqUGWqj7sUhIuUonyH2opKg,33575
105
- universal_mcp/applications/google_drive/README.md,sha256=69mzpKAiXrMqNIbZ3FL4udqjp9A0U-J3a3fUvyANNU0,15601
105
+ universal_mcp/applications/google_drive/README.md,sha256=Kmg7LLaDW-7bnsgdVimwxc5SdUf2uA9Fv8zIMXVa-Uc,15393
106
106
  universal_mcp/applications/google_drive/__init__.py,sha256=DTyed4ADcCmALSyPT8whjXoosPXl3m-i8JrilPJ3ijU,32
107
- universal_mcp/applications/google_drive/app.py,sha256=u3eyZfV4Dkjj_lYe3vyaCgaPF-UNg8pH0EeLCtZDwmI,258417
107
+ universal_mcp/applications/google_drive/app.py,sha256=TyEVncS5WYaYEqlhWL5F4WjqV2Az7ZXUBEw3QnDd3S4,258970
108
108
  universal_mcp/applications/google_gemini/README.md,sha256=MFeJU_xc3vTHdNqGC_dXNRv4ocSDYgHCs82RPXBeEn4,576
109
109
  universal_mcp/applications/google_gemini/__init__.py,sha256=KZWdPU74VKBBabLpAcPNEPRPLFk8v2i0ULnT4wVHM9U,33
110
110
  universal_mcp/applications/google_gemini/app.py,sha256=pp2T1nuLUy3yAEOWssBssY3Oudj3YG8ofC757QRJQhY,8743
@@ -116,7 +116,7 @@ universal_mcp/applications/google_searchconsole/__init__.py,sha256=PHuwQFk0_a-jb
116
116
  universal_mcp/applications/google_searchconsole/app.py,sha256=5fXhgYrFrKs3Mm9IZdCW4ylq2cj8BB1DxWp3a1oMblY,14272
117
117
  universal_mcp/applications/google_sheet/README.md,sha256=ZoKzozYSGDl1AxcVgWkJk2i5uLwB17UaUsVYqo9epqs,7772
118
118
  universal_mcp/applications/google_sheet/__init__.py,sha256=sl1VQKQMlYuzZGHUIyVsFvnar6APaIFb4Y_nl7TA0us,32
119
- universal_mcp/applications/google_sheet/app.py,sha256=qdj2k7ZcxKQ5-WDWECOmyb8VeQPrvK_GeS6tOkwUZvE,88464
119
+ universal_mcp/applications/google_sheet/app.py,sha256=OQcjH9-nLopTbKdXf6hh_2oKWzM2hSISvjX7flOb9_A,88333
120
120
  universal_mcp/applications/google_sheet/helper.py,sha256=rC_2I4oKfd-rpj3UIWXGH4pZlMX1vI9kixryxBFymSY,11996
121
121
  universal_mcp/applications/hashnode/README.md,sha256=O_k8h3w3tVwigqRMSiYCl2XchoBM_p66sPLGFcexNQo,866
122
122
  universal_mcp/applications/hashnode/__init__.py,sha256=ty459WmLiNoGM4XZAKWNASp-0MCMBV15J3LstDbZWPw,29
@@ -179,9 +179,6 @@ universal_mcp/applications/posthog/app.py,sha256=-T0hOSxPT3qQEVG8IrRY0MVi0YI8yHH
179
179
  universal_mcp/applications/reddit/README.md,sha256=RzGOX8sFJldmLsrjFG1FHmWzL7RddZTylb-m8XjSKQI,6558
180
180
  universal_mcp/applications/reddit/__init__.py,sha256=JHA_BMVnuQyoDMbQt5dRNxKPrAxyZZL6zzQyNbvyjHs,27
181
181
  universal_mcp/applications/reddit/app.py,sha256=NZWx4cYcCOKzonIr9VrYsq7gYmEk-56QBa2ICG0hGGY,36394
182
- universal_mcp/applications/replicate/README.md,sha256=S7fDLNM1YpUj6zl_DMHOtYl4Lx88ouPBgbWZnCHvAxk,2387
183
- universal_mcp/applications/replicate/__init__.py,sha256=W3thUM5OFDKregi9E4EjzrcLY4ya_ZLMQKXAF2fiYV4,30
184
- universal_mcp/applications/replicate/app.py,sha256=QIHReOEnF3QUkSi0DME1jrBn24WC8r2hVQHtr7SryEo,21836
185
182
  universal_mcp/applications/resend/README.md,sha256=zfKzut3KCw9JlX3crspSjRsLZyoN9uly_yZWjWA4LUU,8409
186
183
  universal_mcp/applications/resend/__init__.py,sha256=4me7YQFrYTNvqbJawBrsrJlzyFRwXZA6u4E09IPWjlk,27
187
184
  universal_mcp/applications/resend/app.py,sha256=uqJYQhSBIfcDMi525muoxAPClr_0VDLpvlja9QPCdoA,35796
@@ -193,7 +190,7 @@ universal_mcp/applications/rocketlane/__init__.py,sha256=jl3PjnTvPdjnbFXJgLywSlE
193
190
  universal_mcp/applications/rocketlane/app.py,sha256=Re5-OoUWIIxL_ZJZ_RpEqz82hymgAWtdcOSJtJFzzs0,240690
194
191
  universal_mcp/applications/scraper/README.md,sha256=JUNLshHABs4T1f24nvQeee62YIElSkxpU-zs2kuS0Gw,1497
195
192
  universal_mcp/applications/scraper/__init__.py,sha256=RnkyFDeNR1tOsY_PskHdv4C8AYRbcjMt7KyYQWiGGD8,27
196
- universal_mcp/applications/scraper/app.py,sha256=DPdsmsWuYWXccaUe5_lurHhVeVs1DHbUP8JvIDeWJys,7255
193
+ universal_mcp/applications/scraper/app.py,sha256=rdyeQDGTok2Pb7jBI1AD4gjY_PWRpH3kEyJ1GknYoXg,20088
197
194
  universal_mcp/applications/semanticscholar/README.md,sha256=JpLY_698pvstgoNfQ5Go8C8ehQ-o68uFDX5kr86upK0,2834
198
195
  universal_mcp/applications/semanticscholar/__init__.py,sha256=eR36chrc0pbBsSE1GadvmQH0OmtKnSC91xbE7HcDPf0,36
199
196
  universal_mcp/applications/semanticscholar/app.py,sha256=OHTFkR-IwRU5Rvb1bEu7XmRHikht3hEgZxszLQu6kFI,22234
@@ -254,7 +251,7 @@ universal_mcp/applications/twitter/api_segments/usage_api.py,sha256=aBhjTzYUN16s
254
251
  universal_mcp/applications/twitter/api_segments/users_api.py,sha256=aypLs5_66TRtliSi2TjrQO9l6NuJa2LZn3Ywgwt8hEk,82349
255
252
  universal_mcp/applications/unipile/README.md,sha256=gh_YsmeJ0pAU7XNBZD8OO-AgH7ed2kG8QPbxm2wYjlY,5205
256
253
  universal_mcp/applications/unipile/__init__.py,sha256=0UZVOiYo_dDXbvTmtHrZ_fgvrbpasjWV17EEm4pZq9E,28
257
- universal_mcp/applications/unipile/app.py,sha256=Ssf7a3GijATbgPAGOeZgEvtCxlQd9nRZ750skEO3szE,33483
254
+ universal_mcp/applications/unipile/app.py,sha256=WD_tXktYOjtEhaVwL5QKt9mMLoxhy-lUAzVLI_C6kQ0,45854
258
255
  universal_mcp/applications/whatsapp/README.md,sha256=ZYbpVN0EqMW21ZCMcLNdheKX8OSPCkt3wcN8p8OZk5E,3849
259
256
  universal_mcp/applications/whatsapp/__init__.py,sha256=miHfSBpu5lx226T8dMbvOw_5H6MJCWOKVK_WbqMma-8,29
260
257
  universal_mcp/applications/whatsapp/app.py,sha256=dWuwHBKmUYMB3vROQy7MTvaXa6Mzr40R179APanzcFI,23975
@@ -266,13 +263,16 @@ universal_mcp/applications/whatsapp_business/app.py,sha256=QOOil8SX3u6u5GUA-clWr
266
263
  universal_mcp/applications/wrike/README.md,sha256=S8wwVcYjwtNGLOFmUuyEfBz5xwGRnKULczbpR_wek-M,4718
267
264
  universal_mcp/applications/wrike/__init__.py,sha256=GCsgH0nXcCbF4TfkPK46XOS0LI6EQQtOgr2NIwHAGKw,26
268
265
  universal_mcp/applications/wrike/app.py,sha256=qc1ZfeIQyVr3AaMhKVV-nuz2fvrCJbDdgfcN0K_leFU,63638
266
+ universal_mcp/applications/yahoo_finance/README.md,sha256=Pc_yxW2LFtkggzDxLNuwR7zpVhN9OalSG7ytRhrYO7w,1497
267
+ universal_mcp/applications/yahoo_finance/__init__.py,sha256=ySX-_1nfnbrpeeUwkQG7ZJSz8_Fvu47T0I3wRhyEpIk,33
268
+ universal_mcp/applications/yahoo_finance/app.py,sha256=ZmlgcIle0V8njCQf8d_Hm-JqW_Ixhp8f9HG5qigohXA,9424
269
269
  universal_mcp/applications/youtube/README.md,sha256=iK7wyIJrgA_Ai9GWdqMIsuIBQEr7srt5s_RiDeSDuU0,13502
270
270
  universal_mcp/applications/youtube/__init__.py,sha256=HuPQYpxmH_duCaVBXIE_fm-XzSIcqMjpn066tpUkKhQ,28
271
- universal_mcp/applications/youtube/app.py,sha256=t2nrMMq3Yl98gvPgqwAOjRH834ZJfEMj7_KhQ7SgxaA,76464
271
+ universal_mcp/applications/youtube/app.py,sha256=0rHSRc1qRWj9wfdtaKbus927Cc_w4DTJKEHoUNddApw,76926
272
272
  universal_mcp/applications/zenquotes/README.md,sha256=FJyoTGRCaZjF_bsCBqg1CrYcvIfuUG_Qk616G1wjhF8,512
273
273
  universal_mcp/applications/zenquotes/__init__.py,sha256=IkASLYaZiHJXlkGwEMk1HgIq5GwEZp5GhAIiJyjBd3g,30
274
274
  universal_mcp/applications/zenquotes/app.py,sha256=S88JEoVFsyqow-56zcYPgRzhcz59AG_L_RdTFqtSwdA,1323
275
- universal_mcp_applications-0.1.19.dist-info/METADATA,sha256=jU9SX72X92CHcgjHEfIF4IWddaeBczhWAcuZBOntXPw,2886
276
- universal_mcp_applications-0.1.19.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
277
- universal_mcp_applications-0.1.19.dist-info/licenses/LICENSE,sha256=NweDZVPslBAZFzlgByF158b85GR0f5_tLQgq1NS48To,1063
278
- universal_mcp_applications-0.1.19.dist-info/RECORD,,
275
+ universal_mcp_applications-0.1.21.dist-info/METADATA,sha256=Rbmaw-Tt9xNty_V4G48aUBgqZxDjT0vIqa2rha75HX8,2918
276
+ universal_mcp_applications-0.1.21.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
277
+ universal_mcp_applications-0.1.21.dist-info/licenses/LICENSE,sha256=NweDZVPslBAZFzlgByF158b85GR0f5_tLQgq1NS48To,1063
278
+ universal_mcp_applications-0.1.21.dist-info/RECORD,,
@@ -1,18 +0,0 @@
1
- # ReplicateApp MCP Server
2
-
3
- An MCP Server for the ReplicateApp API.
4
-
5
- ## 🛠️ Tool List
6
-
7
- This is automatically generated from OpenAPI schema for the ReplicateApp API.
8
-
9
-
10
- | Tool | Description |
11
- |------|-------------|
12
- | `run` | Executes a Replicate model synchronously, blocking until it completes and returns the final output. This abstracts the polling logic required by asynchronous jobs. If a model streams results, this function conveniently collects all items into a list before returning, unlike the non-blocking `submit_prediction` method. |
13
- | `submit_prediction` | Submits a model execution request to Replicate for non-blocking, asynchronous processing. It immediately returns a prediction ID for tracking, unlike the synchronous `run` method which waits for the final result. The returned ID can be used with `get_prediction` or `fetch_prediction_output` to monitor the job. |
14
- | `get_prediction` | Retrieves the full details and current state of a Replicate prediction by its ID. This function performs a non-blocking status check, returning the prediction object immediately. Unlike `fetch_prediction_output`, it does not wait for the job to complete and is used for monitoring progress. |
15
- | `await_prediction_result` | Retrieves the final output for a given prediction ID, waiting for the job to complete if it is still running. This function complements `submit_prediction` by blocking until the asynchronous task finishes, raising an error if the prediction fails or is canceled. |
16
- | `cancel_prediction` | Sends a request to cancel a running or queued Replicate prediction. It first checks the prediction's status, only proceeding if it is not already in a terminal state (e.g., succeeded, failed), and gracefully handles jobs that cannot be canceled. |
17
- | `upload_file` | Uploads a local file from a given path to Replicate's storage, returning a public URL. This URL is essential for providing file-based inputs to Replicate models via functions like `run` or `submit_prediction`. Fails if the file is not found or the upload encounters an error. |
18
- | `generate_image` | Generates images synchronously using a specified model, defaulting to SDXL. As a convenience wrapper around the generic `run` function, it simplifies image creation by exposing common parameters like `prompt` and `width`, and waits for the model to complete before returning the resulting image URLs. |
@@ -1 +0,0 @@
1
- from .app import ReplicateApp