
Portal MCP server
Which MCP servers are Portal's own, from the official registry and from asking its own domain, whether they answer, and what they offer. A program checked each of these, nobody copied them from a product page.
read 2026-10-10
- Addresshttps://mcp.makeportals.com/mcpnot in the official registry: answered when asked
No entry in the official MCP registry names this server. It answered on makeportals.com when the Atlas asked at the address servers are usually mounted on, so it is the vendor's own. Clients and catalogues that list servers from the registry do not show it.
- Stateanswerschecked 2026-10-27
- Tools54
- Server calls itselfportal-mcp
- Server version1.0.0
- Protocol version2025-06-18
On 2026-10-27 the server answered initialize and tools/list without a sign-in. First answer in 83 ms.
- Whether its tools do the product's job has not been judged yet.
Once connected
- upload_source, upload_source_chunk, upload_env, builder_publish, update_portal_env change data without a sign-in: anyone with the address can call them.
- Its definitions take about 15566 tokens of context: enable only the tools a task needs.
Said by rules from the measurements above. The likely first call is a model's pick from the tool list; read its description before relying on it.
- INITE MCP score70 of 100answers 100 · definitions 80 · context 56 · connects 100 · lowered by the warning signs below
- Answered100% of days9 of 9 daily checks
- Median first answer240 ms
- Space in an agent's context≈ 15,566 tokensthe definitions of all its tools (54), which an agent carries on every turn
- Tool definitionsB · 80 of 100
- Typed results0 of 54 toolsdeclared outputSchema: results come typed, read once
- Parameters without a description: in 12 of 54
- Not saying whether it only reads or can destroy: 53 of 54
Worth a look
- Tools that change data, on a server that answers without a sign-in: upload_source, upload_source_chunk, upload_env, builder_publish, update_portal_env
A program checks the server once a day: initialize and tools/list, no model. Tokens are the definitions' length at about four characters a token. The grade averages six checks of every tool's name, description, schema and annotations; it says how well the tools are described, not whether they work. The score weighs what was measured and nothing else: answering (25%), doing the product's job (25%), definitions (20%), context (10%), use (10%) and how readily a client connects (10%). A part that was not measured is left out, and a hidden instruction caps the score at 40. The state of vendors' MCP servers: method and numbers →
portal_loginSign in to Portal. Returns a verification_url and device_code. After this tool returns, do these steps IN ORDER: Step 1 (REQUIRED FIRST): Run a shell command to open the browser: macOS: open "VERIFICATION_URL" Linux: xdg-open…
portal_login_checkWait for login approval after portal_login returned a device_code. This tool polls for up to 30 seconds, then returns. IMPORTANT: Only call AFTER you have opened the browser with the verification_url. If status is "pending", call this…
portal_logoutSign out of Portal for this session.
portal_statusCheck if you're signed in to Portal. Call this first — if not authenticated, run portal_login. Portal creates shareable links to live, sandboxed browser sessions for any website. AFTER AUTH, follow this flow: CRITICAL RULE: NEVER ask for…
normalize_ptlNormalize a .ptl Portal spec into canonical form.
validate_ptlValidate a .ptl Portal spec without creating a portal.
upload_sourceSend a local project to Portal for deployment. Returns a shell command to upload the zip. IMPORTANT: Do NOT base64-encode files or pass file contents as tool arguments. That wastes tokens. This tool returns a shell command that uploads…
upload_source_chunkUpload a project zip through this MCP connection, in base64 chunks. Use when the shell command from upload_source is blocked or your sandbox cannot reach the upload host. Max 25 MB zip; each chunk must decode to at most 512 KB. Steps (run…
import_github_repoImport a public GitHub repository as the source for a local-file Portal. Returns a source_id to use in make_portal. This creates a snapshot of a repository commit for reproducible deployment. It is NOT live branch sync. Use this when the…
upload_envDEPRECATED — prefer configure_runtime instead (opens a secure browser form so values never enter chat). Upload environment variables for a local-file/GitHub Portal. Returns an env_id to use in make_portal. Read the .env file and pass its…
configure_runtimeOpen a hosted form for the user to securely enter runtime variables (API keys, DB URLs, etc). Values never pass through AI chat. Returns a hosted_url — open it for the user. Before opening, tell the user: "This app needs setup values…
make_portalSTOP: You MUST show the user a draft summary (greeting, selectors, mode, URL) and ask for a name BEFORE calling this tool. If you have not done that yet, do it now instead of calling make_portal. Create a Portal and get a shareable link…
get_portalCheck if a portal is ready. Returns "provisioning", "ready" (with URL), or "failed". Poll every 15s for up to 5 min — cold starts take time. When "ready", open the URL for the user.
list_portalsList the user's recent portals (up to 20, newest first). Use this to check if a portal already exists for the same URL before creating a new one. Also useful for the user to re-open or share a previous portal.
get_portal_sessionsGet session replays for a portal. Returns viewer sessions with conversation logs and signed recording URLs (10 min). If the user says "get me session replays for X", call list_portals first to find the matching portal_id, then call this…
configure_portalName a portal, set usage limits, and add a call-to-action button. Auto-refill stays enabled. The user can adjust further in the web UI. Call after make_portal to customize the link before sharing. The URL slug is set at creation time via…
browser_start_link_sessionStart driving a portal's live browser using only its share link (no API key needed). You get what a visitor with that link gets: it spends ONE use of the link, lasts the portal's session time (10-30 min), real clicks/typing/scrolling only…
browser_end_link_sessionEnd a link session early (does not refund the use).
browser_list_portalsList the portals your API key can drive: your persistent portals, including ones built at makeportals.com/create. Use the `portal` value with the other browser_ tools.
browser_statusIs the portal in use right now (in_use), when was it last opened (last_opened_at) and last left (last_session_ended_at)? Use this for "has my teammate opened it yet?". Also: controllable by you now, uptime, compute estimate, watch_url…
browser_screenshotScreenshot of the portal's live browser tab. Coordinates for browser_action: CSS px = screenshot px / device_pixel_ratio.
browser_actionOne real input in the portal's live browser (the page cannot tell it from a person; blocked controls stay blocked). action: click | hover (x,y or selector; clicks:2 for double) · type (text, optional selector to click first, submit:true…
browser_live_viewShow the user a live, view-only picture of the portal's browser right here in the chat. Call this ONCE at the start of any task in a portal (before browser_action), so the user can watch you work. It does not take the seat or interrupt…
browser_open_portalEmbed the portal's interactive viewer right here in the chat — the user can click, type and use it inline. Pass `link` (a https://www.makeportals.com/demo/... share link) or `portal` (name/slug/portal_id — its first share link is used)…
browser_evalRun JavaScript in the page of YOUR OWN portal (not available with a share link). Returns the value (JSON). ≤ 20 KB of code, ≤ 30 s. It runs as the signed-in site: use it to read the page, not to bypass what the portal blocks.
builder_startOpen a Portal Builder session: the same Builder as makeportals.com/create, with you as the creator. Claims a live cloud browser on `url` and talks to the Builder AI, which configures the Portal: mode (play/watch), what the AI says and is…
builder_messageSend the next message to the Builder AI in a session (answer its questions or ask for changes: "make the VC tougher", "block billing and settings", "sessions of 20 minutes", "add this FAQ to what the AI knows"). Returns its replies, any…
builder_statusSettings, recent conversation and publication state (share link once published) for a Builder session.
builder_publishPublish the Builder session as a Portal. Show the user the settings and get their OK first. Returns share_url immediately; it starts working when publication finishes. Poll builder_status until publication.state is "ready".
builder_endClose a Builder session without publishing and release its cloud browser.
update_portal_envUpdate environment variables on an existing portal without spending a credit. Pass the env_id from a completed configure_runtime session. IMPORTANT: This only updates the pool config. Already-running VMs keep their old env until they are…
create_linkCreate a new share link for a portal with optional per-link greeting and goal. Each link gets its own URL. Use greeting/goal to personalize the experience per recipient. Example: create a link for "John" with a greeting mentioning his…
list_linksList all share links for a portal, including their dynamic greeting/goal if set. Shows each link's URL, label, uses remaining, session count, and any per-link greeting/goal overrides.
configure_embedEnable embedding for a portal on a specific website. Ask the user what site they want to embed on (e.g. "https://yoursite.com"). Returns the embed URL, an <iframe> snippet, and a console_snippet. The console_snippet is a…
save_loginSpin up a sandbox browser so the user can sign into a site. This is the ONLY way to handle authentication — NEVER ask for credentials in chat. You only need the URL. Call this tool, then IMMEDIATELY open the hosted_url in the user's…
save_login_completeSave the login state after the user has logged in via the hosted UI. After save completes, the hosted UI shows a "Keep this Portal logged in?" prompt where the user can optionally store credentials for auto re-login. This is handled…
record_demoRecord a demo by clicking through a site. After this returns, in your next tool call batch: 1. Run shell: open "HOSTED_URL" (macOS) | xdg-open (Linux) | start (Windows) 2. Call get_session with the session_id to start polling Then poll…
start_recordingBegin the actual recording after user is ready at the hosted UI.
stop_recordingStop recording and compile the demo into structured scenes. Returns compiled scenes with narration, actions, selectors, and Q&A. Show the user the compiled scenes/greeting/Q&A. Ask: "What do you want to call this? Look good to go?" Once…
pick_selectorsOpen a hosted browser where the user visually clicks elements to block in play mode. After this returns, in your next tool call batch: 1. Run shell: open "HOSTED_URL" (macOS) | xdg-open (Linux) | start (Windows) 2. Call get_session with…
pick_selectors_completeRetrieve the selectors the user picked in the hosted selector UI. Call this after get_session shows status "selectors_saved". Returns the selectors array to use as blocked_selectors in make_portal. Show the user the selectors. Ask: "What…
get_sessionWait for a login, recording, or selector session to reach a terminal status. This tool polls the server for up to 30 seconds, then returns. If status is still pending, call this tool again immediately — do NOT ask the user. Repeat up to…
create_scriptExplore a website and auto-generate a demo plan, guardrails, Q&A, and knowledge (~10s for public URLs). Returns script_id. Poll get_script every 5-15s until status is "draft". With saved_state_id: uses headless browser with saved login…
get_scriptCheck if a script is ready. Statuses: "generating", "draft" (ready for review), "failed". CRITICAL: When "draft", you MUST show ALL of these to the user. Do NOT skip any step: 1. MODE: "Should this be a guided demo (watch) or free-browse…
create_credentialCreate a credential vault entry for automated login. Credentials are encrypted at rest and never returned via API. Use with save_login or create_script for pre-authenticated sessions. IMPORTANT: ONLY use this tool when the user…
list_credentialsList all credential vault entries (metadata only, no secrets).
generate_totpGenerate a TOTP 6-digit code from a stored credential vault entry. The credential must have a totp_secret. Returns the current code and seconds remaining. Use this when re-authenticating a session that requires 2FA.
delete_credentialDelete a credential vault entry.
buy_creditsBuy Portal credits ($0.40 each). Starter: 10/$4, Builder: 50/$20, Pro: 100/$40. Opens Stripe checkout. Returns checkout_url — open it in the user's browser. Credits are added automatically after payment.
subscribeSubscribe to the Builder plan ($20/month). Opens a Stripe checkout page. Builder plan includes: 5 active Portals, 50 demo sessions/month, 10 min sessions, 5 concurrent viewers, analytics, and additional sessions at $0.80 each. Returns…
subscription_statusCheck the current subscription status (tier, billing period, trial end). Returns: tier (free/builder), subscription status, period end date, and trial end date. Use this to check if the user is subscribed before suggesting subscribe or…
cancel_subscriptionCancel the Builder subscription. Access continues until end of billing period. Cancellation is immediate but access remains active until the period ends. Returns the date when access will expire.
deploy_exampleDeploy a built-in example app to demonstrate a Portal feature. Available examples: "rate-limit-demo" — React + Express chat app with a mock LLM backend. Demonstrates Portal's API rate limiting: each chat message calls POST /api/chat…
get_creation_logsRetrieve the tool call log for an MCP session. Shows every tool called, inputs, outputs, errors, and timing. Use this to debug portal creation issues — see exactly what tools were called and what they returned. The current session's ID is…
How to connect
Add the server to your MCP client config. Claude Desktop, Cursor and most other clients read this shape:
{
"mcpServers": {
"makeportals": {
"type": "http",
"url": "https://mcp.makeportals.com/mcp"
}
}
}Add it
Claude Code, in a terminal
claude mcp add --transport http makeportals https://mcp.makeportals.com/mcpclaude.ai, ChatGPT and other clients: add https://mcp.makeportals.com/mcp as a custom connector in the settings.
Each line is something a program found when it went looking: the registry entry, the server's own answer, a spec that parses. A missing line means we did not find it, not that it does not exist.
Before we count this visit
Analytics and ad measurement tell us which pages and which of our ads do their job: Google Analytics and Google Ads, the Meta pixel, Yandex Metrica, and one first-party id of our own. Nothing is stored until you answer, and declining changes nothing about the site.