Repository files navigation

mdcli

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app.

Installation

Requires Bun. mdcli runs TypeScript directly and relies on Bun-only APIs, so it does not run under plain Node.js.

Global

bun install -g github:fm1randa/mdcli

From Source

gh repo clone fm1randa/mdcli
cd mdcli
bun install
bun dev --help

Optional: 1Password CLI

For automatic login when browser session extraction fails, install the 1Password CLI:

# macOS
brew install 1password-cli
# Linux# See https://developer.1password.com/docs/cli/get-started/#install

Create a 1Password item with the following fields:

  • username - your login email
  • password - your password
  • otp - one-time password (configured as TOTP)

Optional: 2Captcha API Key

If the login page shows a reCAPTCHA challenge, you can configure a 2Captcha API key to automatically solve it:

mdcli auth login --captcha-key <your-2captcha-api-key>

The API key is saved to config and reused for future logins.

Authentication

The CLI supports multiple authentication methods:

Browser Session (Default)

If you're already logged into MeuDinheiro in your browser, the CLI can extract your session automatically:

# Extracts session from Chrome (default)
mdcli auth login
# Explicitly use Chrome
mdcli auth login --session chrome
# Use Firefox instead
mdcli auth login --session firefox

If session extraction fails (e.g., not logged in, browser not found), you'll be prompted with fallback options:

  1. Use 1Password for automatic login
  2. Try Firefox session instead
  3. Open browser for manual login
  4. Enter credentials manually
  5. Cancel

1Password (Automatic)

# Use 1Password item (prompts for item name on first run)
mdcli auth login --item
# Specify item name directly
mdcli auth login --item "My Meu Dinheiro"

Browser Login (Manual)

Opens a browser for you to log in manually:

mdcli auth login --browser

Check Status

mdcli auth status

Shows your authentication status including the method used (Browser session, 1Password, etc.).

Logout

# Remove the stored session
mdcli auth logout# Also clear the saved 1Password item and 2Captcha key
mdcli auth logout --all

Usage

Identifying accounts, categories, and tags

--account, --category, and --tag accept three forms, tried in this order:

  1. Numeric ID — e.g. --account 1167419. Fastest, no network needed.
  2. Alias — a short name you've mapped to an ID via mdcli accounts alias add. Stored locally in ~/.config/mdcli/mdcli.config.json.
  3. Exact name — the entity's real name as shown by mdcli accounts list, matched case-insensitively. Names are looked up via a 30-day on-disk cache and auto-invalidated when a request using a cached ID returns a non-2xx.

Aliases win over names when both match the same string, so your shortcuts always take priority.

# Authenticate (extracts session from Chrome by default)
mdcli auth login
# Or use 1Password
mdcli auth login --item "My Meu Dinheiro"# List accounts
mdcli accounts list --active
# Create an alias for quick access
mdcli accounts alias add --id 1167419 --name mp
# List entries using alias
mdcli entries list --account mp --from 2024-01-01 --to 2024-01-31
# List entries using the account's exact name (case-insensitive)
mdcli entries list --account "Nubank - Conta Corrente" --from 2024-01-01 --to 2024-01-31
# Create an entry
mdcli entries create --account mp --description "Groceries" --value 150 --category food
# Create an entry using the account name instead of an alias
mdcli entries create --account "Mercado Pago" --description "Groceries" --value 150 --category food
# Update an entry (only the fields you pass are changed)
mdcli entries update 12345 --value 200 --category food
# Delete an entry
mdcli entries delete 12345
# List credit cards
mdcli cards list --active
# Show a credit card invoice (defaults to the current/next one)
mdcli cards invoice --account <cardId> --month 2026-02
# Show a credit card invoice using the card's exact name
mdcli cards invoice --account "Itaú Personalité" --month 2026-02
# Show upcoming installments on a card
mdcli cards future --account <cardId># Create a tag (color is optional, defaults to gray)
mdcli tags create --name "Travel" --color "#FF6600"# Update a tag (only the fields you pass are changed)
mdcli tags update 12345 --color "#00AAFF"# Archive (deactivate) or reactivate a tag
mdcli tags update 12345 --inactive
mdcli tags update 12345 --active
# Delete a tag
mdcli tags delete 12345

Features

Auth

FeatureStatus
Browser session extraction (Chrome/Firefox)Done
Browser login (auto-capture)Done
Automatic login (1Password CLI)Done
Auto token refresh on 401Done
Manual token entryDone
Status checkDone
LogoutDone

Accounts

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Categories

FeatureStatus
ListDone
Filter by activeDone
Filter by typeMissing
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Tags

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateDone
UpdateDone
DeleteDone
ArchiveDone

Entries

FeatureStatus
List by accountDone
Filter by date rangeDone
Filter by statusDone
Filter by typeDone
Filter by categoryDone
Filter by tagDone
Filter by keywordsDone
Filter by valueDone
JSON outputDone
Alias support (account/category/tag)Done
Create (single)Done
Create (recurring)Done
UpdateDone
DeleteDone

Cards

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Invoice (by month)Done
Future installmentsDone

About

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

mdcli

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app.

