← The evidence ledger
Evidence row 297758
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint cf78035a-5d2d-432b-879d-2c18974458b5
- Recorded
- Previous row
- None: the first of its kind about this subject
- Body SHA-256
- fce0e776693748e0c612af6695a21abcc9b07719135d93a3f48f75a45a4fa7ae
- Leaf
- 0xced85b91d1ed3984c28a2d1ee93bf2f23767f6236879be805389df30ec20ce9d
What was observed
{
"count": 7,
"tools": [
{
"description": "Turn time entries (hours x rate, with optional rounding, grouping by task and expenses) into a validated invoice JSON with totals, ready for POST /v1/invoice.pdf. Use validate_invoice (free) instead if you already have an invoice. Pure calculation: no network request, nothing is sent or stored. Costs $0.02 USDC per call via x402 (payment goes in _meta[\"x402/payment\"]); invalid input returns an error and is not charged.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"buyer": {
"properties": {
"address": {
"maxLength": 400,
"type": "string"
},
"email": {
"format": "email",
"maxLength": 254,
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"type": "string"
},
"name": {
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"phone": {
"maxLength": 40,
"type": "string"
},
"tax_id": {
"maxLength": 60,
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"currency": {
"default": "USD",
"type": "string"
},
"default_rate": {
"description": "Hourly rate for entries without their own rate",
"maximum": 1000000,
"minimum": 0,
"type": "number"
},
"discount": {
"maximum": 1000000000,
"minimum": 0,
"type": "number"
},
"due_date": {
"description": "YYYY-MM-DD; or give terms instead",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"entries": {
"items": {
"additionalProperties": false,
"properties": {
"date": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"description": {
"maxLength": 250,
"minLength": 1,
"type": "string"
},
"hours": {
"exclusiveMinimum": 0,
"maximum": 1000,
"type": "number"
},
"rate": {
"maximum": 1000000,
"minimum": 0,
"type": "number"
}
},
"required": [
"description",
"hours"
],
"type": "object"
},
"maxItems": 500,
"minItems": 1,
"type": "array"
},
"expenses": {
"description": "Reimbursable expenses, one line each",
"items": {
"additionalProperties": false,
"properties": {
"amount": {
"maximum": 1000000000,
"minimum": 0,
"type": "number"
},
"description": {
"maxLength": 250,
"minLength": 1,
"type": "string"
}
},
"required": [
"description",
"amount"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"group_by": {
"default": "entry",
"description": "entry = one line per entry; description = merge entries with the same description and rate",
"enum": [
"entry",
"description"
],
"type": "string"
},
"invoice_number": {
"maxLength": 64,
"minLength": 1,
"type": "string"
},
"issue_date": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"notes": {
"maxLength": 2000,
"type": "string"
},
"payment_instructions": {
"maxLength": 1000,
"type": "string"
},
"rounding": {
"additionalProperties": false,
"properties": {
"increment_minutes": {
"anyOf": [
{
"const": 1,
"type": "number"
},
{
"const": 5,
"type": "number"
},
{
"const": 6,
"type": "number"
},
{
"const": 10,
"type": "number"
},
{
"const": 15,
"type": "number"
},
{
"const": 30,
"type": "number"
},
{
"const": 60,
"type": "number"
}
],
"description": "Round each entry to this many minutes"
},
"mode": {
"default": "up",
"enum": [
"up",
"nearest"
],
"type": "string"
}
},
"required": [
"increment_minutes"
],
"type": "object"
},
"seller": {
"properties": {
"address": {
"maxLength": 400,
"type": "string"
},
"email": {
"format": "email",
"maxLength": 254,
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"type": "string"
},
"name": {
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"phone": {
"maxLength": 40,
"type": "string"
},
"tax_id": {
"maxLength": 60,
"type": "string"
}
},
"required": [
"name"
],
"type": "object"
},
"tax_rate": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"terms": {
"description": "e.g. \"Net 15\"; sets due_date from issue_date (early-pay discounts are not applied to the invoice)",
"maxLength": 40,
"minLength": 1,
"type": "string"
}
},
"required": [
"seller",
"buyer",
"invoice_number",
"issue_date",
"entries"
],
"type": "object"
},
"name": "invoice_from_timesheet"
},
{
"description": "Calculate the late fee on one overdue invoice: flat fee, monthly % or annual %, simple or compounding, with optional grace days. Returns days late, the fee, the new total and a line to paste on the invoice. Use payment_terms_check instead to work out when an invoice is due. Not legal advice; it does not look up state caps. Pure calculation: no network request, nothing is sent or stored. Costs $0.01 USDC per call via x402 (payment goes in _meta[\"x402/payment\"]); invalid input returns an error and is not charged.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"amount": {
"description": "Unpaid invoice amount",
"exclusiveMinimum": 0,
"maximum": 1000000000,
"type": "number"
},
"as_of": {
"description": "Date paid, or the date to calculate to, YYYY-MM-DD (default: today, UTC)",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"compounding": {
"default": false,
"description": "false = simple interest (default); true = compounds (monthly: per 30 days; annual: daily)",
"type": "boolean"
},
"currency": {
"default": "USD",
"description": "ISO-4217, default USD",
"type": "string"
},
"due_date": {
"description": "Invoice due date, YYYY-MM-DD",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"fee_type": {
"description": "flat = one fixed fee; monthly_percent e.g. 1.5; annual_percent e.g. 18",
"enum": [
"flat",
"monthly_percent",
"annual_percent"
],
"type": "string"
},
"flat_fee": {
"description": "Flat fee; required for fee_type=flat, optional one-time add-on otherwise",
"maximum": 1000000,
"minimum": 0,
"type": "number"
},
"grace_days": {
"default": 0,
"description": "Days after the due date before any fee applies",
"maximum": 365,
"minimum": 0,
"type": "integer"
},
"rate_percent": {
"description": "Rate for monthly_percent / annual_percent",
"maximum": 100,
"minimum": 0,
"type": "number"
},
"state": {
"description": "US state (2-letter) for the legal note",
"type": "string"
}
},
"required": [
"amount",
"due_date",
"fee_type"
],
"type": "object"
},
"name": "late_fee_calc"
},
{
"description": "Draft a payment reminder email for one unpaid invoice in a friendly, firm or final-notice tone. Returns a subject, plain-text body, days overdue and a suggested next step. Use late_fee_calc first if you want the fee amount quoted in the email. Draft only: nothing is sent. Pure calculation: no network request, nothing is sent or stored. Costs $0.01 USDC per call via x402 (payment goes in _meta[\"x402/payment\"]); invalid input returns an error and is not charged.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"amount": {
"description": "Amount due",
"exclusiveMinimum": 0,
"maximum": 1000000000,
"type": "number"
},
"as_of": {
"description": "Today's date for the days-overdue count, YYYY-MM-DD (default: today, UTC)",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"client_name": {
"description": "Client's name for the greeting",
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"currency": {
"default": "USD",
"description": "ISO-4217, default USD",
"type": "string"
},
"due_date": {
"description": "YYYY-MM-DD",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"final_deadline_days": {
"default": 7,
"description": "Final notice: days the client has to pay",
"maximum": 60,
"minimum": 1,
"type": "integer"
},
"from_name": {
"description": "Your name or business, used in the sign-off",
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"invoice_number": {
"maxLength": 64,
"minLength": 1,
"type": "string"
},
"late_fee_terms": {
"description": "Your agreed late-fee terms, e.g. \"1.5% per month\"; mentioned in the final notice only",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"payment_link": {
"format": "uri",
"maxLength": 500,
"type": "string"
},
"tone": {
"description": "\"friendly\" (alias \"polite\"), \"firm\", or \"final\"",
"enum": [
"friendly",
"polite",
"firm",
"final"
],
"type": "string"
}
},
"required": [
"tone",
"from_name"
],
"type": "object"
},
"name": "payment_reminder_draft"
},
{
"description": "Work out the due date and status for payment terms such as Net 30, 2/10 Net 30, Due on receipt, EOM or Net 30 EOM. Returns the early-payment discount amount and deadline, the annualized cost of skipping the discount, and suggested reminder dates. Use late_fee_calc once the invoice is overdue. Pure calculation: no network request, nothing is sent or stored. Costs $0.01 USDC per call via x402 (payment goes in _meta[\"x402/payment\"]); invalid input returns an error and is not charged.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"amount": {
"description": "Invoice total (optional; enables the discount math)",
"maximum": 1000000000,
"minimum": 0,
"type": "number"
},
"as_of": {
"description": "Date to compute status for, YYYY-MM-DD (default: today, UTC)",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"currency": {
"default": "USD",
"description": "ISO-4217, default USD",
"type": "string"
},
"invoice_date": {
"description": "Invoice date, YYYY-MM-DD",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"terms": {
"description": "Payment terms, e.g. \"Net 30\", \"2/10 Net 30\", \"Due on receipt\", \"EOM\", \"Net 30 EOM\"",
"maxLength": 40,
"minLength": 1,
"type": "string"
}
},
"required": [
"invoice_date",
"terms"
],
"type": "object"
},
"name": "payment_terms_check"
},
{
"description": "Free. Return the price of every paid tool and of the HTTP invoice PDF route, the payment network (Base) and the receiving address. No input, no network request, no payment.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {},
"type": "object"
},
"name": "pricing"
},
{
"description": "Grade the health of a business's accounts receivable from its invoice list. Send a CSV export (QuickBooks, Xero, FreshBooks, Wave, Stripe or any CSV with customer and amount columns; columns are auto-detected) or JSON rows, up to 1000 invoices. Returns an A-F grade and 0-100 score with reasons, aging buckets (current, 1-30, 31-60, 61-90, 90+ days), overdue %, weighted days outstanding, DSO, average days to pay, customer concentration, a collection priority list with the next action per overdue invoice (pointing to payment_reminder_draft and late_fee_calc), and recommendations. Use it for a monthly AR review or before chasing payments. Not accounting or legal advice. Pure calculation: no network request, nothing is sent or stored. Costs $1 USDC per call via x402 (payment goes in _meta[\"x402/payment\"]); invalid input returns an error and is not charged.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"as_of": {
"description": "Report date, default today (UTC)",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"csv": {
"description": "CSV export (QuickBooks, Xero, FreshBooks, Wave, Stripe or your own). Header row required. Recognized columns: invoice number, customer, amount/total, amount paid, balance/open balance, invoice date, due date, terms, paid date, status.",
"maxLength": 60000,
"type": "string"
},
"currency": {
"default": "USD",
"type": "string"
},
"default_terms": {
"default": "Net 30",
"description": "Used when a row has no due date and no terms",
"maxLength": 40,
"type": "string"
},
"invoices": {
"description": "Or JSON rows instead of CSV",
"items": {
"additionalProperties": false,
"properties": {
"amount": {
"maximum": 10000000000,
"minimum": 0,
"type": "number"
},
"amount_paid": {
"maximum": 10000000000,
"minimum": 0,
"type": "number"
},
"balance": {
"maximum": 10000000000,
"type": "number"
},
"customer": {
"maxLength": 120,
"minLength": 1,
"type": "string"
},
"due_date": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"invoice_number": {
"maxLength": 60,
"minLength": 1,
"type": "string"
},
"issue_date": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"paid_date": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"status": {
"maxLength": 30,
"type": "string"
},
"terms": {
"maxLength": 40,
"type": "string"
}
},
"required": [
"invoice_number",
"customer",
"amount"
],
"type": "object"
},
"maxItems": 1000,
"type": "array"
},
"revenue_window_days": {
"default": 90,
"description": "Window for DSO: invoiced amount in the last N days",
"maximum": 365,
"minimum": 30,
"type": "integer"
}
},
"type": "object"
},
"name": "receivables_health_report"
},
{
"description": "Free. Validate an invoice JSON (the body for POST /v1/invoice.pdf, or the output of invoice_from_timesheet) and return computed subtotal, discount, tax and total, or a list of field errors. Same checks as the paid PDF route. Offline, no payment.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"invoice": {
"additionalProperties": {},
"description": "Invoice object: from, to, number, issue_date, currency, line_items[{description, quantity, unit_price}], optional tax and discount",
"propertyNames": {
"type": "string"
},
"type": "object"
}
},
"required": [
"invoice"
],
"type": "object"
},
"name": "validate_invoice"
}
]
}What the leaf hashes
{"body":"fce0e776693748e0c612af6695a21abcc9b07719135d93a3f48f75a45a4fa7ae","id":297758,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793052318715293,"prev":null,"subject":"cf78035a-5d2d-432b-879d-2c18974458b5","subject_kind":"endpoint"}Proof
Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (296695 rows).
- 0xced8680e4649a1080e67deb8a28fff3a5e2c3d8cf12c262526b9e4ac3d5d2b38
- 0xff2251e6be9dfc0f3299b44382209b14f7f7e07ec672150ed9c00323bc0c02f2
- 0xde9166306ecfde2bcc2ec1501ab40290d75a3a714d75a9419b11b25744b78d8d
- 0x5b2be0724e940a71318ef9ab76898dbe1e413892cba14b9ee5c02a1b1f737364
- 0x7b12381f668f05444802224bde6be676ff6526cecc22ab6f7f7d1402cfa79d38
- 0xc26b55038cb30afb1e84941df442e95374012f2016bbf02df0db5201af74f8b8
- 0x6ac7ae0107e720540c43b2894027289cc80928d47a61b51c3e15dd7f7508df18
- 0x9745c1bef1d820bc6468da48e2050968265dd4a67922a6da749751015763d84e
- 0x620e46a467bb6ea328be9baa498db8c9a6b6f5095a07956301edab68c1ef1f7b
- 0xe105839525c4828b89b7d05e44f371385eb52639386c098d62734be5b4a1ce05
- 0xd57a32d9d2666c4270544dcb78bbea2f4774705d3879a86973628e2542543e62
- 0xa45f4438c9296b0ba586fc2eec9f0202e5d3c61a1d3adc975b80f6a1f4a5ca57
- 0xe43762a621da83c0b4b63f549cd2e19c428ac702bfc1038d70233867b06c447f
- 0xefabf1105e09cf52c12c58e60cbb5048b9ac3f02631d1816a926e14bdd86fbdf
- 0xe94ca5b798e9899ad611e57835af42266e20f53f44977e487d81365e30972beb
- 0x703f95866af09c5e5d6ead7411e9a10f964a41a2aff64d4a55ff0053c023a023
- 0xd0651cb9bc8155eb52b5247d506e74b8a935057dc190ba52091702ac25ed3a40
- 0x9a9024edb5069d88a324facb310a5ce8e495214bbaa968f077bede437390194f
- 0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a
- Day root
- 0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
- Chained
- 0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
- Published
- On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae