eSIMAccess MCP Integration esimaccess.com ↗

eSIMAccess MCP server

Manage the full eSIM lifecycle — browse packages, order and provision profiles, check usage, top up, and run support diagnostics — through natural language in any MCP-compatible AI client.

The Model Context Protocol (MCP) lets AI clients call external tools through a standard interface. This server turns the eSIMAccess Partner API into 16 native MCP tools — an AI-driven control centre for your eSIM business. Connect it to Claude, Cursor, Windsurf, or VS Code Copilot and run the whole lifecycle by chatting with your assistant.

What it accelerates

👨‍💻 Developers

Browse the package catalogue, place test orders, inspect the exact profile payload a call returns, and check live usage — without leaving your IDE or hand-rolling HMAC signatures.

📈 Operations

Pull live status, expiry, and data consumption across your allocated profiles, reconcile the account balance after each batch, and wire up webhooks for real-time order / status / usage events.

🎧 Support

Diagnose an ICCID in a single call — profile, usage, and notes together — check remaining data, and search the support knowledge base for answers your assistant can cite.

⚡ Secure, zero-code setup (recommended). Skip the local install: add one URL to your AI client and complete a one-time browser sign-in. Your AccessCode / SecretKey are sealed into an opaque token — we keep no long-lived copy, and they never appear in tool arguments, URLs, or the model's context.

Deployment modes

ModeBest forAuthInstall
Remote HTTP recommended Most users — add a URL and authorize in the browser OAuth 2.1 + PKCE → short-lived bearer tokenNone
Local stdio Air-gapped / self-hosted; credentials stay on your machine ESIM_ACCESS_CODE / ESIM_SECRET_KEY env vars npx

Prerequisites

  • An eSIMAccess partner account with API credentials (AccessCode + SecretKey) from the developer console.
  • An MCP-compatible client — Claude Desktop, Claude Code, Cursor, Windsurf, or VS Code Copilot.

Connect to the remote server

Point your client at the hosted endpoint:

https://mcp.esimaccess.com/mcp
Production endpoint. This is the live hosted server — nothing to install. Your client discovers the OAuth endpoints from this URL on its own; you never type any of the others.

Claude Desktop quick start

  1. Open settings. Go to Settings → Connectors → Add → Add custom connector.
  2. Enter details. Name: eSIMAccess · Remote MCP server URL: https://mcp.esimaccess.com/mcp. Leave Advanced settings → OAuth Client ID / Secret blank — the server registers your client automatically (dynamic client registration).
  3. Connect & authorize. Click Add, then Connect. Claude opens the browser sign-in (Authorize) where you paste your AccessCode / SecretKey.

Claude Code (CLI)

claude mcp add --transport http esimaccess https://mcp.esimaccess.com/mcp

Cursor

Settings → MCP → Add new MCP server:

  • Name: esimaccess
  • Type: http
  • URL: https://mcp.esimaccess.com/mcp

VS Code Copilot

Add to .vscode/mcp.json:

{
  "servers": {
    "esimaccess": {
      "type": "http",
      "url": "https://mcp.esimaccess.com/mcp"
    }
  }
}

Verify

Ask your assistant:

“Query my account balance”

The client invokes balance_query and returns your eSIMAccess balance.

Authorize (OAuth 2.1 + PKCE)

The first time a tool runs, your client has no token yet, so the server replies 401 Unauthorized and your client opens the authorization page in your browser. There:

  1. Review the scopes the client is requesting (shown as chips).
  2. Paste your AccessCode and SecretKey from the developer console. The server verifies them with a live signature probe, then encrypts them into the opaque tokens it returns (AES-256-GCM); from then on your credentials live only inside that token, not in any long-lived server store.
  3. The client receives a short-lived bearer token (auto-refreshed). Your AccessCode / SecretKey never appear in tool arguments, URLs, or chat context.

PKCE (S256) is required, and bearer tokens must travel in the Authorization header — query-string tokens are rejected.

Scopes

