Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use Streamable HTTP to expose one authenticated HTTPS endpoint, usually https://your-domain.example/mcp, and run an MCP server process behind it. A production implementation needs four things: an explicit tool/resource contract, an official MCP SDK, origin and identity checks, and a deployment that handles the protocol revision you have selected. The current published transport (2025-11-25) defines one MCP endpoint supporting POST and GET; the 2026-07-28 draft moves toward POST with optional per-request SSE and removes the GET stream endpoint and protocol-level sessions.

What a remote MCP server is

A remote MCP server is an independently running process that accepts Model Context Protocol requests over HTTPS. Clients such as desktop assistants, IDEs, or agent frameworks connect to a stable URL instead of launching a local child process. The server advertises tools, resources, and prompts, validates inputs, performs permitted work against your systems, and returns structured MCP results.

Choose and pin a protocol revision before implementation. With the 2025-11-25 transport, one endpoint must support both POST and GET. POST carries client requests; GET can establish a server-to-client event stream. The 2026-07-28 draft changes that model: POST is the core request path, SSE is optional and scoped to a request, the GET stream endpoint is removed, and protocol-level sessions disappear. A client and server should therefore agree on the revision and SDK behavior rather than assuming that an older session-oriented deployment will work unchanged.

Plan the server contract before writing transport code

Inventory capabilities

  • List every tool, resource, and prompt the server will expose.
  • Mark operations as read-only or mutating.
  • Document the downstream API, required identity, and minimum scope for each operation.
  • Define explicit input and output schemas, including limits for strings, arrays, files, and pagination.

Separate policy from implementation

Authentication answers who is calling; authorization answers what that identity may do. Keep authorization checks next to the operation that uses the credential, not only in a global middleware layer. Reject malformed or out-of-range arguments before calling a downstream service, and return an actionable MCP error without exposing tokens or internal stack traces.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Choose an official SDK

Use the official TypeScript SDK for a Node.js service or the official Python SDK for Python. The TypeScript documentation identifies Streamable HTTP as the recommended remote transport. The Python deployment documentation provides a streamable_http_app integration and discusses worker counts and transport-security behavior. Pin the SDK version in your lockfile and read its transport notes when changing protocol revisions.

Build a minimal Python server

The following FastMCP example defines a tool and starts Streamable HTTP. Install the Python SDK in a virtual environment, save the file as server.py, and run it with Python.

python -m venv .venv
. .venv/bin/activate
pip install mcp
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Example remote server")

