Skip to main content
Glama
chrischall

Credit Karma MCP

by chrischall

Credit Karma MCP

CI npm license

A Model Context Protocol server that connects Claude to Credit Karma, giving you natural-language access to your transactions, spending patterns, and account summaries.

WARNING

AI-developed project. This codebase was entirely built and is actively maintained by Claude Code. No human has audited the implementation. Review all code and tool permissions before use.

What you can do

Ask Claude things like:

  • "Sync my latest transactions"

  • "What did I spend on food last month?"

  • "Show me my top merchants this year"

  • "How much did I spend in March compared to February?"

  • "Which accounts have the most activity?"

  • "Run a SQL query against my transactions"

Related MCP server: BudgetBakers MCP Server

Requirements

Acknowledgement of Terms

By using this MCP server, you acknowledge and agree to the following:

1. This server accesses your own Credit Karma account. Every request is dispatched through your own signed-in browser tab via the fetchproxy extension. You are the one logged in. It does not — and cannot — access anyone else's account.

2. Credit Karma's Terms govern your use of this server, just as they govern your direct use of creditkarma.com. The clauses most relevant here:

You must not sell, transfer, or assign your account to anyone else… you may not allow anyone else to log into our Services as you.

CK does contemplate third-party data retrieval at the user's direction (Section 3.7). There is no explicit anti-scraping clause in the membership agreement; Section 4.1 restricts copying or distributing CK content without express prior written consent.

You are agreeing to those terms — read by the maintainer 2026-05-23 — every time you invoke a tool in this server. Critically: this server runs as you, not as a third party logging in on your behalf. You direct the tool.

3. Personal, non-commercial use only. This project is not affiliated with, endorsed by, sponsored by, or in partnership with Intuit, Credit Karma, or any financial institution. It is a personal automation tool that reads your transaction history, spending categories, and account snapshots — the same data Credit Karma already shows you in their app. Do not use it on someone else's account, do not redistribute their content, and do not use it to make trading or lending decisions on behalf of others.

4. This server may break. Credit Karma rotates its internal endpoints; what works today may 404 tomorrow. This is the nature of unofficial integrations.

5. You accept full responsibility for any consequences of using this server in connection with your Credit Karma account — rate limiting, account warnings, suspension, or any enforcement action Intuit takes. If Credit Karma objects to your use, stop using this server. Do not commit your .env to git — your CK session/auth artifacts are credentials, and the Membership Agreement holds you responsible for their confidentiality.

This section is the maintainer's good-faith summary of the terms — it is not legal advice and does not modify or supersede Credit Karma's actual Membership Agreement.

Installation

1. Clone and build

git clone https://github.com/chrischall/creditkarma-mcp.git
cd creditkarma-mcp
npm install
npm run build

2. Configure

cp .env.example .env
# See "Authentication" below to get your CK_COOKIES value

3. Add to Claude

Claude Code — add to .mcp.json in your project:

{
  "mcpServers": {
    "creditkarma": {
      "command": "node",
      "args": ["/absolute/path/to/creditkarma-mcp/dist/index.js"]
    }
  }
}

Claude Desktop — edit ~/Library/Application Support/Claude/claude_desktop_config.json (Mac) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "creditkarma": {
      "command": "node",
      "args": ["/absolute/path/to/creditkarma-mcp/dist/index.js"],
      "env": {
        "CK_COOKIES": "CKTRKID=...; CKAT=eyJ...%3BeyJ...; ..."
      }
    }
  }
}

4. Restart Claude

Fully quit and relaunch. Then ask: "Sync my Credit Karma transactions".

Authentication

Credit Karma uses short-lived JWTs. This server handles automatic token refresh — you only need to set up credentials once (or when your session expires).

