Skip to main content

Overview

Apps you build in Assembly can have their own API: a Project Tracker can list projects, a time tracker can start a timer. The Assembly MCP server gives your AI assistant two tools to reach those APIs:
  • apps finds the apps in your workspace and describes what each one can do.
  • app_api calls one of those operations.
The tools are generic: they work for every app, so they don’t know in advance what any app exposes. The assistant always discovers first and calls second. You don’t need to set anything up per app; once you are connected to the MCP server, you can ask about your apps in plain language.
App calls through MCP are rolling out gradually. If your assistant doesn’t list the apps or app_api tools, they aren’t enabled for your workspace yet.

Who can call an app

  • Workspace members only. Every call runs as you, the person signed in to the MCP connection. The app sees you as the user and returns only what you could see if you opened it in the dashboard.
  • Not clients. Clients can’t connect to the MCP server, and a client’s credential is refused if it tries to call an app this way.
  • Your workspace only. You can reach the apps installed in the workspace you are working in. An app from another workspace, or one that has been uninstalled, answers as if it doesn’t exist.

Step 1: Discover with apps

The apps tool is read-only and has three actions. retrieve is usually enough to pick the right operation. The assistant reaches for retrieve_contract when it needs the exact request body or response fields. The contractHash from list identifies the current version of that document. To skip re-reading it, pass the hash wrapped in double quotes as If-None-Match (for example "3b1f0c9e…"); the tool answers 304 Not Modified when nothing has changed, so the assistant can reuse the copy it already read.

Step 2: Call with app_api

The app_api tool sends one request to one app. The path must be one the app lists in retrieve. The assistant never invents a path; a path the app doesn’t expose is refused. The app’s answer comes back as the app sent it, including its own error messages. A GET only reads. A POST, PUT, PATCH, or DELETE changes data in the app, so the assistant tells you what it is about to send, and to which app, before it calls, and asks for your confirmation before any DELETE.

Worked example: Project Tracker

Say your workspace has a Project Tracker app, and you ask:
“Which projects in Project Tracker are overdue? Mark the Acme website redesign as completed.”
The paths and fields below are illustrative; each app defines its own.
1

Find the app

The assistant calls apps with action: "list" and picks Project Tracker from the result.
2

Read its operations

It calls apps with action: "retrieve" and that appId.
If it needs to know which filters listProjects accepts or which fields updateProject takes, it calls retrieve_contract next.
3

Read the overdue projects

It calls app_api:
Project Tracker returns the overdue projects you can see, and the assistant lists them for you, including the id of the Acme website redesign (say prj_481).
4

Mark one completed

Because this changes data, the assistant first tells you it will set prj_481 to completed in Project Tracker. Once you confirm, it calls app_api:
Project Tracker records the change as made by you.

Errors

When a call fails, the tool returns the HTTP status and a short message, for example HTTP 404: App not found.