Installation

Requires Bun. mdcli runs TypeScript directly and relies on Bun-only APIs, so it does not run under plain Node.js.

Global

bun install -g github:fm1randa/mdcli

From Source

gh repo clone fm1randa/mdcli
cd mdcli
bun install
bun dev --help

Optional: 1Password CLI

For automatic login when browser session extraction fails, install the 1Password CLI:

# macOS
brew install 1password-cli
# Linux# See https://developer.1password.com/docs/cli/get-started/#install

Create a 1Password item with the following fields:

  • username - your login email
  • password - your password
  • otp - one-time password (configured as TOTP)

Optional: 2Captcha API Key

If the login page shows a reCAPTCHA challenge, you can configure a 2Captcha API key to automatically solve it:

mdcli auth login --captcha-key <your-2captcha-api-key>

The API key is saved to config and reused for future logins.

Authentication

The CLI supports multiple authentication methods:

Browser Session (Default)

If you're already logged into MeuDinheiro in your browser, the CLI can extract your session automatically:

# Extracts session from Chrome (default)
mdcli auth login
# Explicitly use Chrome
mdcli auth login --session chrome
# Use Firefox instead
mdcli auth login --session firefox

If session extraction fails (e.g., not logged in, browser not found), you'll be prompted with fallback options:

  1. Use 1Password for automatic login
  2. Try Firefox session instead
  3. Open browser for manual login
  4. Enter credentials manually
  5. Cancel

1Password (Automatic)

# Use 1Password item (prompts for item name on first run)
mdcli auth login --item
# Specify item name directly
mdcli auth login --item "My Meu Dinheiro"

Browser Login (Manual)

Opens a browser for you to log in manually:

mdcli auth login --browser

Check Status

mdcli auth status

Shows your authentication status including the method used (Browser session, 1Password, etc.).

Logout

# Remove the stored session
mdcli auth logout# Also clear the saved 1Password item and 2Captcha key
mdcli auth logout --all

Usage

Identifying accounts, categories, and tags

--account, --category, and --tag accept three forms, tried in this order:

  1. Numeric ID — e.g. --account 1167419. Fastest, no network needed.
  2. Alias — a short name you've mapped to an ID via mdcli accounts alias add. Stored locally in ~/.config/mdcli/mdcli.config.json.
  3. Exact name — the entity's real name as shown by mdcli accounts list, matched case-insensitively. Names are looked up via a 30-day on-disk cache and auto-invalidated when a request using a cached ID returns a non-2xx.

Aliases win over names when both match the same string, so your shortcuts always take priority.

# Authenticate (extracts session from Chrome by default)
mdcli auth login
# Or use 1Password
mdcli auth login --item "My Meu Dinheiro"# List accounts
mdcli accounts list --active
# Create an alias for quick access
mdcli accounts alias add --id 1167419 --name mp
# List entries using alias
mdcli entries list --account mp --from 2024-01-01 --to 2024-01-31
# List entries using the account's exact name (case-insensitive)
mdcli entries list --account "Nubank - Conta Corrente" --from 2024-01-01 --to 2024-01-31
# Create an entry
mdcli entries create --account mp --description "Groceries" --value 150 --category food
# Create an entry using the account name instead of an alias
mdcli entries create --account "Mercado Pago" --description "Groceries" --value 150 --category food
# Update an entry (only the fields you pass are changed)
mdcli entries update 12345 --value 200 --category food
# Delete an entry
mdcli entries delete 12345
# List credit cards
mdcli cards list --active
# Show a credit card invoice (defaults to the current/next one)
mdcli cards invoice --account <cardId> --month 2026-02
# Show a credit card invoice using the card's exact name
mdcli cards invoice --account "Itaú Personalité" --month 2026-02
# Show upcoming installments on a card
mdcli cards future --account <cardId># Create a tag (color is optional, defaults to gray)
mdcli tags create --name "Travel" --color "#FF6600"# Update a tag (only the fields you pass are changed)
mdcli tags update 12345 --color "#00AAFF"# Archive (deactivate) or reactivate a tag
mdcli tags update 12345 --inactive
mdcli tags update 12345 --active
# Delete a tag
mdcli tags delete 12345

Features

Auth

FeatureStatus
Browser session extraction (Chrome/Firefox)Done
Browser login (auto-capture)Done
Automatic login (1Password CLI)Done
Auto token refresh on 401Done
Manual token entryDone
Status checkDone
LogoutDone

Accounts

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Categories

FeatureStatus
ListDone
Filter by activeDone
Filter by typeMissing
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Tags

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateDone
UpdateDone
DeleteDone
ArchiveDone

Entries

FeatureStatus
List by accountDone
Filter by date rangeDone
Filter by statusDone
Filter by typeDone
Filter by categoryDone
Filter by tagDone
Filter by keywordsDone
Filter by valueDone
JSON outputDone
Alias support (account/category/tag)Done
Create (single)Done
Create (recurring)Done
UpdateDone
DeleteDone

Cards

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Invoice (by month)Done
Future installmentsDone

About

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

mdcli

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app.

Installation

