{"server":{"name":"dev.journalize/journalize","$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","remotes":[{"url":"https://journalize.dev/mcp","type":"streamable-http"}],"version":"1.0.0","websiteUrl":"https://journalize.dev","description":"Agent-native double-entry accounting ledger with x402 micropayments"},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","isLatest":true,"updatedAt":"2026-07-09T01:48:10.337692Z","publishedAt":"2026-07-09T01:48:10.337692Z","statusChangedAt":"2026-07-09T01:48:10.337692Z"},"dev.protogrid/connectability":{"class":"R0","autonomous":true,"human_steps":[],"preferred":{"kind":"remote","idx":0},"remotes":[{"idx":0,"url":"https://journalize.dev/mcp","transport":"streamable-http","templated":false,"headers":[],"auth":{"type":"none","location":null,"secret_name":null,"oauth":null},"protocol":{"supported_versions":["2025-11-25"],"stateless":false},"health":{"reachable":true,"uptime_30d":0.9557522,"latency_ms_p50":354,"consecutive_failures":0,"last_probe_at":"2026-10-19T22:01:27.622Z","last_ok_at":"2026-10-19T22:01:27.622Z"}}],"packages":[]},"dev.protogrid/tools":[{"name":"export_ledger","title":null,"description":"Export the full ledger as literal Beancount text — a portable\n    snapshot for fava/bean-report/etc., not the live store. Shares a\n    combined free allowance of 2 with get_balance_sheet,\n    get_income_statement, and get_trial_balance (the \"report tier\") — not\n    2 free calls for each of those four separately.","annotations":null,"source":"probe","observed_at":"2026-10-19T22:01:27.622Z"},{"name":"get_account_balance","title":null,"description":"Balance of a single account. Settles at the same fixed price\n    whether the account exists or not — an \"unknown account\" answer is\n    still a valid, billable response (no per-error pricing discount). No\n    free-trial allowance for this specific tool, unlike list_directives\n    (same price, but list_directives has 2 free calls and this doesn't) —\n    the free tier applies to browsing (list_directives, list_accounts)\n    and the report tier, not per-account lookups.","annotations":null,"source":"probe","observed_at":"2026-10-19T22:01:27.622Z"},{"name":"get_balance_sheet","title":null,"description":"Full realize() balance sheet — often served from cache. Settles at\n    the same fixed price regardless of cache hit/miss. Shares a combined\n    free allowance of 2 with export_ledger, get_income_statement, and\n    get_trial_balance (the \"report tier\") — not 2 free calls each.","annotations":null,"source":"probe","observed_at":"2026-10-19T22:01:27.622Z"},{"name":"get_income_statement","title":null,"description":"Income statement, period-scoped by since/until (ISO date strings,\n    both optional — omitted means whole history). Always books full\n    history first, then clamps the output to the requested period (never\n    filters input dates — see reports.py for why). Shares a combined free\n    allowance of 2 with export_ledger, get_balance_sheet, and\n    get_trial_balance (the \"report tier\") — not 2 free calls each.","annotations":null,"source":"probe","observed_at":"2026-10-19T22:01:27.622Z"},{"name":"get_trial_balance","title":null,"description":"Trial balance, period-scoped same as income statement — same\n    underlying compute, priced and audited as its own resource. Shares a\n    combined free allowance of 2 with export_ledger, get_balance_sheet,\n    and get_income_statement (the \"report tier\") — not 2 free calls\n    each.","annotations":null,"source":"probe","observed_at":"2026-10-19T22:01:27.622Z"},{"name":"list_accounts","title":null,"description":"List all opened accounts with their currency constraints and\n    booking method. No booking pass involved. Your first 2 calls per\n    registered key are free (a separate allowance from list_directives'\n    and the report tier's — see those tools).","annotations":null,"source":"probe","observed_at":"2026-10-19T22:01:27.622Z"},{"name":"list_directives","title":null,"description":"List raw directives (optionally filtered by account/date range). No\n    booking involved — cheapest paid tool. `since`/`until` are ISO date\n    strings (YYYY-MM-DD). Your first 2 calls per registered key are free\n    (independent of the write/accounts/report allowances — see\n    list_accounts, get_balance_sheet).","annotations":null,"source":"probe","observed_at":"2026-10-19T22:01:27.622Z"},{"name":"register","title":null,"description":"Generate a new Ed25519 keypair for ledger identity. Returns the\n    private key exactly once — it is never stored server-side and cannot\n    be recovered if lost. This is a SEPARATE keypair from whatever wallet\n    you use to authorize x402 payments (payment auth and ledger identity\n    are two independent signing domains — see payments.py).","annotations":null,"source":"probe","observed_at":"2026-10-19T22:01:27.622Z"},{"name":"submit_batch","title":null,"description":"Submit up to 1000 directives atomically — all persist together or\n    none do. Priced 10x a single write, regardless of batch size within\n    the cap. Always paid — the free-trial allowance (see\n    submit_directive) applies to single writes only, never to batches,\n    even if you haven't used any free writes yet. Paid.","annotations":null,"source":"probe","observed_at":"2026-10-19T22:01:27.622Z"},{"name":"submit_directive","title":null,"description":"Submit one Beancount directive (open, transaction, close, balance,\n    price, note, document — any type). Paid, except your first 20\n    accepted writes per registered key, which are free (this specific\n    tool only — submit_batch is always paid, even for your first call).\n    Call with no payment_header first: if free writes remain, this\n    succeeds immediately; otherwise you'll get price/asset/recipient\n    back, so you can retry with payment_header set to your signed\n    X-PAYMENT-equivalent payload (fresh nonce required on the retry —\n    each call is independently signed).","annotations":null,"source":"probe","observed_at":"2026-10-19T22:01:27.622Z"},{"name":"validate_directive","title":null,"description":"Free dry-run: parse+book text against your full history without\n    persisting or charging anything. Still requires a valid signature\n    (identity/replay protection is not a billing concern).","annotations":null,"source":"probe","observed_at":"2026-10-19T22:01:27.622Z"}],"dev.protogrid/trust":{"score":75,"components":{"hygiene":80,"liveness":98,"freshness":65,"provenance":55},"drivers":["+dns-namespace","+website","+reachable","+uptime-96%","~updated-103d-ago","-no-repository"],"flags":["no-repository"],"blocked":false,"computed_at":"2026-10-20T00:08:06.187Z","disclaimer":"Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed."},"dev.protogrid/quality":{"score":79,"label":"good","components":{"auth":null,"hygiene":71,"protocol":75,"stability":100,"dependencies":null},"checks":[{"id":"protocol.modern","detail":"newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28","status":"warn","category":"protocol"},{"id":"protocol.stateless","detail":"only applies to 2026-07-28 servers","status":"na","category":"protocol"},{"id":"protocol.transport","detail":"streamable HTTP","status":"pass","category":"protocol"},{"id":"protocol.list_ttl","detail":"only applies to 2026-07-28 servers","status":"na","category":"protocol"},{"id":"auth.prm","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.as_metadata","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.cimd","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.secret_in_url","detail":"no templated URL","status":"na","category":"auth"},{"id":"tools.descriptions","detail":"every tool has a description","status":"pass","category":"hygiene"},{"id":"tools.description_length","detail":"descriptions are concise","status":"pass","category":"hygiene"},{"id":"tools.schemas","detail":"every tool has an object input schema","status":"pass","category":"hygiene"},{"id":"tools.annotations","detail":"no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones","status":"fail","category":"hygiene"},{"id":"tools.directory_hints","detail":"no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: submit_batch (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); get_account_balance (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); list_accounts (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …","status":"fail","category":"hygiene"},{"id":"tools.token_cost","detail":"about 2,263 tokens to load every tool","status":"pass","category":"hygiene"},{"id":"tools.api_dump","detail":"tools are not a one-to-one API dump","status":"pass","category":"hygiene"},{"id":"stability.changes","detail":"no tool changes in 30 days","status":"pass","category":"stability"},{"id":"stability.rug_pull","detail":"no tool changed its meaning under the same name","status":"pass","category":"stability"},{"id":"deps.known_vulns","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.mcp_sdk_version","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.resolvable","detail":"no npm or PyPI package","status":"na","category":"dependencies"}],"drivers":["-tools.annotations","-tools.directory_hints","~protocol.modern"],"flags":[],"tool_count":11,"token_estimate":2263,"tools_hash":"948d945d1728839b0dac1bd0f0374b31","tools_changed_at":null,"computed_at":"2026-10-20T00:22:39.443Z","disclaimer":"Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed."},"dev.protogrid/identity":{"canonical_id":"dev.journalize/journalize","aliases":[],"alias_count":0,"repository_key":null,"owner":{"verified":false,"method":null,"since":null}}},"next_actions":[{"action":"list_tools","description":"Every current tool with input schemas","href":"/v1/servers/dev.journalize%2Fjournalize/tools","arguments":{"name":"dev.journalize/journalize"}},{"action":"get_connection","description":"Minimal connection block for the preferred remote or package","href":"/v1/servers/dev.journalize%2Fjournalize/connection?target=mcpServers","arguments":{"name":"dev.journalize/journalize","target":"mcpServers"}},{"action":"search","description":"Find other servers by intent","href":"/v1/search?q={query}","arguments":{"q":"{query}"}}]}