# Layoutline > Layoutline is an MCP server that gives coding agents a real catalogue of landing-page layouts to pick, compose, and check — so they stop shipping the same hero–features–pricing template. For iOS, Android and Mac apps it answers the platform's rules and checks an app's navigation and structure against them. ## Add the MCP server The endpoint is `https://app.layoutline.dev/api/mcp` (Streamable HTTP). 1. In a client that can sign in for itself (Claude Desktop, claude.ai): add it as a custom connector with that URL, sign in, and approve. Nothing to create, no secret to paste — the connector receives its own credential. 2. In a client that only sends a header (CLI, editors, CI): sign in at https://app.layoutline.dev, issue an API key on the dashboard, and send `Authorization: Bearer `. The dashboard shows the exact line for your client with the key already in it. 3. Either way, call the tools below; `list_layouts` is the cheapest first call and proves the connection. ## Tools - `list_layouts` — catalogue of 39 distinct silhouettes, filterable by audience/silhouette. - `pick_layout` — returns three layout candidates with reasons from a product/audience brief: three different silhouettes and hero types, none that needs customer proof the brief says you lack. - `compose_page` — turns a chosen layout + copy brief into an ordered page plan with slot limits. - `review_page` — compares a built-page description against the plan (or, for a page built without one, the catalogue layout it is closest to, which it can store as the project's plan): missing, misplaced and extra sections, a hero whose shape is not the layout's, and the default hero–features–pricing silhouette when it sees it; guidance findings, not a guarantee. - `mobile_rules` — the platform rules for an iOS or Android app's navigation, tabs, modals, alerts, paywalls, permission requests and the buttons on a quiz screen, and for a Mac app's windows, sidebar, sheets, popovers, dialogs, Settings, toolbar, menu bar and shortcuts, segmented controls and light/dark appearance, each paraphrased from Apple's Human Interface Guidelines, Android's developer guides or Google Play policy, with what to do instead and a link to the source. It also carries one rule of Layoutline's own, for every platform: a mascot in a centred slot is centred on its body, not on the box around its body and props, because the eye weighs the body — export it from Mascotline with anchor: body; a slot aligned to an edge keeps the tight crop. - `review_app_flow` — checks an app's navigation (screens, tabs, push/modal/replace transitions, start screen, deep links, paywalls, permission requests) — or, with platform macos, a Mac app's declared structure and its light and dark screenshots — and given mascot or illustration slots, whether each character sits on its slot's centre line, and names each rule it breaks with every screen that breaks it, plus what it could not check; guidance, not a guarantee of store approval. - `review_app_screens` — compares an iOS or Android app's screenshots, and its App Store or Play Store screenshot frames, with screenshots of the apps you compare against, screen by screen: it measures each image's ground and accent colours and a store caption's size and contrast, and from what you note seeing in each image names what most references show that yours does not, where they all agree and yours differs, and for a store set a first frame without a caption, broken step numbers, frames that change ground or caption position, and captions smaller than every reference's or under 3:1 contrast. Each finding names the reference that showed it and whether it was measured or read from your notes; a comparison, not a platform rule, except one: on a quiz screen, a button that does not answer but is drawn like the answers and set among or right against them is reported as reading like one more answer, with what to do instead and Apple's and Android's button guidance. Pictures need not be written into the call: a reference app is named by its App Store id and its store screenshots are fetched in order; any picture can be a public https link; a crop measures part of one, such as the app screen inside a store frame. - `create_screen_upload` — answers one upload link per local screenshot: send each file with the curl it gives, then pass its uploadId to `review_app_screens`. A picture is kept for one hour and then deleted. - `project_setup` — writes `.layoutline/layoutline.json` (ids only) and a stable AGENTS.md block so later sessions reuse the chosen layout; called before there is a plan, it answers the free steps to get one. The project lives in a workspace; from outside it the result says who to ask, and nothing is created. - `request_access` — ask to join a workspace (or raise your role there). Free. An owner or admin is notified; nothing is charged. - `list_workspaces` — list the workspaces you belong to, with your role in each, plus any pending invitations and project transfers. Free. - `transfer_project` — move a project, with its plans, setups and reviews, to another workspace. Free. - `accept_transfer` — accept a project transfer into a workspace you can write in. Free. All tools are free. Every result carries `server.version` and `server.tools`; when a plan or review names an illustration, empty state, hero mascot or explainer picture, the result may carry a Mascotline suggestion with its price — a separate product. ## What's new - 1.16.0 (2026-10-11): pick_layout no longer reads a word used about something else as your audience — a feature called "Community looks" or traffic "from social posts" is not a Community or Social audience — and reads an audience age range (18-35) as consumers. compose_page gives a slot that asks for photos or screenshots to you, the project, never to a drawing tool. review_page recognises a page that tells its features as full-viewport photo chapters (no longer "the default template"), and matches the plan's sections by their role: a proof section in the testimonials slot and a closing call to action in the newsletter slot count as there (listed in sectionsByRole), while whether that section shows real proof is judged on its own. Free. - 1.15.0 (2026-10-10): a screen can be declared as a live camera viewfinder; review_app_flow and mobile_rules hold that a viewfinder takes the whole screen — not a tab, no tab bar under it — and say what to do instead (camera as the root or presented full-screen, gallery from a thumbnail, settings from the top chrome), citing Apple's guidance and saying honestly that on Android it is the category's convention; review_app_screens flags a viewfinder whose navigation shows a tab bar, and marks a difference that every reference agrees on (two or more) above a plain comparison. Free. - 1.14.0 (2026-10-09): review_app_screens says whether your app sits on the same tone of ground as the apps you compare with. It measures the ground of your screens and of every reference, in-app screens first and store frames when that is all it has, and when the references split between light and dark — or all sit on the other tone from yours — it says so and names each one, so a dark app built against a light reference is a decision, not a surprise. A picture with no single edge colour (a full-bleed photo, a phone mockup crop) can carry its ground as ground: "#hex"; a reference's own in-app screenshot goes up with create_screen_upload like yours. When every fetched store frame has its sees, the result no longer asks for them; when some lack them it names which. The references' store sets are read back — frames, captions, step markers — when your call has no store frames of its own. With projectIdentifier the review is stored for the project and .layoutline/layoutline.json comes back to commit, carrying the measured grounds and the finding ids for the sibling products; project_setup returns that file for a project with a review and no page plan. Every result that took sibling files now says what it read from each (read). - 1.13.0 (2026-10-08): Projects live in workspaces. Every account has a personal workspace; a team workspace holds the projects its members share. project_setup, compose_page and review_page find the project by name in your workspaces, or by the ids in .layoutline/layoutline.json (which now records the workspace too — an older file keeps working for its owner). From outside a workspace the result says who to ask and how to request access; list_workspaces, transfer_project and accept_transfer manage membership and moves. Free. - 1.12.1 (2026-10-07): pick_layout no longer counts an audience the brief rules out ("no social layer" is not a Social audience), reads a named platform (iOS, Android, iPhone, iPad, App Store, Play Store) as a mobile brief, and, among layouts that fit the audience, ranks a layout whose pace matches the tone the brief asks for (quiet and calm, or bold and energetic) before one that does not. Each reason now says whether the layout fits your audience, your tone, both, or neither, so a weak fit reads as one. Free. - 1.12.0 (2026-10-07): review_app_screens checks a quiz screen for an action that looks like one of its answers. Note the answers, how they are drawn and the space between them, and every other button shown with them — its style and where it sits. A button that does not answer, drawn like the answers and set among them or right against them, reads as one more answer, and a mis-tap leaves the question; the review says so, says what to do instead (move it to the navigation bar or below the quiz with clear space, or give it a style the answers do not use), and cites Apple's and Android's button guidance. It needs no reference apps. mobile_rules carries the rule for iOS and Android. Free. - 1.11.1 (2026-10-06): review_app_screens reads a store frame's caption size from its tallest line of text, so a heavy headline above a smaller subline is measured as the headline whatever its words or font, and no longer raises a caption-size finding the frame does not have. - 1.11.0 (2026-10-06): review_app_screens takes reference apps by App Store id (their store screenshots fetched in store order, cited as frame 1, frame 2…), any picture as a public https link, and your own local screenshots through the new create_screen_upload (one link per file, sent with curl, kept for an hour). A crop measures part of a picture, such as the app screen inside a store frame. Pictures in the call still work. Free. - 1.10.0 (2026-10-06): new review_app_screens compares an iOS or Android app's screenshots, and its App Store or Play Store screenshot frames, with screenshots of the apps you compare against, screen by screen. Each finding names the reference that showed it and whether it was measured from the image or read from what you noted seeing in it. Free, stores nothing. - 1.9.9 (2026-10-05): when compose_page's hero shows the product itself, the result's suggestions no longer offer a mascot for the hero; a hero that takes a drawn picture still does. - 1.9.8 (2026-10-05): compose_page gives a slot that shows the product itself a picture to match. A device or product-shot hero, a strip of app screens, a product tour and a dashboard preview ask for the product's own screenshots (product_screenshot), supplied by the project: in a phone or browser frame, how many for a strip, where the picture sits in its box and its display size. A product hero or shelf asks for the product's photo (product_photo). Such a hero no longer comes with a mascot suggestion, and review_page does not judge a product picture for a character's centring. Every other picture slot keeps its answer. - 1.9.7 (2026-10-05): review_page without a compose plan matches a page that sells an app from an app store against the app layouts first, so a tools or maker layout no longer wins over them. A quote the product itself shows (a transcript quote in a mockup, a price quote, a quote form) no longer counts as a customer quote, so a page with no testimonials, reviews, ratings or logos is told its proof is missing. And because the closest match is not a plan, its sections the page lacks are said as differences from the closest match, not drift to fix: the result never tells the page to add a section from a layout nobody chose. - 1.9.6 (2026-10-05): review_page without a compose plan no longer tells a page to rebuild its hero to a layout nobody chose. Where the closest catalogue layout puts the picture on the other side, or shapes the hero differently, the result says so under matchedLayout.heroDiffers and the note calls it a difference from the closest match, not drift to fix; heroMismatch stays for a layout the project chose. Such a match is not offered or stored as the project's plan, since the page does not follow it: pick a layout from the product brief instead. The closest match now counts a contradicted hero as heavily as a missing section, and for a page that sells an app from an app store prefers an app layout among equals. A brand logo in the header or footer no longer counts as customer logos, so a page with no testimonials, logos or ratings is told its proof is missing. - 1.9.5 (2026-10-05): when pick_layout turns a layout's testimonials, reviews or ratings section into true-today proof, the layout's above-the-fold promise follows: a beat that speaks for customers (such as "users praise" or "customer voices") reads "proof true today" in the reason, the layout, the section skeleton and the compose_page plan made from that pick. A brief that has its customer proof keeps the promise as catalogued. - 1.9.4 (2026-10-05): when the brief says the product has no customer proof yet, pick_layout keeps the layouts that fit its audience instead of dropping every one with a ratings, reviews or testimonials section. That section is offered as a proof strip of what is true today (at least two of a public changelog, a named maker, a signed or notarized build; product screenshots are not proof), the reason says so, and the section skeleton and the compose_page plan made from that pick carry the swap. Each reason names the audience the layout shares with the brief, or says plainly that it shares none: a layout is never called a fit it is not. - 1.9.3 (2026-10-05): pick_layout counts ratings, reviews, quotes, stories, a community and a social loop as customer proof, beside testimonials and logos. When the brief says the product has none, no layout whose sections or proof placement need it is offered, and "needs no customer proof the brief says you lack" is said only of a layout that truly needs none; a layout with a general proof slot says to fill it with what is true today (a public changelog, a named maker, a signed build). review_page names the same kinds of customer proof when a page shows none. - 1.9.2 (2026-10-05): review_page reads a sided hero from the whole hero part of the description, not only its first sentence. A hero written over several sentences ("Left = headline. Right = product mockup.") and a quoted headline with a full stop in it no longer lose the side, so the mirror image of the layout comes back as heroMismatch however the hero is punctuated. - 1.9.1 (2026-10-05): review_page judges a sided hero by its side as well as its shape. Where the layout puts the picture, code or device on one side (image_left, portrait_left, device_right, code_right) and the description puts it on the other, the result comes back as heroMismatch naming the side it saw (for example image_right) with which way to swap; a description that does not say which side, or says both, gets no finding. With or without a compose plan. - 1.9.0 (2026-10-05): compose_page takes projectIdentifier — the product or repo name. The plan it composes is stored as that project's layout in the same call, free, and the result carries .layoutline/layoutline.json to write and the AGENTS.md lines, so a new project needs no separate project_setup. - 1.8.0 (2026-10-05): a landing built before Layoutline can be reviewed. review_page without a compose plan reviews the page against the catalogue layout it is closest to and names it (matchedLayout); with projectIdentifier it also stores that layout as the project's plan and returns .layoutline/layoutline.json to write — free. Without one, the result lists the free steps to store it, and project_setup called with no plan answers those steps instead of refusing. Both name the sibling products the project does not carry yet. - 1.7.0 (2026-10-01): Mac apps. mobile_rules and review_app_flow take platform macos and judge a Mac app by Apple's macOS guidance, never by iOS rules. Describe the app's scenes (the main window with its minimum width and the width below which its split view folds, the Settings window), the sidebar, sheets and popovers, the buttons that matter (the primary one, destructive ones and whether they ask first or can be undone), toolbar items, menu commands with their shortcuts, segmented controls and where they sit, and whether the app follows the system's light and dark appearance. The review names a sheet with no Cancel, a sheet over a sheet or a popover from a popover, a destructive action that neither asks nor can be undone, a destructive default button or a primary button in a sheet that does not answer Return, Settings outside a Settings window or in the toolbar, a window that can be made narrower than its layout holds, critical status at the bottom of the sidebar, a segmented control switching views in the content area, a toolbar item missing from the menu bar, a standard shortcut used for something else, and an app with its own appearance setting. Screenshots in light and dark are read for their appearance only — a Dark Mode render that is light is a finding — and are not stored. iOS and Android declarations on a Mac app, and Mac declarations on a phone app, come back under notChecked. - 1.6.1 (2026-09-28): a call from a client still holding the tool list from before a parameter was added is answered instead of refused: an array or object that arrives as JSON text, however long, is read as the array or object it holds. Text that is not valid JSON is refused with a message naming the parameter and saying the client may hold an old tool list: reconnect, or start a new session. - 1.6.0 (2026-09-28): mascot and illustration slots carry how they are aligned and their display size. Every picture slot of a compose_page plan that holds a mascot or illustration says its alignment (center, start or end) and its display size in pt with the dimension it fixes, so the picture can be exported for exactly that slot: anchored on the character's body for a centred slot, the tight crop for one against an edge. review_page and review_app_flow take those slots as art: in a centred slot, a character whose body sits more than 3% of the picture's width off the centre line comes back as a finding with the fix — re-export with anchor: body — while start and end slots are left alone. Mascotline's bodyOffset is taken as the measurement when passed; otherwise the body is measured from the cut-out, and a picture where it cannot be told apart from what it holds is listed under notChecked instead of passed. mobile_rules gains the artwork rule: a centred mascot is centred on its body, because that is where the eye weighs it. - 1.5.1 (2026-09-27): a pre-permission screen is declared as permissionPrimer: { closeable } — whether the explanation itself can be dismissed, apart from the screen's own Close — so a modal with a Close no longer reads as a primer with a way out; a bare true is accepted and listed under notChecked instead of guessed at. For an app on both platforms the primer conflict comes back as one finding naming the other platform's rule (conflictsWith) and pointing at explaining inside the feature. Offer items no rule that ran reads, such as terms or renewal on iOS, are listed under notChecked, and iOS gains a guidance rule for Terms of Service and Privacy Policy links. - 1.5.0 (2026-09-27): mobile_rules and review_app_flow cover paywalls and permission requests. A paywall declares what it shows; the review names what Apple or Google Play still expects on it — price, period, renewal, restore purchases, a visible dismiss, trial length and what is billed after — and a subscription nobody can manage or cancel. A permission asked at launch or during onboarding comes back as out of context, and a pre-permission screen is judged by each platform's own rule: iOS allows it no way out, Android requires one, so for both the answer is to explain inside the feature. Android also flags a screen that stops people after a denial. - 1.4.5 (2026-09-26): review_page counts proof that is true before there are customers. A page that shows two kinds of it — a signed or notarized build, a public changelog, open source code, a named maker — fills the layout's logo strip or proof section, and the note says which. One kind alone is still missing proof, and the note names the one it saw; screenshots show the product and do not stand in for proof. - 1.4.4 (2026-09-26): when review_page calls a page the default template, its note says which of the layout's sections are missing and which are out of order, instead of calling a missing section misplaced. - 1.4.3 (2026-09-26): review_page reads the hero from the part of the description that names it, so a single text column where the layout puts code, a device or a picture beside the copy comes back as heroMismatch; it names hero copy longer than the plan allows (copyOverLimit), a grid whose last row holds one card alone (orphanRow), and missing proof when the layout asks for customer proof such as a logo strip, with honest proof to use when there are no customers yet. A denial no longer hides the sections written after it, so two wordings of one page get the same section verdict. - 1.4.2 (2026-09-26): each notChecked entry of review_app_flow names the rules that would read that property on another platform or presentation, in the same ids as checked. - 1.4.1 (2026-09-26): review_app_flow returns one finding per broken rule naming every screen that breaks it, and lists under notChecked any declared property no rule for your platforms reads — silence is no longer a pass; the start screen's description says what to do with a launcher gate. iOS gains navigation rules (standard Back and Close, a useful title) and Android asks for a confirmation before Back discards unsaved input. mobile_rules explains how severity and check combine, says when an area has no rule yet, and states that sourceChangedSince appears only when a source changed. - 1.4.0 (2026-09-26): iOS and Android apps — mobile_rules answers the platform rules for navigation, tabs, modals and alerts with what to do instead and a link to the source; review_app_flow checks an app's navigation graph and names each rule it breaks. A rule whose source page has changed since it was last reconciled says so. Both free. - 1.3.3 (2026-09-25): pick_layout returns three different hero types among the layouts that fit the brief, favours code beside the promise for a thing developers call, and leaves out layouts that need customer logos or testimonials when the brief says the product has none yet; every reason names the hero. compose_page gives a story-beat slot (chapters, story, journey) — or any slot whose copy names the mascot — to Mascotline as the character when the project has one; a process diagram stays a non-character illustration. - 1.3.2 (2026-09-25): review_page also checks the hero's shape against the layout — a split hero where the layout centres it, or a centred one where it puts code, a device or a picture beside the copy, comes back as heroMismatch with what to change; a description that does not say the hero's shape gets no finding. - 1.3.1 (2026-09-25): review_page no longer calls a page built to its layout the default template — that finding now needs a section missing or out of order and names it; pricing the layout does not name comes back under extraSections, not as drift. - 1.3.0 (2026-09-25): compose_page answers the page's fonts, type scale, colour roles and surfaces, each with where it came from, and every slot names its type level, the kind of picture it needs and the product that draws it; what nothing locks yet is decided for the layout and returned as lock, which project_setup writes into .layoutline/layoutline.json. - 1.2.0 (2026-09-24): project_setup answers two files — a one-line pointer for your own AGENTS.md and a .layoutline/AGENTS.md this server keeps current — and names the sibling products your project does not carry yet; every tool now states whether it only reads. - 1.1.0 (2026-09-22): compose_page takes the project's colours and its sibling product files (.mascotline, .stylelock) and answers the palette with its source; the catalogue is 39 silhouettes observed on real pages. - 1.0.0 (2026-09-21): Layoutline MCP — list_layouts, pick_layout, compose_page, review_page, and project_setup for distinct landing-page structures. ## Docs This file is the agent-facing overview. Maker dashboard: https://app.layoutline.dev — the API page there lists every endpoint and links the OpenAPI spec once you have a maker account. Contact: hello@layoutline.dev