Koskamo

ntnu-mcp

A remote MCP server for NTNU course data on Cloudflare Workers providing catalog search, schedules, timetables, grade statistics, course comparison, and timetable-conflict checks. It requires no authentication as it serves public, read-only data.

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.

ntnu-mcp logo, by MartinSA04Community listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by MartinSA04
MCP endpoint (Streamable HTTP)
https://ntnu-mcp.martinsundal.no/mcp
Vendor documentation

What its tools do

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

12 of 12 have a description · 0 of 12 declare behavior hints · 0 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 ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search NTNU course catalog and study programs
  • Retrieve course timetables and exam logistics
  • Check for timetable conflicts between courses
  • Compare courses and view grade statistics

Source and maintenance

Community listingRegistry 0.4.0
Maintenance checked

Protocol and capabilities

Server
ntnu 0.1.0
MCP protocol negotiated in check
2025-11-25
Tools
12 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

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

Course data for NTNU (Norwegian University of Science and Technology): catalog search, teaching schedules, weekly timetables, and historical grade statistics. Use search_courses first when you don't know the exact course code. Use compare_courses to line courses up side by side when choosing between them, and check_timetable_conflicts to catch schedule and exam clashes before registering.

Tools

12 advertised

search_courses
Advertised by the server during the last successful anonymous check.

Search NTNU's course catalog for a given year (server-side free-text search over course names and codes; Norwegian terms often match best, e.g. 'maskinlæring' rather than 'machine learning'). Call this first when you don't know the exact course code. Returns course codes, Norwegian names, campus, and exam dates.

search_courses input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "year"
  ],
  "properties": {
    "page": {
      "type": "integer"
    },
    "year": {
      "type": "integer"
    },
    "query": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "additionalProperties": false
}
get_course_schedule
Advertised by the server during the last successful anonymous check.

Every dated teaching activity (lectures, labs) for a course in a year, with Oslo-local times and rooms. Long output for large courses — prefer get_weekly_timetable for a compact recurring-week overview.

get_course_schedule input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "course_code",
    "year"
  ],
  "properties": {
    "year": {
      "type": "integer"
    },
    "course_code": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_weekly_timetable
Advertised by the server during the last successful anonymous check.

The recurring weekly timetable grid for a course in a year: weekday, times, ISO-week ranges, rooms, and a classified 'kind' per slot (lecture / exercise / lab / seminar / unknown). The compact way to answer 'when are the lectures for X' — filter on kind == 'lecture', since NTNU's own activity titles are free-form Norwegian text.

get_weekly_timetable input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "course_code",
    "year"
  ],
  "properties": {
    "year": {
      "type": "integer"
    },
    "course_code": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_grade_distribution
Advertised by the server during the last successful anonymous check.

Historical grade distribution for an NTNU course (per year and semester, with counts and percentages; grades A-F, or pass/fail codes). Accepts bare codes like 'TDT4100'. Omit years to get all recorded years. Small counts may be privacy-masked. Data comes from Norway's official DBH statistics.

get_grade_distribution input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "course_code"
  ],
  "properties": {
    "years": {
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "integer"
          }
        },
        {
          "type": "null"
        }
      ]
    },
    "course_code": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_course_versions
Advertised by the server during the last successful anonymous check.

The DBH-versioned course codes (like 'TDT4100-1') that exist for a bare NTNU course code. Useful when grade lookups come back empty.

