github TypeScript analyzed 3a7098d

finlynq/finlynq

github

Open-source (AGPL v3) personal finance app with a first-party MCP server. Track your money here, analyze it anywhere — query your finances from Claude, Cursor, or any MCP client. Self-host with Docker or use the free cloud.

maintainer
finlynq
license
AGPL-3.0
first seen
2026-06-04
last seen
2026-08-01
releases · 30d
2
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 2 tools
transport stdio · streamable-http counts 2 tools · 0 res · 0 prompts permission surface via code analysis

tools

  • get_categories
  • get_goals
skills & danger signals github-tarball
prompt-surface shipped agent-instruction files + hidden-content / dangerous-code findings — quoted from the analyzed source

analyzed commit 3a7098d · analyzer v28 · 12h ago

danger signals2

  • suspicious endpoint www.google-analytics.com (telemetry) finlynq-finlynq-3a7098d/next.config.ts :21 "img-src 'self' data: blob: https://assets.coingecko.com https://coin-images.coingecko.com https://www.google-analytics.com https://www.googletagmanager.com",
  • suspicious endpoint www.google-analytics.com (telemetry) finlynq-finlynq-3a7098d/src/middleware.ts :362 ? "img-src 'self' data: blob: https://coin-images.coingecko.com https://assets.coingecko.com https://www.google-analytics.com https://www.googletagmanager.com"
code evidence vv3.4.1 · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 1210

filesystem 7

  • fs finlynq-finlynq-3a7098d/mcp-server/register-core-tools.ts :41 import fs from "fs/promises";
  • fs finlynq-finlynq-3a7098d/src/app/api/admin/feedback/[id]/reply/route.ts :17 import fs from "fs/promises";
  • fs finlynq-finlynq-3a7098d/src/app/api/feedback/[id]/reply/route.ts :18 import fs from "fs/promises";
  • fs finlynq-finlynq-3a7098d/src/app/api/feedback/route.ts :13 import fs from "fs/promises";
  • fs finlynq-finlynq-3a7098d/src/lib/admin/system-metrics.ts :20 import { statfs } from "node:fs/promises";
  • fs finlynq-finlynq-3a7098d/src/lib/feedback/attachment-io.ts :10 import fs from "fs/promises";
  • fs finlynq-finlynq-3a7098d/src/lib/server-logger.ts :8 import { appendFile } from "fs/promises";

shell / exec 10

  • shell finlynq-finlynq-3a7098d/mobile/src/lib/constants.ts :49 // PUT /api/settings/display-currency route enforces `^[A-Z]{3}$` + the
  • shell finlynq-finlynq-3a7098d/mobile/src/lib/format.ts :5 * bare `$`. `Intl.NumberFormat` can only produce `$` / `CA$` / `CAD` for CAD —
  • shell finlynq-finlynq-3a7098d/src/app/robots.ts :9 * with `$` so it does NOT also block the public `/mcp-guide` page — a bare
  • shell finlynq-finlynq-3a7098d/src/components/onboarding-wizard.tsx :125 // Symbols are not all one character — `$` and `€` are, but `C$` is two and
  • shell finlynq-finlynq-3a7098d/src/components/reconcile/bank-pane.tsx :13 * Keeping a fork (~150 LOC) is cleaner than piling reconcile props onto the
  • shell finlynq-finlynq-3a7098d/src/db/schema-pg.ts :1666 // what the email body parsed (a bare `$` defaults USD). Plaintext.
  • shell finlynq-finlynq-3a7098d/src/lib/currency.ts :3 * bare `$`. `Intl.NumberFormat` can only produce `$` / `CA$` / `CAD` for CAD —
  • shell finlynq-finlynq-3a7098d/src/lib/email-import/import-address.ts :27 * `^<prefix><8..64 lowercase hex>$` for the active env prefix. Built per call
  • shell finlynq-finlynq-3a7098d/src/lib/email-import/parse-body.ts :35 /** ISO 4217. Defaults to USD when only a bare `$` is present. */
  • shell finlynq-finlynq-3a7098d/src/lib/email-import/process-pending-inbox.ts :337 // body-parsed currency (a bare `$` ⇒ USD) is deliberately NOT used — a CAD