Requires Bun. mdcli runs TypeScript directly and relies on Bun-only APIs, so it does not run under plain Node.js.

Global

bun install -g github:fm1randa/mdcli

From Source

gh repo clone fm1randa/mdcli
cd mdcli
bun install
bun dev --help

Optional: 1Password CLI

For automatic login when browser session extraction fails, install the 1Password CLI:

# macOS
brew install 1password-cli
# Linux# See https://developer.1password.com/docs/cli/get-started/#install

Create a 1Password item with the following fields:

  • username - your login email
  • password - your password
  • otp - one-time password (configured as TOTP)

Optional: 2Captcha API Key

If the login page shows a reCAPTCHA challenge, you can configure a 2Captcha API key to automatically solve it:

mdcli auth login --captcha-key <your-2captcha-api-key>

The API key is saved to config and reused for future logins.

Authentication

The CLI supports multiple authentication methods:

Browser Session (Default)

If you're already logged into MeuDinheiro in your browser, the CLI can extract your session automatically:

# Extracts session from Chrome (default)
mdcli auth login
# Explicitly use Chrome
mdcli auth login --session chrome
# Use Firefox instead
mdcli auth login --session firefox

If session extraction fails (e.g., not logged in, browser not found), you'll be prompted with fallback options:

  1. Use 1Password for automatic login
  2. Try Firefox session instead
  3. Open browser for manual login
  4. Enter credentials manually
  5. Cancel

1Password (Automatic)

# Use 1Password item (prompts for item name on first run)
mdcli auth login --item
# Specify item name directly
mdcli auth login --item "My Meu Dinheiro"

Browser Login (Manual)

Opens a browser for you to log in manually:

mdcli auth login --browser

Check Status

mdcli auth status

Shows your authentication status including the method used (Browser session, 1Password, etc.).

Logout

# Remove the stored session
mdcli auth logout# Also clear the saved 1Password item and 2Captcha key
mdcli auth logout --all

Usage

Identifying accounts, categories, and tags

--account, --category, and --tag accept three forms, tried in this order:

  1. Numeric ID — e.g. --account 1167419. Fastest, no network needed.
  2. Alias — a short name you've mapped to an ID via mdcli accounts alias add. Stored locally in ~/.config/mdcli/mdcli.config.json.
  3. Exact name — the entity's real name as shown by mdcli accounts list, matched case-insensitively. Names are looked up via a 30-day on-disk cache and auto-invalidated when a request using a cached ID returns a non-2xx.

Aliases win over names when both match the same string, so your shortcuts always take priority.

# Authenticate (extracts session from Chrome by default)
mdcli auth login
# Or use 1Password
mdcli auth login --item "My Meu Dinheiro"# List accounts
mdcli accounts list --active
# Create an alias for quick access
mdcli accounts alias add --id 1167419 --name mp
# List entries using alias
mdcli entries list --account mp --from 2024-01-01 --to 2024-01-31
# List entries using the account's exact name (case-insensitive)
mdcli entries list --account "Nubank - Conta Corrente" --from 2024-01-01 --to 2024-01-31
# Create an entry
mdcli entries create --account mp --description "Groceries" --value 150 --category food
# Create an entry using the account name instead of an alias
mdcli entries create --account "Mercado Pago" --description "Groceries" --value 150 --category food
# Update an entry (only the fields you pass are changed)
mdcli entries update 12345 --value 200 --category food
# Delete an entry
mdcli entries delete 12345
# List credit cards
mdcli cards list --active
# Show a credit card invoice (defaults to the current/next one)
mdcli cards invoice --account <cardId> --month 2026-02
# Show a credit card invoice using the card's exact name
mdcli cards invoice --account "Itaú Personalité" --month 2026-02
# Show upcoming installments on a card
mdcli cards future --account <cardId># Create a tag (color is optional, defaults to gray)
mdcli tags create --name "Travel" --color "#FF6600"# Update a tag (only the fields you pass are changed)
mdcli tags update 12345 --color "#00AAFF"# Archive (deactivate) or reactivate a tag
mdcli tags update 12345 --inactive
mdcli tags update 12345 --active
# Delete a tag
mdcli tags delete 12345

Features

Auth

FeatureStatus
Browser session extraction (Chrome/Firefox)Done
Browser login (auto-capture)Done
Automatic login (1Password CLI)Done
Auto token refresh on 401Done
Manual token entryDone
Status checkDone
LogoutDone

Accounts

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Categories

FeatureStatus
ListDone
Filter by activeDone
Filter by typeMissing
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Tags

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateDone
UpdateDone
DeleteDone
ArchiveDone

Entries

FeatureStatus
List by accountDone
Filter by date rangeDone
Filter by statusDone
Filter by typeDone
Filter by categoryDone
Filter by tagDone
Filter by keywordsDone
Filter by valueDone
JSON outputDone
Alias support (account/category/tag)Done
Create (single)Done
Create (recurring)Done
UpdateDone
DeleteDone

Cards

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Invoice (by month)Done
Future installmentsDone

About

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

mdcli

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app.

Installation

Requires Bun. mdcli runs TypeScript directly and relies on Bun-only APIs, so it does not run under plain Node.js.

