P4 MCP Server

O servidor Perforce P4MCP é um servidor do Protocolo de Contexto de Modelo (MCP) que se integra ao sistema de controle de versão Perforce P4.

Documentação

Perforce P4 MCP Server


Support

GitHub release

Perforce P4 MCP Server

O Perforce P4 MCP Server é um servidor MCP (Model Context Protocol) que se integra ao sistema de controle de versão Perforce P4. Ele é construído sobre FastMCP com bindings diretos de P4 Python para expor ferramentas seguras e estruturadas de leitura/escrita para changelists, arquivos, shelves, workspaces, jobs, reviews e metadados do servidor. Ele também se integra ao P4 DAM por meio de sua API REST para gerenciar recursos.

Recursos · Pré-requisitos · Requisitos do Sistema · Instalação · Implantação · Configurações do Cliente · Configurações do P4 · Ferramentas

Registro de Logs · Solução de Problemas · Suporte · Contribuições · Licença

Recursos

  • Integração abrangente com P4: Ferramentas de leitura/escrita para arquivos, changelists, shelves, workspaces, jobs, reviews, streams e informações do servidor.
  • Fluxos de trabalho de revisão de código: Suporte ao P4 Code Review para descoberta de reviews, votação, transições de estado, comentários e gerenciamento de participantes.
  • Integração com P4 DAM: Acesse ativos e metadados do P4 DAM por meio de assistentes de IA compatíveis com MCP. Pesquise ativos, recupere metadados, gerencie reviews, crie pacotes de ativos, atualize tags de ativos e navegue por projetos. Para saber mais, consulte Configurar acesso ao P4 DAM para o P4 MCP Server na documentação do P4 DAM.
  • Segurança em primeiro lugar: Modo somente leitura por padrão, verificações de propriedade, elicitação interativa do MCP (PROCEED/CANCEL) para operações destrutivas de exclusão e obliteração.
  • Conjuntos de ferramentas flexíveis: Configure quais categorias de ferramentas habilitar: servidor, arquivos, changelists, shelves, workspaces, jobs, reviews, streams e p4dam.
  • Registro de logs robusto: Registro de logs de aplicação e sessão no diretório logs/.
  • Telemetria opcional: Estatísticas de uso controladas por consentimento. Desabilitado por padrão.
  • Multiplataforma: Suportado em macOS, Linux e Windows com binários pré-compilados.

Pré-requisitos

  • Acesso ao servidor P4: Conexão a um servidor P4 com credenciais adequadas
  • Autenticação: Login P4 válido (baseado em ticket ou senha)

Requisitos do Sistema

ComponenteVersões Suportadas
Sistemas OperacionaisWindows 10+
macOS 12+
Linux (glibc 2.34+, ex.: Ubuntu 22.04+, Rocky Linux 9+)
Servidor Perforce P42026.1 (versões anteriores não testadas)
Python3.11+ (necessário apenas para compilar a partir do código-fonte)

Instalação Local do P4 MCP Server

uvx (mais fácil, sem necessidade de instalação)

Se você tiver o uv instalado, pode executar o P4 MCP Server diretamente sem nenhuma instalação manual:

# Run the server
uvx p4mcp-server

# Check version
uvx p4mcp-server --version

# Run with arguments
uvx p4mcp-server --readonly --allow-usage

Isso busca e executa automaticamente a versão mais recente do PyPI. Não é necessária configuração de ambiente virtual Python ou gerenciamento de dependências.

Requisitos:

  • uv instalado no seu sistema
  • Python 3.11+ (o uv cuidará disso automaticamente)
Binários pré-compilados (recomendado para ambientes offline/isolados)

Baixe o binário apropriado para o seu sistema operacional:

Extraia e use o executável diretamente. Nenhuma instalação do Python é necessária.

# macOS / Linux
unzip p4-mcp-server-mac.zip   # or p4-mcp-server-linux.zip
./p4-mcp-server --help
# Windows
Expand-Archive p4-mcp-server-win.zip -DestinationPath .
.\p4-mcp-server.exe --help
Compilar a partir do código-fonte

Requisitos:

  • Python 3.11+ (com Tkinter)

Compilar:

  • macOS: chmod +x build.sh && ./build.sh package
  • Linux: chmod +x build.sh && ./build.sh package
  • Windows: build.bat package

Saída:

  • macOS e Linux: p4-mcp-server-<versão>.tgz
  • Windows: p4-mcp-server-<versão>.zip

Implantação

Implantação baseada em STDIO

Local

Execute o P4 MCP Server diretamente na sua máquina usando o transporte STDIO padrão.

Adicione o seguinte ao seu mcp.json:

{
  "mcpServers": {
    "perforce-p4-mcp": {
      "command": "/absolute/path/to/p4-mcp-server",
      "env": {
        "P4PORT": "ssl:perforce.example.com:1666",
        "P4USER": "your_username",
        "P4CLIENT": "your_workspace",
        "P4DAM_API_KEY": "your_api_key"
      },
      "args": [
        "--readonly", "--allow-usage"
      ]
    }
  }
}

Nota: Este exemplo mostra valores explícitos de env. Se P4CONFIG estiver definido, você pode omiti-los e usar o exemplo de configuração genérica na seção MCP client configuration.

Docker

Execute o P4 MCP Server a partir de um contêiner Docker com transporte STDIO, permitindo que clientes MCP gerenciem o ciclo de vida do contêiner.

Nota: A execução baseada em Docker é atualmente suportada apenas em macOS e Linux.

Pré-requisitos

  • Docker instalado e em execução
  • Credenciais P4 válidas e acesso a um servidor P4

Baixar a imagem Docker

docker pull ghcr.io/perforce/p4mcp-server:latest
Compilar a partir do código-fonte
cd /path/to/p4mcp-server
docker build -t ghcr.io/perforce/p4mcp-server .

Configurar o Cliente MCP

Adicione o seguinte ao seu mcp.json:

{
    "servers": {
        "perforce-p4mcp-docker": {
            "command": "docker",
            "args": [
                "run", "-i", "--rm",
                "--hostname", "your-hostname",
                "-e", "P4PORT=ssl:perforce.example.com:1666",
                "-e", "P4USER=your_username",
                "-e", "P4CLIENT=your_workspace",
                "-e", "P4DAM_API_KEY=your_api_key",
                "-v", "/Users/your_username/.p4tickets:/home/mcpuser/.p4tickets:ro",
                "ghcr.io/perforce/p4mcp-server:latest"
            ]
        }
    }
}

Opções de Configuração

FlagDescrição
-iModo interativo (necessário para STDIO)
--rmRemover contêiner quando parado
--hostnameCorresponder restrição de host do workspace
-e P4PORTEndereço do servidor P4
-e P4USERNome de usuário P4
-e P4CLIENTNome do workspace
-vMontar arquivo de tickets P4

Autenticação

Usando tickets P4:

# macOS/Linux
-v /Users/your_username/.p4tickets:/home/mcpuser/.p4tickets:ro

Nota: Use o caminho completo para o seu arquivo de tickets (não ~). Após executar p4 login, reinicie o servidor MCP para aplicar o novo ticket.

Nota: Por padrão, o contêiner inicia como root, copia o arquivo de tickets montado por bind para um local legível pelo mcpuser não-root e, em seguida, reduz privilégios (via gosu) para que o servidor execute como mcpuser. Essa cópia automática permite que um arquivo de tickets com restrição de proprietário (0600) pertencente a um uid estrangeiro funcione em runtimes que preservam a propriedade do host (Docker/podman Linux nativo). Uma montagem por bind :ro do ticket é suportada — o arquivo é copiado, não modificado no local (isso é distinto de um sistema de arquivos raiz somente leitura; veja abaixo). Observe que a cópia automática é executada apenas quando o contêiner inicia como root (o padrão); forçar um uid não-root ou um sistema de arquivos raiz somente leitura altera esse comportamento, conforme descrito abaixo.

Kubernetes / perfis restritos (com aplicação de não-root): a imagem intencionalmente inicia como root e reduz para mcpuser (uid 1000) via gosu, então o servidor sempre executa como não-root — ambos os caminhos são suportados. Para runAsNonRoot / PodSecurity restrito / SCC restrito do OpenShift, defina securityContext.runAsUser: 1000 (e fsGroup: 1000 ao montar o ticket). Nesse modo, a cópia do ticket exclusiva do root no entrypoint é ignorada, então o ticket montado já deve ser legível pelo uid 1000 (montagem com correspondência de proprietário, -e P4PASSWD="your_ticket_content" ou podman -v <host>:/home/mcpuser/.p4tickets:U).

Sistema de arquivos raiz somente leitura (--read-only / readOnlyRootFilesystem): forneça um /home/mcpuser gravável/tmpfs (ex.: --tmpfs /home/mcpuser) para que a cópia do ticket possa ser gravada; caso contrário, a cópia do ticket falha e o P4 relatará um erro de autenticação normal.

Usando uma senha:

-e P4PASSWD="your_password"

Restrições de Host do Workspace

