关于 LeetCode MCP Server
LeetCode MCP Server 将 LeetCode 问题、竞赛、解答和用户数据提供给 MCP 客户端,适用于算法练习与进度管理。支持 leetcode.com 和 leetcode.cn,并可通过会话凭据访问个人功能。
主要功能
- 01查询题目详情与每日挑战
- 02按标签、难度和关键词搜索
- 03获取用户资料与竞赛数据
- 04分析提交并管理题单和笔记
- 05运行及提交代码
适用场景
- 01查找特定主题或难度的练习题
- 02查看每日挑战及官方题解
- 03跟踪个人解题进度和提交记录
- 04提交代码并分析运行结果
MCP 相关
作为 MCP 服务,可通过 stdio 或 Streamable HTTP 接入 MCP 客户端,并提供题目、用户、提交、笔记及题单等工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
LeetCode MCP 服务
LeetCode MCP 服务是一个 Model Context Protocol (MCP) 服务,可与 LeetCode API 无缝集成,从而实现对 LeetCode 编程题、竞赛、题解和用户数据的高级自动化与智能交互。
功能特性
- 🌐 多站点支持:支持 leetcode.com(全球站)和 leetcode.cn(中国站)
- 🔌 双传输模式:可作为 stdio 进程(默认)运行,也可作为 Streamable HTTP 服务运行,用于 Web 集成
- 📊 题目数据获取:获取详细的题目描述、限制条件、示例、官方题解和用户提交的解答
- 👤 用户数据访问:获取用户资料、提交历史和竞赛表现
- 🔒 私有数据访问:创建和查询用户笔记、管理题目列表、跟踪解题进度,以及分析提交详情(AC/WA 分析)
- 🔍 高级搜索功能:按标签、难度、类别和关键词筛选题目
- 📅 每日挑战访问:轻松获取每日挑战题目
前置条件
- Node.js(v20.x 或更高版本)
- (可选)用于通过身份验证访问 API 的 LeetCode 会话 Cookie
安装
# Install from npm
npm install @jinzcdev/leetcode-mcp-server -g
# Run with Global site configuration (stdio transport, default)
npx -y @jinzcdev/leetcode-mcp-server --site global
# Run with authentication (for accessing private data)
npx -y @jinzcdev/leetcode-mcp-server --site global --session <YOUR_LEETCODE_SESSION_COOKIE>
# Run as a Streamable HTTP server
npx -y @jinzcdev/leetcode-mcp-server --transport http --port 3000 --site global
或者,你也可以克隆仓库并在本地运行:
# Clone the repository
git clone https://github.com/jinzcdev/leetcode-mcp-server.git
# Navigate to the project directory
cd leetcode-mcp-server
# Build the project
npm install && npm run build
# Run the server (stdio transport)
node build/index.js --site global
# Or run as a Streamable HTTP server
node build/index.js --transport http --port 3000 --site global
使用方法
该服务支持两种传输模式:
| 传输方式 | 说明 |
|---|---|
stdio(默认) | 用于本地 MCP 客户端的标准输入/输出传输 |
http | 用于 Web 集成和远程访问的 Streamable HTTP 传输 |
命令行选项
| 选项 | 别名 | 默认值 | 说明 |
|---|---|---|---|
--site | -s | global | LeetCode API 站点:global(leetcode.com)或 cn(leetcode.cn) |
--session | -c | — | 用于经过身份验证的请求的 LeetCode 会话 Cookie |
--transport | -t | stdio | 传输模式:stdio 或 http |
--port | — | 3000 | HTTP 服务端口(仅限 Streamable HTTP) |
--host | — | 127.0.0.1 | HTTP 服务主机(仅限 Streamable HTTP) |
--endpoint | — | /mcp | HTTP 端点路径(仅限 Streamable HTTP) |
MCP 客户端配置(stdio)
将以下服务条目添加到 MCP 客户端配置文件中:
选项 1:使用环境变量
{
"mcpServers": {
"leetcode": {
"command": "npx",
"args": ["-y", "@jinzcdev/leetcode-mcp-server"],
"env": {
"LEETCODE_SITE": "global",
"LEETCODE_SESSION": "<YOUR_LEETCODE_SESSION_COOKIE>"
}
}
}
}
选项 2:使用命令行参数
{
"mcpServers": {
"leetcode": {
"command": "npx",
"args": [
"-y",
"@jinzcdev/leetcode-mcp-server",
"--site",
"global",
"--session",
"<YOUR_LEETCODE_SESSION_COOKIE>"
]
}
}
}
对于 LeetCode 中国站点,将 --site 参数改为 cn。
说明
确切的配置文件位置和 JSON 结构可能因 MCP 客户端而异。有些客户端使用
mcp.servers封装或type字段,请参阅客户端文档并相应调整示例。
MCP 客户端配置(Streamable HTTP)
首先,以 HTTP 模式启动服务:
npx -y @jinzcdev/leetcode-mcp-server --transport http --port 3000 --site global
然后将 MCP 客户端连接到正在运行的服务:
{
"mcpServers": {
"leetcode": {
"type": "http",
"url": "http://127.0.0.1:3000/mcp"
}
}
}
若要使用需要身份验证的端点,请在启动服务时传入会话 Cookie:
npx -y @jinzcdev/leetcode-mcp-server --transport http --port 3000 --site global --session <YOUR_LEETCODE_SESSION_COOKIE>
说明
有些 MCP 客户端会在
url字段旁使用"type": "http"或"type": "streamableHttp"。有关确切的 HTTP 传输配置格式,请参阅客户端文档。
提示
服务支持以下可选环境变量:
LEETCODE_SITE:LeetCode API 端点(global或cn,默认值:global)LEETCODE_SESSION:用于访问需要身份验证的 API 的 LeetCode 会话 Cookie(默认值:空)LEETCODE_TRANSPORT:传输模式(stdio或http,默认值:stdio)LEETCODE_HTTP_PORT:使用 Streamable HTTP 时的 HTTP 服务端口(默认值:3000)LEETCODE_HTTP_HOST:使用 Streamable HTTP 时的 HTTP 服务主机(默认值:127.0.0.1)LEETCODE_HTTP_ENDPOINT:使用 Streamable HTTP 时的 HTTP 端点路径(默认值:/mcp)优先级说明: 同时指定命令行参数和环境变量时,命令行参数优先。例如:
- 如果设置了
LEETCODE_SITE=cn,但运行leetcode-mcp-server --site global,服务将使用global。- 如果设置了
LEETCODE_SESSION,但提供了--session "new_cookie",则会使用命令行中的会话值。
可用工具
题目
| 工具 | Global | CN | 需要身份验证 | 描述 |
|---|---|---|---|---|
| get_daily_challenge | ✅ | ✅ | ❌ | 获取 LeetCode 今日每日挑战题目 |
| get_problem | ✅ | ✅ | ❌ | 获取指定 LeetCode 题目的详细信息 |
| search_problems | ✅ | ✅ | ❌ | 根据多个筛选条件搜索 LeetCode 题目 |
用户
| 工具 | Global | CN | 需要身份验证 | 描述 |
|---|---|---|---|---|
| get_user_profile | ✅ | ✅ | ❌ | 获取 LeetCode 用户的个人资料信息 |
| get_user_contest_ranking | ✅ | ✅ | ❌ | 获取用户的竞赛排名统计数据 |
| get_recent_ac_submissions | ✅ | ✅ | ❌ | 获取用户最近通过的提交记录 |
| get_recent_submissions | ✅ | ❌ | ❌ | 获取用户最近的提交历史 |
| get_user_status | ✅ | ✅ | ✅ | 获取当前用户的当前状态 |
| get_problem_submission_report | ✅ | ✅ | ✅ | 提供指定题目的详细提交分析 |
| get_problem_progress | ✅ | ✅ | ✅ | 获取当前用户的解题进度 |
| get_all_submissions | ✅ | ✅ | ✅ | 获取当前用户的提交历史 |
提交
| 工具 | Global | CN | Auth Required | 描述 |
|---|---|---|---|---|
| run_code | ✅ | ✅ | ✅ | 运行题目的代码,并轮询 /check/,直至完成 |
| submit_solution | ✅ | ✅ | ✅ | 提交题目的代码,并轮询 /check/,直至完成 |
笔记
| 工具 | Global | CN | Auth Required | 描述 |
|---|---|---|---|---|
| search_notes | ❌ | ✅ | ✅ | 根据筛选条件搜索用户笔记 |
| get_note | ❌ | ✅ | ✅ | 根据题目 ID 获取特定题目的笔记 |
| create_note | ❌ | ✅ | ✅ | 为特定题目创建新笔记 |
| update_note | ❌ | ✅ | ✅ | 使用新内容更新现有笔记 |
题目列表
| 工具 | Global | CN | Auth Required | 描述 |
|---|---|---|---|---|
| list_problem_lists | ✅ | ✅ | ✅ | 列出当前用户的题目列表(收藏夹) |
| get_problem_list | ✅ | ✅ | ✅ | 获取题目列表的元数据及其中的题目 |
| create_problem_list | ✅ | ✅ | ✅ | 创建题目列表,可选择添加初始题目 |
| update_problem_list | ✅ | ✅ | ✅ | 重命名题目列表、编辑其描述或可见性 |
| add_problems_to_list | ✅ | ✅ | ✅ | 根据 slug 或题号将题目添加到题目列表 |
| remove_problems_from_list | ✅ | ✅ | ✅ | 从题目列表中移除题目 |
| reorder_problem_list | ✅ | ✅ | ✅ | 重新排列题目列表中的题目 |
题解
| 工具 | Global | CN | Auth Required | 描述 |
|---|---|---|---|---|
| list_problem_solutions | ✅ | ✅ | ❌ | 获取特定题目的社区题解列表 |
| get_problem_solution | ✅ | ✅ | ❌ | 获取特定题解的完整内容 |
工具参数
题目
-
get_daily_challenge - 获取今天的 LeetCode 每日挑战题目及其完整详情
- 无需参数
-
get_problem - 获取特定 LeetCode 题目的详情
titleSlug:题目的 URL slug/标识符(字符串,必需)
-
search_problems - 根据多个筛选条件搜索 LeetCode 题目
category:题目类别筛选条件(字符串,可选,默认值:"all-code-essentials")tags:用于筛选题目的主题标签列表(字符串数组,可选)difficulty:题目难度筛选条件(枚举:"EASY"、"MEDIUM"、"HARD",可选)searchKeywords:在题目标题和描述中搜索的关键词(字符串,可选)limit:要返回的题目数量上限(数字,可选,默认值:10)offset:要跳过的题目数量(数字,可选)
用户
-
get_user_profile - 获取 LeetCode 用户的个人资料信息
username:LeetCode 用户名(字符串,必填)
-
get_user_contest_ranking - 获取用户的竞赛排名信息
username:LeetCode 用户名(字符串,必填)attended:是否仅包含用户参加过的竞赛(布尔值,可选,默认值:true)
-
get_recent_submissions - 获取用户在 LeetCode Global 上的近期提交记录
username:LeetCode 用户名(字符串,必填)limit:要返回的提交记录的最大数量(数字,可选,默认值:10)
-
get_recent_ac_submissions - 获取用户近期的通过提交记录
username:LeetCode 用户名(字符串,必填)limit:要返回的提交记录的最大数量(数字,可选,默认值:10)
-
get_user_status - 获取当前用户的状态
- 无需参数
-
get_problem_submission_report - 获取特定提交的详细信息
id:数字型提交 ID(数字,必填)
-
get_problem_progress - 获取当前用户的解题进度
offset:要跳过的问题数量(数字,可选,默认值:0)limit:要返回的问题数量上限(数字,可选,默认值:100)questionStatus:按问题状态筛选(枚举:"ATTEMPTED"、"SOLVED",可选)difficulty:按难度等级筛选(字符串数组,可选)
-
get_all_submissions - 获取用户提交记录的分页列表
limit:要返回的提交记录数量上限(数字,默认值:20)offset:要跳过的提交记录数量(数字,默认值:0)questionSlug:可选的问题标识符(字符串,可选)lang:编程语言筛选条件(字符串,可选,仅限 CN)status:提交状态筛选条件(枚举:"AC"、"WA",可选,仅限 CN)lastKey:用于获取下一页的分页令牌(字符串,可选,仅限 CN)
提交
-
run_code - 运行特定问题的代码并等待运行完成(需要身份验证)
titleSlug:问题的 URL 别名/标识符(字符串,必填)lang:编程语言(字符串枚举,必填)typedCode:要运行的源代码(字符串,必填)dataInput:要运行的自定义输入(字符串,可选)timeoutMs:轮询超时时间(毫秒)(数字,可选,默认值:120000)pollIntervalMs:轮询间隔(毫秒)(数字,可选,默认值:1500)
-
submit_solution - 提交特定问题的代码并等待处理完成(需要身份验证)
titleSlug:问题的 URL 别名/标识符(字符串,必填)lang:编程语言(字符串枚举,必填)typedCode:要提交的源代码(字符串,必填)timeoutMs:轮询超时时间(毫秒)(数字,可选,默认值:120000)pollIntervalMs:轮询间隔(毫秒)(数字,可选,默认值:1500)
备注
-
search_notes - 搜索用户在 LeetCode 中国站的笔记
keyword:用于筛选笔记的搜索词(字符串,可选)limit:返回笔记的最大数量(数字,可选,默认值:10)skip:跳过的笔记数量(数字,可选,默认值:0)orderBy:返回笔记的排序顺序(枚举:“ASCENDING”、“DESCENDING”,可选,默认值:“DESCENDING”)
-
get_note - 获取用户针对特定 LeetCode 题目的笔记
questionId:LeetCode 题目的 ID(字符串,必填)limit:返回笔记的最大数量(数字,可选,默认值:10)skip:跳过的笔记数量(数字,可选,默认值:0)
-
create_note - 为特定 LeetCode 题目创建新笔记
questionId:LeetCode 题目的 ID(字符串,必填)content:笔记内容,支持 Markdown 格式(字符串,必填)summary:笔记的可选简短摘要或标题(字符串,可选)
-
update_note - 使用新内容或摘要更新现有笔记
noteId:要更新的笔记 ID(字符串,必填)content:笔记的新内容,支持 Markdown 格式(字符串,必填)summary:笔记的可选新简短摘要或标题(字符串,可选)
题目列表
题目列表由其 favoriteSlug 标识,即列表 URL 中 /problem-list/ 后面的路径片段。
-
list_problem_lists - 列出当前用户的题目列表
includeCollected:同时返回从其他创建者处收藏的列表(布尔值,可选,默认值:false)
-
get_problem_list - 获取题目列表的元数据和一页题目
favoriteSlug:题目列表的 slug(字符串,必填)limit:要返回的题目数量上限(数字,可选,默认值:50)skip:要跳过的题目数量(数字,可选,默认值:0)searchKeyword:按标题筛选题目的关键词(字符串,可选)sortField:排序字段:CUSTOM(网站上显示的顺序)、FRONTEND_ID、DIFFICULTY、AC_RATE、FREQUENCY或CONTEST_POINT(字符串,可选,默认值:CUSTOM)sortOrder:ASCENDING或DESCENDING(字符串,可选,默认值:ASCENDING)
-
create_problem_list - 创建新的题目列表
name:列表的显示名称(字符串,必填)description:描述列表(字符串,可选,默认值:"")isPublic:列表是否公开可见(布尔值,可选,默认值:false)questionSlugs:创建后立即添加的题目 slug(字符串数组,可选)questionIds:创建后立即添加的题目编号,例如[1, 1143];无法解析的编号会在unresolved中返回((字符串 | 数字)[],可选)
-
update_problem_list - 重命名题目列表、更改其描述或切换其可见性(至少需要提供一个可选字段)
favoriteSlug:题目列表的 slug(字符串,必填)name:新的显示名称(字符串,可选)description:新的描述(字符串,可选)isPublic:新的可见性(布尔值,可选)
-
add_problems_to_list - 向题目列表添加题目(必须提供
questionSlugs/questionIds中的至少一个;题目将按给定顺序追加,slug 优先)favoriteSlug:题目列表的 slug(字符串,必填)questionSlugs:要添加的题目 slug,例如["two-sum"](字符串数组,可选)questionIds:要添加的题目编号,例如[1, 1143]或["LCP 82"];无法解析的编号会在unresolved中返回((字符串 | 数字)[],可选)
-
remove_problems_from_list - 从题目列表中移除题目
favoriteSlug:题目列表的 slug(字符串,必填)questionSlugs:要移除的题目 slug(字符串数组,必填)
-
reorder_problem_list - 调整题目列表中的题目顺序(必须且只能提供
sortField/questionSlugs中的一个;每次请求移动一道题)favoriteSlug:题目列表的 slug(字符串,必填)sortField:按FRONTEND_ID、DIFFICULTY、AC_RATE、FREQUENCY或CONTEST_POINT对整个列表排序(字符串,可选)sortOrder:ASCENDING或DESCENDING(字符串,可选,默认值:ASCENDING)questionSlugs:按此顺序移至顶部的题目 slug;其余题目保持相对顺序不变(字符串数组,可选)
解决方案
-
list_problem_solutions - 获取特定题目的社区解决方案列表
questionSlug:题目的 URL 别名/标识符(字符串,必填)limit:要返回的解决方案数量上限(数字,可选,默认值:10)skip:要跳过的解决方案数量(数字,可选)userInput:用于筛选解决方案的搜索词(字符串,可选)tagSlugs:用于筛选解决方案的标签标识符数组(字符串[],可选,默认值:[])orderBy:返回的解决方案的排序条件- Global:枚举:"HOT"、"MOST_RECENT"、"MOST_VOTES",可选,默认值:"HOT"
- CN:枚举:"DEFAULT"、"MOST_UPVOTE"、"HOT"、"NEWEST_TO_OLDEST"、"OLDEST_TO_NEWEST",可选,默认值:"DEFAULT"
-
get_problem_solution - 获取特定解决方案的完整内容
topicId:解决方案的唯一主题 ID(字符串,必填,仅限 Global)slug:解决方案的唯一别名/标识符(字符串,必填,仅限 CN)
可用资源
| 资源名称 | Global | CN | 需要身份验证 | 说明 |
|---|---|---|---|---|
| problem-categories | ✅ | ✅ | ❌ | 所有题目分类类别的列表 |
| problem-tags | ✅ | ✅ | ❌ | 算法和数据结构标签的详细集合 |
| problem-langs | ✅ | ✅ | ❌ | 所有受支持编程语言的完整列表 |
| problem-detail | ✅ | ✅ | ❌ | 提供特定题目的详情 |
| problem-solution | ✅ | ✅ | ❌ | 提供特定解决方案的完整内容 |
资源 URI
-
problem-categories - 所有题目分类类别的列表
- URI:
categories://problems/all
- URI:
-
problem-tags - 算法和数据结构标签的详细集合
- URI:
tags://problems/all
- URI:
-
problem-langs - LeetCode 支持的所有编程语言的完整列表
- URI:
langs://problems/all
- URI:
-
problem-detail - 提供特定 LeetCode 题目的详情
- URI:
problem://{titleSlug} - 参数:
titleSlug:LeetCode URL 中显示的题目标识符
- URI:
-
problem-solution - 提供特定解决方案的完整内容
- Global URI:
solution://{topicId}- 参数:
topicId:解决方案的唯一主题 ID
- 参数:
- CN URI:
solution://{slug}- 参数:
slug:解决方案的唯一别名/标识符
- 参数:
- Global URI:
身份验证
访问用户专属数据需要通过 LeetCode 会话进行身份验证:
- 登录 LeetCode(Global 或 China 站点)
- 从浏览器开发者工具中提取
LEETCODE_SESSIONCookie - 使用
--session标志或LEETCODE_SESSION环境变量配置服务
响应格式
所有工具均返回 JSON 格式的响应,结构如下:
{
"content": [
{
"type": "text",
"text": "JSON_DATA_STRING"
}
]
}
JSON_DATA_STRING 包含请求的数据,或请求失败时的错误消息。
许可证
本项目采用 MIT 许可证。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。