Access Credit Karma transaction data via MCP. Use when the user asks about their Credit Karma transactions, spending by category or merchant, account summaries, or wants to sync or query their financial data. Triggers on phrases like "sync my transactions", "what did I spend on", "show my Credit Karma data", "spending by category", "top merchants", or any request involving personal finance data from Credit Karma. Requires creditkarma-mcp installed and the creditkarma server registered (see Setup below).
Resources
19Install
npx skillscat add chrischall/creditkarma-mcp Install via the SkillsCat registry.
creditkarma-mcp
MCP server for Credit Karma — syncs transactions into a local SQLite database and provides natural-language querying tools.
Setup
Option A — npx (recommended)
Add to .mcp.json in your project or ~/.claude/mcp.json:
{
"mcpServers": {
"creditkarma": {
"command": "npx",
"args": ["-y", "creditkarma-mcp"],
"env": {
"CK_COOKIES": "CKTRKID=...; CKAT=eyJ...%3BeyJ...; ..."
}
}
}
}Option B — from source
git clone https://github.com/chrischall/creditkarma-mcp
cd creditkarma-mcp
npm install && npm run buildThen add to .mcp.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>.
Getting CK_COOKIES
Scripted (recommended — source install):
npm run auth # prints the Cookie header to the console
npm run auth -- .env # writes CK_COOKIES=<header> to .envLaunches Chrome with a dedicated profile, waits for sign-in at creditkarma.com, then captures the full session Cookie header (CKAT carries the access + refresh JWTs; CKTRKID and friends are needed by the refresh endpoint). Use the printed value with Claude Desktop / MCPB, or the .env form when running from source.
Manual (DevTools):
- Log in to creditkarma.com in Chrome
- DevTools → Network → any creditkarma.com request → Request Headers
- Right-click the
cookieheader → Copy value
Authentication
Call ck_set_session with your Cookie header to store credentials and enable auto-refresh.
- Access token: ~15 min TTL, auto-refreshed transparently
- Refresh token: ~8 hours TTL
- When expired: re-run
npm run auth(or grab a fresh Cookie header) and callck_set_session
Tools
Auth
| Tool | Description |
|---|---|
ck_set_session(cookies) |
Store credentials — paste the full Cookie header from a signed-in creditkarma.com request |
Sync
| Tool | Description |
|---|---|
ck_sync_transactions(force_full?) |
Sync transactions to local SQLite. Incremental by default (since last sync − 30 days). force_full=true re-fetches everything. |
Query
| Tool | Description |
|---|---|
ck_list_transactions(start_date?, end_date?, account?, category?, merchant?, status?, min_amount?, max_amount?, limit?, offset?) |
Filtered, paginated transaction list |
ck_get_recent_transactions(limit?) |
N most recent transactions (default 20) |
ck_get_spending_by_category(start_date?, end_date?) |
Spending totals grouped by category |
ck_get_spending_by_merchant(start_date?, end_date?, limit?) |
Spending totals grouped by merchant |
ck_get_account_summary |
Transaction counts and totals per account |
ck_query_sql(sql) |
Read-only SQL query against the local database (SELECT only) |
Workflows
First-time setup:
- Run
npm run auth(or grab the Cookie header manually from a creditkarma.com request in DevTools) - Paste into
CK_COOKIESenv var, or callck_set_session(cookies)from within Claude ck_sync_transactions→ initial full sync
Regular use:
ck_sync_transactions→ pull latest transactions- Then query with any of the query tools
Spending analysis:
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:
-- 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 DESCDatabase schema
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)Notes
- All query tools run against the local SQLite database — sync first
- Amounts: negative = expense/debit, positive = credit/income
ck_query_sqlonly allows SELECT — no writes to Credit Karma data- Sync saves a resume cursor — interrupted syncs can be resumed automatically
accounts.idis a synthesized stable key in the form<provider>|<last4>(e.g.Citi|2630,Ally|7133) because CK's API returns emptyaccount.idstrings. The same card under two provider-name spellings shows as two rows.