⚠️ Importante: Os contêineres Docker têm seu próprio hostname, que difere da sua máquina local. Se o seu workspace P4 estiver restrito a um host específico, operações como sync falharão.

Para resolver isso, defina o hostname do contêiner para corresponder à restrição de host do seu workspace:

--hostname your-hostname

Para descobrir o nome do host do seu workspace:

# macOS/Linux
p4 client -o your_workspace | grep "^Host:"

Montagem do Client Root para Operações de Escrita

⚠️ Importante: Por padrão, o contêiner Docker não pode acessar os arquivos do seu workspace local. Para operações de escrita como sync, submit ou reconcile, você deve montar o diretório client root no contêiner no mesmo caminho.

Adicione uma montagem de volume para o seu client root:

-v /path/to/your/client/root:/path/to/your/client/root

Exemplo de configuração com client root montado:

{
    "servers": {
        "perforce-p4mcp-docker": {
            "command": "docker",
            "args": [
                "run", "-i", "--rm",
                "--hostname", "your-hostname",
                "-e", "P4PORT=ssl:perforce.example.com:1666",
                "-e", "P4USER=your_username",
                "-e", "P4CLIENT=your_workspace",
                "-e", "P4DAM_API_KEY=your_api_key",
                "-v", "/Users/your_username/.p4tickets:/home/mcpuser/.p4tickets",
                "-v", "/path/to/client/root:/path/to/client/root",
                "ghcr.io/perforce/p4mcp-server:latest"
            ]
        }
    }
}

Para descobrir o seu client root:

p4 client -o your_workspace | grep "^Root:"

Nota: O caminho de montagem dentro do contêiner deve corresponder exatamente ao caminho do client root, pois o P4 rastreia arquivos por seus caminhos absolutos.

Implantação baseada em HTTP

VM

Execute o servidor MCP em uma VM usando o transporte HTTP, permitindo que clientes se conectem pela rede.

Inicie o servidor na VM:

P4PORT=ssl:perforce.example.com:1666 P4USER=your_username P4PASSWD=YOUR_TICKET ./p4-mcp-server --readonly --transport http --port 8000

Configure o cliente MCP:

Adicione o seguinte ao seu mcp.json:

{
    "servers": {
        "perforce-p4-mcp": {
            "type": "http",
            "url": "http://<ip-or-hostname>:8000/mcp"
        }
    }
}

Nota: Certifique-se de que o firewall da VM permita conexões de entrada na porta escolhida. Para uso em produção, considere colocar o servidor atrás de um proxy reverso com TLS.

Docker

Execute o servidor MCP em um contêiner Docker usando transporte HTTP e exponha o endpoint MCP em uma porta do host.

Inicie o contêiner:

docker run --rm -p 8000:8000 \
  -e P4PORT=ssl:perforce.example.com:1666 \
  -e P4USER=your_username \
  -e P4PASSWD=YOUR_TICKET \
  -e P4DAM_API_KEY=your_api_key \
  ghcr.io/perforce/p4mcp-server:latest \
  python3 -m p4mcp.main --readonly --transport http --port 8000

Configure o cliente MCP:

Adicione o seguinte ao seu mcp.json:

{
  "servers": {
    "perforce-p4-mcp": {
      "type": "http",
      "url": "http://<ip-or-hostname>:8000/mcp"
    }
  }
}

Nota: O Docker também suporta implantação baseada em HTTP. A imagem do contêiner usa transporte STDIO por padrão, então o comando de inicialização HTTP deve substituir explicitamente o comando padrão. Se você precisar de operações de escrita, monte também os caminhos do client root e do arquivo de tickets no contêiner.

Configuração do cliente MCP

Nota: Em todos os exemplos de configuração abaixo, se P4CONFIG estiver definido, você não precisa definir nenhuma variável de ambiente no bloco env. O servidor usará a configuração do arquivo P4CONFIG especificado.

Dica: Se você tiver o uv instalado, pode usar uvx p4mcp-server em vez de /absolute/path/to/p4-mcp-server no campo command. Isso elimina a necessidade de baixar ou compilar binários manualmente.

Exemplo de configuração do servidor usando uvx
{
 "mcpServers": {
    "perforce-p4-mcp": {
       "command": "uvx",
       "args": [
          "p4mcp-server",
          "--readonly", "--allow-usage"
       ],
       "env": {
          "P4PORT": "ssl:perforce.example.com:1666",
          "P4USER": "your_username",
          "P4CLIENT": "your_workspace",
          "P4DAM_API_KEY": "your_api_key"
       }
    }
  }
}
Exemplo de configuração do servidor usando caminho do binário
{
 "mcpServers": {
    "perforce-p4-mcp": {
       "command": "/absolute/path/to/p4-mcp-server",
       "env": {
       },
       "args": [
          "--readonly", "--allow-usage"
       ]
    }
  }
}

IDEs JetBrains (IntelliJ IDEA, Rider, PyCharm, etc.)

Consulte a documentação de integração VCS do JetBrains AI Assistant para etapas de configuração detalhadas.

Claude Code

Consulte a documentação de MCP do Claude Code para mais informações.

Usando uvx (sem necessidade de instalação):

{
  "mcpServers": {
    "perforce-p4-mcp": {
      "command": "uvx",
      "args": [
        "p4mcp-server",
        "--readonly", "--allow-usage"
      ],
      "env": {
        "P4PORT": "ssl:perforce.example.com:1666",
        "P4USER": "your_username",
        "P4CLIENT": "your_workspace",
        "P4DAM_API_KEY": "your_api_key"
      }
    }
  }
}

Usando binário pré-compilado:

{
  "mcpServers": {
    "perforce-p4-mcp": {
      "command": "/absolute/path/to/p4-mcp-server",
      "env": {
        "P4PORT": "ssl:perforce.example.com:1666",
        "P4USER": "your_username",
        "P4CLIENT": "your_workspace",
        "P4DAM_API_KEY": "your_api_key"
      },
      "args": [
        "--readonly", "--allow-usage"
      ]
    }
  }
}
Cursor

Consulte a documentação de MCP do Cursor para mais informações.

{
  "mcpServers": {
    "perforce-p4-mcp": {
      "command": "/absolute/path/to/p4-mcp-server",
      "env": {
        "P4PORT": "ssl:perforce.example.com:1666",
        "P4USER": "your_username",
        "P4CLIENT": "your_workspace",
        "P4DAM_API_KEY": "your_api_key"
      },
      "args": [
        "--readonly", "--allow-usage"
      ]
    }
  }
}
Eclipse

Consulte a documentação de MCP do Eclipse para mais informações.

{
  "servers": {
    "perforce-p4-mcp": {
      "command": "/absolute/path/to/p4-mcp-server",
      "env": {
        "P4PORT": "ssl:perforce.example.com:1666",
        "P4USER": "your_username",
        "P4CLIENT": "your_workspace",
        "P4DAM_API_KEY": "your_api_key"
      },
      "args": [
        "--readonly", "--allow-usage"
      ]
    }
  }
}
Kiro

Consulte a documentação de MCP do Kiro para mais informações.

{
  "mcpServers": {
    "perforce-p4-mcp": {
      "command": "/absolute/path/to/p4-mcp-server",
      "env": {
        "P4PORT": "ssl:perforce.example.com:1666",
        "P4USER": "your_username",
        "P4CLIENT": "your_workspace",
        "P4DAM_API_KEY": "your_api_key"
      },
      "args": [
        "--readonly", "--allow-usage"
      ]
    }
  }
}
VS Code

Consulte a documentação do VS Code para mais informações.

{
  "servers": {
    "perforce-p4-mcp": {
      "command": "/absolute/path/to/p4-mcp-server",
      "env": {
        "P4PORT": "ssl:perforce.example.com:1666",
        "P4USER": "your_username",
        "P4CLIENT": "your_workspace",
        "P4DAM_API_KEY": "your_api_key"
      },
      "args": [
        "--readonly", "--allow-usage"
      ]
    }
  }
}
Windsurf

Consulte a documentação de MCP do Windsurf para mais informações.

{
  "mcpServers": {
    "perforce-p4-mcp": {
      "command": "/absolute/path/to/p4-mcp-server",
      "env": {
        "P4PORT": "ssl:perforce.example.com:1666",
        "P4USER": "your_username",
        "P4CLIENT": "your_workspace",
        "P4DAM_API_KEY": "your_api_key"
      },
      "args": [
        "--readonly", "--allow-usage"
      ]
    }
  }
}

Variáveis de ambiente do P4

  • P4PORT - Endereço do servidor P4. Exemplos: ssl:perforce.example.com:1666, localhost:1666
  • P4USER - Seu nome de usuário do P4
  • P4CLIENT - Seu workspace atual do P4. Opcional, mas recomendado