Global

bun install -g github:fm1randa/mdcli

From Source

gh repo clone fm1randa/mdcli
cd mdcli
bun install
bun dev --help

Optional: 1Password CLI

For automatic login when browser session extraction fails, install the 1Password CLI:

# macOS
brew install 1password-cli
# Linux# See https://developer.1password.com/docs/cli/get-started/#install

Create a 1Password item with the following fields:

  • username - your login email
  • password - your password
  • otp - one-time password (configured as TOTP)

Optional: 2Captcha API Key

If the login page shows a reCAPTCHA challenge, you can configure a 2Captcha API key to automatically solve it:

mdcli auth login --captcha-key <your-2captcha-api-key>

The API key is saved to config and reused for future logins.

Authentication

The CLI supports multiple authentication methods:

Browser Session (Default)

If you're already logged into MeuDinheiro in your browser, the CLI can extract your session automatically:

# Extracts session from Chrome (default)
mdcli auth login
# Explicitly use Chrome
mdcli auth login --session chrome
# Use Firefox instead
mdcli auth login --session firefox

If session extraction fails (e.g., not logged in, browser not found), you'll be prompted with fallback options:

  1. Use 1Password for automatic login
  2. Try Firefox session instead
  3. Open browser for manual login
  4. Enter credentials manually
  5. Cancel

1Password (Automatic)

# Use 1Password item (prompts for item name on first run)
mdcli auth login --item
# Specify item name directly
mdcli auth login --item "My Meu Dinheiro"

Browser Login (Manual)

Opens a browser for you to log in manually:

mdcli auth login --browser

Check Status

mdcli auth status

Shows your authentication status including the method used (Browser session, 1Password, etc.).

Logout

# Remove the stored session
mdcli auth logout# Also clear the saved 1Password item and 2Captcha key
mdcli auth logout --all

Usage

Identifying accounts, categories, and tags

--account, --category, and --tag accept three forms, tried in this order:

  1. Numeric ID — e.g. --account 1167419. Fastest, no network needed.
  2. Alias — a short name you've mapped to an ID via mdcli accounts alias add. Stored locally in ~/.config/mdcli/mdcli.config.json.
  3. Exact name — the entity's real name as shown by mdcli accounts list, matched case-insensitively. Names are looked up via a 30-day on-disk cache and auto-invalidated when a request using a cached ID returns a non-2xx.

Aliases win over names when both match the same string, so your shortcuts always take priority.

# Authenticate (extracts session from Chrome by default)
mdcli auth login
# Or use 1Password
mdcli auth login --item "My Meu Dinheiro"# List accounts
mdcli accounts list --active
# Create an alias for quick access
mdcli accounts alias add --id 1167419 --name mp
# List entries using alias
mdcli entries list --account mp --from 2024-01-01 --to 2024-01-31
# List entries using the account's exact name (case-insensitive)
mdcli entries list --account "Nubank - Conta Corrente" --from 2024-01-01 --to 2024-01-31
# Create an entry
mdcli entries create --account mp --description "Groceries" --value 150 --category food
# Create an entry using the account name instead of an alias
mdcli entries create --account "Mercado Pago" --description "Groceries" --value 150 --category food
# Update an entry (only the fields you pass are changed)
mdcli entries update 12345 --value 200 --category food
# Delete an entry
mdcli entries delete 12345
# List credit cards
mdcli cards list --active
# Show a credit card invoice (defaults to the current/next one)
mdcli cards invoice --account <cardId> --month 2026-02
# Show a credit card invoice using the card's exact name
mdcli cards invoice --account "Itaú Personalité" --month 2026-02
# Show upcoming installments on a card
mdcli cards future --account <cardId># Create a tag (color is optional, defaults to gray)
mdcli tags create --name "Travel" --color "#FF6600"# Update a tag (only the fields you pass are changed)
mdcli tags update 12345 --color "#00AAFF"# Archive (deactivate) or reactivate a tag
mdcli tags update 12345 --inactive
mdcli tags update 12345 --active
# Delete a tag
mdcli tags delete 12345

Features

Auth

FeatureStatus
Browser session extraction (Chrome/Firefox)Done
Browser login (auto-capture)Done
Automatic login (1Password CLI)Done
Auto token refresh on 401Done
Manual token entryDone
Status checkDone
LogoutDone

Accounts

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Categories

FeatureStatus
ListDone
Filter by activeDone
Filter by typeMissing
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Tags

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateDone
UpdateDone
DeleteDone
ArchiveDone

Entries

FeatureStatus
List by accountDone
Filter by date rangeDone
Filter by statusDone
Filter by typeDone
Filter by categoryDone
Filter by tagDone
Filter by keywordsDone
Filter by valueDone
JSON outputDone
Alias support (account/category/tag)Done
Create (single)Done
Create (recurring)Done
UpdateDone
DeleteDone

Cards

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Invoice (by month)Done
Future installmentsDone

About

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

mdcli

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app.

Installation

Requires Bun. mdcli runs TypeScript directly and relies on Bun-only APIs, so it does not run under plain Node.js.

Global

