掘金 MCP 服务
这是一个基于 Spring AI MCP 框架的掘金文章发布服务,可以通过 MCP 协议调用掘金API发布文章。
功能特性
- ✅ 创建文章草稿
- ✅ 更新文章内容
- ✅ 发布文章到掘金
- ✅ 支持 Markdown 格式
- ✅ 自动生成文章摘要
- ✅ 支持设置分类和标签
- ✅ 完整的错误处理
项目结构
src/main/java/com/codespace/mcp/server/juejin/
├── domain/ # 领域层
│ ├── model/ # 领域模型
│ │ ├── ArticleFunctionRequest.java # 文章请求参数
│ │ └── ArticleFunctionResponse.java # 文章响应结果
│ ├── service/ # 领域服务
│ │ └── JuejinArticleService.java # 掘金文章服务
│ └── adapter/ # 端口接口
│ └── IJuejinPort.java # 掘金服务端口
├── infrastructure/ # 基础设施层
│ ├── gateway/ # 网关
│ │ ├── dto/ # 数据传输对象
│ │ ├── ICreateArticleService.java # 创建文章接口
│ │ ├── IUpdateArticleService.java # 更新文章接口
│ │ └── IPushArticleService.java # 发布文章接口
│ └── adapter/ # 适配器实现
│ └── JuejinAdapter.java # MCP服务适配器
├── types/ # 类型定义
│ └── properties/ # 配置属性
│ └── JuejinApiProperties.java # API配置
└── McpServerApplication.java # 主应用类MCP工具说明
juejinWriteArticle
发布文章到掘金平台,支持创建草稿和直接发布。
请求参数 (ArticleFunctionRequest)
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| title | String | 是 | 文章标题 |
| content | String | 是 | 文章内容(Markdown格式) |
| categoryId | String | 否 | 分类ID,默认"6809637769959178254"(后端) |
| tagIds | List | 否 | 标签ID列表 |
| coverImage | String | 否 | 封面图片URL |
| isOriginal | Integer | 否 | 是否原创,默认1 |
| briefContent | String | 否 | 文章摘要,不填自动提取 |
| publish | Boolean | 否 | 是否立即发布,默认false |
响应结果 (ArticleFunctionResponse)
| 字段名 | 类型 | 说明 |
|---|---|---|
| success | boolean | 操作是否成功 |
| articleId | String | 文章ID(草稿ID或正式ID) |
| message | String | 返回消息 |
| errorCode | Integer | 错误码 |
| articleUrl | String | 文章URL(如果已发布) |
| status | String | 操作状态:draft/published/failed |
使用方法
1. 配置认证信息
修改 application.yml 文件,配置掘金的Cookie和CSRF Token:
juejin:
api:
test-cookie: "你的Cookie值"
csrf-token: "你的CSRF Token值"获取Cookie和CSRF Token的方法:
- 打开浏览器,访问 https://juejin.cn
- 按 F12 打开开发者工具
- 切换到 Network 标签页
- 刷新页面,找到任意一个请求
- 在请求头中找到:
- Cookie 字段的值 - x-secsdk-csrf-token 字段的值
- 复制这两个值到配置文件中
2. 启动服务
mvn spring-boot:run3. 通过MCP调用
服务启动后,会自动注册为MCP工具 juejinWriteArticle,可以通过MCP客户端调用。
示例1:创建草稿
{
"title": "Java设计模式详解",
"content": "# Java设计模式\n\n## 单例模式\n\n单例模式确保一个类只有一个实例...",
"categoryId": "6809637769959178254",
"tagIds": ["6809640408797167623"],
"publish": false
}示例2:直接发布
{
"title": "Spring Boot最佳实践",
"content": "# Spring Boot最佳实践\n\n## 1. 配置管理...",
"categoryId": "6809637769959178254",
"tagIds": ["6809640408797167623"],
"isOriginal": 1,
"publish": true
}4. 运行测试
# 测试MCP服务
mvn test -Dtest=McpServiceTest
# 测试底层API
mvn test -Dtest=ApiTest常用分类和标签ID
分类ID
- 后端:6809637769959178254
- 前端:6809637767543259144
- Android:6809635626879549454
- iOS:6809635626661445640
- 人工智能:6809637773935378440
标签ID(示例)
- Java:6809640408797167623
- Spring:6809640398105870343
- MySQL:6809640407038836743
- Redis:6809640407307198472
*注:完整的分类和标签ID请访问掘金网站获取*
注意事项
- Cookie过期:Cookie通常会在一段时间后过期,需要定期更新配置文件中的Cookie和CSRF Token
- 请求限制:掘金对API有频率限制,建议不要频繁调用
- 内容格式:文章内容使用Markdown格式编写
- 图片上传:目前不支持自动上传图片,需要使用外链图片URL
- 草稿保存:建议先保存为草稿(publish=false),确认无误后再发布
工作流程
- 创建草稿:调用创建文章接口,生成草稿ID
- 更新内容:使用草稿ID更新文章完整内容
- 发布文章:将草稿发布为正式文章(可选)
服务内部会自动完成这三个步骤,你只需要调用一次 juejinWriteArticle 工具即可。
错误处理
服务会返回详细的错误信息:
success=false:操作失败errorCode=2:参数错误,通常是Cookie过期或参数格式不正确status=failed:发布失败status=draft:仅保存为草稿status=published:成功发布
技术栈
- Spring Boot 3.4.3
- Spring AI MCP
- Retrofit 2.9.0
- OkHttp 4.10.0
- Jackson
- Lombok
License
MIT License
Prompt
"我需要你帮我发布一篇文章到juejin,文章根据以下场景生成,注意生成的文章内容都是UTF-8编码格式:\r\n" + // "场景:互联网大厂 Java 求职者面试。请生成一篇技术面试形式的文章,包含面试对话与详尽答案,便于初学者学习。\r\n" + // "技术栈(必须覆盖并在文章中体现若干要点):Java SE (8/11/17), JVM 原理, Spring Boot, Spring MVC/WebFlux, Maven/Gradle, Hibernate/MyBatis/JPA, Kafka/RabbitMQ, Redis, 微服务(Spring Cloud/Feign/Resilience4j), 安全(Spring Security/JWT), 测试(JUnit Mockito), Docker/K8s, 性能与监控(Prometheus/Grafana),以及序列化(Jackson/Protobuf)。\r\n" + // "业务场景(可任选若干并结合问题):内容社区/UGC、音视频、AIGC、在线教育、支付/金融、推荐/广告、物联网 等。题目须与所选场景有业务联结。\r\n" + // "角色设定:严肃的面试官 VS 搞笑但有基础的程序员“谢飞机”。谢飞机对简单题能回答且被面试官适当表扬与引导;复杂题回答含糊或不完整,面试官给出专业引导或补充。\r\n" + // "结构与要求:\r\n" + // "按“对话故事”写作风格,先简短交代场景与角色。\r\n" + // "\r\n" + // " 进行 3 轮面试,每轮 3–5 个问题。问题需有技术与业务上的衔接,逐步深入(从基础到设计/实现/权衡/故障排查)。\r\n" + // "\r\n" + // " 每个问题呈现:面试官提问 → 谢飞机回答(可有幽默插句)→ 面试官点评与引导(指出要点、补充正确答案)。\r\n" + // "\r\n" + // " 在文章末尾单独列出“问题与详细答案(逐条)”,包含每题的业务背景、关键技术点、示例代码/伪代码或命令、设计权衡与面试要点,便于小白学习复现。答案要清晰、技术可执行、覆盖面试官点评中的所有要点。\r\n" + // "\r\n" + // " 语言为中文,技术细节准确、术语规范,不输出与文章无关的信息。\r\n" + // "\r\n" + // " 输出: title: \r\n" + // "\r\n" + // " mark_content: \r\n" + // "\r\n" + // " brief_content: \r\n" + // "\r\n" + // " 最后一步:将以上内容发布文章到 juejin(调用发布接口时请将 title、mark_conten、brief_content填入对应字段,并发布。"
使用
"mcp-server-juejin": {
"command": "C:\\Program Files\\Java\\jdk-17\\bin\\java.exe",
"args": [
"-Dfile.encoding=utf-8",
"-Dspring.ai.mcp.server.stdio=true",
"-jar",
"你自己jar包的位置"
]
}