Tem um tipo de fricção que aparece rápido quando a gente começa a expor ferramentas de IA via MCP: o backend consegue gerar tokens em streaming, mas o cliente continua esperando uma resposta fechada da tool.
Num exemplo mínimo em Python com FastMCP, a implementação pode parecer natural:
from fastmcp import FastMCP
from llama_index.llms.lmstudio import LMStudio
mcp = FastMCP()
@mcp.tool()
async def story_teller(topic: str):
llm = LMStudio(model_name="qwen/qwen3-4b-2507")
prompt = f"Tell me a story about {topic}."
async for chunk in await llm.astream(prompt):
yield chunk
Na cabeça de quem implementa, isso deveria entregar texto incremental. Só que, em muitos clientes, o que aparece do outro lado é algo equivalente à representação do gerador assíncrono ou então nada útil até o fim da execução.
O ponto mais importante aqui é separar três coisas que parecem iguais, mas não são:
Mesmo quando o transporte suporta fluxo contínuo, muitos clientes ainda tratam chamada de tool como operação de request/response. Ou seja: eles até conversam com o servidor por um canal “streamável”, mas não necessariamente sabem transformar chunks emitidos pela tool em texto incremental renderizado para o usuário.
Na prática, se eu não controlo o cliente, eu tendo a assumir que streaming token a token da tool é um contrato frágil. Antes de desenhar UX em cima disso, vale validar o comportamento ponta a ponta com o cliente real.
Queria ouvir de quem está mexendo com agentes, MCP e RAG: vocês têm separado streaming de ferramenta e streaming da resposta final ou já conseguiram fazer isso parecer uma coisa só sem acoplamento demais?
Carregando comentários...