Variáveis de ambiente de limite de resultados

  • P4MCP_MAX_RESULTS - Limite no número de linhas que o servidor P4 retorna por comando (p4.maxresults). Padrão: 10000. Defina como 0 para desativar o limite (o padrão do servidor entra em vigor). Quando um comando exceder esse limite, o servidor o aborta com um erro em vez de truncar os resultados, portanto, mantenha o valor generoso. Pode ser substituído pelo argumento de CLI --max-results. Deve ser um inteiro não negativo; um valor inválido falha rapidamente na inicialização antes de qualquer conexão P4 ser tentada.
  • P4MCP_MAX_SCAN_ROWS - Limite no número de linhas que o servidor P4 examina por comando (p4.maxscanrows). Não definido por padrão, portanto, a política de administrador/grupo governa os limites de exame. Pode ser substituído pelo argumento de CLI --max-scan-rows. Deve ser um inteiro não negativo quando fornecido.

Variáveis de ambiente de registro (logging)

  • P4MCP_LOG_DIR - Diretório para arquivos de log. Padrão: logs/ no diretório do executável do servidor. Pode ser substituído pelo argumento de CLI --log-dir.

Variáveis de ambiente SSL/TLS

  • P4MCP_TLS_CA_MODE - Modo de origem do certificado TLS.
    • system (padrão): usa o armazenamento de confiança do SO via truststore. Nota: Neste modo, truststore substitui o parâmetro verify= — pacotes de CA personalizados definidos via P4MCP_CA_BUNDLE ou --ca-bundle são ignorados. Para usar um pacote de CA personalizado, defina P4MCP_TLS_CA_MODE=certifi.
    • certifi: desativa a injeção de truststore e usa o comportamento padrão de certificados TLS do Python. Pacotes de CA personalizados (P4MCP_CA_BUNDLE / --ca-bundle) só têm efeito neste modo.
  • P4MCP_SSL_VERIFY - Defina como false para desativar a verificação SSL para solicitações da API P4 Code Review. Padrão: true. Funciona em ambos os modos TLS.
  • P4MCP_CA_BUNDLE - Caminho para um pacote de certificados CA personalizado (PEM) para solicitações da API P4 Code Review. Tem prioridade sobre P4MCP_SSL_VERIFY. Requer P4MCP_TLS_CA_MODE=certifi para ter efeito.

Variáveis de ambiente de telemetria

  • OTEL_EXPORTER_OTLP_ENDPOINT - Endpoint do coletor OTLP para exportação de telemetria. Padrão: https://grpc.public.prd.shared.perforce.com.
  • OTEL_EXPORTER_OTLP_PROTOCOL - Protocolo de exportação OTLP. Apenas grpc é suportado; outros valores voltam para grpc com um aviso.

Variáveis de ambiente do P4 DAM

  • P4DAM_API_KEY - Chave de API do P4 DAM. Enviada como Authorization: account_key='<key>' com todas as solicitações de API do P4 DAM. Requer uma sessão ativa do P4 DAM. Quando não definida, as ferramentas do P4 DAM não são registradas. O conjunto de ferramentas é silenciosamente ignorado na inicialização.

Descoberta de URL do P4 DAM: A URL base do P4 DAM é lida da propriedade P4 P4.HTH.URL no servidor. Se a propriedade não estiver definida, as chamadas de ferramentas do P4 DAM falham em tempo de execução.

SSL para P4 DAM: As solicitações de API do P4 DAM usam as mesmas configurações SSL que o Swarm — P4MCP_TLS_CA_MODE, --ca-bundle / P4MCP_CA_BUNDLE e --ssl-no-verify / P4MCP_SSL_VERIFY.

Argumentos suportados

  • --readonly - Controla operações de escrita.

    • Se presente, usa o modo somente leitura. Seguro para exploração e testes.
    • Se ausente, habilita operações de escrita. Requer permissões adequadas no seu servidor P4.
  • --allow-usage - Permite estatísticas de uso.

    • Se presente, permite a coleta anônima de estatísticas de uso.
    • Se ausente, desativa todas as estatísticas de uso.
  • --toolsets - Especifica quais categorias de ferramentas habilitar.

    • Disponíveis: files, changelists, shelves, workspaces, jobs, reviews, streams, p4dam
    • Padrão: Todos os conjuntos de ferramentas habilitados.
    • query_server está sempre disponível independentemente da configuração de --toolsets.
  • --search-transform - Habilita a descoberta de ferramentas baseada em busca para reduzir a sobrecarga de tokens.

    • regex — Expõe uma ferramenta de busca por correspondência de padrões regex. Melhor para consultas direcionadas.
    • bm25 — Expõe uma ferramenta de busca por relevância em linguagem natural. Melhor para consultas exploratórias.
    • both — Expõe ambas as ferramentas de busca com nomes distintos (regex_search_tools/regex_call_tool e semantic_search_tools/semantic_call_tool).
    • Se omitido, o catálogo completo de ferramentas é enviado ao cliente (padrão, compatível com versões anteriores).
    • Quando habilitado, query_server está sempre diretamente visível ao cliente.
    • Segurança: As verificações de permissão de administrador (CheckPermissionMiddleware) e a filtragem de --readonly permanecem totalmente aplicadas. As buscas consultam o catálogo real de ferramentas internamente, portanto, ferramentas bloqueadas por middleware ou excluídas pelo modo somente leitura nunca são descobríveis ou chamáveis pela interface de busca.
  • --max-results <N> - Limite no número de linhas que o servidor P4 retorna por comando (p4.maxresults).

    • Padrão: 10000. Defina como 0 para desativar o limite (o padrão do servidor entra em vigor).
    • Protege contra consultas descontroladas orientadas por IA que esgotam a memória local ou sobrecarregam o servidor.
    • Quando um comando exceder esse limite, o servidor o aborta com um erro — ele não trunca — portanto, mantenha o valor generoso.
    • Deve ser um inteiro não negativo; um valor inválido falha rapidamente na inicialização antes de qualquer conexão P4 ser tentada.

    Ordem de prioridade: --max-results > P4MCP_MAX_RESULTS > padrão (10000).

  • --max-scan-rows <N> - Limite no número de linhas que o servidor P4 examina por comando (p4.maxscanrows).

    • Não definido por padrão, portanto, a política de administrador/grupo governa os limites de exame.
    • Deve ser um inteiro não negativo quando fornecido; um valor inválido falha rapidamente na inicialização.

    Ordem de prioridade: --max-scan-rows > P4MCP_MAX_SCAN_ROWS > padrão (não definido).

  • --ssl-no-verify - Desativa a verificação de certificado SSL para solicitações da API P4 Code Review.

    • Útil para ambientes com certificados autoassinados ou CA interna.
    • Funciona em ambos os modos TLS system e certifi.
    • Essas opções SSL afetam apenas conexões Swarm HTTPS. Se a URL do Swarm for http://, elas não têm efeito.
  • --ca-bundle <path> - Caminho para um pacote de certificados CA personalizado (PEM) para solicitações da API P4 Code Review.

    • Use isto para confiar em uma CA interna sem desativar a verificação completamente.
    • Requer P4MCP_TLS_CA_MODE=certifi para ter efeito. No modo padrão system, truststore usa o armazenamento de confiança do SO e ignora esta configuração.
    • Se ambos --ca-bundle e --ssl-no-verify forem fornecidos, --ca-bundle tem prioridade (a verificação é realizada usando o pacote especificado).

    Ordem de prioridade: --ca-bundle > --ssl-no-verify > P4MCP_CA_BUNDLE > P4MCP_SSL_VERIFY > padrão (true). Argumentos de CLI têm prioridade sobre variáveis de ambiente.

  • --log-dir <path> - Diretório para arquivos de log.

    • Especifique um diretório personalizado para arquivos de log (logs de aplicação e de sessão).
    • Padrão: logs/ no diretório do executável do servidor.
    • Também pode ser definido via variável de ambiente P4MCP_LOG_DIR.
    • O argumento de CLI tem prioridade sobre a variável de ambiente.

    Ordem de prioridade: --log-dir > P4MCP_LOG_DIR > padrão (logs/ no diretório do executável do servidor).

Configurações necessárias

  • Use caminhos absolutos para o campo command em todas as configurações.
  • Garanta que as variáveis de ambiente estejam definidas corretamente para cada host.
  • Hosts diferentes podem ter análise de argumentos diferente. Consulte a documentação do host.

Configuração do P4

Configuração do usuário

Exemplo de configuração

# Windows (PowerShell)
$env:P4PORT = "ssl:perforce.example.com:1666"
$env:P4USER = "your_username"
$env:P4CLIENT = "your_workspace"
# macOS/Linux (Bash)
export P4PORT="ssl:perforce.example.com:1666"
export P4USER="your_username"
export P4CLIENT="your_workspace"

P4USER deve ser um usuário padrão. O P4 MCP Server executa comandos como p4 describe e p4 changes que um usuário do tipo service não tem permissão para executar, portanto, um usuário de serviço fará as ferramentas falharem em tempo de execução. Configure P4USER com um usuário Perforce do tipo standard. Consulte p4 user na documentação da CLI do P4.

Opções de limite de conexão

