AI Agent based Playwright MCP using credentials

I’d like to ask for some help please. After hours of playing and google/chatbot/forums, I’ve coome here for help :blush:

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?

This is my simple workflow:

1 curtida

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();
1 curtida

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

Ei, isso ajuda em algo:

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


E aqui está a thread antiga:
http://community.n8n.io/t/no-access-to-env/20665/10

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.

Então assim:

const creds = await $getCredentials('MyWebsiteLogin');
return [{ json: { username: creds.username, password: creds.password } }];

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.