Koskamo

exam.now MCP

An official MCP server providing access to Cambridge, AQA, and Edexcel past papers, mark schemes, and AI marking tools. It allows agents to search for papers, retrieve questions and mark schemes, practice questions, and mark student answers against official schemes, requiring an account for marking features.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

exam.now MCP logo, by exam.nowVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by exam.now
You need:Reading papers needs no accountmarking needs a linked exam.now account with a planSign-in OAuth 2.1 with PKCE (S256)
MCP endpoint (Streamable HTTP)
https://exam.now/mcp
Vendor documentation

What its tools do

11 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

Can change data (1)

11 of 11 have a description · 11 of 11 declare behavior hints · 7 of 11 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to exam.now ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Find past papers by subject, year, or paper code
  • Retrieve specific questions and mark scheme lines
  • Mark student answers against official mark schemes
  • View topic progress and exam timetables

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
exam-now 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
11 advertised
Resources
2 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

exam.now has Cambridge (IGCSE, O Level, AS and A Level), AQA and Pearson Edexcel past papers with their mark schemes, many of them structured question by question. Start with find_past_paper to get a paper_id, then get_question, get_mark_scheme or get_paper. find_questions_by_topic finds questions on a syllabus topic. Every result has a source line and exam.now links: show the source line and the link with the content. practise_question shows a question for the student to answer; mark_answer marks their answer against the mark scheme and needs a linked exam.now account with marking.

Tools

11 advertised

find_past_paper — Find a past paper
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find Cambridge, AQA or Edexcel past papers on exam.now from a free-text query such as "0580 june 2024 paper 4" or from structured fields. Returns up to 10 papers with their exam.now paper_id, title, session, duration, total marks, whether exam.now can show it on screen to answer (answer_on_screen, with the parts that need a graph or drawing and so can only be answered there), and links to the question paper, insert, mark scheme and examiner report where they exist. Use the paper_id with get_question, get_mark_scheme or get_paper.