Estas opções limitam quanto trabalho um único comando P4 pode fazer, protegendo o servidor contra consultas descontroladas:

  • max_results — Limita quantas linhas o servidor P4 retorna por comando. Ativado por padrão com um valor generoso para proteger contra consultas descontroladas. Reduza o valor para apertar o limite. Configurado via P4MCP_MAX_RESULTS ou --max-results.
  • max_scan_rows — Limita quantas linhas o servidor examina por comando. Não definido por padrão (governado pela política de administrador/grupo). Configurado via P4MCP_MAX_SCAN_ROWS ou --max-scan-rows.

Configuração do administrador

Gerencie o acesso por meio de propriedades de servidor em nível de grupo e de usuário. O P4 resolve cada propriedade para um único valor usando duas regras, aplicadas em ordem:

  1. O maior número de sequência vence. O sinalizador -s é a chave de classificação primária. Ele se aplica a todos os escopos — uma propriedade de grupo em -s5 vence uma propriedade de usuário em -s1 ou o padrão.
  2. No mesmo número de sequência, o escopo é o desempate: usuário > grupo > global. Entre grupos no mesmo número de sequência, o nome de grupo alfabeticamente primeiro vence.

O P4 não compara valores semanticamente. Ele não sabe que false é mais restritivo que true. O valor da propriedade vencedora é retornado como está e verificado pelo servidor MCP.

Se nenhuma propriedade se aplicar, o MCP permanece habilitado, a menos que seja explicitamente desabilitado.

Interruptor mestre (desativação global)

Para desativar o MCP para todos os usuários:

p4 property -a -n mcp.enabled -v false

Para reativar o controle baseado em grupo/usuário, exclua a propriedade global primeiro:

p4 property -d -n mcp.enabled
Restrições baseadas em grupo

Para impedir o acesso de todos os membros de um grupo específico:

p4 property -a -n mcp.enabled -v false -g noaccessgroup

Você pode definir várias restrições de grupo da mesma maneira.

Quando um usuário pertence a vários grupos com configurações conflitantes, a resolução de propriedades do P4 determina qual valor vence.

O maior número de sequência (-s) vence. Em números de sequência iguais, o nome de grupo alfabeticamente primeiro vence.

Exemplo:

p4 property -a -n mcp.enabled -v false -s1 -g noaccessgroup
p4 property -a -n mcp.enabled -v true  -s2 -g accessgroup

Neste exemplo, accessgroup vence porque -s2 é maior que -s1.

Restrições baseadas em usuário

Para bloquear um usuário específico independentemente da associação ao grupo:

p4 property -a -n mcp.enabled -v false -u noaccessuser

No mesmo número de sequência, propriedades de nível de usuário sobrescrevem configurações de grupo e globais (desempate de escopo do P4).

Exemplo: Mesmo se noaccessuser estiver em accessgroup (onde MCP está habilitado), a propriedade de usuário no mesmo número de sequência tem precedência e o MCP é desabilitado.

Nota: Uma propriedade de grupo com valor de -s maior pode sobrescrever uma propriedade de usuário com número de sequência menor. Para garantir que uma propriedade de nível de usuário sempre vença, atribua a ela um valor alto de -s ou garanta que nenhuma propriedade de grupo use uma sequência maior.

Lista de permissões de toolset (global)

Restrinja quais toolsets estão disponíveis em todo o servidor usando mcp.toolsets.allowed. Apenas os toolsets listados serão habilitados; todos os demais serão bloqueados.

Toolsets disponíveis: server, changelists, files, jobs, reviews, shelves, workspaces, streams

Permitir apenas changelists e arquivos:

p4 property -a -n mcp.toolsets.allowed -v changelists,files

Remova a lista de permissões para restaurar todos os toolsets:

p4 property -d -n mcp.toolsets.allowed
Modo somente leitura global

Desabilite todas as operações de escrita (ferramentas de modificação) mantendo as operações de leitura (ferramentas de consulta) disponíveis:

p4 property -a -n mcp.toolsets.write -v false

Reabilite as escritas:

p4 property -a -n mcp.toolsets.write -v true

Quando write=false, todas as ferramentas modify_* são bloqueadas, mas todas as ferramentas query_* continuam funcionando.

Habilitar/desabilitar toolset por grupo

Habilite ou desabilite toolsets individuais para um grupo específico.

Desabilite um toolset para um grupo específico:

p4 property -a -n mcp.toolset.changelists.enabled -v false -g reviewers

Usuários em reviewers são bloqueados de changelists. Usuários em outros grupos (sem configuração explícita) mantêm o acesso padrão.

Para restringir um toolset a apenas um grupo, desabilite-o para todos os outros grupos que não devem ter acesso:

p4 property -a -n mcp.toolset.files.enabled -v false -g reviewers
p4 property -a -n mcp.toolset.files.enabled -v false -g interns
# Only groups without an explicit "false" retain default access to files

Nota: Todos os toolsets são habilitados por padrão. Definir enabled=true para um grupo é redundante, a menos que você esteja explicitamente sobrescrevendo uma configuração anterior de false. No mesmo número de sequência, uma propriedade de grupo sobrescreve uma propriedade global (desempate de escopo do P4), então um enabled=true de grupo pode sobrescrever um enabled=false global. Para garantir que uma configuração global não possa ser sobrescrita, atribua a ela um valor alto de -s. Para isolar um toolset a grupos específicos, desabilite-o para os grupos que você deseja bloquear.

Controle de escrita por toolset por grupo

Controle o acesso de escrita para cada toolset no nível de grupo.

Desabilite escritas para um toolset específico por grupo:

p4 property -a -n mcp.toolset.workspaces.write -v false -g reviewers

Isso bloqueia modify_workspaces para o grupo enquanto query_workspaces permanece acessível.

Substituições específicas por ferramenta

Restrinja um grupo a ferramentas específicas dentro de um toolset usando mcp.toolset.<name>.tools.

Permitir apenas query_files (bloquear modify_files) para desenvolvedores:

p4 property -a -n mcp.toolset.files.tools -v query_files -g developers

Permitir consulta e modificação para líderes:

p4 property -a -n mcp.toolset.reviews.tools -v query_reviews,modify_reviews -g leads

Substituições específicas por ferramenta podem restringir o acesso mesmo quando as escritas estão habilitadas:

p4 property -a -n mcp.toolsets.write -v true
p4 property -a -n mcp.toolset.files.tools -v query_files -g developers
# Result: modify_files is BLOCKED — tool list restricts

Nota: Substituições específicas por ferramenta não podem contornar restrições de escrita. O servidor verifica as permissões de escrita antes de avaliar as listas de ferramentas. Se write=false estiver definido em qualquer nível, as ferramentas de escrita são bloqueadas independentemente da lista de ferramentas.

Resolução de conflitos entre múltiplos grupos

Quando um usuário pertence a múltiplos grupos com configurações conflitantes, o P4 resolve cada propriedade para um único valor. O servidor MCP não executa sua própria lógica de múltiplos grupos — ele usa o valor que o P4 retorna.

Regras de resolução do P4 para um determinado nome de propriedade:

  1. Maior -s (número de sequência) vence. Esta é a chave de ordenação primária.
  2. No mesmo número de sequência: escopo de usuário > escopo de grupo > escopo global.
  3. Entre grupos na mesma sequência: o nome do grupo em ordem alfabética primeiro vence.

O P4 não compara valores. Ele escolhe a entrada vencedora pela posição, não pelo conteúdo.

Exemplo — grupos na mesma sequência (padrão):

p4 property -a -n mcp.toolset.files.enabled -v true -g developers
p4 property -a -n mcp.toolset.files.enabled -v false -g leads
# User in both groups → resolved value is "true"
# Reason: "developers" < "leads" alphabetically, so developers wins

Trocar os valores daria false — developers ainda vence independentemente do valor.

Exemplo — apenas um grupo tem uma configuração:

p4 property -a -n mcp.toolset.files.enabled -v false -g leads
# developers has no setting
# User in developers + leads → resolved value is "false"
# Reason: leads is the only group with a value, so it wins

Exemplo — acesso de escrita:

p4 property -a -n mcp.toolset.files.write -v false -g developers
p4 property -a -n mcp.toolset.files.write -v true -g leads
# User in both groups → resolved value is "false"
# Reason: "developers" < "leads" alphabetically, not because false is "more restrictive"

Exemplo — listas de ferramentas (sem união):

p4 property -a -n mcp.toolset.reviews.tools -v query_reviews -g developers
p4 property -a -n mcp.toolset.reviews.tools -v query_reviews,modify_reviews -g leads
# User in both groups → resolved value is "query_reviews"
# Reason: "developers" wins alphabetically. P4 returns one value, not a union.

Exemplo — usando -s para controlar qual grupo vence:

p4 property -a -n mcp.enabled -v false -s1 -g noaccessgroup
p4 property -a -n mcp.enabled -v true  -s2 -g accessgroup
# accessgroup wins because -s2 > -s1 (highest sequence wins)

Dica: Para obter resultados previsíveis com múltiplos grupos, sempre use valores explícitos de -s em vez de depender da ordenação alfabética dos nomes de grupo.

