{"name":"contents-team","title":"Contents.team","description":"Photos in, an itemized, priced contents inventory out. Create claims, add photos, review and approve the inventory and export reports.","endpoint":"https://contents.team/api/mcp","transport":"streamable-http","authentication":{"type":"bearer","description":"An org API key (ctk_test_... or ctk_live_...), or an OAuth access token, as \"Authorization: Bearer <credential>\". OAuth clients discover the authorization server from the 401 WWW-Authenticate challenge. Each tool needs the scopes listed with it.","resourceMetadata":"https://contents.team/.well-known/oauth-protected-resource/api/mcp","docs":"https://developers.contents.team/mcp"},"tools":[{"name":"list_claims","title":"List claims","description":"List the organization's claims, newest first, with item counts and approved RCV in cents. Filter by externalRef (your own id) or updatedSince; page with cursor.","scopes":["claims:read"],"readOnly":true,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"limit":{"description":"Page size, 1-100 (default 25).","type":"integer","minimum":1,"maximum":100},"cursor":{"description":"`nextCursor` from the previous page.","type":"string","minLength":1,"maxLength":64},"externalRef":{"description":"Only claims with this externalRef.","type":"string","minLength":1,"maxLength":255},"updatedSince":{"description":"Only claims whose record changed at or after this instant.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"additionalProperties":false}},{"name":"create_claim","title":"Create a claim","description":"Open a claim with the insured, loss address, loss type and date of loss, and your own externalRef. Returns the claim and its clm_ id. Pass a fresh idempotencyKey for each new claim and reuse it when retrying, so a retry never opens a second claim.","scopes":["claims:write"],"readOnly":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"externalRef":{"description":"Your own id for this claim; filter on it with GET /api/v1/claims?externalRef=. Not unique.","anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}]},"claimNumber":{"description":"The carrier claim number, shown as the claim's label in the app.","anyOf":[{"type":"string","minLength":1,"maxLength":100},{"type":"null"}]},"insuredName":{"description":"The policyholder (your customer).","anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}]},"lossAddress":{"anyOf":[{"type":"string","minLength":1,"maxLength":1000},{"type":"null"}]},"lossType":{"anyOf":[{"type":"string","enum":["Fire","Water","Wind","Other"]},{"type":"null"}]},"dateOfLoss":{"description":"YYYY-MM-DD.","anyOf":[{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},{"type":"null"}]},"insuranceCompany":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}]},"policyNumber":{"anyOf":[{"type":"string","minLength":1,"maxLength":100},{"type":"null"}]},"salesTaxBp":{"description":"Sales tax in basis points (825 = 8.25%).","anyOf":[{"type":"integer","minimum":0,"maximum":10000},{"type":"null"}]},"idempotencyKey":{"description":"Optional but recommended: a unique key (a UUID, say; 1-255 visible ASCII characters) for this one action. If the call fails or times out, retry with the same key and the same arguments: you get the first result back instead of a duplicate. Use a new key for a new action; reusing a key with different arguments is an error. Keys last 24 hours.","type":"string","pattern":"^[\\x21-\\x7e]{1,255}$"}},"additionalProperties":false}},{"name":"add_photos","title":"Add photos","description":"Add up to 10 photos to a claim by public https URL, optionally filed by room name. Each photo is analyzed and its items drafted and priced; poll get_claim_status for progress. Pass a fresh idempotencyKey for each batch and reuse it when retrying, so a retry never adds the photos twice.","scopes":["photos:write"],"readOnly":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"claimId":{"type":"string","minLength":1,"maxLength":64,"description":"The claim's clm_ id (from create_claim or list_claims)."},"photos":{"minItems":1,"maxItems":10,"type":"array","items":{"type":"object","properties":{"url":{"type":"string","maxLength":2048,"format":"uri","description":"Public https URL of a JPEG, PNG, WebP or HEIC image, at most 20 MB. Fetched once, server-side."},"roomName":{"type":"string","minLength":1,"maxLength":100,"description":"Room to file the photo under; created on the claim if it does not exist yet."},"externalId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9._:-]+$","description":"Your own id for the photo, echoed back; also picks the test-mode fixture set."}},"required":["url"],"additionalProperties":false}},"idempotencyKey":{"description":"Optional but recommended: a unique key (a UUID, say; 1-255 visible ASCII characters) for this one action. If the call fails or times out, retry with the same key and the same arguments: you get the first result back instead of a duplicate. Use a new key for a new action; reusing a key with different arguments is an error. Keys last 24 hours.","type":"string","pattern":"^[\\x21-\\x7e]{1,255}$"}},"required":["claimId","photos"],"additionalProperties":false}},{"name":"get_claim_status","title":"Get claim status","description":"How far a claim has got: photos received, queued, analyzing, analyzed and failed; items drafted, awaiting review, approved and rejected; approved RCV, ACV and payment totals in cents.","scopes":["claims:read"],"readOnly":true,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"claimId":{"type":"string","minLength":1,"maxLength":64,"description":"The claim's clm_ id (from create_claim or list_claims)."}},"required":["claimId"],"additionalProperties":false}},{"name":"get_inventory","title":"Get the inventory","description":"The claim's line items: room, description, quantity, condition, status, unit cost in cents, and each line's RCV, depreciation (basis points and cents) and ACV. priced and needsReview say what still needs a person. Filter by status, needsReview, priced or room; page with cursor.","scopes":["items:read"],"readOnly":true,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"limit":{"description":"Page size, 1-100 (default 100).","type":"integer","minimum":1,"maximum":100},"cursor":{"description":"`nextCursor` from the previous page.","type":"string","minLength":1,"maxLength":64},"status":{"description":"Only items with this status (approved items are the ones that count toward totals).","type":"string","enum":["pending","low_confidence","reviewing","approved","rejected"]},"needsReview":{"description":"true: only items waiting on a person to approve or reject (pending or low_confidence).","type":"boolean"},"priced":{"description":"false: only items with no price yet (they cannot be approved until priced).","type":"boolean"},"roomId":{"description":"Only items filed in this room (rom_ id).","type":"string","minLength":1,"maxLength":64},"updatedSince":{"description":"Only items changed at or after this instant.","type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"claimId":{"type":"string","minLength":1,"maxLength":64,"description":"The claim's clm_ id (from create_claim or list_claims)."}},"required":["claimId"],"additionalProperties":false}},{"name":"export_report","title":"Export a report","description":"Generate the XactContents-format XLSX (default), the PDF report or a photo ZIP for a claim. Waits up to 20 seconds and returns the download link when ready; otherwise call again with the returned exportId. Pass a fresh idempotencyKey for each new export and reuse it when retrying, so a retry never starts a second export.","scopes":["exports:write"],"readOnly":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"claimId":{"description":"Start a new export of this claim (clm_ id). Omit when checking on an exportId.","type":"string","minLength":1,"maxLength":64},"format":{"description":"xlsx = the XactContents-format inventory spreadsheet (default); pdf = the inventory report; photo_zip = every photo.","type":"string","enum":["pdf","xlsx","photo_zip"]},"exportId":{"description":"Check on an export started earlier (exp_ id) instead of starting one.","type":"string","minLength":1,"maxLength":64},"idempotencyKey":{"description":"Optional but recommended: a unique key (a UUID, say; 1-255 visible ASCII characters) for this one action. If the call fails or times out, retry with the same key and the same arguments: you get the first result back instead of a duplicate. Use a new key for a new action; reusing a key with different arguments is an error. Keys last 24 hours. Applies when starting an export; ignored with exportId.","type":"string","pattern":"^[\\x21-\\x7e]{1,255}$"}},"additionalProperties":false}},{"name":"get_replacements","title":"Get replacement offers","description":"The replacement finder's offers for one item from its latest search, best first: title, retailer, price in cents, link and image, with proposed marking the finder's pick. Each has an rpl_ id for accept_replacement.","scopes":["items:read"],"readOnly":true,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"itemId":{"type":"string","minLength":1,"maxLength":64,"description":"The item's itm_ id (from get_inventory)."}},"required":["itemId"],"additionalProperties":false}},{"name":"update_item","title":"Update an item","description":"Edit one item the way the app does: name, model, quantity, unitCostCents (integer cents; null removes the price), priceSource, priceSourceUrl, roomId, condition, estimatedAgeYears, notes. Returns the item, revalued. An item still being priced is refused (item_locked). Pass a fresh idempotencyKey for each edit and reuse it when retrying.","scopes":["items:write"],"readOnly":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":1000,"description":"The line's text as the claim shows it. Setting it replaces a retailer title chosen earlier."},"model":{"description":"Make and model, if known.","anyOf":[{"type":"string","maxLength":255},{"type":"null"}]},"quantity":{"type":"integer","minimum":1,"maximum":100000,"description":"1-100000."},"unitCostCents":{"description":"Replacement price for one, in integer cents; null removes the price (the item is then unpriced and cannot be approved).","anyOf":[{"type":"integer","minimum":0,"maximum":9999999999,"description":"Replacement price for one, in integer cents (12999 = $129.99). Quantity x unit cost must stay within $99,999,999.99."},{"type":"null"}]},"priceSource":{"description":"Where the price came from (a retailer name).","anyOf":[{"type":"string","maxLength":255},{"type":"null"}]},"priceSourceUrl":{"description":"The listing the price came from. Google search links are dropped, as in the app.","anyOf":[{"type":"string","maxLength":2048,"format":"uri"},{"type":"null"}]},"roomId":{"description":"rom_ id of a room on the same claim (GET /api/v1/claims/{claimId}/rooms); null takes the item out of its room.","anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]},"condition":{"anyOf":[{"type":"string","enum":["New","Above Average","Average","Below Average"]},{"type":"null"}]},"estimatedAgeYears":{"description":"Age in years, to a tenth (2.5). Drives depreciation.","type":["number","null"]},"notes":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"itemId":{"type":"string","minLength":1,"maxLength":64,"description":"The item's itm_ id (from get_inventory)."},"idempotencyKey":{"description":"Optional but recommended: a unique key (a UUID, say; 1-255 visible ASCII characters) for this one action. If the call fails or times out, retry with the same key and the same arguments: you get the first result back instead of a duplicate. Use a new key for a new action; reusing a key with different arguments is an error. Keys last 24 hours.","type":"string","pattern":"^[\\x21-\\x7e]{1,255}$"}},"required":["itemId"],"additionalProperties":false}},{"name":"approve_items","title":"Approve items","description":"Approve up to 1000 items of a claim, as bulk approval in the app does; only approved items count toward totals and exports. Reports each id as approved, alreadyApproved, locked (still being priced), skipped (with a reason, e.g. unpriced) or notFound. Pass a fresh idempotencyKey for each approval and reuse it when retrying.","scopes":["items:write"],"readOnly":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"claimId":{"type":"string","minLength":1,"maxLength":64,"description":"The claim's clm_ id (from create_claim or list_claims)."},"itemIds":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"description":"itm_ ids of items on this claim, 1-1000."},"idempotencyKey":{"description":"Optional but recommended: a unique key (a UUID, say; 1-255 visible ASCII characters) for this one action. If the call fails or times out, retry with the same key and the same arguments: you get the first result back instead of a duplicate. Use a new key for a new action; reusing a key with different arguments is an error. Keys last 24 hours.","type":"string","pattern":"^[\\x21-\\x7e]{1,255}$"}},"required":["claimId","itemIds"],"additionalProperties":false}},{"name":"accept_replacement","title":"Accept a replacement offer","description":"Price an item from one of its offers (an rpl_ id from get_replacements) and approve it in one step, as accepting in the app does. The price and quantity come from the offer; if the listing unit count is unclear the call asks you to confirm a quantity (quantity plus quantityConfirmed: true). Pass a fresh idempotencyKey and reuse it when retrying.","scopes":["items:write"],"readOnly":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"quantity":{"description":"Only when the finder could not tell how many units the listing covers: the quantity you are confirming. Send it with quantityConfirmed: true.","type":"integer","minimum":1,"maximum":100000},"quantityConfirmed":{"type":"boolean","const":true},"keepItemTitle":{"description":"Adopt the listing's price and source but keep the item's own title.","type":"boolean","const":true},"itemId":{"type":"string","minLength":1,"maxLength":64,"description":"The item's itm_ id (from get_inventory)."},"replacementId":{"type":"string","minLength":1,"maxLength":64,"description":"The offer's rpl_ id (from get_replacements)."},"idempotencyKey":{"description":"Optional but recommended: a unique key (a UUID, say; 1-255 visible ASCII characters) for this one action. If the call fails or times out, retry with the same key and the same arguments: you get the first result back instead of a duplicate. Use a new key for a new action; reusing a key with different arguments is an error. Keys last 24 hours.","type":"string","pattern":"^[\\x21-\\x7e]{1,255}$"}},"required":["itemId","replacementId"],"additionalProperties":false}},{"name":"add_item","title":"Add an item","description":"Add an item the AI missed, as manual add in the app does: name, optional model, quantity (default 1), unitCostCents (integer cents; omit to add it unpriced), roomId, condition, estimatedAgeYears, notes. Returns the new item. idempotencyKey is required: send a fresh one per item and reuse it when retrying, so a retry never adds (and bills) a second item.","scopes":["items:write"],"readOnly":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":1000,"description":"The line's text as the claim shows it. Setting it replaces a retailer title chosen earlier."},"model":{"description":"Make and model, if known.","anyOf":[{"type":"string","maxLength":255},{"type":"null"}]},"quantity":{"default":1,"description":"1-100000, default 1.","type":"integer","minimum":1,"maximum":100000},"unitCostCents":{"description":"Replacement price for one, in integer cents. Omit to add the item unpriced.","anyOf":[{"type":"integer","minimum":0,"maximum":9999999999,"description":"Replacement price for one, in integer cents (12999 = $129.99). Quantity x unit cost must stay within $99,999,999.99."},{"type":"null"}]},"roomId":{"description":"rom_ id of a room on the same claim (GET /api/v1/claims/{claimId}/rooms); null takes the item out of its room.","anyOf":[{"type":"string","minLength":1,"maxLength":64},{"type":"null"}]},"condition":{"anyOf":[{"type":"string","enum":["New","Above Average","Average","Below Average"]},{"type":"null"}]},"estimatedAgeYears":{"description":"Age in years, to a tenth (2.5). Drives depreciation.","type":["number","null"]},"notes":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"claimId":{"type":"string","minLength":1,"maxLength":64,"description":"The claim's clm_ id (from create_claim or list_claims)."},"idempotencyKey":{"type":"string","pattern":"^[\\x21-\\x7e]{1,255}$","description":"Required for add_item: a unique key (a UUID, say) for this one item. Retry with the same key and arguments and you get the first item back instead of a second one."}},"required":["name","claimId","idempotencyKey"],"additionalProperties":false}},{"name":"delete_item","title":"Delete an item","description":"Remove one item from the inventory, as delete in the app does. To keep a record that an item was ruled out, use reject_items instead. Pass a fresh idempotencyKey and reuse it when retrying.","scopes":["items:write"],"readOnly":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"itemId":{"type":"string","minLength":1,"maxLength":64,"description":"The item's itm_ id (from get_inventory)."},"idempotencyKey":{"description":"Optional but recommended: a unique key (a UUID, say; 1-255 visible ASCII characters) for this one action. If the call fails or times out, retry with the same key and the same arguments: you get the first result back instead of a duplicate. Use a new key for a new action; reusing a key with different arguments is an error. Keys last 24 hours.","type":"string","pattern":"^[\\x21-\\x7e]{1,255}$"}},"required":["itemId"],"additionalProperties":false}},{"name":"unapprove_items","title":"Unapprove items","description":"Send up to 1000 approved items of a claim back to review, as bulk unapprove in the app does. Pass a fresh idempotencyKey and reuse it when retrying.","scopes":["items:write"],"readOnly":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"claimId":{"type":"string","minLength":1,"maxLength":64,"description":"The claim's clm_ id (from create_claim or list_claims)."},"itemIds":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"description":"itm_ ids of items on this claim, 1-1000."},"idempotencyKey":{"description":"Optional but recommended: a unique key (a UUID, say; 1-255 visible ASCII characters) for this one action. If the call fails or times out, retry with the same key and the same arguments: you get the first result back instead of a duplicate. Use a new key for a new action; reusing a key with different arguments is an error. Keys last 24 hours.","type":"string","pattern":"^[\\x21-\\x7e]{1,255}$"}},"required":["claimId","itemIds"],"additionalProperties":false}},{"name":"reject_items","title":"Reject items","description":"Rule out up to 100 items of a claim (not part of the loss, a duplicate), as rejecting in the app does; rejected items stay on the claim but never count toward totals or exports. Pass a fresh idempotencyKey and reuse it when retrying.","scopes":["items:write"],"readOnly":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"claimId":{"type":"string","minLength":1,"maxLength":64,"description":"The claim's clm_ id (from create_claim or list_claims)."},"itemIds":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":64},"description":"itm_ ids of items on this claim, 1-100."},"idempotencyKey":{"description":"Optional but recommended: a unique key (a UUID, say; 1-255 visible ASCII characters) for this one action. If the call fails or times out, retry with the same key and the same arguments: you get the first result back instead of a duplicate. Use a new key for a new action; reusing a key with different arguments is an error. Keys last 24 hours.","type":"string","pattern":"^[\\x21-\\x7e]{1,255}$"}},"required":["claimId","itemIds"],"additionalProperties":false}}],"scopes":{"claims:read":"List and read claims","claims:write":"Create and update claims","photos:write":"Add photos to claims","items:read":"Read inventory items and prices","exports:write":"Generate report exports","items:write":"Edit, add, delete, approve and reject items"}}