Skip to main content
Glama
README.md
# LeetCode CN MCP

一个面向 `leetcode.cn` 的安全、只读 MCP 服务,支持:

- 未登录或 Cookie 过期时,通过本机安全页面引导登录并保存到系统钥匙串。
- 根据题号、中文/英文标题、`titleSlug` 或题目 URL 获取题目信息。
- 获取当前用户某个自然日的全部提交记录;默认查询上海时区当天。

> LeetCode 没有为这些能力提供公开、稳定的官方 API。本项目调用中国站前端正在使用的
> GraphQL/REST 接口,接口变化时可能需要升级本项目。

## 环境

- Python 3.12+
- 推荐使用 [uv](https://docs.astral.sh/uv/)

## 本地安装

```bash
uv sync --extra dev
```

直接通过 stdio 启动 MCP 服务:

```bash
uv run leetcode-mcp
```

用于 MCP 客户端的配置示例:

```json
{
  "mcpServers": {
    "leetcode-cn": {
      "command": "uv",
      "args": [
        "run",
        "--directory",
        "/absolute/path/to/leetcode-mcp",
        "leetcode-mcp"
      ]
    }
  }
}
```

## 登录

提交记录需要当前账号的登录 Cookie。推荐方式:

```bash
uv run leetcode-mcp auth login
```

命令会打开一个仅监听 `127.0.0.1` 的一次性页面。用户只需粘贴浏览器请求中的完整
`Cookie` 字符串。服务会自行提取 `LEETCODE_SESSION` 和 `csrftoken`,丢弃其余 Cookie,
验证账号后将两个必要值保存到:

- macOS Keychain
- Windows Credential Locker
- Linux Secret Service/KWallet

凭证不会作为 MCP 工具参数,不会写入项目文件,也不会进入模型上下文。

检查或删除凭证:

```bash
uv run leetcode-mcp auth status
uv run leetcode-mcp auth logout
```

无系统钥匙串的服务器或 CI 可以使用环境变量作为只读回退:

```bash
export LEETCODE_COOKIE='csrftoken=...; ...; LEETCODE_SESSION=...'
```

仍兼容分别设置 `LEETCODE_SESSION` 和 `LEETCODE_CSRFTOKEN`。

不要将这些值提交到 Git。

## MCP 工具

### `auth_status`

验证当前登录状态,不返回 Cookie。

### `login`

通过 MCP URL elicitation 打开本机安全登录页。若客户端不支持 URL elicitation,使用上面的
`leetcode-mcp auth login` 命令。

### `logout`

删除系统钥匙串中保存的凭证。环境变量不会被修改。

### `get_problem`

参数:

- `query`:题号、标题、slug 或 URL。
- `language`:可选,例如 `python3`、`cpp`、`java`、`typescript`。
- `include_hints`:是否返回提示,默认 `false`。

示例:

```json
{"query":"1","language":"python3"}
```

### `get_submissions_by_date`

参数:

- `date`:可选,`YYYY-MM-DD`;默认今天。
- `timezone`:默认 `Asia/Shanghai`。
- `status`、`language`:可选过滤条件。
- `limit`:单次最多返回数量,范围 1–500,默认 100。
- `cursor`:结果被截断时用于继续分页。

返回所有类型的提交,而不仅是 AC。时间戳会转换成请求指定的时区。

## 开发与验证

```bash
uv run ruff check .
uv run pytest
```

测试默认使用 mock 数据,不需要真实 LeetCode Cookie。真实提交记录集成测试应通过环境变量
显式提供测试账号凭证,且不能在日志或失败快照中输出它们。

## 安全边界

- 服务只绑定本机登录页,不向局域网监听。
- 登录 URL 带 256 位以上的一次性随机 token,并在 10 分钟后失效。
- 登录页禁止外部脚本、iframe、缓存和 referrer。
- 不读取浏览器 Cookie 数据库,不接收 LeetCode 密码。
- 不关闭 TLS 校验,不尝试绕过验证码或站点风控。
- 目前所有 LeetCode 工具均为只读,不运行或提交代码。

TDQS

A3.9/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clear, non-overlapping responsibility: authentication lifecycle (login, logout, auth_status), problem lookup (get_problem), and submission history retrieval (get_submissions_by_date). There is no realistic ambiguity between tool purposes.

Naming Consistency4/5

Most tools follow a readable snake_case pattern with clear verbs and nouns, such as get_problem and get_submissions_by_date. login/logout and auth_status are minor deviations but remain conventional and predictable.

Tool Count5/5

Five tools is well-scoped for a focused LeetCode CN server handling authentication, problem data, and submission history. Each tool earns its place with no redundancy or bloat.

Completeness4/5

Authentication status/login/logout form a complete lifecycle, and problem fetching plus daily submission retrieval cover the core read-only workflows. Minor gaps such as broader problem search or submission detail endpoints are workable but not critical.

Maintenance

ActivityMaintained
ResponsivenessNo issues