Desabilitando um toolset específico globalmente

Desabilite um único toolset para todos os usuários sem afetar os demais:

p4 property -a -n mcp.toolset.reviews.enabled -v false

Isso bloqueia tanto query_reviews quanto modify_reviews para todos os usuários. Outros toolsets permanecem inalterados.

Somente leitura de emergência para um grupo específico

Restrinja um grupo específico a somente leitura sem afetar outros grupos:

p4 property -a -n mcp.toolsets.write -v false -g problematic_group

Usuários em outros grupos mantêm acesso total de escrita. Se um usuário pertencer tanto ao grupo restrito quanto a um grupo não restrito, a resolução de propriedades do P4 determina o resultado — tipicamente o nome do grupo em ordem alfabética primeiro vence em números de sequência iguais. Use valores explícitos de -s para resultados previsíveis.


Como as propriedades são resolvidas

O servidor MCP verifica as propriedades nesta ordem. Cada propriedade é resolvida independentemente pelo P4 usando as regras padrão de resolução (maior -s vence, depois usuário > grupo > global em sequência igual, depois nome do grupo em ordem alfabética primeiro).

Ordem de verificaçãoPropriedadeComportamento do servidor MCP
1mcp.enabledSe o valor resolvido for false, bloqueia todo o acesso
2mcp.toolsets.writeSe o valor resolvido for false e a ferramenta for uma operação de escrita, bloqueia
3mcp.toolsets.allowedSe definido, apenas os toolsets listados estão disponíveis
4mcp.toolset.<name>.enabledSe o valor resolvido for false, bloqueia o toolset
5mcp.toolset.<name>.writeSe o valor resolvido for false e a ferramenta for uma operação de escrita, bloqueia
6mcp.toolset.<name>.toolsSe definido, apenas as ferramentas listadas dentro do toolset estão disponíveis


Notas importantes

  • Cada propriedade é resolvida para um único valor pelo P4 antes que o servidor MCP a veja. O P4 usa: maior número de sequência (-s) primeiro, depois escopo (usuário > grupo > global) como desempate, depois nome do grupo em ordem alfabética. O servidor MCP não executa sua própria resolução de múltiplos grupos ou múltiplos escopos.

  • mcp.enabled atua como o interruptor principal. Quando seu valor resolvido é false, todo o acesso é bloqueado.

  • No mesmo número de sequência, uma propriedade de grupo ou usuário sobrescreve uma propriedade global. Para garantir que um false global não possa ser sobrescrito, atribua a ele um valor alto de -s.

  • A hierarquia de escopo (usuário > grupo > global) só se aplica como desempate em números de sequência iguais. Uma propriedade de grupo em -s5 vencerá uma propriedade de usuário em sequência padrão ou -s1.

  • Quando um usuário pertence a múltiplos grupos, o nome do grupo em ordem alfabética primeiro vence (em -s igual). O valor vencedor é usado como está — o P4 não compara true vs false nem escolhe o valor "mais restritivo". Use valores explícitos de -s para controlar qual grupo tem prioridade.

  • Substituições específicas por ferramenta (mcp.toolset.<name>.tools) podem restringir ainda mais o acesso, mas não podem contornar restrições de escrita. As verificações de escrita são avaliadas antes das listas de ferramentas.

  • As alterações de propriedade entram em vigor dentro de 60 segundos devido ao cache do lado do servidor, ou imediatamente em uma nova conexão do servidor MCP.

  • Apenas o valor false (sem diferenciar maiúsculas de minúsculas) desabilita ou bloqueia o acesso. Qualquer outro valor (incluindo true, 1, yes ou strings inválidas) é tratado como não bloqueante.

Ferramentas disponíveis

Ferramentas de consulta (operações de leitura)

query_server - Obter informações do servidor e detalhes do usuário atual
  • Ações:
    • server_info - Obter versão do P4, tempo de atividade e configuração
    • current_user - Obter informações do usuário atual e permissões
  • Casos de uso - Diagnóstico do servidor, verificação de usuário, teste de conexão
query_workspaces - Informações e gerenciamento de workspaces
  • Ações:
    • list - Listar todos os workspaces (opcionalmente filtrados por usuário)
    • get - Obter uma especificação detalhada do workspace
    • type - Verificar tipo e configuração do workspace
    • status - Verificar status de sincronização do workspace
  • Parâmetros: workspace_name, user, max_results
  • Casos de uso: Descoberta de workspaces, revisão de configuração, verificação de status
query_changelists - Acessar informações e histórico de changelists
  • Ações:
    • get - Obter informações detalhadas do changelist (arquivos, descrição, jobs)
    • list - Listar changelists com filtros (status, usuário, workspace)
  • Parâmetros: changelist_id, status (pendente/enviado), workspace_name, max_results
  • Casos de uso: Revisão de código, rastreamento de histórico, análise de changelists
query_files - Operações e informações de arquivos
  • Ações:
    • content - Obter conteúdo do arquivo em uma revisão específica
    • history - Obter histórico de revisões do arquivo e registros de integração
    • info - Obter detalhes básicos do arquivo (tipo, tamanho, permissões)
    • metadata - Obter metadados do arquivo (atributos, tamanho do arquivo, etc.)
    • diff - Comparar versões de arquivo (depot-para-depot ou misto)
    • annotations - Obter anotações do arquivo com informações de blame
    • search - Pesquisar arquivos por padrão de nome (correspondência com curingas)
    • grep - Pesquisar arquivos por padrão de conteúdo (pesquisa de texto)
  • Parâmetros: file_path, file2 (para diff), pattern (para pesquisa/grep), case_insensitive (para grep), max_results, diff2 (booleano), ranges (para conteúdo)
    • ranges - Lista opcional de pares de linhas [start, end], baseada em 1 e inclusiva (ex.: [[10, 20], [50, 60]]). Aplica-se apenas à ação content. Quando definido, a resposta retorna um array chunks com uma entrada por intervalo em vez do arquivo inteiro.
  • Casos de uso: Análise de código, comparação de arquivos, rastreamento de histórico, análise de blame, descoberta de arquivos, pesquisa de conteúdo, recuperação de intervalos específicos de linhas de arquivos grandes
query_shelves - Operações e inspeção de changelists shelved - **Ações**: - `list` - Listar alterações suspensas por usuário ou globalmente - `diff` - Mostrar diferenças em arquivos suspensos - `files` - Listar arquivos em um shelf específico - **Parâmetros**: `changelist_id`, `user`, `max_results` - **Casos de uso**: Revisão de código, acompanhamento de trabalho em andamento, colaboração
query_jobs - Rastreamento de jobs e gerenciamento de defeitos
  • Ações:
    • list_jobs - Listar jobs associados a um changelist
    • get_job - Obter informações detalhadas do job e status
  • Parâmetros: changelist_id, job_id, max_results
  • Casos de uso: Rastreamento de defeitos, rastreabilidade de requisitos, gerenciamento de projetos
query_reviews - Descoberta de revisões, detalhes e atividades
  • Ações:
    • list - Listar todas as revisões com filtragem opcional
    • dashboard - Obter o painel de revisões do usuário atual (minhas revisões, precisa de atenção)
    • get - Obter informações detalhadas da revisão
    • transitions - Obter transições de estado disponíveis para uma revisão
    • files_readby - Obter status de leitura de arquivos por usuários
    • files - Obter arquivos em uma revisão (com intervalo de versão opcional)
    • activity - Obter histórico de atividades da revisão
    • comments - Obter comentários em uma revisão
  • Parâmetros:
    • review_id - ID da revisão (obrigatório para get, transitions, files_readby, files, comments, activity)
    • review_fields - Campos separados por vírgula para retornar (ex.: "id,description,author,state")
    • comments_fields - Campos para comentários (padrão: "id,body,user,time")
    • up_voters - Lista de votantes positivos para transições
    • from_version, to_version - Intervalo de versão para a ação de arquivos
    • max_results - Máximo de resultados (padrão: 10)
  • Casos de uso: Descoberta de revisão de código, acompanhamento de status de revisão, recuperação de comentários, monitoramento de atividades de revisão
