@fre4x/yahoo-finance 1.0.1
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.
- package/LICENSE +22 -0
- package/README.md +65 -0
- package/dist/api.d.ts +142 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +148 -0
- package/dist/api.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +410 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +40 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 AlexYoung (Original Author)
|
|
4
|
+
Copyright (c) 2026 SKTelecom (Fork Maintainer - Pagination & Caching Enhancements)
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# yahoo-finance — The Market Claw
|
|
2
|
+
|
|
3
|
+
> *Markets are not fair. They are fast. The agent that reads prices, filings, and options chains in milliseconds does not lose. It waits.*
|
|
4
|
+
|
|
5
|
+
Part of **[FRE4X-B1TE](../)** — a monorepo of MCP servers built for autonomous agents.
|
|
6
|
+
|
|
7
|
+
Price history, balance sheets, insider moves, analyst upgrades, options flow — the full operational picture of any publicly traded entity. No API key. No subscription. No delay that matters. This B1TE bites through the noisiest market on earth.
|
|
8
|
+
|
|
9
|
+
## Tools
|
|
10
|
+
|
|
11
|
+
### Price & Market Data
|
|
12
|
+
|
|
13
|
+
| Tool | What it tracks |
|
|
14
|
+
|------|---------------|
|
|
15
|
+
| `yfin_get_historical_prices` | OHLCV bars — any ticker, any period, any interval |
|
|
16
|
+
| `yfin_get_stock_info` | Price, company profile, key statistics, financial health |
|
|
17
|
+
| `yfin_get_news` | Latest news articles for a ticker |
|
|
18
|
+
| `yfin_get_stock_actions` | Dividend payments and stock splits |
|
|
19
|
+
|
|
20
|
+
### Financial Statements
|
|
21
|
+
|
|
22
|
+
| Tool | What it exposes |
|
|
23
|
+
|------|----------------|
|
|
24
|
+
| `yfin_get_financial_statement` | Income statement, balance sheet, cash flow (annual or quarterly) |
|
|
25
|
+
| `yfin_get_holder_info` | Major holders, institutions, mutual funds, insider transactions |
|
|
26
|
+
|
|
27
|
+
### Options Intelligence
|
|
28
|
+
|
|
29
|
+
| Tool | What it maps |
|
|
30
|
+
|------|-------------|
|
|
31
|
+
| `yfin_get_option_dates` | Available expiration dates for a ticker |
|
|
32
|
+
| `yfin_get_option_chain` | Full calls or puts chain for a given expiration |
|
|
33
|
+
|
|
34
|
+
### Analyst Signal
|
|
35
|
+
|
|
36
|
+
| Tool | What it surfaces |
|
|
37
|
+
|------|----------------|
|
|
38
|
+
| `yfin_get_recommendations` | Consensus recommendations or firm upgrade/downgrade history |
|
|
39
|
+
|
|
40
|
+
All list tools support pagination via `limit` / `offset`. No API key required.
|
|
41
|
+
|
|
42
|
+
## Deploy
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"mcpServers": {
|
|
47
|
+
"yahoo-finance": {
|
|
48
|
+
"command": "npx",
|
|
49
|
+
"args": ["-y", "@fre4x/yahoo-finance"]
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Development
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
bun install
|
|
59
|
+
bun run dev # tsx, no build
|
|
60
|
+
bun run build # compile → dist/
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## License
|
|
64
|
+
|
|
65
|
+
MIT — **WE ARE THE FRE4X.**
|
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import type { HistoricalPeriod, HistoricalInterval, FinancialType, HolderType, OptionType } from "./types.js";
|
|
2
|
+
/** Convert yfinance-style period string to a start Date */
|
|
3
|
+
export declare function periodToStartDate(period: HistoricalPeriod): Date;
|
|
4
|
+
export declare function getHistoricalPrices(ticker: string, period: HistoricalPeriod, interval: HistoricalInterval): Promise<{
|
|
5
|
+
events?: {
|
|
6
|
+
dividends?: {
|
|
7
|
+
date: Date;
|
|
8
|
+
amount: number;
|
|
9
|
+
}[] | undefined;
|
|
10
|
+
splits?: {
|
|
11
|
+
date: Date;
|
|
12
|
+
numerator: number;
|
|
13
|
+
denominator: number;
|
|
14
|
+
splitRatio: string;
|
|
15
|
+
}[] | undefined;
|
|
16
|
+
} | undefined;
|
|
17
|
+
meta: {
|
|
18
|
+
previousClose?: number | undefined;
|
|
19
|
+
chartPreviousClose?: number | undefined;
|
|
20
|
+
scale?: number | undefined;
|
|
21
|
+
tradingPeriods?: {
|
|
22
|
+
pre?: {
|
|
23
|
+
gmtoffset: number;
|
|
24
|
+
timezone: string;
|
|
25
|
+
start: Date;
|
|
26
|
+
end: Date;
|
|
27
|
+
}[][] | undefined;
|
|
28
|
+
regular?: {
|
|
29
|
+
gmtoffset: number;
|
|
30
|
+
timezone: string;
|
|
31
|
+
start: Date;
|
|
32
|
+
end: Date;
|
|
33
|
+
}[][] | undefined;
|
|
34
|
+
post?: {
|
|
35
|
+
gmtoffset: number;
|
|
36
|
+
timezone: string;
|
|
37
|
+
start: Date;
|
|
38
|
+
end: Date;
|
|
39
|
+
}[][] | undefined;
|
|
40
|
+
} | {
|
|
41
|
+
gmtoffset: number;
|
|
42
|
+
timezone: string;
|
|
43
|
+
start: Date;
|
|
44
|
+
end: Date;
|
|
45
|
+
}[][] | undefined;
|
|
46
|
+
symbol: string;
|
|
47
|
+
priceHint: number;
|
|
48
|
+
exchangeName: string;
|
|
49
|
+
regularMarketTime: Date;
|
|
50
|
+
regularMarketPrice: number;
|
|
51
|
+
currency: string;
|
|
52
|
+
instrumentType: string;
|
|
53
|
+
firstTradeDate: Date | null;
|
|
54
|
+
gmtoffset: number;
|
|
55
|
+
timezone: string;
|
|
56
|
+
exchangeTimezoneName: string;
|
|
57
|
+
currentTradingPeriod: {
|
|
58
|
+
pre: {
|
|
59
|
+
gmtoffset: number;
|
|
60
|
+
timezone: string;
|
|
61
|
+
start: Date;
|
|
62
|
+
end: Date;
|
|
63
|
+
};
|
|
64
|
+
regular: {
|
|
65
|
+
gmtoffset: number;
|
|
66
|
+
timezone: string;
|
|
67
|
+
start: Date;
|
|
68
|
+
end: Date;
|
|
69
|
+
};
|
|
70
|
+
post: {
|
|
71
|
+
gmtoffset: number;
|
|
72
|
+
timezone: string;
|
|
73
|
+
start: Date;
|
|
74
|
+
end: Date;
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
dataGranularity: string;
|
|
78
|
+
range: string;
|
|
79
|
+
validRanges: string[];
|
|
80
|
+
};
|
|
81
|
+
quotes: {
|
|
82
|
+
adjclose?: number | null | undefined;
|
|
83
|
+
open: number | null;
|
|
84
|
+
volume: number | null;
|
|
85
|
+
date: Date;
|
|
86
|
+
high: number | null;
|
|
87
|
+
low: number | null;
|
|
88
|
+
close: number | null;
|
|
89
|
+
}[];
|
|
90
|
+
}>;
|
|
91
|
+
export declare function getStockInfo(ticker: string): Promise<Record<string, unknown>>;
|
|
92
|
+
export declare function getNews(ticker: string): Promise<{
|
|
93
|
+
thumbnail?: {
|
|
94
|
+
resolutions: {
|
|
95
|
+
url: string;
|
|
96
|
+
width: number;
|
|
97
|
+
height: number;
|
|
98
|
+
tag: string;
|
|
99
|
+
}[];
|
|
100
|
+
} | undefined;
|
|
101
|
+
relatedTickers?: string[] | undefined;
|
|
102
|
+
type: string;
|
|
103
|
+
link: string;
|
|
104
|
+
uuid: string;
|
|
105
|
+
title: string;
|
|
106
|
+
publisher: string;
|
|
107
|
+
providerPublishTime: Date;
|
|
108
|
+
}[]>;
|
|
109
|
+
export declare function getStockActions(ticker: string): Promise<{
|
|
110
|
+
dividends: {
|
|
111
|
+
date: Date;
|
|
112
|
+
amount: number;
|
|
113
|
+
}[];
|
|
114
|
+
splits: {
|
|
115
|
+
date: Date;
|
|
116
|
+
numerator: number;
|
|
117
|
+
denominator: number;
|
|
118
|
+
splitRatio: string;
|
|
119
|
+
}[];
|
|
120
|
+
}>;
|
|
121
|
+
export declare function getFinancialStatement(ticker: string, financialType: FinancialType): Promise<unknown[]>;
|
|
122
|
+
export declare function getHolderInfo(ticker: string, holderType: HolderType): Promise<unknown>;
|
|
123
|
+
export declare function getOptionDates(ticker: string): Promise<string[]>;
|
|
124
|
+
export declare function getOptionChain(ticker: string, expirationDate: string, optionType: OptionType): Promise<{
|
|
125
|
+
currency?: string | undefined;
|
|
126
|
+
openInterest?: number | undefined;
|
|
127
|
+
volume?: number | undefined;
|
|
128
|
+
bid?: number | undefined;
|
|
129
|
+
ask?: number | undefined;
|
|
130
|
+
percentChange?: number | undefined;
|
|
131
|
+
strike: number;
|
|
132
|
+
contractSymbol: string;
|
|
133
|
+
lastPrice: number;
|
|
134
|
+
change: number;
|
|
135
|
+
contractSize: "REGULAR";
|
|
136
|
+
expiration: Date;
|
|
137
|
+
lastTradeDate: Date;
|
|
138
|
+
impliedVolatility: number;
|
|
139
|
+
inTheMoney: boolean;
|
|
140
|
+
}[]>;
|
|
141
|
+
export declare function getRecommendations(ticker: string, recommendationType: string): Promise<unknown[]>;
|
|
142
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,UAAU,EACX,MAAM,YAAY,CAAC;AAKpB,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAmBhE;AAwBD,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAO7B;AAID,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAQlC;AAID,wBAAsB,OAAO,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;KAG3C;AAID,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;;GAQnD;AAsBD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,OAAO,EAAE,CAAC,CAOpB;AAsBD,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,OAAO,CAAC,CASlB;AAID,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKtE;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,UAAU;;;;;;;;;;;;;;;;KAQvB;AAID,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,OAAO,EAAE,CAAC,CAYpB"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import yahooFinance from "yahoo-finance2";
|
|
2
|
+
// Suppress noisy console validation warnings from yahoo-finance2
|
|
3
|
+
yahooFinance.setGlobalConfig({ validation: { logErrors: false } });
|
|
4
|
+
/** Convert yfinance-style period string to a start Date */
|
|
5
|
+
export function periodToStartDate(period) {
|
|
6
|
+
const now = new Date();
|
|
7
|
+
const y = now.getFullYear();
|
|
8
|
+
const m = now.getMonth();
|
|
9
|
+
const d = now.getDate();
|
|
10
|
+
switch (period) {
|
|
11
|
+
case "1d": return new Date(y, m, d - 1);
|
|
12
|
+
case "5d": return new Date(y, m, d - 5);
|
|
13
|
+
case "1mo": return new Date(y, m - 1, d);
|
|
14
|
+
case "3mo": return new Date(y, m - 3, d);
|
|
15
|
+
case "6mo": return new Date(y, m - 6, d);
|
|
16
|
+
case "1y": return new Date(y - 1, m, d);
|
|
17
|
+
case "2y": return new Date(y - 2, m, d);
|
|
18
|
+
case "5y": return new Date(y - 5, m, d);
|
|
19
|
+
case "10y": return new Date(y - 10, m, d);
|
|
20
|
+
case "ytd": return new Date(y, 0, 1);
|
|
21
|
+
case "max": return new Date(1970, 0, 1);
|
|
22
|
+
default: return new Date(y, m - 1, d);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Wrapper that returns Record<string,unknown> to avoid unexportable-type errors (TS4058) */
|
|
26
|
+
async function callQuoteSummary(ticker, modules) {
|
|
27
|
+
const result = await yahooFinance.quoteSummary(ticker, { modules });
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
// --- Historical Prices ---
|
|
31
|
+
export async function getHistoricalPrices(ticker, period, interval) {
|
|
32
|
+
const period1 = periodToStartDate(period);
|
|
33
|
+
return yahooFinance.chart(ticker, {
|
|
34
|
+
period1,
|
|
35
|
+
interval: interval,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
// --- Stock Info ---
|
|
39
|
+
export async function getStockInfo(ticker) {
|
|
40
|
+
return callQuoteSummary(ticker, [
|
|
41
|
+
"price",
|
|
42
|
+
"summaryProfile",
|
|
43
|
+
"defaultKeyStatistics",
|
|
44
|
+
"financialData",
|
|
45
|
+
"summaryDetail",
|
|
46
|
+
]);
|
|
47
|
+
}
|
|
48
|
+
// --- News ---
|
|
49
|
+
export async function getNews(ticker) {
|
|
50
|
+
const result = await yahooFinance.search(ticker, { newsCount: 20 });
|
|
51
|
+
return result.news ?? [];
|
|
52
|
+
}
|
|
53
|
+
// --- Stock Actions (dividends + splits) ---
|
|
54
|
+
export async function getStockActions(ticker) {
|
|
55
|
+
const result = await yahooFinance.chart(ticker, {
|
|
56
|
+
period1: new Date(1970, 0, 1),
|
|
57
|
+
interval: "1d",
|
|
58
|
+
});
|
|
59
|
+
const dividends = Object.values(result.events?.dividends ?? {});
|
|
60
|
+
const splits = Object.values(result.events?.splits ?? {});
|
|
61
|
+
return { dividends, splits };
|
|
62
|
+
}
|
|
63
|
+
// --- Financial Statement ---
|
|
64
|
+
const financialModuleMap = {
|
|
65
|
+
income_stmt: "incomeStatementHistory",
|
|
66
|
+
quarterly_income_stmt: "incomeStatementHistoryQuarterly",
|
|
67
|
+
balance_sheet: "balanceSheetHistory",
|
|
68
|
+
quarterly_balance_sheet: "balanceSheetHistoryQuarterly",
|
|
69
|
+
cashflow: "cashflowStatementHistory",
|
|
70
|
+
quarterly_cashflow: "cashflowStatementHistoryQuarterly",
|
|
71
|
+
};
|
|
72
|
+
const financialDataKey = {
|
|
73
|
+
income_stmt: "incomeStatementHistory",
|
|
74
|
+
quarterly_income_stmt: "incomeStatementHistory",
|
|
75
|
+
balance_sheet: "balanceSheetStatements",
|
|
76
|
+
quarterly_balance_sheet: "balanceSheetStatements",
|
|
77
|
+
cashflow: "cashflowStatements",
|
|
78
|
+
quarterly_cashflow: "cashflowStatements",
|
|
79
|
+
};
|
|
80
|
+
export async function getFinancialStatement(ticker, financialType) {
|
|
81
|
+
const module = financialModuleMap[financialType];
|
|
82
|
+
const summary = await callQuoteSummary(ticker, [module]);
|
|
83
|
+
const moduleData = summary[module];
|
|
84
|
+
if (!moduleData || typeof moduleData !== "object")
|
|
85
|
+
return [];
|
|
86
|
+
const statements = moduleData[financialDataKey[financialType]];
|
|
87
|
+
return Array.isArray(statements) ? statements : [];
|
|
88
|
+
}
|
|
89
|
+
// --- Holder Info ---
|
|
90
|
+
const holderModuleMap = {
|
|
91
|
+
major_holders: "majorHoldersBreakdown",
|
|
92
|
+
institutional_holders: "institutionOwnership",
|
|
93
|
+
mutualfund_holders: "fundOwnership",
|
|
94
|
+
insider_transactions: "insiderTransactions",
|
|
95
|
+
insider_purchases: "netSharePurchaseActivity",
|
|
96
|
+
insider_roster_holders: "insiderHolders",
|
|
97
|
+
};
|
|
98
|
+
const holderDataKey = {
|
|
99
|
+
major_holders: null,
|
|
100
|
+
institutional_holders: "ownershipList",
|
|
101
|
+
mutualfund_holders: "ownershipList",
|
|
102
|
+
insider_transactions: "transactions",
|
|
103
|
+
insider_purchases: null,
|
|
104
|
+
insider_roster_holders: "holders",
|
|
105
|
+
};
|
|
106
|
+
export async function getHolderInfo(ticker, holderType) {
|
|
107
|
+
const module = holderModuleMap[holderType];
|
|
108
|
+
const summary = await callQuoteSummary(ticker, [module]);
|
|
109
|
+
const moduleData = summary[module];
|
|
110
|
+
if (!moduleData)
|
|
111
|
+
return null;
|
|
112
|
+
const dataKey = holderDataKey[holderType];
|
|
113
|
+
if (!dataKey)
|
|
114
|
+
return moduleData;
|
|
115
|
+
return moduleData[dataKey] ?? moduleData;
|
|
116
|
+
}
|
|
117
|
+
// --- Options ---
|
|
118
|
+
export async function getOptionDates(ticker) {
|
|
119
|
+
const result = await yahooFinance.options(ticker, {});
|
|
120
|
+
return (result.expirationDates ?? []).map((d) => d instanceof Date ? d.toISOString().split("T")[0] : String(d));
|
|
121
|
+
}
|
|
122
|
+
export async function getOptionChain(ticker, expirationDate, optionType) {
|
|
123
|
+
const result = await yahooFinance.options(ticker, {
|
|
124
|
+
date: new Date(expirationDate),
|
|
125
|
+
});
|
|
126
|
+
const chain = result.options?.[0];
|
|
127
|
+
if (!chain)
|
|
128
|
+
return [];
|
|
129
|
+
return optionType === "calls" ? chain.calls : chain.puts;
|
|
130
|
+
}
|
|
131
|
+
// --- Recommendations ---
|
|
132
|
+
export async function getRecommendations(ticker, recommendationType) {
|
|
133
|
+
if (recommendationType === "recommendations") {
|
|
134
|
+
const summary = await callQuoteSummary(ticker, ["recommendationTrend"]);
|
|
135
|
+
const trend = summary["recommendationTrend"];
|
|
136
|
+
if (!trend || typeof trend !== "object")
|
|
137
|
+
return [];
|
|
138
|
+
return trend["trend"] ?? [];
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const summary = await callQuoteSummary(ticker, ["upgradeDowngradeHistory"]);
|
|
142
|
+
const hist = summary["upgradeDowngradeHistory"];
|
|
143
|
+
if (!hist || typeof hist !== "object")
|
|
144
|
+
return [];
|
|
145
|
+
return hist["history"] ?? [];
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { createApiError, createNotFoundError, truncateToLimit, paginationSchema, applyPagination, } from "@fre4x/mcp-shared";
|
|
6
|
+
import { getHistoricalPrices, getStockInfo, getNews, getStockActions, getFinancialStatement, getHolderInfo, getOptionDates, getOptionChain, getRecommendations, } from "./api.js";
|
|
7
|
+
const server = new McpServer({
|
|
8
|
+
name: "yahoo-finance-mcp-server",
|
|
9
|
+
version: "1.0.0",
|
|
10
|
+
});
|
|
11
|
+
// --- Formatters ---
|
|
12
|
+
function formatTable(rows, title) {
|
|
13
|
+
if (!rows || rows.length === 0)
|
|
14
|
+
return "No data available.";
|
|
15
|
+
const keys = Object.keys(rows[0]);
|
|
16
|
+
const header = `| ${keys.join(" | ")} |`;
|
|
17
|
+
const divider = `| ${keys.map(() => "---").join(" | ")} |`;
|
|
18
|
+
const body = rows.map((row) => `| ${keys.map((k) => String(row[k] ?? "")).join(" | ")} |`);
|
|
19
|
+
return (title ? `## ${title}\n\n` : "") + [header, divider, ...body].join("\n");
|
|
20
|
+
}
|
|
21
|
+
function formatObject(obj, title) {
|
|
22
|
+
const lines = Object.entries(obj)
|
|
23
|
+
.filter(([, v]) => v !== null && v !== undefined)
|
|
24
|
+
.map(([k, v]) => {
|
|
25
|
+
const val = typeof v === "object" ? JSON.stringify(v) : String(v);
|
|
26
|
+
return `- **${k}**: ${val}`;
|
|
27
|
+
});
|
|
28
|
+
return (title ? `## ${title}\n\n` : "") + lines.join("\n");
|
|
29
|
+
}
|
|
30
|
+
function extractRaw(v) {
|
|
31
|
+
if (v !== null && typeof v === "object" && "raw" in v) {
|
|
32
|
+
return v.raw;
|
|
33
|
+
}
|
|
34
|
+
return v;
|
|
35
|
+
}
|
|
36
|
+
function flattenFinancialItem(item) {
|
|
37
|
+
if (!item || typeof item !== "object")
|
|
38
|
+
return {};
|
|
39
|
+
const result = {};
|
|
40
|
+
for (const [k, v] of Object.entries(item)) {
|
|
41
|
+
if (v instanceof Date) {
|
|
42
|
+
result[k] = v.toISOString().split("T")[0];
|
|
43
|
+
}
|
|
44
|
+
else if (v !== null && typeof v === "object" && "raw" in v) {
|
|
45
|
+
result[k] = v.raw;
|
|
46
|
+
}
|
|
47
|
+
else if (v !== null && typeof v !== "object") {
|
|
48
|
+
result[k] = v;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
// --- Tools ---
|
|
54
|
+
server.registerTool("yfin_get_historical_prices", {
|
|
55
|
+
title: "Get Historical Stock Prices",
|
|
56
|
+
description: "Get historical OHLCV stock price data for a ticker.",
|
|
57
|
+
inputSchema: z.object({
|
|
58
|
+
ticker: z.string().describe("Ticker symbol e.g. 'AAPL'"),
|
|
59
|
+
period: z
|
|
60
|
+
.enum(["1d", "5d", "1mo", "3mo", "6mo", "1y", "2y", "5y", "10y", "ytd", "max"])
|
|
61
|
+
.default("1mo")
|
|
62
|
+
.describe("Time period"),
|
|
63
|
+
interval: z
|
|
64
|
+
.enum(["1m", "2m", "5m", "15m", "30m", "60m", "90m", "1h", "1d", "5d", "1wk", "1mo", "3mo"])
|
|
65
|
+
.default("1d")
|
|
66
|
+
.describe("Bar interval"),
|
|
67
|
+
...paginationSchema.shape,
|
|
68
|
+
}),
|
|
69
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
70
|
+
}, async ({ ticker, period, interval, limit, offset }) => {
|
|
71
|
+
try {
|
|
72
|
+
const result = await getHistoricalPrices(ticker, period, interval);
|
|
73
|
+
const quotes = result.quotes ?? [];
|
|
74
|
+
if (quotes.length === 0) {
|
|
75
|
+
return createNotFoundError(`No historical data for '${ticker}'.`);
|
|
76
|
+
}
|
|
77
|
+
const { items, total, hasMore } = applyPagination(quotes, { limit, offset });
|
|
78
|
+
const rows = items.map((q) => ({
|
|
79
|
+
date: q.date instanceof Date ? q.date.toISOString().split("T")[0] : String(q.date),
|
|
80
|
+
open: q.open?.toFixed(2) ?? "",
|
|
81
|
+
high: q.high?.toFixed(2) ?? "",
|
|
82
|
+
low: q.low?.toFixed(2) ?? "",
|
|
83
|
+
close: q.close?.toFixed(2) ?? "",
|
|
84
|
+
volume: q.volume ?? "",
|
|
85
|
+
adjclose: q.adjclose?.toFixed(2) ?? "",
|
|
86
|
+
}));
|
|
87
|
+
const text = formatTable(rows, `Historical Prices — ${ticker} (${period}, ${interval})`) +
|
|
88
|
+
`\n\n*Showing ${items.length}/${total} bars${hasMore ? " · more available" : ""}*`;
|
|
89
|
+
return { content: [{ type: "text", text: truncateToLimit(text) }] };
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
return createApiError(err instanceof Error ? err.message : String(err));
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
server.registerTool("yfin_get_stock_info", {
|
|
96
|
+
title: "Get Stock Info",
|
|
97
|
+
description: "Get comprehensive stock info including price, profile, and financials.",
|
|
98
|
+
inputSchema: z.object({
|
|
99
|
+
ticker: z.string().describe("Ticker symbol e.g. 'AAPL'"),
|
|
100
|
+
}),
|
|
101
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
102
|
+
}, async ({ ticker }) => {
|
|
103
|
+
try {
|
|
104
|
+
const rawSummary = await getStockInfo(ticker);
|
|
105
|
+
const summary = rawSummary;
|
|
106
|
+
const sections = [];
|
|
107
|
+
const price = summary.price;
|
|
108
|
+
if (price) {
|
|
109
|
+
sections.push(`## ${price.longName ?? ticker} (${ticker})\n` +
|
|
110
|
+
`- **Price**: ${price.regularMarketPrice ?? "N/A"} ${price.currency ?? ""}\n` +
|
|
111
|
+
`- **Change**: ${typeof price.regularMarketChange === "number" ? price.regularMarketChange.toFixed(2) : "N/A"} ` +
|
|
112
|
+
`(${typeof price.regularMarketChangePercent === "number" ? price.regularMarketChangePercent.toFixed(2) : "N/A"}%)\n` +
|
|
113
|
+
`- **Market Cap**: ${price.marketCap ?? "N/A"}\n` +
|
|
114
|
+
`- **Exchange**: ${price.exchangeName ?? "N/A"}`);
|
|
115
|
+
}
|
|
116
|
+
const profile = summary.summaryProfile;
|
|
117
|
+
if (profile) {
|
|
118
|
+
sections.push(`## Company Profile\n` +
|
|
119
|
+
`- **Sector**: ${profile.sector ?? "N/A"}\n` +
|
|
120
|
+
`- **Industry**: ${profile.industry ?? "N/A"}\n` +
|
|
121
|
+
`- **Country**: ${profile.country ?? "N/A"}\n` +
|
|
122
|
+
`- **Employees**: ${profile.fullTimeEmployees ?? "N/A"}\n` +
|
|
123
|
+
(profile.longBusinessSummary
|
|
124
|
+
? `\n${profile.longBusinessSummary.substring(0, 500)}...`
|
|
125
|
+
: ""));
|
|
126
|
+
}
|
|
127
|
+
const fin = summary.financialData;
|
|
128
|
+
if (fin) {
|
|
129
|
+
sections.push(`## Financial Data\n` +
|
|
130
|
+
`- **Revenue**: ${fin.totalRevenue ?? "N/A"}\n` +
|
|
131
|
+
`- **Gross Profit**: ${fin.grossProfits ?? "N/A"}\n` +
|
|
132
|
+
`- **EBITDA**: ${fin.ebitda ?? "N/A"}\n` +
|
|
133
|
+
`- **Free Cashflow**: ${fin.freeCashflow ?? "N/A"}\n` +
|
|
134
|
+
`- **Return on Equity**: ${fin.returnOnEquity ?? "N/A"}\n` +
|
|
135
|
+
`- **Recommendation**: ${fin.recommendationKey ?? "N/A"}`);
|
|
136
|
+
}
|
|
137
|
+
const stats = summary.defaultKeyStatistics;
|
|
138
|
+
const detail = summary.summaryDetail;
|
|
139
|
+
if (stats) {
|
|
140
|
+
sections.push(`## Key Statistics\n` +
|
|
141
|
+
`- **Beta**: ${stats.beta ?? "N/A"}\n` +
|
|
142
|
+
`- **PE Ratio (Forward)**: ${stats.forwardPE ?? "N/A"}\n` +
|
|
143
|
+
`- **EPS (Forward)**: ${stats.forwardEps ?? "N/A"}\n` +
|
|
144
|
+
`- **52w High**: ${detail?.fiftyTwoWeekHigh ?? "N/A"}\n` +
|
|
145
|
+
`- **52w Low**: ${detail?.fiftyTwoWeekLow ?? "N/A"}\n` +
|
|
146
|
+
`- **Shares Outstanding**: ${stats.sharesOutstanding ?? "N/A"}\n` +
|
|
147
|
+
`- **Float Shares**: ${stats.floatShares ?? "N/A"}`);
|
|
148
|
+
}
|
|
149
|
+
const text = sections.join("\n\n");
|
|
150
|
+
return { content: [{ type: "text", text: truncateToLimit(text) }] };
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
return createApiError(err instanceof Error ? err.message : String(err));
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
server.registerTool("yfin_get_news", {
|
|
157
|
+
title: "Get Yahoo Finance News",
|
|
158
|
+
description: "Get latest news articles for a ticker symbol.",
|
|
159
|
+
inputSchema: z.object({
|
|
160
|
+
ticker: z.string().describe("Ticker symbol e.g. 'AAPL'"),
|
|
161
|
+
...paginationSchema.shape,
|
|
162
|
+
}),
|
|
163
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
164
|
+
}, async ({ ticker, limit, offset }) => {
|
|
165
|
+
try {
|
|
166
|
+
const news = await getNews(ticker);
|
|
167
|
+
if (!news || news.length === 0) {
|
|
168
|
+
return createNotFoundError(`No news found for '${ticker}'.`);
|
|
169
|
+
}
|
|
170
|
+
const { items, total } = applyPagination(news, { limit, offset });
|
|
171
|
+
const rows = items.map((n) => ({
|
|
172
|
+
title: n.title ?? "",
|
|
173
|
+
publisher: n.publisher ?? "",
|
|
174
|
+
link: n.link ?? "",
|
|
175
|
+
published: n.providerPublishTime instanceof Date
|
|
176
|
+
? n.providerPublishTime.toISOString().split("T")[0]
|
|
177
|
+
: String(n.providerPublishTime ?? ""),
|
|
178
|
+
}));
|
|
179
|
+
const text = formatTable(rows, `News — ${ticker}`) +
|
|
180
|
+
`\n\n*Showing ${items.length}/${total} articles*`;
|
|
181
|
+
return { content: [{ type: "text", text: truncateToLimit(text) }] };
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
return createApiError(err instanceof Error ? err.message : String(err));
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
server.registerTool("yfin_get_stock_actions", {
|
|
188
|
+
title: "Get Stock Actions",
|
|
189
|
+
description: "Get stock dividend and split history.",
|
|
190
|
+
inputSchema: z.object({
|
|
191
|
+
ticker: z.string().describe("Ticker symbol e.g. 'AAPL'"),
|
|
192
|
+
}),
|
|
193
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
194
|
+
}, async ({ ticker }) => {
|
|
195
|
+
try {
|
|
196
|
+
const { dividends, splits } = await getStockActions(ticker);
|
|
197
|
+
const sections = [];
|
|
198
|
+
if (dividends.length > 0) {
|
|
199
|
+
const divRows = dividends.map((d) => ({
|
|
200
|
+
date: d.date instanceof Date ? d.date.toISOString().split("T")[0] : String(d.date),
|
|
201
|
+
amount: String(d.amount),
|
|
202
|
+
}));
|
|
203
|
+
sections.push(formatTable(divRows, "Dividends"));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
sections.push("## Dividends\nNo dividend history.");
|
|
207
|
+
}
|
|
208
|
+
if (splits.length > 0) {
|
|
209
|
+
const splitRows = splits.map((s) => ({
|
|
210
|
+
date: s.date instanceof Date ? s.date.toISOString().split("T")[0] : String(s.date),
|
|
211
|
+
ratio: s.splitRatio ?? `${s.numerator}:${s.denominator}`,
|
|
212
|
+
}));
|
|
213
|
+
sections.push(formatTable(splitRows, "Stock Splits"));
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
sections.push("## Stock Splits\nNo split history.");
|
|
217
|
+
}
|
|
218
|
+
return { content: [{ type: "text", text: truncateToLimit(sections.join("\n\n")) }] };
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
return createApiError(err instanceof Error ? err.message : String(err));
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
server.registerTool("yfin_get_financial_statement", {
|
|
225
|
+
title: "Get Financial Statement",
|
|
226
|
+
description: "Get income statement, balance sheet, or cashflow for a ticker.",
|
|
227
|
+
inputSchema: z.object({
|
|
228
|
+
ticker: z.string().describe("Ticker symbol e.g. 'AAPL'"),
|
|
229
|
+
financial_type: z
|
|
230
|
+
.enum([
|
|
231
|
+
"income_stmt",
|
|
232
|
+
"quarterly_income_stmt",
|
|
233
|
+
"balance_sheet",
|
|
234
|
+
"quarterly_balance_sheet",
|
|
235
|
+
"cashflow",
|
|
236
|
+
"quarterly_cashflow",
|
|
237
|
+
])
|
|
238
|
+
.describe("Type of financial statement"),
|
|
239
|
+
}),
|
|
240
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
241
|
+
}, async ({ ticker, financial_type }) => {
|
|
242
|
+
try {
|
|
243
|
+
const statements = await getFinancialStatement(ticker, financial_type);
|
|
244
|
+
if (!statements || statements.length === 0) {
|
|
245
|
+
return createNotFoundError(`No ${financial_type} data for '${ticker}'.`);
|
|
246
|
+
}
|
|
247
|
+
const rows = statements.map((s) => flattenFinancialItem(s));
|
|
248
|
+
const text = formatTable(rows, `${financial_type.replace(/_/g, " ").toUpperCase()} — ${ticker}`);
|
|
249
|
+
return { content: [{ type: "text", text: truncateToLimit(text) }] };
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
return createApiError(err instanceof Error ? err.message : String(err));
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
server.registerTool("yfin_get_holder_info", {
|
|
256
|
+
title: "Get Holder Info",
|
|
257
|
+
description: "Get major, institutional, mutual fund, or insider holder data.",
|
|
258
|
+
inputSchema: z.object({
|
|
259
|
+
ticker: z.string().describe("Ticker symbol e.g. 'AAPL'"),
|
|
260
|
+
holder_type: z
|
|
261
|
+
.enum([
|
|
262
|
+
"major_holders",
|
|
263
|
+
"institutional_holders",
|
|
264
|
+
"mutualfund_holders",
|
|
265
|
+
"insider_transactions",
|
|
266
|
+
"insider_purchases",
|
|
267
|
+
"insider_roster_holders",
|
|
268
|
+
])
|
|
269
|
+
.describe("Type of holder information"),
|
|
270
|
+
}),
|
|
271
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
272
|
+
}, async ({ ticker, holder_type }) => {
|
|
273
|
+
try {
|
|
274
|
+
const data = await getHolderInfo(ticker, holder_type);
|
|
275
|
+
if (!data) {
|
|
276
|
+
return createNotFoundError(`No ${holder_type} data for '${ticker}'.`);
|
|
277
|
+
}
|
|
278
|
+
let text;
|
|
279
|
+
if (Array.isArray(data)) {
|
|
280
|
+
const rows = data.map((item) => flattenFinancialItem(item));
|
|
281
|
+
text = formatTable(rows, `${holder_type.replace(/_/g, " ").toUpperCase()} — ${ticker}`);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
const flat = {};
|
|
285
|
+
for (const [k, v] of Object.entries(data)) {
|
|
286
|
+
flat[k] = extractRaw(v);
|
|
287
|
+
}
|
|
288
|
+
text = formatObject(flat, `${holder_type.replace(/_/g, " ").toUpperCase()} — ${ticker}`);
|
|
289
|
+
}
|
|
290
|
+
return { content: [{ type: "text", text: truncateToLimit(text) }] };
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
return createApiError(err instanceof Error ? err.message : String(err));
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
server.registerTool("yfin_get_option_dates", {
|
|
297
|
+
title: "Get Option Expiration Dates",
|
|
298
|
+
description: "Get available option expiration dates for a ticker.",
|
|
299
|
+
inputSchema: z.object({
|
|
300
|
+
ticker: z.string().describe("Ticker symbol e.g. 'AAPL'"),
|
|
301
|
+
}),
|
|
302
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
303
|
+
}, async ({ ticker }) => {
|
|
304
|
+
try {
|
|
305
|
+
const dates = await getOptionDates(ticker);
|
|
306
|
+
if (!dates || dates.length === 0) {
|
|
307
|
+
return createNotFoundError(`No option dates for '${ticker}'.`);
|
|
308
|
+
}
|
|
309
|
+
const text = `## Option Expiration Dates — ${ticker}\n\n` + dates.map((d) => `- ${d}`).join("\n");
|
|
310
|
+
return { content: [{ type: "text", text }] };
|
|
311
|
+
}
|
|
312
|
+
catch (err) {
|
|
313
|
+
return createApiError(err instanceof Error ? err.message : String(err));
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
server.registerTool("yfin_get_option_chain", {
|
|
317
|
+
title: "Get Option Chain",
|
|
318
|
+
description: "Get calls or puts option chain for a ticker and expiration date.",
|
|
319
|
+
inputSchema: z.object({
|
|
320
|
+
ticker: z.string().describe("Ticker symbol e.g. 'AAPL'"),
|
|
321
|
+
expiration_date: z.string().describe("Expiration date YYYY-MM-DD"),
|
|
322
|
+
option_type: z.enum(["calls", "puts"]).describe("Option type"),
|
|
323
|
+
...paginationSchema.shape,
|
|
324
|
+
}),
|
|
325
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
326
|
+
}, async ({ ticker, expiration_date, option_type, limit, offset }) => {
|
|
327
|
+
try {
|
|
328
|
+
const chain = await getOptionChain(ticker, expiration_date, option_type);
|
|
329
|
+
if (!chain || chain.length === 0) {
|
|
330
|
+
return createNotFoundError(`No ${option_type} options for '${ticker}' expiring ${expiration_date}.`);
|
|
331
|
+
}
|
|
332
|
+
const { items, total } = applyPagination(chain, { limit, offset });
|
|
333
|
+
const rows = items.map((o) => ({
|
|
334
|
+
contractSymbol: o.contractSymbol ?? "",
|
|
335
|
+
strike: o.strike ?? "",
|
|
336
|
+
lastPrice: o.lastPrice ?? "",
|
|
337
|
+
bid: o.bid ?? "",
|
|
338
|
+
ask: o.ask ?? "",
|
|
339
|
+
volume: o.volume ?? "",
|
|
340
|
+
openInterest: o.openInterest ?? "",
|
|
341
|
+
impliedVolatility: typeof o.impliedVolatility === "number"
|
|
342
|
+
? o.impliedVolatility.toFixed(4)
|
|
343
|
+
: "",
|
|
344
|
+
}));
|
|
345
|
+
const text = formatTable(rows, `${option_type.toUpperCase()} — ${ticker} (${expiration_date})`) +
|
|
346
|
+
`\n\n*Showing ${items.length}/${total} contracts*`;
|
|
347
|
+
return { content: [{ type: "text", text: truncateToLimit(text) }] };
|
|
348
|
+
}
|
|
349
|
+
catch (err) {
|
|
350
|
+
return createApiError(err instanceof Error ? err.message : String(err));
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
server.registerTool("yfin_get_recommendations", {
|
|
354
|
+
title: "Get Analyst Recommendations",
|
|
355
|
+
description: "Get analyst recommendations or upgrade/downgrade history.",
|
|
356
|
+
inputSchema: z.object({
|
|
357
|
+
ticker: z.string().describe("Ticker symbol e.g. 'AAPL'"),
|
|
358
|
+
recommendation_type: z
|
|
359
|
+
.enum(["recommendations", "upgrades_downgrades"])
|
|
360
|
+
.default("recommendations")
|
|
361
|
+
.describe("Type of recommendation data"),
|
|
362
|
+
months_back: z
|
|
363
|
+
.number()
|
|
364
|
+
.int()
|
|
365
|
+
.min(1)
|
|
366
|
+
.max(120)
|
|
367
|
+
.default(12)
|
|
368
|
+
.describe("Months back for upgrades/downgrades"),
|
|
369
|
+
...paginationSchema.shape,
|
|
370
|
+
}),
|
|
371
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
372
|
+
}, async ({ ticker, recommendation_type, months_back, limit, offset }) => {
|
|
373
|
+
try {
|
|
374
|
+
let data = await getRecommendations(ticker, recommendation_type);
|
|
375
|
+
if (!data || data.length === 0) {
|
|
376
|
+
return createNotFoundError(`No ${recommendation_type} data for '${ticker}'.`);
|
|
377
|
+
}
|
|
378
|
+
// Filter upgrades_downgrades by months_back
|
|
379
|
+
if (recommendation_type === "upgrades_downgrades") {
|
|
380
|
+
const cutoff = new Date();
|
|
381
|
+
cutoff.setMonth(cutoff.getMonth() - months_back);
|
|
382
|
+
data = data.filter((item) => {
|
|
383
|
+
const d = item.epochGradeDate;
|
|
384
|
+
if (d instanceof Date)
|
|
385
|
+
return d >= cutoff;
|
|
386
|
+
if (typeof d === "number")
|
|
387
|
+
return new Date(d * 1000) >= cutoff;
|
|
388
|
+
return true;
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
const { items, total } = applyPagination(data, { limit, offset });
|
|
392
|
+
const rows = items.map((item) => flattenFinancialItem(item));
|
|
393
|
+
const text = formatTable(rows, `${recommendation_type.replace(/_/g, " ").toUpperCase()} — ${ticker}`) +
|
|
394
|
+
`\n\n*Showing ${items.length}/${total} items*`;
|
|
395
|
+
return { content: [{ type: "text", text: truncateToLimit(text) }] };
|
|
396
|
+
}
|
|
397
|
+
catch (err) {
|
|
398
|
+
return createApiError(err instanceof Error ? err.message : String(err));
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
// --- Start Server ---
|
|
402
|
+
async function main() {
|
|
403
|
+
const transport = new StdioServerTransport();
|
|
404
|
+
await server.connect(transport);
|
|
405
|
+
}
|
|
406
|
+
main().catch((err) => {
|
|
407
|
+
console.error("Fatal error:", err);
|
|
408
|
+
process.exit(1);
|
|
409
|
+
});
|
|
410
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type HistoricalInterval = "1m" | "2m" | "5m" | "15m" | "30m" | "60m" | "90m" | "1h" | "1d" | "5d" | "1wk" | "1mo" | "3mo";
|
|
2
|
+
export type HistoricalPeriod = "1d" | "5d" | "1mo" | "3mo" | "6mo" | "1y" | "2y" | "5y" | "10y" | "ytd" | "max";
|
|
3
|
+
export type FinancialType = "income_stmt" | "quarterly_income_stmt" | "balance_sheet" | "quarterly_balance_sheet" | "cashflow" | "quarterly_cashflow";
|
|
4
|
+
export type HolderType = "major_holders" | "institutional_holders" | "mutualfund_holders" | "insider_transactions" | "insider_purchases" | "insider_roster_holders";
|
|
5
|
+
export type RecommendationType = "recommendations" | "upgrades_downgrades";
|
|
6
|
+
export type OptionType = "calls" | "puts";
|
|
7
|
+
export interface HistoricalQuote {
|
|
8
|
+
date: Date;
|
|
9
|
+
open: number;
|
|
10
|
+
high: number;
|
|
11
|
+
low: number;
|
|
12
|
+
close: number;
|
|
13
|
+
volume: number;
|
|
14
|
+
adjclose?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface NewsItem {
|
|
17
|
+
title: string;
|
|
18
|
+
publisher: string;
|
|
19
|
+
link: string;
|
|
20
|
+
providerPublishTime?: Date;
|
|
21
|
+
type?: string;
|
|
22
|
+
uuid?: string;
|
|
23
|
+
relatedTickers?: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface DividendEvent {
|
|
26
|
+
date: Date;
|
|
27
|
+
amount: number;
|
|
28
|
+
}
|
|
29
|
+
export interface SplitEvent {
|
|
30
|
+
date: Date;
|
|
31
|
+
numerator: number;
|
|
32
|
+
denominator: number;
|
|
33
|
+
splitRatio: string;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAC1B,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAClD,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GACxB,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GACnC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAE/C,MAAM,MAAM,aAAa,GACrB,aAAa,GACb,uBAAuB,GACvB,eAAe,GACf,yBAAyB,GACzB,UAAU,GACV,oBAAoB,CAAC;AAEzB,MAAM,MAAM,UAAU,GAClB,eAAe,GACf,uBAAuB,GACvB,oBAAoB,GACpB,sBAAsB,GACtB,mBAAmB,GACnB,wBAAwB,CAAC;AAE7B,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,GAAG,qBAAqB,CAAC;AAE3E,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,CAAC,EAAE,IAAI,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,iCAAiC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@fre4x/yahoo-finance",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "A Yahoo Finance MCP server for LLMs.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"yahoo-finance": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"typecheck": "tsc --noEmit",
|
|
16
|
+
"prepublishOnly": "npm run build",
|
|
17
|
+
"start": "node dist/index.js",
|
|
18
|
+
"dev": "tsx src/index.ts",
|
|
19
|
+
"watch": "tsc -w"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"mcp",
|
|
23
|
+
"yahoo-finance",
|
|
24
|
+
"stocks",
|
|
25
|
+
"mcp-server",
|
|
26
|
+
"ai"
|
|
27
|
+
],
|
|
28
|
+
"author": "fritzprix",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
32
|
+
"yahoo-finance2": "^2.13.3",
|
|
33
|
+
"zod": "^4.3.6"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^25.3.0",
|
|
37
|
+
"tsx": "^4.21.0",
|
|
38
|
+
"typescript": "^5.9.3"
|
|
39
|
+
}
|
|
40
|
+
}
|