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 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 Sonnet 4.6](https://www.anthropic.com/claude). No human has audited the implementation. Review all code and tool permissions before use.
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
- Call `ck_set_session` with your cookie value — it accepts any of:
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 | *(paste the entire Cookie header from DevTools → Network)* |
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, log in to creditkarma.com again, grab the new CKAT cookie, and call `ck_set_session`
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. Log in to creditkarma.com, grab the new CKAT cookie, and call `ck_set_session`.
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: log in to creditkarma.com, grab the new CKAT cookie, call `ck_set_session`
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. Log in to [creditkarma.com](https://www.creditkarma.com) in Chrome
101
- 2. DevTools Application Cookies copy the `CKAT` value
102
- 3. `ck_set_session(cookies)` → credentials stored
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>". Find CKAT in Chrome DevTools \u2192 Application \u2192 Cookies \u2192 creditkarma.com, or copy the Cookie request header from the Network tab.',
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. Call ck_set_session with your CKAT cookie to authenticate.");
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.1" }
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.1' });
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);
@@ -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>". Find CKAT in Chrome DevTools \u2192 Application \u2192 Cookies \u2192 creditkarma.com, or copy the Cookie request header from the Network tab.',
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>"'),
@@ -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. Call ck_set_session with your CKAT cookie to authenticate.');
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.1",
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 Sonnet 4.6 (AI) <https://www.anthropic.com/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
  }