Skip to main content
Glama

buddypress_add_group_member

Add a user to a BuddyPress group by specifying group ID, user ID, and optional role for community management.

Instructions

Add a member to a group

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
group_idYesGroup ID
user_idYesUser ID
roleNoMember role (member, mod, admin)

Implementation Reference

  • Executes the buddypress_add_group_member tool by sending a POST request to the BuddyPress API endpoint `/groups/{group_id}/members` with the provided user_id and optional role.
    else if (name === 'buddypress_add_group_member') {
      const { group_id, user_id, role } = args as any;
      result = await buddypressRequest(`/groups/${group_id}/members`, 'POST', { user_id, role });
    }
  • Defines the tool schema including name, description, and input schema for validating parameters: group_id (required), user_id (required), role (optional).
    {
      name: 'buddypress_add_group_member',
      description: 'Add a member to a group',
      inputSchema: {
        type: 'object',
        properties: {
          group_id: { type: 'number', description: 'Group ID', required: true },
          user_id: { type: 'number', description: 'User ID', required: true },
          role: { type: 'string', description: 'Member role (member, mod, admin)' },
        },
        required: ['group_id', 'user_id'],
      },
    },
  • src/index.ts:49-512 (registration)
    Registers the buddypress_add_group_member tool in the tools array and exposes it via the ListToolsRequestHandler.
    const tools: Tool[] = [
      // ============= ACTIVITY TOOLS =============
      {
        name: 'buddypress_list_activities',
        description: 'List activity stream items with optional filters',
        inputSchema: {
          type: 'object',
          properties: {
            page: { type: 'number', description: 'Page number (default: 1)' },
            per_page: { type: 'number', description: 'Items per page (default: 20)' },
            search: { type: 'string', description: 'Search term' },
            user_id: { type: 'number', description: 'Filter by user ID' },
            group_id: { type: 'number', description: 'Filter by group ID' },
            scope: { type: 'string', description: 'Activity scope (all, friends, groups, favorites, mentions)' },
            display_comments: { type: 'boolean', description: 'Include comments' },
          },
        },
      },
      {
        name: 'buddypress_get_activity',
        description: 'Get a single activity item by ID',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Activity ID', required: true },
          },
          required: ['id'],
        },
      },
      {
        name: 'buddypress_create_activity',
        description: 'Create a new activity item',
        inputSchema: {
          type: 'object',
          properties: {
            content: { type: 'string', description: 'Activity content', required: true },
            user_id: { type: 'number', description: 'User ID (default: current user)' },
            component: { type: 'string', description: 'Component (activity, groups, members, etc.)' },
            type: { type: 'string', description: 'Activity type (activity_update, activity_comment, etc.)' },
            primary_item_id: { type: 'number', description: 'Primary item ID (e.g., group ID)' },
            secondary_item_id: { type: 'number', description: 'Secondary item ID' },
          },
          required: ['content'],
        },
      },
      {
        name: 'buddypress_update_activity',
        description: 'Update an existing activity item',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Activity ID', required: true },
            content: { type: 'string', description: 'New activity content' },
          },
          required: ['id'],
        },
      },
      {
        name: 'buddypress_delete_activity',
        description: 'Delete an activity item',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Activity ID', required: true },
          },
          required: ['id'],
        },
      },
      {
        name: 'buddypress_favorite_activity',
        description: 'Favorite or unfavorite an activity item',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Activity ID', required: true },
          },
          required: ['id'],
        },
      },
    
      // ============= MEMBERS TOOLS =============
      {
        name: 'buddypress_list_members',
        description: 'List BuddyPress members with optional filters',
        inputSchema: {
          type: 'object',
          properties: {
            page: { type: 'number', description: 'Page number (default: 1)' },
            per_page: { type: 'number', description: 'Items per page (default: 20)' },
            search: { type: 'string', description: 'Search term' },
            user_ids: { type: 'string', description: 'Comma-separated user IDs' },
            member_type: { type: 'string', description: 'Member type' },
            exclude: { type: 'string', description: 'Comma-separated user IDs to exclude' },
          },
        },
      },
      {
        name: 'buddypress_get_member',
        description: 'Get a single member by ID',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'User ID', required: true },
          },
          required: ['id'],
        },
      },
      {
        name: 'buddypress_update_member',
        description: 'Update member profile information',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'User ID', required: true },
            name: { type: 'string', description: 'Display name' },
            description: { type: 'string', description: 'User biography' },
            member_type: { type: 'string', description: 'Member type' },
          },
          required: ['id'],
        },
      },
      {
        name: 'buddypress_delete_member',
        description: 'Delete a member',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'User ID', required: true },
            reassign: { type: 'number', description: 'User ID to reassign content to' },
          },
          required: ['id'],
        },
      },
    
      // ============= GROUPS TOOLS =============
      {
        name: 'buddypress_list_groups',
        description: 'List BuddyPress groups with optional filters',
        inputSchema: {
          type: 'object',
          properties: {
            page: { type: 'number', description: 'Page number (default: 1)' },
            per_page: { type: 'number', description: 'Items per page (default: 20)' },
            search: { type: 'string', description: 'Search term' },
            status: { type: 'string', description: 'Group status (public, private, hidden)' },
            user_id: { type: 'number', description: 'Filter groups by user membership' },
            group_type: { type: 'string', description: 'Group type' },
          },
        },
      },
      {
        name: 'buddypress_get_group',
        description: 'Get a single group by ID',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Group ID', required: true },
          },
          required: ['id'],
        },
      },
      {
        name: 'buddypress_create_group',
        description: 'Create a new group',
        inputSchema: {
          type: 'object',
          properties: {
            name: { type: 'string', description: 'Group name', required: true },
            description: { type: 'string', description: 'Group description' },
            status: { type: 'string', description: 'Group status (public, private, hidden)' },
            enable_forum: { type: 'boolean', description: 'Enable group forum' },
            creator_id: { type: 'number', description: 'Creator user ID (default: current user)' },
          },
          required: ['name'],
        },
      },
      {
        name: 'buddypress_update_group',
        description: 'Update an existing group',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Group ID', required: true },
            name: { type: 'string', description: 'Group name' },
            description: { type: 'string', description: 'Group description' },
            status: { type: 'string', description: 'Group status (public, private, hidden)' },
          },
          required: ['id'],
        },
      },
      {
        name: 'buddypress_delete_group',
        description: 'Delete a group',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Group ID', required: true },
          },
          required: ['id'],
        },
      },
    
      // ============= GROUP MEMBERSHIP TOOLS =============
      {
        name: 'buddypress_list_group_members',
        description: 'List members of a specific group',
        inputSchema: {
          type: 'object',
          properties: {
            group_id: { type: 'number', description: 'Group ID', required: true },
            page: { type: 'number', description: 'Page number (default: 1)' },
            per_page: { type: 'number', description: 'Items per page (default: 20)' },
            roles: { type: 'string', description: 'Filter by roles (admin, mod, member, banned)' },
          },
          required: ['group_id'],
        },
      },
      {
        name: 'buddypress_add_group_member',
        description: 'Add a member to a group',
        inputSchema: {
          type: 'object',
          properties: {
            group_id: { type: 'number', description: 'Group ID', required: true },
            user_id: { type: 'number', description: 'User ID', required: true },
            role: { type: 'string', description: 'Member role (member, mod, admin)' },
          },
          required: ['group_id', 'user_id'],
        },
      },
      {
        name: 'buddypress_remove_group_member',
        description: 'Remove a member from a group',
        inputSchema: {
          type: 'object',
          properties: {
            group_id: { type: 'number', description: 'Group ID', required: true },
            user_id: { type: 'number', description: 'User ID', required: true },
          },
          required: ['group_id', 'user_id'],
        },
      },
    
      // ============= XPROFILE TOOLS =============
      {
        name: 'buddypress_list_xprofile_groups',
        description: 'List XProfile field groups',
        inputSchema: {
          type: 'object',
          properties: {
            fetch_fields: { type: 'boolean', description: 'Include fields in response' },
          },
        },
      },
      {
        name: 'buddypress_get_xprofile_group',
        description: 'Get a single XProfile field group',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Field group ID', required: true },
            fetch_fields: { type: 'boolean', description: 'Include fields in response' },
          },
          required: ['id'],
        },
      },
      {
        name: 'buddypress_list_xprofile_fields',
        description: 'List XProfile fields',
        inputSchema: {
          type: 'object',
          properties: {
            profile_group_id: { type: 'number', description: 'Filter by field group ID' },
            fetch_field_data: { type: 'boolean', description: 'Include field data' },
          },
        },
      },
      {
        name: 'buddypress_get_xprofile_field',
        description: 'Get a single XProfile field',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Field ID', required: true },
            fetch_field_data: { type: 'boolean', description: 'Include field data' },
          },
          required: ['id'],
        },
      },
      {
        name: 'buddypress_get_xprofile_data',
        description: 'Get XProfile data for a specific user and field',
        inputSchema: {
          type: 'object',
          properties: {
            field_id: { type: 'number', description: 'Field ID', required: true },
            user_id: { type: 'number', description: 'User ID', required: true },
          },
          required: ['field_id', 'user_id'],
        },
      },
      {
        name: 'buddypress_update_xprofile_data',
        description: 'Update XProfile data for a specific user and field',
        inputSchema: {
          type: 'object',
          properties: {
            field_id: { type: 'number', description: 'Field ID', required: true },
            user_id: { type: 'number', description: 'User ID', required: true },
            value: { type: 'string', description: 'Field value', required: true },
          },
          required: ['field_id', 'user_id', 'value'],
        },
      },
    
      // ============= FRIENDS TOOLS =============
      {
        name: 'buddypress_list_friends',
        description: 'List friendships',
        inputSchema: {
          type: 'object',
          properties: {
            user_id: { type: 'number', description: 'User ID to get friends for' },
            is_confirmed: { type: 'boolean', description: 'Filter by confirmed status' },
            page: { type: 'number', description: 'Page number (default: 1)' },
            per_page: { type: 'number', description: 'Items per page (default: 20)' },
          },
        },
      },
      {
        name: 'buddypress_create_friendship',
        description: 'Create a friendship request',
        inputSchema: {
          type: 'object',
          properties: {
            initiator_id: { type: 'number', description: 'Initiator user ID', required: true },
            friend_id: { type: 'number', description: 'Friend user ID', required: true },
          },
          required: ['initiator_id', 'friend_id'],
        },
      },
      {
        name: 'buddypress_delete_friendship',
        description: 'Delete a friendship',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Friendship ID', required: true },
          },
          required: ['id'],
        },
      },
    
      // ============= MESSAGES TOOLS =============
      {
        name: 'buddypress_list_messages',
        description: 'List message threads',
        inputSchema: {
          type: 'object',
          properties: {
            user_id: { type: 'number', description: 'User ID to get messages for' },
            box: { type: 'string', description: 'Message box (inbox, sentbox, notices)' },
            type: { type: 'string', description: 'Message type (all, read, unread)' },
            page: { type: 'number', description: 'Page number (default: 1)' },
            per_page: { type: 'number', description: 'Items per page (default: 20)' },
          },
        },
      },
      {
        name: 'buddypress_get_message',
        description: 'Get a single message thread',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Thread ID', required: true },
          },
          required: ['id'],
        },
      },
      {
        name: 'buddypress_create_message',
        description: 'Create a new message',
        inputSchema: {
          type: 'object',
          properties: {
            sender_id: { type: 'number', description: 'Sender user ID (default: current user)' },
            recipients: { type: 'array', items: { type: 'number' }, description: 'Array of recipient user IDs', required: true },
            subject: { type: 'string', description: 'Message subject', required: true },
            message: { type: 'string', description: 'Message content', required: true },
          },
          required: ['recipients', 'subject', 'message'],
        },
      },
      {
        name: 'buddypress_delete_message',
        description: 'Delete a message thread',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Thread ID', required: true },
          },
          required: ['id'],
        },
      },
    
      // ============= NOTIFICATIONS TOOLS =============
      {
        name: 'buddypress_list_notifications',
        description: 'List notifications',
        inputSchema: {
          type: 'object',
          properties: {
            user_id: { type: 'number', description: 'User ID to get notifications for' },
            is_new: { type: 'boolean', description: 'Filter by unread status' },
            page: { type: 'number', description: 'Page number (default: 1)' },
            per_page: { type: 'number', description: 'Items per page (default: 20)' },
          },
        },
      },
      {
        name: 'buddypress_get_notification',
        description: 'Get a single notification',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Notification ID', required: true },
          },
          required: ['id'],
        },
      },
      {
        name: 'buddypress_update_notification',
        description: 'Update notification (mark as read/unread)',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Notification ID', required: true },
            is_new: { type: 'boolean', description: 'Mark as unread (true) or read (false)' },
          },
          required: ['id'],
        },
      },
      {
        name: 'buddypress_delete_notification',
        description: 'Delete a notification',
        inputSchema: {
          type: 'object',
          properties: {
            id: { type: 'number', description: 'Notification ID', required: true },
          },
          required: ['id'],
        },
      },
    
      // ============= COMPONENTS TOOL =============
      {
        name: 'buddypress_list_components',
        description: 'List active BuddyPress components',
        inputSchema: {
          type: 'object',
          properties: {},
        },
      },
    ];
  • Shared helper function that makes authenticated HTTP requests to the BuddyPress REST API, used by the tool handler.
    async function buddypressRequest(
      endpoint: string,
      method: string = 'GET',
      body?: any
    ): Promise<any> {
      const url = `${BUDDYPRESS_URL}/wp-json/buddypress/v2${endpoint}`;
      const auth = Buffer.from(`${BUDDYPRESS_USERNAME}:${BUDDYPRESS_PASSWORD}`).toString('base64');
    
      const options: any = {
        method,
        headers: {
          'Authorization': `Basic ${auth}`,
          'Content-Type': 'application/json',
        },
      };
    
      if (body && method !== 'GET') {
        options.body = JSON.stringify(body);
      }
    
      const response = await fetch(url, options);
    
      if (!response.ok) {
        const errorText = await response.text();
        throw new Error(`BuddyPress API Error (${response.status}): ${errorText}`);
      }
    
      return await response.json();
    }
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It states a write operation ('Add'), implying mutation, but lacks details on permissions, side effects (e.g., notifications), error conditions, or return values. For a mutation tool with zero annotation coverage, this is insufficient behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with zero wasted words. It's front-loaded with the core action and resource, making it easy to parse quickly, which is ideal for conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given this is a mutation tool with no annotations and no output schema, the description is incomplete. It doesn't cover behavioral aspects like permissions, error handling, or what happens on success (e.g., confirmation message). For a 3-parameter tool with significant contextual gaps, more detail is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with clear parameter descriptions (e.g., 'Group ID', 'User ID', 'Member role (member, mod, admin)'). The description adds no additional meaning beyond the schema, such as explaining role hierarchies or validation rules, so it meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Add a member') and target resource ('to a group'), which is specific and unambiguous. However, it doesn't differentiate from sibling tools like 'buddypress_remove_group_member' or 'buddypress_update_member', which would require explicit comparison for a score of 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., existing group/user), exclusions, or related tools like 'buddypress_remove_group_member' for removal or 'buddypress_update_member' for role changes, leaving the agent to infer usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/vapvarun/buddypress-mcp'

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