Valdyr
Preview

MCP server

Connect AI agents and assistants to Seamless OS through the Model Context Protocol (MCP) server

Seamless OS ships a remote Model Context Protocol server. Through it an AI agent can read customers, subscriptions, licenses, invoices, catalogs, orders, SIM cards, and usage data. It can also purchase offerings and change subscription service. ChatGPT, Cursor, VS Code Copilot, and your own agent can connect to it.

The server is deployed per brand, beside your API. Every tool runs with the permissions of the signed-in user, so an agent sees and changes only what the person who authorized it can. The server is in preview. Its tools, its resources, and their schemas can still change.

A separate server, with no authentication, exposes this documentation site to an agent. Read Docs for agents.

Endpoint

TransportURLNotes
Streamable HTTPhttps://mcp.example.com/mcpRecommended for all current MCP clients.
SSE (legacy)https://mcp.example.com/sseFor clients that have not yet migrated to Streamable HTTP.

Replace mcp.example.com with the MCP domain of your deployment. It sits next to your API domain.

Statelessness

The /mcp endpoint implements the stateless Streamable HTTP transport of the 2026-07-28 MCP revision. Every request is one self-contained HTTP POST, and the server keeps no state between two requests.

  • The server speaks protocol versions 2025-03-26 to 2026-07-28, which is every revision of Streamable HTTP. A client on an older revision opens with an initialize handshake and still works. The server answers the handshake, but it never issues a session. A client on the 2024-11-05 revision predates Streamable HTTP, so it uses the legacy /sse transport.
  • The server issues no Mcp-Session-Id header, and it ignores one that an older client sends. No session exists, so no session expires. A long-running agent never loses its connection state between two calls.
  • GET and DELETE on /mcp answer 405 Method Not Allowed. There is no separate server-push stream. An older protocol revision requires a client to tolerate exactly this from a server with no sessions and no push stream.
  • When the client closes the response stream, the server cancels the request, and it cancels the API calls that the request started.

Each request carries everything that the server needs. A load balancer can send it to any replica, with no session affinity.

Authentication

The server implements the standard MCP authorization flow: OAuth 2.0 with dynamic client registration and metadata discovery. The two discovery documents are /.well-known/oauth-authorization-server and /.well-known/oauth-protected-resource.

As a result, you configure nothing. Put the server URL into an MCP client. The client registers itself and opens a browser window, and you sign in there with your ordinary Seamless OS account. The sign-in is the login page of the brand portal, or a hosted page for your email address and a verification code. Which one you get depends on the deployment. The client then holds a token scoped to your user, and every tool call is authorized as you.

Connect a client

claude mcp add --transport http seamless-os https://mcp.example.com/mcp

Claude Code discovers the OAuth configuration and prompts you to sign in on first use.

In ChatGPT, turn on developer mode at Settings → Connectors → Advanced → Developer mode. Developer mode is available on a paid plan. Then go to Settings → Connectors → Create and enter this URL:

https://mcp.example.com/mcp

ChatGPT opens the sign-in flow when you create the connector. Then enable the connector in a conversation to use its tools.

Add the server to .cursor/mcp.json:

{
  "mcpServers": {
    "seamless-os": {
      "url": "https://mcp.example.com/mcp"
    }
  }
}

Cursor handles OAuth registration and sign-in automatically.

Add the server to .vscode/mcp.json:

{
  "servers": {
    "seamless-os": {
      "type": "http",
      "url": "https://mcp.example.com/mcp"
    }
  }
}

VS Code handles OAuth registration and sign-in automatically.

Tools

Start a conversation with get_context. It returns the signed-in user and the data that the user can access. The server applies the same access rules to every other tool.

ToolWhat it does
get_contextGet the user, accessible customers, and one customer’s subscriptions, active licenses, open orders, and brand.
searchFind accessible entities by phone number, portal URL, ID, reference ID, name, or email address.
get_portal_linkGet an account-scoped portal link for work that no MCP tool supports.
get_customer_profileGet a customer’s profile, contact details, billing details, and customer-level service address.
update_customer_profileUpdate confirmed customer name, email, billing-address, and customer-level service-address changes.
create_customer_userPrepare a support handover by default, or grant confirmed customer access when direct action is enabled.
list_product_offeringsList a personalized catalog, or list the plan and add-on options for a subscription.
get_subscriptionList or fetch subscriptions with their add-ons. The list supports filters and cursor pagination.
list_subscription_actionsList one customer’s subscription action attempts with raw status, timestamps, and cursor pagination.
get_subscription_actionRead one subscription action attempt by ID, including its latest observed status.
add_to_orderAdd a subscription, plan change, add-on, top-up, or external product to a draft order.
order_new_sim_cardCreate a replacement SIM-card order from a catalog offering. The tool submits a priced zero-total order.
remove_from_orderRemove a line item from a draft order.
get_orderList a customer’s order summaries, or get one full order with its state, items, price, validation, and created entities.
checkout_orderCreate a temporary storefront link where the customer can review, complete, and pay for a draft order.
block_subscription_simPrepare a support handover by default, or suspend SIM service when direct action is enabled.
enable_wifi_callingEnable Wi-Fi calling after approval of the service address for emergency services.
reset_network_servicesPrepare a support handover by default. Reset network services only when direct action and the API feature are enabled.
generate_us_port_out_pinPrepare a support handover by default. Generate a 7-day US port-out PIN only when direct action is enabled.
restore_subscriptionRestore a customer pause. It refuses payment, fraud, operator, and MCP SIM suspensions.
cancel_subscriptionPrepare a support handover by default, or cancel the subscription when direct action is enabled.
get_subscription_esim_qr_codeGet the eSIM activation string, its expiration, and a hosted QR-code URL when one is available.
get_esim_lifecycle_statusGet the live eSIM profile lifecycle, observation source and time without conflating it with subscription status.
get_roaming_cost_controlGet the provider-specific roaming charge cap without treating it as a roaming data allowance.
request_roaming_cost_control_increasePrepare a human-approval handover for a requested charge-cap increase without changing the setting.
get_subscription_usageGet data, voice, SMS, and MMS allowance use across a subscription’s base plan and add-ons.
list_licensesList a customer’s licenses by type, with product offerings, prices, and cursor pagination.
list_invoicesList a customer’s invoices with their lifecycle, balances, currency, due date, and provider reference.
list_payment_intentsList payment collections, including overdue prepaid renewals without invoices, with type, status, due time, and amount.
get_invoiceGet an invoice and its related payment intent, payment attempts, refunds, and billed line items.
assess_invoice_recoveryCheck provider payment state and return a safe service-recovery decision or a support handover.
prepare_support_handoverPrepare scoped diagnostic context and a machine-readable topic for a support handover.
get_app_configGet the deployment’s country, currency, internal brand name, and portal URL.
get_available_enums_by_nameList the valid enum values for a supported entity name.
get_domain_helpGet descriptions of the domain entities and their relationships.