Access is granted per scope; the default grant is esim:read. On the authorization page, destructive scopes are flagged in red so you see them before approving. The real guardrail is at call time, not on the consent screen: every state-changing tool (order, top-up, SMS, webhook, suspend, unsuspend, cancel, revoke) rejects the call unless its arguments carry confirm: true, so no write can happen as a side effect of a vaguely worded request.

ScopeGrantsTools
esim:readRead account, balances, profiles, usage, knowledge base balance_query, get_all_data_packages, query_all_allocated_profiles, usage_check, query_esim_install_info, supported_regions, support_search_knowledge_base, support_diagnose_esim
esim:orderOrder new eSIM profilesorder_profiles
esim:manageTop-up, suspend, unsuspendtop_up, suspend_profile, unsuspend_profile
esim:destructiveCancel and revoke profilescancel_profile, revoke_profile
esim:messagingSend SMS to eSIMssend_sms
esim:webhookConfigure / query the webhook URLset_webhook, query_webhook
An esim:support scope also appears in the authorization-server metadata. It is reserved for a conversational support bot that is not currently exposed, so no tool requires it — granting it changes nothing today.

Tools

17 tools, grouped by purpose. Each tool runs under the scope shown; the server enforces scope on every call.

Query & browse esim:read

ToolDescription
get_all_data_packagesBrowse available eSIM data packages; filter by country, region, or type; find top-up plans.
supported_regionsList supported countries and regional groups (ISO Alpha-2 codes).
query_all_allocated_profilesLook up eSIM profiles — status, data usage, expiry, and attached packages.
usage_checkReal-time data usage for up to 10 eSIMs in one call.
query_esim_install_infoInstall details for one eSIM: QR code, share page, LPA string, SM-DP+ / matching-ID / confirmation-code triple for manual entry, and iOS/Android one-tap install links.
balance_queryCurrent account balance and last-update timestamp.

Order & provision

ToolScopeDescription
order_profilesesim:orderOrder new eSIM profiles, single or batch. Idempotent via transactionId; eSIMs allocate asynchronously.

Lifecycle management

ToolScopeDescription
top_upesim:manageAdd data to an existing eSIM (reload).
suspend_profileesim:managePause data service for an active eSIM.
unsuspend_profileesim:manageResume a suspended eSIM.
cancel_profileesim:destructiveCancel an unused eSIM for a full refund. Irreversible — requires confirm: true.
revoke_profileesim:destructivePermanently disable an eSIM. Allowed while esimStatus is GOT_RESOURCE, IN_USE, SUSPENDED or USED_UP; carries no refund — prefer cancel_profile for an unused eSIM. Irreversible — requires confirm: true.

Messaging & integration

ToolScopeDescription
send_smsesim:messagingSend an SMS to an eSIM over the API-to-SIM channel (≤500 chars).
set_webhookesim:webhookConfigure an HTTPS webhook URL for real-time order / status / usage events.
query_webhookesim:webhookView the currently configured webhook URL.

Support & diagnostics

ToolScopeDescription
support_search_knowledge_baseesim:readSearch the eSIMAccess support knowledge base. Returns whole entries — title, category, and full body — for your assistant to answer from and cite, not a pre-written answer.
support_diagnose_esimesim:readOne-call diagnostics for a single eSIM — profile, usage, and notes.

Knowledge search queries the live support knowledge base and falls back to a bundled offline copy if that service is unreachable, so the tool keeps working either way — answers may just be less current. Questions unrelated to eSIM return no results rather than a guess.

Security & multi-tenancy

  • Credentials never reach the client or the model. In remote mode your AccessCode / SecretKey are encrypted (AES-256-GCM) into the opaque bearer / refresh tokens the client holds. The server keeps no long-lived copy: during the short authorization-code exchange they exist only inside an encrypted payload that is deleted the moment the code is redeemed, and that payload uses a key derived separately from the one protecting your tokens. They never appear in tool arguments, URLs, or the model's context.
  • Per-tenant isolation. Your AccessCode is your tenant identity; you only ever see your own profiles, orders, and balance.
  • Signed upstream calls. Every request to eSIMAccess is signed with HMAC-SHA256 using your SecretKey.
  • Short-lived & revocable. Access tokens auto-refresh and can be revoked; the operator can revoke a specific token by its jti.
  • Audited. Every tool call is recorded (tool, risk level, tenant AccessCode, a hashed target ICCID, and status) for the operator's audit console.
