camcors-mcp

camcors-mcp

An unofficial MCP server for Cambridge's CamCORS system, enabling supervision report management through a Chrome browser.

Category
访问服务器

README

camcors-mcp

An unofficial MCP server for Cambridge's CamCORS (Online Reporting of Supervisions) system.

The server uses a visible Chrome window for Raven sign-in and report previews. It sends report requests to the same internal endpoints as the CamCORS web pages. These endpoints are not a published API.

Raven credentials and CamCORS cookies stay in a dedicated Chrome profile. The server does not accept them as tool arguments, print them to logs or store them in this repository.

[!CAUTION] CamCORS contains confidential student and payment information. Use this server only with an account you are authorised to use. Do not add real report data to the repository. Check each write action in the Chrome window.

What it does

  • Opens CamCORS in a persistent Chrome profile.
  • Lists supervision and non-supervision reports.
  • Reads a report by its CamCORS report ID.
  • Prepares and creates supervision report drafts.
  • Reads the editable fields from a Draft or Returned report.
  • Edits report fields and supervision timings.
  • Deletes Draft or Returned reports after a separate confirmation.
  • Validates reports without submitting them.
  • Submits reports after a separate confirmation.
  • Discards an unused preview without changing CamCORS.

camcors_create_supervision_drafts creates drafts. It does not submit them. Submission uses separate validation and confirmation tools.

Requirements

  • Node.js 22 or newer
  • Google Chrome
  • Access to https://apps.casc.cam.ac.uk/ors/

Install

npm ci
npm run build

Run the tests and type checks:

npm test
npm run typecheck

Configure an MCP client

Use the absolute path to dist/index.js. For example:

{
  "mcpServers": {
    "camcors": {
      "command": "node",
      "args": ["/absolute/path/to/camcors-mcp/dist/index.js"],
      "env": {
        "CAMCORS_USER_DATA_DIR": "/absolute/path/to/.camcors-mcp/chrome-profile"
      }
    }
  }
}

The default profile path is ~/.camcors-mcp/chrome-profile. You can omit the env block if you use that path.

Sign in for the first time

  1. Call camcors_open.
  2. Sign in with Raven in the Chrome window.
  3. Call camcors_open again.
  4. Check that the result contains "authenticated": true.

The dedicated profile keeps the login between server runs. The server does not copy cookies from your usual browser profile.

Use an existing remote-debugging Chrome session

Set this variable if Chrome is already running with remote debugging:

CAMCORS_CDP_URL=http://127.0.0.1:9222

Recent Chrome versions require a non-default --user-data-dir for remote debugging. On macOS, start a dedicated instance with:

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
  --remote-debugging-port=9222 \
  --user-data-dir="$HOME/.camcors-mcp/chrome-profile"

Sign in to CamCORS in that window. Then start the server with CAMCORS_CDP_URL set.

Create, edit, delete and submit reports

Create report drafts

  1. Call camcors_prepare_supervision_drafts. It fills in the CamCORS form and returns a preview token.
  2. Check the students, term, Tripos part, paper and topic in CamCORS.
  3. Call camcors_create_supervision_drafts with the token and confirm: true.

Edit a report and set supervision timings

  1. Call camcors_get_editable_report with a Draft or Returned report ID.
  2. Use the returned field names and option values in camcors_prepare_report_edit.
  3. To replace the timings, pass the complete groups list. Set size to the number of students in the group. Set totalMinutes to the total time taught to groups of that size.
  4. Check the CamCORS edit form.
  5. Call camcors_save_report_edit with the token and confirm: true.

The server reads the editable fields from the live form. It does not use a fixed list. A control without a form name has a key such as #controlId. This applies to controls such as the visible payment option selector. CamCORS updates the corresponding hidden values when these controls change.

The server applies the same basic timing checks as the CamCORS form:

  • Group sizes are positive and unique.
  • Durations are whole minutes and at least 15 minutes.
  • An empty list requires allowNoGroups: true. CamCORS might still return a warning.

Delete a Draft or Returned report

  1. Call camcors_prepare_report_deletion with the report IDs.
  2. Check the exact reports in the CamCORS preview.
  3. Call camcors_delete_reports with the returned deletionToken and confirm: true.

The server checks that each report is still a Draft or Returned report. It checks the reports again immediately before deletion and verifies that they no longer appear afterwards. A deletion token is used once. If the request fails without a clear result, inspect CamCORS before trying again.

Validate and submit reports

  1. Save all intended edits.
  2. Call camcors_prepare_report_submission with one or more report IDs.
  3. Fix each error and read each warning.
  4. If validation passes, call camcors_submit_reports with the returned submissionToken and confirm: true.
  5. If validation returned warnings, also set acknowledgeWarnings: true.

The server calls the CamCORS validation action directly. This avoids the web page's automatic submission behaviour when validation returns no warnings. The server validates the reports again before submission. The result must match the preview. It uses each submission token once and consumes it before the network request. If the request fails without a clear result, check CamCORS before trying again.

Preview tokens expire after 30 minutes. They are also lost when the MCP process exits.

How it connects to CamCORS

CamCORS has no published API for report submission. This server uses the internal HTTP requests made by CamCORS v7:

  • report search and report detail requests
  • draft creation and report save form posts
  • report deletion, validation and final submission actions

The request client shares Chrome's cookie jar. It does not copy cookies into environment variables or MCP messages. Each request is restricted to the configured CamCORS origin and /ors/ path. Write requests include the anti-forgery token when the current CamCORS form provides one.

The server still opens CamCORS pages when it needs Raven sign-in, a preview or CamCORS form JavaScript. This includes student lookup and the timing controls on the report edit form.

Environment variables

Variable Default Purpose
CAMCORS_BASE_URL https://apps.casc.cam.ac.uk/ors/ CamCORS application root
CAMCORS_USER_DATA_DIR ~/.camcors-mcp/chrome-profile Dedicated persistent Chrome profile
CAMCORS_HEADLESS false Run Chrome without a visible window
CAMCORS_CDP_URL unset Attach to an existing remote-debugging Chrome
CAMCORS_ACTION_TIMEOUT_MS 30000 Browser action timeout

Security

  • The server marks report text as untrusted data.
  • It runs browser operations in sequence.
  • It restricts report URLs to the configured CamCORS origin and /ors/ path.
  • Edit tools accept only fields found in the current CamCORS form.
  • Deletion requires an exact report preview and separate confirmation.
  • Submission requires validation and confirmation. Warnings also require acknowledgement.
  • Automated tests do not use the live site.
  • Do not commit .env files, browser profiles, screenshots, downloaded reports, CRSids or fixtures based on real reports.

See SECURITY.md for reporting and operating guidance.

Known limits

The selectors and internal requests were checked against CamCORS v7 on 29 July 2026. CamCORS can change them without notice. Such a change might require an update to this server.

The full edit and submission flow covers supervision reports. Non-supervision reports and general claims currently have read support only.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选
mcp-server-qdrant

mcp-server-qdrant

这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。

官方
精选