内容
# mcp-linkedin
**MCP 服务器,暴露一组 Firestore 工具,用于 AI 助手。**
允许 Claude(或任何与 [模型上下文协议](https://modelcontextprotocol.io/) 兼容的客户端)直接在 Firestore 上读取和写入 LinkedIn 帖子建议:列出、搜索、创建批次、编辑和删除 — 无需离开对话。
这是为我开发的 CRM 构建的,其中内容流存在于 Web 应用程序和聊天之间。现在,助手提出帖子建议,并保存在团队审查的同一个位置。
```
Claude ──stdio──► MCP 服务器 ──Admin SDK──► Firestore
(6 tools) posts_linkedin
```
---
## 工具列表
### 读取
| 工具 | 功能 |
|---|---|
| `listar_posts_linkedin` | 列出帖子,按状态筛选,并搜索复制或描述中的文本。按发布时间排序并限制结果。 |
| `get_post_linkedin` | 通过文档 ID 显示帖子的完整详细信息。 |
### 写入
| 工具 | 功能 |
|---|---|
| `crear_post_linkedin` | 创建帖子建议。除非另有说明,否则默认为草稿。 |
| `proponer_posts_linkedin` | 创建多个帖子建议,以生成一批内容。 |
| `actualizar_post_linkedin` | 编辑现有帖子。仅修改发送的字段;其他字段保持不变。 |
| `eliminar_post_linkedin` | 删除帖子。需要 `confirmar: true` 作为明确的保护措施。 |
每个帖子都支持**幻灯片脚本**:一个视觉简报,按幻灯片逐一呈现,用于设计。服务器标准化接收到的脚本 — 丢弃没有描述的幻灯片,截断字符串并重新编号 — 以便助手无需担心格式。
---
## 设计决策
**写入工具不处理视觉内容。** 由助手创建的帖子不附带任何附件;图像将从 Web 应用程序上传。在读取时,视觉内容的 **URL** 作为文本返回,而不下载二进制文件。这使得响应保持轻量,并避免在设计为文本的通道中包含文件。
**幻灯片顺序由服务器分配,而不是输入。** 顺序来自数组中的位置。这减少了模型可能混淆的参数数量,并且脚本始终保持一致。
**`eliminar` 需要明确确认。** 当工具调用者是模型时,由于模糊指令而意外删除的风险是真实的。`confirmar` 参数需要有意的步骤。
**Zod 架构在每个字段中使用 `.describe()`。** 这些描述是模型读取以决定如何调用工具的内容。文档不佳的架构会导致调用格式不正确:`.describe()` 不是注释,而是接口。
**Firestore 时间戳序列化为 ISO 8601** 后返回。`Timestamp` 对象不是有效的 JSON,模型不知道如何解释它。
---
## 要求
- Node.js 18 或更高版本
- 具有 Firestore 的 Firebase 项目
- 具有 Firestore 权限的服务帐户
## 安装
```bash
git clone https://github.com/mau-f/mcp-linkedin.git
cd mcp-linkedin
npm install
```
### 凭证
1. Firebase 控制台 → **项目设置** → **服务帐户** → *生成新的私钥*
2. 将文件另存为 `serviceAccountKey.json`,位于项目根目录下
> ⚠️ 此文件提供对您的 Firebase 项目的完全管理访问权限。它被添加到 `.gitignore` 中 — **切勿将其推送到存储库中**。
或者,将 `SERVICE_ACCOUNT_PATH` 环境变量指向其位置。
### 配置
| 变量 | 默认值 | 描述 |
|---|---|---|
| `SERVICE_ACCOUNT_PATH` | `./serviceAccountKey.json` | 服务帐户 JSON 文件的路径 |
| `FIRESTORE_COLLECTION` | `posts_linkedin` | 要公开的 Firestore 集合 |
---
## 连接到 Claude
在客户端的 MCP 配置中添加以下内容(在 Claude Desktop 中为 `claude_desktop_config.json`):
```json
{
"mcpServers": {
"linkedin-posts": {
"command": "node",
"args": ["/ruta/absoluta/a/mcp-linkedin/index.js"],
"env": {
"SERVICE_ACCOUNT_PATH": "/ruta/absoluta/a/serviceAccountKey.json",
"FIRESTORE_COLLECTION": "posts_linkedin"
}
}
}
}
```
重启客户端。六个工具应该都可用了。
---
## 文档结构
```js
{
copy: string, // 帖子文本
descripcion: string, // 内部描述
guion_slides: [ // 设计的视觉简报
{ orden: number, titulo: string | null, descripcion: string }
],
contenido_visual: [ // 从 Web 应用程序填写
{ nombre: string, tipo: string, url: string }
],
estado: 'borrador' | 'programado' | 'publicado',
fecha_publicacion: string | null, // yyyy-mm-dd
url_publicado: string | null,
notas: string | null,
creado_en: Timestamp,
actualizado_en: Timestamp
}
```
---
## 技术栈
`Node.js` · `@modelcontextprotocol/sdk` · `firebase-admin` · `zod`
## 许可证
MIT
---
**Mauricio Flores Correa** · [LinkedIn](https://linkedin.com/in/mau-f) · mauricioignacio.1@gmail.com