{"name":"landlordos","title":"LandlordOS","description":"UK property management for self-managing landlords. Run a portfolio by chat: properties, tenants, compliance, rent, finances, maintenance and Making Tax Digital. UK law calculators and sourced knowledge work without sign-in.","endpoint":"https://landlord-os.com/api/mcp","transport":"streamable-http","protocol_version":"2025-06-18","auth":{"type":"oauth2","resource_metadata":"https://landlord-os.com/.well-known/oauth-protected-resource","scopes":["email","profile"],"dynamic_client_registration":true},"documentation":"https://landlord-os.com/for-agents","tools":[{"name":"calculate_notice_period","description":"Calculate a Section 8 notice period and the earliest court application date from a service date, under the Renters' Rights Act rules in force since 1 May 2026. Section 21 returns its abolition status. Covers grounds 1, 8, 10 and 11. England","scope":"read","requires_sign_in":false},{"name":"calculate_rental_yield","description":"Calculate gross and net rental yield for a property, with the working shown. The figures can be in any one currency; nothing is converted.","scope":"read","requires_sign_in":false},{"name":"calculate_section24","description":"Calculate the impact of the Section 24 mortgage-interest tax restriction for an individual UK landlord.","scope":"read","requires_sign_in":false},{"name":"lookup_compliance_requirements","description":"Look up landlord compliance requirements (gas safety, EICR, EPC, deposit protection, Right to Rent) with official gov.uk sources. The requirements are the England ones: England is the default, and a property in Wales, Scotland, Northern Ire","scope":"read","requires_sign_in":false},{"name":"lookup_legal_fact","description":"Look up a verified UK landlord legal fact (exact dates, notice periods, tax thresholds, compliance frequencies). Use this FIRST for any question about dates, deadlines, notice periods, thresholds, or rates. Returns answer + source + source ","scope":"read","requires_sign_in":false},{"name":"get_jurisdiction_playbook","description":"Get the landlord-law playbook for one jurisdiction, with the tenancy, deposit and eviction rules in plain English, verified facts each with an official source link, which LandlordOS features apply, and what is not supported. Use it for any ","scope":"read","requires_sign_in":false},{"name":"list_knowledge_topics","description":"List all available knowledge-base articles (slug, title, category). Use when you need to find the right article to cite for a broader legal or practical question that does not have a single-fact answer.","scope":"read","requires_sign_in":false},{"name":"lookup_knowledge","description":"Retrieve the full content of a knowledge-base article by slug. Use AFTER list_knowledge_topics (or when you already know the slug) to ground your answer. ALWAYS cite the article title in your response. Never paraphrase from training data wh","scope":"read","requires_sign_in":false},{"name":"search_help_articles","description":"Search LandlordOS product help articles. Use when a user asks \"how do I...\", \"where is...\", \"what does X do\", or any question about using LandlordOS (not landlord law). Returns matching articles with content.","scope":"read","requires_sign_in":false},{"name":"list_properties","description":"List all properties in the landlord's portfolio with current status, tenant, rent, and address. Each property carries its country, uk_nation, currency and jurisdiction: read the jurisdiction here before answering any legal, tax or complianc","scope":"read","requires_sign_in":true},{"name":"get_property","description":"Get full detail for one property including all compliance items, the active tenancy, and recent transactions. Use when the user asks about a specific property.","scope":"read","requires_sign_in":true},{"name":"list_tenants","description":"List all tenants with their active tenancy info (property, rent, start date). Use when the user asks about tenants, rent collection, or who lives where.","scope":"read","requires_sign_in":true},{"name":"list_compliance","description":"List compliance items (gas safety, EICR, EPC, PAT, legionella, fire safety, HMO licence, or a landlord-defined custom type) with expiry dates. Each item includes a display label (custom_label for a custom type, the standard name otherwise) ","scope":"read","requires_sign_in":true},{"name":"get_finances_summary","description":"Get income, expenses, and net profit for a date range. Use when the user asks about rental income, expenses, profitability, or tax figures.","scope":"read","requires_sign_in":true},{"name":"list_transactions","description":"List recent income/expense transactions with optional filters. Use when user asks about specific payments, spending, or categorisation.","scope":"read","requires_sign_in":true},{"name":"list_tasks","description":"List pending tasks the landlord has to do. Use when user asks about their to-do list, action items, or upcoming work.","scope":"read","requires_sign_in":true},{"name":"list_maintenance_requests","description":"List maintenance/repair requests raised by tenants. Use when user asks about open issues, repairs, or tenant complaints.","scope":"read","requires_sign_in":true},{"name":"check_mtd_status","description":"Check Making Tax Digital connection status and next quarterly submission deadline. Use when user asks about HMRC, MTD, tax deadlines, or quarterly returns.","scope":"read","requires_sign_in":true},{"name":"get_portfolio_stats","description":"Get high-level portfolio stats: count of properties, vacant/rented split, monthly rent roll (one figure per currency when the properties span currencies, never added together), compliance alerts. Use for overview questions or dashboard-styl","scope":"read","requires_sign_in":true},{"name":"get_rent_status","description":"Get the current rent-payment status for each active, monthly tenancy: tenant name, property address, rent amount, due date, amount received this period, status (paid/partial/due/overdue/no_rent_recorded), and days late. A status of no_rent_","scope":"read","requires_sign_in":true},{"name":"get_tax_estimate","description":"Get a rough estimate of the landlord's Income Tax due for the current tax year and how much to set aside per month, based on their transactions so far, their stated tax band, and Section 24 mortgage interest relief. Returns hasAssumption: f","scope":"read","requires_sign_in":true},{"name":"assess_rent_review","description":"Assess whether a tenancy's rent looks under market, using the ONS Price Index of Private Rents (PIPR) local authority growth data. Returns hasAssessment: false with a reason (no_local_data, rent_missing, or too_recent) when an assessment ca","scope":"read","requires_sign_in":true},{"name":"find_property_by_address","description":"Search for an existing property by postal code and/or address fragment. Use this BEFORE creating a property from an uploaded document (tenancy agreement, certificate) to avoid duplicates. Pass the street address only as address_fragment (no","scope":"read","requires_sign_in":true},{"name":"log_feedback","description":"File a user's feature request or bug report onto the LandlordOS product backlog, where it becomes a ticket an engineer picks up. Call this EVERY time a user asks for something the product cannot do, reports something broken or wrong, or giv","scope":"write","requires_sign_in":true},{"name":"get_maintenance_request","description":"Get full detail for one maintenance request including the message thread.","scope":"read","requires_sign_in":true},{"name":"get_tenant","description":"Get full detail for one tenant including their tenancy history.","scope":"read","requires_sign_in":true},{"name":"list_documents","description":"List uploaded documents (statements, certificates, invoices, receipts).","scope":"read","requires_sign_in":true},{"name":"get_property_timeline","description":"Get the merged audit-log timeline for one property: notes, transactions, tasks, compliance records, documents, maintenance, and tenancy events, in chronological order. Use when the user asks \"what's happened at X\", \"show me the history/audi","scope":"read","requires_sign_in":true},{"name":"list_contractors","description":"List the landlord's saved contractors (name, email, phone, trade). Use when the landlord refers to a contractor without giving an email address, e.g. \"email my usual plumber\" or \"the electrician we used before\" — look them up here first, an","scope":"read","requires_sign_in":true},{"name":"list_property_keys","description":"List the key sets logged for a property and who currently holds each one, e.g. \"who has the keys to Flat 2\", \"what keys do we have for 12 High St\". If the property is ambiguous, call find_property_by_address first.","scope":"read","requires_sign_in":true},{"name":"list_inspections","description":"List recent mid-term inspections for a property, with item summaries. Use when the landlord asks about past inspections, what was found last time, or wants a history of visits for a property. If the property is ambiguous, call find_property","scope":"read","requires_sign_in":true},{"name":"list_inbox_messages","description":"List recent emails in the landlord's LandlordOS inbox (their own <name>@landlord-os.com address). Use when the landlord asks about their inbox, messages from tenants or suppliers, enquiries, or emailed-in receipts. Each result includes clas","scope":"read","requires_sign_in":true},{"name":"read_inbox_message","description":"Read one inbox email in full (body text, sender, filed documents, matched property/tenant). Use after list_inbox_messages when the landlord asks what a specific message says, or before drafting a reply to it.","scope":"read","requires_sign_in":true},{"name":"create_task","description":"Create a task/reminder for the landlord. Use when they say \"remind me to...\", \"add a task...\", or you identify something they need to follow up on.","scope":"write","requires_sign_in":true},{"name":"add_transaction","description":"Manually record an income or expense transaction. Use when the user says \"I paid X today\" or wants to log a rent payment outside the statement upload flow. If linking to a property, pass property_address (the address line) as well as proper","scope":"write","requires_sign_in":true},{"name":"add_compliance_item","description":"Add or update a compliance record (gas safety cert, EICR, EPC, PAT, legionella, fire safety, HMO licence, or a custom certificate type) for a property. Use when the user says \"I just had a gas safety cert done\" or needs to log an expiring c","scope":"write","requires_sign_in":true},{"name":"add_property","description":"Add a new property to the portfolio. Use when the user says \"I just bought...\", \"add a new property at...\" etc.","scope":"write","requires_sign_in":true},{"name":"bulk_create_properties","description":"Create multiple properties in one call from an imported property list (CSV upload). Use this ONLY for bulk imports — propose ONE call for the whole import, never create properties one-by-one when the user has uploaded a portfolio CSV. Exclu","scope":"write","requires_sign_in":true},{"name":"update_property","description":"Update details on an existing property (address, country, rent, status, ownership, etc.). Mortgages are managed with add_mortgage / update_mortgage / remove_mortgage, not here. Always pass property_address (the CURRENT address, before this ","scope":"write","requires_sign_in":true},{"name":"add_mortgage","description":"Record a mortgage against a property. A property can have more than one (e.g. a main mortgage plus a further advance or second charge). If the property is ambiguous, call find_property_by_address first — never guess a property id. This is r","scope":"write","requires_sign_in":true},{"name":"update_mortgage","description":"Update one mortgage record. Get the mortgage_id from get_property (which lists a property's mortgages) — never guess an id.","scope":"write","requires_sign_in":true},{"name":"remove_mortgage","description":"Remove a mortgage record from a property, e.g. after remortgaging away from a lender or a data-entry mistake. Get the mortgage_id from get_property — never guess an id.","scope":"write","requires_sign_in":true},{"name":"delete_property","description":"Archive a property (soft delete — reversible). Use when user wants to remove a property they sold or no longer manage. Always pass property_address as well as property_id so it still resolves if the id is stale.","scope":"write","requires_sign_in":true},{"name":"add_tenant","description":"Add a new tenant to the portfolio. Does not create a tenancy — use start_tenancy separately.","scope":"write","requires_sign_in":true},{"name":"update_tenant","description":"Update tenant contact details or notes. Always pass tenant_name (the CURRENT full name, before this edit) as well as tenant_id so it still resolves if the id is stale.","scope":"write","requires_sign_in":true},{"name":"delete_tenant","description":"Archive a tenant (soft delete — reversible). Use when the tenant has moved out and the landlord wants them off the active list. Always pass tenant_name as well as tenant_id so it still resolves if the id is stale.","scope":"write","requires_sign_in":true},{"name":"get_tenant_invite_link","description":"Generate a magic sign-up link for a tenant to access their portal. Returns a URL the landlord can copy to the tenant via WhatsApp, email, or SMS (we do not auto-send).","scope":"write","requires_sign_in":true},{"name":"start_tenancy","description":"Create a new active tenancy linking a tenant to a property. Always pass tenant_name and property_address as well as the ids, so the tenancy resolves correctly even if an id is stale. For a JOINT tenancy, pass every other tenant named on the","scope":"write","requires_sign_in":true},{"name":"add_tenant_to_tenancy","description":"Add another named tenant to an EXISTING tenancy (joint tenancy). Use this instead of ending and recreating the tenancy. The tenant must already exist — call add_tenant first if needed.","scope":"write","requires_sign_in":true},{"name":"set_lead_tenant","description":"Change which tenant is the lead (primary contact) on an existing tenancy. NEVER end and recreate a tenancy just to change the lead name — that loses history and creates duplicate tenant records. If the named tenant is not yet on the tenancy","scope":"write","requires_sign_in":true},{"name":"end_tenancy","description":"End an active tenancy (set end date + status = ended).","scope":"write","requires_sign_in":true},{"name":"update_rent","description":"Change the rent on an active tenancy (e.g. after a Section 13 review or renewal). Rent changes apply immediately — there is no scheduling mechanism. effective_date must be today or in the past; a future date is rejected. To schedule a chang","scope":"write","requires_sign_in":true},{"name":"update_compliance_item","description":"Update an existing compliance record (e.g. a renewal: new expiry date, new certificate document, new reference number). Use this instead of add_compliance_item whenever a compliance item of the same type already exists for the property — ch","scope":"write","requires_sign_in":true},{"name":"delete_compliance_item","description":"Archive a compliance record (soft delete — reversible).","scope":"write","requires_sign_in":true},{"name":"update_maintenance_status","description":"Change the status of a maintenance request (acknowledged, in_progress, resolved, closed).","scope":"write","requires_sign_in":true},{"name":"log_maintenance_issue","description":"Log a maintenance issue yourself, e.g. when the landlord reports a problem a tenant told them about by phone or text (\"tenant just called about a leaking tap at X\"), or an issue they noticed themselves. If the property has exactly one activ","scope":"write","requires_sign_in":true},{"name":"update_transaction","description":"Edit fields of an existing transaction (category, property link, amount, description).","scope":"write","requires_sign_in":true},{"name":"bulk_update_transactions","description":"Update MANY transactions in one call — categorising a statement import, re-linking rows to a property, marking rows personal/transfer. Group the transaction IDs by the change they need; each group gets the same new values. ALWAYS use this i","scope":"write","requires_sign_in":true},{"name":"split_transaction","description":"Split ONE expense across several properties, for a cost shared by some but not all of them (a shared insurance policy, one gardener invoice covering three houses). Creates one transaction per property and archives the original, so each prop","scope":"write","requires_sign_in":true},{"name":"delete_transaction","description":"Archive a transaction (soft delete — reversible).","scope":"write","requires_sign_in":true},{"name":"complete_task","description":"Mark a task as done.","scope":"write","requires_sign_in":true},{"name":"update_task","description":"Update a task (change due date, priority, title, description, or its kanban column).","scope":"write","requires_sign_in":true},{"name":"delete_task","description":"Archive a task (soft delete — reversible). Different from completing it.","scope":"write","requires_sign_in":true},{"name":"link_document_to_property","description":"Link an uploaded document to a property so it appears on the property page and timeline. Use after the user confirms which property an uploaded document belongs to (the upload was not auto-matched to a property).","scope":"write","requires_sign_in":true},{"name":"log_property_note","description":"Log a freeform note on a property's audit-log timeline. Use when the landlord states something happened at a property that is not already covered by another tool — e.g. \"fitted a new smoke detector today\", \"instructed ABC Ltd to fix the lea","scope":"write","requires_sign_in":true},{"name":"email_contractor","description":"Email a contractor to instruct or update them about work at a property. Sends a real email and logs it on the property's audit-log timeline automatically. Use when the landlord asks to instruct, contact, or email a contractor about work — e","scope":"write","requires_sign_in":true},{"name":"send_inbox_email","description":"Send an email from the landlord's own <name>@landlord-os.com address (their LandlordOS inbox). Use when the landlord asks to email a tenant, supplier, or enquirer from their landlord address, or to reply to an inbox message — e.g. \"reply to","scope":"write","requires_sign_in":true},{"name":"assign_property_contractor","description":"Set a preferred or backup contractor for a trade at a specific property, e.g. \"make ABC Plumbing my preferred plumber for Flat 2\". Use contractor_id when the contractor is already saved (from list_contractors); otherwise provide name and em","scope":"write","requires_sign_in":true},{"name":"add_property_key","description":"Log a new key set for a property, e.g. \"we have a spare key for the garage at 12 High St\" or \"log a new key: front door set B, held by the tenant\". If the property is ambiguous, call find_property_by_address first.","scope":"write","requires_sign_in":true},{"name":"update_key_holder","description":"Record that a key has been handed over to a new holder, e.g. \"log that I gave the spare key to the plumber\". Use the key_id from a list_property_keys call earlier in this conversation — never guess a key_id. If the key doesn't exist yet, us","scope":"write","requires_sign_in":true},{"name":"record_inspection","description":"Record a mid-term inspection at a property, e.g. \"I inspected 12 High St today, smoke alarm battery removed (tenant to fix, re-check in 2 weeks), toilet leaking (needs plumber)\". Break the visit into one item per area with a severity (ok, a","scope":"write","requires_sign_in":true},{"name":"generate_contract_link","description":"Generate a deep link to the LandlordOS contract editor pre-filled with tenant + contract type. The landlord opens the link in the browser to preview/edit, print, or email to the tenant. Do NOT email directly. Always present the returned pre","scope":"write","requires_sign_in":true},{"name":"get_settings","description":"Get the landlord's own account settings: name, business name, phone, assumed tax band, property allowance preference, weekly pulse email preference, reminder email preference, portfolio URL slug, their landlord inbox address (if claimed), a","scope":"read","requires_sign_in":true},{"name":"update_settings","description":"Update the landlord's own account settings. Only pass the fields that are changing. assumed_tax_band is used to estimate tax owed and set-aside amounts — offer to set it with update_settings whenever a landlord asks about tax without one on","scope":"write","requires_sign_in":true},{"name":"claim_inbox_address","description":"Claim the landlord's own <slug>@landlord-os.com email address. A landlord can only claim one address, ever — check get_settings first. The slug must be 4-32 lowercase letters, numbers and hyphens, starting and ending with a letter or number","scope":"write","requires_sign_in":true},{"name":"update_inbox_settings","description":"Update the landlord's claimed inbox address: its display name and/or whether incoming mail is also forwarded to their login email.","scope":"write","requires_sign_in":true},{"name":"archive_inbox_message","description":"Archive a message in the landlord inbox (reversible).","scope":"write","requires_sign_in":true},{"name":"mark_inbox_message_read","description":"Mark a message in the landlord inbox as read.","scope":"write","requires_sign_in":true},{"name":"export_transactions_csv","description":"Get a downloadable CSV export link for the landlord's transactions, filtered by date range, property, type, or kind. Use whenever the user asks to export, download, or get a spreadsheet of their transactions. Never say there is no export fe","scope":"read","requires_sign_in":true},{"name":"unsplit_transaction","description":"Undo a transaction split: restores the original transaction and removes the per-property parts it was split into. Pass either the archived parent transaction id or any one of its child transaction ids.","scope":"write","requires_sign_in":true},{"name":"get_mtd_quarter_summary","description":"Get the income, expenses, and profit figures for one Making Tax Digital quarter — the exact same figures shown on the MTD dashboard. UK properties only, in pounds: company-held and overseas properties are left out, and the result says when ","scope":"read","requires_sign_in":true},{"name":"get_hmrc_category_mapping","description":"Get how each transaction category currently maps to an HMRC property income/expense field for quarterly MTD submissions, including which mappings the landlord has customised.","scope":"read","requires_sign_in":true},{"name":"update_hmrc_category_mapping","description":"Change which HMRC field one or more transaction categories map to for MTD submissions. Editable categories: repairs, insurance, utilities, service_charge, ground_rent, agent_fees, legal, cost_of_services, travel, advertising, office, furnis","scope":"write","requires_sign_in":true},{"name":"estimate_capital_gains","description":"Estimate the Capital Gains Tax due on a UK property disposal (2025-26 tax year rates), in pounds. This is an estimate only, never a filing — always say so in your reply. If the property is one of the landlord's, pass its property_id: a prop","scope":"read","requires_sign_in":true},{"name":"compare_tax_structures","description":"Compare estimated tax on rental profit held personally vs through a Ltd company. Use this whenever the landlord asks whether to hold property personally or in a company, or asks which is better for tax. If you do not know their annual renta","scope":"read","requires_sign_in":true},{"name":"update_tenancy","description":"Update tenancy-level fields not covered by update_rent or end_tenancy: end date, rent frequency, rent due day, and the deposit protection record (amount, scheme, reference, protected date). This is the only tool that can record where a depo","scope":"write","requires_sign_in":true},{"name":"remove_tenant_from_tenancy","description":"Remove a joint tenant from a tenancy roster. Refuses to remove the lead tenant — call set_lead_tenant to make someone else the lead first.","scope":"write","requires_sign_in":true},{"name":"create_onboarding_tenancy","description":"Start a new letting with the onboarding checklist (holding fee, referencing, deposit, move-in) instead of an immediately active tenancy. Use when a landlord has found a tenant but has not moved them in yet. Creates a pending tenancy plus it","scope":"write","requires_sign_in":true},{"name":"get_onboarding_status","description":"Get the onboarding checklist and current stage for a pending tenancy. Identify the tenancy either by tenancy_id, or by the property it is at (property_id or property_address) when the landlord names the place rather than the tenancy.","scope":"read","requires_sign_in":true},{"name":"advance_onboarding","description":"Advance one stage of a pending tenancy's onboarding checklist. action is one of: request_holding_fee, receive_holding_fee, skip_holding_fee (optional: use when no holding fee is taken; steps past stage 1), send_let_confirmation, complete_re","scope":"write","requires_sign_in":true},{"name":"set_rra_sheet_served","description":"Mark whether the Renters' Rights Act Information Sheet has been served on a tenant. This must be served before a Section 8 notice can validly be given. England, residential tenancies only: for a tenant in Scotland, Wales, Northern Ireland o","scope":"write","requires_sign_in":true},{"name":"draft_tenancy_agreement","description":"Draft a full residential assured periodic tenancy agreement for a tenant using AI, grounded in their tenancy, property and compliance data. Refuses a commercial property (that needs a business lease under the Landlord and Tenant Act 1954 in","scope":"write","requires_sign_in":true},{"name":"get_property_insights","description":"Get a property's cached EPC rating, estimated value, area crime summary and flood risk, with the date each was last checked. Pass refresh: true to pull fresh data from the government APIs and re-cache it. Each source (EPC, valuation, crime,","scope":"write","requires_sign_in":true},{"name":"list_inventories","description":"List check-in, check-out and interim inventories recorded for a property.","scope":"read","requires_sign_in":true},{"name":"create_inventory","description":"Record a new inventory (schedule of condition) for a property. Pass draft: true to have Ace draft the room-by-room list from the property's own bedrooms/bathrooms/furnished status — the landlord corrects it afterwards; otherwise pass items ","scope":"write","requires_sign_in":true},{"name":"update_inventory","description":"Edit an inventory's items, summary or compiled-on date.","scope":"write","requires_sign_in":true},{"name":"archive_inventory","description":"Archive an inventory (soft delete — reversible).","scope":"write","requires_sign_in":true},{"name":"update_inspection","description":"Edit a mid-term inspection's items, summary or inspected-on date. Use record_inspection to create a new one.","scope":"write","requires_sign_in":true},{"name":"archive_inspection","description":"Archive a mid-term inspection (soft delete — reversible).","scope":"write","requires_sign_in":true},{"name":"email_inspection_to_tenant","description":"Email the tenant a summary of a mid-term inspection. Only works when the inspection is linked to a tenancy whose tenant has an email on file.","scope":"write","requires_sign_in":true},{"name":"update_maintenance_request","description":"Edit a maintenance request's title, description, urgency or category. Use update_maintenance_status to change its status.","scope":"write","requires_sign_in":true},{"name":"reply_to_tenant_maintenance_message","description":"Post a landlord message on a maintenance request's tenant-facing thread. Tell the landlord you sent it — the tenant sees this message.","scope":"write","requires_sign_in":true},{"name":"update_document","description":"Rename an uploaded document or change its document type.","scope":"write","requires_sign_in":true},{"name":"archive_document","description":"Archive an uploaded document (soft delete — reversible). The underlying file in storage is never removed.","scope":"write","requires_sign_in":true},{"name":"archive_property_key","description":"Archive a property key record (soft delete — reversible), e.g. when it is no longer tracked.","scope":"write","requires_sign_in":true},{"name":"set_listing_status","description":"Move a property between listing statuses: unlisted, listed, under_offer, let_agreed. Setting listed generates a public listing URL if one does not exist yet and records when it was listed; setting unlisted clears that.","scope":"write","requires_sign_in":true}]}