creditkarma-mcp tries three auth paths in priority order; whichever succeeds first is used. Existing setups keep working unchanged.

  1. CK_COOKIES env var (legacy). Set the full Cookie header in your Claude Desktop config or .env. This is the path shown in the config above.

  2. Saved session from ck_set_session. The tool saves the Cookie header to ~/.creditkarma-mcp/session (mode 0600; override the path with CK_SESSION_PATH), which the server reads back directly on every start — including from the .mcpb bundle. Paths 1 and 2 are both local: whichever holds the fresher refresh token wins.

  3. fetchproxy fallback (no env vars needed — easiest onboarding). Used when neither is configured, or when the local session has expired or Credit Karma has rejected its refresh token: the server reads CKAT + CKTRKID cookies from your already-signed-in creditkarma.com tab via the fetchproxy browser extension. After that read, all CK API calls go directly from Node — the extension is not in the request hot path. Install the fetchproxy extension (Chrome Web Store / Safari .dmg), sign into creditkarma.com, and the MCP just works.

Set CK_DISABLE_FETCHPROXY=1 to opt out of the fallback (turns missing credentials into a hard error — useful in headless CI).

Getting your credentials (env-var path)

  1. Install the fetchproxy 0.3.0 extension (Chrome Web Store or Safari .dmg).

  2. Sign into creditkarma.com in that browser.

  3. Leave CK_COOKIES unset in your Claude config.

The MCP reads the HttpOnly CKAT + CKTRKID cookies via chrome.cookies.get on the first tool call, then operates direct-to-API from Node. To re-auth (e.g. after Credit Karma signs you out), just sign back in to creditkarma.com.

Option B — manual (DevTools)

  1. Log in to creditkarma.com in Chrome

  2. Open DevTools → Network → click any request to creditkarma.com → Request Headers

  3. Right-click the cookie header → Copy value

Then either paste into CK_COOKIES in your Claude config / .env, or call ck_set_session from within Claude with the Cookie header value.

The server extracts the access and refresh JWTs from the CKAT cookie inside the header and refreshes the access token automatically as needed.

Session expiry

  • Access token: ~15 minutes (auto-refreshed transparently)

  • Refresh token: ~8 hours

  • When the refresh token expires:

    • fetchproxy path: sign back into creditkarma.com — the MCP re-reads fresh cookies on the next tool call.

    • env-var path: grab a fresh Cookie header from DevTools and update CK_COOKIES (or call ck_set_session).

Available tools

Tool

What it does

ck_set_session

Store credentials from your browser Cookie header (auto-extracts JWTs from the CKAT cookie)

ck_forget_session

Delete the saved-session file and clear in-memory credentials (local only; synced transactions are kept)

ck_sync_transactions

Sync transactions into the local SQLite database

ck_list_transactions

List transactions with filters (date, account, category, merchant, amount)

ck_get_recent_transactions

Fetch the N most recent transactions

ck_get_spending_by_category

Spending totals grouped by category

ck_get_spending_by_merchant

Spending totals grouped by merchant

ck_get_account_summary

Transaction counts and totals by account

ck_query_sql

Run a read-only SQL query against the local database (returns at most max_rows rows, default 500 / max 5000, with truncated: true when there were more)

How it works

Transactions are synced from Credit Karma's GraphQL API into a local SQLite database (default: ~/.creditkarma-mcp/transactions.db). All query tools run against this local database — fast, offline-capable, and queryable with SQL.

Sync strategy: incremental by default (fetches since last sync date with a 30-day overlap for updates). Use force_full: true to walk the whole history with no date cutoff — it starts from the beginning, except that a repeated force_full continues a backfill that paused on max_pages. After a sync that failed or stopped on a stuck cursor, force_full restarts from page 1 (a plain call retries from the saved cursor).

Auto-refresh: if the access token has expired, the server automatically refreshes it before syncing. If the refresh token has also expired, it throws an error asking you to re-authenticate.

Database 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)

Configuration

Env var

Description

Default

CK_COOKIES

Full Cookie header from a signed-in creditkarma.com request

(unset — falls back to fetchproxy)

CK_DISABLE_FETCHPROXY

Set to 1 to skip the fetchproxy fallback (headless / CI)

(unset)

CK_DB_PATH

Path to SQLite database file

