LinkedIn MCP服务器
用于创建高性能LinkedIn内容的MCP服务器设计系统
   
______________________________________________________________________
概述
用于LinkedIn内容创建的专业模型上下文协议(MCP)服务器,具有受shadcn启发的组件系统、10个性能调优主题和基于1M+帖子分析的数据驱动优化。
建立在 ChukMCP服务器 --模块化、零配置的MCP服务器框架,具有智能环境检测和生产就绪默认值。
它的作用:
- ✅ 使用基于主题的组件和变体撰写帖子
- ✅ 通过LinkedIn API上传文档(PDF/PPTX/DOCX)
- ✅ 使用会话隔离的工件存储预览帖子
- ✅ 在LinkedIn上发布和安排帖子
- ✅ 利用2025年的性能数据优化内容
- ✅ 生成安全、有时间限制的预览URL
它没有做什么:
- ❌ 创建PowerPoint/PDF文件(此服务器专注于LinkedIn内容的撰写和发布)
🔒 隐私和安全
令牌安全:
- 令牌从不以明文形式登录(仅在调试级别使用8个字符前缀)
- 日志中编辑的所有敏感数据(令牌、代码、用户ID)
- OAuth访问令牌:短期(默认15分钟)以降低重播风险
- OAuth刷新令牌:每日轮换以获得最大安全性
- LinkedIn发行的令牌:存储在服务器端,自动刷新
- 没有令牌持久化到文件系统(仅限Redis/内存会话)
草稿隔离:
- 所有草稿都适用于经过身份验证的用户会话
- 无法进行跨用户访问(由强制执行
@requires_auth装饰师) - 会话到期时自动删除草稿工件
工件存储:
- 内存提供程序:服务器重新启动时清除了工件
- Redis提供者:基于TTL的过期时间(默认值:1小时)
- S3提供商:预设URL在配置时间后过期(默认值:1小时)
会话管理:
- 在每个请求上验证会话
- 自动清理过期会话
- 在所有状态更改操作中启用CSRF保护
OAuth 2.1合规性(RFC 9728):
- 授权服务器发现: RFC 8414 元数据在
/.well-known/oauth-authorization-server - 受保护资源元数据: RFC 9728 在
/.well-known/oauth-protected-resource - JWT访问令牌: RFC 9068 短TTL格式
- PKCE:所有授权流都需要(S256质询方法)
- 州与非州:强制执行以防止CSRF和重放攻击
OAuth模式:
- LinkedIn直接模式 (默认):服务器直接通过LinkedIn处理OAuth流
- 钥匙斗篷模式:将OAuth委托给Keycloak,Keycloak将LinkedIn作为身份提供者进行管理
- 集中身份验证和SSO支持 - 通过Keycloak的身份提供者集成进行令牌代理 - 企业功能:LDAP、SAML、2FA - 看 Keycloak设置指南
- 直通模式:直接接受LinkedIn承载令牌(无OAuth流)
- 非常适合测试和开发 - 无需OAuth凭据 - 通过LinkedIn用户信息端点验证的令牌 - 看 通道模式指南
领英API合规性:您有责任遵守 LinkedIn的API服务条款 以及速率限制。此服务器不实现速率限制-根据需要配置您自己的反向代理或API网关。
特性
🎨 设计系统架构
- 基于组件的组合 -从可重用组件(Hook、Body、CTA、Hashtags)构建帖子
- 受CVA启发的变体 -支持复合变体的类型安全变体
- 10个预先构建的主题 -思想领袖、数据驱动、讲故事者等
- 设计代币 -集中式造型系统,确保一致性
- Shadcn哲学 -复制、粘贴和拥有您的组件
📊 数据驱动优化
根据2025年对9000个公司页面上100多万个帖子的分析:
- 文件张贴:45.85%的参与度中位数(数据集中最高)
- 民意调查帖子:200%+更高的中位数覆盖率(最未充分利用的格式)
- 视频帖子:参与度中位数为1.4倍,同比增长69%
- 最佳时机:周二至周四,上午7点至9点(参与高峰时段)
- 前210个字符:LinkedIn“查看更多”截断前的关键挂钩窗口
Data & Methodology
数据集:来自9247个公司页面的1042183篇帖子(2025年1月至12月)
指标:
- *参与* =(点赞+评论+分享)/印象
- *到达* =每个帖子的唯一观众
- *成长* =参与率同比变化
来源:LinkedIn Pages API,从已选择的公司帐户汇总。参与率是中值,以减少异常值偏差。时间分析使用UTC标准化时间戳。
局限性数据集倾向于B2B科技公司(占样本的63%)。结果可能因消费品牌或地区市场而异。
🖥️ 预览和工件系统
- 像素完美的LinkedIn UI -真实明信片渲染
- 实时分析 -角色计数、参与度预测
- 文档渲染 -PDF/PPTX页面作为图像(如LinkedIn)
- 会话隔离 -安全的、基于会话的草稿存储
- 文物存储 -多个后端(内存、S3、IBM COS)
- 预先签名的URL -限时、安全的预览URL
🚀 专业CLI
- 基于ChukMCPServer构建:模块化框架,零配置部署
- 多种模式:STDIO(Claude Desktop)、HTTP(API)、Auto-detect
- 智能环境检测:自动配置本地开发、Docker、Fly.io等。
- 调试记录:内置日志记录和错误处理
- Docker支持:多阶段构建,强化安全性
- 入口点:
linkedin-mcp和linkedin-mcp-server命令
🔧 开发者体验
- 96%的测试覆盖率 -1058项测试通过
- CI/CD就绪 -GitHub操作,预提交钩子
- 类型安全 -完整的MyPy类型注释
- 有据可查的 -大量文档和示例
快速开始
选项1:使用公共MCP服务器(推荐)
最简单的入门方法是使用我们的托管MCP服务器 https://linkedin.chukai.io.
备注:公共服务器是一个尽力而为的演示实例,为了防止滥用,速率受到限制。对于具有保证SLA的生产使用,请部署自己的实例(请参阅 部署).
添加到克劳德桌面:
- 打开您的Claude Desktop配置文件:
- macOS: ~/Library/Application Support/Claude/claude_desktop_config.json - 视窗: C:\Users\\AppData\Roaming\Claude\claude_desktop_config.json
(替换 `` 使用您的实际Windows用户名)
- 添加LinkedIn MCP服务器(无尾随斜线):
{
"mcpServers": {
"linkedin": {
"url": "https://linkedin.chukai.io"
}
}
}- 重新启动克劳德桌面
- 在系统提示时使用LinkedIn进行身份验证(您将被重定向到LinkedIn OAuth)
与MCP CLI一起使用:
# Install MCP CLI (using uvx - no separate install needed)
# Requires: ANTHROPIC_API_KEY or OPENAI_API_KEY environment variable
# Connect with Claude
uvx mcp-cli --server https://linkedin.chukai.io --provider anthropic --model claude-sonnet-4-5
# Or with OpenAI
uvx mcp-cli --server https://linkedin.chukai.io --provider openai --model gpt-5-mini
# Or use local Ollama (no API key needed)
uvx mcp-cli --server https://linkedin.chukai.io公共服务器包括:
- ✅ OAuth 2.1合规性 完全支持RFC:
- 授权服务器发现(RFC 8414)at /.well-known/oauth-authorization-server - 受保护资源元数据(RFC 9728)at /.well-known/oauth-protected-resource - JWT访问令牌(RFC 9068)
- ✅ Redis会话存储 用于多实例可靠性
- ✅ S3兼容工件存储 (Tigris)带有预签名URL
- ✅ 自动缩放 高可用性(Fly.io)
- ✅ 安全预览URL 具有可配置的过期时间(默认值:1小时)
选项2:本地运行
想运行自己的实例吗?在本地安装并运行服务器:
1.安装软件包
# Basic installation
pip install chuk-mcp-linkedin
# With HTTP server support
pip install chuk-mcp-linkedin[http]
# With document preview support
pip install chuk-mcp-linkedin[preview]
# For development
pip install chuk-mcp-linkedin[dev]2.设置环境变量
创建 .env 文件:
# LinkedIn OAuth credentials (required)
LINKEDIN_CLIENT_ID=your_client_id
LINKEDIN_CLIENT_SECRET=your_client_secret
LINKEDIN_REDIRECT_URI=http://localhost:8000/oauth/callback
# Optional: OAuth server URL (for discovery endpoint)
OAUTH_SERVER_URL=http://localhost:8000
# Session storage (default: memory)
SESSION_PROVIDER=memory
# Enable publishing (default: false)
ENABLE_PUBLISHING=true3.运行服务器
# STDIO mode (for Claude Desktop)
linkedin-mcp stdio
# HTTP mode (API server)
linkedin-mcp http --port 8000
# Auto-detect mode
linkedin-mcp auto
# With debug logging
linkedin-mcp stdio --debug4.配置克劳德桌面(本地服务器)
{
"mcpServers": {
"linkedin": {
"command": "linkedin-mcp",
"args": ["stdio"],
"env": {
"LINKEDIN_CLIENT_ID": "your_client_id",
"LINKEDIN_CLIENT_SECRET": "your_client_secret"
}
}
}
}创建您的第一个帖子
from chuk_mcp_linkedin.posts import ComposablePost
from chuk_mcp_linkedin.themes import ThemeManager
# Get a theme
theme = ThemeManager().get_theme("thought_leader")
# Compose a post
post = ComposablePost("text", theme=theme)
post.add_hook("stat", "95% of LinkedIn posts get zero comments")
post.add_body("""
Here's why (and how to fix it):
Most posts lack these 3 elements:
→ Strong hook (first 210 characters)
→ Clear value (what's in it for them)
→ Conversation starter (invite engagement)
Start treating posts like conversations, not broadcasts.
""", structure="listicle")
post.add_cta("curiosity", "What's your biggest LinkedIn frustration?")
post.add_hashtags(["LinkedInTips", "ContentStrategy"])
# Get the composed text
text = post.compose()
print(text)安装
先决条件
- Python 3.11或更高版本
- LinkedIn OAuth凭据(创建一个应用)
安装选项
# Basic installation (STDIO mode only)
pip install chuk-mcp-linkedin
# Recommended: with uv (faster, more reliable)
uv pip install chuk-mcp-linkedin任选附件
根据需要安装其他功能:
| 额外 | 命令 | 包括 | 用例 |
|---|---|---|---|
| 超文本传输协议 | pip install chuk-mcp-linkedin[http] | uvicorn,starlette | 作为HTTP API服务器运行 |
| 预览 | pip install chuk-mcp-linkedin[preview] | pdf2image、Pillow、python pptx、python docx、PyPDF2 | 文档预览渲染 |
| 开发 | pip install chuk-mcp-linkedin[dev] | pytest、black、ruff、mypy、预提交 | 开发和测试 |
| 全部 | pip install "chuk-mcp-linkedin[dev,http,preview]" | 以上所有 | 完整安装 |
系统依赖关系(预览支持):
# macOS
brew install poppler
# Ubuntu/Debian
sudo apt-get install poppler-utils
# Windows (using Chocolatey)
choco install poppler来源
# Clone from your source repository
uv pip install -e ".[dev,http,preview]"用法
CLI命令
# Get help
linkedin-mcp --help
# STDIO mode (for Claude Desktop)
linkedin-mcp stdio
# HTTP mode (API server on port 8000)
linkedin-mcp http --host 0.0.0.0 --port 8000
# Auto-detect best mode
linkedin-mcp auto
# Enable debug logging
linkedin-mcp stdio --debug --log-level DEBUGPython API
简单文本帖子
from chuk_mcp_linkedin.posts import ComposablePost
from chuk_mcp_linkedin.themes import ThemeManager
# Get theme
theme_mgr = ThemeManager()
theme = theme_mgr.get_theme("thought_leader")
# Create post
post = ComposablePost("text", theme=theme)
post.add_hook("question", "What drives innovation in 2025?")
post.add_body("Innovation comes from diverse perspectives...", structure="linear")
post.add_cta("direct", "Share your thoughts!")
# Compose final text
final_text = post.compose()文档职位(最高参与度)
文档帖子的参与率为45.85%,是2025年的最高格式!
from chuk_mcp_linkedin.posts import ComposablePost
# Compose post text (publishing via MCP server with OAuth)
post = ComposablePost("document", theme=theme)
post.add_hook("stat", "Document posts get 45.85% engagement")
post.add_body("Our Q4 results are in. Here's what we learned 📊")
post.add_cta("curiosity", "What's your biggest takeaway?")
text = post.compose()
# Publishing is done via MCP server tools with OAuth authentication
# See examples/oauth_linkedin_example.py for OAuth flow
# See docs/OAUTH.md for setup instructions投票站(最高覆盖率)
民意调查的覆盖率比平均帖子高出200%以上!
# Create poll
post = ComposablePost("poll", theme=theme)
post.add_hook("question", "Quick question for my network:")
post.add_body("What's your biggest LinkedIn challenge in 2025?")
# Note: Actual poll creation uses LinkedIn API
# This creates the post text; poll options go via API预览系统
使用自动URL检测在发布前预览您的帖子:
from chuk_mcp_linkedin.manager import LinkedInManager
manager = LinkedInManager()
# Create draft
draft = manager.create_draft("My Post", "text")
# ... compose post ...
# Generate HTML preview (auto-opens in browser)
preview_path = manager.generate_html_preview(draft.draft_id)MCP工具:linkedin_preview_url
生成具有自动服务器检测功能的可共享预览URL:
# Via MCP tool
{
"tool": "linkedin_preview_url",
"arguments": {
"draft_id": "draft_123" # Optional, uses current draft if not provided
}
}预览URL行为:
- 生产(OAuth):自动使用来自的已部署服务器URL
OAUTH_SERVER_URLenv 是
- 例子: https://linkedin.chukai.io/preview/abc123
- 本地开发:默认为
http://localhost:8000/preview/abc123 - 变绿:可以指定自定义
base_url参数(如果需要)
环境变量:
# Production - preview URLs use this automatically
export OAUTH_SERVER_URL=https://linkedin.chukai.io
# Local - no configuration needed (defaults to localhost:8000)CLI预览版(旧版):
# Preview current draft
python preview_post.py
# Preview specific draft
python preview_post.py draft_id_here
# List all drafts
python preview_post.py --list会话管理和工件存储
该服务器包括企业级会话管理和工件存储,由 chuk-artifacts:
特征:
- 🔒 会话隔离 -每节课只看到自己的草稿
- 📦 文物存储 -具有网格架构的安全、基于会话的存储
- 🔗 预先签名的URL -限时、安全的预览URL
- ☁️ 多个后端 -内存、文件系统、S3、IBM云对象存储
- 🧹 自动清理 -旧预览自动过期
基于会话的草稿
from chuk_mcp_linkedin.manager import LinkedInManager
# Create manager with session ID
manager = LinkedInManager(
session_id="user_alice",
use_artifacts=True,
artifact_provider="memory" # or "filesystem", "s3", "ibm-cos"
)
# Drafts are automatically locked to this session
draft = manager.create_draft("My Post", "text")
# Only this session can access the draft
accessible = manager.is_draft_accessible(draft.draft_id) # True for "user_alice"
# Different session cannot access
other_manager = LinkedInManager(session_id="user_bob")
accessible = other_manager.is_draft_accessible(draft.draft_id) # False基于工件的预览
生成自动过期的安全预览URL:
from chuk_mcp_linkedin.preview import get_artifact_manager
# Initialize artifact manager
async with await get_artifact_manager(provider="memory") as artifacts:
# Create session
session_id = artifacts.create_session(user_id="alice")
# Store preview
artifact_id = await artifacts.store_preview(
html_content="...",
draft_id="draft_123",
draft_name="My Post",
session_id=session_id
)
# Generate presigned URL (expires in 1 hour)
url = await artifacts.get_preview_url(
artifact_id=artifact_id,
session_id=session_id,
expires_in=3600
)
print(f"Preview URL: {url}")MCP工具:linkedin_preview_url
这 linkedin_preview_url 工具生成会话隔离的预览URL:
{
"tool": "linkedin_preview_url",
"arguments": {
"draft_id": "draft_123", // optional: defaults to current draft
"base_url": "https://linkedin.chukai.io", // optional: auto-detected from OAUTH_SERVER_URL
"expires_in": 3600 // optional: default 3600s
}
}答复:
{
"url": "https://linkedin.chukai.io/preview/04a0c703d98d428fae0e550c885523f7",
"draft_id": "draft_123",
"artifact_id": "04a0c703d98d428fae0e550c885523f7",
"expires_in": 3600
}该URL是可共享的,不需要身份验证。它将在指定时间后自动过期。
存储提供商
根据您的需求配置存储后端:
内存(默认):
# Fast, ephemeral storage for development
manager = LinkedInManager(use_artifacts=True, artifact_provider="memory")文件系统:
# Persistent storage on disk
manager = LinkedInManager(use_artifacts=True, artifact_provider="filesystem")
# Stores in: .artifacts/linkedin-drafts/S3:
# Configure via environment variables
export ARTIFACT_PROVIDER=s3
export ARTIFACT_S3_BUCKET=my-linkedin-artifacts
export ARTIFACT_S3_REGION=us-east-1
export AWS_ACCESS_KEY_ID=your_key
export AWS_SECRET_ACCESS_KEY=your_secretfrom chuk_artifacts.config import configure_s3
# Or configure programmatically
configure_s3(
bucket="my-linkedin-artifacts",
region="us-east-1",
access_key="your_key",
secret_key="your_secret"
)
manager = LinkedInManager(use_artifacts=True, artifact_provider="s3")IBM云对象存储:
from chuk_artifacts.config import configure_ibm_cos
configure_ibm_cos(
bucket="my-linkedin-artifacts",
endpoint="https://s3.us-south.cloud-object-storage.appdomain.cloud",
access_key="your_key",
secret_key="your_secret"
)网格体系结构
工件使用分层网格结构:
grid/
├── {sandbox_id}/ # "linkedin-mcp"
│ ├── {session_id}/ # "user_alice"
│ │ ├── {artifact_id}/ # "abc123"
│ │ │ ├── metadata.json
│ │ │ └── content
│ │ └── {artifact_id}/
│ └── {session_id}/
└── {sandbox_id}/这确保了:
- ✅ 会话隔离(用户无法访问彼此的工件)
- ✅ 多租户支持(不同沙盒)
- ✅ 可扩展存储(高效组织)
- ✅ 易于清理(按会话或沙盒删除)
本地开发
对于没有云存储的本地开发:
# Use in-memory artifact storage
from chuk_mcp_linkedin.manager import LinkedInManager
manager = LinkedInManager(
use_artifacts=True,
artifact_provider="memory" # Fast, ephemeral storage
)
# Or use filesystem for persistent local storage
manager = LinkedInManager(
use_artifacts=True,
artifact_provider="filesystem" # Stores in .artifacts/
)可用主题
为不同的LinkedIn人物角色预先构建的10个主题:
| 主题 | 描述 | 用例 |
|---|---|---|
thought_leader | 权威和专业知识 | 行业见解、框架 |
data_driven | 让数字讲故事 | 分析、研究、报告 |
storyteller | 叙事驱动 | 个人经历、案例研究 |
community_builder | 促进对话 | 民意调查、提问、参与 |
technical_expert | 深厚的技术知识 | 工程、开发、技术主题 |
personal_brand | 真实的联系 | 幕后,个人故事 |
corporate_professional | 抛光企业 | 官方公告、更新 |
contrarian_voice | 挑战现状 | 有争议的观点,辩论 |
coach_mentor | 指导和支持 | 提示、建议、指导 |
entertainer | 让LinkedIn变得有趣 | 幽默、表情包、轻松内容 |
MCP服务器集成
使用OAuth(推荐)
对于具有OAuth身份验证的HTTP模式:
{
"mcpServers": {
"linkedin": {
"command": "linkedin-mcp",
"args": ["http", "--port", "8000"],
"env": {
"SESSION_PROVIDER": "memory",
"LINKEDIN_CLIENT_ID": "your_linkedin_client_id",
"LINKEDIN_CLIENT_SECRET": "your_linkedin_client_secret",
"OAUTH_ENABLED": "true"
}
}
}
}然后与MCP-CLI一起使用:
uvx mcp-cli --server linkedin --provider openai --model gpt-5-mini看 docs/OAUTH.md 获取完整的OAuth设置说明。
STDIO模式(桌面客户端)
对于Claude Desktop和其他桌面客户端集成:
{
"mcpServers": {
"linkedin": {
"command": "linkedin-mcp",
"args": ["stdio"]
}
}
}备注:发布工具需要OAuth。STDIO模式支持所有其他工具(绘图、合成、预览)。
码头工人
快速开始
# Build image
docker build -t chuk-mcp-linkedin:latest .
# Run in STDIO mode
docker-compose --profile stdio up -d
# Run in HTTP mode
docker-compose --profile http up -d
# View logs
docker-compose logs -fMakefile命令
make docker-build # Build Docker image
make docker-run-stdio # Run in STDIO mode
make docker-run-http # Run in HTTP mode on port 8000
make docker-test # Build and test image
make docker-logs # View container logs
make docker-stop # Stop containers
make docker-clean # Clean up Docker resources环境变量
创建 .env 文件:
# ============================================================================
# OAuth Configuration (Required for Publishing)
# ============================================================================
# LinkedIn OAuth Credentials (from https://www.linkedin.com/developers/apps)
LINKEDIN_CLIENT_ID=your_linkedin_client_id
LINKEDIN_CLIENT_SECRET=your_linkedin_client_secret
# OAuth Server URLs
LINKEDIN_REDIRECT_URI=http://localhost:8000/oauth/callback # Must match LinkedIn app settings
OAUTH_SERVER_URL=http://localhost:8000
OAUTH_ENABLED=true
# Session Storage (for OAuth tokens)
SESSION_PROVIDER=memory # Development: memory | Production: redis
SESSION_REDIS_URL=redis://localhost:6379/0 # Required if SESSION_PROVIDER=redis
# ============================================================================
# OAuth Token TTL Configuration (Optional - Defaults Shown)
# ============================================================================
# Authorization codes - Temporary codes exchanged for access tokens during OAuth flow
# Short-lived for security (5 minutes)
OAUTH_AUTH_CODE_TTL=300
# Access tokens - Used by MCP clients to authenticate API requests
# Should be short-lived and refreshed regularly (15 minutes)
OAUTH_ACCESS_TOKEN_TTL=900
# Refresh tokens - Long-lived tokens that obtain new access tokens without re-authentication
# Short lifetime requires daily re-authorization for maximum security (1 day)
OAUTH_REFRESH_TOKEN_TTL=86400
# Client registrations - How long dynamically registered MCP clients remain valid (1 year)
OAUTH_CLIENT_REGISTRATION_TTL=31536000
# LinkedIn tokens - Access and refresh tokens from LinkedIn stored server-side
# Auto-refreshed when expired (1 day, more secure than LinkedIn's 60-day default)
OAUTH_EXTERNAL_TOKEN_TTL=86400
# ============================================================================
# Server Configuration
# ============================================================================
DEBUG=0
HTTP_PORT=8000
# LinkedIn Person URN (for API calls - auto-detected from OAuth token)
LINKEDIN_PERSON_URN=urn:li:person:YOUR_ID # Optional: Auto-fetched via OAuth要点:
- 会话_提供者=内存 -开发所需(不需要Redis)
- 会话_提供者=redis -生产所需(使用SESSION_REDIS_URL)
- 需要OAuth -发布工具(
linkedin_publish)需要OAuth身份验证 - 令牌TTL -默认设置侧重于安全性(生命周期短,每天重新授权)
看 docs/OAUTH.md 完整的OAuth设置和 用于Docker部署。
生产部署
Fly.io部署(推荐)
将LinkedIn MCP服务器部署到带有Redis会话存储的Fly.io:
先决条件
- Fly.io帐户 - 在fly.io注册
- Fly CLI -安装:
curl -L https://fly.io/install.sh | sh - LinkedIn OAuth应用程序 -创建时间 LinkedIn开发者
- Redis实例 -在Fly.io上创建(或使用Uptash)
第一步:创建Fly.io应用程序
# Login to Fly.io
fly auth login
# Create app (generates fly.toml)
fly launch --no-deploy
# Choose app name (e.g., your-linkedin-mcp)
# Choose region (e.g., cdg for Paris)第二步:创建Redis实例
# Create Redis on Fly.io
fly redis create
# Note the Redis URL from output:
# redis://default:PASSWORD@fly-INSTANCE-NAME.upstash.io:6379步骤3:创建提格里斯储物桶
# Create Tigris S3-compatible storage for preview artifacts
fly storage create --name your-linkedin-mcp
# Fly automatically sets these secrets on your app:
# - AWS_ACCESS_KEY_ID
# - AWS_SECRET_ACCESS_KEY
# - AWS_ENDPOINT_URL_S3
# - AWS_REGION
# - BUCKET_NAME步骤4:配置环境变量
所需机密参考:
| 机密 | 必填 | 来源 | 目的 |
|---|---|---|---|
LINKEDIN_CLIENT_ID | ✅ 是的 | LinkedIn开发者门户 | OAuth客户端ID |
LINKEDIN_CLIENT_SECRET | ✅ 是 | 领英开发者门户 | OAuth客户端机密 |
SESSION_REDIS_URL | ✅ 是 | 输出来自 fly redis create (步骤2) | 会话的Redis连接字符串 |
SESSION_PROVIDER | ✅ 是 | 设置为 redis | 启用Redis会话后端 |
OAUTH_SERVER_URL | ✅ 是 | 您的Fly.io应用程序URL | OAuth发现库URL |
LINKEDIN_REDIRECT_URI | ✅ 是的 | {OAUTH_SERVER_URL}/oauth/callback | OAuth回调端点 |
AWS_ACCESS_KEY_ID | 汽车 | fly storage create (步骤3) | Tigris S3访问密钥(自动设置) |
AWS_SECRET_ACCESS_KEY | 汽车 | fly storage create (步骤3) | Tigris S3密钥(自动设置) |
AWS_ENDPOINT_URL_S3 | 汽车 | fly storage create (步骤3) | Tigris S3端点(自动设置) |
AWS_REGION | 汽车 | fly storage create (步骤3) | 提格里斯S3区域(自动设置) |
使用Fly CLI设置所需的机密:
# LinkedIn OAuth credentials (from https://www.linkedin.com/developers/apps)
fly secrets set \
LINKEDIN_CLIENT_ID=your_linkedin_client_id \
LINKEDIN_CLIENT_SECRET=your_linkedin_client_secret \
--app your-linkedin-mcp
# Redis connection (from step 2)
fly secrets set \
SESSION_REDIS_URL="redis://default:PASSWORD@fly-INSTANCE-NAME.upstash.io:6379" \
SESSION_PROVIDER=redis \
--app your-linkedin-mcp
# OAuth server configuration
fly secrets set \
OAUTH_SERVER_URL=https://your-linkedin-mcp.fly.dev \
LINKEDIN_REDIRECT_URI=https://your-linkedin-mcp.fly.dev/oauth/callback \
--app your-linkedin-mcp备注:运行时会自动设置Tigris的AWS凭据(步骤3) fly storage create无需手动配置!步骤5:配置fly.toml
更新 fly.toml 生产设置:
app = 'your-linkedin-mcp'
primary_region = 'cdg'
[build]
[http_service]
internal_port = 8000
force_https = true
auto_stop_machines = 'stop'
auto_start_machines = true
min_machines_running = 0
processes = ['app']
[[vm]]
memory = '1gb'
cpu_kind = 'shared'
cpus = 1
[env]
SESSION_PROVIDER = 'redis'
ENABLE_PUBLISHING = true
OAUTH_SERVER_URL = 'https://your-linkedin-mcp.fly.dev'
LINKEDIN_REDIRECT_URI = 'https://your-linkedin-mcp.fly.dev/oauth/callback'
# Artifact Storage (Tigris S3-compatible)
ARTIFACT_PROVIDER = 's3'
ARTIFACT_S3_BUCKET = 'your-linkedin-mcp'
# AWS_* secrets automatically set by `fly storage create`步骤6:部署
# Deploy to Fly.io
fly deploy
# Check deployment status
fly status
# View logs
fly logs
# Test OAuth endpoint
curl https://your-linkedin-mcp.fly.dev/.well-known/oauth-authorization-server步骤7:配置MCP客户端
更新您的MCP客户端配置(例如。, ~/.mcp-cli/servers.yaml):
servers:
linkedin:
url: https://your-linkedin-mcp.fly.dev # No trailing slash!
oauth: true测试连接:
uvx mcp-cli --server linkedin --provider openai --model gpt-5-miniRedis 配置
发展(记忆)
对于本地开发,请使用内存中的会话存储:
# .env file
SESSION_PROVIDER=memory无需安装Redis。服务器重新启动时会话丢失。
生产(Redis)
对于生产环境,使用Redis进行持久会话存储:
选项1:Fly.io Redis(升级版)
# Create Redis instance
fly redis create
# Get connection details
fly redis status your-redis-instance
# Set as secret
fly secrets set SESSION_REDIS_URL="redis://default:PASSWORD@fly-INSTANCE.upstash.io:6379"选项2:外部Redis(Uptash、AWS ElastiCache等)
# Set Redis URL
export SESSION_REDIS_URL="redis://username:password@host:port/db"
export SESSION_PROVIDER=redis环境变量:
# Session Provider
SESSION_PROVIDER=redis # Required: redis | memory
# Redis Connection (required if SESSION_PROVIDER=redis)
SESSION_REDIS_URL=redis://default:password@host:6379
# Optional Redis settings
REDIS_TLS_INSECURE=0 # Set to 1 to disable TLS cert verification (not recommended)自定义域设置
为您的部署配置自定义域:
第一步:将域名添加到Fly.io
# Add custom domain
fly certs create linkedin.yourdomain.com
# Verify DNS settings
fly certs show linkedin.yourdomain.com步骤2:更新DNS
添加DNS记录(检查上一个命令的输出):
Type: CNAME
Name: linkedin.yourdomain.com
Value: your-linkedin-mcp.fly.dev步骤3:更新OAuth URL
# Update secrets with custom domain
fly secrets set \
OAUTH_SERVER_URL=https://linkedin.yourdomain.com \
LINKEDIN_REDIRECT_URI=https://linkedin.yourdomain.com/oauth/callback步骤4:更新LinkedIn应用程序
- 首选 LinkedIn开发者
- 选择您的应用程序
- 更新“重定向URL”以匹配:
https://linkedin.yourdomain.com/oauth/callback
环境变量引用
生产环境变量的完整列表:
# ============================================================================
# OAuth Configuration (Required for Production)
# ============================================================================
# LinkedIn OAuth Credentials
LINKEDIN_CLIENT_ID=your_linkedin_client_id
LINKEDIN_CLIENT_SECRET=your_linkedin_client_secret
# OAuth Server URLs (must match LinkedIn app settings)
# IMPORTANT: This URL is also used for preview URLs (linkedin_preview_url tool)
OAUTH_SERVER_URL=https://your-app.fly.dev
LINKEDIN_REDIRECT_URI=https://your-app.fly.dev/oauth/callback
OAUTH_ENABLED=true
# ============================================================================
# Session Storage (Required for Production)
# ============================================================================
# Production: Use Redis
SESSION_PROVIDER=redis
SESSION_REDIS_URL=redis://default:password@fly-instance.upstash.io:6379
# Development: Use Memory
# SESSION_PROVIDER=memory
# ============================================================================
# OAuth Token TTL Configuration (Optional - Defaults Shown)
# ============================================================================
OAUTH_AUTH_CODE_TTL=300 # Authorization codes (5 min)
OAUTH_ACCESS_TOKEN_TTL=900 # Access tokens (15 min)
OAUTH_REFRESH_TOKEN_TTL=86400 # Refresh tokens (1 day)
OAUTH_CLIENT_REGISTRATION_TTL=31536000 # Client registrations (1 year)
OAUTH_EXTERNAL_TOKEN_TTL=86400 # LinkedIn tokens (1 day)
# ============================================================================
# Server Configuration
# ============================================================================
DEBUG=0 # Disable debug mode in production
HTTP_PORT=8000 # Server port
ENABLE_PUBLISHING=true # Enable publishing tools
# LinkedIn Person URN (optional - auto-detected via OAuth)
LINKEDIN_PERSON_URN=urn:li:person:YOUR_ID日志记录配置
控制生产中的测井水平:
# Production logging
LOG_LEVEL=INFO # INFO for production, DEBUG for troubleshooting
MCP_LOG_LEVEL=WARNING # MCP protocol logging
# Development logging
LOG_LEVEL=DEBUG
MCP_LOG_LEVEL=INFO安全说明:在INFO级别,不记录敏感数据(令牌、用户ID、授权码)。此数据仅在调试级别记录,用于故障排除。
监控和故障排除
# View live logs
fly logs --app your-linkedin-mcp
# Check app status
fly status --app your-linkedin-mcp
# Check Redis status
fly redis status your-redis-instance
# Restart app
fly apps restart your-linkedin-mcp
# Scale app
fly scale count 2 --app your-linkedin-mcp # 2 instances
fly scale memory 2048 --app your-linkedin-mcp # 2GB memory健康检查
服务器包括健康检查终结点:
# Check server health
curl https://your-app.fly.dev/
# Check OAuth discovery
curl https://your-app.fly.dev/.well-known/oauth-authorization-server
# Check MCP endpoint
curl https://your-app.fly.dev/mcp安全最佳实践
- 永远不要泄露秘密 -在Fly.toml中使用Fly secrets,而不是环境变量
- 仅使用HTTPS -设置
force_https = true在fly.toml - 定期旋转令牌 -LinkedIn令牌会自动刷新
- 监控日志 -检查身份验证尝试是否失败
- 使用自定义域 -专业外观,更易于更新
- 启用自动缩放 -自动处理流量峰值
- 保持依赖关系更新 -定期安全更新
成本优化
Fly.io定价优化提示:
# In fly.toml - auto-stop when idle
[http_service]
auto_stop_machines = 'stop' # Stop when idle
auto_start_machines = true # Start on request
min_machines_running = 0 # No always-on instances预期成本:
- 免费层:3个共享cpu VM,256MB RAM
- Redis:基本Upstash实例每月约2美元
- 扩展:免费层后每个VM约0.02美元/小时
文档
- 入门指南 -完整的初学者指南
- OAuth指南 -OAuth 2.1设置和配置
- api参考 -API完整文档
- 主题指南 -所有主题和定制
- 设计代币 -令牌系统参考
- **** -Docker部署
- CI/CD指南 -持续集成
- 开发指南 -贡献与发展
- 建筑 -系统架构
例子
Hello World:作曲→ 草稿→ 预览URL
查看完整工作流程的最快方式(examples/hello_preview.py):
import asyncio
from chuk_mcp_linkedin.posts import ComposablePost
from chuk_mcp_linkedin.themes import ThemeManager
from chuk_mcp_linkedin.manager_factory import ManagerFactory, set_factory
async def main():
# Initialize factory with memory-based artifacts
factory = ManagerFactory(use_artifacts=True, artifact_provider="memory")
set_factory(factory)
mgr = factory.get_manager("demo_user")
# Step 1: Compose a post
theme = ThemeManager().get_theme("thought_leader")
post = ComposablePost("text", theme=theme)
post.add_hook("question", "What's the most underrated growth lever on LinkedIn in 2025?")
post.add_body("Hint: documents. Short, skimmable, 5–10 pages. Try it this week.", structure="linear")
post.add_cta("curiosity", "Tried docs vs text lately?")
post.add_hashtags(["LinkedInTips", "B2B", "ContentStrategy"])
text = post.compose()
# Step 2: Create a draft
draft = mgr.create_draft("Hello Preview Demo", "text")
mgr.update_draft(draft.draft_id, content={"text": text})
# Step 3: Generate preview URL
preview_url = await mgr.generate_preview_url(
draft_id=draft.draft_id,
base_url="http://localhost:8000",
expires_in=3600
)
print(f"Preview URL: {preview_url}")
if __name__ == "__main__":
asyncio.run(main())运行它:
# Run the example
uv run python examples/hello_preview.py
# Start HTTP server to view preview (separate terminal)
OAUTH_ENABLED=false uv run linkedin-mcp http --port 8000
# Open the preview URL in your browser输出:
🚀 LinkedIn MCP Server - Hello Preview Demo
📝 Step 1: Composing post...
✓ Post composed (193 chars)
📋 Step 2: Creating draft...
✓ Draft created (ID: draft_2_1762129805)
🔗 Step 3: Generating preview URL...
✓ Preview URL generated
Preview URL: http://localhost:8000/preview/04a0c703...更多示例
综合示例 examples/ 目录:
# OAuth flow demonstration (authentication)
python examples/oauth_linkedin_example.py
# Complete component showcase
python examples/showcase_all_components.py
# Charts and data visualization
python examples/demo_charts_preview.py
# Media types showcase
python examples/showcase_media_types.py看 示例/README.md 获取完整列表和OAuth设置说明。
发展
设置
# Install dependencies
make install
make dev
# Install pre-commit hooks
make hooks-install运行测试
# Run all tests
make test
# Run with coverage
make coverage
# Run specific test
uv run pytest tests/test_composition.py -v代码质量
# Format code
make format
# Run linter
make lint
# Type checking
make typecheck
# Security check
make security
# All quality checks
make qualityCI/CD
# Run full CI pipeline locally
make ci
# Quick CI check
make ci-quick
# Pre-commit checks
make pre-commit2025年领英业绩数据
基于对9000个公司页面上100多万个帖子的分析:
表现最佳的格式
- 文档帖子(PDF) -45.85%的参与度(最高)
- 最佳:5-10页 - 格式:1920x1920平方 - 最小字体:18pt手机
- 民意调查帖子 -200%以上的覆盖率(最不受信任)
- 机会:使用最少的格式 - 参与度:平均覆盖率的3倍 - 持续时间:3-7天最佳
- 视频帖子 -1.4倍参与度(增长)
- 使用量比2024年增长69% - 首选垂直格式 - 保持在3分钟以下
- 图片帖子 -评论比文本多2倍
- 方形格式(1080x1080)表现最佳 - 信息图表和数据,即趋势
- 旋转木马帖子 -递减格式
- 与2024年相比,覆盖率下降了18%,参与率下降了25% - 最多保留5-10张幻灯片
最佳岗位结构
- 前210个字符 -临界钩窗
- 理想长度:300-800个字符
- 话题标签:3-5最佳(不是10+)
- 换行符:用于可扫描性
- 最佳时期:周二至周四,上午7点至9点/下午12点至2点/下午5点至6点
第一小时参与度
- 最小10次参与(基线)
- 好:50次交战(算法增强)
- 病毒式:100+次参与(最大覆盖范围)
建筑
建立在 ChukMCP服务器 -模块化MCP服务器框架,提供:
- 零配置部署:智能环境检测(本地、Docker、Fly.io)
- 生产就绪默认值:优化了workers、连接池、日志记录
- 内置OAuth 2.1:发现端点、令牌管理、会话处理
- 多个传输:用于桌面客户端的STDIO,用于API访问的HTTP/SSE
chuk-mcp-linkedin/
├── src/chuk_mcp_linkedin/
│ ├── api/ # LinkedIn API client
│ ├── models/ # Data models (Pydantic)
│ ├── posts/ # Post composition
│ │ ├── composition.py # ComposablePost class
│ │ └── components/ # Hook, Body, CTA, Hashtags
│ ├── preview/ # Preview system
│ │ ├── post_preview.py # HTML preview generation
│ │ ├── artifact_preview.py # Artifact storage & URLs
│ │ └── component_renderer.py # Component rendering
│ ├── themes/ # Theme system
│ ├── tokens/ # Design token system
│ ├── tools/ # MCP tools
│ ├── utils/ # Utilities
│ ├── manager.py # Draft & session management
│ ├── cli.py # CLI implementation
│ ├── server.py # MCP server (legacy)
│ └── async_server.py # ChukMCPServer-based async server
├── tests/ # Comprehensive test suite (96% coverage)
├── examples/ # Usage examples
├── docs/ # Documentation
├── .github/workflows/ # CI/CD workflows
├── Dockerfile # Multi-stage Docker build
├── docker-compose.yml # Docker Compose config
├── Makefile # Development automation
└── pyproject.toml # Project configuration贡献
欢迎投稿!请阅读 贡献.md 作为指导方针。
开发流程
- 克隆该仓库
- 创建特征分支(
git checkout -b feature/amazing-feature) - 进行更改并添加测试
- 进行质量检查(
make check) - 提交更改(
git commit -m 'Add amazing feature') - 推送到分支(
git push origin feature/amazing-feature) - 打开拉取请求
测试
- 96%的测试覆盖率 -1058项测试通过
- 多种测试类型 -单元、集成、组件测试
- 工件系统测试 -会话隔离,预览URL
- CI/CD -GitHub每次推送操作
- 预提交挂钩 -自动质量检查
# Run all tests
make test
# Run with coverage
make coverage
# Open coverage report
make coverage-html许可证
Apache许可证2.0-请参阅 许可证 了解详情。
这是一个为学习和测试目的而提供的演示项目。
学分
数据来源:
- 2025年LinkedIn绩效数据来自对100多万条帖子的分析
- 9K公司页面基准测试
- LinkedIn API文档
灵感来源:
支持
如有疑问和问题,请参阅项目文档。
路线图
- \[\]其他帖子类型(活动、通讯)
- \[\]LinkedIn分析集成
- \[\]A/B测试框架
- \[\]多账户支持
- \[\]调度和自动化
- \[\]使用真实API数据增强预览
- \[\]通知的Webhook支持
更新日志
看 更改日志.md 版本历史。
______________________________________________________________________
