mk-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mk-mcp帮我把这门课学完 https://www.icourse163.org/learn/XXXX?tid=123456"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
📚 mk-mcp
icourse163(mk)课程协议 MCP Server
接入后,agent 一条龙完成:看结构 → 刷任务点 → 逐卷作答 → 讨论回帖 → 核验进度
📦 依赖
依赖 | 要求 |
≥ 18.17(需内置 fetch,建议 20+) | |
本机浏览器 | Chrome 或 Edge 任一( |
npm installRelated MCP server: Coursera MCP
🔧 配置
在 mcpServers 中添加(/path/to/mk-mcp 替换为你本机的克隆路径):
{
"mcpServers": {
"mk-mcp": {
"command": "node",
"args": ["/path/to/mk-mcp/server.mjs"]
}
}
}可选环境变量:
变量 | 默认 | 说明 |
|
| 会话保存位置 |
|
| 站点源 |
|
| 写请求最小间隔 |
🚀 用法
用户只需告诉 agent 要做哪门课(termId 即课程页 URL 里的 tid 参数):
👤 用户:把这门课学完 https://www.icourse163.org/learn/XXXX?tid=XXXXXXXXXX
└─ 🤖 agent 自主完成
① mk_login_start + mk_login_status 首次使用先登录(弹窗手动登录一次,status 轮询到 success)
② mk_list_courses 列出最近课程拿 termId(知道 tid 也可直接给)
③ mk_get_course 看课程结构,拿 courseId / 章节任务点
④ mk_complete_course 批量完成任务点(视频/文档/富文本/讨论)
⑤ mk_submit_quiz 逐卷作答交卷(卷与卷之间隔几十分钟)
⑥ mk_discuss_reply 讨论回帖(内容自己写,每条间隔 ~30s 波动,半天内摊完)
⑦ mk_verify 全部 cp=1 收工任务点类型:1=视频 3=文档 4=富文本 5=测验 6=讨论。
🔑 登录
未登录时,业务工具会报错提示先登录。三步:
① mk_login_start 拉起本机 Chrome/Edge 打开登录页(立即返回)
② (用户在弹出的窗口里完成登录:密码 / 验证码 / 滑块 / 扫码)
③ mk_login_status 轮询直到 success(running 时提醒用户去窗口操作;需要中断用 mk_login_cancel)成功后自动抓取全部 cookie(含 HttpOnly)和该浏览器的 UA 存盘;之后可用
mk_check_login 确认会话有效(传 termId 会实际调用鉴权接口验证)。
🧰 工具一览
工具 | 说明 |
| 拉起本机 Chrome/Edge 打开登录页(立即返回,后台轮询最长 300s,可调) |
| 轮询登录进度:idle / running / success / failed / timeout / cancelled |
| 关闭登录浏览器并取消进行中的流程 |
| 列出最近学习的课程(termId / 教师 / 学校 / 起止时间 / 发布状态) |
| 验证本地会话;给 |
| 课程结构:章/节/任务点 + 类型统计 + 发布状态 |
| 任务点清单(按类型/完成度/发布状态过滤) |
| 完成单个任务点(文档会先下载 PDF 原件再上报) |
| 批量完成任务点( |
| 拉取试卷结构:题干 / 选项 / 题型 |
| 拟真作答交卷:逐题真实时间戳(基准 5-6s,长题延长/短题缩短), |
| 讨论回帖( |
| 全量核验每个任务点完成度,未达标的单独列出 |
📝 节奏建议
任务点总量摊在半天~一天内完成,不要一口气打完;
讨论逐条调用,间隔 30s±10s 随机波动;
测验逐卷调用,卷与卷之间隔几十分钟;
mk_complete_course单次调用内部自带写请求节流与限流重试,调用之间的节奏由 agent 掌控。
📄 License
⚠️ 免责声明
本项目仅供学习与技术研究(协议分析、接口自动化),使用前请了解并遵守你所在学校/机构的规定及相关法律法规。
是否使用、如何使用由使用者自行决定;因使用本工具产生的一切后果(包括但不限于账号处罚、成绩作废、学术处分等)由使用者本人承担。
作者不鼓励、不支持任何形式的学术不端行为,请勿将本项目用于商业用途或大规模滥用。
一经使用,即视为你已阅读、理解并同意上述内容。
Available Tools
13 toolsmk_check_loginMK 登录态检查A
检查本地保存的会话是否有效;给 termId 时会实际调用鉴权接口验证。
| Name | Required | Description | Default |
|---|---|---|---|
| termId | No | 学期/班级 id(tid),可选 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It usefully reveals that supplying termId triggers an actual authentication call rather than only a local check, but it does not describe return values, possible error states, or any side effects. This is adequate but leaves clear gaps for a tool with no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence split by a semicolon, with the primary purpose front-loaded. Every clause earns its place by stating the local-check behavior and the termId-triggered auth behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the parameter schema is fully documented, but there are no annotations and no output schema. The description explains the two checking modes reasonably well, yet it does not state what the tool returns or how validity is represented, which is a notable gap for a check operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single termId parameter is already fully described in the schema as an optional semester/class id. The description adds meaningful behavioral semantics: when termId is provided, the tool calls the authentication interface for real verification. That is a useful distinction beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: checking whether a locally saved session is valid. It also distinguishes the two modes: local-only check without termId, and actual authentication-interface verification when termId is supplied. It does not, however, differentiate this tool from nearby siblings such as mk_verify or mk_login_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The two-mode behavior is clearly implied: pass termId to perform an actual auth verification, omit it to check only the local session. However, there is no explicit guidance on when to choose this tool over siblings like mk_verify or mk_login_status, and no exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_complete_courseMK 批量完成课程A
批量完成任务点:视频(ct1)一次上报;文档(ct3)自动下载 PDF 字节再上报;富文本(ct4)打开即完成;测验(ct5)默认只写学习记录,autoQuiz=true 走拟真逐题作答(含故意错题);讨论(ct6)不代发——返回讨论清单,由你逐条用 mk_discuss_reply 撰写并回帖(每条间隔 ~30s 波动)。内置 ≥13s 写节流与限流重试。
| Name | Required | Description | Default |
|---|---|---|---|
| types | No | 逗号分隔 contentType 列表(1视频 3文档 4富文本 5测验 6讨论) | 1,3,4,6 |
| dryRun | No | ||
| termId | Yes | ||
| autoQuiz | No | ct=5: 自动拟真交卷(逐题节奏+故意错题) | |
| onlyUnfinished | No | ||
| includeUnpublished | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses built-in ≥13s write throttling, rate-limit retry, deliberate wrong-answer behavior for quizzes, PDF byte download, and that discussion tasks return a list instead of executing. It omits idempotency/re-run semantics, auth prerequisites, and the fact that defaults (onlyUnfinished=true, dryRun=false) mean it will actually write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense paragraph, front-loaded with the action and then the per-type rules; nearly every clause carries operational information. Slightly cramped and mixes batch policy with execution timing details that could be split, but there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should characterize what comes back; it only describes the discussion-list return case and is silent on what success/failure output looks like for videos, documents, and quizzes. For a batch mutation tool with throttling and retries, that leaves meaningful gaps around partial failures and re-run behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, so the description must compensate. It does add real meaning for the ct codes (1/3/4/5/6) and for autoQuiz's simulated answering, but dryRun, onlyUnfinished, and includeUnpublished are documented nowhere, leaving three behaviorally important parameters unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('批量完成任务点') and then enumerates the exact per-content-type behaviors (ct1 video, ct3 PDF download, ct4 rich text, ct5 quiz, ct6 discussion). This clearly distinguishes it from the single-item sibling mk_complete_unit and routes discussion work elsewhere.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says discussions are NOT auto-posted and that the agent must follow up with mk_discuss_reply at ~30s intervals, which is real when/how guidance tied to a named sibling. It doesn't state when to prefer this tool over mk_complete_unit (single unit) or how dryRun/onlyUnfinished should drive the decision, so it falls short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_complete_unitMK 完成单个任务点A
上报一个任务点的学习完成。视频(ct=1)一次上报 videoTime=时长+50 即 100%;文档(ct=3)需 textPages(可传 contentId 自动取);富文本/讨论(ct=4/6)打开即完成。
| Name | Required | Description | Default |
|---|---|---|---|
| termId | Yes | ||
| unitId | Yes | ||
| courseId | Yes | ||
| lessonId | Yes | ||
| contentId | No | ct=1 时为 videoId;ct=3 时用于自动取总页数 | |
| textPages | No | ct=3 文档总页数;不传且给了 contentId 时自动获取 | |
| contentType | Yes | 1视频 3文档 4富文本 5测验 6讨论 | |
| durationSeconds | No | ct=1 视频时长(秒) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description must carry the full behavioral burden. It discloses the non-obvious completion logic per content type, which is genuinely valuable, but it omits permission/auth needs, whether the profile is idempotent, and failure behavior. Worse, it names a parameter `videoTime` that does not exist in the schema (which uses durationSeconds and sets additionalProperties:false), so an agent following it literally would fail validation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense sentence with no filler, and the core purpose is stated upfront before the per-type rules. The heavy use of abbreviations (ct, 时长) and a compressed clause structure make it slightly terse, but it is still readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters (5 required), no annotations, and no output schema, the definition should say more. It never explains the identifier parameters, what a successful response looks like, or what to do when a required value is missing, and its `videoTime` naming error creates a real risk of a rejected call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, so the description needs to fill the gap: it explains contentType codes (ct=1/3/4/6), that textPages can be auto-derived from contentId, and the video duration rule. But four of the eight parameters (termId, unitId, courseId, lessonId) receive no explanation, and the `videoTime` reference conflicts with the schema's durationSeconds and the explicit 50% coverage of the other parameters, so it only partly compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and object: report that a single task point's learning is complete (上报一个任务点的学习完成). Combined with the title 'MK 完成单个任务点', an agent can easily distinguish this from mk_complete_course. However, it never explicitly names mk_complete_course as the whole-course alternative, so the differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear per-type invocation guidance: for a video (ct=1), submit videoTime=duration+50 to reach 100%; for a document (ct=3), textPages is required unless a contentId is supplied, in which case the total is auto-fetched; for rich text or discussion (ct=4/6), completion happens simply by opening the item. No exclusion or when-not guidance relative to siblings is given, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_discuss_replyMK 讨论回帖A
在讨论单元发一条回复(MocForumBean.addReply, DWR)。讨论只有真实回帖才会置为完成。text 必须由你(agent)根据讨论话题撰写与主题相关的内容,不要用模板或占位文字。时间戳节奏由调用方控制:批量发帖时请在两次调用之间自行 sleep(建议 30s±10s 高斯波动,半天内摊完即可);也可传 pauseBeforeMs 让本调用内部先等待。
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | 回复文本,由你根据讨论话题撰写 | |
| postId | Yes | 讨论单元的 contentId(即帖子 id) | |
| anonymous | No | ||
| pauseBeforeMs | No | 发送前内部等待毫秒数(0=不等,由 agent 控制节奏) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does well: it discloses the side effect that only a real reply marks the discussion complete, the DWR transport, and an explicit anti-burst pacing expectation. It omits auth/prerequisite state (implied by the sibling login tools) and says nothing about the response or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then layers constraints (content quality, completion semantics, pacing). Dense but well ordered; the pacing sentence is long but each clause carries real instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter write tool with no annotations and no output schema, the description covers purpose, content requirements, side effects on discussion completion, and rate pacing. Missing only return-value expectations and the meaning of the anonymous flag.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so postId, text and pauseBeforeMs are already described. The description reinforces text semantics (must be self-authored, on-topic) and clarifies pauseBeforeMs as an internal wait, but the 'anonymous' parameter is documented nowhere in schema or description. Baseline 3 fits given the schema does most of the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: posting a reply inside a discussion unit, and even names the underlying endpoint (MocForumBean.addReply, DWR). No sibling tool shares this responsibility, so an agent can immediately tell this is the write action for discussion threads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage rules: text must be authored by the agent and topic-relevant, no templates or placeholders, and batch posting should be paced with a self-managed sleep (30s±10s Gaussian) or via pauseBeforeMs. It does not name an alternative tool to use instead, but for a single-purpose write tool the guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_get_courseMK 课程结构A
获取课程完整结构:章(chapters)→节(lessons)→任务点(units),含类型/完成度/发布状态。
| Name | Required | Description | Default |
|---|---|---|---|
| termId | Yes | 学期 id(tid) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. '获取' implies a read-only operation, and the description usefully discloses that the response includes unit type, completion status, and publish status. It does not state authentication requirements, error behavior, or whether the data is scoped to the current user, so meaningful gaps remain for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no waste: the hierarchy and included fields are stated immediately. Every element (chapters→lessons→units, type/completion/publish status) adds useful scope information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the description adequately explains the shape of returned data and the hierarchy. It does not fully cover when to choose this over sibling listing tools, but the core behavior needed to invoke it correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single required termId parameter is already documented in the schema as '学期 id(tid)'. The description adds no parameter meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 获取课程完整结构, and spells out the nested hierarchy chapters→lessons→units with included fields (类型/完成度/发布状态). It is clearly a structural fetch rather than a flat list, which distinguishes it from siblings like mk_list_courses and mk_list_units, though it does not name those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by '完整结构' as opposed to a flat listing, so an agent can infer this is for getting the full course tree. However, the description never explicitly says when to prefer this over mk_list_courses, mk_list_units, or other course tools, and it gives no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_get_quizMK 拉取测验试卷B
取随堂测验/考试试卷:题目、选项与正确答案(服务端 DTO 自带 option.answer=true 与 stdAnswer),可据此满分作答。
| Name | Required | Description | Default |
|---|---|---|---|
| unitId | Yes | ||
| contentId | Yes | 测验单元的 contentId(试卷 id tid 同值) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden, and it does disclose one genuinely non-obvious behavior: the server DTO ships correct answers via option.answer=true and stdAnswer. It says nothing about auth requirements (the mk_login_* siblings imply a session is needed), failure modes for bad unitId/contentId, or whether the paper can be fetched repeatedly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the return payload spelled out immediately; no filler. Slightly dense with DTO/option.answer jargon, but every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-required-parameter read tool with no annotations and no output schema, the description covers the return payload well but leaves the parameter contract under-explained (unitId's meaning and its relation to contentId) and omits any auth or error context. Adequate to start a call, not sufficient to call confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description never mentions unitId or contentId, so it adds zero meaning beyond the schema. Coverage is only 50% — contentId carries a note tying it to the tid, but unitId is completely undocumented in both schema and description, and the description does nothing to close that gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('取随堂测验/考试试卷') and goes further by enumerating what comes back (题目、选项、正确答案), which separates it in practice from the write-side sibling mk_submit_quiz. It never names a sibling or explicitly contrasts with one, so it stays short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The trailing clause '可据此满分作答' implies this is the step before answering/submitting, but there is no explicit when-to-use, no statement that it is read-only and safe to call repeatedly, and no pointer to mk_submit_quiz as the follow-up action. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_list_coursesMK 课程列表A
列出当前账号最近学习的课程(含 termId/教师/学校/起止时间/发布状态)。各工具要的 tid 直接从这里拿;若目标课程不在列表里,提供课程页 URL 里的 tid 也可以。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. '列出' implies a read-only operation and the returned fields are named, but it does not state whether the list is truncated, how 'recent' is defined or ordered, or whether authentication via mk_login is required — gaps that matter for a discovery tool consuming an account-scoped list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with zero waste: the first defines the resource and its fields, the second immediately explains how its output feeds the rest of the toolset. Front-loaded and appropriately sized for a no-argument listing tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description compensates by enumerating the key returned fields and explaining downstream tid consumption. Minor gaps remain around truncation/pagination and how 'recent' is bounded, but nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description adds no parameter detail (none exists to add), but it does clarify that the tid values needed by other tools are sourced from this call's output, which is useful semantic context around usage rather than input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('列出当前账号最近学习的课程') plus the exact fields returned (termId/教师/学校/起止时间/发布状态), which distinguishes it from mk_get_course, the single-course lookup sibling. An agent can tell this is the discovery/enumeration step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to call it — to obtain the tid that other tools require — and provides a fallback source (the tid in a course page URL) when the target course is absent from the list. It lacks a clear 'when not to use' statement or comparison against other listing siblings, but the workflow guidance is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_list_unitsMK 任务点清单B
列出课程全部任务点(可按类型/完成度过滤)。类型: 1=视频 3=文档 4=富文本 5=测验 6=讨论。
| Name | Required | Description | Default |
|---|---|---|---|
| termId | Yes | ||
| contentType | No | ||
| onlyPublished | No | ||
| onlyUnfinished | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden. It does not disclose that onlyPublished defaults to true (silently hiding unpublished units), the default for onlyUnfinished, whether login/auth is required, or what the returned items contain — all material for interpreting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the purpose front-loaded and the enum table appended, no filler. The enum listing is terse but every token carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and 0% schema description coverage, the description should explain at least how onlyPublished/onlyUnfinished behave and what a returned task point looks like. It only covers purpose and the contentType enum, leaving half the surface undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description compensates for contentType by enumerating its allowed values (1/3/4/5/6) and loosely maps '完成度' to onlyUnfinished. However termId and the onlyPublished default (true) remain completely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: lists all course 任务点 with optional filtering by type/completion. An agent can distinguish it from mk_get_course (single course detail) and mk_list_courses (course list). Lacks explicit sibling differentiation but the scope is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies when to use it — when you need the unit/task list for a course, optionally filtered — but never states prerequisites (e.g. must be logged in, termId must come from mk_list_courses) or when to prefer mk_get_course / mk_complete_unit instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_login_cancelMK 取消登录A
关闭登录浏览器并取消进行中的登录流程。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It does disclose the two effects (the browser closes and the pending flow is cancelled), but it omits error behavior when no login is in progress, idempotency, and whether any server-side session state persists. The tool's name and the verbs 'cancel' and '关闭' do signal that it changes state, but it does not spell out what happens when there is nothing to cancel.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single sentence with no wasted words, and it front-loads the action: closing the browser comes before cancelling the flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-parameter lifecycle tool, the description covers the core action and its two effects. Minor gaps remain: no stated behavior when no login is active and no confirmation of what happens to the session state afterward, though no output schema exists to carry that information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there are no parameter semantics to document; the baseline for a zero-parameter tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it closes the login browser and cancels an in-progress login flow. That is clearly distinct from the sibling tools mk_login_start, mk_login_status and mk_check_login, but the description never names those siblings or explains how it relates to them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'cancel the in-progress login flow' implies when to use the tool, namely to abort a login. However, it gives no explicit conditions, no preconditions (for example, 'only call while mk_login_status reports pending'), and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_login_startMK 登录A
拉起本机 Chrome/Edge 打开登录页,由用户手动登录 icourse163.org(课程平台)。本调用立即返回;成功后自动抓取全部 cookie(含 HttpOnly)和该浏览器的 UA 存盘。用 mk_login_status 轮询结果。
| Name | Required | Description | Default |
|---|---|---|---|
| termId | No | 课程页 tid;提供后以鉴权接口实测 code:0 作为登录成功判据(强烈建议) | |
| timeoutSeconds | No | 后台轮询登录的最长时间 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the async/non-blocking contract, that a human must complete the login in a local browser, that HttpOnly cookies and UA are persisted, and that polling is bounded by the timeout. It omits prerequisites such as needing a desktop GUI browser and whether existing saved credentials are overwritten.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: what happens, what the side effect is, and how to retrieve the outcome. The immediate-return caveat is front-loaded before the side-effect detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains that the call returns immediately and that the result must be fetched via mk_login_status, which is the key information an agent needs. It could go slightly further by stating what the immediate return value contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both termId (the success-criterion assertion) and timeoutSeconds are already documented in the schema. The description adds no further meaning about how termId is used or how timeoutSeconds relates to the immediate-return contract, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (launch local Chrome/Edge to the icourse163.org login page for manual user login) and the concrete side effect (capture all cookies including HttpOnly plus the browser UA to disk). It is clearly distinguishable from the polling siblings, naming mk_login_status directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says the call returns immediately and that mk_login_status is the way to poll for the result, which routes the agent to the right sibling. It does not cover the alternative case (e.g., checking an existing session with mk_check_login/mk_verify before starting a new login) or what happens if a login is already in progress.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_login_statusMK 登录状态A
查询浏览器登录流程状态: idle/running/success/failed/timeout/cancelled。running 时提示用户到弹出的浏览器窗口完成验证码或扫码。
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses the state machine (idle/running/success/failed/timeout/cancelled) and the key operator behavior (prompt the user to finish captcha/scan in the popup browser), which is genuinely useful. It does not say the call is read-only/non-mutating, whether polling is rate-limited, or what an agent should do on timeout/failed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste: the first front-loads what is queried and the full result vocabulary, the second gives the one action the agent must take. Nothing is repeated or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by enumerating the status values as the return vocabulary, which is the essential missing piece. It is nearly complete for a trivial no-arg read, minus guidance on failure/timeout handling and polling cadence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is no parameter semantics to explain and the baseline is 4. The description correctly spends no words on inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (查询) and resource (浏览器登录流程状态) and enumerates the possible state values, so an agent knows exactly what it returns. However, it never distinguishes itself from the sibling mk_check_login, which by name appears to cover overlapping ground.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'running 时提示用户…' tells the agent what to do once a run is in flight, which suggests this is a polling tool used after mk_login_start. There is no explicit when-to-use/when-not, no mention of how it relates to mk_check_login or mk_login_cancel.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_submit_quizMK 提交测验(拟真作答)A
按真实节奏交卷:先写"打开测验"学习记录,然后逐题作答(每题 5-6s 基准波动,题干长则延长、短则缩短,真实时间戳写入答卷),故意错几道(默认约 25%,1-3 题),留检查间隔后提交。sessionSeconds 控制整场压缩到多少秒内(适配 MCP 超时,节奏比例保持不变)。
| Name | Required | Description | Default |
|---|---|---|---|
| unitId | Yes | ||
| contentId | Yes | 测验单元 contentId(=试卷 tid) | |
| wrongCount | No | 故意做错的题数;'auto'=按 25%(1-3 题),或传数字(0=全对) | auto |
| sessionSeconds | No | 整场作答压缩到的目标秒数 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden and does well: it reveals the deliberate side effect of injecting wrong answers (~25%, 1-3 questions), that real timestamps are written to the answer sheet, and that pacing is scaled to fit sessionSeconds. It doesn't state irreversibility of the submission, required auth, or rate limits, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph that front-loads the action sequence before the timing knob, and every clause carries information. It is tight but packed with parenthetical detail, which makes it slightly harder to scan than an ideal definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers the sequence, the intentional-wrong-answer behavior, and the timeout constraint. What's missing is what the caller gets back on success/failure and whether a submission can be re-run or undone, but the core behavior is adequately conveyed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so most parameters are documented. The description still adds value: it clarifies that sessionSeconds compresses the whole session while preserving relative pacing ratios – semantics beyond the plain min/max in the schema – and reinforces wrongCount's auto/25% behavior. unitId remains unaddressed in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action chain: write an 'open quiz' study record, answer each question at a realistic pace with real timestamps, deliberately miss some questions, then submit. This is concrete enough for an agent to know exactly what the tool does. It doesn't explicitly contrast itself with a sibling (e.g. mk_get_quiz, which presumably fetches the paper first), so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied – the agent must infer that this is called after the quiz is known (likely after mk_get_quiz) and that sessionSeconds exists to fit MCP timeouts. There are no explicit when/when-not statements or named alternatives among the many mk_* siblings. The timeout-adaptation note is the only real usage context provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_verifyMK 完成度核验B
重新拉取学习树,输出每个任务点的 completePercent 与汇总(未满 1 的单独列出)。
| Name | Required | Description | Default |
|---|---|---|---|
| termId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It does disclose meaningful behavior: a fresh fetch (not cached) and a return shape with per-task completePercent plus a separately-listed incomplete subset. However, it says nothing about read-only nature, auth/permission requirements, or how the learning tree is scoped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the output contract is stated up front and the parenthetical clarifies the incomplete-item handling without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description does a fair job of sketching the return value (completePercent per task plus a summary), but it leaves the sole required parameter and the tool's prerequisites unexplained, so an agent still cannot confidently construct the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is exactly one parameter (termId) with 0% schema description coverage, and the description never mentions it or explains what a term ID is, where it comes from, or whether it accepts string or number. The only parameter is therefore undocumented in both structured and natural-language form.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb+resource: re-fetch the learning tree and emit each task point's completePercent plus a summary, with sub-1 items listed separately. This distinguishes it from mutation siblings like mk_complete_unit, but it never names a sibling or explicitly contrasts itself with the list_* tools, which is the main gap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by '重新拉取' (re-fetch) – an agent can infer this is a post-completion verification call, but there is no explicit 'use this after X' or 'do not use for Y' statement, and no alternative tool is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.1.0- First observed
mk_check_login - First observed
mk_complete_course - First observed
mk_complete_unit - First observed
mk_discuss_reply - First observed
mk_get_course - First observed
mk_get_quiz - First observed
mk_list_courses - First observed
mk_list_units - First observed
mk_login_cancel - First observed
mk_login_start - First observed
mk_login_status - First observed
mk_submit_quiz - First observed
mk_verify
TDQS
Scored across 13 tools
Most tools target distinct resources or actions: login lifecycle, course listing, unit completion, quiz flow, and discussion replies are clearly separable. Minor ambiguity exists between mk_check_login (validates a saved session) and mk_login_status (polls an in-progress browser login), and between mk_verify and mk_list_units/mk_get_course since all three surface completion information.
All tools share the mk_ prefix and snake_case, which is highly predictable. The only deviation is ordering: the login tools use noun_verb (mk_login_start/status/cancel) while everything else uses verb_noun (mk_list_courses, mk_complete_unit, mk_get_quiz).
13 tools is well-scoped for an icourse163 automation server: one or two tools per lifecycle stage (auth, discovery, completion, quiz, discussion). No tool feels redundant or padded given the domain breadth.
The surface covers the full core workflow: login, session validation, course listing, structure inspection, single and batch completion, quiz fetch/submit, and discussion replies. Minor gaps: discussions can only be enumerated indirectly through mk_complete_course output rather than a dedicated list tool, and there's no way to inspect quiz results or scores after submission.
Maintenance
Related MCP Connectors
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Stealth web automation for AI agents. Login, signup, navigate, screenshot.
Web scraping and automation for AI agents: live prices, quotes, bookings, anything behind a login.
Browser agents and stealth cloud browsers for AI: run web tasks, fill forms, extract data.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables users to search for courses, view detailed syllabus information, and manage enrollments and progress on Coursera. It supports automated interactions including viewing certificates through local or cloud-based browser environments using Playwright.57 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to programmatically interact with Coursera, including enrolling in courses, completing lectures, solving quizzes, submitting assignments, earning certificates, and pushing them to LinkedIn.1MIT
- AlicenseAqualityCmaintenanceEnables automated interaction with the Moodle platform, allowing users to list courses and modules, retrieve assignment details, and download course files via browser automation.6ISC
- AlicenseAqualityCmaintenanceEnables users to patrol QingSoft U+ courses, track homework and experiments, read objective questions into structured briefs for a connected MCP client model to answer, fill and verify selections, and optionally submit, while handing subjective, programming, report and file work back to the human.9MIT