~/.creditkarma-mcp/transactions.db

Troubleshooting

"CK auth: set CK_COOKIES, or call the ck_set_session MCP tool, or install the fetchproxy extension…" — neither auth path is configured. Either fill in CK_COOKIES in your Claude config, or install the fetchproxy extension and sign into creditkarma.com in your browser.

"TOKEN_EXPIRED" — your refresh token has expired. Sign back into creditkarma.com (fetchproxy path) or grab a fresh Cookie header from DevTools and update CK_COOKIES / call ck_set_session.

"fetchproxy fallback failed" — the env-var path wasn't configured and the extension couldn't be reached. Confirm the fetchproxy extension is installed, signed into Credit Karma, and that it's running (open the extension popup). To disable the fallback, set CK_DISABLE_FETCHPROXY=1.

Sync returns 0 transactions — check that your auth is fresh. The refresh token inside the CKAT cookie expires after ~8 hours.

Tools not appearing — fully quit and relaunch Claude Desktop. In Claude Code, run /mcp to check server status.

"No such file or directory: dist/bundle.js" — run npm run build (not just tsc).

Security

  • Credentials are stored only in your saved-session file (~/.creditkarma-mcp/session, or CK_SESSION_PATH), Claude config / .env, or your browser's cookie jar (fetchproxy path)

  • The saved-session file is written at mode 0600 (owner read/write only), in a 0700 directory, by ck_set_session and by every token-refresh rotation

  • ck_set_session refuses to save a refresh token whose JWT exp is already in the past — prevents stale credentials from polluting the saved session

  • The fetchproxy path reads cookies directly from the user's browser via chrome.cookies.get, but it is not memory-only: every token refresh rotates the session, and the rotated CKAT/CKTRKID Cookie header is saved to the saved-session file (~/.creditkarma-mcp/session, or CK_SESSION_PATH) at mode 0600 in a 0700 directory — fetchproxy-only users included — so a restart can recover without re-reading the browser. Call ck_forget_session (or delete that file) to remove it

  • The server never logs credentials; warnings go to stderr only (stdout is reserved for the MCP JSON-RPC stream)

  • Only SELECT queries are permitted via ck_query_sql — no writes to Credit Karma; the underlying node:sqlite prepare() also rejects multi-statement input

Uninstall / Reset

The server keeps two things on disk. Neither is removed when you uninstall the extension or stop using it:

What

Default path

How to remove

Saved session — your full creditkarma.com Cookie header (working access + refresh tokens)

~/.creditkarma-mcp/session (CK_SESSION_PATH)

Call ck_forget_session, or delete the file

Synced transaction history (accounts, merchants, amounts, descriptions)

~/.creditkarma-mcp/transactions.db (CK_DB_PATH) plus any -wal / -shm sidecars

Quit the server, then delete the files (or the whole ~/.creditkarma-mcp/ directory)

ck_forget_session is local only: Credit Karma is not contacted, so sign out at creditkarma.com to invalidate the tokens themselves. If CK_COOKIES is set in your Claude config, remove it there too, and sign out of creditkarma.com in the browser if the fetchproxy extension is installed — otherwise the next call picks the session straight back up.

Development

npm test               # run the test suite (vitest)
npm run build          # compile TypeScript → dist/, bundle for MCPB
npm run test:watch     # watch mode
npm run test:coverage  # coverage report (CI enforces 100% on src/**)

Versions are bumped automatically by the Tag & Bump GitHub Action (.github/workflows/tag-and-bump.yml). Do not bump manually.

Pull requests

Changes land via PR, including for solo work — release notes are generated from merged PRs only (config in .github/release.yml). Apply one of these labels to every PR: enhancement, bug, security, refactor, documentation, test, dependencies, ci, or ignore-for-release (excludes from notes). The PR title becomes the changelog bullet, so write it like a user-facing entry.

Project structure

