MCP guide
https://mcp.mxaura.ai/mcp is a remote Model Context Protocol server.
Point an MCP-capable assistant at it, sign in, and the assistant can read
(and, with the right scopes, act on) your mxAURA account through 21 tools.
It speaks MCP protocol 2025-06-18 over streamable HTTP, authenticates with
OAuth 2.1 (PKCE, dynamic client registration), and every call goes through
the same public API as an API key would — same scopes, same rate limits,
same tenant boundary.
Connect
Claude.ai (web / desktop app)
Settings → Connectors → Add custom connector → URL
https://mcp.mxaura.ai/mcp → Connect. A browser window opens to
auth.mxaura.ai; sign in to mxAURA, review the scopes, approve. Done.
Claude Code
claude mcp add --transport http mxaura https://mcp.mxaura.ai/mcp
then /mcp inside a session to authenticate.
Cursor / other MCP clients
Add a server of type "streamable HTTP" (or "remote") with the URL above. If
the client cannot do OAuth itself, use the mcp-remote bridge:
{ "mcpServers": { "mxaura": { "command": "npx", "args": ["-y", "mcp-remote", "https://mcp.mxaura.ai/mcp"] } } }
What happens underneath
- The client fetches
https://mcp.mxaura.ai/.well-known/oauth-protected-resourceand learns the authorization server ishttps://auth.mxaura.ai. - It reads
https://auth.mxaura.ai/.well-known/oauth-authorization-server, registers itself at/register(RFC 7591), and opens/authorizewith a PKCE S256 challenge. - You sign in to mxAURA (2FA if enabled) and approve the scopes shown.
- The client exchanges the code at
/tokenand gets an access token (mxa_oat_…, 1 hour) and a refresh token (30 days).
No secrets are typed anywhere. To disconnect, remove the connector in the client; its access token expires within the hour and cannot refresh. Removing an integration from mxAURA's side is on the roadmap.
Scopes and the support profile
A client that asks for no specific scopes gets the support profile:
components.read brandings.read pools.read campaigns.read flows.read
hubs.read articles.read identity.read dispatch.read
Every read, nothing that sends, publishes or spends. A client may request it
by name (scope=support) or ask for specific scopes; the consent screen
shows exactly what will be granted. tools/list only returns the tools the
token can call, so an assistant never sees a tool it cannot use.
The tools
| Tool | Scope | What it does |
|---|---|---|
get_me |
any | Who the token is: account, scopes |
list_components, get_component |
components.read | Messages, headers, summaries, signatures, senders, templates |
list_pools, get_pool, get_pool_messages |
pools.read | Pools and the ordered messages composed into them |
compose_message |
pools.write | Compose a message into a pool |
list_campaigns, get_campaign |
campaigns.read | Campaigns |
simulate_campaign |
campaigns.read | The full journey a contact would receive — read-only, the same engine dispatch uses |
list_flows, get_flow |
flows.read | Flows with enrollment counts |
enroll_contact |
enrollments.write | Enroll a HubSpot contact — sends real email, capped per hour |
get_dispatch_log |
dispatch.read | What was sent, to whom, with what result |
list_hubs, get_hub, get_hub_stats |
hubs.read | Hubs, their settings and embed details, 30-day traffic |
list_articles, get_article |
articles.read | Articles: metadata, status, placements, SEO, stats |
get_identity |
identity.read | The messaging identity (frameworks) |
list_brandings |
brandings.read | Brandings |
Each tool's description and input schema are served by tools/list; the
assistant reads them directly.
What the model can and cannot see
Bodies are never returned to the model. Message HTML, article markdown,
layout templates, personal messages come back as their length
(html_chars: 2140) instead of their text. Content a user wrote is untrusted
input to a model: a hub article must never be able to instruct an assistant.
A workflow that truly needs a body fetches it over the REST API.
Everything else — names, ids, statuses, positions, stats, reasons — comes back as structured JSON.
Limits
MCP calls are API calls. The token's burst (25 / 10 s), per-minute (120) and
account (600 / min) limits apply, and the assistant is told when it hits one
(rate_limited (HTTP 429): …) so it can back off rather than crash the
session. Tool results are truncated at 100 KB.
Typical questions it can answer
- "Why didn't Darren get Tuesday's email?" →
get_dispatch_log, filter by contact; the entry saysblocked / no_senderorfiltered / …. - "What would this contact receive from the Q4 campaign?" →
simulate_campaign. - "Which hub is the pricing article in, and is it live?" →
get_article. - "How much traffic did the Insights hub get this month?" →
get_hub_stats. - "What's our positioning?" →
get_identity.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Client says "unauthorized" after connecting | Access token expired and the client did not refresh | Reconnect; most clients refresh silently |
| A tool is missing | The token lacks its scope | Reconnect and approve the scope, or accept that support is read-only |
enroll_contact returns enrollment_cap |
Hourly cap reached | Wait for Retry-After |
| "server did not respond" | Network, or the client is using a stdio transport | Use a streamable-HTTP transport or mcp-remote |
https://mcp.mxaura.ai/health reports the server and protocol version
without authentication.