Emergency address approval

Call get_subscription with subscription_ids set to the selected subscription ID. Do not combine it with customer_id. Read items[].subscription.serviceAddress.address. Show this address to the person and ask for approval for emergency services. Do not use the address from get_customer_profile for this approval.

After approval, call enable_wifi_calling with the exact customer and subscription IDs and confirmed=true. Copy the approved address into confirmed_service_address. The address object uses street, street2, city, state, zip, country, region, and attention. The tool requires street, city, zip, and country. Refresh a cached MCP tool schema before you call this tool. Older clients that do not send confirmed_service_address fail. This change does not revise the public API v2 request.

The server compares the approved address with the current effective service address when it receives the command. If the address changes, read the subscription again and ask for approval again. This check does not prove what the person saw. It does not keep the address fixed during a later workflow.

Tool availability and effects

The server does not register get_subscription_usage when the deployment has no usage service.

The server registers generate_us_port_out_pin only when the deployment country is US.

cancel_subscription, block_subscription_sim, reset_network_services, create_customer_user, and generate_us_port_out_pin require a support handover by default. In this mode, the tools are read-only and do not change customer access or service.

MCPSERVER_DIRECT_ACTION_TOOLS can allow direct actions for a deployment. Set it to a comma-separated list of cancel_subscription, block_subscription_sim, reset_network_services, create_customer_user, and generate_us_port_out_pin. Set it to * to allow every known support-gated action. Set it to none to require support for all actions. Unknown tool names stop the MCP server at startup.

A directly enabled tool publishes its write and destructive annotations. The server marks order_new_sim_card and remove_from_order as destructive, but they are not support-gated.

Direct cancellation and SIM blocking require the exact customer_id and subscription_id. They also require confirmed: true after the person approves the action.

reset_network_services prepares a read-only support handover by default. A deployment must set FEATURE_END_USER_RESET_NETWORK_SERVICES=true and allow reset_network_services through MCPSERVER_DIRECT_ACTION_TOOLS to enable a direct reset. The API endpoint uses the feature setting and returns 501 Not Implemented when the setting is false or absent. A direct reset requires the exact customer_id and subscription_id. It also requires confirmed: true after the person approves the service interruption. The tool does not change Seamless OS barring or data-bucket configuration. The provider workflow can change network-side balances or shared data groups on some networks. Enable the tool only when the customer accepts these provider-specific risks.

Direct customer-user creation requires an explicit customer_id, the new user’s name and email, and MANAGER access. The confirmation sentence must name the user, email, customer, and role. The caller must hold the customer-management permission and manager authority. The tool does not grant brand-wide administrator access.

Direct port-out PIN generation requires the exact customer_id and subscription_id. It also requires confirmed: true after the person approves that the previous PIN stops working. The tool returns the new PIN and its expiry, so the PIN passes through the model. A subscription that cannot port out, for example during a binding period, gets no PIN.

Handovers from prepare_support_handover label diagnostics as CLIENT_REPORTED_UNVERIFIED. Handovers created inside another tool label diagnostics as SERVER_OBSERVED.

Each tool publishes MCP annotations for read-only, destructive, idempotent, and open-world effects when these annotations apply. A client can use these annotations before it permits a tool call.

Resources

The server publishes these fixed resources:

ResourceWhat it contains
json://config/appThe country, currency, internal brand name, and portal URL.
json://users/meThe signed-in user and the customers that the user can access.
text://entities/app_configA description of the application configuration.
text://entities/customerA description of a customer.
text://entities/invoiceA description of an invoice.
text://entities/licenseA description of a license.
text://entities/orderA description of an order.
text://entities/products/catalogA description of a personalized product catalog.
text://entities/subscriptionA description of a subscription.
text://entities/userA description of a user.

The get_domain_help tool returns the same entity descriptions.

The server also publishes these resource templates:

  • json://products/catalogs/{customer_id} — A customer’s personalized product catalog.
  • json://config/enums/{entity_name} — The valid enum values for a supported entity name.

The server does not publish MCP prompts.

Next steps