MCP server for Credit Karma — syncs transactions into a local SQLite database and provides natural-language querying tools.
Add to .mcp.json in your project or ~/.claude/mcp.json:
json
{
"mcpServers": {
"creditkarma": {
"command": "npx",
"args": ["-y", "creditkarma-mcp"],
"env": {
"CK_COOKIES": "CKTRKID=...; CKAT=eyJ...%3BeyJ...; ..."
}
}
}
}
bash
git clone https://github.com/chrischall/creditkarma-mcp
cd creditkarma-mcp
npm install && npm run build
Then add to .mcp.json:
json
{
"mcpServers": {
"creditkarma": {
"command": "node",
"args": ["/path/to/creditkarma-mcp/dist/index.js"],
"env": {
"CK_COOKIES": "CKTRKID=...; CKAT=eyJ...%3BeyJ...; ..."
}
}
}
}
Or use a .env file in the project directory with CK_COOKIES=<value>.
Three onboarding paths, in priority order:
1. fetchproxy extension (easiest — no env vars): Install the fetchproxy 0.3.0 extension, sign into creditkarma.com once, and leave CK_COOKIES unset. The MCP reads HttpOnly CKAT + CKTRKID cookies on the first tool call via chrome.cookies.get, then operates direct-to-API from Node.
2. ck_set_session MCP tool: From within Claude, call ck_set_session with a Cookie header you copied from DevTools (see below). The tool persists it to .env.
3. Manual (DevTools):
cookie header → Copy valueCK_COOKIES in your Claude configThe MCP handles auth automatically once any of the three paths is configured.
CK_COOKIES (or call ck_set_session again)ToolDescriptionck_set_session(cookies)Store credentials — paste the full Cookie header from a signed-in creditkarma.com request
ToolDescriptionck_sync_transactions(force_full?)Sync transactions to local SQLite. Incremental by default (since last sync − 30 days). force_full=true re-fetches everything.
ToolDescriptionck_list_transactions(start_date?, end_date?, account?, category?, merchant?, status?, min_amount?, max_amount?, limit?, offset?)Filtered, paginated transaction listck_get_recent_transactions(limit?)N most recent transactions (default 20)ck_get_spending_by_category(start_date?, end_date?)Spending totals grouped by categoryck_get_spending_by_merchant(start_date?, end_date?, limit?)Spending totals grouped by merchantck_get_account_summaryTransaction counts and totals per accountck_query_sql(sql)Read-only SQL query against the local database (SELECT only)
First-time setup:
CK_COOKIES unset.CK_COOKIES in your config or call ck_set_session(cookies) from within Claude.ck_sync_transactions → initial full syncRegular use:
ck_sync_transactions → pull latest transactionsSpending analysis:
text
ck_sync_transactions
ck_get_spending_by_category(start_date: "2026-01-01", end_date: "2026-03-31")
ck_get_spending_by_merchant(start_date: "2026-01-01", limit: 10)
Custom analysis with SQL:
sql
-- Monthly spending totals
SELECT strftime('%Y-%m', date) AS month, SUM(ABS(amount)) AS total
FROM transactions WHERE amount < 0
GROUP BY month ORDER BY month DESC
-- Spending by category this year
SELECT c.name, SUM(ABS(t.amount)) AS total
FROM transactions t JOIN categories c ON t.category_id = c.id
WHERE t.date >= '2026-01-01' AND t.amount < 0
GROUP BY c.name ORDER BY total DESC
sql
transactions (id, date, description, status, amount, account_id, category_id, merchant_id, raw_json)
accounts (id, name, type, provider_name, display)
categories (id, name, type)
merchants (id, name)
sync_state (key, value)
ck_query_sql only allows SELECT — no writes to Credit Karma dataaccounts.id is a synthesized stable key in the form <provider>|<last4> (e.g. Citi|2630, Ally|7133) because CK's API returns empty account.id strings. The same card under two provider-name spellings shows as two rows.