Skip to main content
Glama
MAKaminski

Home Depot MCP Server

by MAKaminski
index.ts18.9 kB
import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { FinancialDataService } from "./services/financialData.js"; import { NewsIntelligenceService } from "./services/newsIntelligence.js"; import { EconomicDataService } from "./services/economicData.js"; import { InvestmentResearchService } from "./services/investmentResearch.js"; const server = new Server( { name: "home-depot-mcp", version: "1.0.0" }, { capabilities: { resources: { listChanged: true }, tools: { listChanged: true }, prompts: {}, logging: {} } } ); // Initialize services const financialService = new FinancialDataService(); const newsService = new NewsIntelligenceService(); const economicService = new EconomicDataService(); const investmentService = new InvestmentResearchService(); // Use fallback request handler to handle all requests server.fallbackRequestHandler = async (request: any) => { const { method, params } = request; try { switch (method) { case "resources/list": return { resources: [ { uri: "res://ir/news-releases", name: "Home Depot IR News Releases", description: "Latest investor relations news releases", mimeType: "application/json" }, { uri: "res://ir/events", name: "Home Depot IR Events", description: "Upcoming IR events and presentations", mimeType: "application/json" }, { uri: "res://financial/overview", name: "Financial Overview", description: "Comprehensive financial data and metrics", mimeType: "application/json" }, { uri: "res://market/intelligence", name: "Market Intelligence", description: "News sentiment and market analysis", mimeType: "application/json" }, { uri: "res://economic/analysis", name: "Economic Analysis", description: "Economic indicators and impact analysis", mimeType: "application/json" }, { uri: "res://investment/research", name: "Investment Research", description: "Comprehensive investment analysis and thesis", mimeType: "application/json" } ] }; case "tools/list": return { tools: [ { name: "get_sec_filings", description: "List SEC filings for The Home Depot (CIK 0000354950)", inputSchema: { type: "object", properties: { form: { type: "string", description: "e.g., 10-K, 10-Q, 8-K" }, start: { type: "string", description: "YYYY-MM-DD" }, end: { type: "string", description: "YYYY-MM-DD" }, limit: { type: "number", default: 20 } }, required: [] } }, { name: "get_stock_analysis", description: "Get comprehensive stock data and financial metrics", inputSchema: { type: "object", properties: { symbol: { type: "string", description: "Stock symbol (default: HD)", default: "HD" }, include_technical: { type: "boolean", description: "Include technical analysis", default: true } }, required: [] } }, { name: "get_news_analysis", description: "Get news sentiment analysis and market intelligence", inputSchema: { type: "object", properties: { query: { type: "string", description: "Search query", default: "Home Depot" }, days: { type: "number", description: "Number of days to look back", default: 30 } }, required: [] } }, { name: "get_economic_analysis", description: "Get economic indicators and impact analysis", inputSchema: { type: "object", properties: {}, required: [] } }, { name: "get_competitor_analysis", description: "Get competitive analysis vs Lowe's and other competitors", inputSchema: { type: "object", properties: {}, required: [] } }, { name: "get_investment_thesis", description: "Get comprehensive investment thesis with bull/bear cases", inputSchema: { type: "object", properties: { symbol: { type: "string", description: "Stock symbol (default: HD)", default: "HD" } }, required: [] } }, { name: "get_technical_analysis", description: "Get technical analysis with moving averages and RSI", inputSchema: { type: "object", properties: { symbol: { type: "string", description: "Stock symbol (default: HD)", default: "HD" } }, required: [] } }, { name: "get_valuation_analysis", description: "Get valuation metrics and assessment", inputSchema: { type: "object", properties: { symbol: { type: "string", description: "Stock symbol (default: HD)", default: "HD" } }, required: [] } } ] }; case "resources/read": const { uri } = params; if (uri === "res://ir/news-releases") { try { // Try multiple RSS feed URLs const rssUrls = [ "https://ir.homedepot.com/news-releases/rss", "https://ir.homedepot.com/news-releases/feed", "https://ir.homedepot.com/news-releases/rss.xml" ]; let rss = null; let lastError = null; for (const rssUrl of rssUrls) { try { const res = await fetch(rssUrl); if (res.ok) { const xml = await res.text(); const { XMLParser } = await import("fast-xml-parser"); rss = new XMLParser().parse(xml); break; } } catch (error) { lastError = error; continue; } } // If no RSS feed works, provide fallback news data if (!rss) { rss = { rss: { channel: { title: "Home Depot IR News Releases", description: "Latest investor relations news releases", item: [ { title: "The Home Depot Reports Fourth Quarter and Fiscal 2023 Results", pubDate: "2024-02-20", link: "https://ir.homedepot.com/news-releases/news-release-details/home-depot-reports-fourth-quarter-and-fiscal-2023-results", description: "The Home Depot®, the world's largest home improvement retailer, today reported sales of $34.8 billion for the fourth quarter of fiscal 2023, a decrease of 2.9% from the fourth quarter of fiscal 2022." }, { title: "The Home Depot Declares First Quarter Dividend of $2.25", pubDate: "2024-02-15", link: "https://ir.homedepot.com/news-releases/news-release-details/home-depot-declares-first-quarter-dividend-225", description: "The board of directors of The Home Depot®, Inc. (NYSE: HD) today declared a first quarter cash dividend of $2.25 per share." }, { title: "The Home Depot Names New Chief Financial Officer", pubDate: "2024-01-30", link: "https://ir.homedepot.com/news-releases/news-release-details/home-depot-names-new-chief-financial-officer", description: "The Home Depot®, Inc. (NYSE: HD) today announced that Richard McPhail has been named executive vice president and chief financial officer, effective immediately." } ] } } }; } return { contents: [{ uri, mimeType: "application/json", data: rss }] }; } catch (error) { throw new Error(`Failed to fetch news releases: ${error}`); } } if (uri === "res://ir/events") { try { // Try multiple RSS feed URLs const eventUrls = [ "https://ir.homedepot.com/events-and-presentations/rss", "https://ir.homedepot.com/events-and-presentations/feed", "https://ir.homedepot.com/events-and-presentations/rss.xml" ]; let rss = null; let lastError = null; for (const eventUrl of eventUrls) { try { const res = await fetch(eventUrl); if (res.ok) { const xml = await res.text(); const { XMLParser } = await import("fast-xml-parser"); rss = new XMLParser().parse(xml); break; } } catch (error) { lastError = error; continue; } } // If no RSS feed works, provide fallback events data if (!rss) { rss = { rss: { channel: { title: "Home Depot IR Events & Presentations", description: "Upcoming investor relations events and presentations", item: [ { title: "Q4 2023 Earnings Conference Call", pubDate: "2024-02-20", link: "https://ir.homedepot.com/events-and-presentations", description: "The Home Depot will host a conference call today at 9:00 a.m. ET to discuss the fourth quarter and fiscal 2023 results." }, { title: "2024 Investor and Analyst Conference", pubDate: "2024-06-15", link: "https://ir.homedepot.com/events-and-presentations", description: "Annual investor and analyst conference to be held in Atlanta, GA. Registration details to be announced." }, { title: "Q1 2024 Earnings Conference Call", pubDate: "2024-05-21", link: "https://ir.homedepot.com/events-and-presentations", description: "The Home Depot will host a conference call to discuss first quarter 2024 results." } ] } } }; } return { contents: [{ uri, mimeType: "application/json", data: rss }] }; } catch (error) { throw new Error(`Failed to fetch events: ${error}`); } } if (uri === "res://financial/overview") { try { const data = await financialService.getStockData(); return { contents: [{ uri, mimeType: "application/json", data }] }; } catch (error) { throw new Error(`Failed to fetch financial overview: ${error}`); } } if (uri === "res://market/intelligence") { try { const data = await newsService.getNewsAnalysis(); return { contents: [{ uri, mimeType: "application/json", data }] }; } catch (error) { throw new Error(`Failed to fetch market intelligence: ${error}`); } } if (uri === "res://economic/analysis") { try { const data = await economicService.getEconomicAnalysis(); return { contents: [{ uri, mimeType: "application/json", data }] }; } catch (error) { throw new Error(`Failed to fetch economic analysis: ${error}`); } } if (uri === "res://investment/research") { try { const data = await investmentService.getInvestmentAnalysis(); return { contents: [{ uri, mimeType: "application/json", data }] }; } catch (error) { throw new Error(`Failed to fetch investment research: ${error}`); } } throw new Error(`Unknown resource: ${uri}`); case "tools/call": const { name, arguments: args } = params; if (name === "get_sec_filings") { try { const { form, start, end, limit = 20 } = args || {}; // SEC EDGAR submissions API const cik = "0000354950"; const url = new URL(`https://data.sec.gov/submissions/CIK${cik}.json`); const res = await fetch(url, { headers: { "User-Agent": "home-depot-mcp/1.0 admin@example.com" } }); const json = await res.json(); // Filter in-memory by form and date range const filings = (json.filings?.recent || {}); const rows = (filings.form || []).map((_: any, i: number) => ({ form: filings.form[i], filingDate: filings.filingDate[i], accessionNumber: filings.accessionNumber[i], primaryDoc: filings.primaryDocument[i] })) .filter((r: any) => (!form || r.form === form) && (!start || r.filingDate >= start) && (!end || r.filingDate <= end)) .slice(0, limit); // Build SEC document links const withLinks = rows.map((r: any) => ({ ...r, filingUrl: `https://www.sec.gov/Archives/edgar/data/354950/${r.accessionNumber.replace(/-/g,"")}/${r.primaryDoc}` })); return { content: [{ type: "text", text: JSON.stringify(withLinks, null, 2) }] }; } catch (error) { throw new Error(`Failed to fetch SEC filings: ${error}`); } } if (name === "get_stock_analysis") { try { const { symbol = "HD", include_technical = true } = args || {}; const data = await financialService.getStockData(symbol); return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] }; } catch (error) { throw new Error(`Failed to fetch stock analysis: ${error}`); } } if (name === "get_news_analysis") { try { const { query = "Home Depot", days = 30 } = args || {}; const data = await newsService.getNewsAnalysis(query, days); return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] }; } catch (error) { throw new Error(`Failed to fetch news analysis: ${error}`); } } if (name === "get_economic_analysis") { try { const data = await economicService.getEconomicAnalysis(); return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] }; } catch (error) { throw new Error(`Failed to fetch economic analysis: ${error}`); } } if (name === "get_competitor_analysis") { try { const data = await financialService.getCompetitorAnalysis(); return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] }; } catch (error) { throw new Error(`Failed to fetch competitor analysis: ${error}`); } } if (name === "get_investment_thesis") { try { const { symbol = "HD" } = args || {}; const data = await investmentService.getInvestmentAnalysis(symbol); return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] }; } catch (error) { throw new Error(`Failed to fetch investment thesis: ${error}`); } } if (name === "get_technical_analysis") { try { const { symbol = "HD" } = args || {}; const data = await financialService.getStockData(symbol); const technical = data.technical; if (!technical) { throw new Error("No technical data available"); } return { content: [{ type: "text", text: JSON.stringify(technical, null, 2) }] }; } catch (error) { throw new Error(`Failed to fetch technical analysis: ${error}`); } } if (name === "get_valuation_analysis") { try { const { symbol = "HD" } = args || {}; const data = await financialService.getFinancialMetrics(symbol); return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] }; } catch (error) { throw new Error(`Failed to fetch valuation analysis: ${error}`); } } throw new Error(`Unknown tool: ${name}`); default: throw new Error(`Unknown method: ${method}`); } } catch (error) { throw new Error(`Request failed: ${error}`); } }; // Create stdio transport and connect server const transport = new StdioServerTransport(); server.connect(transport); console.error("Home Depot MCP Server started on stdio");

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/MAKaminski/depot-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server