Ava Research

Itemize — Docs

Quote every job, right through Muse.

Itemize is a hosted MCP (Model Context Protocol) server. Paste a job description — a forwarded text, an email, typed notes — and Itemize extracts a structured quote draft: client, line items, totals, terms, and a 30-day expiry. Every dollar traces back to something your own text stated; Itemize never estimates or guesses a price.

Free. No paid plan. get_methodology works without an account. Everything else requires a free account, created with a one-time code sent to your email — no password, no payment details.

Endpoint

https://func-itemize-prod-l4iy3g.azurewebsites.net/api/mcp

JSON-RPC 2.0 over HTTPS POST. Methods: initialize, tools/list, tools/call. MCP protocol version 2025-06-18.

Authentication

Sign-in uses OAuth with Microsoft Entra External ID: Muse gets an access token from Entra, and the server accepts only Entra-issued tokens with the Itemize.ReadWrite scope. The server publishes protected-resource metadata (RFC 9728) and returns 401 with a WWW-Authenticate header pointing to it. Tokens are validated on every call: signature, issuer, audience, expiry, and scope. Every tool except get_methodology needs a signed-in user.

Tools

  • get_methodology · Sign-in: No
    Explains how Itemize works: the no-price-origination rule, what "not stated"/"to confirm" means, the "Itemize drafts; the owner quotes" notice, and what persists. No user data involved.
    Inputs: none.
    Example: "How does Itemize decide what to charge?"

  • draft_quote · Sign-in: Yes
    Extracts a structured quote draft from a pasted job description: client, line items (priced only when a dollar amount or clear cue phrase was actually stated), totals, terms, 30-day expiry. Unpriced items render "price to confirm" — never a guess.
    Inputs: text (required).
    Example: "Repaint the fence out back, two coats, customer is Maria Alvarez, quoted her $4,800."
    Errors: invalid_params.

  • revise_quote · Sign-in: Yes
    Revises a quote with a plain-words change. When the change implies a price change, a lever (discount_total, cut_scope, or change_line_item) must be named before the math changes — never inferred.
    Inputs: quoteId, instruction (required), lever (required if the change implies a price).
    Example: "Make the deck $200 cheaper."
    Errors: invalid_params, not_found, nothing_to_revise, revision_failed.

  • set_profile · Sign-in: Yes
    Stores the shop's own identity for the quote document header: business name, contact info, standard terms, default expiry, tax rate. Explicit opt-in — nothing here is guessed or pre-filled.
    Inputs: businessName (required), contactInfo, standardTerms, defaultExpiryDays, taxRate.
    Example: "Set my shop name to Riverside Painting Co."
    Errors: invalid_params.

  • list_quotes · Sign-in: Yes
    Lists the owner's saved quotes as headlines (customer, total, status, expiry), optionally filtered by customer. Passing a quoteId instead returns that quote's full detail. Capped at limit (1-100, default 50).
    Inputs: quoteId, customer, limit (all optional).
    Example: "What have I quoted this month?"
    Errors: invalid_params, not_found.

  • mark_status · Sign-in: Yes
    Records what happened to a quote after it left Itemize — sent, accepted, declined, or expired — exactly as the owner states it. Never inferred from time elapsed. Marking a quote sent or accepted past its own expiry date comes back with a non-blocking note, never a refusal.
    Inputs: quoteId, status (both required; status is one of sent, accepted, declined, expired).
    Example: "Mark the Alvarez quote as accepted."
    Errors: invalid_params, not_found.

  • remember_rate · Sign-in: Yes
    Saves a per-description rate you state (e.g. "paint: $45/gal") so a future draft_quote with a matching line item doesn't need the price retyped. Exact description match only — the price is always your own stated number, never looked up or adjusted.
    Inputs: description, unitPrice (both required), category (optional, defaults to "materials").
    Example: "Remember that paint is $45 a gallon."
    Errors: invalid_params.

  • list_rates · Sign-in: Yes
    Lists every rate you've saved via remember_rate.
    Inputs: none.
    Example: "What rates have I saved?"

  • get_client_history · Sign-in: Yes
    Answers "what have I quoted this customer before?" — resolves the client (substring match) and returns their known job sites plus every one of their quotes' current headline, status, and expiry. Capped at limit (1-100, default 50) across every matching client combined.
    Inputs: customer (required), limit (optional).
    Example: "What have I quoted Riverside Cafe before?"
    Errors: invalid_params.

  • delete_quote · Sign-in: Yes · Permanent
    Owner-only, irreversible: deletes one quote — every version of it, plus any cached extraction pointing at it.
    Inputs: quoteId (required).
    Example: "Delete that fence quote."
    Errors: invalid_params, not_found.

  • delete_my_data · Sign-in: Yes · Permanent
    Owner-only, irreversible: deletes your entire account — shop profile, every quote ever drafted (every version), every client record, every saved rate.
    Inputs: none.
    Example: "Delete all my Itemize data."

Errors

If the token is missing, expired, or lacks Itemize.ReadWrite, tools that need sign-in return HTTP 401 with a WWW-Authenticate header. Tool errors come back as a result with isError set to true and a short, readable message; the codes are listed with each tool above.

Limits

  • No connector-specific rate limit is enforced or published.

  • delete_quote and delete_my_data are permanent — there is no undo, and Muse will ask for confirmation every time, never "always allow."

What it won't do

  • It never originates a price — every dollar traces back to your own stated text.

  • It never sends, schedules, or auto-sends a quote. Draft-only, forever.

  • It shares nothing with advertisers.

Questions? support@avaresearchllc.com · Back to Itemize