query_streams - Hierarquia de streams, status de integração e validação de workspace
  • Ações:
    • list - Listar streams com filtros opcionais (padrão de caminho, proprietário, tipo)
    • get - Obter uma especificação detalhada do stream
    • children - Obter streams filhos de um determinado stream
    • parent - Obter o stream pai
    • graph - Obter o grafo completo do stream (pai + filhos)
    • integration_status - Obter status de integração entre stream e pai (p4 istat)
    • get_workspace - Obter uma especificação de workspace vinculada a um stream
    • list_workspaces - Listar workspaces vinculados a um stream
    • validate_file - Validar caminhos de arquivo contra a view de um stream
    • validate_submit - Validar arquivos abertos para submit em um workspace de stream
    • check_resolve - Verificar conflitos pendentes de especificação de stream
    • interchanges - Listar changelists aguardando integração entre streams
  • Parâmetros:
    • stream_name - Caminho do depot do stream (obrigatório para get, children, parent, graph, check_resolve, interchanges)
    • stream_path - Padrão(ns) de caminho para list (ex.: ["//depot/..."])
    • filter - Expressão de filtro para list (ex.: "Owner=alice&Type=development")
    • fields - Campos para retornar em list (ex.: ["Stream", "Owner", "Type"])
    • workspace - Nome do workspace para get_workspace, validate_file, validate_submit
    • file_paths - Caminhos de arquivo para validate_file
    • view_without_edit - Visualizar especificação de stream bloqueada sem abrir para edição
    • at_change - Recuperar especificação histórica de stream em um número de changelist
    • both_directions - Mostrar status de integração em ambas as direções
    • force_refresh - Forçar atualização do cache istat
    • reverse, long_output, limit - Opções para interchanges
    • unloaded, all_streams, viewmatch - Filtros para list
    • max_results - Máximo de resultados
  • Casos de uso: Exploração de hierarquia de streams, acompanhamento de status de integração, validação de workspace, verificações de compatibilidade de view
query_p4dam_assets - Pesquisar ativos P4 DAM por palavra-chave ou filtros
  • Parâmetros: search_term, project_ids, repository_ids, path, tag, file_extension, user, all_revisions, max_results, offset
  • Casos de uso: Descoberta de ativos, filtragem por projeto/repositório/tag/extensão, navegação no conteúdo P4 DAM. Use quando você ainda não tiver um caminho de depot.
query_p4dam_asset - Buscar metadados completos de um único ativo P4 DAM
  • Parâmetros: depot_path (obrigatório), identifier, project_id, repository_id, include
  • Casos de uso: Buscar informações de commit, bundles de ativos, weblinks, atributos personalizados e correspondências de projeto/repositório para um ativo conhecido. Use após query_p4dam_assets para obter detalhes completos de um arquivo específico.
query_p4dam_projects - Listar projetos P4 DAM
  • Parâmetros: search_term, limit, offset
  • Casos de uso: Descobrir projetos disponíveis antes de criar um bundle de ativos ou revisão de arquivo, resolver IDs de projeto para outras chamadas.
query_p4dam_repositories - Listar repositórios em um projeto P4 DAM
  • Parâmetros: project_id (obrigatório), search_term, limit, offset
  • Casos de uso: Encontrar o tipo de repositório (helix_stream ou helix_classic) e linked_streams — necessário para fornecer stream_path ou descobrir branches ao criar bundles de ativos ou revisões de arquivo.
query_p4dam_helix_classic_branches - Listar branches Helix Classic em um repositório
  • Parâmetros: project_id (obrigatório), repository_id (obrigatório), limit, offset
  • Casos de uso: Encontrar o ID do branch necessário ao criar um bundle de ativos ou revisão de arquivo em um repositório Helix Classic.
fetch_p4dam_media - Buscar e renderizar uma URL de mídia P4 DAM como imagem
  • Parâmetros: url (obrigatório — thumbnail_url, preview_url, sprite_url ou file_url dos resultados de ativos)
  • Casos de uso: Renderizar miniaturas, pré-visualizações e folhas de sprites para ativos de imagem diretamente no cliente. Para arquivos que não são imagem, retorna o tipo MIME e o tamanho em vez do conteúdo da imagem. Passe URLs dos resultados de query_p4dam_assets ou query_p4dam_asset — apenas thumbnail_url, preview_url e sprite_url estão presentes para arquivos de imagem.
query_p4dam_file_reviews - Listar revisões de arquivo (ativo) para um projeto
  • Parâmetros: project_id (obrigatório), depot_path, include, limit, offset
  • Casos de uso: Navegar por revisões ativas em um projeto, filtrar por caminho de depot, descobrir UUIDs de revisão para consultas de detalhes.
query_p4dam_file_review - Buscar uma única revisão de arquivo por UUID
  • Parâmetros: project_id (obrigatório), review_id (obrigatório)
  • Casos de uso: Recuperar detalhes completos da revisão — estado, view_paths, asset_bundle, criador e download_url para revisões de bundle.
query_p4dam_workflows - Listar workflows P4 DAM
  • Parâmetros: include, limit, offset
  • Casos de uso: Descobrir workflows disponíveis e seus estados. Passe include=['states'] para obter todos os estados em uma única chamada — use o estado short_name como o parâmetro state em operações de revisão de arquivo.
query_p4dam_workflow - Buscar um único workflow por nome curto ou UUID
  • Parâmetros: workflow_id (obrigatório), include
  • Casos de uso: Inspecionar os estados de um workflow (kind: open/review/done, color, position) e regras de transição.
query_p4dam_workflow_states - Listar estados de um workflow
  • Parâmetros: workflow_id (obrigatório), limit, offset
  • Casos de uso: Listar todos os estados com short_name, kind, color e position. O short_name é o valor a ser passado como state ao criar ou atualizar uma revisão de arquivo.
query_p4dam_custom_attribute_templates - Listar modelos de atributos personalizados para um projeto
  • Parâmetros: project_id (obrigatório)
  • Casos de uso: Descobrir atributos personalizados disponíveis antes de definir valores — retorna o UUID, nome, tipo (text, single-select, multi-select, checkbox) e available_values de cada modelo para tipos select. Passe o UUID para update_p4dam_asset_custom_attributes.

Ferramentas de modificação (operações de escrita)

modify_workspaces - Criação e gerenciamento de workspaces
  • Ações - create, update, delete, switch
  • Parâmetros - name, specs (objeto WorkspaceSpec com View, Root, Options, etc.)
  • Requisitos - Modo somente leitura desativado, permissões apropriadas
  • Casos de uso - Configuração de ambiente, manutenção de workspace, troca de branch
modify_changelists - Gerenciamento do ciclo de vida de changelists
  • Ações - create, update, submit, delete, move_files
  • Parâmetros - changelist_id, description, file_paths
  • Segurança - Verificações de propriedade, prompt interativo de PROCEED/CANCEL para operações de exclusão com detalhes dos itens
  • Casos de uso - Submissão de código, organização de trabalho, agrupamento de arquivos
modify_files - Operações de sistema de arquivos e controle de versão - **Ações** - `add`, `edit`, `delete`, `move`, `revert`, `reconcile`, `resolve`, `sync` - **Parâmetros** - `file_paths`, `changelist`, `force`, `mode` (para operações de resolução) - **Modos de resolução** - `auto`, `safe`, `force`, `preview`, `theirs`, `yours` - **Casos de uso** - Edição de arquivos, resolução de conflitos, sincronização de workspace
modify_shelves - Operações de shelving para trabalho em andamento
  • Ações - shelve, unshelve, update, delete, unshelve_to_changelist
  • Parâmetros - changelist_id, file_paths, target_changelist, force
  • Casos de uso - Armazenamento temporário, compartilhamento de código, backup antes de experimentos
modify_jobs - Integração de jobs e changelists
  • Ações - link_job, unlink_job
  • Parâmetros - changelist_id, job_id
  • Casos de uso - Integração com rastreamento de defeitos, vinculação de requisitos
modify_reviews - Criação de reviews, transições, participantes e comentários
  • Ações:
    • create - Criar um novo review a partir de um changelist
    • refresh_projects - Atualizar associações de projeto
    • vote - Votar em um review (positivo, negativo, limpar)
    • transition - Alterar o estado do review (needsRevision, needsReview, approved, committed, rejected, archived)
    • append_participants - Adicionar revisores/grupos a um review
    • replace_participants - Substituir todos os participantes
    • delete_participants - Remover participantes de um review
    • add_comment - Adicionar um comentário a um review
    • reply_comment - Responder a um comentário existente
    • edit_comment - Editar o corpo e/ou o estado da tarefa de um comentário existente
    • append_change - Adicionar um changelist a um review existente
    • replace_with_change - Substituir o conteúdo do review por um changelist
    • join - Participar de um review como participante
    • leave - Sair de um review
    • archive_inactive - Arquivar reviews inativos
    • mark_comment_read / mark_comment_unread - Marcar o status de leitura de um comentário individual
    • mark_all_comments_read / mark_all_comments_unread - Marcar o status de leitura de todos os comentários
    • update_author - Alterar o autor do review
    • update_description - Atualizar a descrição do review
    • obliterate - Excluir permanentemente um review
  • Parâmetros:
    • review_id - ID do review (obrigatório para a maioria das ações)
    • change_id - ID do changelist (obrigatório para create, append_change, replace_with_change)
    • description - Descrição do review
    • reviewers, required_reviewers - Listas de nomes de usuário dos revisores
    • reviewer_groups - Grupos de revisores com requisitos
    • vote_value - Valor do voto: up, down, clear
    • version - Versão do review para votação
    • transition - Estado de destino: needsRevision, needsReview, approved, committed, approved:commit, rejected, archived
    • jobs, fix_status, cleanup - Opções de vinculação de jobs e limpeza para transições
    • users, groups - Dados estruturados de participantes para append/replace/delete
    • body - Texto do corpo do comentário
    • task_state - Estado da tarefa do comentário: open, comment, addressed, verified. add_comment aceita apenas open e comment; addressed e verified são alcançáveis por meio de edit_comment.
    • notify - Modo de notificação: immediate, delayed
    • comment_id - ID do comentário para respostas, edições ou marcação de lido/não lido
    • context - Contexto do comentário (arquivo, números de linha, conteúdo, versão)
    • not_updated_since, max_reviews - Filtros para archive_inactive
    • new_author, new_description - Valores para ações de atualização
  • Casos de uso: Fluxo de trabalho de revisão de código, gerenciamento de estado de review, comentários colaborativos, gerenciamento de participantes, limpeza de reviews
