AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 79582846
Accepted
mysynaje_navucannie
mysynaje_navucannie
Asked: 2025-04-20 05:31:54 +0800 CST2025-04-20 05:31:54 +0800 CST 2025-04-20 05:31:54 +0800 CST

O servidor Python MCP com transporte STDIO lança um 'Erro: conexão SSE não estabelecida' ao tentar conectar via MCP Inspector

  • 772

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 uvo 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 :

  1. mcp dev src/server.pyno Powershell enquanto estiver no diretório raiz do projeto.
  2. 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 uvcom 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
  1. 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

python
  • 2 2 respostas
  • 234 Views

2 respostas

  • Voted
  1. Techiral
    2025-04-20T14:22:01+08:002025-04-20T14:22:01+08:00

    Resumo rápido

    Você está vendo isso Error: SSE connection not establishedporque o MCP Inspector sempre negocia uma camada SSE, mesmo que seu servidor use STDIO, e sem um endpoint SSE real, ele falha /messageapó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 uma mcp-proxy stdio→sseponte 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 PYTHONPATHpara que seu ambiente virtual seja usado.

    • Exemplo de comando:

      C:\path\to\venv\Scripts\python.exe -m mcp run src/server.py
      
    • Certifique-se de que sua sessão do PowerShell ou terminal ative o mesmo venv antes de iniciar o Inspector.

    Por que isso ajuda

    • O Inspector gera o processo para transportes STDIO; se ele pega um Python do sistema sem mcpinstalá-lo, o handshake JSON-RPC nunca é concluído.

    Prós e contras

    Prós Contras
    Sem dependências extras Ainda te prende às peculiaridades do Inspetor
    Permanece puramente STDIO Requer gerenciamento cuidadoso de caminho/ambiente

    2️⃣ Mudando seu servidor para transporte SSE

    O que fazer

    • No seu server.py, execute o servidor MCP sobre SSE em vez de STDIO:

      if __name__ == "__main__":
          mcp.run(transport="sse", port=6278)
      
    • No Inspetor, selecione SSE e aponte para http://127.0.0.1:6278/sse.

    Por que isso ajuda

    • A interface do Inspector é construída em SSE por baixo dos panos; se o seu servidor realmente fala SSE, não há nenhuma incompatibilidade fantasma.

    Prós e contras

    Prós Contras
    Conexão SSE direta → sem proxies Requer que você hospede um ponto de extremidade HTTP
    O inspetor simplesmente funciona Pode entrar em conflito com firewalls ou CORS se remoto

    3️⃣ Conectando STDIO → SSE com mcp-proxy

    O que fazer

    1. Instalar o proxy:

      npm install -g @modelcontextprotocol/mcp-proxy
      
    2. Inicie-o no modo stdio→sse :

      mcp-proxy stdio-to-sse http://localhost:6278 --command python --args "src/server.py"
      
    3. No Inspector, conecte via SSE a http://127.0.0.1:6278/sse.

    Por que isso ajuda

    • Você não reescreve seu servidor nem se preocupa com variáveis ​​de ambiente — mcp-proxyele cuida da tradução do transporte.

    Prós e contras

    Prós Contras
    Mantém o código do servidor intacto Adiciona uma parte móvel extra
    Funciona localmente sem configuração HTTP Outra dependência a manter

    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:

    pip install omnimind
    
    from omnimind import OmniMind
    
    agent = OmniMind(config_path="servers.json")
    agent.run()
    

    O seu servers.jsonpode parecer com:

    {
      "mcpServers": {
        "server_name": {
          "command": "command_to_run",
          "args": ["arg1", "arg2"],
          "env": {
            "ENV_VAR": "value"
          }
        }
      }
    }
    

    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

    Prós Contras
    Totalmente declarativo Nova biblioteca para aprender
    Funciona sem interface gráfica (sem interface gráfica) Pode faltar algumas sutilezas exclusivas do Inspetor
    Permite que você crie scripts para vários servidores Menos depuração visual que o Inspector

    Qual opção é a certa para você?

    • Se você quer apenas que o Inspector funcione : escolha a Opção 1 ou 2 — é o patch mais rápido.
    • Se você precisar de alterações mínimas no código : a Opção 3 lhe dá uma ponte instantânea.
    • Se você deseja flexibilidade a longo prazo : a Opção 4 com OmniMind oferece o controle de configuração primeiro em Python puro.

    A propósito , o OmniMind é aquele cliente MCP bacana que encontrei no GitHub — realmente leve, configurado com apenas algumas linhas de Python e sem requisitos de API caros. Perfeito para quem busca uma configuração MCP descomplicada e econômica. Confira:

    • Repositório: https://github.com/Techiral/OmniMind
    • Documentação e exemplos: https://techiral.mintlify.app

    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 establisheddores de cabeça!

    • 0
  2. Best Answer
    mysynaje_navucannie
    2025-04-22T19:59:20+08:002025-04-22T19:59:20+08:00

    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.

    • 0

relate perguntas

  • Como divido o loop for em 3 quadros de dados individuais?

  • Como verificar se todas as colunas flutuantes em um Pandas DataFrame são aproximadamente iguais ou próximas

  • Como funciona o "load_dataset", já que não está detectando arquivos de exemplo?

  • Por que a comparação de string pandas.eval() retorna False

  • Python tkinter/ ttkboostrap dateentry não funciona quando no estado somente leitura

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve