mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-07-03 22:19:27 +00:00
* feat: adopt directory-based docs versioning with Edge channel Switch docs.crewai.com from navigation-only versioning (every version selector entry rendered the same docs/<lang>/* source files) to Mintlify's directory-based versioning so each version selector entry renders its own snapshot. Add an "Edge" channel under docs/edge/<lang>/* that always reflects main HEAD for unreleased work, eliminating pre-release leakage onto frozen release labels. External links to canonical /<lang>/* URLs are preserved via wildcard redirects that always land on the current default version. Layout: - docs/edge/<lang>/* rolling source (you edit here) - docs/edge/enterprise-api.*.yaml - docs/v<X.Y.Z>/<lang>/* frozen, immutable snapshots - docs/v<X.Y.Z>/enterprise-api.*.yaml - docs/images/ shared, append-only - docs/docs.json nav + redirects URLs follow the Mintlify-idiomatic shape: /edge/<lang>/<page> for Edge, /v<X.Y.Z>/<lang>/<page> for every frozen snapshot. The wildcard redirects /<lang>/:slug* -> /<default>/<lang>/:slug* keep stale links working, and every freeze rewrites them (plus all per-section/per-page redirects) so destinations always resolve to the current default without depending on a second redirect hop. Release flow integration (devtools release): - New module crewai_devtools.docs_versioning.freeze() materialises docs/v<X.Y.Z>/ from docs/edge/, rewrites openapi: refs inside the snapshot, inserts the version into every language block in docs.json, and refreshes all redirect destinations. - _update_docs_and_create_pr() in cli.py now calls that freeze during Phase 2 of devtools release. Edge changelogs are updated first (so the snapshot freeze picks them up), then the snapshot is staged alongside docs.json, branched as docs/freeze-v<X.Y.Z>, and the PR is titled [docs-freeze] docs: snapshot and changelog for v<X.Y.Z> — the title prefix the new CI guard reads. - The PR still gates tag, GitHub release, PyPI publish, and the enterprise release as before; no new PRs are added. - Pre-releases (1.X.YaN, 1.X.YbN, ...) skip the snapshot — they ride Edge — and the docs PR title omits the [docs-freeze] prefix. - docs_check (AI-generated docs scaffolding) writes to docs/edge/<lang>/* so newly-generated unreleased docs land in Edge and never accidentally touch a frozen snapshot. Migration scripts (one-shot): - scripts/docs/freeze_historical_versions.py reconstructs all 16 historical snapshots (v1.10.0 .. v1.14.7) from git tags via git archive | tar, rewriting openapi: MDX refs so each snapshot reads its own enterprise-api YAML rather than the live one. - scripts/docs/prefix_version_paths.py one-shot-migrates docs.json: rewrites every page path in 16 versioned blocks to point under docs/v<X.Y.Z>/, inserts a new Edge entry per language, tags v1.14.7 as Latest (default), prunes pages whose target file doesn't exist in the snapshot (e.g. docs/ar/ didn't exist before v1.12.0), and writes the wildcard + per-section redirects. - scripts/docs/freeze_current_edge.py is now a thin CLI wrapper around docs_versioning.freeze for manual one-off freezes (e.g. retroactively snapshotting a forgotten release). CI guards (.github/workflows/docs-snapshots.yml): - Frozen snapshots under docs/v[0-9]*/ are immutable; only PRs whose title contains [docs-freeze] (i.e. release-cut PRs generated by devtools release or the manual wrapper) may modify them. - Images under docs/images/ are append-only since snapshots share a single image directory. Deleting or renaming an image breaks every historical snapshot that still references it. Restored docs/images/crewai-otel-export.png from PR #3673; it was deleted in PR #4908 but v1.10.0 / v1.10.1 snapshots still reference it. Restoring instead of editing the snapshots preserves historical rendering fidelity and validates the new append-only rule retroactively. Tests: - lib/devtools/tests/test_docs_versioning.py covers the freeze: file copy, openapi rewrite, version insertion, default demotion, redirect upserts, per-section redirect rewriting, idempotency, and invalid inputs. Verified locally with mintlify broken-links: 0 broken links across the full site (Edge + 16 frozen versions, 4 locales). AGENTS.md (repo root) is the contributor guide for the new model; RELEASING.md is the release-cut runbook; README's Contribution section links to both. Co-authored-by: Cursor <cursoragent@cursor.com> * style: resolve linter issues --------- Co-authored-by: Cursor <cursoragent@cursor.com>
330 lines
12 KiB
Plaintext
330 lines
12 KiB
Plaintext
---
|
||
title: "Servidores MCP como Ferramentas no CrewAI"
|
||
description: "Aprenda como integrar servidores MCP como ferramentas nos seus agentes CrewAI usando a biblioteca `crewai-tools`."
|
||
icon: plug
|
||
mode: "wide"
|
||
---
|
||
|
||
## Visão Geral
|
||
|
||
O [Model Context Protocol](https://modelcontextprotocol.io/introduction) (MCP) fornece uma maneira padronizada para agentes de IA fornecerem contexto para LLMs comunicando-se com serviços externos, conhecidos como Servidores MCP.
|
||
|
||
O CrewAI oferece **duas abordagens** para integração MCP:
|
||
|
||
### 🚀 **Novo: Integração DSL Simples** (Recomendado)
|
||
|
||
Use o campo `mcps` diretamente nos agentes para integração perfeita de ferramentas MCP:
|
||
|
||
```python
|
||
from crewai import Agent
|
||
|
||
agent = Agent(
|
||
role="Analista de Pesquisa",
|
||
goal="Pesquisar e analisar informações",
|
||
backstory="Pesquisador especialista com acesso a ferramentas externas",
|
||
mcps=[
|
||
"https://mcp.exa.ai/mcp?api_key=sua_chave", # Servidor MCP externo
|
||
"https://api.weather.com/mcp#get_forecast", # Ferramenta específica do servidor
|
||
"snowflake", # MCP conectado do catálogo
|
||
"stripe#list_invoices" # Ferramenta específica de MCP conectado
|
||
]
|
||
)
|
||
# Ferramentas MCP agora estão automaticamente disponíveis para seu agente!
|
||
```
|
||
|
||
### 🔧 **Avançado: MCPServerAdapter** (Para Cenários Complexos)
|
||
|
||
Para casos de uso avançados que requerem gerenciamento manual de conexão, a biblioteca `crewai-tools` fornece a classe `MCPServerAdapter`.
|
||
|
||
Atualmente, suportamos os seguintes mecanismos de transporte:
|
||
|
||
- **HTTPS**: para servidores remotos (comunicação segura via HTTPS)
|
||
- **Server-Sent Events (SSE)**: para servidores remotos (transmissão de dados unidirecional em tempo real do servidor para o cliente via HTTP)
|
||
- **Streamable HTTP**: para servidores remotos (comunicação flexível e potencialmente bidirecional via HTTP, geralmente utilizando SSE para streams do servidor para o cliente)
|
||
|
||
## Tutorial em Vídeo
|
||
|
||
Assista a este tutorial em vídeo para um guia abrangente sobre a integração do MCP com o CrewAI:
|
||
|
||
<iframe
|
||
className="w-full aspect-video rounded-xl"
|
||
src="https://www.youtube.com/embed/TpQ45lAZh48"
|
||
title="CrewAI MCP Integration Guide"
|
||
frameBorder="0"
|
||
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
||
allowFullScreen
|
||
></iframe>
|
||
|
||
## Instalação
|
||
|
||
Antes de começar a usar MCP com `crewai-tools`, é necessário instalar a dependência extra `mcp` do `crewai-tools` com o seguinte comando:
|
||
|
||
```shell
|
||
uv pip install 'crewai-tools[mcp]'
|
||
```
|
||
|
||
## Conceitos Chave & Primeiros Passos
|
||
|
||
A classe `MCPServerAdapter` da `crewai-tools` é a principal forma de conectar-se a um servidor MCP e disponibilizar suas ferramentas aos seus agentes CrewAI. Ela suporta diferentes mecanismos de transporte e simplifica o gerenciamento de conexões.
|
||
|
||
O uso de um gerenciador de contexto Python (`with`) é a **abordagem recomendada** para o `MCPServerAdapter`. Ele lida automaticamente com a abertura e o fechamento da conexão com o servidor MCP.
|
||
|
||
## Configuração de Conexão
|
||
|
||
O `MCPServerAdapter` suporta várias opções de configuração para personalizar o comportamento da conexão:
|
||
|
||
- **`connect_timeout`** (opcional): Tempo máximo em segundos para aguardar o estabelecimento de uma conexão com o servidor MCP. O padrão é 30 segundos se não especificado. Isso é particularmente útil para servidores remotos que podem ter tempos de resposta variáveis.
|
||
|
||
```python
|
||
# Exemplo com timeout personalizado para conexão
|
||
with MCPServerAdapter(server_params, connect_timeout=60) as tools:
|
||
# A conexão terá timeout após 60 segundos se não estabelecida
|
||
pass
|
||
```
|
||
|
||
```python
|
||
from crewai import Agent
|
||
from crewai_tools import MCPServerAdapter
|
||
from mcp import StdioServerParameters # Para servidor Stdio
|
||
|
||
# Exemplo de server_params (escolha um baseado no seu tipo de servidor):
|
||
# 1. Servidor Stdio:
|
||
server_params=StdioServerParameters(
|
||
command="python3",
|
||
args=["servers/your_server.py"],
|
||
env={"UV_PYTHON": "3.12", **os.environ},
|
||
)
|
||
|
||
# 2. Servidor SSE:
|
||
server_params = {
|
||
"url": "http://localhost:8000/sse",
|
||
"transport": "sse"
|
||
}
|
||
|
||
# 3. Servidor Streamable HTTP:
|
||
server_params = {
|
||
"url": "http://localhost:8001/mcp",
|
||
"transport": "streamable-http"
|
||
}
|
||
|
||
# Exemplo de uso (descomente e adapte após definir server_params):
|
||
with MCPServerAdapter(server_params, connect_timeout=60) as mcp_tools:
|
||
print(f"Available tools: {[tool.name for tool in mcp_tools]}")
|
||
|
||
meu_agente = Agent(
|
||
role="Usuário de Ferramentas MCP",
|
||
goal="Utilizar ferramentas de um servidor MCP.",
|
||
backstory="Posso conectar a servidores MCP e usar suas ferramentas.",
|
||
tools=mcp_tools, # Passe as ferramentas carregadas para o seu agente
|
||
reasoning=True,
|
||
verbose=True
|
||
)
|
||
# ... restante da configuração do seu crew ...
|
||
```
|
||
|
||
Este padrão geral mostra como integrar ferramentas. Para exemplos específicos para cada transporte, consulte os guias detalhados abaixo.
|
||
|
||
## Filtrando Ferramentas
|
||
|
||
```python
|
||
with MCPServerAdapter(server_params, connect_timeout=60) as mcp_tools:
|
||
print(f"Available tools: {[tool.name for tool in mcp_tools]}")
|
||
|
||
meu_agente = Agent(
|
||
role="Usuário de Ferramentas MCP",
|
||
goal="Utilizar ferramentas de um servidor MCP.",
|
||
backstory="Posso conectar a servidores MCP e usar suas ferramentas.",
|
||
tools=mcp_tools["tool_name"], # Passe as ferramentas filtradas para o seu agente
|
||
reasoning=True,
|
||
verbose=True
|
||
)
|
||
# ... restante da configuração do seu crew ...
|
||
```
|
||
|
||
## Usando com CrewBase
|
||
|
||
Para usar ferramentas de servidores MCP dentro de uma classe CrewBase, utilize o método `get_mcp_tools`. As configurações dos servidores devem ser fornecidas via o atributo `mcp_server_params`. Você pode passar uma configuração única ou uma lista com múltiplas configurações.
|
||
|
||
```python
|
||
@CrewBase
|
||
class CrewWithMCP:
|
||
# ... defina o arquivo de configuração de agentes e tasks ...
|
||
|
||
mcp_server_params = [
|
||
# Servidor Streamable HTTP
|
||
{
|
||
"url": "http://localhost:8001/mcp",
|
||
"transport": "streamable-http"
|
||
},
|
||
# Servidor SSE
|
||
{
|
||
"url": "http://localhost:8000/sse",
|
||
"transport": "sse"
|
||
},
|
||
# Servidor StdIO
|
||
StdioServerParameters(
|
||
command="python3",
|
||
args=["servers/your_stdio_server.py"],
|
||
env={"UV_PYTHON": "3.12", **os.environ},
|
||
)
|
||
]
|
||
|
||
@agent
|
||
def your_agent(self):
|
||
return Agent(config=self.agents_config["your_agent"], tools=self.get_mcp_tools()) # obter todas as ferramentas disponíveis
|
||
|
||
# ... restante da configuração do seu crew ...
|
||
```
|
||
|
||
<Tip>
|
||
Quando uma classe é decorada com `@CrewBase`, o ciclo de vida do adaptador é controlado automaticamente:
|
||
|
||
- A primeira chamada a `get_mcp_tools()` cria de forma preguiçosa um `MCPServerAdapter` compartilhado que é reutilizado por todos os agentes do crew.
|
||
- Após a conclusão de `.kickoff()`, um hook pós-kickoff injetado por `@CrewBase` encerra o adaptador, dispensando qualquer limpeza manual.
|
||
- Se `mcp_server_params` não estiver definido, `get_mcp_tools()` retorna uma lista vazia, permitindo manter o mesmo fluxo de código com ou sem MCP configurado.
|
||
|
||
Assim, é seguro chamar `get_mcp_tools()` em vários agentes ou habilitar/desabilitar MCP dependendo do ambiente.
|
||
|
||
</Tip>
|
||
|
||
### Configuração de Timeout de Conexão
|
||
|
||
Você pode configurar o timeout de conexão para servidores MCP definindo o atributo de classe `mcp_connect_timeout`. Se nenhum timeout for especificado, o padrão é 30 segundos.
|
||
|
||
```python
|
||
@CrewBase
|
||
class CrewWithMCP:
|
||
mcp_server_params = [...]
|
||
mcp_connect_timeout = 60 # timeout de 60 segundos para todas as conexões MCP
|
||
|
||
@agent
|
||
def your_agent(self):
|
||
return Agent(config=self.agents_config["your_agent"], tools=self.get_mcp_tools())
|
||
```
|
||
|
||
```python
|
||
@CrewBase
|
||
class CrewWithDefaultTimeout:
|
||
mcp_server_params = [...]
|
||
# Nenhum mcp_connect_timeout especificado - usa padrão de 30 segundos
|
||
|
||
@agent
|
||
def your_agent(self):
|
||
return Agent(config=self.agents_config["your_agent"], tools=self.get_mcp_tools())
|
||
```
|
||
|
||
### Filtragem de Ferramentas
|
||
|
||
Você pode filtrar quais ferramentas estão disponíveis para seu agente passando uma lista de nomes de ferramentas para o método `get_mcp_tools`.
|
||
|
||
```python
|
||
@agent
|
||
def another_agent(self):
|
||
return Agent(
|
||
config=self.agents_config["your_agent"],
|
||
tools=self.get_mcp_tools("tool_1", "tool_2") # obter ferramentas específicas
|
||
)
|
||
```
|
||
|
||
A configuração de timeout se aplica a todas as chamadas de ferramentas MCP dentro do crew:
|
||
|
||
```python
|
||
@CrewBase
|
||
class CrewWithCustomTimeout:
|
||
mcp_server_params = [...]
|
||
mcp_connect_timeout = 90 # timeout de 90 segundos para todas as conexões MCP
|
||
|
||
@agent
|
||
def filtered_agent(self):
|
||
return Agent(
|
||
config=self.agents_config["your_agent"],
|
||
tools=self.get_mcp_tools("tool_1", "tool_2") # ferramentas específicas com timeout personalizado
|
||
)
|
||
```
|
||
|
||
## Explore Integrações MCP
|
||
|
||
<CardGroup cols={2}>
|
||
<Card
|
||
title="Transporte Stdio"
|
||
icon="server"
|
||
href="/pt-BR/mcp/stdio"
|
||
color="#3B82F6"
|
||
>
|
||
Conecte-se a servidores MCP locais via entrada/saída padrão. Ideal para
|
||
scripts e executáveis locais.
|
||
</Card>
|
||
<Card
|
||
title="Transporte SSE"
|
||
icon="wifi"
|
||
href="/pt-BR/mcp/sse"
|
||
color="#10B981"
|
||
>
|
||
Integre com servidores MCP remotos usando Server-Sent Events para streaming
|
||
de dados em tempo real.
|
||
</Card>
|
||
<Card
|
||
title="Transporte HTTP Streamable"
|
||
icon="globe"
|
||
href="/pt-BR/mcp/streamable-http"
|
||
color="#F59E0B"
|
||
>
|
||
Utilize HTTP Streamable para uma comunicação robusta com servidores MCP
|
||
remotos.
|
||
</Card>
|
||
<Card
|
||
title="Conectando a Múltiplos Servidores"
|
||
icon="layer-group"
|
||
href="/pt-BR/mcp/multiple-servers"
|
||
color="#8B5CF6"
|
||
>
|
||
Agregue ferramentas de vários servidores MCP simultaneamente usando um único
|
||
adaptador.
|
||
</Card>
|
||
<Card
|
||
title="Considerações de Segurança"
|
||
icon="lock"
|
||
href="/pt-BR/mcp/security"
|
||
color="#EF4444"
|
||
>
|
||
Revise práticas importantes de segurança para integração MCP e mantenha seus
|
||
agentes protegidos.
|
||
</Card>
|
||
</CardGroup>
|
||
|
||
Confira este repositório para demonstrações completas e exemplos de integração MCP com CrewAI! 👇
|
||
|
||
<Card
|
||
title="Repositório GitHub"
|
||
icon="github"
|
||
href="https://github.com/tonykipkemboi/crewai-mcp-demo"
|
||
target="_blank"
|
||
>
|
||
Demo MCP do CrewAI
|
||
</Card>
|
||
|
||
## Segurança ao Usar MCP
|
||
|
||
<Warning>
|
||
Sempre assegure-se de confiar no servidor MCP antes de utilizá-lo.
|
||
</Warning>
|
||
|
||
#### Aviso de Segurança: Ataques de DNS Rebinding
|
||
|
||
Transportes SSE podem ser vulneráveis a ataques de DNS rebinding se não forem devidamente protegidos.
|
||
Para prevenir isso:
|
||
|
||
1. **Sempre valide os cabeçalhos Origin** das conexões SSE recebidas para garantir que venham de fontes esperadas
|
||
2. **Evite vincular servidores a todas as interfaces de rede** (0.0.0.0) quando executando localmente – faça o bind apenas para localhost (127.0.0.1)
|
||
3. **Implemente autenticação adequada** para todas as conexões SSE
|
||
|
||
Sem essas proteções, invasores podem usar DNS rebinding para interagir com servidores MCP locais via sites remotos.
|
||
|
||
Para mais detalhes, consulte a [documentação de Segurança de Transporte da MCP da Anthropic](https://modelcontextprotocol.io/docs/concepts/transports#security-considerations).
|
||
|
||
### Limitações
|
||
|
||
- **Primitivas Suportadas**: Atualmente, o `MCPServerAdapter` suporta principalmente a adaptação de `tools` MCP.
|
||
Outras primitivas MCP como `prompts` ou `resources` não são integradas diretamente como componentes CrewAI através deste adaptador por enquanto.
|
||
- **Manipulação de Saída**: O adaptador normalmente processa a saída principal de texto de uma ferramenta MCP (por exemplo, `.content[0].text`). Saídas complexas ou multimodais podem exigir tratamento customizado caso não se encaixem nesse padrão.
|