Skip to main content
Glama

LinkedIn Content Creation MCP Server

by chrishayuk
text_tokens.py4.81 kB
# src/chuk_mcp_linkedin/tokens/text_tokens.py """ Text formatting tokens for LinkedIn posts. Based on 2025 performance data analysis of 1M+ posts. """ from typing import Any, Dict, Tuple class TextTokens: """Design tokens for text formatting on LinkedIn""" # LinkedIn character limits MAX_LENGTH = 3000 TRUNCATION_POINT = 210 # "...see more" appears here # Ideal length ranges for different post types IDEAL_LENGTH: Dict[str, Tuple[int, int]] = { "micro": (50, 150), # Quick update/question "short": (150, 300), # Standard engagement post "medium": (300, 800), # Thought leadership "long": (800, 1500), # Deep dive analysis "story": (1000, 3000), # Long-form narrative } # Line break styles for scannability LINE_BREAKS: Dict[str, int] = { "dense": 1, # Traditional paragraph "readable": 2, # Standard spacing "scannable": 3, # Easy to scan (recommended) "dramatic": 5, # High visual impact "extreme": 7, # Maximum white space } # Paragraph length guidelines PARAGRAPH_LENGTH: Dict[str, Tuple[int, int]] = { "tight": (1, 2), # 1-2 sentences "standard": (2, 4), # 2-4 sentences "loose": (4, 6), # 4-6 sentences } # Emoji usage formulas (emojis per word ratio) EMOJI: Dict[str, float] = { "none": 0.0, "minimal": 0.01, # 1 per 100 words (~1-2 per post) "moderate": 0.05, # 1 per 20 words (~3-5 per post) "expressive": 0.1, # 1 per 10 words (~5-10 per post) "heavy": 0.15, # 1 per 7 words (influencer style) } # Hashtag best practices HASHTAGS: Dict[str, Any] = { "count": { "minimal": (1, 2), "optimal": (3, 5), # Sweet spot based on 2025 data "maximum": (5, 7), "over_limit": 8, # Diminishing returns }, "placement": { "inline": "Within the text flow", "mid": "After main content, before CTA", "end": "At the very end (most common)", "first_comment": "In first comment (keeps post clean)", }, "strategy": { "branded": "Company/personal brand tags", "trending": "Current trending topics", "niche": "Industry-specific hashtags", "mixed": "Blend of all three (recommended)", }, } # Visual formatting symbols SYMBOLS: Dict[str, str] = { "arrow": "→", "bullet": "•", "checkmark": "✓", "cross": "✗", "lightning": "⚡", "bulb": "💡", "lightbulb": "💡", "target": "🎯", "pin": "📌", "quote": "💬", "calendar": "📅", "checklist": "✓", "checkbox": "☐", "transformation": "🔄", "poll": "📊", "features": "✨", "list": "📝", } # Chart-specific tokens CHART_EMOJIS: Dict[str, str] = { "bar": "📊", "metrics": "📈", "comparison": "⚖️", "progress": "📊", "ranking": "🏆", "time": "⏱️", "stats": "📊", } # Bar chart colors (emoji squares for LinkedIn compatibility) BAR_COLORS: list[str] = ["🟦", "🟩", "🟨", "🟧", "🟥", "🟪", "🟫"] # Indicators INDICATORS: Dict[str, str] = { "positive": "✅", "negative": "❌", "neutral": "⚪", "warning": "⚠️", "gold_medal": "🥇", "silver_medal": "🥈", "bronze_medal": "🥉", } # Progress bar characters PROGRESS_BARS: Dict[str, str] = { "filled": "█", "empty": "░", "partial": "▓", } # Separators for visual breaks SEPARATORS: Dict[str, str] = {"line": "---", "dots": "• • •", "wave": "~", "heavy": "━━━"} @classmethod def get_length_range(cls, length_type: str) -> Tuple[int, int]: """Get min/max length for a post type""" return cls.IDEAL_LENGTH.get(length_type, cls.IDEAL_LENGTH["medium"]) @classmethod def get_line_break_count(cls, style: str) -> int: """Get number of line breaks for a style""" return cls.LINE_BREAKS.get(style, 2) @classmethod def calculate_emoji_count(cls, word_count: int, level: str) -> int: """Calculate recommended emoji count based on word count""" ratio = cls.EMOJI.get(level, 0.05) return int(word_count * ratio) @classmethod def get_hashtag_count(cls, strategy: str) -> Tuple[int, int]: """Get recommended hashtag count range""" result: Tuple[int, int] = cls.HASHTAGS["count"].get( strategy, cls.HASHTAGS["count"]["optimal"] ) return result

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/chrishayuk/chuk-mcp-linkedin'

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