UNPKG

@gviper/alphavantage-mcp

Version:

MCP (Model Context Protocol) server for Alpha Vantage financial data API

105 lines (92 loc) 4.34 kB
import { z } from 'zod'; import { Stocks } from '@gviper/alphavantage-api'; // Zod schemas for validation const IntradayParamsSchema = z.object({ symbol: z.string().describe('The name of the equity of your choice'), interval: z.enum(['1min', '5min', '15min', '30min', '60min']).describe('Time interval between two consecutive data points'), adjusted: z.boolean().optional().describe('By default, adjusted=true and the output time series is adjusted by historical split and dividend events'), extended_hours: z.boolean().optional().describe('By default, extended_hours=true and the output will include both the regular trading hours and the extended trading hours'), month: z.string().optional().describe('By default, it returns the latest 30 days of intraday data'), outputsize: z.enum(['compact', 'full']).optional().describe('By default, outputsize=compact'), datatype: z.enum(['json', 'csv']).optional().describe('By default, datatype=json'), }); const DailyParamsSchema = z.object({ symbol: z.string().describe('The name of the equity of your choice'), outputsize: z.enum(['compact', 'full']).optional().describe('By default, outputsize=compact'), datatype: z.enum(['json', 'csv']).optional().describe('By default, datatype=json'), }); const QuoteParamsSchema = z.object({ symbol: z.string().describe('The symbol of the equity of your choice'), datatype: z.enum(['json', 'csv']).optional().describe('By default, datatype=json'), }); const SearchParamsSchema = z.object({ keywords: z.string().describe('A text string of your choice'), datatype: z.enum(['json', 'csv']).optional().describe('By default, datatype=json'), }); export function createStocksTools(stocks: Stocks) { return { 'av_stocks_intraday': { description: 'Get intraday time series data for a stock symbol with specified interval', inputSchema: IntradayParamsSchema, handler: async (params: z.infer<typeof IntradayParamsSchema>) => { return await stocks.intraday(params); }, }, 'av_stocks_daily': { description: 'Get daily time series data for a stock symbol', inputSchema: DailyParamsSchema, handler: async (params: z.infer<typeof DailyParamsSchema>) => { return await stocks.daily(params); }, }, 'av_stocks_daily_adjusted': { description: 'Get daily adjusted time series data (adjusted for splits and dividends) for a stock symbol', inputSchema: DailyParamsSchema, handler: async (params: z.infer<typeof DailyParamsSchema>) => { return await stocks.dailyAdjusted(params); }, }, 'av_stocks_weekly': { description: 'Get weekly time series data for a stock symbol', inputSchema: DailyParamsSchema, handler: async (params: z.infer<typeof DailyParamsSchema>) => { return await stocks.weekly(params); }, }, 'av_stocks_weekly_adjusted': { description: 'Get weekly adjusted time series data (adjusted for splits and dividends) for a stock symbol', inputSchema: DailyParamsSchema, handler: async (params: z.infer<typeof DailyParamsSchema>) => { return await stocks.weeklyAdjusted(params); }, }, 'av_stocks_monthly': { description: 'Get monthly time series data for a stock symbol', inputSchema: DailyParamsSchema, handler: async (params: z.infer<typeof DailyParamsSchema>) => { return await stocks.monthly(params); }, }, 'av_stocks_monthly_adjusted': { description: 'Get monthly adjusted time series data (adjusted for splits and dividends) for a stock symbol', inputSchema: DailyParamsSchema, handler: async (params: z.infer<typeof DailyParamsSchema>) => { return await stocks.monthlyAdjusted(params); }, }, 'av_stocks_quote': { description: 'Get the latest price and volume information for a stock symbol', inputSchema: QuoteParamsSchema, handler: async (params: z.infer<typeof QuoteParamsSchema>) => { return await stocks.quote(params); }, }, 'av_stocks_search': { description: 'Search for stocks and ETFs based on keywords', inputSchema: SearchParamsSchema, handler: async (params: z.infer<typeof SearchParamsSchema>) => { return await stocks.search(params); }, }, }; }