account_add_access_key
Add an access key to a NEAR account to grant full or function-specific contract access. Specify account ID, network, and key permissions for secure account management.
Instructions
Add an access key to an account. This can be used to grant full access to an account, or allow the specified account to have specific function call access to a contract.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| accessKeyArgs | Yes | ||
| accountId | Yes | ||
| networkId | No | mainnet |
Implementation Reference
- src/services.ts:1437-1550 (registration)Registration of the 'account_add_access_key' MCP tool, including name, description, input schema using Zod, and the handler function.'account_add_access_key', noLeadingWhitespace` Add an access key to an account. This can be used to grant full access to an account, or allow the specified account to have specific function call access to a contract.`, { accountId: z.string(), networkId: z.enum(['testnet', 'mainnet']).default('mainnet'), accessKeyArgs: z.object({ permission: z.union([ z.object({ type: z.literal('FullAccess'), publicKey: z.string().describe('The public key of the access key.'), }), z.object({ type: z.literal('FunctionCall'), publicKey: z.string().describe('The public key of the access key.'), FunctionCall: z.object({ contractId: z.string(), allowance: z .union([ z.number().describe('The amount of NEAR tokens (in NEAR)'), z.bigint().describe('The amount in yoctoNEAR'), ]) .default(NearToken.parse_yocto_near('1').as_near()) .describe('The allowance of the function call access key.'), methodNames: z.array(z.string()), }), }), ]), }), }, async (args, _) => { const connection = await connect({ networkId: args.networkId, keyStore: keystore, nodeUrl: getEndpointsByNetwork(args.networkId)[0]!, }); const accountResult: Result<Account, Error> = await getAccount( args.accountId, connection, ); if (!accountResult.ok) { return { content: [{ type: 'text', text: `Error: ${accountResult.error}` }], }; } const account = accountResult.value; const addAccessKeyResult: Result<FinalExecutionOutcome, Error> = await (async () => { try { switch (args.accessKeyArgs.permission.type) { case 'FullAccess': return { ok: true, value: await account.addKey( args.accessKeyArgs.permission.publicKey, ), }; case 'FunctionCall': const allowance = typeof args.accessKeyArgs.permission.FunctionCall .allowance === 'number' ? NearToken.parse_near( args.accessKeyArgs.permission.FunctionCall.allowance.toString(), ).as_yocto_near() : args.accessKeyArgs.permission.FunctionCall.allowance; return { ok: true, value: await account.addKey( args.accessKeyArgs.permission.publicKey, args.accessKeyArgs.permission.FunctionCall.contractId, args.accessKeyArgs.permission.FunctionCall.methodNames, allowance, ), }; } } catch (e) { return { ok: false, error: new Error(e as string) }; } })(); if (!addAccessKeyResult.ok) { return { content: [ { type: 'text', text: `Error: ${addAccessKeyResult.error}\n\nFailed to add access key to account ${args.accountId}`, }, ], }; } return { content: [ { type: 'text', text: `Add access key transaction result: ${stringify_bigint({ final_execution_status: addAccessKeyResult.value.final_execution_status, status: addAccessKeyResult.value.status, transaction_outcome: addAccessKeyResult.value.transaction_outcome, receipts_outcome: addAccessKeyResult.value.receipts_outcome, })}`, }, { type: 'text', text: `Access key added: ${args.accessKeyArgs.permission.publicKey}`, }, ], }; }, );
- src/services.ts:1442-1467 (schema)Zod schema defining the input parameters for the tool: accountId, networkId, and accessKeyArgs with permission (FullAccess or FunctionCall).accountId: z.string(), networkId: z.enum(['testnet', 'mainnet']).default('mainnet'), accessKeyArgs: z.object({ permission: z.union([ z.object({ type: z.literal('FullAccess'), publicKey: z.string().describe('The public key of the access key.'), }), z.object({ type: z.literal('FunctionCall'), publicKey: z.string().describe('The public key of the access key.'), FunctionCall: z.object({ contractId: z.string(), allowance: z .union([ z.number().describe('The amount of NEAR tokens (in NEAR)'), z.bigint().describe('The amount in yoctoNEAR'), ]) .default(NearToken.parse_yocto_near('1').as_near()) .describe('The allowance of the function call access key.'), methodNames: z.array(z.string()), }), }), ]), }), },
- src/services.ts:1468-1549 (handler)The handler function that connects to NEAR, retrieves the account, and calls account.addKey with appropriate parameters for FullAccess or FunctionCall permissions, returning transaction results.async (args, _) => { const connection = await connect({ networkId: args.networkId, keyStore: keystore, nodeUrl: getEndpointsByNetwork(args.networkId)[0]!, }); const accountResult: Result<Account, Error> = await getAccount( args.accountId, connection, ); if (!accountResult.ok) { return { content: [{ type: 'text', text: `Error: ${accountResult.error}` }], }; } const account = accountResult.value; const addAccessKeyResult: Result<FinalExecutionOutcome, Error> = await (async () => { try { switch (args.accessKeyArgs.permission.type) { case 'FullAccess': return { ok: true, value: await account.addKey( args.accessKeyArgs.permission.publicKey, ), }; case 'FunctionCall': const allowance = typeof args.accessKeyArgs.permission.FunctionCall .allowance === 'number' ? NearToken.parse_near( args.accessKeyArgs.permission.FunctionCall.allowance.toString(), ).as_yocto_near() : args.accessKeyArgs.permission.FunctionCall.allowance; return { ok: true, value: await account.addKey( args.accessKeyArgs.permission.publicKey, args.accessKeyArgs.permission.FunctionCall.contractId, args.accessKeyArgs.permission.FunctionCall.methodNames, allowance, ), }; } } catch (e) { return { ok: false, error: new Error(e as string) }; } })(); if (!addAccessKeyResult.ok) { return { content: [ { type: 'text', text: `Error: ${addAccessKeyResult.error}\n\nFailed to add access key to account ${args.accountId}`, }, ], }; } return { content: [ { type: 'text', text: `Add access key transaction result: ${stringify_bigint({ final_execution_status: addAccessKeyResult.value.final_execution_status, status: addAccessKeyResult.value.status, transaction_outcome: addAccessKeyResult.value.transaction_outcome, receipts_outcome: addAccessKeyResult.value.receipts_outcome, })}`, }, { type: 'text', text: `Access key added: ${args.accessKeyArgs.permission.publicKey}`, }, ], }; },