Skip to main content
Glama

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
NameRequiredDescriptionDefault
accessKeyArgsYes
accountIdYes
networkIdNomainnet

Implementation Reference

  • 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}`, }, ], }; }, );
  • 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()), }), }), ]), }), },
  • 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}`, }, ], }; },

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/nearai/near-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server