I’d like to ask for some help please. After hours of playing and google/chatbot/forums, I’ve coome here for help
I have a working workflow using an AI agent with OpenAI/Gemini Chat model and a Playwright MCP Tool. I am hosting my own n8n and Playwright MCP servers.
I am using it for web crawling/automation and can type requests into the chat window and the AI/Playwright MCP server can crawl / scrape web pages successfully.
I can type “Login to www.domain.com with username:MrBlobby and password:dontshare and the AI uses this just fine to login to the website.
However, I dont want to pass the credentials to the AI Chat as this feels very insecure. I have been trying and failing to find a way to save n8n credentials that I can pass on more securely.
Does anyone have any tips or code I can use to make this happen please?
Hi. Anyone have any idea how I can achieve this please?
I have looked into the getcredentials method but it seems to not be available for me to use:
async function main() {
try {
// Replace 'genericCredentials' with your credential type and 'WebsiteLogin' with your credential name
const credentials = await $.getCredentials('stored-creds');
return [{ json: { email: credentials.email, password: credentials.password } }];
} catch (error) {
throw new Error(`Failed to fetch credentials: ${error.message}`);
}
}
return main();
Hey can you tell me how did you get the MCP working. I am trying but unable to call as playwright mcp needs proxy for http calling. Adding MCP only supporting http streamable
Eu executo n8n auto-hospedado sem Docker, ambiente de teste. Meu n8n NÃO tem a nova seção “variables” sofisticada.
Eu pego variáveis de ambiente na inicialização do n8n, via um arquivo bat. Eu inicio o n8n e mais algumas outras coisas.
O arquivo bat tem uma seção de código assim:
set ENV_FILE=C:\Users\YOURPATH.n8n.env
:: 1. LOAD .ENV
if not exist “%ENV_FILE%” (
echo ERROR: .env not found at %ENV_FILE%
pause & exit /b 1
)
echo Loading %ENV_FILE%…
for /f “usebackq eol=# delims=” %%L in (“%ENV_FILE%”) do (
set “%%L”
)
E eu tenho uma variável de ambiente definida: N8N_BLOCK_ENV_ACCESS_IN_NODE=false.
veja o vídeo - eu coloco a variável de ambiente em qualquer lugar que eu possa precisar em um fluxo, e a UI reclama** dizendo que não é acessível! Depois ela segue em frente e executa, resolve perfeitamente. Aqui eu demonstro uma mensagem do Slack sendo disparada para uma URL
Sua ideia de $.getCredentials estava na verdade certa, você estava bem perto.
Tire o ponto — é $getCredentials() e não $.getCredentials(), já fiz isso comigo mesmo, sou sincero. E é, você precisa criar uma Generic Credential no armazenamento de credenciais do n8n primeiro, o nome que você passa tem que corresponder exatamente.
Coloca isso em um nó Code antes do seu AI Agent, e então no system prompt é só referenciar:
When logging into domain.com use username: {{ $('Code').item.json.username }}
and password: {{ $('Code').item.json.password }}
As credenciais ficam criptografadas no n8n, nunca tocam no chat. Faz exatamente o que você queria.
E se você estiver em uma versão recente do n8n tem um jeito ainda mais fácil — Settings > Variables, adiciona lá e é só usar {{ $vars.SITE_USERNAME }} em qualquer lugar do workflow, sem precisar de nó de código nenhum.
A coisa de variável de ambiente mencionada acima funciona mas é um pouco chato honestamente.
Eu teria cuidado com a última etapa. Mesmo que o segredo seja armazenado no n8n, interpolar o nome de usuário/senha no prompt do agente ainda coloca o segredo no contexto do modelo.
Forma mais segura: uma pequena ferramenta de login é proprietária da credencial, realiza o login e retorna apenas status, domínio, rótulo da conta e estado da sessão. O agente recebe um recibo, não a senha.
A chave é resolver credenciais antes da camada de IA, não dentro dela. Adicione um nó Code antes do seu AI Agent que chame $getCredentials('your-cred-name') - isso funciona bem no contexto do nó Code mesmo que não esteja disponível em sub-workflows de ferramentas. Depois passe os valores resolvidos para o campo System Message do AI Agent usando uma expressão como {{ $('Code').item.json.username }}. O LLM recebe valores já resolvidos no contexto e nunca vê credenciais brutas passando pelo chat.
Se $getCredentials estiver bloqueado em sua configuração, um fallback confiável é armazenar credenciais como variáveis de ambiente do n8n e referenciá-las com {{ $env.MY_PASSWORD }} no prompt do sistema. A ferramenta Playwright MCP então as recebe como parte das instruções da tarefa sem expô-las ao histórico de conversa.