plugins/discord/skills/forum-thread-creation/SKILL.md
Create a new thread in a Discord forum channel by calling the Discord REST API. Use when the Discord `reply` MCP tool fails against a forum channel (type 15) because forum channels only accept thread creation, not plain messages. After creation, use `reply` with the returned thread id for follow-up messages.
npx skillsauth add nsheaps/ai-mktpl forum-thread-creationInstall 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.
Create threads in Discord forum channels using the REST API. The Discord MCP reply tool cannot create new forum threads -- it can only reply to existing messages. Use the API directly for thread creation.
reply tool returns errors when targeting a forum channel directlyPOST https://discord.com/api/v10/channels/{forum_channel_id}/threads
Authorization: Bot ${DISCORD_BOT_TOKEN}
Content-Type: application/json
The bot token is stored in ~/.claude/channels/discord/.env (or $DISCORD_STATE_DIR/.env if overridden). Source it before calling curl — it is not automatically in the agent's Bash environment.
{
"name": "Thread title",
"type": 11,
"auto_archive_duration": 10080,
"message": {
"content": "Initial message content"
}
}
| Field | Value | Notes |
| ----------------------- | ------- | ------------------------------------------------------------ |
| name | string | Thread title (max 100 chars) |
| type | 11 | Public thread (required for forum channels) |
| auto_archive_duration | 10080 | 7 days in minutes (max value) |
| message.content | string | The first message in the thread (required for forum threads) |
# Source the bot token from the Discord state directory
set -a; . "${DISCORD_STATE_DIR:-$HOME/.claude/channels/discord}/.env"; set +a
curl -X POST "https://discord.com/api/v10/channels/${FORUM_CHANNEL_ID}/threads" \
-H "Authorization: Bot ${DISCORD_BOT_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"name": "Thread Title Here",
"type": 11,
"auto_archive_duration": 10080,
"message": {
"content": "Initial message content here."
}
}'
The response includes the created thread object with id (the new thread's channel ID) which can then be used with the MCP reply tool for follow-up messages.
| Error | Cause | Fix |
| --------------------------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| 403 Forbidden | Bot lacks permissions | Grant Send Messages + Create Public Threads on the parent forum channel. Manage Threads is not required to create your own thread. |
| 400 Bad Request "Invalid channel type" | Target channel is not a forum | Forum channels have type 15. Verify with GET /channels/{id} |
| 400 Bad Request "Missing message content" | No message field in body | Forum threads require an initial message |
The Discord MCP reply tool works by sending a message to a channel. Forum channels (type 15) do not accept direct messages -- they only accept thread creation. This means:
reply tool with the thread's channel ID (returned in the creation response as id)tools
Manually reproduce what the github-app plugin's SessionStart hook does to make a GitHub App installation token usable in the current session — materialize the PEM, generate the token, isolate GH_CONFIG_DIR, write the runtime env file, and wire CLAUDE_ENV_FILE so every Bash call sees GH_TOKEN/GITHUB_TOKEN. Use when the hook did not run, the token is missing from the environment, or a shell/teammate needs the token wired up by hand. <example>GH_TOKEN isn't set even though github-app is configured</example> <example>the github-app SessionStart hook didn't run, set up the token manually</example> <example>wire the github app token into CLAUDE_ENV_FILE</example> <example>gh keeps falling back to the wrong account, isolate GH_CONFIG_DIR</example>
tools
Manually configure the GitHub App bot git identity the way the github-app plugin's SessionStart hook does — resolve the app slug and bot user ID, build the <slug>[bot] name and noreply email, set GIT_AUTHOR_*/GIT_COMMITTER_* env vars, and write an isolated GIT_CONFIG_GLOBAL with the gh auth git-credential helper. Use when commits are attributed to the wrong account, "Author identity unknown" appears, or git identity must be set up by hand. <example>my commits are showing up as the handler, not the bot</example> <example>git says Author identity unknown after the github-app hook ran</example> <example>configure the github app bot git identity manually</example> <example>set up the gh credential helper for git push</example>
tools
Manages spec files for requirements capture and validation
tools
# Bash Chaining Alternatives This skill teaches you how to work around the bash command chaining restriction enforced by this plugin. ## Why Chaining is Blocked The `bash-command-rejection` plugin blocks these operators: | Operator | Name | Why Blocked | | -------- | ---------- | ----------------------------------------------------------------------------------- | | `&&` | AND chain | Runs cmd2 only if cmd1 su