Tutorials

MCP Apps: When a Chat Tool Needs an Interactive Interface

A clear UI-versus-tool architecture and an expense-review interaction specification. Explore the interface with Atoms.

Start building for free
6 min readPublished
Illustrative editorial photograph for mcp apps
On this page

MCP Apps let a tool provide an interactive interface inside a compatible AI chat host. Use one when a person needs to inspect, filter or edit a result before taking the next action. A chart, review form or record comparison can be more useful than another paragraph, especially when the decision depends on several fields.

The official MCP Apps overview describes a tool connected to a UI resource that the host renders. A regular website remains a sensible choice when the workflow needs its own navigation, direct URL or independent login. The deciding factor is where the user needs to work.

Choose the interaction before the framework

Consider an expense-review task. The user asks which submitted expenses need attention. The tool returns records with a receipt link, amount, policy flag and reviewer state. Text can summarize the list. An interface becomes useful when the person must compare receipts, inspect an exception and approve a particular record.

Write that interaction in plain language before selecting a UI library. The first screen should show the review queue. Selecting an item should reveal its source and current status. A decision button should name the action and the record. The interface should keep the decision visible after the tool responds.

Avoid building an elaborate dashboard for a one-line answer. If the task is “what is the current status of this import?”, a structured status response may be enough. If the user must inspect failed rows and choose a repair, an app can give them the control the task needs. Interaction complexity should follow the decision, not the novelty of the extension.

Understand the tool, resource and host boundaries

There are three responsibilities to keep clear. The server provides tools and the UI resource. The app displays the result and collects the user's intended action. The host renders the app and mediates its communication with the connected capabilities.

The MCP Apps documentation explains the extension and its SDK. Host support varies, so verify the intended host rather than assuming every MCP client can render an app. Test both initial rendering and the tool interactions that your workflow actually uses.

Expense-review part Responsibility Evidence to check
Record retrieval Server tool Returned records match the authorized scope
Receipt preview App interface The selected receipt matches the record
Decision request App through host Record ID and requested action are explicit
Permission check Server An unauthorized request is rejected
Result display App Saved state and pending errors remain visible

An embedded interface is not a permission system. Hiding an action in the UI can improve usability, but the server must still check the request. In the expense example, the reviewer should not be able to approve another team's record by changing an identifier in a request. Keep the record owner and permitted action available at the enforcement point.

Specify the data contract

Give records stable identifiers and separate review status from UI state. A record can remain pending while the interface is loading or while a decision request is in flight. If these states are collapsed into one label, the app can accidentally display acceptance before the server has saved it.

The following is an illustrative application record, not an MCP protocol response:

json
{
  "expense_id": "expense-demo-a",
  "employee_id": "employee-demo-a",
  "currency": "USD",
  "amount_minor": 4850,
  "receipt_url": "https://example.com/demo-receipt",
  "review_status": "pending",
  "version": "revision-a"
}

The amount is synthetic and expressed in minor units. The version lets your application detect that a record changed while someone was reviewing it. Decide how your backend handles a stale decision: reject it and reload the record, or present the conflict for a new review. Do not silently apply an approval to an updated receipt or amount.

Also define an error shape for the app. It should distinguish an inaccessible receipt, a failed save and a stale record. These failures require different next actions. A generic red notification without a record reference leaves the person unsure whether they should retry or check the saved status first.

Test the host interaction with a complete task

Use a synthetic queue containing an ordinary expense, a missing receipt and a changed record. Open the app in the intended host. Inspect the ordinary record, submit a decision and check the saved result through the tool. Reopen the interface and confirm that the decision remains visible.

For the missing receipt, keep the item in a state that requires information. Do not treat “unable to preview” as “receipt absent” unless the server establishes that fact. A temporary access error and an actual missing attachment are different observations.

For the changed record, submit a decision using the previous version and verify the application's conflict behavior. Finally, try the same action with a user who lacks permission. The workflow should produce an understandable rejection and preserve the record's previous state. These checks are more informative than a successful screenshot of the initial queue.

Start with a standalone prototype if that clarifies the task

Atoms' AI app builder can help you explore the review screens using a clear brief and synthetic records. Building a standalone prototype first can expose missing fields, confusing decisions and layout problems before you add host-specific integration.

That prototype is separate from a working MCP App. You still need the server tools, UI resource, host communication and permissions required by the extension. Do not describe a generated website as compatible with an MCP host until you have implemented and tested that connection.

text
Build an expense-review interface with synthetic demo records.
Show a queue, selected record, receipt link, amount, currency, reviewer
status and record version. Make approve and request-information actions
explicit. Keep pending requests distinct from saved decisions.
Simulate an ordinary result, a missing receipt and a stale-version error.
Show the record ID and outcome after every action.
Preserve review history and provide a keyboard-accessible mobile layout.
Do not claim that demo actions write to a live accounting system.
Document the API, authentication and MCP host integration still needed.

The client portal guide provides related guidance on identity and record access through a portal. Apply those concerns to the underlying records even when the interface lives inside chat. The user's decision and the saved system result should remain connected.

Use the sample brief to start a expense review interface in Atoms.

Build my expense review interface

Conclusion

Use MCP Apps when interaction improves the user's decision. Define the tool and UI contracts, verify the target host and test saved results through a complete workflow. To explore the interface first, build a synthetic prototype with Atoms, then implement and validate the MCP integration separately.

Create a first version with synthetic data and review the results.

Start with Atoms

FAQs

Q1: Do I need MCP Apps for every MCP tool?

No. A tool that returns a short status, document or factual answer may work well without an interactive UI. An app is useful when the person needs to compare records, adjust parameters or make a decision from the result. Start by identifying what the user must inspect or change. Then decide whether that interaction belongs in the conversation or on a standalone page. The additional interface should reduce uncertainty or repetitive prompts; it should not add screens that the task does not need.

Q2: Does an embedded app automatically get access to the user's connected systems?

Access depends on the host, connected tools and applicable consent and permission controls. The interface does not establish authority by itself. In a review workflow, the server must validate the user, record and requested action even if the app only displays authorized buttons. Check which host capabilities your app uses and test denied requests as well as successful ones. Keep sensitive credentials outside the frontend resource. A working UI demonstrates rendering and interaction, while access and enforcement need their own evidence.

Q3: Can a standalone web app become an MCP App?

Some interface code and data contracts can be reused, and the official extension documentation includes patterns for adding MCP App support. Reuse still requires a real tool and UI-resource integration, host communication and a tested security model. Begin with a small interaction rather than transferring an entire website. Confirm that its inputs, saved outputs and error states work in the intended host. A standalone prototype helps define the experience, but a normal published URL alone does not prove that the app can render and operate inside chat.

Share this article
Made with Atoms

Your next idea starts here.

Turn what you learned into a working app or website.

Start building for free