{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_u98cfwhh4vdw","handle":"zeno","url":"https://wellknown.network/agents/zeno","links":{"self":"https://wellknown.network/agents/zeno/record.json","html":"https://wellknown.network/agents/zeno","markdown":"https://wellknown.network/agents/zeno/record.md","api":"https://wellknown.network/api/v1/agents/zeno","status":"https://wellknown.network/api/v1/agents/zeno/status","claim":"https://wellknown.network/agents/zeno/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/zeno/claim.json","badge":"https://wellknown.network/agents/zeno/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/zeno/history","tools":"https://wellknown.network/api/v1/agents/zeno/tools"},"ard":{"identifier":"urn:air:app.zeno-works.ch:server:zeno","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Zeno","summary":"AI bookkeeper for Swiss small companies: books invoices, reconciles the bank, keeps VAT current.","description":"AI bookkeeper for Swiss small companies: books invoices, reconciles the bank, keeps VAT current.","publisher":{"name":"ch.zeno-works","url":null},"homepage":"https://zeno-works.ch","repository":null,"version":"0.1.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://app.zeno-works.ch/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-10-11T18:36:40.726121Z","publishedAt":"2026-10-11T18:36:40.726121Z","registryName":"ch.zeno-works/zeno"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"documents.invoice-processing","name":"Invoice Processing","confidence":1,"provenance":"derived"},{"slug":"productivity.crm","name":"CRM & Sales","confidence":1,"provenance":"derived"},{"slug":"finance.accounting","name":"Accounting","confidence":1,"provenance":"derived"},{"slug":"finance.banking","name":"Banking","confidence":1,"provenance":"derived"},{"slug":"analytics.reporting","name":"Reporting & Dashboards","confidence":0.977,"provenance":"derived"},{"slug":"dev.ci-cd","name":"CI/CD & Deploy","confidence":0.962,"provenance":"derived"},{"slug":"productivity.hr","name":"HR & Recruiting","confidence":0.554,"provenance":"derived"},{"slug":"documents.contracts","name":"Contracts & Legal","confidence":0.525,"provenance":"derived"}],"categories":["analytics","dev","documents","finance","productivity"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 2h ago.","lastOkAt":"2026-10-23T21:25:07.372Z","lastProbedAt":"2026-10-23T21:25:07.372Z","statusComputedAt":"2026-10-23T21:27:56.937Z","reliability30d":{"probes":44,"successRate":1,"p50Ms":26,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":44,"ok":44,"authBoundaryOk":0,"serviceOk":44,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-10-23T21:25:07.372Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":35,"error":null,"detail":{"tools":[{"name":"find_operations","description":"Search EVERY operation this server offers, including the ones not in your tool list.\n\nThe tool list you can see holds only the common operations. Several hundre"},{"name":"describe_operations","description":"Get the full argument schema for operations found via ``find_operations``.\n\nReturns each operation's description and JSON-Schema arguments — everything\na listed"},{"name":"call_operation","description":"Run any operation by name — the ones in your tool list and the unlisted ones alike.\n\n``name`` is an operation name from ``find_operations``; ``arguments`` is th"},{"name":"request_api_key","description":"Ask the user to hand this session a Zeno API key. **Use this first** — every\ncurrent Zeno user already has an account.\n\n`email` is the address on their Zeno acc"},{"name":"start_signup","description":"Create a Zeno account for somebody who does not have one yet.\n\nUse `request_api_key` first if they might already have an account — this tool\ncannot tell you, an"},{"name":"collect_api_key","description":"Collect the key once the user has approved.\n\n`status` is one of:\n\n- `pending` — nobody has approved yet, or (with `throttled: true`) we were\n  rate-limited and "},{"name":"whoami","description":"Which user this request acts as, and which company's books it is bound to (jwt or API key).\n\nZeno serves every tenant from one host, and an API key is opaque — "},{"name":"list_companies","description":"List companies (jwt, scoped). Non-admins see only their member companies."},{"name":"get_company","description":"Get one company (jwt, scoped). 403 for a non-member non-admin, 404 if absent."},{"name":"global_search","description":"Full-text search across emails + items, ranked by ``ts_rank_cd``, scoped (A1).\n\n``archive_status`` constrains item results only (the Documents → Archive page\npa"},{"name":"get_kpi_report","description":"Snapshot KPIs + 13-week liquidity forecast, from the GL (CompanyMember).\n\nCash/liability balances aggregate the FY window of posted/reversed journal lines;\nagin"},{"name":"get_work_list","description":"Everything waiting for this user in this company, most severe first."},{"name":"list_autopost_decisions","description":"Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.\n\nShows what the autonomy policy posted (``posted``), would have posted in\n``assist`"},{"name":"accept_autopost_decision","description":"One-click accept of a **held** decision (accountant) — posts the AI's proposal.\n\nA person's accept in the app replaces the soft guardrails (confidence, amount c"},{"name":"upload_intake","description":"Upload ANY file and let the system decide what it is (the unified intake\nqueue — the same door as \"Documents → Upload\" in the web app).\n``file_base64`` is the f"},{"name":"upload_document","description":"Upload an INVOICE or RECEIPT (PDF, image, or .zip of them) for analysis.\n``file_base64`` is the file's raw bytes, base64-encoded. ``direction`` is\n``payable`` ("},{"name":"get_intake","description":"Get one intake row by id (scoped to its company: 404/403 split)."},{"name":"list_items","description":"List/filter items, scoped to the caller's member companies (A1).\n\nOptional ``period`` (``YYYY-MM``) filters by the item's effective date\n(invoice date, falling "},{"name":"get_item","description":"Item metadata (any source)."},{"name":"gl_trial_balance","description":"Per-account debit/credit columns for one fiscal year, with totals.\n\n``fiscal_year`` (year label) defaults to the latest year posted in; ``period_id``\nnarrows to"},{"name":"gl_profit_and_loss","description":"Revenue − expense → net result, for one fiscal year.\n\n**Window** — same rules as the trial balance: ``fiscal_year`` defaults to the latest\nposted year, ``period"},{"name":"gl_balance_sheet","description":"Assets vs liabilities + equity for one fiscal year, signed by natural side.\n\nWindow rules as the trial balance (``fiscal_year`` defaults to the latest posted\nye"},{"name":"list_gl_accounts","description":"List the postable chart (CompanyMember). ``fiscal_year`` filters to one year's chart\n(the chart is FY-scoped, so codes repeat across years)."},{"name":"get_gl_account_ledger","description":"One account's ledger (Kontoauszug) — every booking that touched it, in date\norder, with Soll/Haben and the running balance after each line (CompanyMember).\n\nNo "},{"name":"list_gl_periods","description":"The company's **accounting periods** — the months a journal entry may post into\n(CompanyMember read).\n\nA period belongs to one fiscal year and carries ``period_"},{"name":"list_gl_open_items","description":"One page of the AR/AP subledger (member read).\n\n``direction`` filters server-side (ZCT-577) — omit it for both. The screen used to\nfilter the fetched page in th"},{"name":"list_gl_journal_entries","description":"List journal entries.\n\n``period_ids`` narrows to specific fiscal periods, and is how a caller asks for\n**one fiscal year** — the year's period ids (ZET-285). Wi"},{"name":"get_gl_journal_entry","description":"One entry + lines, plus the subledger rows it produced/touched (Gap B detail\nsurfacing): its ``gl_vat_posting`` rows, its ``gl_vat_zero_posting`` turnover-only\n"},{"name":"create_gl_journal_entry","description":"Create a **draft** journal entry by hand — accountant. It carries NO source document\nunless you name one.\n\nOnly the pipeline paths stamp ``source_ref_type``/``s"},{"name":"post_gl_journal_entry","description":"Post a draft entry into the books — accountant. One-way.\n\nA posted entry can no longer be replaced or discarded (both refuse with 409); the only\ngeneral correct"},{"name":"reverse_gl_journal_entry","description":"**Storno** a posted journal entry: post its mirror image (accountant role).\n\nNothing is deleted; the original stays, linked both ways, and the **reversal** entr"},{"name":"list_bank_accounts","description":"The company's bank accounts — the ``bank_account_id`` every statement import,\nbank-entry list and reconciliation call needs (CompanyMember read).\n\nOldest first,"},{"name":"list_bank_entries","description":"List Bank Entries"},{"name":"get_bank_entry","description":"Get Bank Entry"},{"name":"entry_candidates","description":"Entry Candidates"},{"name":"settle_entry","description":"Post this reconciled bank entry into the GL (clean-bank settlement).\n\nMatched → Dr Bank / Cr AR; unmatched → Dr Bank / Cr Suspense; a previously-suspensed\nentry"},{"name":"reconciliation_summary","description":"Reconciliation summary banner.\n\nOptional ``from``/``to`` scope the **per-entry bank-entry counts** (total /\nmatched / missing-invoice / …) to a ``booking_date``"},{"name":"list_ar_invoices","description":"List authored AR invoices, newest first.\n\nOptional ``status`` / ``doc_type`` filter by lifecycle + document kind.\nOptional ``period`` (``YYYY-MM``) filters by t"},{"name":"get_ar_invoice","description":"One authored outgoing invoice with its lines (CompanyMember read).\n\nCarries the header (customer, dates, currency, discounts), every line with its\ncomputed ``ne"},{"name":"create_ar_invoice","description":"Create an outgoing (sales) invoice as a **draft** — nothing is booked yet\n(accountant role).\n\nA draft changes no ledger balance, gets no invoice number and appe"},{"name":"issue_ar_invoice","description":"Issue a draft — **this is the booking step** (accountant role).\n\nIn one transaction it assigns the next invoice number, posts the journal entry\n(debit the AR co"},{"name":"list_counterparties","description":"List a company's counterparties (filter by ``kind``/``q``, paginated).\n\n``kind`` repeats to filter on a set (``?kind=customer&kind=both``) — a\nrole-shaped picke"},{"name":"list_gl_vat_periods","description":"List Gl Vat Periods"},{"name":"list_payroll_runs","description":"The company's payroll runs — one per wage period — newest period first\n(CompanyMember read; the money is aggregate, no per-employee PII).\n\nA run walks ``draft``"},{"name":"list_payroll_employees","description":"Every employee on the payroll master data, with today's contract (accountant\nrole — this payload is personal data, so it is not a plain member read).\n\nOne row p"},{"name":"get_financial_statements","description":"Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).\n\nAggregates every posted GL journal line whose **posting date** falls in the f"},{"name":"customer_statement","description":"One customer's open items + totals (the aging row's drill-down).\n\n``as_of`` mirrors ``GET …/ar/aging`` — set, it reconstructs the items open at\nthat date so the"},{"name":"get_bank_status","description":"Composed bank snapshot — \"is my banking up to date?\" (CompanyMember). \"Reconciled\" means\nentries matched, NOT ledger = statement balance (the close check\n``BANK"},{"name":"zeno_info","description":"What this server is, which MCP revision it speaks, and how to get a credential.\n\n**Needs no credential.** Call it first if a tool has just refused you: the\n`aut"},{"name":"zeno_overview","description":"What Zeno does, in one page — the platform's capabilities and its limits.\n\n**Needs no credential.** Read this before telling a user that Zeno cannot do\nsomethin"},{"name":"onboarding_guide","description":"How to onboard and create a NEW company: what to ask the user for, which\ndocuments to request, and the order to run the setup in.\n\nDiscovery does not depend on "}],"toolCount":51,"toolsHash":"c11f029b8b23f15d241a3ef5b686e40a16b6d304c75a62b4ad81032166e44e1f","serverName":"zeno","capabilities":["experimental","logging","tools","extensions"],"serverVersion":"0.1.0+e37236f17","protocolVersion":"2025-06-18"}},{"at":"2026-10-23T14:27:03.549Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":19,"error":null,"detail":{"tools":[{"name":"find_operations","description":"Search EVERY operation this server offers, including the ones not in your tool list.\n\nThe tool list you can see holds only the common operations. Several hundre"},{"name":"describe_operations","description":"Get the full argument schema for operations found via ``find_operations``.\n\nReturns each operation's description and JSON-Schema arguments — everything\na listed"},{"name":"call_operation","description":"Run any operation by name — the ones in your tool list and the unlisted ones alike.\n\n``name`` is an operation name from ``find_operations``; ``arguments`` is th"},{"name":"request_api_key","description":"Ask the user to hand this session a Zeno API key. **Use this first** — every\ncurrent Zeno user already has an account.\n\n`email` is the address on their Zeno acc"},{"name":"start_signup","description":"Create a Zeno account for somebody who does not have one yet.\n\nUse `request_api_key` first if they might already have an account — this tool\ncannot tell you, an"},{"name":"collect_api_key","description":"Collect the key once the user has approved.\n\n`status` is one of:\n\n- `pending` — nobody has approved yet, or (with `throttled: true`) we were\n  rate-limited and "},{"name":"whoami","description":"Which user this request acts as, and which company's books it is bound to (jwt or API key).\n\nZeno serves every tenant from one host, and an API key is opaque — "},{"name":"list_companies","description":"List companies (jwt, scoped). Non-admins see only their member companies."},{"name":"get_company","description":"Get one company (jwt, scoped). 403 for a non-member non-admin, 404 if absent."},{"name":"global_search","description":"Full-text search across emails + items, ranked by ``ts_rank_cd``, scoped (A1).\n\n``archive_status`` constrains item results only (the Documents → Archive page\npa"},{"name":"get_kpi_report","description":"Snapshot KPIs + 13-week liquidity forecast, from the GL (CompanyMember).\n\nCash/liability balances aggregate the FY window of posted/reversed journal lines;\nagin"},{"name":"get_work_list","description":"Everything waiting for this user in this company, most severe first."},{"name":"list_autopost_decisions","description":"Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.\n\nShows what the autonomy policy posted (``posted``), would have posted in\n``assist`"},{"name":"accept_autopost_decision","description":"One-click accept of a **held** decision (accountant) — posts the AI's proposal.\n\nA person's accept in the app replaces the soft guardrails (confidence, amount c"},{"name":"upload_intake","description":"Upload ANY file and let the system decide what it is (the unified intake\nqueue — the same door as \"Documents → Upload\" in the web app).\n``file_base64`` is the f"},{"name":"upload_document","description":"Upload an INVOICE or RECEIPT (PDF, image, or .zip of them) for analysis.\n``file_base64`` is the file's raw bytes, base64-encoded. ``direction`` is\n``payable`` ("},{"name":"get_intake","description":"Get one intake row by id (scoped to its company: 404/403 split)."},{"name":"list_items","description":"List/filter items, scoped to the caller's member companies (A1).\n\nOptional ``period`` (``YYYY-MM``) filters by the item's effective date\n(invoice date, falling "},{"name":"get_item","description":"Item metadata (any source)."},{"name":"gl_trial_balance","description":"Per-account debit/credit columns for one fiscal year, with totals.\n\n``fiscal_year`` (year label) defaults to the latest year posted in; ``period_id``\nnarrows to"},{"name":"gl_profit_and_loss","description":"Revenue − expense → net result, for one fiscal year.\n\n**Window** — same rules as the trial balance: ``fiscal_year`` defaults to the latest\nposted year, ``period"},{"name":"gl_balance_sheet","description":"Assets vs liabilities + equity for one fiscal year, signed by natural side.\n\nWindow rules as the trial balance (``fiscal_year`` defaults to the latest posted\nye"},{"name":"list_gl_accounts","description":"List the postable chart (CompanyMember). ``fiscal_year`` filters to one year's chart\n(the chart is FY-scoped, so codes repeat across years)."},{"name":"get_gl_account_ledger","description":"One account's ledger (Kontoauszug) — every booking that touched it, in date\norder, with Soll/Haben and the running balance after each line (CompanyMember).\n\nNo "},{"name":"list_gl_periods","description":"The company's **accounting periods** — the months a journal entry may post into\n(CompanyMember read).\n\nA period belongs to one fiscal year and carries ``period_"},{"name":"list_gl_open_items","description":"One page of the AR/AP subledger (member read).\n\n``direction`` filters server-side (ZCT-577) — omit it for both. The screen used to\nfilter the fetched page in th"},{"name":"list_gl_journal_entries","description":"List journal entries.\n\n``period_ids`` narrows to specific fiscal periods, and is how a caller asks for\n**one fiscal year** — the year's period ids (ZET-285). Wi"},{"name":"get_gl_journal_entry","description":"One entry + lines, plus the subledger rows it produced/touched (Gap B detail\nsurfacing): its ``gl_vat_posting`` rows, its ``gl_vat_zero_posting`` turnover-only\n"},{"name":"create_gl_journal_entry","description":"Create a **draft** journal entry by hand — accountant. It carries NO source document\nunless you name one.\n\nOnly the pipeline paths stamp ``source_ref_type``/``s"},{"name":"post_gl_journal_entry","description":"Post a draft entry into the books — accountant. One-way.\n\nA posted entry can no longer be replaced or discarded (both refuse with 409); the only\ngeneral correct"},{"name":"reverse_gl_journal_entry","description":"**Storno** a posted journal entry: post its mirror image (accountant role).\n\nNothing is deleted; the original stays, linked both ways, and the **reversal** entr"},{"name":"list_bank_accounts","description":"The company's bank accounts — the ``bank_account_id`` every statement import,\nbank-entry list and reconciliation call needs (CompanyMember read).\n\nOldest first,"},{"name":"list_bank_entries","description":"List Bank Entries"},{"name":"get_bank_entry","description":"Get Bank Entry"},{"name":"entry_candidates","description":"Entry Candidates"},{"name":"settle_entry","description":"Post this reconciled bank entry into the GL (clean-bank settlement).\n\nMatched → Dr Bank / Cr AR; unmatched → Dr Bank / Cr Suspense; a previously-suspensed\nentry"},{"name":"reconciliation_summary","description":"Reconciliation summary banner.\n\nOptional ``from``/``to`` scope the **per-entry bank-entry counts** (total /\nmatched / missing-invoice / …) to a ``booking_date``"},{"name":"list_ar_invoices","description":"List authored AR invoices, newest first.\n\nOptional ``status`` / ``doc_type`` filter by lifecycle + document kind.\nOptional ``period`` (``YYYY-MM``) filters by t"},{"name":"get_ar_invoice","description":"One authored outgoing invoice with its lines (CompanyMember read).\n\nCarries the header (customer, dates, currency, discounts), every line with its\ncomputed ``ne"},{"name":"create_ar_invoice","description":"Create an outgoing (sales) invoice as a **draft** — nothing is booked yet\n(accountant role).\n\nA draft changes no ledger balance, gets no invoice number and appe"},{"name":"issue_ar_invoice","description":"Issue a draft — **this is the booking step** (accountant role).\n\nIn one transaction it assigns the next invoice number, posts the journal entry\n(debit the AR co"},{"name":"list_counterparties","description":"List a company's counterparties (filter by ``kind``/``q``, paginated).\n\n``kind`` repeats to filter on a set (``?kind=customer&kind=both``) — a\nrole-shaped picke"},{"name":"list_gl_vat_periods","description":"List Gl Vat Periods"},{"name":"list_payroll_runs","description":"The company's payroll runs — one per wage period — newest period first\n(CompanyMember read; the money is aggregate, no per-employee PII).\n\nA run walks ``draft``"},{"name":"list_payroll_employees","description":"Every employee on the payroll master data, with today's contract (accountant\nrole — this payload is personal data, so it is not a plain member read).\n\nOne row p"},{"name":"get_financial_statements","description":"Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).\n\nAggregates every posted GL journal line whose **posting date** falls in the f"},{"name":"customer_statement","description":"One customer's open items + totals (the aging row's drill-down).\n\n``as_of`` mirrors ``GET …/ar/aging`` — set, it reconstructs the items open at\nthat date so the"},{"name":"get_bank_status","description":"Composed bank snapshot — \"is my banking up to date?\" (CompanyMember). \"Reconciled\" means\nentries matched, NOT ledger = statement balance (the close check\n``BANK"},{"name":"zeno_info","description":"What this server is, which MCP revision it speaks, and how to get a credential.\n\n**Needs no credential.** Call it first if a tool has just refused you: the\n`aut"},{"name":"zeno_overview","description":"What Zeno does, in one page — the platform's capabilities and its limits.\n\n**Needs no credential.** Read this before telling a user that Zeno cannot do\nsomethin"},{"name":"onboarding_guide","description":"How to onboard and create a NEW company: what to ask the user for, which\ndocuments to request, and the order to run the setup in.\n\nDiscovery does not depend on "}],"toolCount":51,"toolsHash":"c11f029b8b23f15d241a3ef5b686e40a16b6d304c75a62b4ad81032166e44e1f","serverName":"zeno","capabilities":["experimental","logging","tools","extensions"],"serverVersion":"0.1.0+e37236f17","protocolVersion":"2025-06-18"}},{"at":"2026-10-23T07:26:09.097Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":31,"error":null,"detail":{"tools":[{"name":"find_operations","description":"Search EVERY operation this server offers, including the ones not in your tool list.\n\nThe tool list you can see holds only the common operations. Several hundre"},{"name":"describe_operations","description":"Get the full argument schema for operations found via ``find_operations``.\n\nReturns each operation's description and JSON-Schema arguments — everything\na listed"},{"name":"call_operation","description":"Run any operation by name — the ones in your tool list and the unlisted ones alike.\n\n``name`` is an operation name from ``find_operations``; ``arguments`` is th"},{"name":"request_api_key","description":"Ask the user to hand this session a Zeno API key. **Use this first** — every\ncurrent Zeno user already has an account.\n\n`email` is the address on their Zeno acc"},{"name":"start_signup","description":"Create a Zeno account for somebody who does not have one yet.\n\nUse `request_api_key` first if they might already have an account — this tool\ncannot tell you, an"},{"name":"collect_api_key","description":"Collect the key once the user has approved.\n\n`status` is one of:\n\n- `pending` — nobody has approved yet, or (with `throttled: true`) we were\n  rate-limited and "},{"name":"whoami","description":"Which user this request acts as, and which company's books it is bound to (jwt or API key).\n\nZeno serves every tenant from one host, and an API key is opaque — "},{"name":"list_companies","description":"List companies (jwt, scoped). Non-admins see only their member companies."},{"name":"get_company","description":"Get one company (jwt, scoped). 403 for a non-member non-admin, 404 if absent."},{"name":"global_search","description":"Full-text search across emails + items, ranked by ``ts_rank_cd``, scoped (A1).\n\n``archive_status`` constrains item results only (the Documents → Archive page\npa"},{"name":"get_kpi_report","description":"Snapshot KPIs + 13-week liquidity forecast, from the GL (CompanyMember).\n\nCash/liability balances aggregate the FY window of posted/reversed journal lines;\nagin"},{"name":"get_work_list","description":"Everything waiting for this user in this company, most severe first."},{"name":"list_autopost_decisions","description":"Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.\n\nShows what the autonomy policy posted (``posted``), would have posted in\n``assist`"},{"name":"accept_autopost_decision","description":"One-click accept of a **held** decision (accountant) — posts the AI's proposal.\n\nA person's accept in the app replaces the soft guardrails (confidence, amount c"},{"name":"upload_intake","description":"Upload ANY file and let the system decide what it is (the unified intake\nqueue — the same door as \"Documents → Upload\" in the web app).\n``file_base64`` is the f"},{"name":"upload_document","description":"Upload an INVOICE or RECEIPT (PDF, image, or .zip of them) for analysis.\n``file_base64`` is the file's raw bytes, base64-encoded. ``direction`` is\n``payable`` ("},{"name":"get_intake","description":"Get one intake row by id (scoped to its company: 404/403 split)."},{"name":"list_items","description":"List/filter items, scoped to the caller's member companies (A1).\n\nOptional ``period`` (``YYYY-MM``) filters by the item's effective date\n(invoice date, falling "},{"name":"get_item","description":"Item metadata (any source)."},{"name":"gl_trial_balance","description":"Per-account debit/credit columns for one fiscal year, with totals.\n\n``fiscal_year`` (year label) defaults to the latest year posted in; ``period_id``\nnarrows to"},{"name":"gl_profit_and_loss","description":"Revenue − expense → net result, for one fiscal year.\n\n**Window** — same rules as the trial balance: ``fiscal_year`` defaults to the latest\nposted year, ``period"},{"name":"gl_balance_sheet","description":"Assets vs liabilities + equity for one fiscal year, signed by natural side.\n\nWindow rules as the trial balance (``fiscal_year`` defaults to the latest posted\nye"},{"name":"list_gl_accounts","description":"List the postable chart (CompanyMember). ``fiscal_year`` filters to one year's chart\n(the chart is FY-scoped, so codes repeat across years)."},{"name":"get_gl_account_ledger","description":"One account's ledger (Kontoauszug) — every booking that touched it, in date\norder, with Soll/Haben and the running balance after each line (CompanyMember).\n\nNo "},{"name":"list_gl_periods","description":"The company's **accounting periods** — the months a journal entry may post into\n(CompanyMember read).\n\nA period belongs to one fiscal year and carries ``period_"},{"name":"list_gl_open_items","description":"One page of the AR/AP subledger (member read).\n\n``direction`` filters server-side (ZCT-577) — omit it for both. The screen used to\nfilter the fetched page in th"},{"name":"list_gl_journal_entries","description":"List journal entries.\n\n``period_ids`` narrows to specific fiscal periods, and is how a caller asks for\n**one fiscal year** — the year's period ids (ZET-285). Wi"},{"name":"get_gl_journal_entry","description":"One entry + lines, plus the subledger rows it produced/touched (Gap B detail\nsurfacing): its ``gl_vat_posting`` rows, its ``gl_vat_zero_posting`` turnover-only\n"},{"name":"create_gl_journal_entry","description":"Create a **draft** journal entry by hand — accountant. It carries NO source document\nunless you name one.\n\nOnly the pipeline paths stamp ``source_ref_type``/``s"},{"name":"post_gl_journal_entry","description":"Post a draft entry into the books — accountant. One-way.\n\nA posted entry can no longer be replaced or discarded (both refuse with 409); the only\ngeneral correct"},{"name":"reverse_gl_journal_entry","description":"**Storno** a posted journal entry: post its mirror image (accountant role).\n\nNothing is deleted; the original stays, linked both ways, and the **reversal** entr"},{"name":"list_bank_accounts","description":"The company's bank accounts — the ``bank_account_id`` every statement import,\nbank-entry list and reconciliation call needs (CompanyMember read).\n\nOldest first,"},{"name":"list_bank_entries","description":"List Bank Entries"},{"name":"get_bank_entry","description":"Get Bank Entry"},{"name":"entry_candidates","description":"Entry Candidates"},{"name":"settle_entry","description":"Post this reconciled bank entry into the GL (clean-bank settlement).\n\nMatched → Dr Bank / Cr AR; unmatched → Dr Bank / Cr Suspense; a previously-suspensed\nentry"},{"name":"reconciliation_summary","description":"Reconciliation summary banner.\n\nOptional ``from``/``to`` scope the **per-entry bank-entry counts** (total /\nmatched / missing-invoice / …) to a ``booking_date``"},{"name":"list_ar_invoices","description":"List authored AR invoices, newest first.\n\nOptional ``status`` / ``doc_type`` filter by lifecycle + document kind.\nOptional ``period`` (``YYYY-MM``) filters by t"},{"name":"get_ar_invoice","description":"One authored outgoing invoice with its lines (CompanyMember read).\n\nCarries the header (customer, dates, currency, discounts), every line with its\ncomputed ``ne"},{"name":"create_ar_invoice","description":"Create an outgoing (sales) invoice as a **draft** — nothing is booked yet\n(accountant role).\n\nA draft changes no ledger balance, gets no invoice number and appe"},{"name":"issue_ar_invoice","description":"Issue a draft — **this is the booking step** (accountant role).\n\nIn one transaction it assigns the next invoice number, posts the journal entry\n(debit the AR co"},{"name":"list_counterparties","description":"List a company's counterparties (filter by ``kind``/``q``, paginated).\n\n``kind`` repeats to filter on a set (``?kind=customer&kind=both``) — a\nrole-shaped picke"},{"name":"list_gl_vat_periods","description":"List Gl Vat Periods"},{"name":"list_payroll_runs","description":"The company's payroll runs — one per wage period — newest period first\n(CompanyMember read; the money is aggregate, no per-employee PII).\n\nA run walks ``draft``"},{"name":"list_payroll_employees","description":"Every employee on the payroll master data, with today's contract (accountant\nrole — this payload is personal data, so it is not a plain member read).\n\nOne row p"},{"name":"get_financial_statements","description":"Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).\n\nAggregates every posted GL journal line whose **posting date** falls in the f"},{"name":"customer_statement","description":"One customer's open items + totals (the aging row's drill-down).\n\n``as_of`` mirrors ``GET …/ar/aging`` — set, it reconstructs the items open at\nthat date so the"},{"name":"get_bank_status","description":"Composed bank snapshot — \"is my banking up to date?\" (CompanyMember). \"Reconciled\" means\nentries matched, NOT ledger = statement balance (the close check\n``BANK"},{"name":"zeno_info","description":"What this server is, which MCP revision it speaks, and how to get a credential.\n\n**Needs no credential.** Call it first if a tool has just refused you: the\n`aut"},{"name":"zeno_overview","description":"What Zeno does, in one page — the platform's capabilities and its limits.\n\n**Needs no credential.** Read this before telling a user that Zeno cannot do\nsomethin"},{"name":"onboarding_guide","description":"How to onboard and create a NEW company: what to ask the user for, which\ndocuments to request, and the order to run the setup in.\n\nDiscovery does not depend on "}],"toolCount":51,"toolsHash":"c11f029b8b23f15d241a3ef5b686e40a16b6d304c75a62b4ad81032166e44e1f","serverName":"zeno","capabilities":["experimental","logging","tools","extensions"],"serverVersion":"0.1.0+e37236f17","protocolVersion":"2025-06-18"}},{"at":"2026-10-23T00:31:01.777Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":23,"error":null,"detail":{"tools":[{"name":"find_operations","description":"Search EVERY operation this server offers, including the ones not in your tool list.\n\nThe tool list you can see holds only the common operations. Several hundre"},{"name":"describe_operations","description":"Get the full argument schema for operations found via ``find_operations``.\n\nReturns each operation's description and JSON-Schema arguments — everything\na listed"},{"name":"call_operation","description":"Run any operation by name — the ones in your tool list and the unlisted ones alike.\n\n``name`` is an operation name from ``find_operations``; ``arguments`` is th"},{"name":"request_api_key","description":"Ask the user to hand this session a Zeno API key. **Use this first** — every\ncurrent Zeno user already has an account.\n\n`email` is the address on their Zeno acc"},{"name":"start_signup","description":"Create a Zeno account for somebody who does not have one yet.\n\nUse `request_api_key` first if they might already have an account — this tool\ncannot tell you, an"},{"name":"collect_api_key","description":"Collect the key once the user has approved.\n\n`status` is one of:\n\n- `pending` — nobody has approved yet, or (with `throttled: true`) we were\n  rate-limited and "},{"name":"whoami","description":"Which user this request acts as, and which company's books it is bound to (jwt or API key).\n\nZeno serves every tenant from one host, and an API key is opaque — "},{"name":"list_companies","description":"List companies (jwt, scoped). Non-admins see only their member companies."},{"name":"get_company","description":"Get one company (jwt, scoped). 403 for a non-member non-admin, 404 if absent."},{"name":"global_search","description":"Full-text search across emails + items, ranked by ``ts_rank_cd``, scoped (A1).\n\n``archive_status`` constrains item results only (the Documents → Archive page\npa"},{"name":"get_kpi_report","description":"Snapshot KPIs + 13-week liquidity forecast, from the GL (CompanyMember).\n\nCash/liability balances aggregate the FY window of posted/reversed journal lines;\nagin"},{"name":"get_work_list","description":"Everything waiting for this user in this company, most severe first."},{"name":"list_autopost_decisions","description":"Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.\n\nShows what the autonomy policy posted (``posted``), would have posted in\n``assist`"},{"name":"accept_autopost_decision","description":"One-click accept of a **held** decision (accountant) — posts the AI's proposal.\n\nA person's accept in the app replaces the soft guardrails (confidence, amount c"},{"name":"upload_intake","description":"Upload ANY file and let the system decide what it is (the unified intake\nqueue — the same door as \"Documents → Upload\" in the web app).\n``file_base64`` is the f"},{"name":"upload_document","description":"Upload an INVOICE or RECEIPT (PDF, image, or .zip of them) for analysis.\n``file_base64`` is the file's raw bytes, base64-encoded. ``direction`` is\n``payable`` ("},{"name":"get_intake","description":"Get one intake row by id (scoped to its company: 404/403 split)."},{"name":"list_items","description":"List/filter items, scoped to the caller's member companies (A1).\n\nOptional ``period`` (``YYYY-MM``) filters by the item's effective date\n(invoice date, falling "},{"name":"get_item","description":"Item metadata (any source)."},{"name":"gl_trial_balance","description":"Per-account debit/credit columns for one fiscal year, with totals.\n\n``fiscal_year`` (year label) defaults to the latest year posted in; ``period_id``\nnarrows to"},{"name":"gl_profit_and_loss","description":"Revenue − expense → net result, for one fiscal year.\n\n**Window** — same rules as the trial balance: ``fiscal_year`` defaults to the latest\nposted year, ``period"},{"name":"gl_balance_sheet","description":"Assets vs liabilities + equity for one fiscal year, signed by natural side.\n\nWindow rules as the trial balance (``fiscal_year`` defaults to the latest posted\nye"},{"name":"list_gl_accounts","description":"List the postable chart (CompanyMember). ``fiscal_year`` filters to one year's chart\n(the chart is FY-scoped, so codes repeat across years)."},{"name":"get_gl_account_ledger","description":"One account's ledger (Kontoauszug) — every booking that touched it, in date\norder, with Soll/Haben and the running balance after each line (CompanyMember).\n\nNo "},{"name":"list_gl_periods","description":"The company's **accounting periods** — the months a journal entry may post into\n(CompanyMember read).\n\nA period belongs to one fiscal year and carries ``period_"},{"name":"list_gl_open_items","description":"One page of the AR/AP subledger (member read).\n\n``direction`` filters server-side (ZCT-577) — omit it for both. The screen used to\nfilter the fetched page in th"},{"name":"list_gl_journal_entries","description":"List journal entries.\n\n``period_ids`` narrows to specific fiscal periods, and is how a caller asks for\n**one fiscal year** — the year's period ids (ZET-285). Wi"},{"name":"get_gl_journal_entry","description":"One entry + lines, plus the subledger rows it produced/touched (Gap B detail\nsurfacing): its ``gl_vat_posting`` rows, its ``gl_vat_zero_posting`` turnover-only\n"},{"name":"create_gl_journal_entry","description":"Create a **draft** journal entry by hand — accountant. It carries NO source document\nunless you name one.\n\nOnly the pipeline paths stamp ``source_ref_type``/``s"},{"name":"post_gl_journal_entry","description":"Post a draft entry into the books — accountant. One-way.\n\nA posted entry can no longer be replaced or discarded (both refuse with 409); the only\ngeneral correct"},{"name":"reverse_gl_journal_entry","description":"**Storno** a posted journal entry: post its mirror image (accountant role).\n\nNothing is deleted; the original stays, linked both ways, and the **reversal** entr"},{"name":"list_bank_accounts","description":"The company's bank accounts — the ``bank_account_id`` every statement import,\nbank-entry list and reconciliation call needs (CompanyMember read).\n\nOldest first,"},{"name":"list_bank_entries","description":"List Bank Entries"},{"name":"get_bank_entry","description":"Get Bank Entry"},{"name":"entry_candidates","description":"Entry Candidates"},{"name":"settle_entry","description":"Post this reconciled bank entry into the GL (clean-bank settlement).\n\nMatched → Dr Bank / Cr AR; unmatched → Dr Bank / Cr Suspense; a previously-suspensed\nentry"},{"name":"reconciliation_summary","description":"Reconciliation summary banner.\n\nOptional ``from``/``to`` scope the **per-entry bank-entry counts** (total /\nmatched / missing-invoice / …) to a ``booking_date``"},{"name":"list_ar_invoices","description":"List authored AR invoices, newest first.\n\nOptional ``status`` / ``doc_type`` filter by lifecycle + document kind.\nOptional ``period`` (``YYYY-MM``) filters by t"},{"name":"get_ar_invoice","description":"One authored outgoing invoice with its lines (CompanyMember read).\n\nCarries the header (customer, dates, currency, discounts), every line with its\ncomputed ``ne"},{"name":"create_ar_invoice","description":"Create an outgoing (sales) invoice as a **draft** — nothing is booked yet\n(accountant role).\n\nA draft changes no ledger balance, gets no invoice number and appe"},{"name":"issue_ar_invoice","description":"Issue a draft — **this is the booking step** (accountant role).\n\nIn one transaction it assigns the next invoice number, posts the journal entry\n(debit the AR co"},{"name":"list_counterparties","description":"List a company's counterparties (filter by ``kind``/``q``, paginated).\n\n``kind`` repeats to filter on a set (``?kind=customer&kind=both``) — a\nrole-shaped picke"},{"name":"list_gl_vat_periods","description":"List Gl Vat Periods"},{"name":"list_payroll_runs","description":"The company's payroll runs — one per wage period — newest period first\n(CompanyMember read; the money is aggregate, no per-employee PII).\n\nA run walks ``draft``"},{"name":"list_payroll_employees","description":"Every employee on the payroll master data, with today's contract (accountant\nrole — this payload is personal data, so it is not a plain member read).\n\nOne row p"},{"name":"get_financial_statements","description":"Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).\n\nAggregates every posted GL journal line whose **posting date** falls in the f"},{"name":"customer_statement","description":"One customer's open items + totals (the aging row's drill-down).\n\n``as_of`` mirrors ``GET …/ar/aging`` — set, it reconstructs the items open at\nthat date so the"},{"name":"get_bank_status","description":"Composed bank snapshot — \"is my banking up to date?\" (CompanyMember). \"Reconciled\" means\nentries matched, NOT ledger = statement balance (the close check\n``BANK"},{"name":"zeno_info","description":"What this server is, which MCP revision it speaks, and how to get a credential.\n\n**Needs no credential.** Call it first if a tool has just refused you: the\n`aut"},{"name":"zeno_overview","description":"What Zeno does, in one page — the platform's capabilities and its limits.\n\n**Needs no credential.** Read this before telling a user that Zeno cannot do\nsomethin"},{"name":"onboarding_guide","description":"How to onboard and create a NEW company: what to ask the user for, which\ndocuments to request, and the order to run the setup in.\n\nDiscovery does not depend on "}],"toolCount":51,"toolsHash":"c11f029b8b23f15d241a3ef5b686e40a16b6d304c75a62b4ad81032166e44e1f","serverName":"zeno","capabilities":["experimental","logging","tools","extensions"],"serverVersion":"0.1.0+e37236f17","protocolVersion":"2025-06-18"}},{"at":"2026-10-22T17:30:27.831Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":24,"error":null,"detail":{"tools":[{"name":"find_operations","description":"Search EVERY operation this server offers, including the ones not in your tool list.\n\nThe tool list you can see holds only the common operations. Several hundre"},{"name":"describe_operations","description":"Get the full argument schema for operations found via ``find_operations``.\n\nReturns each operation's description and JSON-Schema arguments — everything\na listed"},{"name":"call_operation","description":"Run any operation by name — the ones in your tool list and the unlisted ones alike.\n\n``name`` is an operation name from ``find_operations``; ``arguments`` is th"},{"name":"request_api_key","description":"Ask the user to hand this session a Zeno API key. **Use this first** — every\ncurrent Zeno user already has an account.\n\n`email` is the address on their Zeno acc"},{"name":"start_signup","description":"Create a Zeno account for somebody who does not have one yet.\n\nUse `request_api_key` first if they might already have an account — this tool\ncannot tell you, an"},{"name":"collect_api_key","description":"Collect the key once the user has approved.\n\n`status` is one of:\n\n- `pending` — nobody has approved yet, or (with `throttled: true`) we were\n  rate-limited and "},{"name":"whoami","description":"Which user this request acts as, and which company's books it is bound to (jwt or API key).\n\nZeno serves every tenant from one host, and an API key is opaque — "},{"name":"list_companies","description":"List companies (jwt, scoped). Non-admins see only their member companies."},{"name":"get_company","description":"Get one company (jwt, scoped). 403 for a non-member non-admin, 404 if absent."},{"name":"global_search","description":"Full-text search across emails + items, ranked by ``ts_rank_cd``, scoped (A1).\n\n``archive_status`` constrains item results only (the Documents → Archive page\npa"},{"name":"get_kpi_report","description":"Snapshot KPIs + 13-week liquidity forecast, from the GL (CompanyMember).\n\nCash/liability balances aggregate the FY window of posted/reversed journal lines;\nagin"},{"name":"get_work_list","description":"Everything waiting for this user in this company, most severe first."},{"name":"list_autopost_decisions","description":"Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.\n\nShows what the autonomy policy posted (``posted``), would have posted in\n``assist`"},{"name":"accept_autopost_decision","description":"One-click accept of a **held** decision (accountant) — posts the AI's proposal.\n\nA person's accept in the app replaces the soft guardrails (confidence, amount c"},{"name":"upload_intake","description":"Upload ANY file and let the system decide what it is (the unified intake\nqueue — the same door as \"Documents → Upload\" in the web app).\n``file_base64`` is the f"},{"name":"upload_document","description":"Upload an INVOICE or RECEIPT (PDF, image, or .zip of them) for analysis.\n``file_base64`` is the file's raw bytes, base64-encoded. ``direction`` is\n``payable`` ("},{"name":"get_intake","description":"Get one intake row by id (scoped to its company: 404/403 split)."},{"name":"list_items","description":"List/filter items, scoped to the caller's member companies (A1).\n\nOptional ``period`` (``YYYY-MM``) filters by the item's effective date\n(invoice date, falling "},{"name":"get_item","description":"Item metadata (any source)."},{"name":"gl_trial_balance","description":"Per-account debit/credit columns for one fiscal year, with totals.\n\n``fiscal_year`` (year label) defaults to the latest year posted in; ``period_id``\nnarrows to"},{"name":"gl_profit_and_loss","description":"Revenue − expense → net result, for one fiscal year.\n\n**Window** — same rules as the trial balance: ``fiscal_year`` defaults to the latest\nposted year, ``period"},{"name":"gl_balance_sheet","description":"Assets vs liabilities + equity for one fiscal year, signed by natural side.\n\nWindow rules as the trial balance (``fiscal_year`` defaults to the latest posted\nye"},{"name":"list_gl_accounts","description":"List the postable chart (CompanyMember). ``fiscal_year`` filters to one year's chart\n(the chart is FY-scoped, so codes repeat across years)."},{"name":"get_gl_account_ledger","description":"One account's ledger (Kontoauszug) — every booking that touched it, in date\norder, with Soll/Haben and the running balance after each line (CompanyMember).\n\nNo "},{"name":"list_gl_periods","description":"The company's **accounting periods** — the months a journal entry may post into\n(CompanyMember read).\n\nA period belongs to one fiscal year and carries ``period_"},{"name":"list_gl_open_items","description":"One page of the AR/AP subledger (member read).\n\n``direction`` filters server-side (ZCT-577) — omit it for both. The screen used to\nfilter the fetched page in th"},{"name":"list_gl_journal_entries","description":"List journal entries.\n\n``period_ids`` narrows to specific fiscal periods, and is how a caller asks for\n**one fiscal year** — the year's period ids (ZET-285). Wi"},{"name":"get_gl_journal_entry","description":"One entry + lines, plus the subledger rows it produced/touched (Gap B detail\nsurfacing): its ``gl_vat_posting`` rows, its ``gl_vat_zero_posting`` turnover-only\n"},{"name":"create_gl_journal_entry","description":"Create a **draft** journal entry by hand — accountant. It carries NO source document\nunless you name one.\n\nOnly the pipeline paths stamp ``source_ref_type``/``s"},{"name":"post_gl_journal_entry","description":"Post a draft entry into the books — accountant. One-way.\n\nA posted entry can no longer be replaced or discarded (both refuse with 409); the only\ngeneral correct"},{"name":"reverse_gl_journal_entry","description":"**Storno** a posted journal entry: post its mirror image (accountant role).\n\nNothing is deleted; the original stays, linked both ways, and the **reversal** entr"},{"name":"list_bank_accounts","description":"The company's bank accounts — the ``bank_account_id`` every statement import,\nbank-entry list and reconciliation call needs (CompanyMember read).\n\nOldest first,"},{"name":"list_bank_entries","description":"List Bank Entries"},{"name":"get_bank_entry","description":"Get Bank Entry"},{"name":"entry_candidates","description":"Entry Candidates"},{"name":"settle_entry","description":"Post this reconciled bank entry into the GL (clean-bank settlement).\n\nMatched → Dr Bank / Cr AR; unmatched → Dr Bank / Cr Suspense; a previously-suspensed\nentry"},{"name":"reconciliation_summary","description":"Reconciliation summary banner.\n\nOptional ``from``/``to`` scope the **per-entry bank-entry counts** (total /\nmatched / missing-invoice / …) to a ``booking_date``"},{"name":"list_ar_invoices","description":"List authored AR invoices, newest first.\n\nOptional ``status`` / ``doc_type`` filter by lifecycle + document kind.\nOptional ``period`` (``YYYY-MM``) filters by t"},{"name":"get_ar_invoice","description":"One authored outgoing invoice with its lines (CompanyMember read).\n\nCarries the header (customer, dates, currency, discounts), every line with its\ncomputed ``ne"},{"name":"create_ar_invoice","description":"Create an outgoing (sales) invoice as a **draft** — nothing is booked yet\n(accountant role).\n\nA draft changes no ledger balance, gets no invoice number and appe"},{"name":"issue_ar_invoice","description":"Issue a draft — **this is the booking step** (accountant role).\n\nIn one transaction it assigns the next invoice number, posts the journal entry\n(debit the AR co"},{"name":"list_counterparties","description":"List a company's counterparties (filter by ``kind``/``q``, paginated).\n\n``kind`` repeats to filter on a set (``?kind=customer&kind=both``) — a\nrole-shaped picke"},{"name":"list_gl_vat_periods","description":"List Gl Vat Periods"},{"name":"list_payroll_runs","description":"The company's payroll runs — one per wage period — newest period first\n(CompanyMember read; the money is aggregate, no per-employee PII).\n\nA run walks ``draft``"},{"name":"list_payroll_employees","description":"Every employee on the payroll master data, with today's contract (accountant\nrole — this payload is personal data, so it is not a plain member read).\n\nOne row p"},{"name":"get_financial_statements","description":"Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).\n\nAggregates every posted GL journal line whose **posting date** falls in the f"},{"name":"customer_statement","description":"One customer's open items + totals (the aging row's drill-down).\n\n``as_of`` mirrors ``GET …/ar/aging`` — set, it reconstructs the items open at\nthat date so the"},{"name":"get_bank_status","description":"Composed bank snapshot — \"is my banking up to date?\" (CompanyMember). \"Reconciled\" means\nentries matched, NOT ledger = statement balance (the close check\n``BANK"},{"name":"zeno_info","description":"What this server is, which MCP revision it speaks, and how to get a credential.\n\n**Needs no credential.** Call it first if a tool has just refused you: the\n`aut"},{"name":"zeno_overview","description":"What Zeno does, in one page — the platform's capabilities and its limits.\n\n**Needs no credential.** Read this before telling a user that Zeno cannot do\nsomethin"},{"name":"onboarding_guide","description":"How to onboard and create a NEW company: what to ask the user for, which\ndocuments to request, and the order to run the setup in.\n\nDiscovery does not depend on "}],"toolCount":51,"toolsHash":"c11f029b8b23f15d241a3ef5b686e40a16b6d304c75a62b4ad81032166e44e1f","serverName":"zeno","capabilities":["experimental","logging","tools","extensions"],"serverVersion":"0.1.0+e37236f17","protocolVersion":"2025-06-18"}},{"at":"2026-10-22T10:35:19.337Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":28,"error":null,"detail":{"tools":[{"name":"find_operations","description":"Search EVERY operation this server offers, including the ones not in your tool list.\n\nThe tool list you can see holds only the common operations. Several hundre"},{"name":"describe_operations","description":"Get the full argument schema for operations found via ``find_operations``.\n\nReturns each operation's description and JSON-Schema arguments — everything\na listed"},{"name":"call_operation","description":"Run any operation by name — the ones in your tool list and the unlisted ones alike.\n\n``name`` is an operation name from ``find_operations``; ``arguments`` is th"},{"name":"request_api_key","description":"Ask the user to hand this session a Zeno API key. **Use this first** — every\ncurrent Zeno user already has an account.\n\n`email` is the address on their Zeno acc"},{"name":"start_signup","description":"Create a Zeno account for somebody who does not have one yet.\n\nUse `request_api_key` first if they might already have an account — this tool\ncannot tell you, an"},{"name":"collect_api_key","description":"Collect the key once the user has approved.\n\n`status` is one of:\n\n- `pending` — nobody has approved yet, or (with `throttled: true`) we were\n  rate-limited and "},{"name":"whoami","description":"Which user this request acts as, and which company's books it is bound to (jwt or API key).\n\nZeno serves every tenant from one host, and an API key is opaque — "},{"name":"list_companies","description":"List companies (jwt, scoped). Non-admins see only their member companies."},{"name":"get_company","description":"Get one company (jwt, scoped). 403 for a non-member non-admin, 404 if absent."},{"name":"global_search","description":"Full-text search across emails + items, ranked by ``ts_rank_cd``, scoped (A1).\n\n``archive_status`` constrains item results only (the Documents → Archive page\npa"},{"name":"get_kpi_report","description":"Snapshot KPIs + 13-week liquidity forecast, from the GL (CompanyMember).\n\nCash/liability balances aggregate the FY window of posted/reversed journal lines;\nagin"},{"name":"get_work_list","description":"Everything waiting for this user in this company, most severe first."},{"name":"list_autopost_decisions","description":"Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.\n\nShows what the autonomy policy posted (``posted``), would have posted in\n``assist`"},{"name":"accept_autopost_decision","description":"One-click accept of a **held** decision (accountant) — posts the AI's proposal.\n\nA person's accept in the app replaces the soft guardrails (confidence, amount c"},{"name":"upload_intake","description":"Upload ANY file and let the system decide what it is (the unified intake\nqueue — the same door as \"Documents → Upload\" in the web app).\n``file_base64`` is the f"},{"name":"upload_document","description":"Upload an INVOICE or RECEIPT (PDF, image, or .zip of them) for analysis.\n``file_base64`` is the file's raw bytes, base64-encoded. ``direction`` is\n``payable`` ("},{"name":"get_intake","description":"Get one intake row by id (scoped to its company: 404/403 split)."},{"name":"list_items","description":"List/filter items, scoped to the caller's member companies (A1).\n\nOptional ``period`` (``YYYY-MM``) filters by the item's effective date\n(invoice date, falling "},{"name":"get_item","description":"Item metadata (any source)."},{"name":"gl_trial_balance","description":"Per-account debit/credit columns for one fiscal year, with totals.\n\n``fiscal_year`` (year label) defaults to the latest year posted in; ``period_id``\nnarrows to"},{"name":"gl_profit_and_loss","description":"Revenue − expense → net result, for one fiscal year.\n\n**Window** — same rules as the trial balance: ``fiscal_year`` defaults to the latest\nposted year, ``period"},{"name":"gl_balance_sheet","description":"Assets vs liabilities + equity for one fiscal year, signed by natural side.\n\nWindow rules as the trial balance (``fiscal_year`` defaults to the latest posted\nye"},{"name":"list_gl_accounts","description":"List the postable chart (CompanyMember). ``fiscal_year`` filters to one year's chart\n(the chart is FY-scoped, so codes repeat across years)."},{"name":"get_gl_account_ledger","description":"One account's ledger (Kontoauszug) — every booking that touched it, in date\norder, with Soll/Haben and the running balance after each line (CompanyMember).\n\nNo "},{"name":"list_gl_periods","description":"The company's **accounting periods** — the months a journal entry may post into\n(CompanyMember read).\n\nA period belongs to one fiscal year and carries ``period_"},{"name":"list_gl_open_items","description":"One page of the AR/AP subledger (member read).\n\n``direction`` filters server-side (ZCT-577) — omit it for both. The screen used to\nfilter the fetched page in th"},{"name":"list_gl_journal_entries","description":"List journal entries.\n\n``period_ids`` narrows to specific fiscal periods, and is how a caller asks for\n**one fiscal year** — the year's period ids (ZET-285). Wi"},{"name":"get_gl_journal_entry","description":"One entry + lines, plus the subledger rows it produced/touched (Gap B detail\nsurfacing): its ``gl_vat_posting`` rows, its ``gl_vat_zero_posting`` turnover-only\n"},{"name":"create_gl_journal_entry","description":"Create a **draft** journal entry by hand — accountant. It carries NO source document\nunless you name one.\n\nOnly the pipeline paths stamp ``source_ref_type``/``s"},{"name":"post_gl_journal_entry","description":"Post a draft entry into the books — accountant. One-way.\n\nA posted entry can no longer be replaced or discarded (both refuse with 409); the only\ngeneral correct"},{"name":"reverse_gl_journal_entry","description":"**Storno** a posted journal entry: post its mirror image (accountant role).\n\nNothing is deleted; the original stays, linked both ways, and the **reversal** entr"},{"name":"list_bank_accounts","description":"The company's bank accounts — the ``bank_account_id`` every statement import,\nbank-entry list and reconciliation call needs (CompanyMember read).\n\nOldest first,"},{"name":"list_bank_entries","description":"List Bank Entries"},{"name":"get_bank_entry","description":"Get Bank Entry"},{"name":"entry_candidates","description":"Entry Candidates"},{"name":"settle_entry","description":"Post this reconciled bank entry into the GL (clean-bank settlement).\n\nMatched → Dr Bank / Cr AR; unmatched → Dr Bank / Cr Suspense; a previously-suspensed\nentry"},{"name":"reconciliation_summary","description":"Reconciliation summary banner.\n\nOptional ``from``/``to`` scope the **per-entry bank-entry counts** (total /\nmatched / missing-invoice / …) to a ``booking_date``"},{"name":"list_ar_invoices","description":"List authored AR invoices, newest first.\n\nOptional ``status`` / ``doc_type`` filter by lifecycle + document kind.\nOptional ``period`` (``YYYY-MM``) filters by t"},{"name":"get_ar_invoice","description":"One authored outgoing invoice with its lines (CompanyMember read).\n\nCarries the header (customer, dates, currency, discounts), every line with its\ncomputed ``ne"},{"name":"create_ar_invoice","description":"Create an outgoing (sales) invoice as a **draft** — nothing is booked yet\n(accountant role).\n\nA draft changes no ledger balance, gets no invoice number and appe"},{"name":"issue_ar_invoice","description":"Issue a draft — **this is the booking step** (accountant role).\n\nIn one transaction it assigns the next invoice number, posts the journal entry\n(debit the AR co"},{"name":"list_counterparties","description":"List a company's counterparties (filter by ``kind``/``q``, paginated).\n\n``kind`` repeats to filter on a set (``?kind=customer&kind=both``) — a\nrole-shaped picke"},{"name":"list_gl_vat_periods","description":"List Gl Vat Periods"},{"name":"list_payroll_runs","description":"The company's payroll runs — one per wage period — newest period first\n(CompanyMember read; the money is aggregate, no per-employee PII).\n\nA run walks ``draft``"},{"name":"list_payroll_employees","description":"Every employee on the payroll master data, with today's contract (accountant\nrole — this payload is personal data, so it is not a plain member read).\n\nOne row p"},{"name":"get_financial_statements","description":"Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).\n\nAggregates every posted GL journal line whose **posting date** falls in the f"},{"name":"customer_statement","description":"One customer's open items + totals (the aging row's drill-down).\n\n``as_of`` mirrors ``GET …/ar/aging`` — set, it reconstructs the items open at\nthat date so the"},{"name":"get_bank_status","description":"Composed bank snapshot — \"is my banking up to date?\" (CompanyMember). \"Reconciled\" means\nentries matched, NOT ledger = statement balance (the close check\n``BANK"},{"name":"zeno_info","description":"What this server is, which MCP revision it speaks, and how to get a credential.\n\n**Needs no credential.** Call it first if a tool has just refused you: the\n`aut"},{"name":"zeno_overview","description":"What Zeno does, in one page — the platform's capabilities and its limits.\n\n**Needs no credential.** Read this before telling a user that Zeno cannot do\nsomethin"},{"name":"onboarding_guide","description":"How to onboard and create a NEW company: what to ask the user for, which\ndocuments to request, and the order to run the setup in.\n\nDiscovery does not depend on "}],"toolCount":51,"toolsHash":"c11f029b8b23f15d241a3ef5b686e40a16b6d304c75a62b4ad81032166e44e1f","serverName":"zeno","capabilities":["experimental","logging","tools","extensions"],"serverVersion":"0.1.0+e37236f17","protocolVersion":"2025-06-18"}},{"at":"2026-10-22T04:27:40.194Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":22,"error":null,"detail":{"tools":[{"name":"find_operations","description":"Search EVERY operation this server offers, including the ones not in your tool list.\n\nThe tool list you can see holds only the common operations. Several hundre"},{"name":"describe_operations","description":"Get the full argument schema for operations found via ``find_operations``.\n\nReturns each operation's description and JSON-Schema arguments — everything\na listed"},{"name":"call_operation","description":"Run any operation by name — the ones in your tool list and the unlisted ones alike.\n\n``name`` is an operation name from ``find_operations``; ``arguments`` is th"},{"name":"request_api_key","description":"Ask the user to hand this session a Zeno API key. **Use this first** — every\ncurrent Zeno user already has an account.\n\n`email` is the address on their Zeno acc"},{"name":"start_signup","description":"Create a Zeno account for somebody who does not have one yet.\n\nUse `request_api_key` first if they might already have an account — this tool\ncannot tell you, an"},{"name":"collect_api_key","description":"Collect the key once the user has approved.\n\n`status` is one of:\n\n- `pending` — nobody has approved yet, or (with `throttled: true`) we were\n  rate-limited and "},{"name":"whoami","description":"Which user this request acts as, and which company's books it is bound to (jwt or API key).\n\nZeno serves every tenant from one host, and an API key is opaque — "},{"name":"list_companies","description":"List companies (jwt, scoped). Non-admins see only their member companies."},{"name":"get_company","description":"Get one company (jwt, scoped). 403 for a non-member non-admin, 404 if absent."},{"name":"global_search","description":"Full-text search across emails + items, ranked by ``ts_rank_cd``, scoped (A1).\n\n``archive_status`` constrains item results only (the Documents → Archive page\npa"},{"name":"get_kpi_report","description":"Snapshot KPIs + 13-week liquidity forecast, from the GL (CompanyMember).\n\nCash/liability balances aggregate the FY window of posted/reversed journal lines;\nagin"},{"name":"get_work_list","description":"Everything waiting for this user in this company, most severe first."},{"name":"list_autopost_decisions","description":"Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.\n\nShows what the autonomy policy posted (``posted``), would have posted in\n``assist`"},{"name":"accept_autopost_decision","description":"One-click accept of a **held** decision (accountant) — posts the AI's proposal.\n\nA person's accept in the app replaces the soft guardrails (confidence, amount c"},{"name":"upload_intake","description":"Upload ANY file and let the system decide what it is (the unified intake\nqueue — the same door as \"Documents → Upload\" in the web app).\n``file_base64`` is the f"},{"name":"upload_document","description":"Upload an INVOICE or RECEIPT (PDF, image, or .zip of them) for analysis.\n``file_base64`` is the file's raw bytes, base64-encoded. ``direction`` is\n``payable`` ("},{"name":"get_intake","description":"Get one intake row by id (scoped to its company: 404/403 split)."},{"name":"list_items","description":"List/filter items, scoped to the caller's member companies (A1).\n\nOptional ``period`` (``YYYY-MM``) filters by the item's effective date\n(invoice date, falling "},{"name":"get_item","description":"Item metadata (any source)."},{"name":"gl_trial_balance","description":"Per-account debit/credit columns for one fiscal year, with totals.\n\n``fiscal_year`` (year label) defaults to the latest year posted in; ``period_id``\nnarrows to"},{"name":"gl_profit_and_loss","description":"Revenue − expense → net result, for one fiscal year.\n\n**Window** — same rules as the trial balance: ``fiscal_year`` defaults to the latest\nposted year, ``period"},{"name":"gl_balance_sheet","description":"Assets vs liabilities + equity for one fiscal year, signed by natural side.\n\nWindow rules as the trial balance (``fiscal_year`` defaults to the latest posted\nye"},{"name":"list_gl_accounts","description":"List the postable chart (CompanyMember). ``fiscal_year`` filters to one year's chart\n(the chart is FY-scoped, so codes repeat across years)."},{"name":"get_gl_account_ledger","description":"One account's ledger (Kontoauszug) — every booking that touched it, in date\norder, with Soll/Haben and the running balance after each line (CompanyMember).\n\nNo "},{"name":"list_gl_periods","description":"The company's **accounting periods** — the months a journal entry may post into\n(CompanyMember read).\n\nA period belongs to one fiscal year and carries ``period_"},{"name":"list_gl_open_items","description":"One page of the AR/AP subledger (member read).\n\n``direction`` filters server-side (ZCT-577) — omit it for both. The screen used to\nfilter the fetched page in th"},{"name":"list_gl_journal_entries","description":"List journal entries.\n\n``period_ids`` narrows to specific fiscal periods, and is how a caller asks for\n**one fiscal year** — the year's period ids (ZET-285). Wi"},{"name":"get_gl_journal_entry","description":"One entry + lines, plus the subledger rows it produced/touched (Gap B detail\nsurfacing): its ``gl_vat_posting`` rows, its ``gl_vat_zero_posting`` turnover-only\n"},{"name":"create_gl_journal_entry","description":"Create a **draft** journal entry by hand — accountant. It carries NO source document\nunless you name one.\n\nOnly the pipeline paths stamp ``source_ref_type``/``s"},{"name":"post_gl_journal_entry","description":"Post a draft entry into the books — accountant. One-way.\n\nA posted entry can no longer be replaced or discarded (both refuse with 409); the only\ngeneral correct"},{"name":"reverse_gl_journal_entry","description":"**Storno** a posted journal entry: post its mirror image (accountant role).\n\nNothing is deleted; the original stays, linked both ways, and the **reversal** entr"},{"name":"list_bank_accounts","description":"The company's bank accounts — the ``bank_account_id`` every statement import,\nbank-entry list and reconciliation call needs (CompanyMember read).\n\nOldest first,"},{"name":"list_bank_entries","description":"List Bank Entries"},{"name":"get_bank_entry","description":"Get Bank Entry"},{"name":"entry_candidates","description":"Entry Candidates"},{"name":"settle_entry","description":"Post this reconciled bank entry into the GL (clean-bank settlement).\n\nMatched → Dr Bank / Cr AR; unmatched → Dr Bank / Cr Suspense; a previously-suspensed\nentry"},{"name":"reconciliation_summary","description":"Reconciliation summary banner.\n\nOptional ``from``/``to`` scope the **per-entry bank-entry counts** (total /\nmatched / missing-invoice / …) to a ``booking_date``"},{"name":"list_ar_invoices","description":"List authored AR invoices, newest first.\n\nOptional ``status`` / ``doc_type`` filter by lifecycle + document kind.\nOptional ``period`` (``YYYY-MM``) filters by t"},{"name":"get_ar_invoice","description":"One authored outgoing invoice with its lines (CompanyMember read).\n\nCarries the header (customer, dates, currency, discounts), every line with its\ncomputed ``ne"},{"name":"create_ar_invoice","description":"Create an outgoing (sales) invoice as a **draft** — nothing is booked yet\n(accountant role).\n\nA draft changes no ledger balance, gets no invoice number and appe"},{"name":"issue_ar_invoice","description":"Issue a draft — **this is the booking step** (accountant role).\n\nIn one transaction it assigns the next invoice number, posts the journal entry\n(debit the AR co"},{"name":"list_counterparties","description":"List a company's counterparties (filter by ``kind``/``q``, paginated).\n\n``kind`` repeats to filter on a set (``?kind=customer&kind=both``) — a\nrole-shaped picke"},{"name":"list_gl_vat_periods","description":"List Gl Vat Periods"},{"name":"list_payroll_runs","description":"The company's payroll runs — one per wage period — newest period first\n(CompanyMember read; the money is aggregate, no per-employee PII).\n\nA run walks ``draft``"},{"name":"list_payroll_employees","description":"Every employee on the payroll master data, with today's contract (accountant\nrole — this payload is personal data, so it is not a plain member read).\n\nOne row p"},{"name":"get_financial_statements","description":"Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).\n\nAggregates every posted GL journal line whose **posting date** falls in the f"},{"name":"customer_statement","description":"One customer's open items + totals (the aging row's drill-down).\n\n``as_of`` mirrors ``GET …/ar/aging`` — set, it reconstructs the items open at\nthat date so the"},{"name":"get_bank_status","description":"Composed bank snapshot — \"is my banking up to date?\" (CompanyMember). \"Reconciled\" means\nentries matched, NOT ledger = statement balance (the close check\n``BANK"},{"name":"zeno_info","description":"What this server is, which MCP revision it speaks, and how to get a credential.\n\n**Needs no credential.** Call it first if a tool has just refused you: the\n`aut"},{"name":"zeno_overview","description":"What Zeno does, in one page — the platform's capabilities and its limits.\n\n**Needs no credential.** Read this before telling a user that Zeno cannot do\nsomethin"},{"name":"onboarding_guide","description":"How to onboard and create a NEW company: what to ask the user for, which\ndocuments to request, and the order to run the setup in.\n\nDiscovery does not depend on "}],"toolCount":51,"toolsHash":"c11f029b8b23f15d241a3ef5b686e40a16b6d304c75a62b4ad81032166e44e1f","serverName":"zeno","capabilities":["experimental","logging","tools","extensions"],"serverVersion":"0.1.0+e37236f17","protocolVersion":"2025-06-18"}},{"at":"2026-10-21T21:33:16.461Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":27,"error":null,"detail":{"tools":[{"name":"find_operations","description":"Search EVERY operation this server offers, including the ones not in your tool list.\n\nThe tool list you can see holds only the common operations. Several hundre"},{"name":"describe_operations","description":"Get the full argument schema for operations found via ``find_operations``.\n\nReturns each operation's description and JSON-Schema arguments — everything\na listed"},{"name":"call_operation","description":"Run any operation by name — the ones in your tool list and the unlisted ones alike.\n\n``name`` is an operation name from ``find_operations``; ``arguments`` is th"},{"name":"request_api_key","description":"Ask the user to hand this session a Zeno API key. **Use this first** — every\ncurrent Zeno user already has an account.\n\n`email` is the address on their Zeno acc"},{"name":"start_signup","description":"Create a Zeno account for somebody who does not have one yet.\n\nUse `request_api_key` first if they might already have an account — this tool\ncannot tell you, an"},{"name":"collect_api_key","description":"Collect the key once the user has approved.\n\n`status` is one of:\n\n- `pending` — nobody has approved yet, or (with `throttled: true`) we were\n  rate-limited and "},{"name":"whoami","description":"Which user this request acts as, and which company's books it is bound to (jwt or API key).\n\nZeno serves every tenant from one host, and an API key is opaque — "},{"name":"list_companies","description":"List companies (jwt, scoped). Non-admins see only their member companies."},{"name":"get_company","description":"Get one company (jwt, scoped). 403 for a non-member non-admin, 404 if absent."},{"name":"global_search","description":"Full-text search across emails + items, ranked by ``ts_rank_cd``, scoped (A1).\n\n``archive_status`` constrains item results only (the Documents → Archive page\npa"},{"name":"get_kpi_report","description":"Snapshot KPIs + 13-week liquidity forecast, from the GL (CompanyMember).\n\nCash/liability balances aggregate the FY window of posted/reversed journal lines;\nagin"},{"name":"get_work_list","description":"Everything waiting for this user in this company, most severe first."},{"name":"list_autopost_decisions","description":"Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.\n\nShows what the autonomy policy posted (``posted``), would have posted in\n``assist`"},{"name":"accept_autopost_decision","description":"One-click accept of a **held** decision (accountant) — posts the AI's proposal.\n\nA person's accept in the app replaces the soft guardrails (confidence, amount c"},{"name":"upload_intake","description":"Upload ANY file and let the system decide what it is (the unified intake\nqueue — the same door as \"Documents → Upload\" in the web app).\n``file_base64`` is the f"},{"name":"upload_document","description":"Upload an INVOICE or RECEIPT (PDF, image, or .zip of them) for analysis.\n``file_base64`` is the file's raw bytes, base64-encoded. ``direction`` is\n``payable`` ("},{"name":"get_intake","description":"Get one intake row by id (scoped to its company: 404/403 split)."},{"name":"list_items","description":"List/filter items, scoped to the caller's member companies (A1).\n\nOptional ``period`` (``YYYY-MM``) filters by the item's effective date\n(invoice date, falling "},{"name":"get_item","description":"Item metadata (any source)."},{"name":"gl_trial_balance","description":"Per-account debit/credit columns for one fiscal year, with totals.\n\n``fiscal_year`` (year label) defaults to the latest year posted in; ``period_id``\nnarrows to"},{"name":"gl_profit_and_loss","description":"Revenue − expense → net result, for one fiscal year.\n\n**Window** — same rules as the trial balance: ``fiscal_year`` defaults to the latest\nposted year, ``period"},{"name":"gl_balance_sheet","description":"Assets vs liabilities + equity for one fiscal year, signed by natural side.\n\nWindow rules as the trial balance (``fiscal_year`` defaults to the latest posted\nye"},{"name":"list_gl_accounts","description":"List the postable chart (CompanyMember). ``fiscal_year`` filters to one year's chart\n(the chart is FY-scoped, so codes repeat across years)."},{"name":"get_gl_account_ledger","description":"One account's ledger (Kontoauszug) — every booking that touched it, in date\norder, with Soll/Haben and the running balance after each line (CompanyMember).\n\nNo "},{"name":"list_gl_periods","description":"The company's **accounting periods** — the months a journal entry may post into\n(CompanyMember read).\n\nA period belongs to one fiscal year and carries ``period_"},{"name":"list_gl_open_items","description":"One page of the AR/AP subledger (member read).\n\n``direction`` filters server-side (ZCT-577) — omit it for both. The screen used to\nfilter the fetched page in th"},{"name":"list_gl_journal_entries","description":"List journal entries.\n\n``period_ids`` narrows to specific fiscal periods, and is how a caller asks for\n**one fiscal year** — the year's period ids (ZET-285). Wi"},{"name":"get_gl_journal_entry","description":"One entry + lines, plus the subledger rows it produced/touched (Gap B detail\nsurfacing): its ``gl_vat_posting`` rows, its ``gl_vat_zero_posting`` turnover-only\n"},{"name":"create_gl_journal_entry","description":"Create a **draft** journal entry by hand — accountant. It carries NO source document\nunless you name one.\n\nOnly the pipeline paths stamp ``source_ref_type``/``s"},{"name":"post_gl_journal_entry","description":"Post a draft entry into the books — accountant. One-way.\n\nA posted entry can no longer be replaced or discarded (both refuse with 409); the only\ngeneral correct"},{"name":"reverse_gl_journal_entry","description":"**Storno** a posted journal entry: post its mirror image (accountant role).\n\nNothing is deleted; the original stays, linked both ways, and the **reversal** entr"},{"name":"list_bank_accounts","description":"The company's bank accounts — the ``bank_account_id`` every statement import,\nbank-entry list and reconciliation call needs (CompanyMember read).\n\nOldest first,"},{"name":"list_bank_entries","description":"List Bank Entries"},{"name":"get_bank_entry","description":"Get Bank Entry"},{"name":"entry_candidates","description":"Entry Candidates"},{"name":"settle_entry","description":"Post this reconciled bank entry into the GL (clean-bank settlement).\n\nMatched → Dr Bank / Cr AR; unmatched → Dr Bank / Cr Suspense; a previously-suspensed\nentry"},{"name":"reconciliation_summary","description":"Reconciliation summary banner.\n\nOptional ``from``/``to`` scope the **per-entry bank-entry counts** (total /\nmatched / missing-invoice / …) to a ``booking_date``"},{"name":"list_ar_invoices","description":"List authored AR invoices, newest first.\n\nOptional ``status`` / ``doc_type`` filter by lifecycle + document kind.\nOptional ``period`` (``YYYY-MM``) filters by t"},{"name":"get_ar_invoice","description":"One authored outgoing invoice with its lines (CompanyMember read).\n\nCarries the header (customer, dates, currency, discounts), every line with its\ncomputed ``ne"},{"name":"create_ar_invoice","description":"Create an outgoing (sales) invoice as a **draft** — nothing is booked yet\n(accountant role).\n\nA draft changes no ledger balance, gets no invoice number and appe"},{"name":"issue_ar_invoice","description":"Issue a draft — **this is the booking step** (accountant role).\n\nIn one transaction it assigns the next invoice number, posts the journal entry\n(debit the AR co"},{"name":"list_counterparties","description":"List a company's counterparties (filter by ``kind``/``q``, paginated).\n\n``kind`` repeats to filter on a set (``?kind=customer&kind=both``) — a\nrole-shaped picke"},{"name":"list_gl_vat_periods","description":"List Gl Vat Periods"},{"name":"list_payroll_runs","description":"The company's payroll runs — one per wage period — newest period first\n(CompanyMember read; the money is aggregate, no per-employee PII).\n\nA run walks ``draft``"},{"name":"list_payroll_employees","description":"Every employee on the payroll master data, with today's contract (accountant\nrole — this payload is personal data, so it is not a plain member read).\n\nOne row p"},{"name":"get_financial_statements","description":"Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).\n\nAggregates every posted GL journal line whose **posting date** falls in the f"},{"name":"customer_statement","description":"One customer's open items + totals (the aging row's drill-down).\n\n``as_of`` mirrors ``GET …/ar/aging`` — set, it reconstructs the items open at\nthat date so the"},{"name":"get_bank_status","description":"Composed bank snapshot — \"is my banking up to date?\" (CompanyMember). \"Reconciled\" means\nentries matched, NOT ledger = statement balance (the close check\n``BANK"},{"name":"zeno_info","description":"What this server is, which MCP revision it speaks, and how to get a credential.\n\n**Needs no credential.** Call it first if a tool has just refused you: the\n`aut"},{"name":"zeno_overview","description":"What Zeno does, in one page — the platform's capabilities and its limits.\n\n**Needs no credential.** Read this before telling a user that Zeno cannot do\nsomethin"},{"name":"onboarding_guide","description":"How to onboard and create a NEW company: what to ask the user for, which\ndocuments to request, and the order to run the setup in.\n\nDiscovery does not depend on "}],"toolCount":51,"toolsHash":"c11f029b8b23f15d241a3ef5b686e40a16b6d304c75a62b4ad81032166e44e1f","serverName":"zeno","capabilities":["experimental","logging","tools","extensions"],"serverVersion":"0.1.0+e37236f17","protocolVersion":"2025-06-18"}},{"at":"2026-10-21T11:25:20.921Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":26,"error":null,"detail":{"tools":[{"name":"find_operations","description":"Search EVERY operation this server offers, including the ones not in your tool list.\n\nThe tool list you can see holds only the common operations. Several hundre"},{"name":"describe_operations","description":"Get the full argument schema for operations found via ``find_operations``.\n\nReturns each operation's description and JSON-Schema arguments — everything\na listed"},{"name":"call_operation","description":"Run any operation by name — the ones in your tool list and the unlisted ones alike.\n\n``name`` is an operation name from ``find_operations``; ``arguments`` is th"},{"name":"request_api_key","description":"Ask the user to hand this session a Zeno API key. **Use this first** — every\ncurrent Zeno user already has an account.\n\n`email` is the address on their Zeno acc"},{"name":"start_signup","description":"Create a Zeno account for somebody who does not have one yet.\n\nUse `request_api_key` first if they might already have an account — this tool\ncannot tell you, an"},{"name":"collect_api_key","description":"Collect the key once the user has approved.\n\n`status` is one of:\n\n- `pending` — nobody has approved yet, or (with `throttled: true`) we were\n  rate-limited and "},{"name":"whoami","description":"Which user this request acts as, and which company's books it is bound to (jwt or API key).\n\nZeno serves every tenant from one host, and an API key is opaque — "},{"name":"list_companies","description":"List companies (jwt, scoped). Non-admins see only their member companies."},{"name":"get_company","description":"Get one company (jwt, scoped). 403 for a non-member non-admin, 404 if absent."},{"name":"global_search","description":"Full-text search across emails + items, ranked by ``ts_rank_cd``, scoped (A1).\n\n``archive_status`` constrains item results only (the Documents → Archive page\npa"},{"name":"get_kpi_report","description":"Snapshot KPIs + 13-week liquidity forecast, from the GL (CompanyMember).\n\nCash/liability balances aggregate the FY window of posted/reversed journal lines;\nagin"},{"name":"get_work_list","description":"Everything waiting for this user in this company, most severe first."},{"name":"list_autopost_decisions","description":"Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.\n\nShows what the autonomy policy posted (``posted``), would have posted in\n``assist`"},{"name":"accept_autopost_decision","description":"One-click accept of a **held** decision (accountant) — posts the AI's proposal.\n\nA person's accept in the app replaces the soft guardrails (confidence, amount c"},{"name":"upload_intake","description":"Upload ANY file and let the system decide what it is (the unified intake\nqueue — the same door as \"Documents → Upload\" in the web app).\n``file_base64`` is the f"},{"name":"upload_document","description":"Upload an INVOICE or RECEIPT (PDF, image, or .zip of them) for analysis.\n``file_base64`` is the file's raw bytes, base64-encoded. ``direction`` is\n``payable`` ("},{"name":"get_intake","description":"Get one intake row by id (scoped to its company: 404/403 split)."},{"name":"list_items","description":"List/filter items, scoped to the caller's member companies (A1).\n\nOptional ``period`` (``YYYY-MM``) filters by the item's effective date\n(invoice date, falling "},{"name":"get_item","description":"Item metadata (any source)."},{"name":"gl_trial_balance","description":"Per-account debit/credit columns for one fiscal year, with totals.\n\n``fiscal_year`` (year label) defaults to the latest year posted in; ``period_id``\nnarrows to"},{"name":"gl_profit_and_loss","description":"Revenue − expense → net result, for one fiscal year.\n\n**Window** — same rules as the trial balance: ``fiscal_year`` defaults to the latest\nposted year, ``period"},{"name":"gl_balance_sheet","description":"Assets vs liabilities + equity for one fiscal year, signed by natural side.\n\nWindow rules as the trial balance (``fiscal_year`` defaults to the latest posted\nye"},{"name":"list_gl_accounts","description":"List the postable chart (CompanyMember). ``fiscal_year`` filters to one year's chart\n(the chart is FY-scoped, so codes repeat across years)."},{"name":"get_gl_account_ledger","description":"One account's ledger (Kontoauszug) — every booking that touched it, in date\norder, with Soll/Haben and the running balance after each line (CompanyMember).\n\nNo "},{"name":"list_gl_periods","description":"The company's **accounting periods** — the months a journal entry may post into\n(CompanyMember read).\n\nA period belongs to one fiscal year and carries ``period_"},{"name":"list_gl_open_items","description":"One page of the AR/AP subledger (member read).\n\n``direction`` filters server-side (ZCT-577) — omit it for both. The screen used to\nfilter the fetched page in th"},{"name":"list_gl_journal_entries","description":"List journal entries.\n\n``period_ids`` narrows to specific fiscal periods, and is how a caller asks for\n**one fiscal year** — the year's period ids (ZET-285). Wi"},{"name":"get_gl_journal_entry","description":"One entry + lines, plus the subledger rows it produced/touched (Gap B detail\nsurfacing): its ``gl_vat_posting`` rows, its ``gl_vat_zero_posting`` turnover-only\n"},{"name":"create_gl_journal_entry","description":"Create a **draft** journal entry by hand — accountant. It carries NO source document\nunless you name one.\n\nOnly the pipeline paths stamp ``source_ref_type``/``s"},{"name":"post_gl_journal_entry","description":"Post a draft entry into the books — accountant. One-way.\n\nA posted entry can no longer be replaced or discarded (both refuse with 409); the only\ngeneral correct"},{"name":"reverse_gl_journal_entry","description":"**Storno** a posted journal entry: post its mirror image (accountant role).\n\nNothing is deleted; the original stays, linked both ways, and the **reversal** entr"},{"name":"list_bank_accounts","description":"The company's bank accounts — the ``bank_account_id`` every statement import,\nbank-entry list and reconciliation call needs (CompanyMember read).\n\nOldest first,"},{"name":"list_bank_entries","description":"List Bank Entries"},{"name":"get_bank_entry","description":"Get Bank Entry"},{"name":"entry_candidates","description":"Entry Candidates"},{"name":"settle_entry","description":"Post this reconciled bank entry into the GL (clean-bank settlement).\n\nMatched → Dr Bank / Cr AR; unmatched → Dr Bank / Cr Suspense; a previously-suspensed\nentry"},{"name":"reconciliation_summary","description":"Reconciliation summary banner.\n\nOptional ``from``/``to`` scope the **per-entry bank-entry counts** (total /\nmatched / missing-invoice / …) to a ``booking_date``"},{"name":"list_ar_invoices","description":"List authored AR invoices, newest first.\n\nOptional ``status`` / ``doc_type`` filter by lifecycle + document kind.\nOptional ``period`` (``YYYY-MM``) filters by t"},{"name":"get_ar_invoice","description":"One authored outgoing invoice with its lines (CompanyMember read).\n\nCarries the header (customer, dates, currency, discounts), every line with its\ncomputed ``ne"},{"name":"create_ar_invoice","description":"Create an outgoing (sales) invoice as a **draft** — nothing is booked yet\n(accountant role).\n\nA draft changes no ledger balance, gets no invoice number and appe"},{"name":"issue_ar_invoice","description":"Issue a draft — **this is the booking step** (accountant role).\n\nIn one transaction it assigns the next invoice number, posts the journal entry\n(debit the AR co"},{"name":"list_counterparties","description":"List a company's counterparties (filter by ``kind``/``q``, paginated).\n\n``kind`` repeats to filter on a set (``?kind=customer&kind=both``) — a\nrole-shaped picke"},{"name":"list_gl_vat_periods","description":"List Gl Vat Periods"},{"name":"list_payroll_runs","description":"The company's payroll runs — one per wage period — newest period first\n(CompanyMember read; the money is aggregate, no per-employee PII).\n\nA run walks ``draft``"},{"name":"list_payroll_employees","description":"Every employee on the payroll master data, with today's contract (accountant\nrole — this payload is personal data, so it is not a plain member read).\n\nOne row p"},{"name":"get_financial_statements","description":"Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).\n\nAggregates every posted GL journal line whose **posting date** falls in the f"},{"name":"customer_statement","description":"One customer's open items + totals (the aging row's drill-down).\n\n``as_of`` mirrors ``GET …/ar/aging`` — set, it reconstructs the items open at\nthat date so the"},{"name":"get_bank_status","description":"Composed bank snapshot — \"is my banking up to date?\" (CompanyMember). \"Reconciled\" means\nentries matched, NOT ledger = statement balance (the close check\n``BANK"},{"name":"zeno_info","description":"What this server is, which MCP revision it speaks, and how to get a credential.\n\n**Needs no credential.** Call it first if a tool has just refused you: the\n`aut"},{"name":"zeno_overview","description":"What Zeno does, in one page — the platform's capabilities and its limits.\n\n**Needs no credential.** Read this before telling a user that Zeno cannot do\nsomethin"},{"name":"onboarding_guide","description":"How to onboard and create a NEW company: what to ask the user for, which\ndocuments to request, and the order to run the setup in.\n\nDiscovery does not depend on "}],"toolCount":51,"toolsHash":"c11f029b8b23f15d241a3ef5b686e40a16b6d304c75a62b4ad81032166e44e1f","serverName":"zeno","capabilities":["experimental","logging","tools","extensions"],"serverVersion":"0.1.0+e37236f17","protocolVersion":"2025-06-18"}},{"at":"2026-10-21T02:29:16.338Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":25,"error":null,"detail":{"tools":[{"name":"find_operations","description":"Search EVERY operation this server offers, including the ones not in your tool list.\n\nThe tool list you can see holds only the common operations. Several hundre"},{"name":"describe_operations","description":"Get the full argument schema for operations found via ``find_operations``.\n\nReturns each operation's description and JSON-Schema arguments — everything\na listed"},{"name":"call_operation","description":"Run any operation by name — the ones in your tool list and the unlisted ones alike.\n\n``name`` is an operation name from ``find_operations``; ``arguments`` is th"},{"name":"request_api_key","description":"Ask the user to hand this session a Zeno API key. **Use this first** — every\ncurrent Zeno user already has an account.\n\n`email` is the address on their Zeno acc"},{"name":"start_signup","description":"Create a Zeno account for somebody who does not have one yet.\n\nUse `request_api_key` first if they might already have an account — this tool\ncannot tell you, an"},{"name":"collect_api_key","description":"Collect the key once the user has approved.\n\n`status` is one of:\n\n- `pending` — nobody has approved yet, or (with `throttled: true`) we were\n  rate-limited and "},{"name":"whoami","description":"Which user this request acts as, and which company's books it is bound to (jwt or API key).\n\nZeno serves every tenant from one host, and an API key is opaque — "},{"name":"list_companies","description":"List companies (jwt, scoped). Non-admins see only their member companies."},{"name":"get_company","description":"Get one company (jwt, scoped). 403 for a non-member non-admin, 404 if absent."},{"name":"global_search","description":"Full-text search across emails + items, ranked by ``ts_rank_cd``, scoped (A1).\n\n``archive_status`` constrains item results only (the Documents → Archive page\npa"},{"name":"get_kpi_report","description":"Snapshot KPIs + 13-week liquidity forecast, from the GL (CompanyMember).\n\nCash/liability balances aggregate the FY window of posted/reversed journal lines;\nagin"},{"name":"get_work_list","description":"Everything waiting for this user in this company, most severe first."},{"name":"list_autopost_decisions","description":"Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.\n\nShows what the autonomy policy posted (``posted``), would have posted in\n``assist`"},{"name":"accept_autopost_decision","description":"One-click accept of a **held** decision (accountant) — posts the AI's proposal.\n\nA person's accept in the app replaces the soft guardrails (confidence, amount c"},{"name":"upload_intake","description":"Upload ANY file and let the system decide what it is (the unified intake\nqueue — the same door as \"Documents → Upload\" in the web app).\n``file_base64`` is the f"},{"name":"upload_document","description":"Upload an INVOICE or RECEIPT (PDF, image, or .zip of them) for analysis.\n``file_base64`` is the file's raw bytes, base64-encoded. ``direction`` is\n``payable`` ("},{"name":"get_intake","description":"Get one intake row by id (scoped to its company: 404/403 split)."},{"name":"list_items","description":"List/filter items, scoped to the caller's member companies (A1).\n\nOptional ``period`` (``YYYY-MM``) filters by the item's effective date\n(invoice date, falling "},{"name":"get_item","description":"Item metadata (any source)."},{"name":"gl_trial_balance","description":"Per-account debit/credit columns for one fiscal year, with totals.\n\n``fiscal_year`` (year label) defaults to the latest year posted in; ``period_id``\nnarrows to"},{"name":"gl_profit_and_loss","description":"Revenue − expense → net result, for one fiscal year.\n\n**Window** — same rules as the trial balance: ``fiscal_year`` defaults to the latest\nposted year, ``period"},{"name":"gl_balance_sheet","description":"Assets vs liabilities + equity for one fiscal year, signed by natural side.\n\nWindow rules as the trial balance (``fiscal_year`` defaults to the latest posted\nye"},{"name":"list_gl_accounts","description":"List the postable chart (CompanyMember). ``fiscal_year`` filters to one year's chart\n(the chart is FY-scoped, so codes repeat across years)."},{"name":"get_gl_account_ledger","description":"One account's ledger (Kontoauszug) — every booking that touched it, in date\norder, with Soll/Haben and the running balance after each line (CompanyMember).\n\nNo "},{"name":"list_gl_periods","description":"The company's **accounting periods** — the months a journal entry may post into\n(CompanyMember read).\n\nA period belongs to one fiscal year and carries ``period_"},{"name":"list_gl_open_items","description":"One page of the AR/AP subledger (member read).\n\n``direction`` filters server-side (ZCT-577) — omit it for both. The screen used to\nfilter the fetched page in th"},{"name":"list_gl_journal_entries","description":"List journal entries.\n\n``period_ids`` narrows to specific fiscal periods, and is how a caller asks for\n**one fiscal year** — the year's period ids (ZET-285). Wi"},{"name":"get_gl_journal_entry","description":"One entry + lines, plus the subledger rows it produced/touched (Gap B detail\nsurfacing): its ``gl_vat_posting`` rows, its ``gl_vat_zero_posting`` turnover-only\n"},{"name":"create_gl_journal_entry","description":"Create a **draft** journal entry by hand — accountant. It carries NO source document\nunless you name one.\n\nOnly the pipeline paths stamp ``source_ref_type``/``s"},{"name":"post_gl_journal_entry","description":"Post a draft entry into the books — accountant. One-way.\n\nA posted entry can no longer be replaced or discarded (both refuse with 409); the only\ngeneral correct"},{"name":"reverse_gl_journal_entry","description":"**Storno** a posted journal entry: post its mirror image (accountant role).\n\nNothing is deleted; the original stays, linked both ways, and the **reversal** entr"},{"name":"list_bank_accounts","description":"The company's bank accounts — the ``bank_account_id`` every statement import,\nbank-entry list and reconciliation call needs (CompanyMember read).\n\nOldest first,"},{"name":"list_bank_entries","description":"List Bank Entries"},{"name":"get_bank_entry","description":"Get Bank Entry"},{"name":"entry_candidates","description":"Entry Candidates"},{"name":"settle_entry","description":"Post this reconciled bank entry into the GL (clean-bank settlement).\n\nMatched → Dr Bank / Cr AR; unmatched → Dr Bank / Cr Suspense; a previously-suspensed\nentry"},{"name":"reconciliation_summary","description":"Reconciliation summary banner.\n\nOptional ``from``/``to`` scope the **per-entry bank-entry counts** (total /\nmatched / missing-invoice / …) to a ``booking_date``"},{"name":"list_ar_invoices","description":"List authored AR invoices, newest first.\n\nOptional ``status`` / ``doc_type`` filter by lifecycle + document kind.\nOptional ``period`` (``YYYY-MM``) filters by t"},{"name":"get_ar_invoice","description":"One authored outgoing invoice with its lines (CompanyMember read).\n\nCarries the header (customer, dates, currency, discounts), every line with its\ncomputed ``ne"},{"name":"create_ar_invoice","description":"Create an outgoing (sales) invoice as a **draft** — nothing is booked yet\n(accountant role).\n\nA draft changes no ledger balance, gets no invoice number and appe"},{"name":"issue_ar_invoice","description":"Issue a draft — **this is the booking step** (accountant role).\n\nIn one transaction it assigns the next invoice number, posts the journal entry\n(debit the AR co"},{"name":"list_counterparties","description":"List a company's counterparties (filter by ``kind``/``q``, paginated).\n\n``kind`` repeats to filter on a set (``?kind=customer&kind=both``) — a\nrole-shaped picke"},{"name":"list_gl_vat_periods","description":"List Gl Vat Periods"},{"name":"list_payroll_runs","description":"The company's payroll runs — one per wage period — newest period first\n(CompanyMember read; the money is aggregate, no per-employee PII).\n\nA run walks ``draft``"},{"name":"list_payroll_employees","description":"Every employee on the payroll master data, with today's contract (accountant\nrole — this payload is personal data, so it is not a plain member read).\n\nOne row p"},{"name":"get_financial_statements","description":"Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).\n\nAggregates every posted GL journal line whose **posting date** falls in the f"},{"name":"customer_statement","description":"One customer's open items + totals (the aging row's drill-down).\n\n``as_of`` mirrors ``GET …/ar/aging`` — set, it reconstructs the items open at\nthat date so the"},{"name":"get_bank_status","description":"Composed bank snapshot — \"is my banking up to date?\" (CompanyMember). \"Reconciled\" means\nentries matched, NOT ledger = statement balance (the close check\n``BANK"},{"name":"zeno_info","description":"What this server is, which MCP revision it speaks, and how to get a credential.\n\n**Needs no credential.** Call it first if a tool has just refused you: the\n`aut"},{"name":"zeno_overview","description":"What Zeno does, in one page — the platform's capabilities and its limits.\n\n**Needs no credential.** Read this before telling a user that Zeno cannot do\nsomethin"},{"name":"onboarding_guide","description":"How to onboard and create a NEW company: what to ask the user for, which\ndocuments to request, and the order to run the setup in.\n\nDiscovery does not depend on "}],"toolCount":51,"toolsHash":"c11f029b8b23f15d241a3ef5b686e40a16b6d304c75a62b4ad81032166e44e1f","serverName":"zeno","capabilities":["experimental","logging","tools","extensions"],"serverVersion":"0.1.0+e37236f17","protocolVersion":"2025-06-18"}}],"tools":[{"name":"find_operations","description":"Search EVERY operation this server offers, including the ones not in your tool list.\n\nThe tool list you can see holds only the common operations. Several hundre"},{"name":"describe_operations","description":"Get the full argument schema for operations found via ``find_operations``.\n\nReturns each operation's description and JSON-Schema arguments — everything\na listed"},{"name":"call_operation","description":"Run any operation by name — the ones in your tool list and the unlisted ones alike.\n\n``name`` is an operation name from ``find_operations``; ``arguments`` is th"},{"name":"request_api_key","description":"Ask the user to hand this session a Zeno API key. **Use this first** — every\ncurrent Zeno user already has an account.\n\n`email` is the address on their Zeno acc"},{"name":"start_signup","description":"Create a Zeno account for somebody who does not have one yet.\n\nUse `request_api_key` first if they might already have an account — this tool\ncannot tell you, an"},{"name":"collect_api_key","description":"Collect the key once the user has approved.\n\n`status` is one of:\n\n- `pending` — nobody has approved yet, or (with `throttled: true`) we were\n  rate-limited and "},{"name":"whoami","description":"Which user this request acts as, and which company's books it is bound to (jwt or API key).\n\nZeno serves every tenant from one host, and an API key is opaque — "},{"name":"list_companies","description":"List companies (jwt, scoped). Non-admins see only their member companies."},{"name":"get_company","description":"Get one company (jwt, scoped). 403 for a non-member non-admin, 404 if absent."},{"name":"global_search","description":"Full-text search across emails + items, ranked by ``ts_rank_cd``, scoped (A1).\n\n``archive_status`` constrains item results only (the Documents → Archive page\npa"},{"name":"get_kpi_report","description":"Snapshot KPIs + 13-week liquidity forecast, from the GL (CompanyMember).\n\nCash/liability balances aggregate the FY window of posted/reversed journal lines;\nagin"},{"name":"get_work_list","description":"Everything waiting for this user in this company, most severe first."},{"name":"list_autopost_decisions","description":"Recent AI-accountant autonomy decisions (CompanyMember) — the activity feed.\n\nShows what the autonomy policy posted (``posted``), would have posted in\n``assist`"},{"name":"accept_autopost_decision","description":"One-click accept of a **held** decision (accountant) — posts the AI's proposal.\n\nA person's accept in the app replaces the soft guardrails (confidence, amount c"},{"name":"upload_intake","description":"Upload ANY file and let the system decide what it is (the unified intake\nqueue — the same door as \"Documents → Upload\" in the web app).\n``file_base64`` is the f"},{"name":"upload_document","description":"Upload an INVOICE or RECEIPT (PDF, image, or .zip of them) for analysis.\n``file_base64`` is the file's raw bytes, base64-encoded. ``direction`` is\n``payable`` ("},{"name":"get_intake","description":"Get one intake row by id (scoped to its company: 404/403 split)."},{"name":"list_items","description":"List/filter items, scoped to the caller's member companies (A1).\n\nOptional ``period`` (``YYYY-MM``) filters by the item's effective date\n(invoice date, falling "},{"name":"get_item","description":"Item metadata (any source)."},{"name":"gl_trial_balance","description":"Per-account debit/credit columns for one fiscal year, with totals.\n\n``fiscal_year`` (year label) defaults to the latest year posted in; ``period_id``\nnarrows to"},{"name":"gl_profit_and_loss","description":"Revenue − expense → net result, for one fiscal year.\n\n**Window** — same rules as the trial balance: ``fiscal_year`` defaults to the latest\nposted year, ``period"},{"name":"gl_balance_sheet","description":"Assets vs liabilities + equity for one fiscal year, signed by natural side.\n\nWindow rules as the trial balance (``fiscal_year`` defaults to the latest posted\nye"},{"name":"list_gl_accounts","description":"List the postable chart (CompanyMember). ``fiscal_year`` filters to one year's chart\n(the chart is FY-scoped, so codes repeat across years)."},{"name":"get_gl_account_ledger","description":"One account's ledger (Kontoauszug) — every booking that touched it, in date\norder, with Soll/Haben and the running balance after each line (CompanyMember).\n\nNo "},{"name":"list_gl_periods","description":"The company's **accounting periods** — the months a journal entry may post into\n(CompanyMember read).\n\nA period belongs to one fiscal year and carries ``period_"},{"name":"list_gl_open_items","description":"One page of the AR/AP subledger (member read).\n\n``direction`` filters server-side (ZCT-577) — omit it for both. The screen used to\nfilter the fetched page in th"},{"name":"list_gl_journal_entries","description":"List journal entries.\n\n``period_ids`` narrows to specific fiscal periods, and is how a caller asks for\n**one fiscal year** — the year's period ids (ZET-285). Wi"},{"name":"get_gl_journal_entry","description":"One entry + lines, plus the subledger rows it produced/touched (Gap B detail\nsurfacing): its ``gl_vat_posting`` rows, its ``gl_vat_zero_posting`` turnover-only\n"},{"name":"create_gl_journal_entry","description":"Create a **draft** journal entry by hand — accountant. It carries NO source document\nunless you name one.\n\nOnly the pipeline paths stamp ``source_ref_type``/``s"},{"name":"post_gl_journal_entry","description":"Post a draft entry into the books — accountant. One-way.\n\nA posted entry can no longer be replaced or discarded (both refuse with 409); the only\ngeneral correct"},{"name":"reverse_gl_journal_entry","description":"**Storno** a posted journal entry: post its mirror image (accountant role).\n\nNothing is deleted; the original stays, linked both ways, and the **reversal** entr"},{"name":"list_bank_accounts","description":"The company's bank accounts — the ``bank_account_id`` every statement import,\nbank-entry list and reconciliation call needs (CompanyMember read).\n\nOldest first,"},{"name":"list_bank_entries","description":"List Bank Entries"},{"name":"get_bank_entry","description":"Get Bank Entry"},{"name":"entry_candidates","description":"Entry Candidates"},{"name":"settle_entry","description":"Post this reconciled bank entry into the GL (clean-bank settlement).\n\nMatched → Dr Bank / Cr AR; unmatched → Dr Bank / Cr Suspense; a previously-suspensed\nentry"},{"name":"reconciliation_summary","description":"Reconciliation summary banner.\n\nOptional ``from``/``to`` scope the **per-entry bank-entry counts** (total /\nmatched / missing-invoice / …) to a ``booking_date``"},{"name":"list_ar_invoices","description":"List authored AR invoices, newest first.\n\nOptional ``status`` / ``doc_type`` filter by lifecycle + document kind.\nOptional ``period`` (``YYYY-MM``) filters by t"},{"name":"get_ar_invoice","description":"One authored outgoing invoice with its lines (CompanyMember read).\n\nCarries the header (customer, dates, currency, discounts), every line with its\ncomputed ``ne"},{"name":"create_ar_invoice","description":"Create an outgoing (sales) invoice as a **draft** — nothing is booked yet\n(accountant role).\n\nA draft changes no ledger balance, gets no invoice number and appe"},{"name":"issue_ar_invoice","description":"Issue a draft — **this is the booking step** (accountant role).\n\nIn one transaction it assigns the next invoice number, posts the journal entry\n(debit the AR co"},{"name":"list_counterparties","description":"List a company's counterparties (filter by ``kind``/``q``, paginated).\n\n``kind`` repeats to filter on a set (``?kind=customer&kind=both``) — a\nrole-shaped picke"},{"name":"list_gl_vat_periods","description":"List Gl Vat Periods"},{"name":"list_payroll_runs","description":"The company's payroll runs — one per wage period — newest period first\n(CompanyMember read; the money is aggregate, no per-employee PII).\n\nA run walks ``draft``"},{"name":"list_payroll_employees","description":"Every employee on the payroll master data, with today's contract (accountant\nrole — this payload is personal data, so it is not a plain member read).\n\nOne row p"},{"name":"get_financial_statements","description":"Computed balance sheet + P&L for a fiscal year, from the journal (CompanyMember).\n\nAggregates every posted GL journal line whose **posting date** falls in the f"},{"name":"customer_statement","description":"One customer's open items + totals (the aging row's drill-down).\n\n``as_of`` mirrors ``GET …/ar/aging`` — set, it reconstructs the items open at\nthat date so the"},{"name":"get_bank_status","description":"Composed bank snapshot — \"is my banking up to date?\" (CompanyMember). \"Reconciled\" means\nentries matched, NOT ledger = statement balance (the close check\n``BANK"},{"name":"zeno_info","description":"What this server is, which MCP revision it speaks, and how to get a credential.\n\n**Needs no credential.** Call it first if a tool has just refused you: the\n`aut"},{"name":"zeno_overview","description":"What Zeno does, in one page — the platform's capabilities and its limits.\n\n**Needs no credential.** Read this before telling a user that Zeno cannot do\nsomethin"},{"name":"onboarding_guide","description":"How to onboard and create a NEW company: what to ask the user for, which\ndocuments to request, and the order to run the setup in.\n\nDiscovery does not depend on "}],"package":null,"toolSurface":{"id":"ts_tw7h8gqhugsw","endpointId":"ep_q7zbedunjg2k","hash":"c11f029b8b23f15d241a3ef5b686e40a16b6d304c75a62b4ad81032166e44e1f","toolCount":51,"serverName":"zeno","serverVersion":"0.1.0+e37236f17","protocolVersion":"2025-06-18","firstSeenAt":"2026-10-19T11:31:54.855Z","lastSeenAt":"2026-10-23T21:25:07.375Z","observations":16,"toolNames":["find_operations","describe_operations","call_operation","request_api_key","start_signup","collect_api_key","whoami","list_companies","get_company","global_search","get_kpi_report","get_work_list","list_autopost_decisions","accept_autopost_decision","upload_intake","upload_document","get_intake","list_items","get_item","gl_trial_balance","gl_profit_and_loss","gl_balance_sheet","list_gl_accounts","get_gl_account_ledger","list_gl_periods","list_gl_open_items","list_gl_journal_entries","get_gl_journal_entry","create_gl_journal_entry","post_gl_journal_entry","reverse_gl_journal_entry","list_bank_accounts","list_bank_entries","get_bank_entry","entry_candidates","settle_entry","reconciliation_summary","list_ar_invoices","get_ar_invoice","create_ar_invoice","issue_ar_invoice","list_counterparties","list_gl_vat_periods","list_payroll_runs","list_payroll_employees","get_financial_statements","customer_statement","get_bank_status","zeno_info","zeno_overview","onboarding_guide"],"distinctSurfaces":3},"endpointFacts":[{"id":"ep_q7zbedunjg2k","url":"https://app.zeno-works.ch/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-10-23T07:26:09.116Z","auth":{"observedAt":"2026-10-23T07:26:09.138Z","authRequired":false,"scheme":null,"resourceMetadata":null,"authorizationServer":null,"conformance":{"dpop":false,"rfc8414":false,"rfc9728":false,"pkceS256":false,"clientIdMetadataDocument":false,"dynamicClientRegistration":false}},"tls":{"observedAt":"2026-10-23T07:26:09.181Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"app.zeno-works.ch","issuer":{"commonName":"YE1","organization":"Let's Encrypt"},"validFrom":"2026-09-06T18:23:42.000Z","validTo":"2026-12-05T18:23:41.000Z","daysToExpiry":42,"sanCount":1,"fingerprint256":"DB:9B:18:86:45:D5:D1:92:7B:CA:F6:EB:3E:4F:C1:1C:04:70:92:AC:63:9A:98:41:BD:59:2D:BD:FC:75:22:B1"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"ch.zeno-works/zeno","url":"https://registry.modelcontextprotocol.io/v0/servers/ch.zeno-works%2Fzeno","firstSeenAt":"2026-10-11T22:18:58.126Z","fetchedAt":"2026-10-21T09:28:48.373Z","normalizedAt":"2026-10-21T09:28:48.373Z"}]},"firstSeenAt":"2026-10-11T22:18:58.126Z","updatedAt":"2026-10-23T21:29:36.293Z"}