src/
  auth.ts               resolveAuth() — three-path priority (CK_COOKIES env / ck_set_session cache / fetchproxy), plus loadAuthIntoClient()
  client.ts             Credit Karma GraphQL client (auto-refresh, JWT helpers, cookie parser)
  index.ts              MCP server entry point; bootstraps tokens from the saved session / CK_COOKIES
  db.ts                 SQLite schema, migrations, and upsert helpers
  transaction.graphql   Documents the transactions selection set (sent as a persisted-query hash, not this text)
  tools/
    auth.ts             ck_set_session — refuses stale refresh tokens, saves ~/.creditkarma-mcp/session at 0600;
                        ck_forget_session — deletes it and clears in-memory credentials
    sync.ts             ck_sync_transactions — incremental sync with resume-on-failure
    query.ts            ck_list_transactions, ck_get_recent_transactions,
                        ck_get_spending_by_category, ck_get_spending_by_merchant,
                        ck_get_account_summary
    sql.ts              ck_query_sql — SELECT-only escape hatch
tests/
  helpers.ts            Shared test helpers (fakeServer, makeJwt)
  auth.test.ts          resolveAuth + loadAuthIntoClient (mocks @fetchproxy/bootstrap)
  client.test.ts
  db.test.ts
  tools/
    auth.test.ts
    sync.test.ts
    query.test.ts
    sql.test.ts

License

MIT

Available Tools

10 tools
ck_forget_sessionA
DestructiveIdempotent

Forget the Credit Karma session on this machine: delete the saved-session file (~/.creditkarma-mcp/session, or CK_SESSION_PATH) that ck_set_session and token refreshes write, and clear the credentials held in memory. Use when the user stops using this server or wants their stored login removed. Local only — Credit Karma is not contacted, synced transactions are kept, and a CK_COOKIES value set in the host config is not changed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already signal destructive and idempotent behavior, and the description adds substantial context beyond them: the exact file path (~/.creditkarma-mcp/session or CK_SESSION_PATH), in-memory credential clearing, no network contact, and preservation of synced transactions and host config values. This fully discloses side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense without redundancy: the primary action and file path come first, followed by the usage condition, then important exclusions. Every sentence adds operational value, and the caveats are separated clearly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a state-clearing destructive tool with no output schema, the description covers all an agent needs: exact target file, environment variable override, in-memory effect, local-only guarantee, and what is intentionally preserved. Nothing necessary for correct invocation or safe reasoning is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100%, so the schema carries no semantic burden. With no parameters to describe, the baseline of 4 applies; the description appropriately focuses on behavior instead of parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Forget') and a clear resource ('Credit Karma session on this machine'), then spells out the concrete mechanism: deleting the saved-session file and clearing in-memory credentials. It also distinguishes the tool from its sibling ck_set_session by explicitly naming the session file both tools write to.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states exactly when to use the tool: 'when the user stops using this server or wants their stored login removed.' It also clarifies boundaries by listing what is not affected (synced transactions, CK_COOKIES) and that it is local-only, preventing misuse as a remote logout.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ck_get_account_summaryA
Read-only

Return per-account debit, credit, and net totals.

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoYYYY-MM-DD
start_dateNoYYYY-MM-DD

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already establishes that this is a safe read operation, and the description's 'Return' phrasing is consistent with that. The description adds the per-account grouping context but does not disclose behavioral details like date-range handling, account coverage, or result limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, tightly written sentence that leads with the action and the output scope. Every word earns its place with no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple, read-only aggregate tool with optional parameters and no output schema, the description is nearly sufficient. It states what the tool returns, though it could be slightly stronger by explicitly noting that results are filtered by the optional date range.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both start_date and end_date documented as YYYY-MM-DD strings. The description adds no further parameter-specific meaning, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Return'), identifies the resource (account summary), and specifies the exact output shape (per-account debit, credit, and net totals). This clearly distinguishes it from sibling transaction-list and spending-breakdown tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for account-level aggregate totals, but it never explicitly states when to use this tool versus the sibling transaction or spending tools. There is no exclusion or alternative guidance, though the intended use is reasonably inferable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ck_get_recent_transactionsA
Read-only

