Octelium provides a complete secure, free and open source, self-hosted infrastructure to build your MCP-based architectures and gateways. It provides not only secure access to your MCP servers wherever they are but it also seamlessly provides deployment and scaling for all your streamable HTTP MCP servers, unified and scalable authentication and identity management to all your MCP clients, L-7 aware pre-request authorization and OpenTelemetry-ready visibility.

You can develop your MCP servers over streamable HTTP/SSE transport and run anywhere even behind NAT. Here is a simple example of a my-mcp
Service whose upstream is running at http://localhost:8787
and is remotely served by a connected octelium
client used by the User mcp-01
(read more about serving Services via connected Users here):
1kind: Service2metadata:3name: my-mcp4spec:5port: 80806mode: HTTP7isPublic: true8config:9upstream:10url: http://localhost:878711user: mcp-01
To serve the MCP server, the User mcp-01
needs to explicitly serve that Service via the --serve
flag (read more here) as follows:
octelium connect --serve my-mcp
You can also deploy and scale your containerized streameable HTTP-based MCP server and serve it as a Service by reusing the underlying Kubernetes infrastructure that runs the Octelium Cluster (read more about managed containers here) including from private container registries.
This is a very simple example of an MCP server developed in Python with FastMCP that is serving over streamable HTTP transport:
1import asyncio2import os34from fastmcp import FastMCP56mcp = FastMCP("Demo Octelium MCP Server")78@mcp.tool()9def add(a: int, b: int) -> int:10return a + b1112@mcp.tool()13def subtract(a: int, b: int) -> int:14return a - b1516if __name__ == "__main__":17asyncio.run(18mcp.run_async(19transport="streamable-http",20host="0.0.0.0",21port=os.getenv("PORT", 8080),22)23)
Such MCP server can be very easily Dockerized, pushed to your public or even private container registry of choice (e.g. Docker register, GitHub's ghcr, etc...) and automatically deployed and scaled via Octelium as follows:
1kind: Service2metadata:3name: my-mcp4spec:5mode: HTTP6isPublic: true7config:8upstream:9container:10port: 808011image: <MY_REGISTRY>/<MY_ORG>/<MY_MCP_IMAGE:version>12credentials:13usernamePassword:14username: <USER>15password:16fromSecret: registry-token17resourceLimit:18cpu:19millicores: 100020memory:21megabytes: 2000
You can now apply the creation of the Service as follows (read more here):
octeliumctl apply /PATH/TO/SERVICE.YAML
You might also need to take a look at Namespaces (read more here) where you can organize your MCP server Services and affect their hostnames as well as access control to a whole set of Services that share a certain purpose or functionality according to your needs.
Octelium also supports secret-less access for Users to public MCP servers that are protected by standard bearer access tokens, basic authentication, API keys set in custom headers as well as OAuth2 client credential flows. You can read more here.
Now we move on to the client-side of MCPs. The main value of using Octelium is providing a unified and scalable identity management for all your clients where you can have a single standard OAuth2 client credential or bearer authentication for your MCP clients to access all authorized MCP servers without having to use any special SDKs or clients from the clients' side or even having to be aware of the Octelium's Cluster existence at all. You can simply develop your MCP clients in any language and connect to the MCP server Service not only privately over the octelium
client (read more here), but also MCP clients can use the standard OAuth client credentials flow to obtain a bearer access token and publicly access the MCP server service (read more about the public clientless access mode here). You can read more about OAuth2-based client-less access here and here. You can also rea more about access token Credentials here.
Now we move on to access control. Octelium's application-layer (L7) awareness seamlessly enables you to control access at the HTTP-layer based on HTTP request paths, methods and more importantly in our use case for MCP, JSON body of the requests. Here is an example:
1kind: Service2metadata:3name: my-mcp4spec:5port: 80806mode: HTTP7isPublic: true8config:9upstream:10url: https://mcp.example.com11http:12enableRequestBuffering: true13body:14mode: JSON15maxRequestSize: 10000016authorization:17inlinePolicies:18- spec:19rules:20- effect: ALLOW21condition:22all:23of:24- match: ctx.request.http.bodyMap.jsonrpc == "2.0"25- match: ctx.request.http.bodyMap.method == "tools/call"26- match: ctx.request.http.bodyMap.params.name in ["add", "subtract"]27- match: ctx.request.http.bodyMap.params.arguments.a < 100028- match: ctx.request.http.bodyMap.params.arguments.b > 1000
Octelium also provides OpenTelemetry-ready, application-layer L7 aware visibility and access logging in real time (see an example for HTTP here). You can read more about visibility here.
Here are a few more features that you might be interested in:
- Request/response header manipulation (read more here).
- Application layer-aware ABAC access control via policy-as-code using CEL and Open Policy Agent (read more here).
- Exposing the API publicly for anonymous access (read more here).
- OpenTelemetry-ready, application-layer L7 aware auditing and visibility (read more here).