AI: connecting an MCP client to a Pural workspace and drafting proposals with it # Drafting with AI > Run the guided interview, review the outline, and let the assistant write the sections, the price table and the acceptance block into your workspace. Once an AI client is [connected](/en/ai/connect/), it can draft proposals directly in your workspace. The useful part is not that it writes text — it is that it writes into the real structure, using your real templates. ## The guided flow [Section titled “The guided flow”](#the-guided-flow) Pural ships a prompt that runs the whole thing. In Claude Code it appears as `/pural:draft_proposal`; other clients list it among the server’s prompts. You can pass what you already know as a brief, and it will not ask about that again. There is a second prompt for building templates — see below. It runs in four steps: 1. **Orientation.** The assistant reads your workspace — your templates, your reusable blocks and your recent proposals — so it can suggest real options instead of asking in the abstract. 2. **Interview.** A short conversation about the client, the goal, the scope and what is explicitly out of it, the timeline, the pricing shape, and how formal the tone should be. It drills down where an answer is too thin to write a section from. 3. **Outline.** It presents the proposal section by section and **stops**. Nothing is written to your workspace until you say go. 4. **Writing.** It creates the proposal and adds the sections, reusing your blocks rather than rewriting boilerplate, and checks its own layout afterwards. ## What it can write [Section titled “What it can write”](#what-it-can-write) Most of the proposal, including the two parts that are structured data rather than prose: * **The price table.** The assistant supplies the line items — description, quantity, unit price, discounts, tax — and Pural computes every subtotal and total on read. It never writes a total itself, so the numbers cannot go stale. * **The acceptance block.** Button text, the form behind it, an optional decline link and whether accepting produces a signed PDF. Its defaults are English; the assistant is told to supply the texts in the proposal’s language. * **Images.** It can search stock photography and place a result, and it can reference an asset you already uploaded. See [Images in a proposal](/en/proposals/images/). ## What you still do yourself [Section titled “What you still do yourself”](#what-you-still-do-yourself) The assistant hands the proposal back with a list of what is left. Expect these: * **Attaching the customer**, if you did not give it a customer ID. * **Uploading your own images.** It can place a stock photo or an asset that already exists, but it cannot upload a file into your workspace. * **Sending.** Always yours, deliberately: an assistant that reads a document it did not write should not also be able to mail it to your client. Two things to check in what it wrote **Invented facts.** The prompt forbids inventing prices, dates, headcounts, client names and references, and requires a `[TODO]` marker where something is missing. Search the draft for `[TODO]` before you send it. **Braces in the text.** A real [placeholder](/en/proposals/placeholders/) showing `{{customer.name}}` means its value is missing — usually no customer attached yet. Text somebody typed that merely looks like one never resolves at all. Either way, braces in a proposal you are about to send are something to fix. ## Building a template instead [Section titled “Building a template instead”](#building-a-template-instead) The second prompt, `/pural:draft_proposal_template`, builds a reusable [proposal template](/en/library/templates/) rather than one proposal. Same four steps, different questions — there is no client to ask about, and that is the point: * **Which sections** this kind of offer always needs, as opposed to the ones you would rather add case by case. * **Where the content comes from**: your own words, one of your [reusable blocks](/en/library/blocks/), or a page of your own website. Give it URLs — your services page, your process page — and it reads them as source material to rewrite, not to paste. * **What the price table has to be able to express**: unit positions, a rate per hour or day, an optional add-on, a note row, a discount. It builds one example of each so the shape is there when you fill in the real numbers. * **How acceptance works**: the button text, which fields the form asks for, whether a decline link is offered, and whether accepting has to produce a signed PDF. Everything that would differ per client becomes a [placeholder](/en/proposals/placeholders/) rather than text. Afterwards, check the template for the opposite failure: a client detail written out as literal text reads perfectly well and is invisible until it reaches the wrong client. ## Working without the guided prompt [Section titled “Working without the guided prompt”](#working-without-the-guided-prompt) You do not have to use the prompt. You can simply ask the assistant to read a proposal, rewrite a section, reorder things or copy a structure from an earlier proposal, and it has the tools for that. The prompt exists because the failure mode of AI-written proposals is almost never bad prose — it is missing input. # Connect an AI client > Point Claude or any MCP client at your Pural workspace over MCP, and choose which permissions it gets. Pural hosts an **MCP server**. Any client that speaks the Model Context Protocol — Claude Code, Claude Desktop, or another MCP client — can connect to your workspace and work on proposals in it. ## The endpoint [Section titled “The endpoint”](#the-endpoint) Add Pural as an MCP server in your client using the `/api/mcp` endpoint of your Pural installation, for example `https://app.pural.io/api/mcp`. Your client opens a browser window, you sign in to Pural as usual, and a consent screen names the application and the permissions it is asking for. Approving it sends you back to the client, connected. ## Permissions [Section titled “Permissions”](#permissions) Permissions are granted per resource, and the consent screen names the ones being requested: | Permission | What it allows | | ------------------- | ------------------------------------------------------------------------------------------------------ | | **Read proposals** | List and read proposals, sections, templates and blocks | | **Write proposals** | Create proposals, and add, edit, reorder and remove sections — including price and acceptance sections | | **Read customers** | Search your customer list and read a customer record | | **Write customers** | Create a new customer | Customer *contacts* — the named people and their details — are not reachable over MCP at any permission level. An assistant can attach a company to a proposal; it cannot read the people at it. For the full list of what an assistant can call, see [What an assistant can do](/en/ai/tools/). ## Which workspace it reaches [Section titled “Which workspace it reaches”](#which-workspace-it-reaches) The connection is bound to the organization you were signed in to when you approved it. If you belong to several, connect while in the right one — and if you later leave that organization, the connection stops reaching its data. Writes also need an active subscription, the same as in the app: an assistant cannot write proposals during an expired [trial](/en/settings/billing/). ## Disconnecting [Section titled “Disconnecting”](#disconnecting) Connected applications are listed in your account settings and can be revoked there. Revoking stops the client from getting new access, and it does not touch anything the assistant already wrote. Caution An access token the client already holds keeps working until it expires, which can be up to an hour after you revoke. If a connection needs to stop reaching your data *right now*, revoking is not sufficient on its own. # What an assistant can do > The full list of MCP tools a connected AI client can call — add_section, add_price_section, add_accept_section, render_preview, find_images, fetch_page_content and the rest — what each one touches, and the things none of them can. A [connected](/en/ai/connect/) AI client gets a fixed set of tools. This is all of them. You never call these yourself — the list is here so you know what a client can reach, and what it cannot. ## Reading [Section titled “Reading”](#reading) | Tool | What it returns | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | `get_authoring_context` | Your templates, reusable blocks, recent proposals and brand colours, plus the exact section format. Assistants call this first. | | `search_docs` | This documentation. | | `list_proposals` | Your proposals, newest first, filterable by status and free text. | | `get_proposal` | One proposal with all its sections. | | `list_sections` | A proposal’s or template’s sections with a text preview and the placeholders each uses, without the full layout tree. | | `render_preview` | A layout report and screenshots of what a section actually looks like. | | `list_templates` | Your proposal template library. | | `get_proposal_template` | One template with its sections and the placeholders it actually contains. | | `list_placeholders` | Every [placeholder](/en/proposals/placeholders/) that exists, with the markup to insert it. | | `fetch_page_content` | The text of a public web page — your own services or process page — as source material. | | `list_template_blocks` | Your reusable blocks. | | `get_template_block` | The sections inside one block. | | `get_price_table` | The line items of a price section, without the computed totals. | | `get_accept_section` | The acceptance configuration: button, form fields, decline link, signature flag. | | `find_images` | Stock photo candidates, returned as actual pictures. | | `list_customers` | Your customer list, searchable. | | `get_customer` | One customer record. | ## Writing [Section titled “Writing”](#writing) Every tool below needs the write permission **and** an active subscription — the same gate the app applies. During an expired [trial](/en/settings/billing/) an assistant can still read, but not write. | Tool | What it changes | | -------------------------- | ----------------------------------------------------------------------- | | `create_proposal` | Creates a draft, optionally from a template. | | `create_proposal_template` | Creates an empty [proposal template](/en/library/templates/). | | `add_section` | Inserts a section at a position you choose, or at the end. | | `update_section` | Replaces one section. It cannot change a section’s kind. | | `remove_section` | Deletes one section. | | `reorder_sections` | Sets the order. Must list every section exactly once. | | `add_price_section` | Creates a price section with its line items. | | `set_price_table` | Replaces a price table’s line items. | | `add_accept_section` | Creates the acceptance block. One per proposal or template. | | `set_accept_section` | Replaces the acceptance configuration — it replaces rather than merges. | | `create_customer` | Creates a customer. This writes real CRM data. | ## The guided prompts [Section titled “The guided prompts”](#the-guided-prompts) Alongside the tools, the server offers two prompts. In Claude Code they appear as `/pural:draft_proposal` and `/pural:draft_proposal_template`. See [Drafting with AI](/en/ai/authoring/). ## What no tool can do [Section titled “What no tool can do”](#what-no-tool-can-do) These limits hold regardless of which permissions were granted: * **Sending.** No tool sends email. Sending stays a decision you make in the app. * **Uploading.** An assistant can place a stock photo or an asset that already exists, but it cannot put a file into your workspace. * **Deleting a template.** It can create and edit proposal templates; it cannot delete one. Other proposals were built from it, so that stays a decision you make in the app. * **Editing customers.** It can create one and read the list; it cannot change or delete an existing record, and customer *contacts* are not exposed at all.