LinkedIn内容生成与截图服务

一个生产就绪的LinkedIn集成服务,提供AI驱动的内容生成和高级截图功能,用于自动化LinkedIn发布、生成吸引人的内容并通过统一的MCP接口捕获精美截图。

  • by akinabudu
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 akinabudu/linkedin-mcpserver

使用说明

LinkedIn MCP服务器

一个生产就绪的模型上下文协议(MCP)服务器,用于LinkedIn与人工智能驱动的内容生成和高级屏幕截图功能的集成。通过统一的MCP界面自动发布LinkedIn帖子、生成引人入胜的内容并捕获精美的屏幕截图。

特性

  • 🤖 人工智能驱动的内容生成 -使用OpenAI、Google Gemini或OpenRouter生成引人入胜的LinkedIn帖子
  • 📸 高级屏幕截图 -捕获网站、代码片段和项目演示
  • 🔄 审批工作流程 -发布前预览和批准帖子
  • 📊 分析 -跟踪岗位绩效和敬业度
  • 🎨 图像处理 -创建拼贴画,针对LinkedIn进行优化,并将代码格式化为精美的格式
  • 🔐 OAuth 2.0身份验证 -安全的LinkedIn API集成
  • 📝 项目分析 -自动分析项目并生成上下文帖子

安装

先决条件

  • 包子 运行时(最新稳定版本)
  • Linux 环境(在Ubuntu/Debian上测试)
  • 铬 截图浏览器
  • LinkedIn API证书 (请参阅LinkedIn API设置)

系统相关性

# Install Chromium and required libraries for Puppeteer
sudo apt-get update
sudo apt-get install -y chromium-browser libgbm1 libasound2

# Optional: Native screenshot tools
sudo apt-get install -y imagemagick

安装项目

# Clone the repository
git clone <your-repo-url>
cd linkedin-mcpserver

# Install dependencies
bun install

# Copy environment template
cp .env.example .env

# Edit .env with your credentials
nano .env

LinkedIn API设置

1.创建LinkedIn应用程序

  1. 首选 LinkedIn开发者
  2. 点击 创建应用程序
  3. 填写应用程序详细信息:
    • 应用程序名称:您的MCP服务器
    • LinkedIn页面:选择或创建页面
    • 应用程序徽标:上传图标
    • 隐私政策URL:您的隐私政策
  4. 点击 创建应用程序

2.获取API凭据

  1. 导航至 认证 标签
  2. 复制 客户端ID 和 客户端密钥
  3. 添加重定向URL: http://localhost:3000/callback
  4. 请求必要的权限:
    • w_member_social -创建帖子
    • r_liteprofile -读取个人资料
    • r_organization_social -组织分析

3.获取访问令牌

有两种方法:

方法A:AuthFlow(推荐)

import { LinkedInAuth } from './src/linkedin/auth.js';

const auth = new LinkedInAuth();
const authUrl = auth.getAuthorizationUrl();
console.log('Visit:', authUrl);

// After authorization, exchange code for token
const tokens = await auth.exchangeCodeForToken(code);
// Save tokens to .env

方法B:LinkedIn令牌检查器

  1. 首选 LinkedIn令牌工具
  2. 选择您的应用程序
  3. 选择所需范围
  4. 点击 请求访问令牌
  5. 将访问令牌复制到 .env

4.配置环境

更新 .env 文件:

LINKEDIN_CLIENT_ID=your_client_id_here
LINKEDIN_CLIENT_SECRET=your_client_secret_here
LINKEDIN_ACCESS_TOKEN=your_access_token_here
LINKEDIN_REDIRECT_URI=http://localhost:3000/callback

AI_PROVIDER=openai
OPENAI_API_KEY=your_openai_key_here

配置

环境变量

变量 描述 默认值
LINKEDIN_CLIENT_ID LinkedIn应用程序客户端ID 必填
LINKEDIN_CLIENT_SECRET LinkedIn应用程序客户端机密 必填
LINKEDIN_ACCESS_TOKEN LinkedIn访问令牌 必填
LINKEDIN_REFRESH_TOKEN LinkedIn刷新令牌 可选
AI_PROVIDER 人工智能提供商:openai、gemini、openrouter openai
OPENAI_API_KEY OpenAI API密钥 如果使用OpenAI,则为必需项
GEMINI_API_KEY Google Gemini API密钥 如果使用Gemini,则需要
OPENROUTER_API_KEY OpenRouter API密钥 如果使用OpenRouter,则为必需项
AI_MODEL AI模型名称 gpt-4
SCREENSHOT_OUTPUT_DIR 屏幕截图输出目录 。/屏幕截图
SCREENSHOT_DEFAULT_WIDTH 默认视口宽度 1920
SCREENSHOT_DEFAULT_HEIGHT 默认视口高度 1080
SCREENSHOT_QUALITY 图像质量(1-100) 90