Return the N most recent transactions. Convenience shortcut for ck_list_transactions.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of transactions to return (default 25)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so no destructiveness caveat is needed; the description adds that results are the most recent N transactions. Annotations cover the safety profile, and the description adds modest behavioral context but no details about sort stability, side effects, or edges.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler: the purpose statement leads, and the relationship to ck_list_transactions follows immediately. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only convenience tool, the description plus schema is nearly complete. It does not describe the return format, but since this is a shortcut for ck_list_transactions, the shape is implicitly inherited; an explicit note would make it fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, limit, is fully documented in the schema including its default (25), so the description has little to add. 'N most recent' does map meaningfully to limit, but the schema already carries the parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair ('Return ... transactions') with a clear scope ('N most recent') and explicitly ties itself to ck_list_transactions as the broader operation, so an agent can tell it apart from sibling list/spending tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Calling itself a 'convenience shortcut for ck_list_transactions' gives clear context that this is the quick path for recent transactions and names the relevant alternative. It stops short of explicit when-not-to-use conditions, but the shortcut phrasing implies when it is the appropriate choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ck_get_spending_by_categoryA
Read-only

Group debit transactions by category and return totals.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNoPartial account name filter
end_dateNoYYYY-MM-DD
start_dateNoYYYY-MM-DD

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description adds meaningful behavior: it only includes debit transactions and produces grouped totals. It does not mention sorting or exact output shape, but for a read-only aggregation the provided scope is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the action and the expected result. Every word earns its place and there is no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only aggregation tool with all-optional parameters, no output schema, and clear parameter descriptions, the description is largely complete. Explicitly stating the return format would improve it, but 'return totals' already gives sufficient orientation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters. The tool description adds no parameter-specific detail beyond what the schema provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Group'), the resource ('debit transactions'), the grouping dimension ('by category'), and the result ('return totals'). The category focus clearly distinguishes it from siblings like ck_get_spending_by_merchant and ck_get_account_summary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: call it when you need debit spending totals grouped by category. However, there is no explicit when-to-use guidance, no mention of alternatives, and no exclusions, so the agent must infer the right scenario.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ck_get_spending_by_merchantB
Read-only

Return top merchants by total debit spend.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoDefault 25
categoryNoPartial category name filter
end_dateNoYYYY-MM-DD
start_dateNoYYYY-MM-DD

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, which already covers the safety profile. The description adds a meaningful behavioural detail: results are aggregated by total debit spend (not credit or net spend) and ordered by merchant. However, it does not disclose other traits like pagination behavior or that the top-N ordering depends on the limit parameter, so it adds only partial context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. It communicates the core purpose efficiently and every word contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only aggregation tool with fully documented parameters, the description is nearly sufficient. It states the core behavior and the readOnlyHint provides safety context. The main gap is the absence of any usage guidance or mention of the output format, but the latter is not required since there is no output schema to complement.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% parameter coverage with descriptions for all four parameters (limit default, partial category filter, date formats). The description does not add significant meaning beyond the schema; the mention of 'top merchants' loosely maps to the limit parameter but is not explicit. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action ('Return') and a specific resource ('top merchants') qualified by a specific metric ('total debit spend'). It is not tautological and is distinct from sibling tools like get_spending_by_category or list_transactions, though it does not explicitly name or contrast those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given about when to use this tool versus alternatives such as get_spending_by_category or list_transactions. The description simply states what the tool does, leaving the agent to infer the appropriate context from the name and schema alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ck_healthcheckVerify credentials and upstream reachabilityA
Read-onlyIdempotent