bun install -g github:fm1randa/mdcli

From Source

gh repo clone fm1randa/mdcli
cd mdcli
bun install
bun dev --help

Optional: 1Password CLI

For automatic login when browser session extraction fails, install the 1Password CLI:

# macOS
brew install 1password-cli
# Linux# See https://developer.1password.com/docs/cli/get-started/#install

Create a 1Password item with the following fields:

  • username - your login email
  • password - your password
  • otp - one-time password (configured as TOTP)

Optional: 2Captcha API Key

If the login page shows a reCAPTCHA challenge, you can configure a 2Captcha API key to automatically solve it:

mdcli auth login --captcha-key <your-2captcha-api-key>

The API key is saved to config and reused for future logins.

Authentication

The CLI supports multiple authentication methods:

Browser Session (Default)

If you're already logged into MeuDinheiro in your browser, the CLI can extract your session automatically:

# Extracts session from Chrome (default)
mdcli auth login
# Explicitly use Chrome
mdcli auth login --session chrome
# Use Firefox instead
mdcli auth login --session firefox

If session extraction fails (e.g., not logged in, browser not found), you'll be prompted with fallback options:

  1. Use 1Password for automatic login
  2. Try Firefox session instead
  3. Open browser for manual login
  4. Enter credentials manually
  5. Cancel

1Password (Automatic)

# Use 1Password item (prompts for item name on first run)
mdcli auth login --item
# Specify item name directly
mdcli auth login --item "My Meu Dinheiro"

Browser Login (Manual)

Opens a browser for you to log in manually:

mdcli auth login --browser

Check Status

mdcli auth status

Shows your authentication status including the method used (Browser session, 1Password, etc.).

Logout

# Remove the stored session
mdcli auth logout# Also clear the saved 1Password item and 2Captcha key
mdcli auth logout --all

Usage

Identifying accounts, categories, and tags

--account, --category, and --tag accept three forms, tried in this order:

  1. Numeric ID — e.g. --account 1167419. Fastest, no network needed.
  2. Alias — a short name you've mapped to an ID via mdcli accounts alias add. Stored locally in ~/.config/mdcli/mdcli.config.json.
  3. Exact name — the entity's real name as shown by mdcli accounts list, matched case-insensitively. Names are looked up via a 30-day on-disk cache and auto-invalidated when a request using a cached ID returns a non-2xx.

Aliases win over names when both match the same string, so your shortcuts always take priority.

# Authenticate (extracts session from Chrome by default)
mdcli auth login
# Or use 1Password
mdcli auth login --item "My Meu Dinheiro"# List accounts
mdcli accounts list --active
# Create an alias for quick access
mdcli accounts alias add --id 1167419 --name mp
# List entries using alias
mdcli entries list --account mp --from 2024-01-01 --to 2024-01-31
# List entries using the account's exact name (case-insensitive)
mdcli entries list --account "Nubank - Conta Corrente" --from 2024-01-01 --to 2024-01-31
# Create an entry
mdcli entries create --account mp --description "Groceries" --value 150 --category food
# Create an entry using the account name instead of an alias
mdcli entries create --account "Mercado Pago" --description "Groceries" --value 150 --category food
# Update an entry (only the fields you pass are changed)
mdcli entries update 12345 --value 200 --category food
# Delete an entry
mdcli entries delete 12345
# List credit cards
mdcli cards list --active
# Show a credit card invoice (defaults to the current/next one)
mdcli cards invoice --account <cardId> --month 2026-02
# Show a credit card invoice using the card's exact name
mdcli cards invoice --account "Itaú Personalité" --month 2026-02
# Show upcoming installments on a card
mdcli cards future --account <cardId># Create a tag (color is optional, defaults to gray)
mdcli tags create --name "Travel" --color "#FF6600"# Update a tag (only the fields you pass are changed)
mdcli tags update 12345 --color "#00AAFF"# Archive (deactivate) or reactivate a tag
mdcli tags update 12345 --inactive
mdcli tags update 12345 --active
# Delete a tag
mdcli tags delete 12345

Features

Auth

FeatureStatus
Browser session extraction (Chrome/Firefox)Done
Browser login (auto-capture)Done
Automatic login (1Password CLI)Done
Auto token refresh on 401Done
Manual token entryDone
Status checkDone
LogoutDone

Accounts

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Categories

FeatureStatus
ListDone
Filter by activeDone
Filter by typeMissing
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Tags

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateDone
UpdateDone
DeleteDone
ArchiveDone

Entries

FeatureStatus
List by accountDone
Filter by date rangeDone
Filter by statusDone
Filter by typeDone
Filter by categoryDone
Filter by tagDone
Filter by keywordsDone
Filter by valueDone
JSON outputDone
Alias support (account/category/tag)Done
Create (single)Done
Create (recurring)Done
UpdateDone
DeleteDone

Cards

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Invoice (by month)Done
Future installmentsDone

About

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

mdcli

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app.

Installation

Requires Bun. mdcli runs TypeScript directly and relies on Bun-only APIs, so it does not run under plain Node.js.

Global

bun install -g github:fm1randa/mdcli