用法

运行服务器

# Development mode
bun run dev

# Production mode
bun run start

与MCP客户端一起使用

VS代码/临床配置

添加到您的MCP设置中(例如。, ~/.cline/mcp_settings.json):

{
  "mcpServers": {
    "linkedin": {
      "command": "bun",
      "args": ["run", "/path/to/linkedin-mcpserver/src/index.ts"],
      "env": {
        "LINKEDIN_CLIENT_ID": "your_client_id",
        "LINKEDIN_CLIENT_SECRET": "your_client_secret",
        "LINKEDIN_ACCESS_TOKEN": "your_access_token",
        "OPENAI_API_KEY": "your_openai_key"
      }
    }
  }
}

可用工具

1. analyze_project

分析项目并生成LinkedIn帖子内容。

{
  "name": "analyze_project",
  "arguments": {
    "project_path": "./my-project",
    "include_commits": true,
    "commit_count": 5,
    "tone": "professional",
    "length": "medium",
    "capture_screenshots": true,
    "screenshot_config": {
      "include_demo": true,
      "localhost_url": "http://localhost:3000",
      "pages_to_demo": ["/", "/dashboard", "/settings"]
    }
  }
}

2. create_linkedin_post

创建并发布LinkedIn帖子。

{
  "name": "create_linkedin_post",
  "arguments": {
    "content": "Excited to share my new project! 🚀\n\nBuilt with React, TypeScript, and Tailwind CSS...",
    "visibility": "PUBLIC",
    "media_urls": ["/path/to/screenshot.png"],
    "require_approval": true
  }
}

3. confirm_post

确认或拒绝待处理的帖子。

{
  "name": "confirm_post",
  "arguments": {
    "request_id": "preview-1234567890",
    "approved": true
  }
}

4. preview_post

发布前预览帖子。

{
  "name": "preview_post",
  "arguments": {
    "content": "My post content...",
    "visibility": "PUBLIC"
  }
}

5. capture_screenshot

从URL捕获屏幕截图。

{
  "name": "capture_screenshot",
  "arguments": {
    "source_type": "url",
    "source": "https://example.com",
    "viewport_width": 1920,
    "viewport_height": 1080,
    "full_page": false
  }
}

6. capture_project_demo

为项目演示捕获多个页面。

{
  "name": "capture_project_demo",
  "arguments": {
    "project_url": "http://localhost:3000",
    "pages_to_capture": ["/", "/features", "/pricing"],
    "include_mobile_view": true,
    "create_collage": true
  }
}

7. capture_code_snippet

捕获格式精美的代码。

{
  "name": "capture_code_snippet",
  "arguments": {
    "file_path": "./src/components/Hero.tsx",
    "line_start": 10,
    "line_end": 30,
    "theme": "github-dark",
    "show_line_numbers": true
  }
}

8. create_screenshot_collage

合并多个屏幕截图。

{
  "name": "create_screenshot_collage",
  "arguments": {
    "screenshot_paths": ["./img1.png", "./img2.png"],
    "layout": "horizontal",
    "spacing": 20
  }
}

9. get_profile_info

获取LinkedIn个人资料信息。

{
  "name": "get_profile_info",
  "arguments": {}
}

10. get_post_analytics

获取参与后指标。

{
  "name": "get_post_analytics",
  "arguments": {
    "post_id": "urn:li:share:1234567890"
  }
}

示例工作流程

示例1:完整项目公告

// 1. Analyze project and generate content
const analysis = await analyzedProject({
  project_path: "./my-app",
  capture_screenshots: true,
  screenshot_config: {
    include_demo: true,
    localhost_url: "http://localhost:3000",
    pages_to_demo: ["/", "/dashboard"]
  },
  tone: "professional",
  length: "medium"
});

