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
sse
orstreamable-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 eithersse
orstreamable-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_client
orstreamablehttp_client
intead ofstdio_client
in 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
tools
argument uses a little different formatting
- Replace the LLM response object handling
response
->response.choices[0].message