From Source

gh repo clone fm1randa/mdcli
cd mdcli
bun install
bun dev --help

Optional: 1Password CLI

For automatic login when browser session extraction fails, install the 1Password CLI:

# macOS
brew install 1password-cli
# Linux# See https://developer.1password.com/docs/cli/get-started/#install

Create a 1Password item with the following fields:

  • username - your login email
  • password - your password
  • otp - one-time password (configured as TOTP)

Optional: 2Captcha API Key

If the login page shows a reCAPTCHA challenge, you can configure a 2Captcha API key to automatically solve it:

mdcli auth login --captcha-key <your-2captcha-api-key>

The API key is saved to config and reused for future logins.

Authentication

The CLI supports multiple authentication methods:

Browser Session (Default)

If you're already logged into MeuDinheiro in your browser, the CLI can extract your session automatically:

# Extracts session from Chrome (default)
mdcli auth login
# Explicitly use Chrome
mdcli auth login --session chrome
# Use Firefox instead
mdcli auth login --session firefox

If session extraction fails (e.g., not logged in, browser not found), you'll be prompted with fallback options:

  1. Use 1Password for automatic login
  2. Try Firefox session instead
  3. Open browser for manual login
  4. Enter credentials manually
  5. Cancel

1Password (Automatic)

# Use 1Password item (prompts for item name on first run)
mdcli auth login --item
# Specify item name directly
mdcli auth login --item "My Meu Dinheiro"

Browser Login (Manual)

Opens a browser for you to log in manually:

mdcli auth login --browser

Check Status

mdcli auth status

Shows your authentication status including the method used (Browser session, 1Password, etc.).

Logout

# Remove the stored session
mdcli auth logout# Also clear the saved 1Password item and 2Captcha key
mdcli auth logout --all

Usage

Identifying accounts, categories, and tags

--account, --category, and --tag accept three forms, tried in this order:

  1. Numeric ID — e.g. --account 1167419. Fastest, no network needed.
  2. Alias — a short name you've mapped to an ID via mdcli accounts alias add. Stored locally in ~/.config/mdcli/mdcli.config.json.
  3. Exact name — the entity's real name as shown by mdcli accounts list, matched case-insensitively. Names are looked up via a 30-day on-disk cache and auto-invalidated when a request using a cached ID returns a non-2xx.

Aliases win over names when both match the same string, so your shortcuts always take priority.

# Authenticate (extracts session from Chrome by default)
mdcli auth login
# Or use 1Password
mdcli auth login --item "My Meu Dinheiro"# List accounts
mdcli accounts list --active
# Create an alias for quick access
mdcli accounts alias add --id 1167419 --name mp
# List entries using alias
mdcli entries list --account mp --from 2024-01-01 --to 2024-01-31
# List entries using the account's exact name (case-insensitive)
mdcli entries list --account "Nubank - Conta Corrente" --from 2024-01-01 --to 2024-01-31
# Create an entry
mdcli entries create --account mp --description "Groceries" --value 150 --category food
# Create an entry using the account name instead of an alias
mdcli entries create --account "Mercado Pago" --description "Groceries" --value 150 --category food
# Update an entry (only the fields you pass are changed)
mdcli entries update 12345 --value 200 --category food
# Delete an entry
mdcli entries delete 12345
# List credit cards
mdcli cards list --active
# Show a credit card invoice (defaults to the current/next one)
mdcli cards invoice --account <cardId> --month 2026-02
# Show a credit card invoice using the card's exact name
mdcli cards invoice --account "Itaú Personalité" --month 2026-02
# Show upcoming installments on a card
mdcli cards future --account <cardId># Create a tag (color is optional, defaults to gray)
mdcli tags create --name "Travel" --color "#FF6600"# Update a tag (only the fields you pass are changed)
mdcli tags update 12345 --color "#00AAFF"# Archive (deactivate) or reactivate a tag
mdcli tags update 12345 --inactive
mdcli tags update 12345 --active
# Delete a tag
mdcli tags delete 12345

Features

Auth

FeatureStatus
Browser session extraction (Chrome/Firefox)Done
Browser login (auto-capture)Done
Automatic login (1Password CLI)Done
Auto token refresh on 401Done
Manual token entryDone
Status checkDone
LogoutDone

Accounts

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Categories

FeatureStatus
ListDone
Filter by activeDone
Filter by typeMissing
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Tags

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateDone
UpdateDone
DeleteDone
ArchiveDone

Entries

FeatureStatus
List by accountDone
Filter by date rangeDone
Filter by statusDone
Filter by typeDone
Filter by categoryDone
Filter by tagDone
Filter by keywordsDone
Filter by valueDone
JSON outputDone
Alias support (account/category/tag)Done
Create (single)Done
Create (recurring)Done
UpdateDone
DeleteDone

Cards

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Invoice (by month)Done
Future installmentsDone

About

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

mdcli

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app.

Installation

Requires Bun. mdcli runs TypeScript directly and relies on Bun-only APIs, so it does not run under plain Node.js.

Global

bun install -g github:fm1randa/mdcli

From Source