Resolves the credential the way real tools do, then makes one authenticated request to creditkarma.com. Reports which source supplied the credential, whether creditkarma.com accepted it, the round-trip time, and a plain-English hint distinguishing 'no credential' from 'credential rejected' from 'a creditkarma.com-side problem'. Read-only; never returns the credential itself. Call this when a real tool fails and you want to know which hop broke.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description adds important behavioral details: 'never returns the credential itself,' makes exactly one authenticated request, and reports a plain-English hint distinguishing three failure modes. It also explains that credential resolution matches 'the way real tools do,' which is valuable context for understanding the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences of dense, useful information with no filler. It front-loads the mechanism, then the reporting details, then the caveat and usage trigger. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description adequately conveys what the agent will learn: credential source, acceptance, round-trip time, and a categorized hint. Combined with the read-only guarantee and usage trigger, an agent has enough to decide when to call and what to expect, despite no structured return schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing for the description to add beyond the empty schema. The baseline for 0-parameter tools is 4, and the description appropriately focuses on outputs and usage rather than parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb-resource pair: it resolves credentials and makes an authenticated healthcheck request to creditkrama.com, then reports four concrete outputs. This clearly differentiates it from sibling tools that fetch transactions, spending, account summaries, or run SQL, and the phrase 'Call this when a real tool fails' positions it as a diagnostic tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Call this when a real tool fails and you want to know which hop broke,' giving a clear when-to-use condition. It does not name alternative tools or explicitly state when not to use it, but the failure-driven context implies it is not for routine operations, so guidance is strong but not fully exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ck_list_transactionsC
Read-only

List transactions with optional filters. Paginated.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoDefault 50
offsetNoDefault 0
statusNoe.g. posted, pending, cancelled
accountNoPartial account name match
categoryNoPartial category name match
end_dateNoYYYY-MM-DD
merchantNoPartial merchant name match
max_amountNoMaximum absolute amount
min_amountNoMinimum absolute amount
start_dateNoYYYY-MM-DD

TDQS

C2.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations include readOnlyHint=true, which already signals that this is a safe, read-only operation. The description adds the pagination behavior (a strategic trait) but does not disclose details like default pagination limits, maximum page size, or whether results are sorted (e.g., by date). While the description adds some value over annotations, it doesn't provide substantial behavioral context beyond what a read-only hint implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, two short sentences, and puts the core function first. It avoids extraneous detail, but it is so brief that it misses opportunities to add clarifying context (e.g., filtering semantics). Still, it is well-structured and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 10 parameters, all optional, and no output schema, the description is thin. It does not explain how filters interact, whether filtering is case-insensitive, what the default sort order is, or how pagination works (e.g., page size limits). Since annotations provide only a read-only hint, the description should carry more weight for usability, but it fails to address these key aspects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each parameter has a basic description (e.g., 'Default 50', 'Partial account name match'). The description adds the concept of 'optional filters' and pagination, but it doesn't add meaning beyond what the schema provides, such as how filters combine (AND logic) or that amount filters use absolute values. Given high schema coverage, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'List transactions with optional filters. Paginated.', which identifies the primary function (listing transactions) and mentions pagination. However, it does not distinguish this tool from sibling tools like ck_get_recent_transactions, which likely also lists transactions. The description is functional but lacks specificity about scope (e.g., whether it returns all transactions or recent ones).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives. With siblings like ck_get_recent_transactions, ck_get_spending_by_category, and ck_query_sql, an agent would benefit from knowing that this tool is for filtered, paginated listing as opposed to recent-only or aggregated views. The description implies it is the general listing tool but does not state exclusions or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ck_query_sqlA
Read-only

Execute a raw SQL SELECT query (CTEs via WITH ... SELECT are supported) against the transactions database. Non-SELECT statements (INSERT, UPDATE, DELETE, DROP, etc.) are rejected. Returns at most max_rows rows (default 500, max 5000); a larger result comes back with truncated: true, so prefer aggregates or LIMIT/OFFSET paging. Tables: transactions, accounts, categories, merchants, sync_state.