// 2. Create post with preview
const post = await createLinkedInPost({
  content: analysis.generated_content,
  media_urls: analysis.screenshots,
  visibility: "PUBLIC",
  require_approval: true
});

// 3. Confirm after review
await confirmPost({
  request_id: post.preview_id,
  approved: true
});

示例2:代码段共享

// 1. Capture code screenshot
const code = await captureCodeSnippet({
  file_path: "./src/auth/oauth.ts",
  line_start: 45,
  line_end: 75,
  theme: "github-dark"
});

// 2. Post with manual content
await createLinkedInPost({
  content: "Just implemented OAuth 2.0 authentication! 🔐\n\nHere's the core logic...",
  media_urls: [code.path],
  require_approval: false
});

示例3:每周进度更新

// Analyze recent commits
const analysis = await analyzeProject({
  include_commits: true,
  commit_count: 20,
  tone: "casual",
  length: "short"
});

// Post update
await createLinkedInPost({
  content: analysis.generated_content,
  visibility: "PUBLIC"
});

故障排除

身份验证问题

错误:“访问令牌无效”

  • 验证令牌是否正确 .env
  • 检查令牌是否已过期(LinkedIn令牌过期)
  • 从LinkedIn开发者门户申请新令牌

错误:“权限不足”

  • 验证您的应用程序是否具有所需的作用域: w_member_social, r_liteprofile
  • 使用正确的权限重新授权

屏幕截图问题

错误:“启动浏览器失败”

# Install Chromium
sudo apt-get install chromium-browser

# If on WSL, you may need:
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
export PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser

错误:“页面加载超时”

  • 增加代码或使用的超时时间 delay_ms 参数
  • 检查本地主机服务器是否正在运行
  • 验证URL是否可访问

API费率限制

LinkedIn有费率限制:

  • 帖子:每天100
  • API调用:因端点而异

服务器实施速率限制,并将抛出 RateLimitError 当超过。

内存问题

如果浏览器实例未被清理:

// The server automatically cleans up, but you can force cleanup
import { puppeteerService } from './src/screenshots/puppeteer-service.js';
await puppeteerService.cleanup();

发展

项目结构

linkedin-mcpserver/
├── src/
│   ├── index.ts                 # MCP server entry point
│   ├── config.ts               # Configuration management
│   ├── linkedin/               # LinkedIn API integration
│   │   ├── auth.ts
│   │   ├── client.ts
│   │   ├── posts.ts
│   │   ├── media.ts
│   │   └── types.ts
│   ├── project-analysis/       # Project analysis & AI
│   │   ├── file-reader.ts
│   │   ├── git-analyzer.ts
│   │   ├── content-generator.ts
│   │   ├── context-builder.ts
│   │   └── ai-providers/
│   ├── screenshots/            # Screenshot system
│   │   ├── capturer.ts
│   │   ├── puppeteer-service.ts
│   │   ├── code-formatter.ts
│   │   ├── image-processor.ts
│   │   └── types.ts
│   ├── tools/                  # MCP tools
│   │   ├── analyze-project.ts
│   │   ├── create-post.ts
│   │   ├── capture-screenshot.ts
│   │   └── ...
│   └── utils/                  # Utilities
│       ├── logger.ts
│       ├── error-handler.ts
│       └── rate-limiter.ts
├── .env.example
├── package.json
├── tsconfig.json
└── README.md

运行测试

bun test

建筑

bun run build

安全考虑

  • 永不承诺 .env 文件 有证书
  • 验证所有输入 在发布到LinkedIn之前
  • 小心截图 -不要捕获敏感数据
  • 使用审批工作流 对于重要职位
  • 监控API使用情况 避免利率限制
  • 审查生成的内容 发布前

速率限制

领英API限制:

  • 帖子:每天100条
  • 简介上写着:更宽容
  • 分析:每小时有限

服务器实施速率限制以防止超过这些限制。

贡献

欢迎投稿!拜托:

  1. 分叉存储库
  2. 创建要素分支
  3. 进行更改
  4. 如果适用,添加测试
  5. 提交拉取请求

许可证

MIT许可证-有关详细信息,请参阅许可证文件

支持

对于问题和疑问:

  • GitHub问题:[您的仓库问题页面]
  • 文档:此自述文件
  • LinkedIn API文档:https://docs.microsoft.com/en-us/linkedin/

致谢


快乐发帖! 🚀