The package and for server→client streaming. That transport is deprecated.
New servers should use Streamable HTTP (StreamableHTTPServerTransport). It supports POST request/response, optional SSE for notifications, and session management. The v2 SDK removes server-side SSE entirely; client-side SSE remains for legacy servers.
| Scenario | Transport |
|---|---|
| Claude Desktop, local dev | stdio |
| Cursor / VS Code project MCP | stdio |
| ChatGPT Apps / Connectors | Streamable HTTP over public HTTPS |
| Legacy SSE-only clients | SSE client transport still exists; prefer Streamable HTTP for new servers |
Streamable HTTP entry (stateless):
import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
import { createMcpServer } from './create-server.js';
const app = createMcpExpressApp();
const PORT = Number(process.env.PORT) || 3000;
app.post('/mcp', async (req, res) => {
const server = createMcpServer();
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
await server.connect(transport);
await transport.handleRequest(req, res, req.body);
res.on('close', () => {
transport.close();
server.close();
});
});
app.listen(PORT, () => {
console.error(`MCP server listening on http://127.0.0.1:${PORT}/mcp`);
});
createMcpExpressApp() enables DNS rebinding protection when binding to localhost - recommended for local HTTP servers.
Deploy Streamable HTTP behind HTTPS before exposing it to cloud clients. ChatGPT Connectors also require OAuth 2.1 for production use.
Connecting MCP clients
Claude Desktop (stdio - primary demo path)
Config file on Windows: %APPDATA%\Claude\claude_desktop_config.json. Open it via Settings → Developer → Edit Config.
{
"mcpServers": {
"todo-mcp": {
"command": "node",
"args": ["C:/path/to/demos/mcp-server-nodejs-demo/src/stdio.js"]
}
}
}
Restart Claude Desktop after saving. Claude shows a tool approval UI before executing write operations.
Claude Desktop (remote HTTP)
claude_desktop_config.json validates stdio servers only - do not put a bare url field there expecting it to work. For a public HTTPS MCP server, use Settings → Connectors → Add custom connector. For local HTTP during development, bridge with .
SOCIAL SHARE CARD GENERATOR