ParametersJSON Schema
NameRequiredDescriptionDefault
sqlYesA SELECT SQL statement
max_rowsNoMost rows to return (default 500). Page larger results with LIMIT/OFFSET.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description substantially enriches this by disclosing that only SELECT is allowed, CTEs are supported, results are capped at max_rows, and truncated: true is returned for larger results. It also names affected tables, giving the agent a clear behavioral model beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the essential action and constraints. Every sentence contributes meaningful operational detail: the SQL requirement, rejection of non-SELECT, row limits, truncation behavior, and table names. There is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a raw SQL tool with no output schema, the description covers what an agent needs to know to invoke it correctly: supported statements, syntax features, result limits, truncation signaling, and available tables. The read-only annotation covers safety, so no additional behavioral disclosure is necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value beyond the schema by specifying that CTEs via WITH ... SELECT are supported and listing the available tables, which helps the agent construct valid SQL statements. It also reinforces the max_rows default and truncation behavior already present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Execute a raw SQL SELECT query' against the transactions database. It further distinguishes itself from the specialized sibling tools by emphasizing raw SQL and explicitly listing supported tables. The rejection of non-SELECT statements removes ambiguity about what the tool can and cannot do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly conveys that this tool is for raw, read-only SQL SELECT queries and provides practical guidance such as using aggregates or LIMIT/OFFSET paging for large result sets. It does not explicitly name sibling tools as alternatives, but the 'raw SQL' framing and rejection of non-SELECT statements establish a clear use context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ck_set_sessionA

Store a Credit Karma session to enable automatic token refresh. Pass the full Cookie header from a signed-in creditkarma.com request (Chrome DevTools → Network → any creditkarma.com request → Request Headers → right-click the cookie header → Copy value). For most users the easier onboarding path is to install the fetchproxy extension and sign into creditkarma.com — the MCP reads the cookies automatically.

ParametersJSON Schema
NameRequiredDescriptionDefault
cookiesYesFull Cookie header from a signed-in creditkarma.com request (contains CKAT, CKTRKID, etc.)

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotation only says readOnlyHint: false, which correctly aligns with the description's claim of storing a session. The description adds useful behavioral context: it explains the effect (automatic token refresh) and the mechanics of how to supply input, going beyond the annotation. It doesn't disclose potential overwrite behavior, but that is minor for a setter tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences cover the purpose and both usage paths. The primary instruction is front-loaded, and the alternative is stated concisely. No redundant filler; each sentence contributes actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with no output schema, the description is sufficiently complete. It explains what the tool does, how to obtain the required input, and when an alternative is preferable. It doesn't mention return values, but that is unnecessary for a session-setter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents the 'cookies' parameter, including the note about CKAT/CKTRKID. The description adds extra meaning by providing concrete steps to extract the cookie from Chrome DevTools and mentioning an alternative that avoids manual copying, which is valuable beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb ('store') and resource ('Credit Karma session') with an explicit purpose ('to enable automatic token refresh'). It naturally distinguishes from the sibling data-query tools, which all retrieve information rather than set up state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives detailed step-by-step instructions for obtaining the cookie header and also presents an alternative onboarding path (fetchproxy extension) with the implication that the tool is unnecessary when that extension is installed. It doesn't explicitly say 'use this only when you don't have the extension,' but the context makes the choice clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ck_sync_transactionsA