Keep tool-call approval on in your client. Every state-changing tool refuses to run without confirm: true in its arguments, but that flag is set by the assistant — the human check is your client's own approval prompt, so leave it enabled for cancel_profile and revoke_profile in particular. Be cautious when combining this server with other, untrusted MCP servers to avoid prompt-injection attacks.

Endpoints reference

EndpointPurpose
GET /.well-known/oauth-protected-resourceRFC 9728 protected-resource metadata
GET /.well-known/oauth-authorization-serverRFC 8414 authorization-server metadata
GET /authorizeAuthorization page (tenant enters AccessCode / SecretKey)
POST /tokenAuthorization-code / refresh-token exchange
POST /revokeRFC 7009 token revocation
POST /registerRFC 7591 dynamic client registration (public clients, PKCE)
POST /mcpMCP JSON-RPC (Streamable HTTP transport) — every request is self-contained
GET /mcp405 — the server is stateless and offers no server-initiated stream
DELETE /mcp204 — accepted as a no-op; there is no server-side session to end
GET /healthzLiveness probe
Stateless by design. The server keeps no per-connection session, so it does not issue an Mcp-Session-Id and ignores one if your client sends it. Any instance can serve any request, and a restart or deployment never drops your connection — just keep sending requests. Standards-compliant clients handle this automatically.
You never enter these URLs. Your client discovers them automatically, in this order: the 401 from /mcp carries a WWW-Authenticate header pointing at /.well-known/oauth-protected-resource (RFC 9728), which in turn names the authorization server at /.well-known/oauth-authorization-server (RFC 8414); dynamic registration, /authorize, and /token follow from there. Reach for these by hand only if a client's automatic discovery fails.

Local (stdio) mode

Prefer to keep credentials on your own machine? Run the server locally and let the client launch it via npx. Set your credentials as environment variables.

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "esimaccess": {
      "command": "npx",
      "args": ["-y", "esimaccess-mcp"],
      "env": {
        "ESIM_ACCESS_CODE": "your_access_code",
        "ESIM_SECRET_KEY": "your_secret_key"
      }
    }
  }
}

VS Code Copilot

Add to .vscode/mcp.json:

{
  "servers": {
    "esimaccess": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "esimaccess-mcp"],
      "env": {
        "ESIM_ACCESS_CODE": "your_access_code",
        "ESIM_SECRET_KEY": "your_secret_key"
      }
    }
  }
}
In stdio mode the same 17 tools are available, but there is no OAuth / scope consent — the process runs with the credentials you supply. Keep ESIM_SECRET_KEY out of source control. Because stdio holds one long-lived connection, destructive tools can additionally raise an interactive confirmation prompt here, which the stateless HTTP mode cannot.

Troubleshooting

SymptomLikely cause & fix
Client keeps asking to re-authorizeThe token was revoked or expired without a valid refresh token. Re-run the OAuth flow from your client.
401 on every tool callToken missing/invalid, or sent in the query string. Tokens must be in the Authorization header.
insufficient_scopeThe tool needs a scope you did not grant. Reconnect and approve the required scope (e.g. esim:order).
A destructive tool returns an error asking for confirmationcancel_profile / revoke_profile need confirm: true after you confirm the action.
Credentials rejected on the authorize pageCheck the AccessCode / SecretKey against the developer console; the server verifies them with a live signature probe.
temporarily_unavailable (503) while signing inA transient server-side problem, not a bad code or credential. Retry the authorization in a moment — no need to reconfigure the client.
405 on GET /mcp, or a client warning about a missing session idExpected. The server is stateless: it offers no server-initiated stream and issues no Mcp-Session-Id. Tool calls over POST /mcp are unaffected.

Still stuck? Ask your assistant to search the knowledge base (support_search_knowledge_base) or run support_diagnose_esim on the affected ICCID, then reach the eSIMAccess support team via the website.