Skip to main content
Glama
josuekongolo

CompanyIQ MCP Server

by josuekongolo
fetch_financials.ts7.19 kB
import { z } from 'zod'; import { CompanyDatabase } from '../database/db.js'; import { BrregClient } from '../apis/brreg.js'; import { RegnskapClient } from '../apis/regnskap.js'; const FetchFinancialsSchema = z.object({ org_nr: z.string().describe("Organisasjonsnummer"), auto_import: z.boolean().default(true).describe("Lagre automatisk til database"), all_years: z.boolean().default(true).describe("Forsøk å hente alle tilgjengelige år") }); /** * Automatically fetch financial data from Regnskapsregisteret API * NO manual download required - fully automated! * Note: Open API only returns latest year. Historical data requires manual import. */ export async function fetchFinancials(args: unknown, db: CompanyDatabase, brreg: BrregClient) { const params = FetchFinancialsSchema.parse(args); // Verify company exists and save to database if needed let company = await db.getCompany(params.org_nr); if (!company) { const brregCompany = await brreg.getCompany(params.org_nr); if (!brregCompany) { return { content: [{ type: "text" as const, text: `Fant ikke selskap med org.nr ${params.org_nr}` }] }; } // Save company to database first (required for foreign key) await db.insertOrUpdateCompany({ org_nr: brregCompany.organisasjonsnummer, name: brregCompany.navn, organization_form: brregCompany.organisasjonsform?.beskrivelse, nace_code: brregCompany.naeringskode1?.kode, nace_description: brregCompany.naeringskode1?.beskrivelse, employees_count: brregCompany.antallAnsatte, business_municipality: brregCompany.forretningsadresse?.kommune, bankrupt: brregCompany.konkurs, under_liquidation: brregCompany.underAvvikling, last_updated: new Date().toISOString() } as any); company = await db.getCompany(params.org_nr); } // Fetch financial data from Regnskapsregisteret const regnskapClient = new RegnskapClient(); let financialDataList: any[] = []; if (params.all_years) { // Fetch all available years (Note: Open API only returns latest) financialDataList = await regnskapClient.getAllAvailableFinancials(params.org_nr); } else { // Fetch only latest year const singleYear = await regnskapClient.getExtractedFinancials(params.org_nr); if (singleYear) financialDataList = [singleYear]; } if (financialDataList.length === 0) { return { content: [{ type: "text" as const, text: ` ❌ INGEN REGNSKAPSDATA TILGJENGELIG: ${company?.name || params.org_nr} Regnskapsregisteret API har ikke data for dette selskapet. Mulige årsaker: - Selskapet har ikke levert årsregnskap ennå - Selskapet er for lite (ikke regnskapspliktig) - Regnskapet er ikke godkjent ennå - Data finnes bare fra 2018 og nyere 💡 ALTERNATIV: Bruk 'get_financial_link' for å laste ned manuelt fra Brønnøysund. ` }] }; } // Auto-import to database if requested if (params.auto_import) { for (const financialData of financialDataList) { await db.insertFinancialSnapshot({ org_nr: financialData.org_nr, year: financialData.year, revenue: financialData.revenue, profit: financialData.profit, assets: financialData.assets, equity: financialData.equity, employees: null, // Not in accounting data source: 'regnskapsregisteret_api' }); } } // Calculate growth if we have multiple years let growthStats = null; if (financialDataList.length >= 2) { const latest = financialDataList[0]; const previous = financialDataList[1]; if (latest.revenue && previous.revenue && previous.revenue > 0) { const revenueGrowth = ((latest.revenue - previous.revenue) / previous.revenue) * 100; const profitGrowth = latest.profit && previous.profit && previous.profit !== 0 ? ((latest.profit - previous.profit) / Math.abs(previous.profit)) * 100 : null; growthStats = { revenueGrowth: revenueGrowth.toFixed(1), profitGrowth: profitGrowth?.toFixed(1), years: `${previous.year} → ${latest.year}` }; } } const latest = financialDataList[0]; // Check if we have historical data in database const dbHistory = await db.getFinancialHistory(params.org_nr, 10); const hasHistoricalData = dbHistory.length > 1; const report = ` 🎉 REGNSKAPSDATA HENTET AUTOMATISK: ${company?.name || params.org_nr} 📋 Regnskapsår: ${latest.year} 💱 Valuta: ${latest.currency} 🔖 Kilde: Regnskapsregisteret API (offisielt) ${financialDataList.length === 1 ? `\nℹ️ Open API returnerer kun siste år. For historiske data: Kjør fetch årlig eller bruk manuell import.` : ''} 📊 SISTE ÅR (${latest.year}): ${latest.revenue ? `💰 Driftsinntekter: ${(latest.revenue / 1000000).toFixed(1)}M ${latest.currency}` : ''} ${latest.operating_profit ? `📈 Driftsresultat: ${(latest.operating_profit / 1000000).toFixed(1)}M ${latest.currency}` : ''} ${latest.profit ? `✨ Årsresultat: ${(latest.profit / 1000000).toFixed(1)}M ${latest.currency}` : ''} ${latest.revenue && latest.profit ? `📊 Resultatmargin: ${((latest.profit / latest.revenue) * 100).toFixed(1)}%` : ''} ${latest.assets ? `🏢 Sum eiendeler: ${(latest.assets / 1000000).toFixed(1)}M ${latest.currency}` : ''} ${latest.equity ? `💎 Egenkapital: ${(latest.equity / 1000000).toFixed(1)}M ${latest.currency}` : ''} ${latest.debt ? `📉 Gjeld: ${(latest.debt / 1000000).toFixed(1)}M ${latest.currency}` : ''} ${latest.assets && latest.equity ? `📊 Egenkapitalandel: ${((latest.equity / latest.assets) * 100).toFixed(1)}%` : ''} ${hasHistoricalData && dbHistory.length > 1 ? ` 📈 VEKSTANALYSE (basert på ${dbHistory.length} år i database): ${dbHistory.length >= 2 && (dbHistory[0] as any).revenue && (dbHistory[1] as any).revenue ? `- Omsetningsvekst siste år: ${(((dbHistory[0] as any).revenue - (dbHistory[1] as any).revenue) / (dbHistory[1] as any).revenue * 100).toFixed(1)}%` : ''} ${dbHistory.length >= 2 && (dbHistory[0] as any).profit && (dbHistory[1] as any).profit ? `- Resultatvekst siste år: ${(((dbHistory[0] as any).profit - (dbHistory[1] as any).profit) / Math.abs((dbHistory[1] as any).profit) * 100).toFixed(1)}%` : ''} ` : ''} ${hasHistoricalData ? ` 📊 HISTORISK OVERSIKT (fra database): ${dbHistory.slice(0, 5).map((f: any) => `${f.year}: ${f.revenue ? (f.revenue / 1000000).toFixed(0) + 'M' : 'N/A'} omsetning, ${f.profit ? (f.profit / 1000000).toFixed(0) + 'M' : 'N/A'} resultat` ).join('\n')} ` : ''} ${params.auto_import ? ` ✅ DATA AUTOMATISK LAGRET I DATABASE 💡 VIDERE ANALYSE: - analyze_financials → Fullstendig risikoanalyse med reelle tall - analyze_growth → ${hasHistoricalData ? `Vekstberegning med ${dbHistory.length} års data` : 'Kjør fetch igjen neste år for trendanalyse'} - Sammenligning med SSB bransjesnitt ` : ''} 🚀 FULLT AUTOMATISK! ${hasHistoricalData ? `Du har nå ${dbHistory.length} år med regnskapsdata for dette selskapet.` : 'Kjør fetch_financials årlig for å bygge historikk.'} `; return { content: [{ type: "text" as const, text: report }] }; }

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/josuekongolo/companyiq-mcp'

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