MCP gateway
Connect from outside the sandbox#
import Sandbox from 'e2b'
import { Client } from '@modelcontextprotocol/sdk/client/index.js'
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'
const sandbox = await Sandbox.create({
mcp: {
exa: { apiKey: process.env.EXA_API_KEY! },
notion: { internalIntegrationToken: process.env.NOTION_API_KEY! },
},
})
const client = new Client({ name: 'e2b-mcp-client', version: '1.0.0' })
const transport = new StreamableHTTPClientTransport(new URL(sandbox.getMcpUrl()), {
requestInit: {
headers: { Authorization: `Bearer ${await sandbox.getMcpToken()}` },
},
})
await client.connect(transport)
const tools = await client.listTools()
console.log('Available tools:', tools.tools.map((t) => t.name))
await client.close()
await sandbox.kill()import os, asyncio
from datetime import timedelta
from e2b import AsyncSandbox
from mcp.client.session import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def main():
sandbox = await AsyncSandbox.create(mcp={
"exa": {"apiKey": os.environ["EXA_API_KEY"]},
"notion": {"internalIntegrationToken": os.environ["NOTION_API_KEY"]},
})
async with streamablehttp_client(
url=sandbox.get_mcp_url(),
headers={"Authorization": f"Bearer {await sandbox.get_mcp_token()}"},
timeout=timedelta(seconds=600),
) as (read_stream, write_stream, _):
async with ClientSession(read_stream, write_stream) as session:
await session.initialize()
tools = await session.list_tools()
print([tool.name for tool in tools.tools])
await sandbox.kill()
asyncio.run(main())Connect from inside the sandbox#
The gateway listens on http://localhost:50005/mcp. Send the MCP token in the Authorization: Bearer header.
Plug it into an agent#
claude mcp add --transport http e2b-mcp-gateway <url> --header "Authorization: Bearer <token>"import { MCPServerStreamableHttp } from '@openai/agents'
const mcp = new MCPServerStreamableHttp({
url: sandbox.getMcpUrl(),
name: 'E2B MCP Gateway',
requestInit: {
headers: { Authorization: `Bearer ${await sandbox.getMcpToken()}` },
},
})npx @modelcontextprotocol/inspector --transport http --url <your-mcp-url> --header "Authorization: Bearer ${mcpToken}"