Sync Credit Karma transactions into the local SQLite database. Incremental by default (fetches since last sync + 30-day overlap for updates). If no valid token, initiates the login/MFA flow automatically. Bounded and resumable: when it pauses with more to fetch it returns another_run_needed:true and a note — run it again and it continues from where it stopped.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_pagesNoPages this call may fetch before pausing (a deep backfill is hundreds). Overrides CK_SYNC_MAX_PAGES. Omit both for an unbounded sync.
force_fullNoIf true, walk the whole history with no date cutoff. Starts from the beginning, except that it continues a full backfill paused by max_pages. Also the way to restart after a sync that failed or stopped on a stuck cursor.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint:false annotation, the description discloses meaningful behavior: it writes to a local SQLite database, performs incremental syncs with overlap, can trigger authentication flows, and is bounded/resumable via another_run_needed. This is substantial additional transparency, with no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences with no filler. The purpose is front-loaded, and each sentence adds meaningful behavioral or operational detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter tool with no output schema, the description covers the key invocation behaviors and the resumption contract. It stops slightly short of fully describing the return payload or failure modes, but nothing critical is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds context beyond the schema: it explains the pausing/resuming model and another_run_needed:true, which enriches the meaning of max_pages and force_full.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Sync Credit Karma transactions into the local SQLite database.' This clearly differentiates it from the sibling get/list/query tools, which are read operations rather than write-oriented sync operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear operational context: incremental by default, 30-day overlap, auto login/MFA when needed, and resumability. It does not explicitly state when to use this tool versus alternatives or when not to use it, so it falls short of a perfect score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv3.1.3
    • Addedck_forget_session
    • Changedck_query_sql1 field changed
      • addedInput schema / properties / max_rows
        Added value: +{
        +  "description": "Most rows to return (default 500). Page larger results with LIMIT/OFFSET.",
        +  "maximum": 5000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
  2. 1 tool updatev3.1.2
    • Changedck_sync_transactions1 field changed
      • changedInput schema / properties / force_full / description
        Previous value: -"If true, re-fetch all transactions from the beginning"New value: +"If true, walk the whole history with no date cutoff. Starts from the beginning, except that it continues a full backfill paused by max_pages. Also the way to restart after a sync that failed or stopped on a stuck cursor."
  3. 9 tool updatesv3.0.0
    • Changedck_get_account_summary1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedck_get_recent_transactions1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedck_get_spending_by_category1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedck_get_spending_by_merchant1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedck_healthcheck1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedck_list_transactions1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedck_query_sql1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedck_set_session1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedck_sync_transactions1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  4. 1 tool updatev2.7.0
    • Addedck_healthcheck
  5. 1 tool updatev2.5.0
    • Changedck_sync_transactions1 field changed
      • addedInput schema / properties / max_pages
        Added value: +{
        +  "description": "Pages this call may fetch before pausing (a deep backfill is hundreds). Overrides CK_SYNC_MAX_PAGES. Omit both for an unbounded sync.",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
  6. 8 tool updatesv2.3.1
    • First observedck_get_account_summary
    • First observedck_get_recent_transactions
    • First observedck_get_spending_by_category
    • First observedck_get_spending_by_merchant
    • First observedck_list_transactions
    • First observedck_query_sql
    • First observedck_set_session
    • First observedck_sync_transactions

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation4/5

Most tools target distinct operations: session lifecycle, syncing, listing, analytics, and diagnostics are clearly separated. The main overlap is ck_get_recent_transactions, which is explicitly a convenience shortcut for ck_list_transactions, and ck_query_sql can replicate read queries but is clearly marked as raw SQL.

Naming Consistency4/5

Nearly all tools follow a consistent ck_ + verb + object pattern with snake_case, such as ck_list_transactions, ck_set_session, and ck_sync_transactions. The one deviation is ck_healthcheck, which uses a noun instead of a verb-object structure, but it still matches the prefix and general naming style.

Tool Count5/5

Ten tools is well within the ideal range for this server's purpose. Each tool earns its place: session management, syncing, transaction listing, spending summaries, SQL access, and health diagnostics form a compact but complete toolkit.

Completeness5/5

The toolset covers the full lifecycle: credential/session setup, transaction syncing, paginated transaction retrieval, multiple spending aggregation views, raw SQL for ad-hoc queries, and a healthcheck for diagnosing failures. There are no obvious missing operations for a Credit Karma transaction-sync and analysis server.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables integration with Monarch Money to query financial data, analyze spending patterns, track budgets, and get personalized financial insights through conversational AI with Claude Desktop.
    11
    3
    ISC
  • A
    license
    A
    quality
    D
    maintenance
    Integrates Claude with the BudgetBakers Wallet API to access financial data including accounts, transactions, categories, and spending analytics.
    8
    14 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Connects Claude Desktop to Yodlee financial data, enabling account management, transaction queries, spending summaries, and audio narrations.
    1
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables Claude to query Empower/Personal Capital financial accounts, net worth, transactions, and asset allocation via natural language.
    5
    -