Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion plugins/docs-tools/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "docs-tools",
"version": "0.0.47",
"version": "0.0.48",
"description": "Documentation review, writing, and workflow tools for Red Hat AsciiDoc and Markdown documentation.",
"author": {
"name": "Red Hat Documentation Team",
Expand Down
31 changes: 31 additions & 0 deletions plugins/docs-tools/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,37 @@

Restart your terminal and Claude Code for changes to take effect.

### Optional: Slack MCP server

The Slack MCP server allows the requirements analyst and docs planner agents to search Slack conversations for additional context — SME decisions, design rationale, and technical details that may not be captured in JIRA tickets or PRs. This integration is optional; the workflow operates normally without it.

**Benefits:**

- Search Slack channels and DMs for discussions about a JIRA ticket or feature
- Read full thread conversations to recover decision rationale
- Access channel history for context during documentation research
- Identify SMEs who have been discussing a feature

**Prerequisites:** Python 3, Podman or Docker

**Setup:**

```bash
python3 <(curl -fsSL https://raw.githubusercontent.com/redhat-community-ai-tools/slack-mcp/main/scripts/setup-slack-mcp.py)
```
Comment on lines +54 to +56
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Read-only verification: find remote-script execution patterns and MCP setup references in markdown/shell files.
fd -e md -e sh -e bash | xargs rg -n --no-heading -e 'curl .*raw\.githubusercontent\.com' -e 'setup-slack-mcp\.py' -e 'mcp'

Repository: redhat-documentation/redhat-docs-agent-tools

Length of output: 1903


🌐 Web query:

redhat-community-ai-tools organization slack-mcp verified MCP server

💡 Result:

The redhat-community-ai-tools organization on GitHub develops and maintains the slack-mcp repository, which is a Model Context Protocol (MCP) server for interacting with Slack workspaces. It enables AI assistants to read messages, post content, manage channels, add reactions, and more via MCP-compatible clients. This is a community-developed MCP server hosted under the Red Hat Community AI Tools organization (https://github.com/redhat-community-ai-tools), with 56 public repositories focused on AI tools including multiple MCP servers like jira-mcp, ocm-mcp, and slack-mcp. The slack-mcp repo has 15 stars, is written in Python, supports stdio and SSE transports, and can be run via Podman/Docker with Slack XOXC/XOXD tokens. It appears in MCP server directories like mcpservers.org and awesome-mcp lists as a community server, not an "official" or vendor-verified one (official Slack MCP is at mcp.slack.com). No sources explicitly state it as "verified" in an official MCP registry sense, but it is actively maintained (last push April 2026) and listed alongside other reputable MCP implementations.

Citations:


🏁 Script executed:

#!/bin/bash
# Check if redhat-community-ai-tools is an official Red Hat org
# and verify slack-mcp repository details
cd /tmp && git clone --depth 1 https://github.com/redhat-community-ai-tools/slack-mcp.git 2>&1 | head -20
# If cloned, check for verification markers (official badges, org info, etc.)
if [ -d slack-mcp ]; then
  echo "=== Repository cloned successfully ==="
  head -50 slack-mcp/README.md | grep -i -E "(official|verified|red\s*hat|community)" || echo "No official verification markers found"
  test -f slack-mcp/SECURITY.md && echo "=== Found SECURITY.md ===" && head -20 slack-mcp/SECURITY.md
fi

Repository: redhat-documentation/redhat-docs-agent-tools

Length of output: 406


Avoid unpinned remote execution for MCP setup scripts.

Line 55 executes code fetched from the mutable main branch at runtime without pinning, checksums, or verification. While redhat-community-ai-tools is Red Hat-affiliated, slack-mcp is a community-developed (not officially verified) MCP server. Switch to a reproducible, verified installation method using pinned commits/tags and checksum verification.

Suggested hardening pattern
- python3 <(curl -fsSL https://raw.githubusercontent.com/redhat-community-ai-tools/slack-mcp/main/scripts/setup-slack-mcp.py)
+ curl -fsSLo /tmp/setup-slack-mcp.py \
+   https://raw.githubusercontent.com/redhat-community-ai-tools/slack-mcp/<PINNED_COMMIT>/scripts/setup-slack-mcp.py
+ echo "<EXPECTED_SHA256>  /tmp/setup-slack-mcp.py" | sha256sum -c -
+ python3 /tmp/setup-slack-mcp.py
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 54-54: Code block style
Expected: indented; Actual: fenced

(MD046, code-block-style)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/docs-tools/README.md` around lines 54 - 56, Replace the unpinned
remote-exec invocation of the setup script (the command calling
setup-slack-mcp.py) with a reproducible, verifiable install: reference a
specific commit SHA or tag for the GitHub URL, download the script to disk
first, fetch and verify a published checksum or GPG signature for that pinned
release, and only then execute the verified file; update the README example to
show the pinned URL and verification steps for setup-slack-mcp.py instead of
piping from the mutable main branch.


The setup script handles everything: Python venv, Playwright, token extraction, wrapper script, and Claude Code registration. You only need to log into Slack when the browser opens and provide a channel ID for server logs (use a self-DM or Slackbot DM).

After setup, restart Claude Code to activate the Slack MCP server.

To refresh tokens when they expire:

```bash
python3 ~/.local/share/slack-mcp/setup-slack-mcp.py --refresh-tokens
```

GitHub repo: [redhat-community-ai-tools/slack-mcp](https://github.com/redhat-community-ai-tools/slack-mcp)

## Customizing the docs workflow

The docs orchestrator (`/docs-orchestrator`) runs a YAML-defined step list. You can customize it per-repo without modifying the plugin.
Expand Down
4 changes: 4 additions & 0 deletions plugins/docs-tools/agents/docs-planner.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ If access to JIRA or Git is needed for supplemental research and fails, **STOP I
- Summarize each requirement into a dense factual summary (max 150 words per source)
- Focus on: user-facing changes, API/config changes, new or removed capabilities
- Flag ambiguous or incomplete requirements for follow-up
- **Slack supplemental lookup** (optional — skip if `mcp__slack__*` tools are not available):
- For each ambiguous or incomplete requirement, search Slack by ticket key or feature name: `mcp__slack__search_messages query: "PROJECT-123"`
- Follow threads with `mcp__slack__get_thread` to recover decision rationale
- Verify any Slack findings against the codebase or JIRA before incorporating — Slack is informal and may be outdated

3. **Assess documentation impact**:
- Grade each requirement using the impact assessment criteria below
Expand Down
56 changes: 55 additions & 1 deletion plugins/docs-tools/agents/requirements-analyst.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,61 @@ The `--graph` flag discovers custom field IDs, fetches the parent, children, sib
- Find configuration options and parameters
- Record file paths with line numbers (e.g., `src/feature.ts:45-67`)

### 1.5. Web search expansion
### 1.5. Slack research (optional)

If Slack MCP tools are available (`mcp__slack__*`), search Slack for additional context that may not be captured in JIRA tickets or PRs. Skip this section entirely if Slack MCP is not configured — it is not an error.

**Search strategy:**

Run these searches in order. Stop early if the first search already provides sufficient context.

1. **Search by ticket key** — searches all channels the user has access to:
```
mcp__slack__search_messages query: "PROJECT-123"
```

2. **Search by feature name** — use the feature name, component, or key technical terms from the ticket:
```
mcp__slack__search_messages query: "PKCE OAuth flow"
```

3. **Follow threads** — when a search result references a conversation worth reading in full, fetch the complete thread using the channel ID and timestamp from the result:
```
mcp__slack__get_thread channel_id: "C0A2WFPBR29" thread_ts: "1776943948.748319"
```

4. **Identify channels by name** (optional) — if you know a likely channel name:
```
mcp__slack__get_channel_id_by_name channel_name: "devspaces-docs"
```

**What to extract:**

| Signal | Example phrases | Action |
|--------|----------------|--------|
| Decision rationale | "we decided to...", "the reason is..." | Record as context for requirements |
| Technical details | API names, config flags, architecture notes | Cross-reference against codebase |
| Scope discussions | "out of scope", "deferred to next release" | Flag as scope boundary |
| SME identification | People actively discussing the feature | Add to "Who can provide information" |
| User pain points | "customers are hitting...", "support tickets about..." | Elevate requirement priority |

**Record Slack findings:**

Add relevant Slack context to the "Sources consulted" section using these formats:

- Channel thread: `Slack thread in #channel-name (YYYY-MM-DD): [Summary of relevant discussion]`
- Direct message: `Slack DM with @username (YYYY-MM-DD): [Summary of relevant discussion]`

**Example:**
```
### Slack discussions
- Slack thread in #team-devspaces (2026-04-20): SME confirmed backup/restore feature targets GA in 3.27. Decision to use CRDs instead of ConfigMap for state storage.
- Slack DM with @ibuziuk (2026-02-23): PM confirmed stakeholder list for JTBD meeting — UX, Marketing, TAM, and Support contacts identified.
Comment on lines +189 to +191
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Remove real-person identifier from the Slack example.

The example uses @ibuziuk, which violates the plugin-doc rule that forbids real people references in instructions/examples. Replace with a role-based placeholder.

Proposed fix
 ### Slack discussions
 - Slack thread in `#team-devspaces` (2026-04-20): SME confirmed backup/restore feature targets GA in 3.27. Decision to use CRDs instead of ConfigMap for state storage.
-- Slack DM with `@ibuziuk` (2026-02-23): PM confirmed stakeholder list for JTBD meeting — UX, Marketing, TAM, and Support contacts identified.
+- Slack DM with `@product-manager` (2026-02-23): PM confirmed stakeholder list for JTBD meeting — UX, Marketing, TAM, and Support contacts identified.

As per coding guidelines: plugins/*/{skills,commands,agents}/*.md: “Never allow references to real people by name in plugin commands, skill documentation, example prompts, instructions, or style references.”

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
### Slack discussions
- Slack thread in #team-devspaces (2026-04-20): SME confirmed backup/restore feature targets GA in 3.27. Decision to use CRDs instead of ConfigMap for state storage.
- Slack DM with @ibuziuk (2026-02-23): PM confirmed stakeholder list for JTBD meeting — UX, Marketing, TAM, and Support contacts identified.
### Slack discussions
- Slack thread in `#team-devspaces` (2026-04-20): SME confirmed backup/restore feature targets GA in 3.27. Decision to use CRDs instead of ConfigMap for state storage.
- Slack DM with `@product-manager` (2026-02-23): PM confirmed stakeholder list for JTBD meeting — UX, Marketing, TAM, and Support contacts identified.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@plugins/docs-tools/agents/requirements-analyst.md` around lines 189 - 191,
The Slack example under the "### Slack discussions" section contains a
real-person mention "@ibuziuk"; replace that with a role-based placeholder
(e.g., "@product-manager" or "@PM") so the example no longer references a real
individual, and ensure the line "- Slack DM with `@ibuziuk` (2026-02-23): PM
confirmed stakeholder list..." becomes "- Slack DM with `@product-manager`
(2026-02-23): PM confirmed stakeholder list..." (or similar role-based text) to
comply with the plugins/* documentation rule against real-person references.

```

**Reliability guardrail:** Slack conversations are informal and may contain outdated or speculative information. Before incorporating any technical claim into requirements, verify it against at least one authoritative source (codebase, JIRA ticket, or PR). If a Slack finding contradicts JIRA, trust JIRA.

### 1.6. Web search expansion

After gathering initial source materials, expand your research using web search to find additional context, upstream documentation, and industry best practices.

Expand Down
Loading