@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two integers."""
    return a + b

@mcp.resource("config://service")
def service_config() -> str:
    """A non-secret service description."""
    return "environment=production"

if __name__ == "__main__":
    mcp.run(transport="streamable-http")

Start it with python server.py. Configure the SDK’s host, port, and MCP path for your release; advertise the resulting public path as a single URL such as https://api.example.com/mcp. Do not expose the development listener directly to the Internet. Put it behind TLS termination and an authentication-aware reverse proxy, or use the SDK’s application factory with equivalent middleware.

Build the same shape in TypeScript

The TypeScript SDK’s API evolves, so pin the package version and follow that version’s Streamable HTTP example. This skeleton shows the important pieces: one MCP server, an explicit tool schema, and one /mcp route. Run it behind a proxy that supplies HTTPS, authentication, and origin filtering.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
npm install @modelcontextprotocol/sdk express zod
import express from "express";
import { z } from "zod";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";

const server = new McpServer({ name: "Example remote server", version: "1.0.0" });
server.tool(
  "add",
  "Add two integers",
  { a: z.number().int(), b: z.number().int() },
  async ({ a, b }) => ({ content: [{ type: "text", text: String(a + b) }] })
);

const app = express();
app.use(express.json({ limit: "1mb" }));
app.post("/mcp", async (req, res) => {
  const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
  await server.connect(transport);
  await transport.handleRequest(req, res, req.body);
});
app.listen(8080, "127.0.0.1", () => console.log("MCP listening on 127.0.0.1:8080/mcp"));

Match the transport constructor and request-handling signature to the SDK version you pin. If you select an earlier session-based revision, use the SDK’s documented session configuration and make sure every load-balanced worker can reach the required shared state.

Expose one HTTPS MCP endpoint

Use a stable public URL

Choose one route, commonly /mcp, and keep it stable. Terminate TLS at your edge proxy or in the service. Forward the request body, relevant headers, response status, and (when using the selected revision) SSE streaming without buffering. Set explicit body-size, idle-timeout, and upstream-timeout limits appropriate to your tools.

Rank #2
Sale
HTML and CSS: Design and Build Websites
  • HTML CSS Design and Build Web Sites
  • Comes with secure packaging
  • It can be a gift option

Test the endpoint through the same edge clients will use

  1. Resolve the public DNS name and verify its certificate.
  2. Send a request from an allowed Origin and confirm the expected MCP response.
  3. Send the same request with a missing or disallowed Origin; it must be rejected with HTTP 403.
  4. Verify that an unauthenticated request cannot invoke a tool.
  5. Exercise a slow downstream operation and confirm that the proxy and SDK timeouts produce a controlled error.

Secure every connection

Validate Origin on every request

The transport specification requires servers to validate the Origin header on all incoming connections to prevent DNS-rebinding attacks. Maintain an allowlist of exact origins for your clients, reject absent or invalid values according to your client policy, and return HTTP 403 for a value that is not allowed. Do not replace this check with a permissive wildcard.

Bind local listeners safely

Development and internal listeners should bind to 127.0.0.1, not 0.0.0.0. Expose the service publicly only through a deliberate edge or load-balancer configuration with TLS and firewall rules.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Authenticate and authorize all clients

Require authentication for every connection, including read-only tools. Use the downstream platform’s API-token or OAuth mechanism where appropriate, and issue credentials with only the scopes required by the advertised operations. Rotate and revoke credentials, reject expired tokens, and never write Authorization headers, cookies, or full request bodies to logs.

Protect mutating tools

For destructive operations, require narrower scopes and validate resource ownership or tenancy. Add idempotency keys where retries could duplicate a change. Return a request identifier so an operator can correlate a failure without revealing sensitive data.

Deploy the service

Model When it fits Trade-offs to plan
Compiled binary on a VM Small service with control over the operating system and network You manage patching, process supervision, TLS, scaling, and failover.
Docker or another container engine Repeatable builds and deployment across environments Define health checks, graceful shutdown, resource limits, secret injection, and image updates.
Managed container task such as Fargate Teams that want cloud scheduling without managing hosts Configure task identity, load balancing, logs, timeouts, and private-network access.
Managed edge platform Global routing and less infrastructure administration Check runtime limits, streaming support, authentication integration, data locality, and vendor-specific behavior.

HashiCorp’s remote MCP deployment guidance notes that the essential transport setting is streamable-http; its examples cover cloud, container, and Fargate environments, API-token authentication, and optional metrics. Cloudflare’s remote MCP guide demonstrates a managed edge deployment with authenticated and unauthenticated choices. Select the platform only after checking that it preserves your chosen protocol revision’s request and streaming behavior.

State, workers, and scaling

Determine whether your pinned protocol and SDK use protocol-level sessions. The 2025-11-25 model can involve a GET event stream and session handling; the 2026-07-28 draft removes protocol sessions and the GET stream endpoint. A stateless POST-oriented service is easier to distribute across workers, while sessionful behavior requires a consistent session store or routing strategy.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • Set worker counts from measured CPU, memory, downstream rate limits, and concurrent connections rather than copying a default.
  • Use connection and request timeouts that exceed normal downstream latency but cap stuck work.
  • Keep shared state in an external store when the selected SDK requires it; do not assume in-process memory is shared between workers.
  • Apply backpressure and per-identity rate limits before downstream services become the bottleneck.

Observability and operations

Expose a health check that verifies process readiness without invoking a destructive tool. Record request IDs, authenticated principal IDs, tool names, latency, response class, downstream status, rejected origins, and authentication failures. Redact arguments that may contain personal data or secrets. Add metrics for request count, error count, latency percentiles, active streams, and downstream throttling. HashiCorp lists metrics as an optional remote-deployment setting; treat them as essential once multiple clients depend on the service.

Release checklist

  • Protocol revision and SDK version are pinned and documented.
  • Only the intended HTTPS route is public.
  • Origin allowlist and HTTP 403 behavior are tested.
  • Authentication, scopes, rotation, and revocation are tested.
  • Health checks, graceful shutdown, logs, and alerts are configured.
  • Load-balancer timeout and streaming behavior are verified with the real client types.

Publish discovery metadata

Create a server.json file containing the server name, title, description, version, and a remote entry. The MCP Registry expects remote servers to be publicly reachable at the declared URL and recommends Streamable HTTP.

{
  "name": "com.example.tools",
  "title": "Example tools",
  "description": "Read-only utilities for the example service.",
  "version": "1.0.0",
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://api.example.com/mcp"
    }
  ]
}

Do not publish a localhost, private-network, or temporary URL. Update the version and metadata when the public contract changes, and ensure the registry URL exactly matches the route clients can reach.

Or skip the browser setup

If your MCP server needs website screenshots, ScreenshotNeo provides a website screenshot API and an MCP server for AI agents. It accepts consent banners before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be disabled. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing status.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

One request returns PNG, JPEG, WebP, or PDF:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo API documentation for all options, including full-page and selector capture, device presets, dark mode, custom CSS and JavaScript, headers, cookies, blocking rules, caching, signed links, asynchronous webhooks, bulk capture, and PDF controls. Python:

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)

Node.js:

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

Its MCP server exposes take_screenshot, get_page_info, and capture_pdf to Claude, Cursor, and other MCP clients. The Free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Create a free ScreenshotNeo account.

Troubleshooting

HTTP 403 on every request

Check the exact Origin value sent by the client, including scheme and port, against your allowlist. Confirm that a proxy is not replacing or dropping the header. A deliberately invalid Origin should be the only case that receives this response.

Rank #4
Sale
Web Design with HTML, CSS, JavaScript and jQuery Set
  • Brand: Wiley
  • Set of 2 Volumes
  • A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers

Client cannot connect or reports an unsupported transport

Confirm that client and server target the same protocol revision. An older client may expect GET-based event streaming or sessions that a draft POST-only implementation removed. Verify the public path, TLS certificate, proxy method forwarding, and SDK transport configuration.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Authentication succeeds but a tool is denied

Inspect the token’s audience, expiry, tenant, and scopes. Then check the tool-level authorization rule and downstream credential. Return a stable permission error while keeping the detailed reason in redacted server logs.

Requests hang behind a proxy

Disable response buffering for streaming routes, raise idle timeouts, and ensure the proxy forwards connection-close and content-type headers. Test a slow tool through the public URL, not only against localhost.

Works with one worker but fails after scaling

You likely have session or state affinity that is local to one process. Follow the SDK’s deployment guidance: use a shared state store, configure consistent routing, or adopt a stateless request model compatible with your selected revision.

Registry rejects the listing

Check that server.json uses type set to streamable-http, that the URL is publicly reachable over HTTPS, and that the advertised path is the single MCP endpoint rather than a health or documentation route.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

FAQ

Should the MCP endpoint have separate URLs for tools and resources?

No. The transport contract calls for one MCP endpoint path; expose capabilities through that endpoint and use ordinary application routes only for health checks or administration.

Can an internal-only server be listed in the public registry?

No. Registry metadata for a remote server must point to a publicly accessible URL. Keep private deployments in your organization’s client configuration instead.

Which hosting model is universally best?

None. Choose based on protocol compatibility, authentication, state, concurrency, observability, network controls, data locality, portability, and the operational work your team can support.

Frequently Asked Questions

Should the MCP endpoint have separate URLs for tools and resources?

No. Use one MCP endpoint path and reserve other routes for health checks or administration.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Can an internal-only server be listed in the public registry?

No. A registry remote URL must be publicly accessible; keep private servers in your organization’s client configuration.

Which hosting model is universally best?

There is no universal choice; evaluate protocol compatibility, security, state, scaling, observability, networking, and operational ownership.

The Bottom Line

A dependable remote MCP server is a small, explicit contract behind one HTTPS Streamable HTTP endpoint, protected by Origin validation and scoped authentication, deployed with state and worker behavior that matches its protocol revision, and described by reachable server.json metadata.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.