modify_streams - Ciclo de vida de streams, edição de spec, propagação e gerenciamento de workspace
  • Ações:
    • create - Criar um novo stream (mainline, development, release, task, virtual, etc.)
    • update - Atualizar propriedades do stream (nome, descrição, opções, paths, parent_view)
    • delete - Excluir um stream
    • edit_spec - Abrir o spec do stream para edição (p4 stream edit)
    • resolve_spec - Resolver conflitos de spec do stream
    • revert_spec - Reverter edições do spec do stream
    • shelve_spec - Fazer shelve das edições do spec do stream em um changelist numerado
    • unshelve_spec - Fazer unshelve das edições do spec do stream
    • copy - Copiar alterações entre streams pai e filho
    • merge - Mesclar alterações entre streams pai e filho
    • integrate - Integrar alterações com opções avançadas
    • populate - Popular um novo stream com arquivos (branch)
    • switch - Alternar um workspace para um stream diferente
    • create_workspace - Criar um novo workspace vinculado a um stream
  • Parâmetros:
    • stream_name - Caminho do depot do stream (obrigatório para create, update, delete, edit_spec, resolve_spec, revert_spec, switch)
    • stream_type - Tipo de stream para create: mainline, development, sparsedev, release, sparserel, task, virtual
    • parent - Stream pai para create em streams não-mainline
    • name, description - Nome de exibição e descrição do stream
    • options - Opções do stream: allsubmit/ownersubmit, unlocked/locked, toparent/notoparent, fromparent/nofromparent, mergedown/mergeany
    • parent_view - Tratamento da view do pai: inherit ou noinherit
    • paths, remapped, ignored - Mapeamentos da view do stream
    • changelist - Changelist para operações de edição de spec ou propagação
    • resolve_mode - Modo de resolução para resolve_spec: auto, accept_theirs, accept_yours
    • parent_stream - Substituir pai para propagação (flag -P)
    • branch - Spec de branch para integrate/populate (flag -b)
    • file_paths - Caminhos de arquivo para propagação
    • preview - Somente pré-visualização, sem alterações (flag -n)
    • force - Forçar operação (flag -f)
    • reverse - Inverter direção (flag -r)
    • max_files - Limitar arquivos processados (flag -m)
    • quiet - Suprimir mensagens informativas (flag -q)
    • output_base - Mostrar revisão base com resolução agendada (flag -Ob para merge/integrate) ou listar arquivos criados (flag -o para populate)
    • virtual - Copiar usando stream virtual (flag -v, somente copy)
    • schedule_branch_resolve - Agendar resolves de branch em vez de branching automático (flag -Rb, somente integrate)
    • integrate_around_deleted - Integrar ignorando revisões excluídas (flag -Di, somente integrate)
    • skip_cherry_picked - Pular revisões cherry-picked já integradas (flag -Rs, somente integrate)
    • source_path, target_path - Caminhos de origem e destino para populate
    • workspace - Nome do workspace para switch
    • workspace_name, root, host, alt_roots - Parâmetros de criação do workspace
  • Segurança: Validação de existência do stream, detecção de streams bloqueados, avisos de workspace vinculado, verificações de arquivos abertos para alterações que afetam a view
  • Casos de uso: Criação e gerenciamento de streams, propagação de branches (merge/copy/integrate), resolução de conflitos de spec, provisionamento de workspaces
create_p4dam_asset_bundle - Criar um pacote de assets P4 DAM
  • Parâmetros: depot_path (obrigatório, deve terminar com .p4bundle), project (obrigatório), repository (obrigatório), view_paths (obrigatório), stream_path, helix_classic_branch, description, hero_file_path
  • Casos de uso: Criar uma coleção nomeada e com escopo de arquivos do depot para revisão. Forneça stream_path para repositórios Helix Stream, helix_classic_branch para repositórios Helix Classic.
update_p4dam_asset_bundle - Atualizar um pacote de assets existente
  • Parâmetros: bundle_id (obrigatório), description, view_paths, hero_file_path
  • Casos de uso: Alterar a descrição de um pacote, ajustar seu escopo de arquivos (view_paths) ou atualizar a imagem de capa. depot_path é imutável após a criação.
delete_p4dam_asset_bundle - Excluir um pacote de assets P4 DAM
  • Parâmetros: bundle_id (obrigatório)
  • Casos de uso: Remover um pacote de assets que não é mais necessário. Irreversível.
sync_p4dam_asset_bundle - Sincronizar arquivos do pacote de assets para um workspace local
  • Parâmetros: view_paths (obrigatório), workspace_root (obrigatório), client_name, bundle_id, stream_path
  • Casos de uso: Baixar os arquivos com escopo de um pacote de assets via p4 sync. Cria ou reutiliza um cliente P4 nomeado — sincronizações subsequentes são incrementais. Use stream_path para repositórios Helix Stream (aplica LimitView, requer Perforce 2025.2+).
create_p4dam_file_review - Criar um review de assets P4 DAM
  • Parâmetros: project_id (obrigatório), name (obrigatório), depot_path (obrigatório), view_paths (obrigatório), state (obrigatório), repository, helix_classic_branch, asset_bundle, hero_file_path, description, position, base_commit_id, head_commit_id
  • Casos de uso: Abrir um review para um único asset ou um pacote de assets (.p4bundle). Para reviews de pacotes, asset_bundle é detectado automaticamente a partir de depot_path quando omitido.
update_p4dam_file_review - Atualizar um review de arquivos P4 DAM
  • Parâmetros: project_id (obrigatório), review_id (obrigatório), state, name, view_paths, hero_file_path, description, position
  • Casos de uso: Transicionar um review para um novo estado de fluxo de trabalho, atualizar seu nome ou descrição, ajustar o escopo da view. As transições de estado devem ser permitidas pelo fluxo de trabalho do projeto para o usuário atual.
delete_p4dam_file_review - Excluir um review de arquivos P4 DAM
  • Parâmetros: project_id (obrigatório), review_id (obrigatório)
  • Casos de uso: Remover um review que não é mais necessário. Irreversível. A API retorna o objeto do review excluído em caso de sucesso.
