Skip to content
← All projects

Module Notes MCP

An MCP server providing semantic search and retrieval over Cambridge CS Tripos notes. Connects to ChatGPT, Claude, or any MCP client.

TypeScript MCP AI Express Cohere

module-notes-mcp is a Model Context Protocol (MCP) server that indexes Cambridge Computer Science Tripos notes and exposes them to AI assistants via semantic search. Hook it up to ChatGPT’s MCP plugin and ask questions like “explain the OpenGL rendering pipeline” — it retrieves the relevant notes and provides grounded, sourced answers.

Features

  • Semantic search — Cohere embed-english-v3.0 embeddings power the vector index, finding notes by meaning not just keywords.
  • Module listings — Browse all Cambridge CS modules with year, term, paper, and note count metadata.
  • Note retrieval — Fetch full note content (Markdown body) by slug.
  • Auto-sync — Pulls fresh notes from the source Git repo every 90 minutes via SSH deploy key.
  • Stateless transport — Fresh MCP transport per request, supporting multiple concurrent clients.

Architecture

Built with TypeScript on Express, using the @modelcontextprotocol/sdk for Streamable HTTP transport. Notes are parsed from Markdown (frontmatter + body via gray-matter), embedded in batches via the Cohere API, and indexed with MiniSearch for fast retrieval. The index is cached to disk for fast restarts.

Sources are pluggable via a config/sources.yaml file with ${ENV_VAR} interpolation. The default source clones a private GitHub repo over SSH, walks module JSON metadata and nested Markdown note directories, and feeds everything into the parse → embed → index pipeline.

Deployed on an Oracle Cloud AMD VM behind nginx + Let’s Encrypt HTTPS with Cloudflare as a proxy.

Usage

Add https://mcp.jl1t.uk/mcp as an MCP server in ChatGPT, Claude, or any MCP-compatible client. Four tools are available:

ToolWhat it does
searchSemantic search with configurable result limit
get_noteFull note retrieval by slug
list_modulesAll modules with metadata
list_notesAll notes, filterable by module/source