{"serverInfo":{"name":"portravo","version":"1.1.0","title":"Portravo"},"description":"Construction plan takeoffs and reviewed estimates for a connected Portravo account: create a project, attach a plan PDF, run a paid takeoff with existing credits, read quantities and export the reviewed estimate.","url":"https://portravo.com/mcp","transport":{"type":"streamable-http","endpoint":"https://portravo.com/mcp"},"protocolVersion":"2025-11-25","protocolVersions":["2025-03-26","2025-06-18","2025-11-25"],"capabilities":{"tools":{}},"authentication":{"required":true,"schemes":["oauth2"],"resourceMetadata":"https://portravo.com/.well-known/oauth-protected-resource/mcp"},"documentationUrl":"https://portravo.com/developers/mcp","instructions":"Use Portravo for construction plan takeoffs and reviewed estimates. Account linking is required for every tool except list_pricing_markets and preflight_takeoff without project_id, which show markets, trades and published prices before linking. Start with preflight_takeoff to discover automated trades and existing-credit requirements. Customer create_project requires explicit trades. Before run_takeoff, read the project preflight and obtain approval for its exact trades and creditsRequired; pass confirmed_trades and max_credits with confirm_credit_use=true. Starts never purchase credits or bill overage. Use get_takeoff_status for asynchronous progress; do not retry with a new key while a run is pending. The synthetic reviewer retains its separately bounded standard-engine fixture and does not establish customer takeoff2 accuracy. Use list_pricing_markets to choose a metro_code for create_project. list_projects returns 50 projects a page; to read the next page, pass its nextOffset as offset. To attach a plan, prefer the host-provided file link (plan). Use plan_inline only for the exact bytes of a PDF the user uploaded, up to 32 KiB; never recreate document bytes from text or invent a URL. If a plan PDF cannot be attached from chat, for example a larger PDF without a file link, do not call attach_plan_pdf: give the user the project's reviewUrl to upload it in Portravo (streaming up to 50 MiB for selected automatic trades; direct MCP transfer stays 10 MiB), then use get_takeoff to confirm the file and run_takeoff. Use a stable idempotency_key for each write and reuse it when retrying. Use get_takeoff to summarize quantities or find lines pending review. Human review and pricing in Portravo are required before XLSX export; if export_reviewed_estimate reports review_required, give the user the review link so they can finish quantities, assembly mappings and pricing there.","tools":[{"name":"preflight_takeoff","title":"Check trade availability and existing credits","description":"Before creating or starting a takeoff, inspect current automatic/team-assisted trades, the exact existing-credit requirement, balance, upload limits, published prices and review link. Supply either project_id or proposed trades, or neither to discover availability. Works before account linking without project_id: trades, credit rule and prices only, with existingCreditsAvailable null and accountLinked false. Does not reserve credits, start work, buy anything or bill overage. Reviewer scope is identified separately.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"project_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"},"trades":{"minItems":1,"maxItems":9,"type":"array","items":{"type":"string","enum":["electrical","framing","mechanical","plumbing","landscape","painting","concrete","roofing","drywall","whole_job"]}}},"additionalProperties":false},"outputSchema":{"type":"object","properties":{"creditsRequired":{"type":"integer"},"existingCreditsAvailable":{"type":["integer","null"]},"accountLinked":{"type":"boolean"},"pricing":{"type":"object"},"mayStart":{"type":"boolean"},"trades":{"type":"array","items":{"type":"string"}},"catalog":{"type":"array","items":{"type":"object"}}},"required":["creditsRequired","existingCreditsAvailable","mayStart","trades","catalog"]},"annotations":{"title":"Check trade availability and existing credits","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["projects:read","offline_access"]},{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["projects:read","offline_access"]},{"type":"noauth"}]}},{"name":"get_takeoff_status","title":"Read takeoff progress","description":"Read an owned project and its latest asynchronous takeoff progress, completion limitations and review link. Never advances or restarts a run, uses credits or changes billing. Poll this tool after run_takeoff returns a running result.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"project_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"}},"required":["project_id"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"projectId":{"type":"string"},"projectStatus":{"type":"string"},"run":{"type":["object","null"]},"reviewUrl":{"type":"string"},"reviewRequired":{"type":"boolean"}},"required":["projectId","projectStatus","run","reviewUrl","reviewRequired"]},"annotations":{"title":"Read takeoff progress","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["projects:read","offline_access"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["projects:read","offline_access"]}]}},{"name":"get_profile","title":"Connected Portravo account","description":"Identify the signed-in Portravo account after OAuth account linking.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}},"required":["id"],"additionalProperties":false},"annotations":{"title":"Connected Portravo account","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["projects:read","offline_access"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["projects:read","offline_access"]}],"openai/profile":true}},{"name":"list_projects","title":"List construction projects","description":"Find construction projects in the connected Portravo account, including draft, review, priced and final estimates. Returns 50 projects per page; nextOffset is the offset of the next page, or null on the last page.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"offset":{"type":"integer","minimum":0,"maximum":999999}},"additionalProperties":false},"outputSchema":{"type":"object","properties":{"projects":{"type":"array","items":{"type":"object"}},"nextOffset":{"type":["integer","null"]}},"required":["projects","nextOffset"]},"annotations":{"title":"List construction projects","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["projects:read","offline_access"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["projects:read","offline_access"]}]}},{"name":"get_takeoff","title":"Read a plan takeoff","description":"Read an owned construction project's plan files (attached from chat or uploaded in Portravo) and extracted takeoff quantities, trades, confidence and human review status. reviewRequired reports whether any line still needs estimator review. Quantities require estimator review before pricing or bidding.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"project_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"}},"required":["project_id"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"project":{"type":"object"},"lines":{"type":"array","items":{"type":"object"}},"files":{"type":"array","items":{"type":"object"}},"metro":{"type":["object","null"]},"reviewRequired":{"type":"boolean"},"reviewUrl":{"type":"string"}},"required":["project","lines","files","reviewRequired","reviewUrl"]},"annotations":{"title":"Read a plan takeoff","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["projects:read","offline_access"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["projects:read","offline_access"]}]}},{"name":"list_pricing_markets","title":"Supported pricing markets","description":"List the regional construction pricing markets supported by Portravo. The returned markets are the accepted metro_code values for create_project. Works before account linking (the standard markets by code, name and state, marked accountLinked false; a linked account also sees local markets and cost indexes).","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false},"outputSchema":{"type":"object","properties":{"metros":{"type":"array","items":{"type":"object"}},"accountLinked":{"type":"boolean"},"note":{"type":"string"}},"required":["metros"]},"annotations":{"title":"Supported pricing markets","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["projects:read","offline_access"]},{"type":"noauth"}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["projects:read","offline_access"]},{"type":"noauth"}]}},{"name":"create_project","title":"Create a takeoff project","description":"Create a new construction estimate project in the connected Portravo account from a project name, an explicit trades selection returned by preflight_takeoff, an optional address and an optional supported metro_code. Trades are required for customer projects; only the isolated synthetic reviewer may omit them. Repeating a call with the same idempotency_key returns the original project instead of creating another. Returns reviewUrl, the project page where the user can also upload a plan PDF in the browser. Does not run extraction or consume estimate credits.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"address":{"type":"string","maxLength":200},"metro_code":{"type":"string","minLength":1,"maxLength":40},"trades":{"minItems":1,"maxItems":9,"type":"array","items":{"type":"string","enum":["electrical","framing","mechanical","plumbing","landscape","painting","concrete","roofing","drywall","whole_job"]}},"idempotency_key":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9_.:-]+$"}},"required":["name","idempotency_key"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"reviewUrl":{"type":"string"}},"required":["id","status","reviewUrl"]},"annotations":{"title":"Create a takeoff project","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["projects:write","offline_access"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["projects:write","offline_access"]}]}},{"name":"attach_plan_pdf","title":"Attach a construction plan PDF","description":"Attach a PDF the user selected in this conversation as the first plan for a new Portravo project. Plan PDFs must be 10 MiB or smaller. Accepts exactly one of plan, a host-provided download_url and file_id, or plan_inline, canonical base64 of the exact user-uploaded PDF bytes with file_name and application/pdf mime_type, up to 32 KiB. A PDF with no file link above 32 KiB, or any PDF above the direct limit, is uploaded in the browser at the project's reviewUrl instead. That browser path streams up to 50 MiB for the selected automatic trades. Projects that already have a plan or review work are refused, so existing work is never replaced. Repeating a call with the same idempotency_key returns the original result. Stores the selected PDF privately in the connected account; does not extract or consume credits.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"project_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"},"plan":{"description":"Host-provided signed file link for a PDF the user attached (PDF up to 10 MiB).","type":"object","properties":{"download_url":{"type":"string","maxLength":8192,"format":"uri"},"file_id":{"type":"string","minLength":1,"maxLength":256},"mime_type":{"type":"string","const":"application/pdf"},"file_name":{"type":"string","minLength":5,"maxLength":200,"pattern":"^[^/\\\\\\x00-\\x1f]+\\.pdf$"}},"required":["download_url","file_id"],"additionalProperties":false},"plan_inline":{"description":"Exact bytes of a user-uploaded PDF as canonical base64, only when no file link exists. PDF up to 32 KiB.","type":"object","properties":{"data_base64":{"type":"string","minLength":4,"maxLength":43692},"mime_type":{"type":"string","const":"application/pdf"},"file_name":{"type":"string","minLength":5,"maxLength":200,"pattern":"^[^/\\\\\\x00-\\x1f]+\\.pdf$"}},"required":["data_base64","mime_type","file_name"],"additionalProperties":false},"idempotency_key":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9_.:-]+$"}},"required":["project_id","idempotency_key"],"additionalProperties":false,"oneOf":[{"required":["plan"],"not":{"required":["plan_inline"]}},{"required":["plan_inline"],"not":{"required":["plan"]}}]},"outputSchema":{"type":"object","properties":{"planFileId":{"type":"string"},"status":{"type":"string"},"reviewUrl":{"type":"string"}},"required":["planFileId","status","reviewUrl"]},"annotations":{"title":"Attach a construction plan PDF","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["plans:write","offline_access"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["plans:write","offline_access"]}],"openai/fileParams":["plan"]}},{"name":"run_takeoff","title":"Extract a construction plan takeoff","description":"Run the initial AI takeoff for a new project whose plan PDF was attached with attach_plan_pdf or uploaded by the user on the project page in Portravo. Call preflight_takeoff first and obtain approval for its selected trades and creditsRequired. Set confirmed_trades to the approved selection and max_credits to that approved ceiling (defaults to one for older clients). Uses only existing plan allowance and purchased credits, never billed overage; a changed selection/cost or insufficient balance is refused before starting. The isolated synthetic reviewer retains its bounded one-credit standard fixture. Repeating a call with the same idempotency_key does not charge again. Returns asynchronous progress; use get_takeoff_status until done, then get_takeoff for source-linked human review. A completed run is not a bid-ready estimate. Failed provider runs refund the reservation; existing review work cannot be overwritten.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"project_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"},"confirm_credit_use":{"type":"boolean","const":true},"max_credits":{"type":"integer","minimum":0,"maximum":3},"confirmed_trades":{"minItems":1,"maxItems":9,"type":"array","items":{"type":"string","enum":["electrical","framing","mechanical","plumbing","landscape","painting","concrete","roofing","drywall","whole_job"]}},"idempotency_key":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[A-Za-z0-9_.:-]+$"}},"required":["project_id","confirm_credit_use","idempotency_key"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"ok":{"type":"boolean"},"lines":{"type":"integer"},"sheets":{"type":"array","items":{"type":"string"}},"scopeNotes":{"type":"string"}},"required":["ok","lines","sheets","scopeNotes"]},"annotations":{"title":"Extract a construction plan takeoff","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"securitySchemes":[{"type":"oauth2","scopes":["extractions:write","offline_access"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["extractions:write","offline_access"]}]}},{"name":"export_reviewed_estimate","title":"Download a reviewed estimate workbook","description":"Get a short-lived Excel XLSX download for an owned Portravo estimate after every takeoff line has been reviewed and the estimate is priced or final. If review is incomplete, the call returns a review_required error with the Portravo review link, where quantities, assembly mappings and pricing are completed. Never exports unreviewed estimates.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"project_id":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9_-]+$"}},"required":["project_id"],"additionalProperties":false},"outputSchema":{"type":"object","properties":{"downloadUrl":{"type":"string"},"filename":{"type":"string"},"mimeType":{"type":"string"},"expiresAt":{"type":"string"},"reviewUrl":{"type":"string"}},"required":["downloadUrl","filename","mimeType","expiresAt","reviewUrl"]},"annotations":{"title":"Download a reviewed estimate workbook","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"securitySchemes":[{"type":"oauth2","scopes":["estimates:read","offline_access"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["estimates:read","offline_access"]}]}}]}