get_course_versions input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "course_code"
  ],
  "properties": {
    "course_code": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_semesters
Advertised by the server during the last successful anonymous check.

NTNU's terms (semesters) with ids like '26h' (autumn 2026) / '26v' (spring), teaching weeks, exam-period dates, and which term is current.

get_semesters input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
get_course_info
Advertised by the server during the last successful anonymous check.

Everything about an NTNU course except exam logistics: credits, level, campus, language of instruction, prerequisites, mandatory activities, course content / learning outcomes, credit reductions ('studiepoengreduksjon'), which study programs the teaching is planned for, contacts, and any alert notices (e.g. 'no longer taught'). English text by default; pass language 'nb' for Norwegian. Omit year for the current study year. For exam dates, times, aid codes, and rooms use get_exam_info.

get_course_info input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "course_code"
  ],
  "properties": {
    "year": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "language": {
      "anyOf": [
        {
          "enum": [
            "nb",
            "en"
          ],
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "course_code": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_exam_info
Advertised by the server during the last successful anonymous check.

Exam logistics for one or more NTNU courses in a single call: every exam occasion (ordinary / re-sit) with date, start time, duration, permitted-aids code ('hjelpemiddelkode') with its meaning, exam system, and assigned rooms. The way to answer 'when and where are my exams and what can I bring' for a whole semester at once. Rooms are only published days before the exam; unpublished fields are null. Omit year for the current study year.

get_exam_info input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "course_codes"
  ],
  "properties": {
    "year": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "language": {
      "anyOf": [
        {
          "enum": [
            "nb",
            "en"
          ],
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "course_codes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1
    }
  },
  "additionalProperties": false
}
search_study_programs
Advertised by the server during the last successful anonymous check.

Search NTNU's study-program catalog (~400 programs) by free text (name, code, keywords), study level (e.g. 'bachelor', 'master', 'ph.d'), and/or city (Trondheim, Gjøvik, Ålesund). Returns program codes like 'MTDT' — the input for get_study_plan. Call this first when you only know a program's name.

search_study_programs input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "city": {
      "type": [
        "string",
        "null"
      ]
    },
    "level": {
      "type": [
        "string",
        "null"
      ]
    },
    "query": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "additionalProperties": false
}
get_study_plan
Advertised by the server during the last successful anonymous check.

The official study plan for an NTNU program and cohort intake year: which courses (codes, credits, mandatory/elective) belong to each semester, and the specialization choice points with their course groups. The bridge from 'I study X' to concrete course codes — feed them to get_weekly_timetable, check_timetable_conflicts, or get_exam_info. cohort_year is the year the student STARTED (defaults to the current cohort); students in their Nth year started N-1 years ago.

get_study_plan input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "program_code"
  ],
  "properties": {
    "cohort_year": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "program_code": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
compare_courses
Advertised by the server during the last successful anonymous check.

Side-by-side comparison of NTNU courses for a given year — campus, exam dates, weekly teaching hours, and latest grade distribution — to help choose between courses. Accepts bare course codes.

compare_courses input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "course_codes",
    "year"
  ],
  "properties": {
    "year": {
      "type": "integer"
    },
    "course_codes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1
    }
  },
  "additionalProperties": false
}
check_timetable_conflicts
Advertised by the server during the last successful anonymous check.

Checks a set of NTNU courses for the same year for clashing lecture/lab times and colliding exam dates — a clash check to run before registering for courses. Accepts bare course codes. Each side of a conflict carries its activity 'kind': a lecture-vs-lecture clash is unavoidable, while one involving an exercise or lab often has alternative groups. Exam dates come from the catalog, which does not mark deferred (utsatt/kont) sittings.

check_timetable_conflicts input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "course_codes",
    "year"
  ],
  "properties": {
    "year": {
      "type": "integer"
    },
    "course_codes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 2
    }
  },
  "additionalProperties": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

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
928 ms
95th percentile latency
928 ms

Maintenance history

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

  • · probe · passed · 928 ms · metadata changed · 12 tool(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 ntnu-mcp https://ntnu-mcp.martinsundal.no/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 ntnu-mcp --url https://ntnu-mcp.martinsundal.no/mcp

Cursor

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

Cline

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

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start ntnu-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "ntnu-mcp": {
      "type": "http",
      "url": "https://ntnu-mcp.martinsundal.no/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 ntnu-mcp https://ntnu-mcp.martinsundal.no/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://ntnu-mcp.martinsundal.no/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": {
    "ntnu-mcp": {
      "serverUrl": "https://ntnu-mcp.martinsundal.no/mcp"
    }
  }
}

Let your agent find its tools

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