find_past_paper input schema
{
  "type": "object",
  "properties": {
    "year": {
      "type": "integer",
      "maximum": 2030,
      "minimum": 2002
    },
    "board": {
      "enum": [
        "cambridge",
        "aqa",
        "edexcel"
      ],
      "type": "string"
    },
    "limit": {
      "type": "integer",
      "default": 5,
      "maximum": 10,
      "minimum": 1
    },
    "paper": {
      "type": "integer",
      "maximum": 9,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "maxLength": 200,
      "description": "Free text, e.g. \"0625 w23 42\" or \"igcse physics november 2023 paper 4\"."
    },
    "series": {
      "enum": [
        "feb-march",
        "may-june",
        "oct-nov"
      ],
      "type": "string",
      "description": "Exam series."
    },
    "variant": {
      "type": "integer",
      "maximum": 9,
      "minimum": 1
    },
    "subject_code": {
      "type": "string",
      "pattern": "^[A-Za-z0-9]{3,6}$",
      "description": "Syllabus or specification code, e.g. 0580, 0625, 9709, 8300 or 1MA1."
    },
    "qualification": {
      "type": "string",
      "maxLength": 40,
      "description": "e.g. \"IGCSE\", \"O Level\", \"A Level\", \"GCSE\"."
    }
  },
  "additionalProperties": false
}
find_past_paper annotations
{
  "title": "Find a past paper",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_question — Get a question
Advertised by the server during the last successful anonymous check.
Advertised read-only

The text of one question or part from an exam.now past paper: context, prompt, marks, figures (with alt text), the answer surface (response kinds, tools, whether a calculator is allowed), topic codes and a link to the part on exam.now. answer.onSite is true when the part needs a graph or drawing, so it can only be answered on exam.now; otherwise the student can type the answer in chat and mark_answer marks it. Pass question for the whole question or part for one part.

get_question input schema
{
  "type": "object",
  "required": [
    "paper_id"
  ],
  "properties": {
    "part": {
      "type": "string",
      "maxLength": 24,
      "description": "Part id as the paper numbers it, e.g. \"3\", \"3(a)\" or \"3(a)(i)\"."
    },
    "paper_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9]{3,6}_[a-z0-9]{2,8}_[A-Za-z0-9]{1,8}$",
      "description": "exam.now paper id from find_past_paper, e.g. 0580_s24_42 (syllabus code, series letter s/w/m and two-digit year, component)."
    },
    "question": {
      "type": "string",
      "maxLength": 8,
      "description": "Question number, e.g. \"3\"."
    },
    "include_images": {
      "type": "boolean",
      "default": true,
      "description": "Attach small figures as image content as well as URLs."
    }
  },
  "additionalProperties": false
}
get_question annotations
{
  "title": "Get a question",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_mark_scheme — Get a mark scheme
Advertised by the server during the last successful anonymous check.
Advertised read-only

The official mark-scheme rows for one part of an exam.now past paper: each row's code (M1, A1, B1…), marks, answer, guidance and alternatives, the part's maximum marks, the paper's general marking principles, the mark-scheme PDF page and a link to it on exam.now.

get_mark_scheme input schema
{
  "type": "object",
  "required": [
    "paper_id",
    "part"
  ],
  "properties": {
    "part": {
      "type": "string",
      "maxLength": 24,
      "description": "Part id as the paper numbers it, e.g. \"3\", \"3(a)\" or \"3(a)(i)\"."
    },
    "paper_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9]{3,6}_[a-z0-9]{2,8}_[A-Za-z0-9]{1,8}$",
      "description": "exam.now paper id from find_past_paper, e.g. 0580_s24_42 (syllabus code, series letter s/w/m and two-digit year, component)."
    },
    "include_principles": {
      "type": "boolean",
      "default": false,
      "description": "Include the paper's general marking principles."
    }
  },
  "additionalProperties": false
}
get_mark_scheme annotations
{
  "title": "Get a mark scheme",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_paper — Get a whole paper
Advertised by the server during the last successful anonymous check.
Advertised read-only

An exam.now past paper as structured JSON (metadata, questions, parts, prompts, marks, answer kinds, figure URLs), a few questions at a time. Each part's answer.onSite is true when it needs a graph or drawing and can only be answered on exam.now; the other parts can be typed in chat for mark_answer. Use next_from to get the next page. include_mark_scheme adds the mark-scheme rows for the same questions and needs a linked exam.now account (a free one is fine).

get_paper input schema
{
  "type": "object",
  "required": [
    "paper_id"
  ],
  "properties": {
    "count": {
      "type": "integer",
      "default": 3,
      "maximum": 5,
      "minimum": 1,
      "description": "How many questions to return."
    },
    "paper_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9]{3,6}_[a-z0-9]{2,8}_[A-Za-z0-9]{1,8}$",
      "description": "exam.now paper id from find_past_paper, e.g. 0580_s24_42 (syllabus code, series letter s/w/m and two-digit year, component)."
    },
    "from_question": {
      "type": "integer",
      "default": 1,
      "minimum": 1,
      "description": "First question to return (1-based position in the paper)."
    },
    "include_mark_scheme": {
      "type": "boolean",
      "default": false
    }
  },
  "additionalProperties": false
}
get_paper annotations
{
  "title": "Get a whole paper",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_questions_by_topic — Find questions by topic
Advertised by the server during the last successful anonymous check.
Advertised read-only

Past-paper questions on exam.now tagged with a syllabus topic, newest first. Pass the topic code (e.g. E2.5) or words (e.g. "simultaneous equations"). Returns question references with the start of each prompt, marks, whether it has a figure, and a link to the question.

find_questions_by_topic input schema
{
  "type": "object",
  "required": [
    "subject_code",
    "topic"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 5,
      "maximum": 10,
      "minimum": 1
    },
    "topic": {
      "type": "string",
      "maxLength": 120,
      "description": "Topic code or words."
    },
    "subject_code": {
      "type": "string",
      "pattern": "^[A-Za-z0-9]{3,6}$",
      "description": "Syllabus or specification code, e.g. 0580, 0625, 9709, 8300 or 1MA1."
    }
  },
  "additionalProperties": false
}
find_questions_by_topic annotations
{
  "title": "Find questions by topic",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
practise_question — Practise a question
Advertised by the server during the last successful anonymous check.
Advertised read-only

Show one past-paper question as a practice card the student can answer, with its figures and answer surface. The model gets the full question so it can give hints without giving the answer away. Use mark_answer to mark the student's answer.

practise_question input schema
{
  "type": "object",
  "required": [
    "paper_id"
  ],
  "properties": {
    "part": {
      "type": "string",
      "maxLength": 24,
      "description": "Part id as the paper numbers it, e.g. \"3\", \"3(a)\" or \"3(a)(i)\"."
    },
    "paper_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9]{3,6}_[a-z0-9]{2,8}_[A-Za-z0-9]{1,8}$",
      "description": "exam.now paper id from find_past_paper, e.g. 0580_s24_42 (syllabus code, series letter s/w/m and two-digit year, component)."
    },
    "question": {
      "type": "string",
      "maxLength": 8,
      "description": "Question number, e.g. \"3\"."
    }
  },
  "additionalProperties": false
}
practise_question annotations
{
  "title": "Practise a question",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
mark_answer — Mark an answer
Advertised by the server during the last successful anonymous check.

Mark a student's answer to one part against the official mark scheme with exam.now's marker. Returns marks awarded and available, the mark-scheme rows earned and missed, feedback and a common-mistake link, and saves the mark to the student's exam.now progress. Needs a linked exam.now account with marking.

mark_answer input schema
{
  "type": "object",
  "required": [
    "paper_id",
    "part",
    "answer"
  ],
  "properties": {
    "part": {
      "type": "string",
      "maxLength": 24,
      "description": "Part id as the paper numbers it, e.g. \"3\", \"3(a)\" or \"3(a)(i)\"."
    },
    "answer": {
      "type": "string",
      "maxLength": 6000,
      "minLength": 1,
      "description": "The student's final answer, as they wrote it."
    },
    "working": {
      "type": "string",
      "maxLength": 6000,
      "description": "The student's working, as they wrote it. Send it whenever they showed any: without it the marker judges the final answer only and can't give method marks."
    },
    "paper_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9]{3,6}_[a-z0-9]{2,8}_[A-Za-z0-9]{1,8}$",
      "description": "exam.now paper id from find_past_paper, e.g. 0580_s24_42 (syllabus code, series letter s/w/m and two-digit year, component)."
    }
  },
  "additionalProperties": false
}
mark_answer annotations
{
  "title": "Mark an answer",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
topic_progress — Topic progress
Advertised by the server during the last successful anonymous check.
Advertised read-only

The linked student's own progress in one subject on exam.now: each syllabus topic's band (secure, getting there, not yet), the next three topics to work on (weak topics first, then topics with too few marks to band and untried topics that are ready to start, each with a reason) and links to practise them.

topic_progress input schema
{
  "type": "object",
  "required": [
    "subject_code"
  ],
  "properties": {
    "subject_code": {
      "type": "string",
      "pattern": "^[A-Za-z0-9]{3,6}$",
      "description": "Syllabus or specification code, e.g. 0580, 0625, 9709, 8300 or 1MA1."
    }
  },
  "additionalProperties": false
}
topic_progress annotations
{
  "title": "Topic progress",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
exam_timetable — Exam timetable
Advertised by the server during the last successful anonymous check.
Advertised read-only

Cambridge exam dates for one or more syllabuses in the June or November 2026 series: component, date, morning or afternoon session and duration, with a link to the exam.now timetable. Zone defaults to the UK timetable.

exam_timetable input schema
{
  "type": "object",
  "required": [
    "subject_codes",
    "series"
  ],
  "properties": {
    "zone": {
      "enum": [
        "uk",
        "1",
        "2",
        "3",
        "4",
        "5",
        "6"
      ],
      "type": "string",
      "default": "uk",
      "description": "Cambridge administrative zone."
    },
    "series": {
      "enum": [
        "june-2026",
        "november-2026"
      ],
      "type": "string"
    },
    "subject_codes": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[A-Za-z0-9]{3,6}$",
        "description": "Syllabus or specification code, e.g. 0580, 0625, 9709, 8300 or 1MA1."
      },
      "maxItems": 10,
      "minItems": 1
    }
  },
  "additionalProperties": false
}
exam_timetable annotations
{
  "title": "Exam timetable",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
common_mistakes — Common mistakes
Advertised by the server during the last successful anonymous check.
Advertised read-only

Up to 5 exam.now write-ups of common mistakes in a subject, drawn from Cambridge examiner reports, each with a short summary and a link. Narrow them with a topic code or words.

common_mistakes input schema
{
  "type": "object",
  "required": [
    "subject_code"
  ],
  "properties": {
    "query": {
      "type": "string",
      "maxLength": 120,
      "description": "Words to match, e.g. \"bounds\"."
    },
    "topic": {
      "type": "string",
      "maxLength": 24,
      "description": "Topic code, e.g. E1.10."
    },
    "subject_code": {
      "type": "string",
      "pattern": "^[A-Za-z0-9]{3,6}$",
      "description": "Syllabus or specification code, e.g. 0580, 0625, 9709, 8300 or 1MA1."
    }
  },
  "additionalProperties": false
}
common_mistakes annotations
{
  "title": "Common mistakes",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
class_summary — Class summary
Advertised by the server during the last successful anonymous check.
Advertised read-only

For a teacher's own exam.now class: topic bands across the class with no pupil names, and how many pupils have started. Small groups are suppressed to protect pupils' privacy.

class_summary input schema
{
  "type": "object",
  "required": [
    "subject_code"
  ],
  "properties": {
    "class_id": {
      "type": "string",
      "maxLength": 64,
      "description": "The class id from exam.now. Leave it out for the teacher's own class."
    },
    "subject_code": {
      "type": "string",
      "pattern": "^[A-Za-z0-9]{3,6}$",
      "description": "Syllabus or specification code, e.g. 0580, 0625, 9709, 8300 or 1MA1."
    }
  },
  "additionalProperties": false
}
class_summary annotations
{
  "title": "Class summary",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

2 advertised

Practice card — Practice card

Advertised by the server during the last successful anonymous check.

Shows one past-paper question as a practice card: its context, figures and prompt, the marks, and a box for the student's answer. Parts that need a graph, table or drawing link to exam.now instead. The student can check their answer against the mark scheme from the card.

Practice card URI
ui://exam-now/practice-card-v1.html

MIME type: text/html;profile=mcp-app

Mark result — Mark result

Advertised by the server during the last successful anonymous check.

Shows a marked answer: marks awarded out of marks available, each mark-scheme row earned or missed with its code, the marker's feedback, a common-mistake link and links to the mark scheme and the paper on exam.now.

Mark result URI
ui://exam-now/mark-result-v1.html

MIME type: text/html;profile=mcp-app

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
379 ms
95th percentile latency
379 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 379 ms · metadata changed · 11 tool(s), 2 resource(s), 0 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http exam-now-mcp https://exam.now/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add exam-now-mcp --url https://exam.now/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable exam-now-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "exam-now-mcp": {
      "url": "https://exam.now/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "exam-now-mcp": {
      "type": "streamableHttp",
      "url": "https://exam.now/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start exam-now-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "exam-now-mcp": {
      "type": "http",
      "url": "https://exam.now/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http exam-now-mcp https://exam.now/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://exam.now/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "exam-now-mcp": {
      "serverUrl": "https://exam.now/mcp"
    }
  }
}

Let your agent find its tools

Find servers like exam.now MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run exam.now MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing