Skip to main content
Glama

buy-token

Purchase Pump.fun meme tokens on Solana by specifying the token address and SOL amount. Execute transactions with configurable slippage tolerance and account selection.

Instructions

Buy a Pump.fun token

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
tokenAddressYesThe token's mint address
buyAmountYesAmount to buy in SOL
accountNameNoName of the account to usedefault
slippageBasisPointsNoSlippage tolerance in basis points (1% = 100)

Implementation Reference

  • Core handler function that performs the token buy operation using PumpFunSDK, handles account management, balance checks, and transaction execution.
    export async function buyToken(
      tokenAddress: string,
      buyAmount: number,
      accountName: string = "default",
      slippageBasisPoints: number = 100
    ) {
      try {
        const { sdk, connection } = initializeSDK();
    
        const keysFolder = path.resolve(rootDir, ".keys");
    
        if (!fs.existsSync(keysFolder)) {
          try {
            fs.mkdirSync(keysFolder, { recursive: true });
          } catch (mkdirError: any) {
            console.error(`Error creating keys folder:`, mkdirError);
            return {
              success: false,
              error: `Error creating keys folder: ${
                mkdirError.message || JSON.stringify(mkdirError)
              }`,
            };
          }
        }
    
        const account = getOrCreateKeypair(keysFolder, accountName);
        console.log(`Using account: ${account.publicKey.toString()}`);
    
        const balance = await connection.getBalance(account.publicKey);
        console.log(`Account balance: ${balance / LAMPORTS_PER_SOL} SOL`);
    
        const requiredBalance =
          buyAmount * LAMPORTS_PER_SOL + 0.001 * LAMPORTS_PER_SOL;
        console.log(`Required balance: ${requiredBalance / LAMPORTS_PER_SOL} SOL`);
    
        if (balance < requiredBalance) {
          const errorMessage = `Insufficient SOL balance. Account ${account.publicKey.toString()} has ${
            balance / LAMPORTS_PER_SOL
          } SOL, but needs at least ${
            requiredBalance / LAMPORTS_PER_SOL
          } SOL. Please send SOL to this address and try again.`;
          console.error(errorMessage);
          return { success: false, error: errorMessage };
        }
    
        const mintPublicKey = new PublicKey(tokenAddress);
        console.log(`Token address: ${tokenAddress}`);
    
        const initialTokenBalance =
          (await getSPLBalance(connection, mintPublicKey, account.publicKey)) || 0;
        console.log(`Initial token balance: ${initialTokenBalance}`);
    
        console.log(`Buying ${buyAmount} SOL worth of tokens...`);
        const result = await sdk.buy(
          account,
          mintPublicKey,
          BigInt(buyAmount * LAMPORTS_PER_SOL),
          BigInt(slippageBasisPoints),
          DEFAULT_PRIORITY_FEES
        );
    
        if (!result.success) {
          console.error(`Failed to buy token:`, result.error);
          return {
            success: false,
            error: result.error
              ? typeof result.error === "object"
                ? JSON.stringify(result.error)
                : result.error
              : "Unknown error",
          };
        }
    
        console.log(`Transaction successful: ${result.signature}`);
        const newTokenBalance =
          (await getSPLBalance(connection, mintPublicKey, account.publicKey)) || 0;
        console.log(`New token balance: ${newTokenBalance}`);
    
        const tokensPurchased = newTokenBalance - initialTokenBalance;
        console.log(`Tokens purchased: ${tokensPurchased}`);
    
        return {
          success: true,
          tokenAddress,
          amountSpent: buyAmount,
          tokensPurchased,
          newBalance: newTokenBalance,
          signature: result.signature,
          pumpfunUrl: `https://pump.fun/${tokenAddress}`,
        };
      } catch (error: any) {
        console.error("Error buying token:", error);
        console.error("Error stack:", error.stack);
    
        let errorMessage = "Unknown error";
        if (error) {
          if (typeof error === "object") {
            if (error.message) {
              errorMessage = error.message;
            } else {
              try {
                errorMessage = JSON.stringify(error);
              } catch (e) {
                errorMessage = "Error object could not be stringified";
              }
            }
          } else {
            errorMessage = String(error);
          }
        }
    
        return { success: false, error: errorMessage };
      }
    }
  • Zod schema defining input parameters for the buy-token tool.
    {
      tokenAddress: z.string().describe("The token's mint address"),
      buyAmount: z.number().min(0.0001).describe("Amount to buy in SOL"),
      accountName: z
        .string()
        .default("default")
        .describe("Name of the account to use"),
      slippageBasisPoints: z
        .number()
        .default(100)
        .describe("Slippage tolerance in basis points (1% = 100)"),
    },
  • src/index.ts:152-193 (registration)
    MCP tool registration for 'buy-token', including description, input schema, and wrapper handler that delegates to buyToken function.
    server.tool(
      "buy-token",
      "Buy a Pump.fun token",
      {
        tokenAddress: z.string().describe("The token's mint address"),
        buyAmount: z.number().min(0.0001).describe("Amount to buy in SOL"),
        accountName: z
          .string()
          .default("default")
          .describe("Name of the account to use"),
        slippageBasisPoints: z
          .number()
          .default(100)
          .describe("Slippage tolerance in basis points (1% = 100)"),
      },
      async ({ tokenAddress, buyAmount, accountName, slippageBasisPoints }) => {
        try {
          console.error(`Buying token: ${tokenAddress}, amount: ${buyAmount} SOL`);
    
          const result = await buyToken(
            tokenAddress,
            buyAmount,
            accountName,
            slippageBasisPoints
          );
    
          const formattedResult = formatBuyResult(result);
    
          return createMcpResponse(formattedResult);
        } catch (error: any) {
          console.error("Error buying token:", error);
          return {
            content: [
              {
                type: "text" as const,
                text: `Error buying token: ${error?.message || "Unknown error"}`,
              },
            ],
          };
        }
      }
    );
  • Helper function to format the result of a buyToken operation into a human-readable string.
    export function formatBuyResult(
      result: ReturnType<typeof buyToken> extends Promise<infer T> ? T : never
    ) {
      if (!result.success) {
        return `Error buying token: ${result.error}`;
      }
    
      return [
        `Successfully bought token!`,
        `Token Address: ${result.tokenAddress}`,
        `Amount Spent: ${result.amountSpent} SOL`,
        `Tokens Purchased: ${result.tokensPurchased}`,
        `New Balance: ${result.newBalance}`,
        `Transaction Signature: ${result.signature}`,
        `Pump.fun URL: ${result.pumpfunUrl}`,
      ].join("\n");
    }

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/dexoryn/pumpfun-mcp-server'

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