After reading the Official MCP quickstart examples on MCP server and client, do you wonder
- How to upgrade the simple stdio-based example to HTTP server/client towards real-world uses?
- The latest MCP document (June 2025) lists SSE as the default HTTP transport protocol
- The latest MCP specification (March 2025) further upgrades SSE to Streamable HTTP protocol
 
- How to replace the Anthropic API with OpenAI API widely used in open source inference servers like vllm?
- Patch the official MCP quickstart weather app to use:
- SSE or Streamable HTTP as the transport protocol between client and server
- OpenAI API for LLM calls
 
- Explain each modification for readers to understand these extensions
- Install uv
- Choose the protocol in your mind, either sseorstreamable-http
- Open two terminals on one host (hardcoded localhost HTTP server in this example)
- Term 1: run server
- Go to the server directory weather-server-python
- Start the server uv run server PROTOCOL_OF_YOUR_CHOICE
 
- Go to the server directory 
- Term 2: run client
- Go to the client directory mcp-client-python
- Setup environment variables for OpenAI endpoint and API
- export OPENAI_BASE_URL=http://xxx/v1
- export OPENAI_API_KEY=yyy
 
- Start the client uv run client PROTOCOL_OF_YOUR_CHOICE
 
- Go to the client directory 
- Server: use mcp.run('sys.argv[1]')instead ofmcp.run('stdio')givensys.argv[1]is eithersseorstreamable-http- SSE protocol: server main endpoint is http://localhost:8000/sse
- Streamable HTTP protocol: server only endpoint is http://localhost:8000/mcp
 
- SSE protocol: server main endpoint is 
- Client: load rs(readstream),ws(writestream) fromsse_clientorstreamablehttp_clientintead ofstdio_clientin the original MCP quickstart example
- Replace the LLM call function
- self.anthropic.messages.create()->- self.client.chat.completions.create()
- Dynamic model id for vllm
- The toolsargument uses a little different formatting
 
- Replace the LLM response object handling
- response->- response.choices[0].message