Skip to content

Zaleso

by zaleso.com · remote · no sign-in to list tools · v0.3.0 · published by com.zaleso

Nigeria PAYE, VAT and CBN rates, sourced and dated. Plus invoice totals, QR codes, JSON, Base64.

Final · 2Changes · 8

10 tools: 2 do something that can't be undone and 8 change things.

Scanned Oct 21, 2026

6 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http tools https://mcp.zaleso.com/

Findings

Matches of fixed checks, with the text they matched.

6 warn
  • The server marks "qr_generate" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "qr_generate" says "generate": a word for a change.

    What this check looks for
  • The server marks "password_generate" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "password_generate" says "generate": a word for a change.

    What this check looks for
  • The server marks "ng_vat_calculate" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The description's first verb is "add": a word for a change.

    What this check looks for
  • The server marks "amount_in_words" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The input carries an amount (input.amount) and a currency, so it moves money.

    What this check looks for
  • The server marks "base64_convert" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "base64_convert" says "convert": a word for a change.

    What this check looks for
  • The server marks "usd_ngn_convert" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "usd_ngn_convert" says "convert": a word for a change.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

10 tools

Can't be undone 2Claude Code: ask
  • amount_in_wordsSpell a monetary amount in words, the way a cheque or an invoice requires — "Four Thousand and Fifty Naira and Seventy-Five Kobo Only".1 finding

    Why it is in this group

    • The input carries an amount (input.amount) and a currency, so it moves money.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "amount_in_words" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The input carries an amount (input.amount) and a currency, so it moves money.

      What this check looks for
    Description, as the server wrote it
    Spell a monetary amount in words, the way a cheque or an invoice requires — "Four Thousand and Fifty Naira and Seventy-Five Kobo Only". Supports NGN, USD, EUR and GBP with the correct major and minor unit names. It is the row that goes above the signature line on the invoices at https://zaleso.com/invoice

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • usd_ngn_convertConvert between Nigerian naira and US dollars, pounds, euros and other currencies at the Central Bank of Nigeria's official rate — the latest, or the rate that applied on a past da…1 finding

    Why it is in this group

    • The name "usd_ngn_convert" says "convert": a word for a change.
    • The input addresses people (input.to): what it sends cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "usd_ngn_convert" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "usd_ngn_convert" says "convert": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Convert between Nigerian naira and US dollars, pounds, euros and other currencies at the Central Bank of Nigeria's official rate — the latest, or the rate that applied on a past date. The dollar uses the NFEM rate (the volume-weighted average CBN publishes); other currencies use CBN's selling rate. Never a parallel-market figure. Returns the converted amount with the rate, the trading date it applies to, and the CBN source. Interactive version: https://zaleso.com/ng/fx

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
Changes things 8Claude Code: ask
  • base64_convertEncode text to Base64, or decode Base64 back to text.1 finding

    Why it is in this group

    • The name "base64_convert" says "convert": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "base64_convert" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "base64_convert" says "convert": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Encode text to Base64, or decode Base64 back to text. UTF-8 throughout, so accented text, emoji, Arabic, Devanagari and CJK survive the round trip — the naive btoa/atob version does not. Interactive version: https://zaleso.com/base64

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • invoice_totalsCompute invoice totals from line items: per-line totals, subtotal, an optional discount, optional tax (the verified Nigeria VAT preset or any rate you name), a deposit already paid…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Compute invoice totals from line items: per-line totals, subtotal, an optional discount, optional tax (the verified Nigeria VAT preset or any rate you name), a deposit already paid, and the balance due. Country-agnostic. The interactive version also produces the PDF: https://zaleso.com/invoice

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • json_formatFormat (pretty-print) or minify JSON.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Format (pretty-print) or minify JSON. Invalid input returns the line and column of the error. Interactive version: https://zaleso.com/json

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • ng_gross_for_take_homeWork backwards from a target take-home to the gross salary that produces it, under the Nigeria Tax Act 2025 (2026 tax year).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Work backwards from a target take-home to the gross salary that produces it, under the Nigeria Tax Act 2025 (2026 tax year). This is the question employers and contractors actually ask — "what must I pay for them to clear ₦500,000 a month" — and it cannot be answered by applying a rate, because PAYE is banded. Returns the required gross with the full band-by-band working and the statutory source. Informational only — verify with the tax authority. Interactive version: https://zaleso.com/ng/net-salary

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • ng_paye_calculateCalculate Nigeria PAYE income tax and net (take-home) salary under the Nigeria Tax Act 2025, effective for the 2026 tax year.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Calculate Nigeria PAYE income tax and net (take-home) salary under the Nigeria Tax Act 2025, effective for the 2026 tax year. Returns monthly take-home, monthly PAYE, the effective rate, and the full band-by-band working, with the statutory source and verification date. Handles pension (8%), NHF (2.5%, voluntary), rent relief (20% of rent, capped at ₦500,000), and the minimum-wage exemption. Figures are informational — verify with the tax authority. Interactive version: https://zaleso.com/ng/paye

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • ng_vat_calculateAdd Nigerian VAT to a net amount, or extract the VAT already contained in a VAT-inclusive amount.1 finding

    Why it is in this group

    • The description's first verb is "add": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "ng_vat_calculate" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The description's first verb is "add": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Add Nigerian VAT to a net amount, or extract the VAT already contained in a VAT-inclusive amount. Uses the verified statutory rate from the data layer and returns it with its source and effective date — never an assumed rate. Informational only — verify with the tax authority. Interactive version: https://zaleso.com/invoice

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • password_generateGenerate a cryptographically secure random password (crypto.getRandomValues with rejection sampling — no modulo bias).1 finding

    Why it is in this group

    • The name "password_generate" says "generate": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "password_generate" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}; The name "password_generate" says "generate": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Generate a cryptographically secure random password (crypto.getRandomValues with rejection sampling — no modulo bias). Returns the password and its entropy. Interactive version: https://zaleso.com/password

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • qr_generateGenerate a QR code as an SVG image from text or a URL.1 finding

    Why it is in this group

    • The name "qr_generate" says "generate": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "qr_generate" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "qr_generate" says "generate": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Generate a QR code as an SVG image from text or a URL. The code encodes the value directly — no tracking redirect, so it works forever. Interactive version: https://zaleso.com/qr

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.3.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http tools https://mcp.zaleso.com/

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [],
    "ask": [
      "mcp__tools__qr_generate",
      "mcp__tools__password_generate",
      "mcp__tools__ng_paye_calculate",
      "mcp__tools__json_format",
      "mcp__tools__ng_gross_for_take_home",
      "mcp__tools__ng_vat_calculate",
      "mcp__tools__invoice_totals",
      "mcp__tools__amount_in_words",
      "mcp__tools__base64_convert",
      "mcp__tools__usd_ngn_convert"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as tools. Review it before you use it.