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.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · streamable-http counts 2 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
get_categories
-
get_goals
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"
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¤cy=${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}¤cy=${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.