# dev.journalize/journalize

> Agent-native double-entry accounting ledger with x402 micropayments

- name: dev.journalize/journalize
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 75/100 flags: no-repository
- quality: 79/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/dev.journalize%2Fjournalize
- tools: https://api.protogrid.dev/v1/servers/dev.journalize%2Fjournalize/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "journalize": {
      "type": "http",
      "url": "https://journalize.dev/mcp"
    }
  }
}
```


## Trust

- hygiene: 80
- liveness: 98
- freshness: 65
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-96% ~updated-103d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 79/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 71 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- fail `tools.annotations`: no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: submit_directive (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); submit_batch (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); list_directives (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
- pass `tools.token_cost`: about 2,263 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: no tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 11, about 2,263 tokens to load them all
- tool set hash: 948d945d1728839b0dac1bd0f0374b31
- badge: [![protogrid quality](https://protogrid.dev/badge/dev.journalize/journalize.svg)](https://protogrid.dev/servers/dev.journalize/journalize)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Remotes

- https://journalize.dev/mcp (streamable-http, auth none, reachable true, uptime30d 0.95614034)

## Packages

_none_

## Tools (11)

- `export_ledger`: Export the full ledger as literal Beancount text — a portable
    snapshot for fava/bean-report/etc., not the live store. Shares a
    combined free allowance of 2 with get_balance_sheet,
    get_income_statement, and get_trial_balance (the "report tier") — not
    2 free calls for each of those four separately.
- `get_account_balance`: Balance of a single account. Settles at the same fixed price
    whether the account exists or not — an "unknown account" answer is
    still a valid, billable response (no per-error pricing discount). No
    free-trial allowance for this specific tool, unlike list_directives
    (same price, but list_directives has 2 free calls and this doesn't) —
    the free tier applies to browsing (list_directives, list_accounts)
    and the report tier, not per-account lookups.
- `get_balance_sheet`: Full realize() balance sheet — often served from cache. Settles at
    the same fixed price regardless of cache hit/miss. Shares a combined
    free allowance of 2 with export_ledger, get_income_statement, and
    get_trial_balance (the "report tier") — not 2 free calls each.
- `get_income_statement`: Income statement, period-scoped by since/until (ISO date strings,
    both optional — omitted means whole history). Always books full
    history first, then clamps the output to the requested period (never
    filters input dates — see reports.py for why). Shares a combined free
    allowance of 2 with export_ledger, get_balance_sheet, and
    get_trial_balance (the "report tier") — not 2 free calls each.
- `get_trial_balance`: Trial balance, period-scoped same as income statement — same
    underlying compute, priced and audited as its own resource. Shares a
    combined free allowance of 2 with export_ledger, get_balance_sheet,
    and get_income_statement (the "report tier") — not 2 free calls
    each.
- `list_accounts`: List all opened accounts with their currency constraints and
    booking method. No booking pass involved. Your first 2 calls per
    registered key are free (a separate allowance from list_directives'
    and the report tier's — see those tools).
- `list_directives`: List raw directives (optionally filtered by account/date range). No
    booking involved — cheapest paid tool. `since`/`until` are ISO date
    strings (YYYY-MM-DD). Your first 2 calls per registered key are free
    (independent of the write/accounts/report allowances — see
    list_accounts, get_balance_sheet).
- `register`: Generate a new Ed25519 keypair for ledger identity. Returns the
    private key exactly once — it is never stored server-side and cannot
    be recovered if lost. This is a SEPARATE keypair from whatever wallet
    you use to authorize x402 payments (payment auth and ledger identity
    are two independent signing domains — see payments.py).
- `submit_batch`: Submit up to 1000 directives atomically — all persist together or
    none do. Priced 10x a single write, regardless of batch size within
    the cap. Always paid — the free-trial allowance (see
    submit_directive) applies to single writes only, never to batches,
    even if you haven't used any free writes yet. Paid.
- `submit_directive`: Submit one Beancount directive (open, transaction, close, balance,
    price, note, document — any type). Paid, except your first 20
    accepted writes per registered key, which are free (this specific
    tool only — submit_batch is always paid, even for your first call).
    Call with no payment_header first: if free writes remain, this
    succeeds immediately; otherwise you'll get price/asset/recipient
    back, so you can retry with payment_header set to your signed
    X-PAYMENT-equivalent payload (fresh nonce required on the retry —
    each call is independently signed).
- `validate_directive`: Free dry-run: parse+book text against your full history without
    persisting or charging anything. Still requires a valid signature
    (identity/replay protection is not a billing concern).
