Inspiration

At the end of a tenancy, a deposit deduction often turns into a confusing exchange of photos, report notes and messages. RentalEase Move-Out Companion focuses on that moment: helping the tenant and the landlord find the relevant record and understand which decision is still theirs to make.

What it does

Built for the Alexa+ track as a simulated web experience: the browser listens and speaks, not an Alexa device. On the Ask RentalEase card a tenant asks, by voice or by typing, "Was the scuff already there when I moved in?". The assistant reads the synthetic case only through the project's MCP tools, quotes the move-in and move-out reports, reads a short answer aloud and shows source chips that link to each quoted record.

"Dispute the wall charge for me" produces a draft, not a decision. It opens in a Check before saving preview, and nothing is recorded until the person presses Confirm and save. The assistant cannot decide liability, change a recorded amount or save.

Each deduction is resolved on its own. In the demo the tenant disputes the wall and cleaning charges and accepts the key charge; the landlord withdraws the wall charge and proposes MYR 20 for cleaning; the tenant accepts. A proposal changes the refund only after the tenant accepts it, and an agreed refund is never presented as a payment. The confirmed history survives a refresh.

Other MCP clients can connect to the same case: the page shows a per-case bearer token and copyable commands for MCP Inspector, Claude Code and Claude Desktop. The six tools only read records and check drafts; there is no confirm or payment tool.

Judges need no cloud keys: npm ci && npm run dev:companion, then open http://127.0.0.1:3030/demo. Without AWS settings a deterministic rule assistant answers by quoting the records, which is the mode shown in the video.

How we built it

  • Next.js, React and TypeScript. The independent demo stores synthetic cases in local files and reuses the same workflow, evidence and dialogue rules as the authenticated records workspace (Prisma, Supabase PostgreSQL and NextAuth, inherited from my FYP).
  • Voice uses the browser Web Speech API: SpeechRecognition for input (Chrome and Edge) and speechSynthesis for spoken replies.
  • MCP uses the official TypeScript SDK (protocol 2025-11-25, Streamable HTTP) with six read-only tools: tenancy context, agreements, deduction evidence, source-based answers and draft checks.
  • Optional Amazon Bedrock path: the server calls the Converse API with the AWS SDK for JavaScript v3, and an in-process MCP client gives the model the same tools external clients use. MCP tool schemas are flattened to the subset Amazon Nova documents for Converse tools.
  • Safety boundary: every write follows prepare (signed, revision-bound, expiring preview) → explicit human confirmation → a database function that checks the revision and is safe to retry. Record text is treated as evidence, never as instructions.

Challenges we ran into

  • Keeping a plausible answer separate from an authorized action: the assistant may cite a real report and still over-interpret it, so answers quote records exactly and drafts must pass a rule check before they become a preview.
  • Representing a revised proposal without changing the settlement total too early.
  • MCP SDK tool schemas (draft-07, additionalProperties: false, nested oneOf) did not match what Amazon Nova accepts for Converse tools, so an adapter flattens them while the server still validates exact input.
  • My AWS account refused every Bedrock model invocation with "Operation not allowed" across regions and models. I added a diagnostic (npm run check:bedrock) that names the account-level cause, and recorded the demo in rule mode instead of faking a model answer.
  • A lockfile generated on Windows silently dropped other platforms' native binaries, so a clean Linux install failed. A regression test now guards it.
  • Browser speech recognition often misheard "RentalEase" and "scuff" in my accent, so the card also accepts typed questions.

Accomplishments that we're proud of

A complete tenant–landlord walkthrough that runs locally with no credentials, where every saved decision has a visible preview and a human confirmation, and where an external MCP client can inspect the same case without being able to change it.

What we learned

Guardrails belong in code, not in the prompt: role checks, revision checks and the confirmation step hold whether a rule engine or a language model drafts the request. Honest labelling (simulated Alexa+, synthetic data, AI-generated photos, rule mode) matters as much as the features.

What's next

A live Amazon Bedrock run once my AWS account allows model invocation, testing with more microphones and accents, accessibility testing, and formal Alexa+ integration and remote MCP access behind OAuth, subject to access. The prototype does not analyse images, give legal rulings, sign documents or move money.

Existing work

This extends my RentalEase final-year project. Account roles, rental records, agreements and an earlier settlement workflow existed before the hackathon; see docs/BASELINE.md. The Move-Out Companion features described above were built during the submission period.

Built With

Share this project:

Updates

Submission history