gh repo clone fm1randa/mdcli
cd mdcli
bun install
bun dev --help

Optional: 1Password CLI

For automatic login when browser session extraction fails, install the 1Password CLI:

# macOS
brew install 1password-cli
# Linux# See https://developer.1password.com/docs/cli/get-started/#install

Create a 1Password item with the following fields:

  • username - your login email
  • password - your password
  • otp - one-time password (configured as TOTP)

Optional: 2Captcha API Key

If the login page shows a reCAPTCHA challenge, you can configure a 2Captcha API key to automatically solve it:

mdcli auth login --captcha-key <your-2captcha-api-key>

The API key is saved to config and reused for future logins.

Authentication

The CLI supports multiple authentication methods:

Browser Session (Default)

If you're already logged into MeuDinheiro in your browser, the CLI can extract your session automatically:

# Extracts session from Chrome (default)
mdcli auth login
# Explicitly use Chrome
mdcli auth login --session chrome
# Use Firefox instead
mdcli auth login --session firefox

If session extraction fails (e.g., not logged in, browser not found), you'll be prompted with fallback options:

  1. Use 1Password for automatic login
  2. Try Firefox session instead
  3. Open browser for manual login
  4. Enter credentials manually
  5. Cancel

1Password (Automatic)

# Use 1Password item (prompts for item name on first run)
mdcli auth login --item
# Specify item name directly
mdcli auth login --item "My Meu Dinheiro"

Browser Login (Manual)

Opens a browser for you to log in manually:

mdcli auth login --browser

Check Status

mdcli auth status

Shows your authentication status including the method used (Browser session, 1Password, etc.).

Logout

# Remove the stored session
mdcli auth logout# Also clear the saved 1Password item and 2Captcha key
mdcli auth logout --all

Usage

Identifying accounts, categories, and tags

--account, --category, and --tag accept three forms, tried in this order:

  1. Numeric ID — e.g. --account 1167419. Fastest, no network needed.
  2. Alias — a short name you've mapped to an ID via mdcli accounts alias add. Stored locally in ~/.config/mdcli/mdcli.config.json.
  3. Exact name — the entity's real name as shown by mdcli accounts list, matched case-insensitively. Names are looked up via a 30-day on-disk cache and auto-invalidated when a request using a cached ID returns a non-2xx.

Aliases win over names when both match the same string, so your shortcuts always take priority.

# Authenticate (extracts session from Chrome by default)
mdcli auth login
# Or use 1Password
mdcli auth login --item "My Meu Dinheiro"# List accounts
mdcli accounts list --active
# Create an alias for quick access
mdcli accounts alias add --id 1167419 --name mp
# List entries using alias
mdcli entries list --account mp --from 2024-01-01 --to 2024-01-31
# List entries using the account's exact name (case-insensitive)
mdcli entries list --account "Nubank - Conta Corrente" --from 2024-01-01 --to 2024-01-31
# Create an entry
mdcli entries create --account mp --description "Groceries" --value 150 --category food
# Create an entry using the account name instead of an alias
mdcli entries create --account "Mercado Pago" --description "Groceries" --value 150 --category food
# Update an entry (only the fields you pass are changed)
mdcli entries update 12345 --value 200 --category food
# Delete an entry
mdcli entries delete 12345
# List credit cards
mdcli cards list --active
# Show a credit card invoice (defaults to the current/next one)
mdcli cards invoice --account <cardId> --month 2026-02
# Show a credit card invoice using the card's exact name
mdcli cards invoice --account "Itaú Personalité" --month 2026-02
# Show upcoming installments on a card
mdcli cards future --account <cardId># Create a tag (color is optional, defaults to gray)
mdcli tags create --name "Travel" --color "#FF6600"# Update a tag (only the fields you pass are changed)
mdcli tags update 12345 --color "#00AAFF"# Archive (deactivate) or reactivate a tag
mdcli tags update 12345 --inactive
mdcli tags update 12345 --active
# Delete a tag
mdcli tags delete 12345

Features

Auth

FeatureStatus
Browser session extraction (Chrome/Firefox)Done
Browser login (auto-capture)Done
Automatic login (1Password CLI)Done
Auto token refresh on 401Done
Manual token entryDone
Status checkDone
LogoutDone

Accounts

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Categories

FeatureStatus
ListDone
Filter by activeDone
Filter by typeMissing
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Tags

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateDone
UpdateDone
DeleteDone
ArchiveDone

Entries

FeatureStatus
List by accountDone
Filter by date rangeDone
Filter by statusDone
Filter by typeDone
Filter by categoryDone
Filter by tagDone
Filter by keywordsDone
Filter by valueDone
JSON outputDone
Alias support (account/category/tag)Done
Create (single)Done
Create (recurring)Done
UpdateDone
DeleteDone

Cards

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Invoice (by month)Done
Future installmentsDone

About

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

mdcli

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app.

Installation

Requires Bun. mdcli runs TypeScript directly and relies on Bun-only APIs, so it does not run under plain Node.js.

Global

bun install -g github:fm1randa/mdcli

From Source

gh repo clone fm1randa/mdcli
cd mdcli
bun install
bun dev --help

