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
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.
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.
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.
Deployment modes
| Mode | Best for | Auth | Install |
|---|---|---|---|
| Remote HTTP recommended | Most users — add a URL and authorize in the browser | OAuth 2.1 + PKCE → short-lived bearer token | None |
| 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:
Claude Desktop quick start
- Open settings. Go to Settings → Connectors → Add → Add custom connector.
- 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). - 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:
The client invokes balance_query and returns your eSIMAccess balance.
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.
| Scope | Grants | Tools |
|---|---|---|
| esim:read | Read 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:order | Order new eSIM profiles | order_profiles |
| esim:manage | Top-up, suspend, unsuspend | top_up, suspend_profile, unsuspend_profile |
| esim:destructive | Cancel and revoke profiles | cancel_profile, revoke_profile |
| esim:messaging | Send SMS to eSIMs | send_sms |
| esim:webhook | Configure / query the webhook URL | set_webhook, query_webhook |
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
| Tool | Description |
|---|---|
get_all_data_packages | Browse available eSIM data packages; filter by country, region, or type; find top-up plans. |
supported_regions | List supported countries and regional groups (ISO Alpha-2 codes). |
query_all_allocated_profiles | Look up eSIM profiles — status, data usage, expiry, and attached packages. |
usage_check | Real-time data usage for up to 10 eSIMs in one call. |
query_esim_install_info | Install 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_query | Current account balance and last-update timestamp. |
Order & provision
| Tool | Scope | Description |
|---|---|---|
order_profiles | esim:order | Order new eSIM profiles, single or batch. Idempotent via transactionId; eSIMs allocate asynchronously. |
Lifecycle management
| Tool | Scope | Description |
|---|---|---|
top_up | esim:manage | Add data to an existing eSIM (reload). |
suspend_profile | esim:manage | Pause data service for an active eSIM. |
unsuspend_profile | esim:manage | Resume a suspended eSIM. |
cancel_profile | esim:destructive | Cancel an unused eSIM for a full refund. Irreversible — requires confirm: true. |
revoke_profile | esim:destructive | Permanently 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
| Tool | Scope | Description |
|---|---|---|
send_sms | esim:messaging | Send an SMS to an eSIM over the API-to-SIM channel (≤500 chars). |
set_webhook | esim:webhook | Configure an HTTPS webhook URL for real-time order / status / usage events. |
query_webhook | esim:webhook | View the currently configured webhook URL. |
Support & diagnostics
| Tool | Scope | Description |
|---|---|---|
support_search_knowledge_base | esim:read | Search 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_esim | esim:read | One-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.
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
| Endpoint | Purpose |
|---|---|
GET /.well-known/oauth-protected-resource | RFC 9728 protected-resource metadata |
GET /.well-known/oauth-authorization-server | RFC 8414 authorization-server metadata |
GET /authorize | Authorization page (tenant enters AccessCode / SecretKey) |
POST /token | Authorization-code / refresh-token exchange |
POST /revoke | RFC 7009 token revocation |
POST /register | RFC 7591 dynamic client registration (public clients, PKCE) |
POST /mcp | MCP JSON-RPC (Streamable HTTP transport) — every request is self-contained |
GET /mcp | 405 — the server is stateless and offers no server-initiated stream |
DELETE /mcp | 204 — accepted as a no-op; there is no server-side session to end |
GET /healthz | Liveness probe |
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.
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"
}
}
}
}
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
| Symptom | Likely cause & fix |
|---|---|
| Client keeps asking to re-authorize | The token was revoked or expired without a valid refresh token. Re-run the OAuth flow from your client. |
401 on every tool call | Token missing/invalid, or sent in the query string. Tokens must be in the Authorization header. |
insufficient_scope | The 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 confirmation | cancel_profile / revoke_profile need confirm: true after you confirm the action. |
| Credentials rejected on the authorize page | Check the AccessCode / SecretKey against the developer console; the server verifies them with a live signature probe. |
temporarily_unavailable (503) while signing in | A 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 id | Expected. 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.