update_p4dam_asset_tags - Adiciona ou remove tags de ativos e tags automáticas
  • Parâmetros: paths (obrigatório — lista de {path, identifier?}), create, delete, delete_auto, propagatable, identifier
  • Casos de uso: Marcar um ou vários ativos em uma única chamada. Suporta arquivos individuais, revisões específicas e caminhos de pasta recursivos (//depot/folder/...). create adiciona tags de usuário, delete remove tags de usuário, delete_auto remove tags geradas automaticamente. Defina propagatable=true para aplicar tags à revisão mais recente e a todas as revisões futuras.
create_p4dam_comment - Publica um comentário em uma revisão de arquivo ou arquivo, ou responde a um comentário
  • Parâmetros: type (obrigatório), content (obrigatório), project, repository, file_review, commit, path, stream_path, helix_classic_branch, comment
  • Casos de uso: Comentar em uma revisão de arquivo de pacote de ativos (file_review), um arquivo específico dentro de uma revisão (file_review_file), um arquivo ou pacote de ativos confirmado sem revisão (commit_file), ou responder a um comentário existente (comment). Os parâmetros obrigatórios dependem do tipo — consulte a descrição de type.
update_p4dam_asset_custom_attributes - Define ou remove valores de atributos personalizados para ativos
  • Parâmetros: paths (obrigatório — lista de {path, identifier?}), create (lista de {uuid, value}), delete (lista de UUIDs de atributos a remover), propagatable
  • Casos de uso: Definir ou limpar metadados personalizados em um ou mais ativos. Descubra os atributos disponíveis e seus UUIDs primeiro com query_p4dam_custom_attribute_templates. value é uma string para tipos text/single-select/checkbox e uma lista de strings para multi-select.
regenerate_p4dam_preview - Regenera uma imagem de pré-visualização de ativo
  • Parâmetros: depot_path (obrigatório), commit_id (obrigatório)
  • Casos de uso: Reacionar a geração de pré-visualização quando uma pré-visualização está ausente ou desatualizada. commit_id é o número do changeset dos resultados de query_p4dam_asset.

Avisos nas respostas das ferramentas

Quando um comando P4 produz uma mensagem informativa ou de aviso benigna (por exemplo, file(s) up-to-date ou file not on client), a ferramenta retorna um status de sucesso e inclui o texto da mensagem em uma lista opcional de nível superior warnings. O campo aparece somente quando há pelo menos um aviso. Falhas genuínas não são afetadas e ainda retornam um status de erro com os campos existentes code e error.

Registro de Logs e Dados de Uso

Sistema de registro de logs

Locais dos logs:

  • Log do aplicativo: logs/p4mcp.log - Operações e erros principais do servidor
  • Logs de sessão: logs/sessions/*.log - As atividades de sessões individuais são registradas somente quando o sinalizador --allow-usage é especificado nos argumentos de inicialização do servidor.

Dados de Uso

Abordagem de privacidade em primeiro lugar:

  • Desativado por padrão: Nenhuma coleta de dados sem consentimento explícito
  • Controlado por consentimento: Solicitação na primeira execução para permissão de telemetria
  • Transparente: Explicação clara dos dados coletados
  • Revogável: Opção fácil de desativar a qualquer momento

Dados coletados (se consentido):

  • Frequência de uso das ferramentas (anonimizada)
  • Taxas e tipos de erros (sem dados pessoais)
  • Métricas de desempenho
  • Estatísticas de adoção de recursos
  • Versão do servidor P4

Dados não coletados:

  • Conteúdo ou nomes de arquivos
  • Detalhes do servidor P4, exceto a versão
  • Credenciais de usuário ou informações pessoais
  • Informações específicas do projeto

Controle:

  • Os dados de uso são coletados somente se o argumento --allow-usage for fornecido na inicialização.

Solução de Problemas

Problemas de Inicialização do Servidor

Não foi possível iniciar o servidor

Sintomas: O sistema operacional não consegue encontrar ou executar o binário; o erro inclui ENOENT ou "No such file or directory".
Soluções:

  1. Verifique o caminho: Certifique-se de que o campo command usa o caminho absoluto correto para o seu sistema operacional:
    • macOS/Linux: /absolute/path/to/p4-mcp-server
    • Windows: C:\absolute\path\to\p4-mcp-server.exe
  2. Garanta que o binário existe e é executável:
    • macOS/Linux:
      ls -l /absolute/path/to/p4-mcp-server && chmod +x /absolute/path/to/p4-mcp-server
      
    • Windows:
      dir C:\absolute\path\to\p4-mcp-server.exe
      
  3. No Windows, garanta que o binário não está bloqueado:
    • Clique com o botão direito no arquivo .exe, selecione Propriedades e, se presente, clique em Desbloquear.

Problemas de Conexão

Falha ao conectar ao servidor; verifique $P4PORT

Sintomas: Não é possível conectar ao servidor P4
Soluções:

  1. Verifique a variável de ambiente P4PORT: echo $P4PORT (macOS) ou echo $env:P4PORT (Windows)
  2. Teste a conexão direta: p4 info
  3. Verifique a disponibilidade do servidor: ping perforce.example.com
  4. Verifique a porta e o protocolo (prefixo ssl: para conexões SSL).
Certificado SSL não confiável (conexão P4)

Sintomas: Erros de confiança SSL ao conectar ao servidor P4 Soluções:

  1. Confie no servidor: p4 trust -f -y
  2. Verifique o status de confiança: p4 trust -l
  3. Para problemas persistentes, verifique a configuração SSL.
Erros de certificado SSL para a API P4 Code Review (revisões)

Sintomas: Erros CERTIFICATE_VERIFY_FAILED ao usar ferramentas de revisão Soluções:

  1. Repositório de confiança do sistema: Por padrão, o servidor usa o repositório de confiança do sistema operacional via truststore. Certifique-se de que o CA corporativo esteja instalado no repositório de certificados do sistema operacional.
  2. Pacote de CA personalizado: Para usar um certificado CA personalizado, você deve primeiro definir P4MCP_TLS_CA_MODE=certifi (para desativar truststore) e, em seguida, fornecer o caminho do CA via --ca-bundle /path/to/ca.pem ou P4MCP_CA_BUNDLE. No modo system padrão, truststore substitui os pacotes de CA personalizados e eles são silenciosamente ignorados.
  3. Desativar verificação: Use --ssl-no-verify ou defina P4MCP_SSL_VERIFY=false (não recomendado para produção). Isso funciona em ambos os modos TLS.

Observação: Essas configurações SSL se aplicam somente quando a URL do Swarm usa HTTPS. Se o Swarm estiver configurado com uma URL http://, a verificação SSL não é executada e essas configurações não têm efeito.

Problemas de Autenticação

Usuário não conectado

Sintomas: Falhas de autenticação
Soluções:

  1. Conecte-se ao P4: p4 login -a
  2. Verifique o status de login: p4 login -s
  3. Verifique se o usuário existe: p4 users -m 1 your_username
  4. Para problemas persistentes, verifique a senha ou use autenticação baseada em ticket.
Senha inválida

Sintomas: Falhas de login
Soluções:

  1. Redefina a senha por meio de um administrador do P4.
  2. Use autenticação baseada em ticket: p4 login -a
  3. Verifique se o nome de usuário está correto: p4 info

Problemas de Workspace

Cliente desconhecido

Sintomas: Erros de workspace não encontrado
Soluções:

  1. Liste os workspaces disponíveis: p4 clients
  2. Verifique a variável de ambiente P4CLIENT.
  3. Crie um workspace se necessário: p4 client workspace_name
  4. Verifique a propriedade do workspace: p4 client -o workspace_name
Arquivo(s) não está(ão) na visão do cliente

Sintomas: Arquivos estão fora do mapeamento do workspace
Soluções:

  1. Verifique a visão do cliente: p4 client -o workspace_name
  2. Atualize o mapeamento do workspace para incluir os caminhos necessários.
  3. Use p4 where file_path para verificar o mapeamento.

Erros de Permissão

Operação não permitida

Sintomas: Permissões insuficientes para operações
Soluções:

  1. Verifique a propriedade do arquivo: p4 opened file_path
  2. Verifique as permissões do usuário: p4 protects file_path
  3. Garanta a associação adequada ao grupo.
  4. Para operações de administrador, verifique as permissões de administrador.
Arquivo aberto por outro usuário

Sintomas: Conflitos de bloqueio exclusivo
Soluções:

  1. Verifique quem tem o arquivo aberto: p4 opened file_path
  2. Entre em contato com o usuário para resolver conflitos.
  3. O administrador pode forçar operações, se necessário.

Problemas de Desempenho

Operações lentas

Sintomas: Tempos de resposta longos
Soluções:

  1. Use o parâmetro max_results para limitar o tamanho da consulta.
  2. Use caminhos de arquivo específicos em vez de curingas.
  3. Verifique a conectividade de rede com o P4.
  4. Monitore o desempenho do servidor.
Problemas de memória

Sintomas: Alto uso de memória
Soluções:

  1. Reduza max_results para consultas grandes.
  2. Processe arquivos em lotes.
  3. Reinicie o servidor MCP periodicamente para sessões de longa duração.

Execução de Ferramentas

Não foi possível executar ferramentas

Sintomas: Conflito com ferramentas MCP integradas ou outras
Soluções:

  1. Desative quaisquer ferramentas MCP integradas ou conflitantes em seu ambiente ou configuração.
  2. Garanta que as ferramentas do servidor MCP P4 estejam devidamente registradas e habilitadas.
  3. Reinicie o servidor MCP após aplicar alterações de configuração para carregar as ferramentas corretas.
Ferramentas corretas não selecionadas

Sintomas: Contexto inválido ou histórico de sessão desatualizado
Soluções:

  1. Forneça um contexto relacionado ao P4 ao escrever prompts.
  2. Inicie uma nova sessão se a sessão existente for antiga ou contiver histórico de prompts conflitantes.

Padrões Comuns de Erro

  1. Autenticação: Garanta login válido antes das operações MCP.
  2. Mapeamento do workspace: Verifique se as visões do cliente incluem os arquivos de destino.
  3. Permissões: Verifique as permissões do usuário e do arquivo para operações de escrita.
  4. Rede: Verifique a conectividade para servidores P4 remotos.

Obtendo Ajuda

  1. Verifique os logs: Sempre verifique logs/p4mcp.log primeiro.
  2. Teste o P4: Garanta que p4 info funcione antes de solucionar problemas do MCP.
  3. Relate problemas à comunidade: Relate problemas com trechos de log e detalhes do ambiente.

Suporte

O Perforce P4 MCP Server é um projeto apoiado pela comunidade e não é oficialmente suportado pela Perforce. Pull requests e problemas são responsabilidade do(s) moderador(es) do projeto; isso pode ser um indivíduo ou equipe qualificada com membros fora da organização Perforce. Todos os problemas devem ser relatados e gerenciados via GitHub (não pelo processo de suporte padrão da Perforce).

Contribuições

Aceitamos contribuições para o projeto P4 MCP Server.

Licença

Este projeto está licenciado sob a Licença MIT. Consulte LICENSE para obter detalhes.

Avisos de Terceiros

Este projeto inclui componentes de terceiros. Suas licenças e atribuições estão listadas em THIRD-PARTY-NOTICES.