Optional: 1Password CLI

For automatic login when browser session extraction fails, install the 1Password CLI:

# macOS
brew install 1password-cli
# Linux# See https://developer.1password.com/docs/cli/get-started/#install

Create a 1Password item with the following fields:

  • username - your login email
  • password - your password
  • otp - one-time password (configured as TOTP)

Optional: 2Captcha API Key

If the login page shows a reCAPTCHA challenge, you can configure a 2Captcha API key to automatically solve it:

mdcli auth login --captcha-key <your-2captcha-api-key>

The API key is saved to config and reused for future logins.

Authentication

The CLI supports multiple authentication methods:

Browser Session (Default)

If you're already logged into MeuDinheiro in your browser, the CLI can extract your session automatically:

# Extracts session from Chrome (default)
mdcli auth login
# Explicitly use Chrome
mdcli auth login --session chrome
# Use Firefox instead
mdcli auth login --session firefox

If session extraction fails (e.g., not logged in, browser not found), you'll be prompted with fallback options:

  1. Use 1Password for automatic login
  2. Try Firefox session instead
  3. Open browser for manual login
  4. Enter credentials manually
  5. Cancel

1Password (Automatic)

# Use 1Password item (prompts for item name on first run)
mdcli auth login --item
# Specify item name directly
mdcli auth login --item "My Meu Dinheiro"

Browser Login (Manual)

Opens a browser for you to log in manually:

mdcli auth login --browser

Check Status

mdcli auth status

Shows your authentication status including the method used (Browser session, 1Password, etc.).

Logout

# Remove the stored session
mdcli auth logout# Also clear the saved 1Password item and 2Captcha key
mdcli auth logout --all

Usage

Identifying accounts, categories, and tags

--account, --category, and --tag accept three forms, tried in this order:

  1. Numeric ID — e.g. --account 1167419. Fastest, no network needed.
  2. Alias — a short name you've mapped to an ID via mdcli accounts alias add. Stored locally in ~/.config/mdcli/mdcli.config.json.
  3. Exact name — the entity's real name as shown by mdcli accounts list, matched case-insensitively. Names are looked up via a 30-day on-disk cache and auto-invalidated when a request using a cached ID returns a non-2xx.

Aliases win over names when both match the same string, so your shortcuts always take priority.

# Authenticate (extracts session from Chrome by default)
mdcli auth login
# Or use 1Password
mdcli auth login --item "My Meu Dinheiro"# List accounts
mdcli accounts list --active
# Create an alias for quick access
mdcli accounts alias add --id 1167419 --name mp
# List entries using alias
mdcli entries list --account mp --from 2024-01-01 --to 2024-01-31
# List entries using the account's exact name (case-insensitive)
mdcli entries list --account "Nubank - Conta Corrente" --from 2024-01-01 --to 2024-01-31
# Create an entry
mdcli entries create --account mp --description "Groceries" --value 150 --category food
# Create an entry using the account name instead of an alias
mdcli entries create --account "Mercado Pago" --description "Groceries" --value 150 --category food
# Update an entry (only the fields you pass are changed)
mdcli entries update 12345 --value 200 --category food
# Delete an entry
mdcli entries delete 12345
# List credit cards
mdcli cards list --active
# Show a credit card invoice (defaults to the current/next one)
mdcli cards invoice --account <cardId> --month 2026-02
# Show a credit card invoice using the card's exact name
mdcli cards invoice --account "Itaú Personalité" --month 2026-02
# Show upcoming installments on a card
mdcli cards future --account <cardId># Create a tag (color is optional, defaults to gray)
mdcli tags create --name "Travel" --color "#FF6600"# Update a tag (only the fields you pass are changed)
mdcli tags update 12345 --color "#00AAFF"# Archive (deactivate) or reactivate a tag
mdcli tags update 12345 --inactive
mdcli tags update 12345 --active
# Delete a tag
mdcli tags delete 12345

Features

Auth

FeatureStatus
Browser session extraction (Chrome/Firefox)Done
Browser login (auto-capture)Done
Automatic login (1Password CLI)Done
Auto token refresh on 401Done
Manual token entryDone
Status checkDone
LogoutDone

Accounts

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Categories

FeatureStatus
ListDone
Filter by activeDone
Filter by typeMissing
JSON outputDone
Aliases (add/list/rm/update)Done
CreateMissing
UpdateMissing
DeleteMissing
ArchiveMissing

Tags

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Aliases (add/list/rm/update)Done
CreateDone
UpdateDone
DeleteDone
ArchiveDone

Entries

FeatureStatus
List by accountDone
Filter by date rangeDone
Filter by statusDone
Filter by typeDone
Filter by categoryDone
Filter by tagDone
Filter by keywordsDone
Filter by valueDone
JSON outputDone
Alias support (account/category/tag)Done
Create (single)Done
Create (recurring)Done
UpdateDone
DeleteDone

Cards

FeatureStatus
ListDone
Filter by activeDone
JSON outputDone
Invoice (by month)Done
Future installmentsDone

About

Unofficial CLI client for Meu Dinheiro - a Brazilian personal finance app

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages