get_weather é o identificador exibido depois que o MS-Agent combina o nome da conexão do Servidor com o nome da ferramenta. area e target_date não são parâmetros de chamada pré-definidos, mas parâmetros estruturados gerados pelo Qwen3-4B com base em "Hangzhou amanhã". Os resultados de registro relevantes são mostrados abaixo.
O MCP de clima recebe os parâmetros, analisa "Hangzhou" como "Hangzhou, Zhejiang, China", converte tomorrow em 7 de setembro de 2026 conforme o fuso horário local e retorna:
{
"requested_area": "Hangzhou",
"resolved_area": "Hangzhou, Zhejiang, China",
"date": "2026-09-07",
"timezone": "Asia/Shanghai",
"weather_code": 51,
"weather": "chuvisco fraco",
"temperature_max_c": 29.0,
"temperature_min_c": 21.6,
"precipitation_probability_max_percent": 31,
"wind_speed_max_kmh": 13.0,
"data_source": "Open-Meteo"
}
O Qwen3-4B gera então uma resposta em linguagem natural baseada nesses resultados, listando a região realmente correspondente, a data, as condições climáticas, as temperaturas máxima e mínima, a probabilidade de precipitação e a velocidade máxima do vento. A cadeia de chamadas "entender a pergunta — selecionar a ferramenta — gerar parâmetros — executar a ferramenta — processar resultados" está assim concluída. Os resultados combinados do modelo grande são mostrados abaixo.
Após a hospedagem e configuração, conecte-se primeiro diretamente ao serviço e verifique a lista de ferramentas. O exemplo de teste a seguir usa o site https://example.com.
async def direct_fetch_check():
async with streamable_http_client(MCP_SERVER_URL) as streams:
read_stream, write_stream, _ = streams
async with ClientSession(read_stream, write_stream) as session:
await session.initialize()
tools = await session.list_tools()
print("Ferramentas retornadas pelo servidor:", [tool.name for tool in tools.tools])
result = await session.call_tool(
"fetch",
arguments={
"url": "https://example.com",
"max_length": 1000,
"start_index": 0,
"raw": False,
},
)
if result.isError:
raise RuntimeError(str(result.content)
for block in result.content:
if getattr(block, "type", None) == "text":
print(block.text)
await direct_fetch_check()
Entrar participar da discussão
Na execução real, o servidor expõe a ferramenta fetch e retorna trechos de conteúdo e links da página da web de destino. Isso confirma que o serviço de hospedagem do ModelScope, a conexão HTTP Streamable e a ferramenta de web scraping funcionam corretamente. A conexão direta ao serviço fetch hospedado pelo ModelScope, a descoberta de ferramentas e o conteúdo web retornado são mostrados abaixo.

Após a chamada direta bem-sucedida, reutilize o Qwen3-4B configurado anteriormente para que o modelo selecione a ferramenta de forma autônoma:
fetch_agent = LLMAgent(
config=agent_config,
tag="fetch-demo",
mcp_config=mcp_config,
)
await fetch_agent.run(
"Por favor, use a ferramenta de web scraping para ler https://example.com."
"Ao chamar, defina max_length como 1000 e retorne o principal uso descrito no corpo da página e o primeiro link."
"Use apenas o conteúdo retornado por esta chamada de ferramenta; se a chamada falhar, explique claramente e não invente nada."
)
Os registros mostram que o MS-Agent conectou-se com sucesso ao servidor chamado fetch, o Qwen3-4B selecionou fetch---fetch e gerou os seguintes parâmetros:
{
"url": "https://example.com",
"max_length": 1000
}
Após a ferramenta retornar o conteúdo da web, o modelo explica que esse domínio é usado para exemplos de documentação e fornece o primeiro link retornado pela ferramenta. Ao verificar esses resultados, os parâmetros gerados pelo modelo, o retorno original da ferramenta e a resposta final devem ser verificados separadamente.

O gerenciamento de permissões MCP não deve se limitar a "este servidor pode ser conectado ou não", mas deve esclarecer três perguntas: quais recursos o usuário atual pode acessar, quais ferramentas o modelo pode invocar e qual impacto cada chamada terá nos sistemas externos. Portanto, o controle de acesso deve ser implementado camada por camada, desde o Host até o Servidor MCP e depois até os sistemas de backend, seguindo sempre o princípio do menor privilégio. Mesmo ferramentas somente leitura não devem ser consideradas sem risco por padrão, pois ainda podem ler informações sensíveis como informações de clientes, código-fonte e tokens de acesso.
O MCP permite ao modelo não apenas gerar conteúdo, mas também ler arquivos, consultar bancos de dados, chamar serviços de rede e até modificar sistemas externos. Portanto, os riscos de segurança que ele introduz são mais complexos que os de um modelo de chat normal. As fontes de risco incluem não apenas entradas do usuário, mas também páginas web, documentos, registros de banco de dados, resultados retornados por ferramentas, código do servidor e dependências de terceiros. O mais típico é a injeção de Prompt: conteúdo externo pode ocultar instruções maliciosas que incitam o modelo a continuar chamando ferramentas de arquivo, rede ou mensagens, formando uma cadeia perigosa de operações entre sistemas.
O MCP é mais adequado para cenários onde há muitas ferramentas e fontes de dados externas, onde se deseja que essas capacidades possam ser reutilizadas por diferentes modelos ou Agents, e onde se deseja que o modelo decida dinamicamente quais ferramentas chamar. As aplicações comuns incluem acesso a arquivos, consultas a bancos de dados e recuperação de informações.
O MCP também é adequado para conectar e-mails, calendários, armazenamento em nuvem, sistemas de gestão de projetos e APIs de negócios existentes. No entanto, nem todas as interfaces precisam ser transformadas em MCP. Se o fluxo de negócios é fixo, as relações de chamada são claras e os requisitos de latência são altos, uma chamada direta a uma API comum geralmente é mais simples e confiável.
Todos os dados experimentais e código deste capítulo estão disponíveis em:
https://modelscope.cn/gallery/liucong/fae5791c-a024-412f-97c3-5fb93fee708e