Skip to main content
Glama
README.md
# 豆瓣 MCP 服务器

[中文](README.md) | [English](README.en.md)

一个基于 Model Context Protocol (MCP) 的豆瓣数据服务,提供图书、电影、电视剧和小组话题相关查询能力,适合接入 Claude Desktop、Cherry Studio、5ire、MCP Inspector 等支持 stdio 的 MCP 客户端。

## 项目定位

本项目面向“工具调用”场景,而不是完整的豆瓣网页封装。当前重点是提供以下几类能力:

- 图书搜索与图书长评列表
- 电影 / 电视剧搜索
- 电影 / 电视剧详情
- 电影 / 电视剧长评列表
- 豆瓣小组话题列表与话题详情
- 在本地默认浏览器中打开豆瓣图书页面

## 工具总览

当前服务实际注册的 MCP tools 如下:

| Tool | 说明 |
| --- | --- |
| `search-book` | 按关键词或 ISBN 搜索图书 |
| `list-book-reviews` | 获取图书长评列表 |
| `search-movie` | 搜索电影或电视剧 |
| `get-movie-detail` | 获取电影详情 |
| `get-tv-detail` | 获取电视剧详情 |
| `list-movie-reviews` | 获取电影长评列表 |
| `list-tv-reviews` | 获取电视剧长评列表 |
| `browse` | 在默认浏览器打开图书详情页 |
| `list-group-topics` | 获取小组话题列表 |
| `get-group-topic-detail` | 获取小组话题详情 |

## 工具说明

### `search-book`

按关键词或 ISBN 搜索图书。`q` 和 `isbn` 至少需要提供一个。

参数:

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `q` | `string` | 否 | 图书搜索关键词,例如 `三体` |
| `isbn` | `string` | 否 | ISBN 编号,例如 `9787501524044` |

返回特点:

- 返回 Markdown 表格
- 包含出版时间、书名、作者、评分、豆瓣 ID、ISBN

### `list-book-reviews`

获取指定图书的长评列表。

参数:

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `id` | `string` | 是 | 豆瓣图书 ID |

返回特点:

- 返回 Markdown 表格
- 包含标题、评分、摘要、评论 ID

### `search-movie`

搜索电影或电视剧。结果中会同时返回结构化文本摘要和完整 `raw_json`,便于 LLM 二次解析。

参数:

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `q` | `string` | 是 | 电影或电视剧关键词,例如 `霸王别姬`、`绝命毒师` |

返回特点:

- 每个结果包含 `title`、`type`、`year`、`rating`、`subtitle`、`id`、`uri`
- 末尾附带 `raw_json`
- 搜索结果可能同时包含电影和电视剧

### `get-movie-detail`

获取电影详情。

参数:

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `id` | `string` | 是 | 豆瓣电影 ID,例如 `1291546` |

返回特点:

- 返回结构化文本
- 包含标题、原名、年份、类型、评分、类型标签、国家/地区、语言、上映日期、片长、导演、演员、别名、简介
- 末尾附带完整 `raw_json`

### `get-tv-detail`

获取电视剧详情。

参数:

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `id` | `string` | 是 | 豆瓣电视剧 ID,例如 `2995166` |

返回特点:

- 输出结构与 `get-movie-detail` 一致
- 末尾附带完整 `raw_json`

### `list-movie-reviews`

获取电影长评列表。

参数:

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `id` | `string` | 是 | 豆瓣电影 ID |

返回特点:

- 返回 Markdown 表格
- 包含标题、评分、摘要、评论 ID

### `list-tv-reviews`

获取电视剧长评列表。

参数:

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `id` | `string` | 是 | 豆瓣电视剧 ID |

返回特点:

- 返回 Markdown 表格
- 包含标题、评分、摘要、评论 ID

### `browse`

在本机默认浏览器中打开图书详情页。

参数:

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `id` | `string` | 是 | 豆瓣图书 ID |

说明:

- 这是本地动作,不返回网页内容
- 适合在桌面环境中配合 MCP 客户端使用

### `list-group-topics`

获取豆瓣小组话题列表,支持按小组、标签、日期过滤。

