Estou tentando executar um exemplo do repositório oficial do Model Context Protocol para Python ( https://github.com/modelcontextprotocol/python-sdk ). Mas ele continua me dando Error in /message route: Error: SSE connection not established"
erro quando clico no botão "Conectar" na página do Inspetor MCP. O problema é que nem estou tentando usar a conexão SSE, então estou realmente confuso com o erro e os logs.
Aqui está o código (localizado na pasta src/) :
# server.py
from mcp.server.fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
Foi assim que preparei o projeto : inicializei uv
o ambiente virtual na pasta raiz. Instalei as dependências do projeto com uv add "mcp[cli]"
, como indicado no guia do repositório. Informações sobre as versões do programa:
- Node.js v22.14.0
- [email protected]
- C:\Usuários...\AppData\Roaming\npm ├── @modelcontextprotocol/ [email protected] ├── @modelcontextprotocol/ [email protected] ├── @modelcontextprotocol/ [email protected] └── @modelcontextprotocol/ [email protected]
Minhas ações para executar o servidor são :
mcp dev src/server.py
no Powershell enquanto estiver no diretório raiz do projeto.- Então eu vejo
⚙️ Proxy server listening on port 6277
🔍 MCP Inspector is up and running at http://127.0.0.1:6274 🚀
No console, acesse a página http://127.0.0.1:6274 . 3. Na página, o método de transporte STDIO já está definido. Há também um comando uv
com argumentos run --with mcp mcp run src/server.py
(veja a captura de tela em anexo), então clico no botão "Conectar". Nada acontece na interface, mas nos logs do console, vejo
New SSE connection
Query parameters: [Object: null prototype] {
transportType: 'stdio',
command: 'uv',
args: 'run --with mcp mcp run src/server.py',
env: '{ ... # all my env variables, PATH and etc.}'
}
Stdio transport: command=C:\Users\...\.local\bin\uv.exe, args=run,--with,mcp,mcp,run,src/server.py
Spawned stdio transport
Connected MCP client to backing server transport
Created web app transport
Created web app transport
Set up MCP proxy
- Clico no botão "Conectar" novamente (veja a captura de tela anexada) e vejo a mensagem "Erro de conexão, seu servidor MCP está em execução?" na interface do usuário e o seguinte nos logs:
New SSE connection
Query parameters: [Object: null prototype] {
transportType: 'stdio',
command: 'uv',
args: 'run --with mcp mcp run src/server.py',
env: '{...}'
}
Stdio transport: command=C:\Users\...\.local\bin\uv.exe, args=run,--with,mcp,mcp,run,src/server.py
Spawned stdio transport
Connected MCP client to backing server transport
Created web app transport
Created web app transport
Set up MCP proxy
Received message for sessionId 5ed68d2c-6c0f-47e7-9972-3fe99c43a630
Error in /message route: Error: SSE connection not established
at SSEServerTransport.handlePostMessage (file:///C:/Users/.../AppData/Roaming/npm/node_modules/@modelcontextprotocol/inspector/node_modules/@modelcontextprotocol/sdk/dist/esm/server/sse.js:61:19)
at file:///C:/Users/.../AppData/Roaming/npm/node_modules/@modelcontextprotocol/inspector/server/build/index.js:130:25
at Layer.handleRequest (C:\Users\...\AppData\Roaming\npm\node_modules\@modelcontextprotocol\inspector\node_modules\router\lib\layer.js:152:17)
at next (C:\Users\...\AppData\Roaming\npm\node_modules\@modelcontextprotocol\inspector\node_modules\router\lib\route.js:157:13)
at Route.dispatch (C:\Users\...\AppData\Roaming\npm\node_modules\@modelcontextprotocol\inspector\node_modules\router\lib\route.js:117:3)
at handle (C:\Users\...\AppData\Roaming\npm\node_modules\@modelcontextprotocol\inspector\node_modules\router\index.js:435:11)
at Layer.handleRequest (C:\Users\...\AppData\Roaming\npm\node_modules\@modelcontextprotocol\inspector\node_modules\router\lib\layer.js:152:17)
at C:\Users\...\AppData\Roaming\npm\node_modules\@modelcontextprotocol\inspector\node_modules\router\index.js:295:15
at processParams (C:\Users\...\AppData\Roaming\npm\node_modules\@modelcontextprotocol\inspector\node_modules\router\index.js:582:12)
at next (C:\Users\...\AppData\Roaming\npm\node_modules\@modelcontextprotocol\inspector\node_modules\router\index.js:291:5)
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (node:_http_outgoing:699:11)
at ServerResponse.header (C:\Users\...\AppData\Roaming\npm\node_modules\@modelcontextprotocol\inspector\node_modules\express\lib\response.js:684:10)
at ServerResponse.json (C:\Users\...\AppData\Roaming\npm\node_modules\@modelcontextprotocol\inspector\node_modules\express\lib\response.js:247:10)
at file:///C:/Users/.../AppData/Roaming/npm/node_modules/@modelcontextprotocol/inspector/server/build/index.js:134:25
at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
PS Eu tentei adicionar
if __name__ == "__main__":
mcp.run(transport='stdio')
No final do server.py, como alguns exemplos propõem, mas não afetou nada.
Qualquer ajuda é bem-vinda! Obrigado!
Captura de tela da página da interface do usuário do MCP Inspector
Resumo rápido
Você está vendo isso
Error: SSE connection not established
porque o MCP Inspector sempre negocia uma camada SSE, mesmo que seu servidor use STDIO, e sem um endpoint SSE real, ele falha/message
após a configuração. Para corrigir isso, você tem quatro caminhos principais: (1) fazer o Inspector gerar seu servidor via STDIO com o binário Python e o ambiente exatos, (2) mudar seu servidor para transporte SSE para que as expectativas do Inspector correspondam, (3) continuar com STDIO, mas com umamcp-proxy stdio→sse
ponte na frente, ou (4) usar um cliente MCP mais flexível, como o OmniMind, que permite declarar transportes em uma configuração JSON. Cada abordagem tem seus prós e contras — continue lendo para ver a análise.1️⃣ Corrigindo o transporte STDIO no Inspector
O que fazer
No painel “Conectar” do Inspetor, escolha STDIO , forneça o caminho completo para seu interpretador Python e defina explicitamente
PYTHONPATH
para que seu ambiente virtual seja usado.Exemplo de comando:
Certifique-se de que sua sessão do PowerShell ou terminal ative o mesmo venv antes de iniciar o Inspector.
Por que isso ajuda
mcp
instalá-lo, o handshake JSON-RPC nunca é concluído.Prós e contras
2️⃣ Mudando seu servidor para transporte SSE
O que fazer
No seu
server.py
, execute o servidor MCP sobre SSE em vez de STDIO:No Inspetor, selecione SSE e aponte para
http://127.0.0.1:6278/sse
.Por que isso ajuda
Prós e contras
3️⃣ Conectando STDIO → SSE com mcp-proxy
O que fazer
Instalar o proxy:
Inicie-o no modo stdio→sse :
No Inspector, conecte via SSE a
http://127.0.0.1:6278/sse
.Por que isso ajuda
mcp-proxy
ele cuida da tradução do transporte.Prós e contras
4️⃣ Experimente o OmniMind para controle orientado por configuração
Se você preferir evitar o acoplamento rígido do Inspector, o OmniMind permite que você declare cada servidor e transporte em um JSON simples e, em seguida, crie um cliente MCP em Python com duas linhas:
O seu
servers.json
pode parecer com:Com o OmniMind, você obtém controle total e sem código sobre qual transporte usar e como estruturar a solicitação — chega de suposições do Inspetor.
Prós e contras
Qual opção é a certa para você?
Escolha o caminho que melhor se adapta ao seu fluxo de trabalho e você terá uma conexão MCP tranquila em pouco tempo — sem mais
SSE connection not established
dores de cabeça!Veja o que funcionou para mim:
Só consegui executar o Inspetor corretamente no Simple Browser do VS Code (
Ctrl + Shift + P
→Simple Browser: Show
→ Cole o link do seu Inspetor — no meu caso, ele estava sendo executado em http://127.0.0.1:6274 ).Ainda não tenho ideia de qual é o problema. Não consegui fazer o Inspetor funcionar no Edge ou no Chrome. Parece que tentei TUDO: substituir STDIO por SSE, executar o servidor MCP com transporte SSE no servidor Ubuntu e conectar-me a ele a partir do Inspetor em execução local, limpar o cache, abrir o Inspetor no modo anônimo, interromper outros processos mesmo sem encontrar nada que interferisse nas portas necessárias, etc. Nada adiantou, apenas executar o Inspetor no VS Code Browser resolveu. Funciona!! Estou realmente confuso por não haver discussões sobre isso. Espero que haja algo que precise ser corrigido no SDK/Inspetor.