← WebMCP Directory

Tool tree

nouploadmcp.app

Finance & CryptoTools verified
Website
Analyze bank statements and lab reports with AI while your PDFs stay in your browser. Review extracted data, charts, and editable plans with human approval.
Explore capabilities

    page: Every page

    pingAction

    A trivial tool to confirm the page is reachable by the agent.

    View tool JSON
    {
      "name": "ping",
      "kind": "act",
      "impl": "imperative",
      "description": "A trivial tool to confirm the page is reachable by the agent.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string",
            "description": "Optional message to echo back."
          }
        },
        "required": []
      },
      "page": "/"
    }
    list_pluginsAnswer

    List available document plugins.

    View tool JSON
    {
      "name": "list_plugins",
      "kind": "answer",
      "impl": "imperative",
      "description": "List available document plugins.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/"
    }
    select_pluginAction

    Switch the active plugin. This changes which tools are registered.

    View tool JSON
    {
      "name": "select_plugin",
      "kind": "act",
      "impl": "imperative",
      "description": "Switch the active plugin. This changes which tools are registered.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "plugin": {
            "type": "string",
            "description": "Plugin id: finance or labs",
            "enum": [
              "finance",
              "labs"
            ]
          }
        },
        "required": [
          "plugin"
        ]
      },
      "page": "/"
    }
    get_audit_logAnswer

    Return the full audit log of disclosures and denials.

    View tool JSON
    {
      "name": "get_audit_log",
      "kind": "answer",
      "impl": "imperative",
      "description": "Return the full audit log of disclosures and denials.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/"
    }
    list_documentsAnswer

    List documents loaded into the active document set (plugin) only — never documents from another plugin.

    View tool JSON
    {
      "name": "list_documents",
      "kind": "answer",
      "impl": "imperative",
      "description": "List documents loaded into the active document set (plugin) only — never documents from another plugin.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/"
    }
    get_disclosure_policyAnswer

    Get the current disclosure policy and active grants.

    View tool JSON
    {
      "name": "get_disclosure_policy",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the current disclosure policy and active grants.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/"
    }
    get_page_textAnswer

    Get the text of a specific page, with redaction applied according to the disclosure policy. Requires consent if denied fields are present.

    View tool JSON
    {
      "name": "get_page_text",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the text of a specific page, with redaction applied according to the disclosure policy. Requires consent if denied fields are present.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "doc": {
            "type": "string",
            "description": "Document id"
          },
          "page": {
            "type": "number",
            "description": "Page number (1-based)"
          },
          "reason": {
            "type": "string",
            "description": "Why the agent needs this page"
          }
        },
        "required": [
          "doc",
          "page"
        ]
      },
      "page": "/"
    }
    request_disclosureAction

    Request just-in-time disclosure for a denied scope.

    View tool JSON
    {
      "name": "request_disclosure",
      "kind": "act",
      "impl": "imperative",
      "description": "Request just-in-time disclosure for a denied scope.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "scope": {
            "type": "string",
            "description": "Scope to disclose"
          },
          "reason": {
            "type": "string",
            "description": "Why it is needed"
          },
          "level": {
            "type": "string",
            "description": "once | session | always",
            "enum": [
              "once",
              "session",
              "always"
            ]
          }
        },
        "required": [
          "scope",
          "reason"
        ]
      },
      "page": "/"
    }

    page: Finance

    get_page_textAnswer

    Get raw text from a specific statement page only when the user explicitly needs source-page content. Do not use for transaction categorisation, merchant mappings, charts, spending analysis, or plans; use list_accepted_transactions and finance analysis tools for those tasks. Raw page access requires consent if denied fields are present.

    View tool JSON
    {
      "name": "get_page_text",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get raw text from a specific statement page only when the user explicitly needs source-page content. Do not use for transaction categorisation, merchant mappings, charts, spending analysis, or plans; use list_accepted_transactions and finance analysis tools for those tasks. Raw page access requires consent if denied fields are present.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "doc": {
            "type": "string",
            "description": "Document id"
          },
          "page": {
            "type": "number",
            "description": "Page number (1-based)"
          },
          "reason": {
            "type": "string",
            "description": "Why the agent needs this page"
          }
        },
        "required": [
          "doc",
          "page"
        ]
      },
      "page": "/finance"
    }
    propose_transactionsAction

    Scan loaded statements and propose transaction rows for human review.

    View tool JSON
    {
      "name": "propose_transactions",
      "kind": "act",
      "impl": "imperative",
      "description": "Scan loaded statements and propose transaction rows for human review.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "doc": {
            "type": "string",
            "description": "Document id, or \"all\" for all loaded documents"
          }
        },
        "required": [
          "doc"
        ]
      },
      "page": "/finance"
    }
    get_review_statusAnswer

    Get the current state of staged proposals, including accept/reject notes.

    View tool JSON
    {
      "name": "get_review_status",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the current state of staged proposals, including accept/reject notes.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/finance"
    }
    reconcile_statementAction

    Check that debits + credits match the closing balance on a statement.

    View tool JSON
    {
      "name": "reconcile_statement",
      "kind": "act",
      "impl": "imperative",
      "description": "Check that debits + credits match the closing balance on a statement.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "doc": {
            "type": "string",
            "description": "Document id"
          },
          "openingBalance": {
            "type": "number",
            "description": "Opening balance"
          },
          "closingBalance": {
            "type": "number",
            "description": "Closing balance"
          }
        },
        "required": [
          "doc",
          "openingBalance",
          "closingBalance"
        ]
      },
      "page": "/finance"
    }
    list_categoriesAnswer

    List default spending categories.

    View tool JSON
    {
      "name": "list_categories",
      "kind": "answer",
      "impl": "imperative",
      "description": "List default spending categories.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/finance"
    }
    list_accepted_transactionsAnswer

    List the locally extracted transactions the human explicitly accepted for processing. Use this tool—not get_page_text—when categorising spending, identifying merchants, proposing mappings, or inspecting transaction descriptions. It returns only accepted structured rows and never exposes raw statement text, account details, or rejected transactions.

    View tool JSON
    {
      "name": "list_accepted_transactions",
      "kind": "answer",
      "impl": "imperative",
      "description": "List the locally extracted transactions the human explicitly accepted for processing. Use this tool—not get_page_text—when categorising spending, identifying merchants, proposing mappings, or inspecting transaction descriptions. It returns only accepted structured rows and never exposes raw statement text, account details, or rejected transactions.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/finance"
    }
    propose_category_mappingsAction

    Inspect accepted extracted transactions and stage recognized merchant/category rules for human approval. Use this whenever the user asks to categorise spending or show a category chart. It never reads raw statement text or silently applies classifications. For unmatched merchants, use list_accepted_transactions and propose_mapping. After proposing, ask the human to approve the visible mappings; approval updates the chart.

    View tool JSON
    {
      "name": "propose_category_mappings",
      "kind": "act",
      "impl": "imperative",
      "description": "Inspect accepted extracted transactions and stage recognized merchant/category rules for human approval. Use this whenever the user asks to categorise spending or show a category chart. It never reads raw statement text or silently applies classifications. For unmatched merchants, use list_accepted_transactions and propose_mapping. After proposing, ask the human to approve the visible mappings; approval updates the chart.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/finance"
    }
    propose_mappingAction

    Propose a merchant/category classification rule based on accepted transaction descriptions. Call list_accepted_transactions first; raw statement text and get_page_text are not needed for categorisation. This creates a rule, not individual rows. One approved rule classifies every matching transaction, now and on future statements. Staged until a human approves; applied at read time only, never rewrites a stored transaction.

    View tool JSON
    {
      "name": "propose_mapping",
      "kind": "act",
      "impl": "imperative",
      "description": "Propose a merchant/category classification rule based on accepted transaction descriptions. Call list_accepted_transactions first; raw statement text and get_page_text are not needed for categorisation. This creates a rule, not individual rows. One approved rule classifies every matching transaction, now and on future statements. Staged until a human approves; applied at read time only, never rewrites a stored transaction.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "pattern": {
            "type": "string",
            "description": "Lowercase substring to match against transaction descriptions, e.g. \"amzn mktp\""
          },
          "merchant": {
            "type": "string",
            "description": "Human-readable merchant name, e.g. \"Amazon\""
          },
          "category": {
            "type": "string",
            "description": "Category, e.g. Dining out, Groceries, Subscriptions, Transport, Health, Bills, Income, Other"
          }
        },
        "required": [
          "pattern",
          "merchant",
          "category"
        ]
      },
      "page": "/finance"
    }
    get_goalAnswer

    Get the current goal (null if none is set yet — savings goal or debt/loan goal, whichever the human is currently working on). Reflects the page right now, including unsaved slider drags.

    View tool JSON
    {
      "name": "get_goal",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the current goal (null if none is set yet — savings goal or debt/loan goal, whichever the human is currently working on). Reflects the page right now, including unsaved slider drags.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/finance"
    }
    get_planAnswer

    Get the current plan — goal, per-category adjustments, and the human's notes — reflecting exactly what's on screen right now, including slider drags the human hasn't explicitly saved. Always call this before judging a plan (e.g. "is this feasible?") rather than assuming it still matches what you last proposed. Null if no goal is set yet.

    View tool JSON
    {
      "name": "get_plan",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the current plan — goal, per-category adjustments, and the human's notes — reflecting exactly what's on screen right now, including slider drags the human hasn't explicitly saved. Always call this before judging a plan (e.g. \"is this feasible?\") rather than assuming it still matches what you last proposed. Null if no goal is set yet.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/finance"
    }
    get_plan_feasibilityAnswer

    Check whether the current plan's required savings/payment is actually achievable given the account's real average monthly surplus (income minus expense) from the loaded statements. Use this whenever asked "is this plan feasible?" instead of eyeballing the numbers.

    View tool JSON
    {
      "name": "get_plan_feasibility",
      "kind": "answer",
      "impl": "imperative",
      "description": "Check whether the current plan's required savings/payment is actually achievable given the account's real average monthly surplus (income minus expense) from the loaded statements. Use this whenever asked \"is this plan feasible?\" instead of eyeballing the numbers.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/finance"
    }
    propose_savings_planAction

    Draft a savings plan toward a goal (e.g. a car, an emergency fund) and advise which accepted spending categories offer realistic savings opportunities. Every adjustment must include a rationale grounded in the user's category spending. Staged until approved; renders as advice plus editable sliders on the page.

    View tool JSON
    {
      "name": "propose_savings_plan",
      "kind": "act",
      "impl": "imperative",
      "description": "Draft a savings plan toward a goal (e.g. a car, an emergency fund) and advise which accepted spending categories offer realistic savings opportunities. Every adjustment must include a rationale grounded in the user's category spending. Staged until approved; renders as advice plus editable sliders on the page.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "goal": {
            "type": "object",
            "description": "Goal object: { label, target, current, rate? } — rate is an assumed annual return, as a plain percentage number where 5 means 5% (not 0.05). Omit or 0 if you're not assuming any investment growth."
          },
          "adjustments": {
            "type": "array",
            "description": "Savings advice as an array of { category, currentMonthly, targetMonthly, rationale }. Recommend only categories supported by accepted transaction data, and explain why each reduction is realistic. currentMonthly must be a true monthly average — use get_spend_by_category's avgMonthly field, never its total (which is summed across every month of statements loaded, not one month) — or the plan will propose an unaffordable amount."
          }
        },
        "required": [
          "goal",
          "adjustments"
        ]
      },
      "page": "/finance"
    }
    propose_repayment_planAction

    Draft a debt repayment plan: outstanding balance, interest rate, and monthly payment freed up from spending adjustments. Staged until approved; renders as sliders on the page.

    View tool JSON
    {
      "name": "propose_repayment_plan",
      "kind": "act",
      "impl": "imperative",
      "description": "Draft a debt repayment plan: outstanding balance, interest rate, and monthly payment freed up from spending adjustments. Staged until approved; renders as sliders on the page.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "goal": {
            "type": "object",
            "description": "Goal object: { label, current, target?, rate } — current is the outstanding balance, target is the payoff target (default 0), rate is the annual interest rate (APR) as a plain percentage number where 20 means 20% (not 0.20)"
          },
          "adjustments": {
            "type": "array",
            "description": "Array of { category, currentMonthly, targetMonthly, rationale } — freed cash applied as extra payment toward the balance. currentMonthly must be a true monthly average (get_spend_by_category's avgMonthly field, not its total) or the payment plan won't be affordable."
          }
        },
        "required": [
          "goal",
          "adjustments"
        ]
      },
      "page": "/finance"
    }
    get_spend_summaryAnswer

    Aggregate summary of committed transactions: income, expense, savings rate, top spending categories. Use for open-ended questions about spending patterns.

    View tool JSON
    {
      "name": "get_spend_summary",
      "kind": "answer",
      "impl": "imperative",
      "description": "Aggregate summary of committed transactions: income, expense, savings rate, top spending categories. Use for open-ended questions about spending patterns.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/finance"
    }
    get_spend_by_categoryAnswer

    Spend per category across accepted transactions, sorted highest first—both the total across all loaded statements and the monthly average. This and list_accepted_transactions are sufficient for categorisation and planning; never request raw statement text for those tasks. Use `avgMonthly`, not `total`, as a category's "currentMonthly" when drafting a plan.

    View tool JSON
    {
      "name": "get_spend_by_category",
      "kind": "answer",
      "impl": "imperative",
      "description": "Spend per category across accepted transactions, sorted highest first—both the total across all loaded statements and the monthly average. This and list_accepted_transactions are sufficient for categorisation and planning; never request raw statement text for those tasks. Use `avgMonthly`, not `total`, as a category's \"currentMonthly\" when drafting a plan.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/finance"
    }
    plot_spend_by_categoryAction

    Render the "Spend by category" chart from accepted transactions and human-approved mappings. If mappings are pending or none are approved, this waits instead of applying hidden guesses: call propose_category_mappings and ask the human to approve the visible proposals first.

    View tool JSON
    {
      "name": "plot_spend_by_category",
      "kind": "act",
      "impl": "imperative",
      "description": "Render the \"Spend by category\" chart from accepted transactions and human-approved mappings. If mappings are pending or none are approved, this waits instead of applying hidden guesses: call propose_category_mappings and ask the human to approve the visible proposals first.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/finance"
    }
    get_monthly_cashflowAnswer

    Net cashflow (income minus expense) per month across committed transactions.

    View tool JSON
    {
      "name": "get_monthly_cashflow",
      "kind": "answer",
      "impl": "imperative",
      "description": "Net cashflow (income minus expense) per month across committed transactions.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/finance"
    }
    find_recurringAnswer

    Find repeating charges across committed transactions.

    View tool JSON
    {
      "name": "find_recurring",
      "kind": "answer",
      "impl": "imperative",
      "description": "Find repeating charges across committed transactions.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/finance"
    }

    page: Labs

    propose_resultsAction

    Scan loaded lab reports and propose result rows for human review.

    View tool JSON
    {
      "name": "propose_results",
      "kind": "act",
      "impl": "imperative",
      "description": "Scan loaded lab reports and propose result rows for human review.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "doc": {
            "type": "string",
            "description": "Document id, or \"all\" for all loaded documents"
          }
        },
        "required": [
          "doc"
        ]
      },
      "page": "/labs"
    }
    get_review_statusAnswer

    Get the current state of staged result proposals, including accept/reject notes.

    View tool JSON
    {
      "name": "get_review_status",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the current state of staged result proposals, including accept/reject notes.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/labs"
    }
    propose_reference_rangeAction

    Propose a standard reference range for an analyte the report printed no range for. Staged until a human approves it; never applied silently.

    View tool JSON
    {
      "name": "propose_reference_range",
      "kind": "act",
      "impl": "imperative",
      "description": "Propose a standard reference range for an analyte the report printed no range for. Staged until a human approves it; never applied silently.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "analyte": {
            "type": "string",
            "description": "Canonical analyte name"
          },
          "low": {
            "type": "number",
            "description": "Lower bound"
          },
          "high": {
            "type": "number",
            "description": "Upper bound"
          },
          "unit": {
            "type": "string",
            "description": "Unit"
          },
          "source": {
            "type": "string",
            "description": "Cited source, e.g. \"Mayo Clinic Laboratories\""
          },
          "population": {
            "type": "string",
            "description": "Population the range applies to, e.g. \"adult male\""
          },
          "reason": {
            "type": "string",
            "description": "Why this fallback is being proposed"
          }
        },
        "required": [
          "analyte",
          "unit",
          "source",
          "population",
          "reason"
        ]
      },
      "page": "/labs"
    }
    list_seriesAnswer

    List accepted lab results grouped by analyte, as time series with the effective reference range for each.

    View tool JSON
    {
      "name": "list_series",
      "kind": "answer",
      "impl": "imperative",
      "description": "List accepted lab results grouped by analyte, as time series with the effective reference range for each.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/labs"
    }
    plot_seriesAction

    Get the plotted time series for one analyte, with its reference band, so the agent can describe the trend.

    View tool JSON
    {
      "name": "plot_series",
      "kind": "act",
      "impl": "imperative",
      "description": "Get the plotted time series for one analyte, with its reference band, so the agent can describe the trend.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "analyte": {
            "type": "string",
            "description": "Canonical analyte name"
          }
        },
        "required": [
          "analyte"
        ]
      },
      "page": "/labs"
    }
    plot_panelAction

    Get the plotted time series for every analyte in a named panel (e.g. "Lipid Panel").

    View tool JSON
    {
      "name": "plot_panel",
      "kind": "act",
      "impl": "imperative",
      "description": "Get the plotted time series for every analyte in a named panel (e.g. \"Lipid Panel\").",
      "inputSchema": {
        "type": "object",
        "properties": {
          "panel": {
            "type": "string",
            "description": "Panel name as printed on the report"
          }
        },
        "required": [
          "panel"
        ]
      },
      "page": "/labs"
    }
    plot_heatmapAction

    Get a matrix of every analyte over every collection date, each cell normalised to its position in the reference band (0 = low bound, 1 = high bound) so drift is visible at a glance.

    View tool JSON
    {
      "name": "plot_heatmap",
      "kind": "act",
      "impl": "imperative",
      "description": "Get a matrix of every analyte over every collection date, each cell normalised to its position in the reference band (0 = low bound, 1 = high bound) so drift is visible at a glance.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/labs"
    }
    find_out_of_rangeAnswer

    List accepted results currently outside their effective reference band, most recent first — a starting point for a diet plan goal.

    View tool JSON
    {
      "name": "find_out_of_range",
      "kind": "answer",
      "impl": "imperative",
      "description": "List accepted results currently outside their effective reference band, most recent first — a starting point for a diet plan goal.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/labs"
    }
    get_goalAnswer

    Get the current dietary goal.

    View tool JSON
    {
      "name": "get_goal",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the current dietary goal.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/labs"
    }
    get_planAnswer

    Get the current approved diet plan.

    View tool JSON
    {
      "name": "get_plan",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get the current approved diet plan.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "page": "/labs"
    }
    propose_diet_planAction

    Create or revise the diet-plan artifact shown in the page table. Always use this tool—not browser clicks or typing—when the user asks for a new plan or asks to add, remove, replace, or change an existing plan item. For a revision, first call get_plan, apply the requested change to the returned goal and adjustments, then call propose_diet_plan with the complete revised plan. The proposal renders immediately for human review and is saved only after approval.

    View tool JSON
    {
      "name": "propose_diet_plan",
      "kind": "act",
      "impl": "imperative",
      "description": "Create or revise the diet-plan artifact shown in the page table. Always use this tool—not browser clicks or typing—when the user asks for a new plan or asks to add, remove, replace, or change an existing plan item. For a revision, first call get_plan, apply the requested change to the returned goal and adjustments, then call propose_diet_plan with the complete revised plan. The proposal renders immediately for human review and is saved only after approval.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "goal": {
            "type": "object",
            "description": "Goal object with analyte, label, target, current, unit"
          },
          "adjustments": {
            "type": "array",
            "description": "Array of {item, action, targetAnalyte, rationale} objects"
          }
        },
        "required": [
          "goal",
          "adjustments"
        ]
      },
      "page": "/labs"
    }
    review_diet_planAction

    Publish a final review of the latest edited diet-plan table on the page. Before calling, use get_plan to inspect every row. Pass a finding for every dietary claim. Format summary as 3–6 concise newline-separated bullets, each beginning with "• ": cover unresolved/resolved labs, uncovered issues, questionable plan items, and the recommended next step. The page renders this summary, so never leave it only in chat. Multi-analyte targets such as "Vitamin D and Total Cholesterol" are matched separately against lab results.

    View tool JSON
    {
      "name": "review_diet_plan",
      "kind": "act",
      "impl": "imperative",
      "description": "Publish a final review of the latest edited diet-plan table on the page. Before calling, use get_plan to inspect every row. Pass a finding for every dietary claim. Format summary as 3–6 concise newline-separated bullets, each beginning with \"• \": cover unresolved/resolved labs, uncovered issues, questionable plan items, and the recommended next step. The page renders this summary, so never leave it only in chat. Multi-analyte targets such as \"Vitamin D and Total Cholesterol\" are matched separately against lab results.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "findings": {
            "type": "array",
            "description": "One entry per plan row: {item, status: \"supported\" | \"questionable\" | \"unsupported\", note}. Include user-added rows and flag false or weak claims."
          },
          "summary": {
            "type": "string",
            "description": "A readable 3–6 line summary. Every line must be one concise bullet beginning with \"• \". Include lab status, plan concerns, and next steps; do not submit a paragraph."
          }
        },
        "required": [
          "findings",
          "summary"
        ]
      },
      "page": "/labs"
    }