creditkarma-mcp 2.0.1 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -7
- package/SKILL.md +13 -5
- package/dist/bundle.js +3 -3
- package/dist/index.js +1 -1
- package/dist/tools/auth.js +1 -1
- package/dist/tools/sync.js +1 -1
- package/package.json +19 -2
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
A [Model Context Protocol](https://modelcontextprotocol.io) server that connects Claude to [Credit Karma](https://www.creditkarma.com), giving you natural-language access to your transactions, spending patterns, and account summaries.
|
|
4
4
|
|
|
5
5
|
> [!WARNING]
|
|
6
|
-
> **AI-developed project.** This codebase was entirely built and is actively maintained by [Claude
|
|
6
|
+
> **AI-developed project.** This codebase was entirely built and is actively maintained by [Claude Code](https://www.anthropic.com/claude). No human has audited the implementation. Review all code and tool permissions before use.
|
|
7
7
|
|
|
8
8
|
## What you can do
|
|
9
9
|
|
|
@@ -21,6 +21,7 @@ Ask Claude things like:
|
|
|
21
21
|
- [Claude Desktop](https://claude.ai/download) or [Claude Code](https://claude.ai/code)
|
|
22
22
|
- [Node.js](https://nodejs.org) 18 or later
|
|
23
23
|
- A Credit Karma account
|
|
24
|
+
- [Google Chrome](https://www.google.com/chrome/) — used once for the scripted auth flow (optional; you can copy the cookie manually instead)
|
|
24
25
|
|
|
25
26
|
## Installation
|
|
26
27
|
|
|
@@ -81,21 +82,33 @@ Credit Karma uses short-lived JWTs. This server handles automatic token refresh
|
|
|
81
82
|
|
|
82
83
|
### Getting your credentials
|
|
83
84
|
|
|
85
|
+
#### Option A — scripted (recommended)
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
npm run auth # prints the CKAT value to the console
|
|
89
|
+
npm run auth -- .env # writes CK_COOKIES=<ckat> to .env
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Launches Chrome with a dedicated profile at `~/.creditkarma-mcp/chrome-profile`, waits for you to sign in at creditkarma.com, then captures the `CKAT` cookie (the URL-encoded bundle of access + refresh JWTs). Either prints it (for pasting into Claude Desktop / MCPB) or writes it to the env file you pass. Requires Google Chrome installed locally; the script installs `puppeteer-core` on first run (~1 MB).
|
|
93
|
+
|
|
94
|
+
#### Option B — manual (DevTools)
|
|
95
|
+
|
|
84
96
|
1. Log in to [creditkarma.com](https://www.creditkarma.com) in Chrome
|
|
85
97
|
2. Open DevTools → **Application** → **Cookies** → `https://www.creditkarma.com`
|
|
86
98
|
3. Find the `CKAT` cookie and copy its value
|
|
87
99
|
|
|
88
100
|
### Setting credentials
|
|
89
101
|
|
|
90
|
-
|
|
102
|
+
Either of these works:
|
|
103
|
+
|
|
104
|
+
- Paste the value from `npm run auth` (or your CKAT cookie) into `CK_COOKIES` in your `.env` or Claude config
|
|
105
|
+
- Or call `ck_set_session` from within Claude with the cookie value — it accepts any of:
|
|
91
106
|
|
|
92
107
|
| Format | Example |
|
|
93
108
|
|--------|---------|
|
|
94
109
|
| Raw CKAT value | `eyJraWQ...%3BeyJraWQ...` |
|
|
95
110
|
| `CKAT=<value>` | `CKAT=eyJraWQ...%3BeyJraWQ...` |
|
|
96
|
-
| Full Cookie header | *(
|
|
97
|
-
|
|
98
|
-
Or set `CK_COOKIES` directly in your `.env` file (any of the three formats above).
|
|
111
|
+
| Full Cookie header | *(what `npm run auth` prints)* |
|
|
99
112
|
|
|
100
113
|
The server automatically extracts both the access token and refresh token from the CKAT cookie, and refreshes the access token as needed.
|
|
101
114
|
|
|
@@ -103,7 +116,7 @@ The server automatically extracts both the access token and refresh token from t
|
|
|
103
116
|
|
|
104
117
|
- **Access token**: ~15 minutes (auto-refreshed transparently)
|
|
105
118
|
- **Refresh token**: ~8 hours
|
|
106
|
-
- When the refresh token expires,
|
|
119
|
+
- When the refresh token expires, re-run `npm run auth` (or grab the new CKAT cookie from DevTools) and either update `CK_COOKIES` or call `ck_set_session`
|
|
107
120
|
|
|
108
121
|
## Available tools
|
|
109
122
|
|
|
@@ -145,7 +158,7 @@ sync_state (key, value)
|
|
|
145
158
|
|
|
146
159
|
## Troubleshooting
|
|
147
160
|
|
|
148
|
-
**"TOKEN_EXPIRED"** — your refresh token has expired.
|
|
161
|
+
**"TOKEN_EXPIRED"** — your refresh token has expired. Re-run `npm run auth` (or grab a new CKAT cookie) and update `CK_COOKIES` or call `ck_set_session`.
|
|
149
162
|
|
|
150
163
|
**Sync returns 0 transactions** — check that your `CK_COOKIES` value is fresh. CKAT cookies expire after ~8 hours.
|
|
151
164
|
|
package/SKILL.md
CHANGED
|
@@ -58,6 +58,15 @@ Or use a `.env` file in the project directory with `CK_COOKIES=<value>`.
|
|
|
58
58
|
|
|
59
59
|
### Getting CK_COOKIES
|
|
60
60
|
|
|
61
|
+
**Scripted (recommended — source install):**
|
|
62
|
+
```bash
|
|
63
|
+
npm run auth # prints the CKAT value to the console
|
|
64
|
+
npm run auth -- .env # writes CK_COOKIES=<ckat> to .env
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Launches Chrome with a dedicated profile, waits for sign-in at creditkarma.com, then captures the `CKAT` cookie (the URL-encoded bundle of access + refresh JWTs). Use the printed value with Claude Desktop / MCPB, or the `.env` form when running from source.
|
|
68
|
+
|
|
69
|
+
**Manual (DevTools):**
|
|
61
70
|
1. Log in to [creditkarma.com](https://www.creditkarma.com) in Chrome
|
|
62
71
|
2. DevTools → **Application** → **Cookies** → `creditkarma.com`
|
|
63
72
|
3. Copy the `CKAT` cookie value
|
|
@@ -70,7 +79,7 @@ Call `ck_set_session` with your cookie value to store credentials and enable aut
|
|
|
70
79
|
|
|
71
80
|
- Access token: ~15 min TTL, auto-refreshed transparently
|
|
72
81
|
- Refresh token: ~8 hours TTL
|
|
73
|
-
- When expired:
|
|
82
|
+
- When expired: re-run `npm run auth` (or grab a new CKAT cookie) and call `ck_set_session`
|
|
74
83
|
|
|
75
84
|
## Tools
|
|
76
85
|
|
|
@@ -97,10 +106,9 @@ Call `ck_set_session` with your cookie value to store credentials and enable aut
|
|
|
97
106
|
## Workflows
|
|
98
107
|
|
|
99
108
|
**First-time setup:**
|
|
100
|
-
1.
|
|
101
|
-
2.
|
|
102
|
-
3. `
|
|
103
|
-
4. `ck_sync_transactions` → initial full sync
|
|
109
|
+
1. Run `npm run auth` (or grab the `CKAT` cookie manually from creditkarma.com DevTools)
|
|
110
|
+
2. Paste into `CK_COOKIES` env var, or call `ck_set_session(cookies)` from within Claude
|
|
111
|
+
3. `ck_sync_transactions` → initial full sync
|
|
104
112
|
|
|
105
113
|
**Regular use:**
|
|
106
114
|
- `ck_sync_transactions` → pull latest transactions
|
package/dist/bundle.js
CHANGED
|
@@ -30430,7 +30430,7 @@ function registerAuthTools(server, ctx) {
|
|
|
30430
30430
|
server.registerTool(
|
|
30431
30431
|
"ck_set_session",
|
|
30432
30432
|
{
|
|
30433
|
-
description: 'Store a Credit Karma session to enable automatic token refresh. Accepts any of: (1) the raw CKAT cookie value, (2) the full Cookie header string from any creditkarma.com request, or (3) just "CKAT=<value>".
|
|
30433
|
+
description: 'Store a Credit Karma session to enable automatic token refresh. Accepts any of: (1) the raw CKAT cookie value, (2) the full Cookie header string from any creditkarma.com request, or (3) just "CKAT=<value>". Capture via `npm run auth` from the creditkarma-mcp repo, or find CKAT in Chrome DevTools \u2192 Application \u2192 Cookies \u2192 creditkarma.com.',
|
|
30434
30434
|
annotations: { readOnlyHint: false },
|
|
30435
30435
|
inputSchema: {
|
|
30436
30436
|
cookies: external_exports3.string().describe('One of: raw CKAT value, full Cookie header string, or "CKAT=<value>"')
|
|
@@ -30523,7 +30523,7 @@ async function handleSyncTransactions(args, ctx) {
|
|
|
30523
30523
|
}
|
|
30524
30524
|
async function refreshOrThrow(ctx) {
|
|
30525
30525
|
if (!ctx.client.getRefreshToken()) {
|
|
30526
|
-
throw new Error("TOKEN_EXPIRED: No valid token.
|
|
30526
|
+
throw new Error("TOKEN_EXPIRED: No valid token. Run `npm run auth` to capture a fresh Cookie header via browser login, or call ck_set_session with your CKAT cookie.");
|
|
30527
30527
|
}
|
|
30528
30528
|
await ctx.client.refreshAccessToken();
|
|
30529
30529
|
}
|
|
@@ -30859,7 +30859,7 @@ async function main() {
|
|
|
30859
30859
|
mcpJsonPath
|
|
30860
30860
|
};
|
|
30861
30861
|
const server = new McpServer(
|
|
30862
|
-
{ name: "creditkarma-mcp", version: "2.0.
|
|
30862
|
+
{ name: "creditkarma-mcp", version: "2.0.3" }
|
|
30863
30863
|
);
|
|
30864
30864
|
registerAuthTools(server, ctx);
|
|
30865
30865
|
registerSyncTools(server, ctx);
|
package/dist/index.js
CHANGED
|
@@ -40,7 +40,7 @@ async function main() {
|
|
|
40
40
|
db: initDb(dbPath),
|
|
41
41
|
mcpJsonPath
|
|
42
42
|
};
|
|
43
|
-
const server = new McpServer({ name: 'creditkarma-mcp', version: '2.0.
|
|
43
|
+
const server = new McpServer({ name: 'creditkarma-mcp', version: '2.0.3' });
|
|
44
44
|
registerAuthTools(server, ctx);
|
|
45
45
|
registerSyncTools(server, ctx);
|
|
46
46
|
registerQueryTools(server, ctx);
|
package/dist/tools/auth.js
CHANGED
|
@@ -56,7 +56,7 @@ export function persistSession(cookies, mcpJsonPath) {
|
|
|
56
56
|
export const persistTokens = persistSession;
|
|
57
57
|
export function registerAuthTools(server, ctx) {
|
|
58
58
|
server.registerTool('ck_set_session', {
|
|
59
|
-
description: 'Store a Credit Karma session to enable automatic token refresh. Accepts any of: (1) the raw CKAT cookie value, (2) the full Cookie header string from any creditkarma.com request, or (3) just "CKAT=<value>".
|
|
59
|
+
description: 'Store a Credit Karma session to enable automatic token refresh. Accepts any of: (1) the raw CKAT cookie value, (2) the full Cookie header string from any creditkarma.com request, or (3) just "CKAT=<value>". Capture via `npm run auth` from the creditkarma-mcp repo, or find CKAT in Chrome DevTools \u2192 Application \u2192 Cookies \u2192 creditkarma.com.',
|
|
60
60
|
annotations: { readOnlyHint: false },
|
|
61
61
|
inputSchema: {
|
|
62
62
|
cookies: z.string().describe('One of: raw CKAT value, full Cookie header string, or "CKAT=<value>"'),
|
package/dist/tools/sync.js
CHANGED
|
@@ -96,7 +96,7 @@ export async function handleSyncTransactions(args, ctx) {
|
|
|
96
96
|
}
|
|
97
97
|
async function refreshOrThrow(ctx) {
|
|
98
98
|
if (!ctx.client.getRefreshToken()) {
|
|
99
|
-
throw new Error('TOKEN_EXPIRED: No valid token.
|
|
99
|
+
throw new Error('TOKEN_EXPIRED: No valid token. Run `npm run auth` to capture a fresh Cookie header via browser login, or call ck_set_session with your CKAT cookie.');
|
|
100
100
|
}
|
|
101
101
|
await ctx.client.refreshAccessToken();
|
|
102
102
|
}
|
package/package.json
CHANGED
|
@@ -1,12 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "creditkarma-mcp",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"description": "MCP server for Credit Karma — natural-language access to your transactions, spending, and accounts",
|
|
5
|
-
"author": "Claude
|
|
5
|
+
"author": "Claude Code (AI) <https://www.anthropic.com/claude>",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "git+https://github.com/chrischall/creditkarma-mcp.git"
|
|
9
9
|
},
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"keywords": [
|
|
12
|
+
"mcp",
|
|
13
|
+
"model-context-protocol",
|
|
14
|
+
"claude",
|
|
15
|
+
"ai",
|
|
16
|
+
"credit-karma",
|
|
17
|
+
"transactions",
|
|
18
|
+
"spending",
|
|
19
|
+
"accounts",
|
|
20
|
+
"budgeting",
|
|
21
|
+
"personal-finance",
|
|
22
|
+
"sqlite",
|
|
23
|
+
"graphql"
|
|
24
|
+
],
|
|
10
25
|
"type": "module",
|
|
11
26
|
"bin": {
|
|
12
27
|
"creditkarma-mcp": "dist/index.js"
|
|
@@ -20,6 +35,7 @@
|
|
|
20
35
|
"bundle": "esbuild src/index.ts --bundle --platform=node --format=esm --external:dotenv --outfile=dist/bundle.js",
|
|
21
36
|
"start": "node dist/index.js",
|
|
22
37
|
"dev": "node --env-file=.env dist/index.js",
|
|
38
|
+
"auth": "node scripts/setup-auth.mjs",
|
|
23
39
|
"test": "vitest run",
|
|
24
40
|
"test:watch": "vitest",
|
|
25
41
|
"test:coverage": "vitest run --coverage"
|
|
@@ -33,6 +49,7 @@
|
|
|
33
49
|
"@types/node": "^25.5.2",
|
|
34
50
|
"@vitest/coverage-v8": "^4.1.2",
|
|
35
51
|
"esbuild": "^0.28.0",
|
|
52
|
+
"puppeteer-core": "^24.0.0",
|
|
36
53
|
"typescript": "^6.0.2",
|
|
37
54
|
"vitest": "^4.1.2"
|
|
38
55
|
}
|