Make it Real exposes an MCP (Model Context Protocol) server so tools like Codex, Claude Code, Claude Desktop, and Cursor can read and edit your projects directly. Sign in to your client with your existing AI subscription; its plan limits still apply. Make it Real hosting is separate.
The MCP provides project discovery, site files, data collections, and backend scripts for accounts with script access. Admins can also manage newsletter templates and campaigns. Personal email and scheduling use the separate Inbox MCP.
MCP server
Server URL:
https://www.makeitrealapp.com/mcp
Enable access from Integrations after you sign in. Turning MCP off immediately rejects connected clients until you turn it back on.
Codex
Add Make it Real, then authorize access:
codex mcp add makeitreal --url https://www.makeitrealapp.com/mcp
codex mcp login makeitreal
Complete the browser authorization to make your project tools available in Codex.
Claude Code
Run this once in your terminal:
claude mcp add --transport http makeitreal https://www.makeitrealapp.com/mcp
Claude Code will prompt for authorization the first time it connects. Complete the OAuth flow in the browser, then the tools appear in that session.
Cursor
Add an MCP server in Cursor settings and paste the server URL, or put this in your MCP config:
{
"mcpServers": {
"makeitreal": {
"url": "https://www.makeitrealapp.com/mcp"
}
}
}
The first connection opens an OAuth prompt in your browser.
What's exposed
Each operation appears as its own MCP tool with defined inputs and outputs. Available tools depend on your account permissions. SDK references are also available as MCP resources.
Clients with native tool search can load the tool definitions they need on demand. No special catalog header is required. Refresh your connection's tools after an update. The complete operation catalog is listed below.
-
get_project_analytics— Read stored website traffic, engagement, conversion events, trends, and top breakdowns. Dates are inclusive UTC dates, defaulting to the last 30 days including today. Comparisons use the preceding equal-length period. Does not fetch external data or start scans. -
get_project_seo_summary— Start here to inspect stored search performance, SEO campaign settings, latest check status and successful observations, and recent campaign actions. Reports include dates and sample limits. Use read_project_seo_report for details and history. Paid SEO reports require existing SEO access; Google Search is independent. Never starts scans or billing. -
read_project_seo_report— Read saved SEO evidence. report is search, queries, pages, indexing, organic, maps, backlinks, ai, or actions. Check lists return metadata; pass a returned check_id for paginated sampled items or AI citations and answer text. Current campaign configurations are the default; include_history also returns checks under previous settings, explicitly labeled. Search Console uses the current connected domain. No network requests or paid scans. -
list_email_templates— Admin only. List this project's reusable newsletter templates without HTML/CSS. Read a template before editing its raw source. -
get_email_template— Admin only. Read a newsletter template's subject, raw HTML, and CSS for editing. Saving a template does not send email. -
save_email_template— Admin only. Create or update a reusable newsletter template. Omit template_id to create; supply it to update. Read before editing. Supply full raw HTML/CSS for changed fields; omitted fields are preserved. Does not send email or alter already scheduled campaign content. -
delete_email_template— Admin only. Delete a reusable newsletter template. Templates referenced by campaigns cannot be deleted. -
list_email_audiences— Admin only. List data collections with eligible email counts, read directly from submissions without copying a subscriber list. Counts exclude invalid addresses, duplicates, and unsubscribes and can change before sending. Specify collection_id and email_field to count a particular payload field. -
list_email_senders— Admin only. List your eligible Inbox sending addresses on verified active domains for newsletter campaigns. Other users' addresses are excluded. Use sender_address_id when saving a draft; an empty sender_address_id uses the returned default_sender. -
list_email_campaigns— Admin only. List this project's newsletter campaigns and delivery counts. Get a campaign for its saved email content. -
get_email_campaign— Admin only. Read a newsletter campaign and its saved subject/HTML/CSS snapshot. Draft content is taken from the template when scheduling or sending. -
save_email_campaign— Admin only. Create or update a draft newsletter campaign using a project template and submission collection. Choose your optional Inbox sender with list_email_senders. Omit campaign_id to create; omitted fields on updates are preserved. Does not send or schedule email. Count the audience and read the template before the separate send/schedule action. -
schedule_email_campaign— Admin only. Schedule a draft campaign for future delivery to the chosen submission collection. This authorizes real email delivery and freezes the template content; recipients are resolved from current submissions at send time. Use only when the user requests sending at the given time. -
send_email_campaign— Admin only. Queue a draft campaign for immediate real email delivery. Freezes template content and uses the current eligible submission audience when the job runs. Use only when the user explicitly requests sending. A queued response does not mean delivery has finished; inspect the campaign for status and counts. -
cancel_email_campaign— Admin only. Cancel a campaign before delivery starts. Already sent emails cannot be recalled. -
list_scripts— List project scripts with draft/live version IDs and endpoints. Follow next_offset with the same limit for more. Listing order is live and may change when scripts are renamed. -
read_script— Read a saved script version and permissions. Secret values are never returned. -
edit_script— Replace one exact, unique source fragment in the latest saved script. Creates an immutable draft, preserves permissions, never publishes. Read first; stale base versions and ambiguous matches are rejected. -
list_script_versions— List saved script versions newest-first with test/publication state. Follow next_before_number for older versions. Use read_script with version_id for source; rollback requires explicit publication. -
list_script_executions— Inspect script executions and redacted console logs. Follow next_before_id for older runs. Set log_chars to bound each log tail; omission preserves full logs. Full logs and stored inputs/outputs are available at editor_url. Secret values are never returned. -
save_script— Create/update an immutable draft. Never publishes. Read first and supply latest base_version_id. In managed staging, ties the version to the current preview for approval. -
test_script— Test an exact saved draft in the sandbox. Collection writes are simulated and external requests disabled. Does not publish. -
publish_script— Publish a successfully tested saved version. Only for live authoring; managed scripts publish with website approval. -
get_scripts_sdk_reference— Browser SDK and sandbox API for project backend scripts. Read before adding backend functionality. -
list_projects— List all projects accessible to the current user. -
get_project— Get project details, site URL, deployment status, and MCP authoring capabilities. The mcp_workflow field explains that file writes affect the live site, script saves create drafts, and publishing a script requires a successful test. -
get_project_status— Get the current deployment status of a project. -
preview_site— Get the project website URL with an Open site button in supporting clients. Use only when the user asks for a site link. Project details and status already include site_url. -
list_files— List files in a project with total_count, truncated and next_offset. Continue with the same filters and next_offset as offset. Use path_prefix for a folder or glob (e.g. **/*.css). The listing is live; edits may change pagination. -
read_file— Read file text. Prefer response_format: structured for exact text with coverage, revision and next_offset (including very long lines). Continue with the same path/line range and expected_revision. start_line/end_line are 1-based inclusive. Omitted response_format retains the legacy string, capped at 12000 characters. -
write_file— Create or fully overwrite a text file with UTF-8 content. Prefer edit_file for small targeted changes; use write_file for a new file or a necessary full rewrite. Text files only: for PDFs, images, ZIPs, fonts, or other binary files, use import_file with an attachment or HTTPS URL, or create_file_upload_url, HTTP PUT, then finalize_file_put in shell sessions. -
edit_file— Replace a small unique text chunk in an existing file. Prefer this over write_file. old_string must be unique unless replace_all is true — include a few lines of surrounding context; do not send the whole file. -
delete_file— Delete a file from a project. -
search_files— Search file contents. Prefer response_format: structured for bounded snippets, scanned coverage, and next_page. Continue with the same filters plus next_page fields. Files may change during a search; listing revision detects added/removed paths. Omitted format retains a legacy array that may be partial. -
create_file_upload_url— Create a time-limited URL to upload or replace a project file, including PDFs, images, ZIPs, and fonts. Shell sessions must HTTP PUT the file bytes to put_url with the returned headers, then call finalize_file_put. This tool only creates the URL; it does not transfer bytes. In ChatGPT and other chat hosts without HTTP upload access, use import_file with the attached file object or a public HTTPS URL. -
finalize_file_put— Complete a project file upload after create_file_upload_url and a successful HTTP PUT. Injects analytics into HTML. Cache refresh is a separate explicit action. Call only after uploading the bytes; import_file already finalizes automatically. -
import_file— Upload or replace a binary file in a project (PDF, image, ZIP, font, etc.). In ChatGPT and other chat hosts, use this for attached files: pass file with the host's temporary download_url (optional file_id, file_name, mime_type), or source_url for a public HTTPS file. Returns the completed file in one call; maximum 25 MB, 45 seconds. In shell sessions with HTTP upload access, prefer create_file_upload_url, HTTP PUT, then finalize_file_put. -
refresh_site_cache— Refresh the project's website CDN cache so visitors can receive the latest saved files. Call only once after you are done with all edits, uploads, and deletions for the task. Never call after each file change or while more edits remain. Refresh is asynchronous; a started result does not mean propagation is complete or the site has been browser-verified. -
list_collections— List project collections with stored submission counts, analytics_enabled settings, and schema. Prefer response_format: compact for a paginated object with one schema representation. Omitted format preserves the legacy array. -
list_submissions— List collection submissions newest-first. Prefer response_format: structured for pagination and coverage (25 by default); pass next_before_id as before_id with the same collection and fields. fields selects comma-separated payload keys. Omitted format preserves the legacy array of up to 100 recent submissions. -
create_collection— Register or update a collection before writing form or public read code. Optional fields JSON defines the form questions. Set analytics_enabled to false for caches or internal storage that should not count as leads. -
get_data_sdk_reference— How mir-data.js and POST /api/data work for form submissions. -
get_data_read_reference— How public data reads work for dynamic project sites.