network 133

  • net finlynq-finlynq-3a7098d/mobile/src/api/client.ts :69 res = await fetch(url, { ...options, headers });
  • net finlynq-finlynq-3a7098d/mobile/src/screens/ImportScreen.tsx :89 const res = await fetch(`${getServerUrl()}/api/import/preview`, {
  • net finlynq-finlynq-3a7098d/mobile/src/screens/InboxScreen.tsx :10 // The screen owns the snapshot fetch (GET /api/reconcile/suggestions), the
  • net finlynq-finlynq-3a7098d/packages/import-connectors/src/rate-limited-fetch.ts :69 return fetch(input, init);
  • net finlynq-finlynq-3a7098d/src/app/(app)/accounts/[id]/page.tsx :156 const res = await fetch("/api/portfolio");
  • net finlynq-finlynq-3a7098d/src/app/(app)/accounts/_components/account-dialog.tsx :212 const res = await fetch("/api/accounts", {
  • net finlynq-finlynq-3a7098d/src/app/(app)/accounts/_components/manage-groups-dialog.tsx :69 fetch("/api/settings/account-group-order")
  • net finlynq-finlynq-3a7098d/src/app/(app)/accounts/page.tsx :154 fetch("/api/settings/account-group-order")
  • net finlynq-finlynq-3a7098d/src/app/(app)/admin/announcements/page.tsx :61 const res = await fetch("/api/admin/announcements");
  • net finlynq-finlynq-3a7098d/src/app/(app)/admin/api-log/page.tsx :75 const res = await fetch("/api/admin/api-log", { cache: "no-store" });
  • net finlynq-finlynq-3a7098d/src/app/(app)/admin/diagnostics/page.tsx :91 const res = await fetch(`/api/admin/diagnostics?${params.toString()}`, { cache: "no-store" });
  • net finlynq-finlynq-3a7098d/src/app/(app)/admin/email-inbox/page.tsx :120 const res = await fetch(`/api/admin/email-inbox${qs ? `?${qs}` : ""}`);
  • net finlynq-finlynq-3a7098d/src/app/(app)/admin/feedback/page.tsx :149 fetch(`/api/admin/feedback/${feedbackId}`)
  • net finlynq-finlynq-3a7098d/src/app/(app)/admin/inbox/page.tsx :129 const res = await fetch(`/api/admin/inbox?category=${category}`);
  • net finlynq-finlynq-3a7098d/src/app/(app)/admin/page.tsx :265 const res = await fetch(`/api/admin/users?${params.toString()}`);
  • net finlynq-finlynq-3a7098d/src/app/(app)/admin/price-cache/page.tsx :148 const res = await fetch(`/api/admin/price-cache?${qp.toString()}`, { cache: "no-store" });
  • net finlynq-finlynq-3a7098d/src/app/(app)/admin/system/page.tsx :268 const res = await fetch("/api/admin/system", { cache: "no-store" });
  • net finlynq-finlynq-3a7098d/src/app/(app)/budgets/page.tsx :111 fetch(`/api/budgets?month=${month}&rollover=1&currency=${encodeURIComponent(displayCurrency)}`)
  • net finlynq-finlynq-3a7098d/src/app/(app)/calendar/page.tsx :148 fetch("/api/subscriptions")
  • net finlynq-finlynq-3a7098d/src/app/(app)/chat/page.tsx :300 const res = await fetch("/api/chat", {
  • net finlynq-finlynq-3a7098d/src/app/(app)/dashboard/_components/action-center.tsx :39 fetch("/api/spotlight")
  • net finlynq-finlynq-3a7098d/src/app/(app)/dashboard/_components/health-score-card.tsx :118 fetch("/api/health-score")
  • net finlynq-finlynq-3a7098d/src/app/(app)/dashboard/_components/insights-section.tsx :62 fetch("/api/insights")
  • net finlynq-finlynq-3a7098d/src/app/(app)/dashboard/_components/weekly-recap.tsx :29 fetch("/api/recap")
  • net finlynq-finlynq-3a7098d/src/app/(app)/dashboard/page.tsx :126 fetch(`/api/dashboard?currency=${encodeURIComponent(displayCurrency)}`)
  • net finlynq-finlynq-3a7098d/src/app/(app)/feedback/page.tsx :132 fetch(`/api/feedback/${feedbackId}`)
  • net finlynq-finlynq-3a7098d/src/app/(app)/fire/page.tsx :98 const res = await fetch("/api/dashboard");
  • net finlynq-finlynq-3a7098d/src/app/(app)/goals/page.tsx :182 res = await fetch("/api/goals", {
  • net finlynq-finlynq-3a7098d/src/app/(app)/import/components/column-mapping-dialog.tsx :48 * sample / suggestion. Parent owns the fetch (it holds the File). Called
  • net finlynq-finlynq-3a7098d/src/app/(app)/import/components/connector-reconciliation-dialog.tsx :55 const res = await fetch(
  • net finlynq-finlynq-3a7098d/src/app/(app)/import/components/connector-tab.tsx :112 fetch("/api/import/connectors/wealthposition/credentials")
  • net finlynq-finlynq-3a7098d/src/app/(app)/import/components/edit-template-dialog.tsx :123 const res = await fetch(`/api/import/templates/${template.id}`, {
  • net finlynq-finlynq-3a7098d/src/app/(app)/import/components/generic-csv-connector-tab.tsx :197 fetch("/api/accounts")
  • net finlynq-finlynq-3a7098d/src/app/(app)/import/components/investment-statement-importer.tsx :50 fetch("/api/accounts")
  • net finlynq-finlynq-3a7098d/src/app/(app)/import/components/moneypro-connector-tab.tsx :163 fetch("/api/accounts")
  • net finlynq-finlynq-3a7098d/src/app/(app)/import/components/save-template-dialog.tsx :115 const res = await fetch("/api/import/templates", {
  • net finlynq-finlynq-3a7098d/src/app/(app)/import/components/template-manager.tsx :25 const res = await fetch(`/api/import/templates/${id}`, { method: "DELETE" });
  • net finlynq-finlynq-3a7098d/src/app/(app)/import/page.tsx :125 const res = await fetch("/api/accounts");
  • net finlynq-finlynq-3a7098d/src/app/(app)/import/pending/_components/unbound-picker-pane.tsx :49 const resp = await fetch(`/api/import/staged/${openId}`);
  • net finlynq-finlynq-3a7098d/src/app/(app)/import/pending/_hooks/use-staged.ts :37 const res = await fetch("/api/import/staged");
  • net finlynq-finlynq-3a7098d/src/app/(app)/loans/page.tsx :178 fetch("/api/loans")
  • net finlynq-finlynq-3a7098d/src/app/(app)/portfolio/_hooks/use-portfolio.ts :29 fetch(`/api/portfolio/overview?currency=${encodeURIComponent(displayCurrency)}`)
  • net finlynq-finlynq-3a7098d/src/app/(app)/portfolio/dividends/page.tsx :99 fetch(`/api/portfolio/dividends?${queryParams.toString()}`)
  • net finlynq-finlynq-3a7098d/src/app/(app)/portfolio/realized-gains/page.tsx :193 fetch(`/api/portfolio/realized-gains?${params.toString()}`)
  • net finlynq-finlynq-3a7098d/src/app/(app)/reports/page.tsx :250 fetch(`/api/reports/trends?startDate=${startDate}&endDate=${endDate}&period=${period}&groupBy=${groupBy}${biz}&currency=${encodeURIComponent(displayCurrency)}`)
  • net finlynq-finlynq-3a7098d/src/app/(app)/scenarios/page.tsx :74 const res = await fetch("/api/scenarios", {
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/account/page.tsx :58 fetch("/api/user/me")
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/backfill/[runId]/page.tsx :194 const res = await fetch(`/api/settings/backfill/${runId}`);
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/backfill/page.tsx :45 fetch("/api/accounts")
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/bank-feeds/page.tsx :124 const res = await fetch("/api/settings/bank-feeds/simplefin/pending");
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/categorization/page.tsx :37 fetch("/api/categories")
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/data/page.tsx :85 const res = await fetch("/api/auth/delete-account", {
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/developer/page.tsx :20 fetch("/api/settings/dev-mode")
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/dropdown-order/page.tsx :62 const res = await fetch("/api/settings/dropdown-order");
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/general/page.tsx :52 const res = await fetch("/api/settings/reporting-currency/status");
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/import/page.tsx :109 fetch("/api/accounts")
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/integrations/connected-apps.tsx :52 const res = await fetch("/api/settings/connected-apps");
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/investments/_components/manage-prices-dialog.tsx :64 const res = await fetch(`/api/securities/prices?securityId=${securityId}`);
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/investments/page.tsx :233 fetch("/api/securities"),
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/reconciliation/page.tsx :59 const res = await fetch("/api/settings/reconcile-thresholds");
  • net finlynq-finlynq-3a7098d/src/app/(app)/settings/rules/page.tsx :153 fetch("/api/rules"),
  • net finlynq-finlynq-3a7098d/src/app/(app)/subscriptions/page.tsx :158 fetch("/api/subscriptions")
  • net finlynq-finlynq-3a7098d/src/app/(app)/tax/page.tsx :36 fetch("/api/tax")
  • net finlynq-finlynq-3a7098d/src/app/(app)/transactions/_components/split-badge.tsx :17 fetch(`/api/transactions/splits?transactionId=${transactionId}`)
  • net finlynq-finlynq-3a7098d/src/app/(app)/transactions/_components/split-dialog.tsx :66 fetch(`/api/transactions/splits?transactionId=${transactionId}`)
  • net finlynq-finlynq-3a7098d/src/app/(app)/transactions/_components/transactions-workspace.tsx :298 const res = await fetch(`/api/transactions?${params}`);
  • net finlynq-finlynq-3a7098d/src/app/(app)/transactions/_hooks/use-transactions.ts :66 // EVERY fetch (mount, dep change, manual loadTxns) and cleared in `finally`.
  • net finlynq-finlynq-3a7098d/src/app/(app)/transactions/_hooks/use-tx-prefs.ts :134 await fetch("/api/settings/tx-columns", {
  • net finlynq-finlynq-3a7098d/src/app/(app)/transactions/audit/page.tsx :45 const res = await fetch(`/api/transactions/audit${includeResolved ? "?includeResolved=1" : ""}`);
  • net finlynq-finlynq-3a7098d/src/app/(app)/whats-new/page.tsx :30 fetch("/api/announcements")
  • net finlynq-finlynq-3a7098d/src/app/api/portfolio/overview/route.ts :686 // 2. live Yahoo `quoteType` ('ETF') on this fetch (null on a warm-cache hit)
  • net finlynq-finlynq-3a7098d/src/app/cloud/page.tsx :73 const r = await fetch(
  • net finlynq-finlynq-3a7098d/src/app/oauth/authorize/page.tsx :120 fetch("/api/auth/session")
  • net finlynq-finlynq-3a7098d/src/components/active-currencies-section.tsx :67 const res = await fetch("/api/settings/active-currencies");
  • net finlynq-finlynq-3a7098d/src/components/announcement-banner.tsx :21 fetch("/api/announcements")
  • net finlynq-finlynq-3a7098d/src/components/currency-audit-banner.tsx :18 fetch("/api/transactions/audit")
  • net finlynq-finlynq-3a7098d/src/components/currency-provider.tsx :17 * fetch(`/api/dashboard?currency=${displayCurrency}`)
  • net finlynq-finlynq-3a7098d/src/components/dev-mode-guard.tsx :16 fetch("/api/settings/dev-mode")
  • net finlynq-finlynq-3a7098d/src/components/dropdown-order-provider.tsx :60 const res = await fetch("/api/settings/dropdown-order");
  • net finlynq-finlynq-3a7098d/src/components/feedback-dialog.tsx :126 res = await fetch("/api/feedback", { method: "POST", body: form });
  • net finlynq-finlynq-3a7098d/src/components/fx-overrides-section.tsx :55 const res = await fetch("/api/fx/overrides");
  • net finlynq-finlynq-3a7098d/src/components/holdings/holding-edit-form.tsx :157 fetch("/api/accounts")
  • net finlynq-finlynq-3a7098d/src/components/import/staged-review-surface.tsx :482 const res = await fetch(
  • net finlynq-finlynq-3a7098d/src/components/inbox/auto-rule-banner.tsx :60 fetch(`/api/reconcile/auto-rule-recent?accountId=${accountId}`)
  • net finlynq-finlynq-3a7098d/src/components/inbox/email-rule-dialog.tsx :361 const res = await fetch(isEdit ? `/api/email-rules/${initial!.id}` : "/api/email-rules", {
  • net finlynq-finlynq-3a7098d/src/components/inbox/email-rules-manager.tsx :72 fetch("/api/email-rules"),
  • net finlynq-finlynq-3a7098d/src/components/inbox/import-prefs-picker.tsx :94 const res = await fetch(`/api/accounts/${accountId}/import-prefs`, {
  • net finlynq-finlynq-3a7098d/src/components/inbox/inbox-email-tab.tsx :138 fetch("/api/import/email-inbox"),
  • net finlynq-finlynq-3a7098d/src/components/inbox/inbox-reconcile-tab.tsx :341 const res = await fetch("/api/categories");
  • net finlynq-finlynq-3a7098d/src/components/inbox/inbox-reconciled-tab.tsx :52 fetch(`/api/reconcile/suggestions?accountId=${accountId}`)
  • net finlynq-finlynq-3a7098d/src/components/inbox/inbox-to-approve-tab.tsx :141 fetch("/api/categories")
  • net finlynq-finlynq-3a7098d/src/components/inbox/inbox-to-categorize-tab.tsx :136 fetch("/api/categories")
  • net finlynq-finlynq-3a7098d/src/components/inbox/mode-picker.tsx :46 const res = await fetch(`/api/accounts/${accountId}/mode`, {
  • net finlynq-finlynq-3a7098d/src/components/inbox/reconcile-hide-accounts-card.tsx :47 fetch("/api/accounts?includeArchived=1"),
  • net finlynq-finlynq-3a7098d/src/components/inbox/reconcile-summary-panel.tsx :70 const res = await fetch("/api/reconcile/summary");
  • net finlynq-finlynq-3a7098d/src/components/inbox/upload-drawer.tsx :285 fetch("/api/import/templates").then((r) => (r.ok ? r.json() : [])),
  • net finlynq-finlynq-3a7098d/src/components/mcp-guide/mcp-guide.tsx :255 fetch("/api/healthz")
  • net finlynq-finlynq-3a7098d/src/components/nav.tsx :138 await fetch("/api/auth/logout", { method: "POST" });
  • net finlynq-finlynq-3a7098d/src/components/net-worth-history-chart.tsx :169 fetch(`/api/net-worth-history?${params.toString()}`)
  • net finlynq-finlynq-3a7098d/src/components/onboarding-wizard.tsx :172 await fetch("/api/accounts", {
  • net finlynq-finlynq-3a7098d/src/components/portfolio/PerformanceChart.tsx :106 fetch(`/api/portfolio/performance?${params.toString()}`)
  • net finlynq-finlynq-3a7098d/src/components/portfolio/forms/BuyForm.tsx :175 const res = await fetch("/api/portfolio/operations/buy", {
  • net finlynq-finlynq-3a7098d/src/components/portfolio/forms/DepositForm.tsx :205 const res = await fetch("/api/portfolio/operations/deposit", {
  • net finlynq-finlynq-3a7098d/src/components/portfolio/forms/FxConversionForm.tsx :194 const res = await fetch("/api/portfolio/operations/fx-conversion", {
  • net finlynq-finlynq-3a7098d/src/components/portfolio/forms/IncomeExpenseForm.tsx :278 const res = await fetch("/api/portfolio/operations/income-expense", {
  • net finlynq-finlynq-3a7098d/src/components/portfolio/forms/LotPicker.tsx :72 fetch(`/api/portfolio/lots?holdingId=${holdingId}&openOnly=1`)
  • net finlynq-finlynq-3a7098d/src/components/portfolio/forms/SellForm.tsx :227 const res = await fetch("/api/portfolio/operations/sell", {
  • net finlynq-finlynq-3a7098d/src/components/portfolio/forms/SwapForm.tsx :198 const res = await fetch("/api/portfolio/operations/swap", {
  • net finlynq-finlynq-3a7098d/src/components/portfolio/forms/TransferForm.tsx :171 const res = await fetch("/api/portfolio/operations/transfer", {
  • net finlynq-finlynq-3a7098d/src/components/portfolio/forms/WithdrawalForm.tsx :203 const res = await fetch("/api/portfolio/operations/withdrawal", {
  • net finlynq-finlynq-3a7098d/src/components/portfolio/lot-allocation-matrix.tsx :229 const res = await fetch(`/api/portfolio/holdings/${holdingId}/lots/allocate`, {
  • net finlynq-finlynq-3a7098d/src/components/portfolio/lot-inspector-dialog.tsx :127 fetch(`/api/portfolio/holdings/${holdingId}/lots${qs}`)
  • net finlynq-finlynq-3a7098d/src/components/portfolio/rebuild-snapshots-button.tsx :102 const res = await fetch("/api/portfolio/snapshots/rebuild/status", {
  • net finlynq-finlynq-3a7098d/src/components/prompt-gate.tsx :40 fetch("/api/prompts/pending")
  • net finlynq-finlynq-3a7098d/src/components/reconcile/recent-uploads-panel.tsx :90 const res = await fetch(`/api/import/uploads?accountId=${accountId}&limit=20`);
  • net finlynq-finlynq-3a7098d/src/components/reporting-recompute-indicator.tsx :44 const res = await fetch("/api/settings/reporting-currency/status");
  • net finlynq-finlynq-3a7098d/src/components/staging/staged-row-editor.tsx :164 const res = await fetch(
  • net finlynq-finlynq-3a7098d/src/components/staging/unbound-import-picker.tsx :88 const resp = await fetch(`/api/import/staged/${stagedImportId}/bind`, {
  • net finlynq-finlynq-3a7098d/src/components/staging/unresolved-categories-banner.tsx :97 fetch("/api/categories"),
  • net finlynq-finlynq-3a7098d/src/components/transactions/transaction-dialog.tsx :399 fetch(`/api/transactions/splits?transactionId=${t.id}`)
  • net finlynq-finlynq-3a7098d/src/components/unlock-gate.tsx :25 const res = await fetch("/api/auth/session");
  • net finlynq-finlynq-3a7098d/src/hooks/use-dev-mode.ts :13 fetch("/api/settings/dev-mode")
  • net finlynq-finlynq-3a7098d/src/lib/accounts/opening-balance-client.ts :18 const res = await fetch(`/api/accounts/${accountId}/opening-balance`);
  • net finlynq-finlynq-3a7098d/src/lib/crypto-service.ts :308 // (hits) vs need a live CoinGecko fetch (misses). De-dupes by coinId (keeping
  • net finlynq-finlynq-3a7098d/src/lib/email-import/bounce.ts :79 const res = await fetch("https://api.resend.com/emails", {
  • net finlynq-finlynq-3a7098d/src/lib/email-import/fetch-resend-attachments.ts :76 resp = await fetch(
  • net finlynq-finlynq-3a7098d/src/lib/email.ts :106 const res = await fetch("https://api.resend.com/emails", {
  • net finlynq-finlynq-3a7098d/src/lib/hooks/useActiveCurrencies.ts :23 * fetch (the consumer's current value always shows).
  • net finlynq-finlynq-3a7098d/src/lib/hooks/useDisplayCurrencyOptions.ts :48 fetch("/api/fx/overrides")
  • net finlynq-finlynq-3a7098d/src/lib/hooks/usePortfolioFormData.ts :48 fetch("/api/accounts").then((r) => r.json()),
  • net finlynq-finlynq-3a7098d/src/lib/market-fetch.ts :14 * signature), so call sites just swap `fetch(` → `marketFetch(`.
  • net finlynq-finlynq-3a7098d/src/lib/seo/indexnow.ts :147 const res = await fetch(INDEXNOW_ENDPOINT, {
  • net finlynq-finlynq-3a7098d/src/lib/swr/fetcher.ts :9 * hand-rolled `fetch().then(r => r.json())` did before this item.

secrets 9

  • secrets finlynq-finlynq-3a7098d/src/lib/auth/jwt.ts :70 const envSecret = process.env.PF_JWT_SECRET;
  • secrets finlynq-finlynq-3a7098d/src/lib/crypto/staging-envelope.ts :34 const raw = process.env.PF_STAGING_KEY;
  • secrets finlynq-finlynq-3a7098d/src/lib/email-import/bounce.ts :46 const apiKey = process.env.RESEND_API_KEY;
  • secrets finlynq-finlynq-3a7098d/src/lib/email-import/fetch-resend-attachments.ts :66 const apiKey = process.env.RESEND_API_KEY;
  • secrets finlynq-finlynq-3a7098d/src/lib/email-import/providers/resend.ts :30 const secret = process.env.RESEND_WEBHOOK_SECRET;
  • secrets finlynq-finlynq-3a7098d/src/lib/email-import/providers/self-smtp.ts :63 const secret = process.env.FINLYNQ_INBOUND_SECRET;
  • secrets finlynq-finlynq-3a7098d/src/lib/email.ts :109 Authorization: `Bearer ${process.env.RESEND_API_KEY}`,
  • secrets finlynq-finlynq-3a7098d/src/lib/mcp/confirmation-token.ts :21 * Signed with `process.env.PF_JWT_SECRET`. Boot-time check matches
  • secrets finlynq-finlynq-3a7098d/src/lib/seo/indexnow.ts :36 process.env.INDEXNOW_KEY ?? "0f9c4a7e8b2d4f16a9c3e5d7b1082f4c";

database 4

  • db finlynq-finlynq-3a7098d/mcp-server/index.ts :3 import { Pool } from "pg";
  • db finlynq-finlynq-3a7098d/mcp-server/pg-compat.ts :14 import { Pool, PoolClient } from "pg";
  • db finlynq-finlynq-3a7098d/src/db/adapters/postgres.ts :10 import pg from "pg";
  • db finlynq-finlynq-3a7098d/src/lib/transfer.ts :35 import type { Pool } from "pg";

tool registrations 2

  • get_goals finlynq-finlynq-3a7098d/mcp-server/register-core-tools.ts :524
  • get_categories finlynq-finlynq-3a7098d/mcp-server/tools/reads.ts :766

install hooks 1

  • postinstall finlynq-finlynq-3a7098d/package.json :10 node scripts/generate-mcp-tool-catalog.mjs

declared dependencies 48

  • @modelcontextprotocol/sdk@^1.30.0
  • @base-ui/react@^1.2.0
  • @finlynq/import-connectors@*
  • bcryptjs@^3.0.3
  • class-variance-authority@^0.7.1
  • clsx@^2.1.1
  • drizzle-orm@^0.45.2
  • exceljs@^4.4.0
  • framer-motion@^12.36.0
  • jose@^6.2.2
  • jszip@^3.10.1
  • lucide-react@^0.577.0
  • next@16.2.12
  • next-themes@^0.4.6
  • nodemailer@^9.0.3
  • otpauth@^9.5.0
  • pdf-parse@^2.4.5
  • pg@^8.20.0
  • react@19.2.3
  • react-dom@19.2.3
  • recharts@^3.8.0
  • shadcn@^4.0.0
  • swr@^2.4.1
  • tailwind-merge@^3.5.0
  • tw-animate-css@^1.4.0
  • zod@^4.3.6
  • @playwright/test@^1.58.2
  • @tailwindcss/postcss@^4
  • @testing-library/jest-dom@^6.9.1
  • @testing-library/react@^16.3.2
  • @testing-library/user-event@^14.6.1
  • @types/bcryptjs@^2.4.6
  • @types/node@^20
  • @types/nodemailer@^7.0.11
  • @types/pdf-parse@^1.1.5
  • @types/pg@^8.20.0
  • @types/react@^19
  • @types/react-dom@^19
  • @vitest/coverage-v8@^4.1.2
  • babel-plugin-react-compiler@1.0.0
  • drizzle-kit@^0.31.9
  • eslint@^9
  • eslint-config-next@^16.2.5
  • jsdom@^29.0.1
  • tailwindcss@^4
  • tsx@^4.22.5
  • typescript@^5
  • vitest@^4.1.2

perm:untrusted 1

  • untrusted finlynq-finlynq-3a7098d/src/lib/swr/fetcher.ts :9 * hand-rolled `fetch().then(r => r.json())` did before this item.