{"record":{"id":"b5425f0e07cb4e91","repo":"n8n-io/n8n","slug":"no-captured-fields-found-for-credentialskey-arg","errorCode":null,"errorMessage":"No captured fields found for credentialsKey \"${args.credentialsKey}\". Call browser_capture_secret first.","messagePattern":"No captured fields found for credentialsKey \"(.+?)\"\\. Call browser_capture_secret first\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/@n8n/mcp-browser/src/tools/credential.ts","lineNumber":137,"sourceCode":"\t\t\t.describe('Clear the session buffer for credentialsKey after success (default: true)'),\n\t})\n\t.describe('Assemble buffered secrets into an n8n credential');\n\nfunction browserCreateCredential(\n\t_connection: BrowserConnection,\n): ToolDefinition<typeof browserCreateCredentialSchema> {\n\treturn {\n\t\tname: 'browser_create_credential',\n\t\tdescription:\n\t\t\t'Assemble secrets captured with browser_capture_secret into a new n8n credential. Literal fields go in `data`; fields that must come from the buffer go in `resolveData` (leaf values are buffer field names). The buffer is cleared after success unless clear=false.',\n\t\tinputSchema: browserCreateCredentialSchema,\n\t\tasync execute(args, context: ToolContext) {\n\t\t\trequireSecretsBuffer(context);\n\t\t\trequireCreateCredential(context);\n\n\t\t\tconst captured = context.secretsBuffer.getFields(args.credentialsKey);\n\t\t\tif (!captured) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No captured fields found for credentialsKey \"${args.credentialsKey}\". Call browser_capture_secret first.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst resolvedSecrets = args.resolveData ? resolveSecrets(args.resolveData, captured) : {};\n\t\t\tconst mergedData = deepMerge(args.data ?? {}, resolvedSecrets);\n\n\t\t\tconst credential = await context.createCredential({\n\t\t\t\tname: args.name,\n\t\t\t\ttype: args.type,\n\t\t\t\tdata: mergedData,\n\t\t\t\tprojectId: args.projectId,\n\t\t\t} satisfies CreateCredentialPayload);\n\n\t\t\tif (args.clear !== false) {\n\t\t\t\tcontext.secretsBuffer.clear(args.credentialsKey);\n\t\t\t}\n","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/n8n-io/n8n/blob/5ac6606e81f67bb9534255570cd4e86fd8101eee/packages/@n8n/mcp-browser/src/tools/credential.ts#L119-L155","documentation":"Thrown by browser_create_credential when context.secretsBuffer.getFields(credentialsKey) returns falsy — no secrets were captured for the given key. The create-credential tool assembles buffered secrets into a credential; calling it before any browser_capture_secret for the same credentialsKey leaves the buffer empty.","triggerScenarios":"Invoking browser_create_credential for a credentialsKey that was never populated via browser_capture_secret, or whose buffer was already cleared by a prior create call (clear defaults to true).","commonSituations":"Agent calls create before capture. Two create calls for the same key — the second fails because the first cleared the buffer. credentialsKey typo or mismatch between capture and create. Buffer cleared by disconnect/reconnect.","solutions":["Call browser_capture_secret for every required field under the same credentialsKey before browser_create_credential.","Pass clear=false on the first create call if you need to issue a second create for the same buffer.","Verify the credentialsKey string matches exactly between capture and create calls."],"exampleFix":"// before — create without prior capture\nawait createCredential({ credentialsKey: 'gcp', type: 'googleApi', name: 'GCP' }); // throws\n\n// after — capture fields first\nawait captureSecret({ credentialsKey: 'gcp', field: 'clientId', ... });\nawait createCredential({ credentialsKey: 'gcp', type: 'googleApi', name: 'GCP' });","handlingStrategy":"validation","validationCode":"const captured = secretsBuffer.getFields(credentialsKey);\nif (!captured) { throw new Error('Capture required fields first'); }","typeGuard":"function hasCapturedFields(buf: SecretsBuffer, key: string): boolean {\n  return buf.getFields(key) !== undefined;\n}","tryCatchPattern":"try {\n  await createCredential({ credentialsKey, ... });\n} catch (e) {\n  if (/No captured fields/.test(e.message)) {\n    await captureSecret({ credentialsKey, field: 'x', ... });\n    await createCredential({ credentialsKey, ... });\n  } else throw e;\n}","preventionTips":["Always issue browser_capture_secret before browser_create_credential for the same key.","Pass clear=false if you need to create multiple credentials from one buffer.","Use identical credentialsKey strings across capture and create."],"tags":["credential","secrets-buffer","ordering","capture"],"backgroundTag":null,"analyzedSha":"5ac6606e81f67bb9534255570cd4e86fd8101eee","analyzedAt":"2026-08-12T05:26:35.080Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}