MCP Tools
The developer reference for the AI Assistant Connector — every tool the connector exposes, with inputs, behavior, role gates, and rate limits.
The AI Assistant Connector is an MCP server — the open standard AI assistants use to connect to tools. When an assistant connects through the connector URL, it discovers a set of tools scoped to one site and one account. This page is the reference for that tool set.
Connecting
The connection is the same three-step flow your users follow — see The AI Assistant Connector for the walkthrough:
- Add a custom connector in the assistant's settings.
- Paste the connector URL shown under Website Settings → AI Connector. The URL is specific to your site; it is distributed from that page and nowhere else.
- A browser opens; the approving user signs in to their own site and clicks Approve.
The connection then carries that account's permissions. Discovery mirrors execution: the assistant only ever sees the tools the approving account is allowed to run.
Administrators are refused. The connector exists to put one advisor firm's site within reach of that firm's own assistant. Administrator accounts are deliberately refused at sign-in. Directors connect, from Website Settings → AI Connector.
One connection, one site. Each site's connector URL is unique to that site, and no tool can reach past it.
Content tools
Every managed content type gets the same five verbs. Tool names carry a ucre-subscriber/
namespace prefix; below they are written without it.
| Tool | Purpose | Key inputs |
|---|---|---|
list-<type> | List a type's posts — draft, pending, and published — with id, title, status, and links | post_status (draft / publish / pending / any), per_page (default 50, max 200), page |
get-<type> | Read one post, including its current field values | post_id |
create-<type> | Create a post — always as a draft; publishing is a separate call | post_title, then fields or copy (never both) |
update-<type> | Update fields and optionally the title; cannot change publish status | post_id, post_title, fields or copy (+ copy_fingerprint when copy is present) |
publish-<type> | Publish a draft — draft to published only; anything else is refused | post_id |
Publishing runs the same pipeline as a publish in the dashboard — search metadata, the information AI can read, and indexing pings all fire exactly once.
Behavior rules worth knowing:
- Create is always a draft. New work starts as a draft, every time.
- Fields and copy are mutually exclusive on create and update — one or the other per call.
- Copy updates are optimistic-concurrency writes. The
copy_fingerprintmust come from the lastgetreadback; a stale fingerprint fails. Before saving copy on a published post, the assistant is expected to show the current text and the exact proposed change and get explicit user confirmation. - Unrecognized or unwritable
fieldskeys are refused by name, with a reason, in the response.
Which types are open
| Type (tool suffix) | List / get / create / update | Publish |
|---|---|---|
listings | Director and Advisor; Staff drafts only | Director — any; Advisor — own |
agents (team profiles) | Director — all; Advisor — own profile (advisors never create profiles) | Director — any; Advisor — own |
articles | Director; Staff drafts only | Director only |
deals (track record) | Director and Advisor — Staff has no access | Director — any; Advisor — own |
case-studies | Director and Advisor; Staff drafts only | Director — any; Advisor — own |
services | Director only | Director only |
market-reports | Director only | Director only |
testimonials | Director only | Director only |
Advisors see their own posts; Directors see the whole site; Staff see their own drafts only. One content type is deliberately absent from the surface: zoning profiles.
Two content-adjacent tools
| Tool | Purpose | Key inputs |
|---|---|---|
intake-listing-facts | Fill empty listing fields with facts read from an attached document (offering memorandum, survey, flyer). Fill-empty-only — it never overwrites a value already set | post_id, source_doc, facts |
set-case-study-permissions | Record what the client approved, as set in this chat: may the client be named, may figures be shown, the asking price, lead agent, team members | post_id, client_named, figures_shown, list_price, lead_agent, team |
The long-copy write path
Narrative and marketing copy is not written through generic fields — it has its own typed
copy input on create-<type> and update-<type>, so long text, HTML, and repeatable
structures arrive shaped correctly.
| Type | Copy fields |
|---|---|
| Articles | Hook, body, key takeaways, search title, search description, LinkedIn post, email teaser, author byline; the market-news kind adds summary, implications, advisor take, action items, client email alert |
| Listings | Property description, buyer personas, highest-and-best-use analysis, financial summary, location intelligence, talking points, objections, LinkedIn post, Facebook post, Instagram reel script, hashtags, buyer / broker / seller emails, highlights, search title, search description |
| Market reports | Hero description, summary, body, key takeaways, outlook, advisor take, investor implications, tenant implications, LinkedIn post, sources and methodology, data table, charts, FAQ, search title, search description |
| Case studies | Headline, summary, challenge, strategy, outcome, key lessons, testimonial, LinkedIn post, prospect email, search title, search description |
Rules: rich-text fields carry sanitized HTML; a request body is capped at 1 MiB; copy and
fields can never be sent in one call; and copy updates always require the fresh
copy_fingerprint described above.
Leads tools
Leads are read-first. Three of the four tools only read; the fourth changes a status and nothing else — no outreach is ever sent through the connector.
| Tool | Purpose | Key inputs |
|---|---|---|
list-leads | Summary rows — name, email, type, source, status, date | status, form_type, after / before (dates), per_page (max 200), page |
get-lead | One lead in full — the same 41 columns as the dashboard's CSV export | post_id |
export-leads | A CSV plus a plain-text paste block for the same set | status, form_type, after / before |
mark-lead-status | The only lead write: set the status — new, contacted, qualified, proposal, closed, lost, or spam | post_id, status |
Who sees what: Directors see all leads; Advisors see their own; Staff can read firm-wide but can never change anything. A lead an account cannot see answers not-found.
Media tools
Images move through a brokered two-step, so the assistant never handles site credentials for uploads.
| Tool | Purpose | Key inputs |
|---|---|---|
request-media-upload | Mint a private upload link plus one-time tokens for the requested images | post_id, field, count (gallery only) |
attach-media | Attach the uploaded files to the post's field; returns per-file results | tokens, post_id, field |
Constraints: JPEG, PNG, or WebP; up to 10 MB per image; at most 20 images per request; listing and case-study galleries hold up to 30 images; hero images and team headshots are single-image fields. Tokens are single-use and short-lived — the response carries the expiry. Rejected files come back with a reason per token, and partial success is reported as attached / rejected counts.
Site options
Brand and identity settings are readable by every role and writable through a fixed whitelist — so an assistant can match the site's voice before it writes, but cannot touch anything that matters.
| Tool | Purpose | Key inputs |
|---|---|---|
get-site-options | Read brand, identity, voice, and contact settings | keys (always provide the property; an empty array returns the full set) |
update-site-options | Write the whitelisted settings — Director only | options (name → value; validated before any write, no partial batches) |
The writable set covers business name and short name, tagline, geography and primary market, office phone and address, licensed states, the four brand-voice answers, solo-or-team site type, office name, and the four social links. Office email and the franchise identity fields are read-only. Never writable through the connector: webhook endpoints and secrets, compliance and legal identity (brokerage state, license number, designated broker), design, and media.
Modules
| Tool | Purpose | Key inputs |
|---|---|---|
list-modules | Which modules are active and which are settable — Director only | modules (optional filter) |
set-module | Turn a module on or off — Director only, and consequential: it changes what the live site does on the next page load, so the assistant must confirm with the user first | module, active |
Generation
Two tools queue and track AI copy generation for a draft listing — the same guarded pipeline the built-in assistants use. Both are Director/Advisor tools; Staff can neither see nor run them.
| Tool | Purpose | Key inputs |
|---|---|---|
generate | Queue generation for a draft listing. The field set is computed server-side from the listing — never caller-supplied | post_id |
generate-status | Poll the job — poll about every 20 seconds until done, then read the listing back and confirm with the user before publishing | post_id |
generate returns a queued shape: job id, the fields queued, a queued-at timestamp, and retry
guidance. It refuses cleanly: nothing to generate when every output is already filled
(fill-empty-only — it never overwrites), and facts_insufficient with a list of what is
missing when the listing lacks any of property type or subtype, city, state, price or lease
rate, building size, or tenancy.
Role gates at a glance
| Capability | Advisor | Director | Staff |
|---|---|---|---|
| Listings, case studies — own drafts | Yes | Yes (all posts) | Drafts only |
| Articles | No | Full | Drafts only |
| Team profile — own | Edit only | Full | No |
| Deals | Own | All | No |
| Services, market reports, testimonials | No | Full | No |
| Publish | Own listings, profiles, deals, case studies | Anything | No |
| Leads | Own — read, export, status | All — read, export, status | Firm-wide read only |
| Site options | Read | Read + write | Read |
| Modules | No | Full | No |
| Generate (listing copy) | Yes | Yes | No |
Rate limits
Connections and generation are rate-limited, and generation also has daily caps. If a call fails with a rate-limit error, wait a minute and retry.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| The connection cannot complete | The custom domain is not live yet — the connector lives on your own address | Finish the custom domain setup first |
| The assistant cannot find the site right after setup | Registration lag | Wait one minute and connect again |
| The settings page says the connector is not ready | Registration did not complete | Reload the page and try again |
| Sign-in refuses the account | The approving account is an administrator | Connect from your Director account |
| Tools the account should have are missing | The assistant only discovers what the approving account may run — role gates apply | Check the role gates table above; connect from an account with the right role |
| A call suddenly starts failing | A rate limit was hit | Wait a minute and retry |
| Copy update fails with a freshness error | The copy_fingerprint predates another change | Re-run get-<type> and retry with the fresh fingerprint |
Still stuck? Email hello@upliftcre.com with your site address and what you see.