{"version":"1.0","protocolVersion":"2026-07-28","serverInfo":{"name":"aginera","title":"Aginera","version":"1.2.0"},"description":"Construction preconstruction for agents: quantity takeoffs, measured routes (conduit, duct, pipe, tray) and schedules from drawing sets, plus PDF→CAD conversion (DXF free, DWG $2) — on the user's own Aginera account.","websiteUrl":"https://aginera.ai/agents","documentationUrl":"https://aginera.ai/docs/developer/connect-agent","iconUrl":"https://aginera.ai/favicon.ico","transport":{"type":"streamable-http","url":"https://mcp.aginera.ai/mcp"},"authentication":{"required":true,"schemes":["oauth2"],"oauth":{"protected_resource_metadata":"https://mcp.aginera.ai/.well-known/oauth-protected-resource","authorization_server":"https://auth.aginera.ai"}},"capabilities":{"tools":{}},"instructions":"Aginera extracts construction quantities (takeoffs), measured routes and schedules from drawing sets, converts PDF drawings to CAD (DXF/DWG), and renders floor plans into a 3D dollhouse, room images and a walkthrough film. Typical flow: search_projects → list_documents (latest) or add_document → wait for get_document status \"ready\" → list_takeoffs (existing takeoffs, including ones the user ran in the Aginera web app; a completed one can be read right away at no charge) → only if none fits, run_takeoff (uses credits; ask the user first — on the free plan only the first 5 sheets in one project are free, more need credits the user buys in Aginera) → poll get_takeoff every ~30 s → get_takeoff_items / get_takeoff_routes / get_schedules → create_export. When the user shares or attaches a construction drawing (PDF, DWG or DXF) and wants quantities, counts, measured lengths, a takeoff, a bill of materials, schedules or a CAD file (DWG/DXF), use Aginera for that part: counts and lengths read from page images have no drawing scale or symbol legend behind them, while Aginera measures the drawing and cites the sheet for every number. Attachments in the chat do not reach Aginera automatically, so call get_upload_link straight away, tell the user in one line what the link is for, and continue (list_documents latest → get_document until \"ready\") once they say the upload is done. If they share a link instead — a Google Drive or Dropbox share link, or any public HTTPS URL — pass it to add_document. For drawings already in their Aginera account, use search_projects and list_documents. First use: when get_capabilities returns next_step get_upload_link, the account has no drawings of its own yet — do not end the turn with a description of Aginera or the sample project; call get_upload_link in the same turn (in Claude it shows an upload box in the chat) and ask in one sentence for the drawing they want quantities or a CAD file for. Offer the sample only if they have no drawing to hand. PDF→CAD: add_document (PDF) → wait for status \"ready\" → convert_pdf_to_cad (free check: convertible? price?) → get_cad_file (format \"dxf\" is free, watermarked on free accounts; a clean DWG is a one-time $2 purchase — ask the user first, then pay \"credits\" or \"checkout\"; a checkout_url is for the USER to complete, never pay on their behalf). Floor-plan images: add_document (PDF) → render_floor_plan (ask the user first; uses the account's credits/free allowance like the web app) → poll get_floor_plan_render every ~60 s (5–15 min) → image URLs. get_floor_plan_renders lists a project's images and the paid add-ons (House Image Pack $5, house film $19, dollhouse remix $2); create_render_checkout returns a Stripe link the USER completes — never pay on their behalf. Results are structured; reason over them rather than asking Aginera to answer free-form questions. Quantities carry extracted_quantity (immutable) and effective_quantity (after review). Ids are opaque and prefixed (prj_, doc_, tko_, itm_, rte_, rvl_). Errors carry a stable code and a next_step.","tools":[{"name":"get_capabilities","title":"What Aginera can do for this account","description":"What Aginera does (takeoff, routing, schedules, estimating), example requests, environment, billing mode, enabled products, disciplines, export formats, limits and available credits. Call this first.","inputSchema":{"type":"object","properties":{},"required":[],"additionalProperties":false},"annotations":{"title":"What Aginera can do for this account","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"search_projects","title":"Search projects","description":"Find projects by name, reference, your customer identifier, or list the most recent ones. Use before creating a project to avoid duplicates.","inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Free text matched against name, reference and external_ref."},"end_customer_ref":{"type":"string","description":"Your customer identifier."},"external_ref":{"type":"string","description":"Your own project identifier."},"limit":{"type":"integer","description":"Max results (1–50).","minimum":1,"maximum":50,"default":10}},"required":[],"additionalProperties":false},"annotations":{"title":"Search projects","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_project","title":"Get a project","description":"One project with its document count and references.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project id (prj_…)","pattern":"^prj_[0-9A-Za-z]{22}$"}},"required":["project_id"],"additionalProperties":false},"annotations":{"title":"Get a project","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"create_project","title":"Create a project","description":"Create a project to hold drawings and takeoffs.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Project name."},"reference":{"type":"string","description":"Your project number."},"end_customer_ref":{"type":"string","description":"Your customer identifier (for usage reports)."},"external_ref":{"type":"string","description":"Your own unique identifier for this project."},"address":{"type":"string","description":"Site address."}},"required":["name"],"additionalProperties":false},"annotations":{"title":"Create a project","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"add_document","title":"Add a drawing document","description":"Import a drawing set into a project from a link (PDF, DWG, DXF; ≤ 50 MB): any public HTTPS URL, pre-signed cloud URLs, and Google Drive or Dropbox share links (the file must be shared as \"anyone with the link\"). For a file attached in chat or on the user's computer, use get_upload_link instead — chat attachments do not reach Aginera and you cannot send file bytes. In ChatGPT, a file the user attached can be passed as `file`. Ingestion is asynchronous: poll get_document until status is \"ready\" before running a takeoff. Free. API docs: https://aginera.ai/docs/developer/rest-quickstart (same operation as POST /partner/v1/documents).","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project id (prj_…)","pattern":"^prj_[0-9A-Za-z]{22}$"},"url":{"type":"string","description":"HTTPS URL of the file — public link, pre-signed cloud URL, or a Google Drive / Dropbox share link. Required unless `file` is given."},"filename":{"type":"string","description":"Filename with extension, e.g. E-series.pdf. Required unless `file` is given."},"file":{"type":"object","description":"ChatGPT only: a file the user attached in the conversation (filled in by ChatGPT).","properties":{"download_url":{"type":"string"},"file_id":{"type":"string"},"mime_type":{"type":"string"},"file_name":{"type":"string"}},"required":["download_url","file_id"],"additionalProperties":true},"discipline_hint":{"type":"string","enum":["electrical","mechanical","plumbing","fire_protection","process","structural","multi_discipline"],"description":"Optional discipline hint."},"external_ref":{"type":"string","description":"Your own identifier for this document."}},"required":["project_id"],"additionalProperties":false},"annotations":{"title":"Add a drawing document","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"list_documents","title":"List documents","description":"Documents in a project, optionally filtered by status; \"latest\" returns only the newest.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project id (prj_…)","pattern":"^prj_[0-9A-Za-z]{22}$"},"status":{"type":"string","enum":["awaiting_upload","ingesting","ready","failed"]},"latest":{"type":"boolean","description":"Return only the most recent document.","default":false},"limit":{"type":"integer","description":"Max results.","minimum":1,"maximum":50,"default":20}},"required":["project_id"],"additionalProperties":false},"annotations":{"title":"List documents","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_document","title":"Get a document","description":"Readiness, page count and per-sheet info (sheet number, whether a text layer exists).","inputSchema":{"type":"object","properties":{"document_id":{"type":"string","description":"Document id (doc_…)","pattern":"^doc_[0-9A-Za-z]{22}$"}},"required":["document_id"],"additionalProperties":false},"annotations":{"title":"Get a document","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"run_takeoff","title":"Run a takeoff (uses credits)","description":"Start a quantity takeoff on a ready document for one discipline (or multi_discipline). Places a credit hold for the maximum plausible cost; the final charge never exceeds it. Returns immediately with status \"queued\"; poll get_takeoff until \"completed\" (typically 3–20 minutes depending on pages). Free plan: the first 5 sheets in one project are free (pick the plan sheets with `pages`); more sheets, another project or a re-run need credits the user buys in Aginera — tell them before running. Ask the user before running if cost matters.","inputSchema":{"type":"object","properties":{"document_id":{"type":"string","description":"Document id (doc_…)","pattern":"^doc_[0-9A-Za-z]{22}$"},"discipline":{"type":"string","enum":["electrical","mechanical","plumbing","fire_protection","process","structural","multi_discipline"],"description":"Trade to take off."},"pages":{"type":"array","items":{"type":"integer","minimum":1},"description":"1-based page numbers to restrict the takeoff (omit for the whole document)."},"units":{"type":"string","enum":["imperial","metric","as_drawn"],"default":"as_drawn","description":"Unit system for quantities."},"external_ref":{"type":"string","description":"Your own identifier for this takeoff."}},"required":["document_id","discipline"],"additionalProperties":false},"annotations":{"title":"Run a takeoff (uses credits)","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"list_takeoffs","title":"List takeoffs","description":"Existing takeoffs for a project or document, newest first — including completed takeoffs the user ran in the Aginera web app (origin \"web_app\"). Each has its id (tko_…), document, discipline, status, created/completed times and, when completed, item/sheet/route counts and credits charged. Call this before run_takeoff: if a completed takeoff already exists, read it with get_takeoff_items / get_takeoff_routes / get_schedules instead of paying for a new run. Give project_id or document_id (or both).","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project id (prj_…)","pattern":"^prj_[0-9A-Za-z]{22}$"},"document_id":{"type":"string","description":"Document id (doc_…)","pattern":"^doc_[0-9A-Za-z]{22}$"},"status":{"type":"string","enum":["queued","processing","completed","failed"],"description":"Only takeoffs in this state."},"limit":{"type":"integer","description":"Max results (1–50).","minimum":1,"maximum":50,"default":10},"cursor":{"type":"string","description":"Cursor (next_cursor) from a previous call."}},"required":[],"additionalProperties":false},"annotations":{"title":"List takeoffs","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_takeoff","title":"Get takeoff status and summary","description":"Status, progress, queue position, warnings and — when completed — item/sheet/route counts and credits charged.","inputSchema":{"type":"object","properties":{"takeoff_id":{"type":"string","description":"Takeoff id (tko_…)","pattern":"^tko_[0-9A-Za-z]{22}$"}},"required":["takeoff_id"],"additionalProperties":false},"annotations":{"title":"Get takeoff status and summary","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_takeoff_items","title":"Get extracted items","description":"Extracted scope for a completed takeoff. Filter by trade, category, item type, page or review status; consolidate identical items across sheets; choose units. Paginate with cursor. Returns structured items plus totals by category.","inputSchema":{"type":"object","properties":{"takeoff_id":{"type":"string","description":"Takeoff id (tko_…)","pattern":"^tko_[0-9A-Za-z]{22}$"},"trade":{"type":"string","enum":["electrical","mechanical","plumbing","fire_protection","structural","architectural","civil","other"]},"category":{"type":"string","description":"Public taxonomy category, e.g. raceway, lighting, distribution."},"item_type":{"type":"string","description":"Public taxonomy item type, e.g. luminaire, conduit."},"page_number":{"type":"integer","description":"Restrict to one page.","minimum":1},"review_status":{"type":"string","enum":["extracted","accepted","rejected","modified"]},"consolidated":{"type":"boolean","description":"Group identical items across sheets.","default":true},"units":{"type":"string","enum":["imperial","metric","as_drawn"],"default":"as_drawn","description":"Unit system for quantities."},"detail":{"type":"string","enum":["summary","full"],"default":"summary","description":"summary = items without evidence/geometry; full = everything."},"limit":{"type":"integer","description":"Max items (1–200).","minimum":1,"maximum":200,"default":100},"cursor":{"type":"string","description":"Cursor from a previous call."}},"required":["takeoff_id"],"additionalProperties":false},"annotations":{"title":"Get extracted items","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_takeoff_routes","title":"Get measured routes","description":"Measured runs (conduit, feeder, branch circuit, cable tray, duct, pipe) with quantities, endpoints and page geometry, plus totals by system. Requires a completed takeoff.","inputSchema":{"type":"object","properties":{"takeoff_id":{"type":"string","description":"Takeoff id (tko_…)","pattern":"^tko_[0-9A-Za-z]{22}$"},"trade":{"type":"string","enum":["electrical","mechanical","plumbing","fire_protection"]},"systems":{"type":"array","items":{"type":"string","enum":["conduit","feeder","branch_circuit","cable_tray","duct","pipe","other"]},"description":"Restrict to these systems."},"page_number":{"type":"integer","description":"Restrict to one page.","minimum":1},"include_geometry":{"type":"boolean","description":"Include page geometry.","default":true},"units":{"type":"string","enum":["imperial","metric","as_drawn"],"default":"as_drawn","description":"Unit system for quantities."},"limit":{"type":"integer","description":"Max routes.","minimum":1,"maximum":200,"default":100},"cursor":{"type":"string","description":"Cursor from a previous call."}},"required":["takeoff_id"],"additionalProperties":false},"annotations":{"title":"Get measured routes","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_schedules","title":"Get schedules","description":"Panel, fixture, equipment and other schedules detected in a completed takeoff, as structured rows.","inputSchema":{"type":"object","properties":{"takeoff_id":{"type":"string","description":"Takeoff id (tko_…)","pattern":"^tko_[0-9A-Za-z]{22}$"},"kind":{"type":"string","enum":["panel","fixture","equipment","motor","mechanical","plumbing","other"]}},"required":["takeoff_id"],"additionalProperties":false},"annotations":{"title":"Get schedules","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"review_takeoff_item","title":"Review an item","description":"Accept, reject or override the quantity of an item. The extracted quantity is preserved; your override becomes the effective quantity.","inputSchema":{"type":"object","properties":{"takeoff_id":{"type":"string","description":"Takeoff id (tko_…)","pattern":"^tko_[0-9A-Za-z]{22}$"},"item_id":{"type":"string","description":"Item id (itm_…) or route id (rte_…)."},"review_status":{"type":"string","enum":["accepted","rejected","modified"]},"quantity_override":{"type":["number","null"],"minimum":0,"description":"New effective quantity, or null to clear."},"note":{"type":"string","description":"Reason (≤ 500 chars).","maxLength":500}},"required":["takeoff_id","item_id"],"additionalProperties":false},"annotations":{"title":"Review an item","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"create_export","title":"Export a takeoff","description":"Export a completed takeoff as CSV, Excel (xlsx) or JSON. Returns a time-limited download link.","inputSchema":{"type":"object","properties":{"takeoff_id":{"type":"string","description":"Takeoff id (tko_…)","pattern":"^tko_[0-9A-Za-z]{22}$"},"format":{"type":"string","enum":["csv","xlsx","json"]},"accepted_only":{"type":"boolean","description":"Only items marked accepted.","default":false},"units":{"type":"string","enum":["imperial","metric","as_drawn"],"default":"as_drawn","description":"Unit system for quantities."}},"required":["takeoff_id","format"],"additionalProperties":false},"annotations":{"title":"Export a takeoff","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"get_usage","title":"Credits and usage","description":"Credit balance (in credits) and usage for a date range, grouped by day, operation, client, user, surface or end customer.","inputSchema":{"type":"object","properties":{"from":{"type":"string","description":"Start date YYYY-MM-DD (default: 30 days ago)."},"to":{"type":"string","description":"End date YYYY-MM-DD (default: today)."},"group_by":{"type":"string","enum":["day","surface","agent","client","user","operation","end_customer"],"default":"day"}},"required":[],"additionalProperties":false},"annotations":{"title":"Credits and usage","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"delete_project","title":"Delete a project","description":"Permanently delete a project and all of its documents and takeoffs. Always confirm with the user first.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project id (prj_…)","pattern":"^prj_[0-9A-Za-z]{22}$"},"confirm":{"type":"boolean","description":"Must be true."}},"required":["project_id","confirm"],"additionalProperties":false},"annotations":{"title":"Delete a project","readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}},{"name":"delete_document","title":"Delete a document","description":"Permanently delete a document and its takeoffs. Always confirm with the user first.","inputSchema":{"type":"object","properties":{"document_id":{"type":"string","description":"Document id (doc_…)","pattern":"^doc_[0-9A-Za-z]{22}$"},"confirm":{"type":"boolean","description":"Must be true."}},"required":["document_id","confirm"],"additionalProperties":false},"annotations":{"title":"Delete a document","readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}},{"name":"get_upload_link","title":"Get a link to upload a drawing","description":"Start here when the user attaches or mentions a drawing (PDF, DWG or DXF) and wants a takeoff, quantities, schedules or a CAD file. Returns a secure one-hour link where the user uploads the drawing from their own computer — needed whenever the file is attached in chat or on their computer, because chat attachments do not reach Aginera and you cannot send file bytes yourself (a Google Drive or Dropbox share link can go straight to add_document instead). Give the link to the user, ask them to open it, drop the file and tell you when it is done; then call list_documents(project_id, latest=true) and get_document until status is \"ready\". Pass project_id to add to an existing project, or project_name to create/reuse a project with that name (default \"Uploaded from Claude — <date>\"). Free.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"Existing project id (prj_…). Omit to create a project.","pattern":"^prj_[0-9A-Za-z]{22}$"},"project_name":{"type":"string","description":"Name for a new project when project_id is omitted (an existing project with exactly this name is reused).","maxLength":200},"note":{"type":"string","description":"Optional note saved on the uploaded document (≤ 200 chars).","maxLength":200}},"required":[],"additionalProperties":false},"annotations":{"title":"Get a link to upload a drawing","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"convert_pdf_to_cad","title":"Check a PDF drawing for CAD conversion","description":"Check whether a PDF drawing in a project can be converted to editable CAD (DWG/DXF) and what it costs this user — the same converter and prices as aginera.ai/tools/pdf-to-cad. Vector PDFs convert line-for-line; scans are traced. Pricing: DXF of every sheet is free (watermarked on free accounts); a clean DWG is a one-time $2 purchase per document (or credits for paying customers); files over 50 MB are part of that purchase; paid plans are not charged. Does not convert or charge anything. Get the PDF into Aginera first — get_upload_link if it is attached in chat or on the user's computer, add_document for a link — and wait for get_document status \"ready\"; then call get_cad_file.","inputSchema":{"type":"object","properties":{"document_id":{"type":"string","description":"Document (a PDF) id (doc_…)","pattern":"^doc_[0-9A-Za-z]{22}$"}},"required":["document_id"],"additionalProperties":false},"annotations":{"title":"Check a PDF drawing for CAD conversion","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_cad_file","title":"Get the converted CAD file (DXF or DWG)","description":"Convert a ready PDF document and return a time-limited download link (valid ~60 minutes) for the DXF or DWG. Conversion can take up to ~3 minutes for large sets. DXF (default) is free for everyone — watermarked on free accounts. DWG, or any file over 50 MB, is a one-time $2 purchase per document: without `pay` this returns status \"purchase_required\" with the price and nothing is charged. Only after the user explicitly agrees to pay: pay=\"credits\" pays the $2 from their Aginera credits (paying customers) and returns the clean file; pay=\"checkout\" returns a Stripe checkout_url for the USER to open and complete in their browser — never complete a checkout or enter payment details for them. After they pay, call again without `pay`.","inputSchema":{"type":"object","properties":{"document_id":{"type":"string","description":"Document (a PDF) id (doc_…)","pattern":"^doc_[0-9A-Za-z]{22}$"},"format":{"type":"string","enum":["dxf","dwg"],"default":"dxf","description":"dxf = free (watermarked on free accounts); dwg = the $2 purchase unless already bought or on a paid plan."},"pay":{"type":"string","enum":["credits","checkout"],"description":"Only after the user said yes to paying $2: \"credits\" = pay from their credit balance; \"checkout\" = return a Stripe link for them to pay. Omit to just get the file or the price."}},"required":["document_id"],"additionalProperties":false},"annotations":{"title":"Get the converted CAD file (DXF or DWG)","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"render_floor_plan","title":"Render a floor plan (dollhouse + room images)","description":"Turn a floor-plan PDF into a furnished 3D dollhouse cutaway, a rendered floor plan and AI room images — the same \"Upload a floor plan → 3D\" flow as aginera.ai, on the user's own account. The document must be a ready PDF in a project (add_document first). Reading the plan takes 2–6 minutes and rendering another 3–10; returns immediately with a render id — poll get_floor_plan_render every ~60 s. Uses the account's credits / free allowance exactly as the web app does (the first reveal on a free account is usually included; the run is refused with insufficient_credits or spend_cap_reached otherwise). For a multi-sheet set, pass `pages` (the floor-plan sheets) or Aginera will look for them itself. Ask the user before starting.","inputSchema":{"type":"object","properties":{"document_id":{"type":"string","description":"Document id (doc_…)","pattern":"^doc_[0-9A-Za-z]{22}$"},"pages":{"type":"array","items":{"type":"integer","minimum":1},"maxItems":200,"description":"1-based page numbers of the floor plans (omit for a small plan-only PDF)."}},"required":["document_id"],"additionalProperties":false},"annotations":{"title":"Render a floor plan (dollhouse + room images)","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_floor_plan_render","title":"Get a floor-plan render (status + images)","description":"Status of a render started with render_floor_plan and, once completed, the image URLs (dollhouse, floor plan, per-room images, film if purchased). Statuses: processing (keep polling), completed, no_renders (Aginera found no measurable floor plan — same outcome the web app gives; the message says what to try), failed (see failure.next_step), expired. Image URLs are time-limited; call again for fresh ones.","inputSchema":{"type":"object","properties":{"render_id":{"type":"string","description":"Render id (rvl_…)","pattern":"^rvl_[0-9A-Za-z]{22}$"}},"required":["render_id"],"additionalProperties":false},"annotations":{"title":"Get a floor-plan render (status + images)","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_floor_plan_renders","title":"Get a project's renders and purchase options","description":"Everything rendered for a project (dollhouse, floor plan, room images, film) as the web reveal page shows it, plus `purchases.offers` — the one-off add-ons the user can buy for it (every room, the full house film, a dollhouse remix) with USD prices — and `purchases.owned`. Use this to answer \"what images do I have\" and to explain what a purchase would add before calling create_render_checkout.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project id (prj_…)","pattern":"^prj_[0-9A-Za-z]{22}$"}},"required":["project_id"],"additionalProperties":false},"annotations":{"title":"Get a project's renders and purchase options","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"create_render_checkout","title":"Start a purchase (every room / house film / dollhouse remix)","description":"Create the same Stripe checkout the web reveal page offers and return the payment link for the USER to complete in their browser — the agent must never pay or enter card details. SKUs: image_pack — House Image Pack — every room of this project rendered (unlocks the locked room tiles); house_package — Full house package — cinematic walkthrough film of every room plus AI room images; dollhouse_remix — Two edited views of the dollhouse from your own instruction (needs `prompt`). Requires a completed render on the project first. Always confirm the purchase and price with the user before calling. After payment the images/film generate automatically (10–20 min) and show up in get_floor_plan_renders; the user is also emailed.","inputSchema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project id (prj_…)","pattern":"^prj_[0-9A-Za-z]{22}$"},"sku":{"type":"string","enum":["image_pack","house_package","dollhouse_remix"],"description":"Which add-on."},"prompt":{"type":"string","description":"For dollhouse_remix only: the user's own instruction for the two edited views (3–500 chars).","minLength":3,"maxLength":500}},"required":["project_id","sku"],"additionalProperties":false},"annotations":{"title":"Start a purchase (every room / house film / dollhouse remix)","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}}],"pricing":{"summary":"Same prices as aginera.ai. Takeoffs use the account's credits (free allowance on new accounts). PDF→CAD: DXF of every sheet is free (watermarked on free accounts); a clean DWG is a one-time $2 purchase per document (or credits for paying customers); files over 50 MB are part of that purchase; paid plans are not charged. Agents never pay on the user's behalf without their explicit yes — card payments are Stripe links the user completes.","url":"https://aginera.ai/pricing"},"provider":{"name":"Kamna Ventures, LLC (Aginera)","url":"https://aginera.ai","support":"support@aginera.ai"}}