plugins/mattermost-test-data/skills/mattermost-test-data/SKILL.md
Backfill realistic test data into a Mattermost server using the Mattermost MCP tools. Creates users, teams, channels, and natural conversations. Use when the user asks to populate a Mattermost instance, create test data, set up a demo environment, seed conversations, or backfill a Mattermost server. Also provides guidance on reading, searching, and interacting with Mattermost via MCP tools.
npx skillsauth add mattermost/mattermost-ai-marketplace mattermost-test-dataInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Populate a Mattermost server with realistic test data and interact with it using the connected Mattermost MCP tools.
| Tool | Purpose |
|------|---------|
| create_user | Create user accounts (username, email, password, names, nickname, optional profile_image) |
| create_team | Create teams (name, display_name, type O=open/I=invite, description, optional team_icon) |
| create_channel | Create channels (name, display_name, type O=public/P=private, team_id, purpose, header) |
| create_post | Post as the authenticated bot/admin user (channel_id, message, optional root_id for replies, optional attachments) |
| create_post_as_user | Post as a specific user via username/password login - critical for realistic multi-user conversations |
| add_user_to_team | Add a user to a team by user_id and team_id |
| add_user_to_channel | Add a user to a channel by user_id and channel_id |
| dm_self | Send a DM to yourself (the authenticated user) |
| Tool | Purpose |
|------|---------|
| get_channel_info | Look up channel by ID, display_name, or name. Optional team_id scope |
| get_channel_members | List members of a channel with pagination |
| get_team_info | Look up team by ID, display_name, or name |
| get_team_members | List members of a team with pagination |
| read_channel | Read recent posts from a channel (limit, since timestamp) |
| read_post | Read a specific post and its thread |
| search_posts | Search posts by query, optional team_id/channel_id scope |
| search_users | Search users by username, email, or name |
Follow this order to avoid missing dependencies:
Ask the user what kind of environment they want. If they don't specify, offer a default scenario. Key questions:
Merge user instructions with the defaults below. User instructions always take priority.
create_team:
name: url-friendly-name (lowercase, hyphens)
display_name: Human Readable Name
type: O (open) or I (invite-only)
description: Brief team description
Save the returned team_id for subsequent calls.
Create users with realistic, diverse profiles. For each user, define a persona that guides their communication style throughout all conversations.
Guidelines:
first.last format for usernames[email protected])Testpassword1! for all test users (simple, meets complexity requirements)Save each returned user_id.
Persona template (track internally, do not post):
Name: [Full Name]
Username: [first.last]
Role: [Job title]
Style: [Communication traits - e.g., concise and technical, friendly and verbose, asks lots of questions]
Expertise: [Domain strengths]
Call add_user_to_team for each user with the team_id from Step 2.
Create channels appropriate for the team theme. Always include:
For each channel, provide a meaningful purpose and header.
Save each returned channel_id.
Call add_user_to_channel for each user+channel combination. Not every user needs to be in every channel - match membership to roles.
This is the most important step. Use create_post_as_user to post as each user with their username and password.
Message variety:
Thread usage:
root_id to create threaded replies for detailed discussionsPersona consistency:
Natural flow:
For each channel, create 2-4 distinct conversation threads. Example patterns:
Problem-solving thread:
Coordination thread:
Knowledge-sharing thread:
Casual thread (for #random):
search_users: term="john" # Find users by name/email
get_team_info: team_display_name="Engineering" # Find team by name
get_channel_info: channel_display_name="General" # Find channel by name
read_channel: channel_id="...", limit=50 # Recent messages
read_channel: channel_id="...", since="2024-01-01T00:00:00Z" # Since timestamp
read_post: post_id="...", include_thread=true # Full thread
search_posts: query="deployment", team_id="..." # Search by keyword
get_team_members: team_id="...", limit=50, page=0
get_channel_members: channel_id="...", limit=50, page=0
name must be URL-friendly (lowercase, hyphens, no spaces). display_name is what users see.O for open, I for invite-only. Most test scenarios want O.O for public, P for private.root_id to the parent post's ID. The channel_id must match the parent post's channel.create_post_as_user, you need the password you set during user creation. Keep it consistent.For a fast demo with minimal data:
This produces a believable workspace in ~30 tool calls.
tools
Analyze a GitHub pull request for risk level and generate concrete QA recommendations. Accepts a PR URL or "owner/repo#number" reference. Uses `gh` CLI to fetch the diff and metadata, computes blast radius, scores six risk dimensions, and returns a structured JSON risk assessment. Use when the user invokes /qa-analysis:qa-analysis with a GitHub PR URL or reference, or asks for a PR risk assessment, QA recommendations, or "what should I test?" for a given pull request.
tools
Add an MCP (Model Context Protocol) server to a Mattermost plugin so the Agents plugin can call its tools. Use when implementing cross-plugin MCP, exposing AI tools from a Mattermost plugin to the Agents plugin, or wiring up the `pluginmcp` helper from mattermost-plugin-agents.
tools
Create a new Mattermost plugin from the starter template in the current directory. Use when creating a new plugin from scratch, scaffolding a Mattermost plugin, or bootstrapping a plugin project.
development
Orchestrates test-driven fixes for Mattermost security tickets (Jira/Atlassian) with a Staff Security Engineer mindset: failing secure-behavior tests first, then implementation, then security review and edge-case loops, then opening a non-draft PR that follows `.github/PULL_REQUEST_TEMPLATE.md` when present, with a vague public description (no exploit detail). Use when the user invokes /security-fix:security-fix with a mattermost.atlassian.net browse URL, MM-* security work, backend permission or authorization bugs, or asks for this security TDD workflow.