参数:

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `id` | `string` | 否 | 豆瓣小组 ID,默认值为 `732764` |
| `tags` | `string[]` | 否 | 标签过滤,例如 `["python"]` |
| `from_date` | `string` | 否 | 起始日期,格式 `YYYY-MM-DD` |

返回特点:

- 返回话题列表
- 适合配合 `get-group-topic-detail` 继续获取单个话题正文

### `get-group-topic-detail`

获取单个豆瓣小组话题详情。

参数:

| 参数 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `id` | `string` | 是 | 豆瓣话题 ID |

返回特点:

- 返回话题详细内容
- 包含正文、摘要及相关元数据

## 输出格式说明

为了兼顾“人读”和“模型读”,当前工具输出主要分为两类:

- 表格型输出:主要用于评论列表和图书搜索,适合直接展示
- 结构化文本输出:主要用于电影 / 电视剧搜索与详情,字段稳定,并保留 `raw_json`

如果你在上层 Agent 中需要更可靠地抽取字段,优先使用带 `raw_json` 的工具输出。

## 使用要求

### 运行环境

- Node.js 18+
- 支持 stdio 的 MCP 客户端
- 能访问豆瓣接口的网络环境

### Cookie

部分接口依赖豆瓣 Cookie。未提供有效 Cookie 时,部分请求可能失败、返回不完整,或触发风控。

当前通过环境变量 `COOKIE` 注入,例如:

```bash
export COOKIE='bid=...; ck=...; dbcl2=...; frodotk_db=...;'
```

## 接入示例

### Claude Desktop / 通用 MCP 配置

```json
{
  "mcpServers": {
    "douban-mcp": {
      "command": "node",
      "args": [
        "/absolute/path/to/douban-mcp/dist/index.js"
      ],
      "env": {
        "COOKIE": "bid=...;ck=...;dbcl2=...;frodotk_db=..."
      }
    }
  }
}
```

## 本地开发

```bash
npm install
npm run build
npm start
```

常用命令:

| 命令 | 说明 |
| --- | --- |
| `npm run build` | 编译 TypeScript 并生成 `dist/` |
| `npm run dev` | 监听编译 |
| `npm start` | 启动 MCP 服务 |

## 测试说明

仓库当前包含一个基于 MCP 客户端直连的集成测试脚本:

```bash
node tests/mcp-tools.mjs
```

注意:

- `package.json` 里仍保留了 `npm test -> jest`
- 当前仓库未看到对应的 Jest 测试配置,实际验证建议优先运行上面的集成脚本

## 已知限制

- 豆瓣接口并非公开稳定官方 MCP 接口,返回结构可能变化
- 依赖 Cookie 和当前可用网络环境
- `browse` 需要桌面环境,不适合纯无头服务器
- README 中列出的能力以当前代码为准,若接口升级请同步更新文档

## 依赖

- [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/sdk)
- [dayjs](https://day.js.org/)
- [json2md](https://github.com/IonicaBizau/json2md)
- [open](https://github.com/sindresorhus/open)
- [turndown](https://github.com/domchristie/turndown)
- [zod](https://github.com/colinhacks/zod)

## 参考资料

- [Model Context Protocol](https://modelcontextprotocol.io/)
- [Douban API Docs Mirror](https://goddlts.github.io/douban-api-docs/)
- [Douban API Documentation](https://www.doubanapi.com/)

## License

MIT

TDQS

C2.6/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a distinct resource and action: books, movies, TV, or group topics. Even though search-movie covers both movies and TV, the separate detail tools clarify the scope. No two tools appear to do the same thing.

Naming Consistency4/5

Most tools follow a consistent verb_noun pattern with hyphen-separated words (search-*, list-*, get-*). The exception is 'browse', which is a bare verb without a named resource, and search-movie implies only movies though it also covers TV. Overall, the pattern is readable and mostly uniform.

Tool Count5/5

With 10 tools, the count is well within the typical range for a domain-specific server. It covers multiple resource types without being bloated, and each tool serves a clear purpose.

Completeness3/5

The set covers search, list, and detail operations for movies/TV and group topics, but lacks a dedicated get-book-detail tool; instead, 'browse' opens a browser, which is a workaround. There are also no mutation operations, but that may be acceptable for a public data server. Missing a get-book-detail is a notable gap.

Maintenance

ActivityInactive
ResponsivenessNo issues