MCP server that converts between Markdown and Slack Block Kit JSON, validates Block Kit payloads, generates preview URLs, lints for near-limit content, and splits large payloads across multiple messages.
Strong tool definitions with comprehensive schemas and detailed descriptions. All 6 tools have explicit input/output schemas with type definitions and parameter descriptions. Tool names follow verb_noun pattern (convert_, validate_, preview_, lint_, split_, block_kit_to_). Descriptions are detailed (100-300+ chars) and explain WHAT, WHEN, and WHY. However, some parameter descriptions are overly technical/verbose, and error handling guidance is minimal. Output schemas are well-documented with structured fields. No security issues detected (no secrets in params). Composition is clean, each tool has a single responsibility.
Convert a Slack Block Kit payload back into Markdown — the inverse of convert_markdown_to_block_kit. Best-effort and lossy: Block Kit can express styling and interactive elements (buttons, accessories, colors) with no Markdown equivalent; such constructs are approximated and the choices reported in warnings. Accepts either a `blocks` array or a full chat.postMessage `payload`.
Convert markdown into Slack Block Kit JSON. Auto mode picks between a single Slack `markdown` block (Feb 2025, ≤12k chars, no images, no oversized tables) and full deterministic decomposition into rich_text / section / header / image / divider blocks. Mention sanitization is on by default (raw <!channel>/<!here>/<@U…> are entity-escaped). Pass mention_map for safe @handle resolution. Optional preview_url returns a Block Kit Builder link for visual QA.
Lint a Slack Block Kit payload for near-limit content, deprecated patterns, and accessibility gaps. Always advisory — never returns errors, only warnings — so it's safe to call on a payload that is technically valid but might benefit from adjustment. Configurable thresholds (default 90% of each Slack limit). Set surface to modal or home for the 100-block ceiling (default message: 50 blocks). Use validate_block_kit for hard correctness checks.
Generate a Block Kit Builder URL for the given blocks. The returned URL opens Slack's own visual builder with the payload pre-loaded — useful for one-click visual QA from an LLM workflow. No Slack credentials required; the URL is shareable across workspaces. Reports byte_size and a truncated flag for payloads that exceed the ~8KB practical browser limit.
Error handling lacks recovery guidance. Tools return validation violations and warnings but do not guide LLMs on corrective actions (e.g., 'Call split_blocks() if block count exceeds 50').
Parameter descriptions are overly technical and verbose (some >200 chars). Descriptions like 'the LLM-input normalizer's V6 asterisk balancer collapses mismatched pairs' assume deep domain knowledge. Simplify for LLM clarity.
No explicit enum constraints for string parameters. 'mode' accepts 'auto|rich_text|markdown_block|section_mrkdwn' but is typed as free-form string. Use JSON Schema enum to prevent hallucinated values.
Output field naming inconsistency: 'preview_byte_size' vs 'byte_size' in preview_block_kit. Standardize to 'byte_size' or 'preview_size_bytes' across tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2025-06-18+ | v2 |
Split a Block Kit payload into one or more Slack-API-compliant chunks. Enforces the 50-block per-message limit and the only_one_table_allowed rule (a TableBlock always opens a new chunk when the current chunk already contains a table). Returns the original blocks unchanged when they fit in one chunk.
Validate a Slack Block Kit payload against the documented Slack constraints (per-block char limits, count limits, XOR rules, unique block_ids, only_one_table_allowed, markdown_block 12k cap). Returns structured violations with JSON paths and fix hints. Strict mode additionally flags deprecated patterns. Accepts either a `blocks` array directly or a full chat.postMessage `payload`. Set surface to modal or home for the 100-block ceiling (default message: 50 blocks).
No pagination or result limits documented. If blocks array can be arbitrarily large, cap results and document the limit in tool descriptions.