{"ok":true,"site":{"host":"nouploadmcp.app","url":"https://nouploadmcp.app/","type":"live","desc":"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.","tools":[{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/how-it-works","/finance","/labs","/tools"]},{"name":"list_plugins","kind":"answer","impl":"imperative","description":"List available document plugins.","inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/how-it-works","/finance","/labs","/tools"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/how-it-works","/finance","/labs","/tools"]},{"name":"get_audit_log","kind":"answer","impl":"imperative","description":"Return the full audit log of disclosures and denials.","inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/how-it-works","/finance","/labs","/tools"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/how-it-works","/finance","/labs","/tools"]},{"name":"get_disclosure_policy","kind":"answer","impl":"imperative","description":"Get the current disclosure policy and active grants.","inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/how-it-works","/finance","/labs","/tools"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/how-it-works","/finance","/labs","/tools"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/","pages":["/","/how-it-works","/finance","/labs","/tools"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"name":"list_categories","kind":"answer","impl":"imperative","description":"List default spending categories.","inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"name":"get_monthly_cashflow","kind":"answer","impl":"imperative","description":"Net cashflow (income minus expense) per month across committed transactions.","inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"name":"find_recurring","kind":"answer","impl":"imperative","description":"Find repeating charges across committed transactions.","inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/finance","pages":["/finance"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/labs","pages":["/labs"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/labs","pages":["/labs"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/labs","pages":["/labs"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/labs","pages":["/labs"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/labs","pages":["/labs"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/labs","pages":["/labs"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/labs","pages":["/labs"]},{"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":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/labs","pages":["/labs"]},{"name":"get_goal","kind":"answer","impl":"imperative","description":"Get the current dietary goal.","inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/labs","pages":["/labs"]},{"name":"get_plan","kind":"answer","impl":"imperative","description":"Get the current approved diet plan.","inputSchema":{"type":"object","properties":{},"required":[]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/labs","pages":["/labs"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/labs","pages":["/labs"]},{"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"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/labs","pages":["/labs"]}],"category":"Finance & Crypto","favicon":"/favicons/nouploadmcp.app.png","apiSurface":"spec","toolCount":38}}