Skip to main content
Glama

Medify UCAT MCP Server

medify-mcp-server MCP server License: MIT

Model Context Protocol (MCP) server for Medify UCAT accounts. It authenticates as a member, pulls completed mock scores and practice analytics, and exposes tools for score trends, question-type weaknesses, timing sinks, and practice recommendations.

Medify does not publish a documented public API. This server talks to the same authenticated courses-api endpoints the Medify web app uses (member email/password or session cookie).

Unofficial. Not affiliated with or endorsed by Medify. Use only with accounts you own. Credentials stay on your machine.

Listed on Glama. Maintainer claim / release steps: docs/glama-release.md.

Features

  • List completed full / mini mocks with VR, DM, QR (and SJ when present)

  • Trend analysis: totals, section averages, recent vs earlier, best / worst

  • Topic analytics: subtype accuracy vs Medify population (e.g. logic puzzles, tables)

  • Question timing: clock usage, early/mid/late thirds, time sinks, fast guesses

  • Focus recommendations with optional cognitive target (e.g. 2250)

  • Local session + score cache under ~/.medify-mcp-server

Related MCP server: League of Legends MCP Server

Tools

Tool

Description

check_connection

Verify Medify authentication

list_completed_mocks

List completed mocks (full / mini / all)

get_mock_details

Detail for one mock by id or title

analyze_score_trends

Totals + section trends over time

analyze_section_performance

Rank VR / DM / QR (+ SJ when present)

analyze_topic_performance

Rank question subtypes vs population

analyze_question_timing

Timing / tag analysis from recent full mocks

recommend_focus_areas

Prioritised practice suggestions

compare_mocks

Diff two mocks

refresh_scores

Force re-fetch (bypass cache)

Requirements

  • Node.js 18+

  • A Medify UCAT membership with completed mocks

Setup

git clone https://github.com/ankitforcode/medify-mcp-server.git
cd medify-mcp-server
npm install
cp .env.example .env
# edit .env — set MEDIFY_EMAIL + MEDIFY_PASSWORD (or MEDIFY_SESSION_COOKIE)
npm run build

Environment

Variable

Required

Description

MEDIFY_EMAIL

one of email+password or cookie

Medify member email

MEDIFY_PASSWORD

with email

Medify password

MEDIFY_SESSION_COOKIE

alternative

Value of _medify_session_ from a logged-in browser

MEDIFY_CACHE_DIR

no

Cache directory (default ~/.medify-mcp-server)

MEDIFY_CACHE_TTL_MINUTES

no

Score cache TTL (default 15)

Prefer a session cookie if password login is blocked (captcha / MFA).

Cursor / MCP client config

Add a stdio MCP server entry (path and env are examples):

{
  "mcpServers": {
    "medify-ucat": {
      "command": "node",
      "args": ["/absolute/path/to/medify-mcp-server/dist/index.js"],
      "env": {
        "MEDIFY_EMAIL": "you@example.com",
        "MEDIFY_PASSWORD": "your-password"
      }
    }
  }
}

Or point env at a dotenv file you load yourself, and keep secrets out of the MCP config.

Restart the MCP client after changing config or rebuilding.

npx (after publish)

{
  "mcpServers": {
    "medify-ucat": {
      "command": "npx",
      "args": ["-y", "medify-mcp-server"],
      "env": {
        "MEDIFY_EMAIL": "you@example.com",
        "MEDIFY_PASSWORD": "your-password"
      }
    }
  }
}

Example prompts

  • “Check my Medify connection and list completed UCAT mocks.”

  • “Analyse score trends and section strengths for full mocks only.”

  • “Which question types am I weakest on vs the Medify population?”

  • “Where do I lose time in VR, DM, and QR on recent full mocks?”

  • “Recommend focus areas for a 2250 cognitive target; ignore SJ.”

  • “Compare Mock 10 and Mock 11.”

Development

npm run build
npm test
npm start          # stdio MCP server

Project layout:

src/
  index.ts           # MCP stdio entry
  medify/            # auth client, fetch, normalize
  analysis/          # trends, topics, timing, recommendations
  tools/             # MCP tool schemas + handlers
.cursor/skills/
  medify-ucat-analysis/   # agent skill: run score/timing reports via MCP
  medify-mcp-maintain/    # agent skill: change this codebase safely

When you add or change MCP tools, update both skills (and tools-reference.md) in the same PR.

How it works

  1. Authenticate via Devise login or an injected _medify_session_ cookie.

  2. Read scaled scores from /courses-api/mock-scores-stats?course=ucat.

  3. Optionally load JSON:API scripts from /courses-api/mock-exam-scripts for timing.

  4. Read practice analytics from /courses-api/courses/ucat/topic-performances.

  5. Cache mocks locally; analysis tools run on the cached / freshly fetched data.

Security

  • Never commit .env or session cookies.

  • Treat Medify credentials like any other account secret.

  • This tool only reads account data needed for score analysis; it does not submit mocks.

License

MIT — see LICENSE.

Available Tools

10 tools
analyze_question_timingA

Analyse per-question timing from recent full mocks: section clock usage, early/mid/late thirds, weakest tags, time sinks (slow zeros), and fast guesses (sub-budget zeros). Use when the user asks about pacing, running out of time, or rushing. Not a substitute for score trends or topic accuracy rankings. limit = number of recent full mocks to inspect (1–15, default 10). minN filters tag rankings. forceRefresh refreshes the mock list first. Read-only. Loads script details (questions + timings) from Medify courses-api; may be slower than score-only tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
minNNoMinimum tagged attempts to rank a subtype. Default: 10
limitNoNumber of recent full mocks to inspect (1–15). Default: 10
forceRefreshNoRefresh mock list cache before selecting scripts. Default: false

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses read-only nature and performance caveat ('may be slower than score-only tools'). No annotations provided, so description carries full burden; it covers behavioral traits adequately.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then usage, then parameter details, then notes. Each sentence serves a purpose; no fluff or redundancy. Efficient communication.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes outputs (section clock usage, thirds, tags, time sinks, fast guesses) but lacks explicit return structure or error conditions. However, for selection purposes, it provides sufficient context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all 3 parameters; description adds context: explains limit range, minN filters tag rankings, forceRefresh refreshes mock list. Adds value beyond schema, but schema already provides baseline descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool analyzes per-question timing with specific metrics (section clock usage, thirds, tags, time sinks, fast guesses). It distinguishes from sibling tools like analyze_score_trends by focusing on pacing analysis.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use ('when the user asks about pacing, running out of time, or rushing') and what it is not a substitute for ('score trends or topic accuracy rankings'). No ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_section_performanceA

Rank VR, DM, and QR strengths and weaknesses from completed Medify UCAT mocks, with an SJ band summary when SJ scores exist. Use to answer “which section is weakest?” before recommending drills. Does not break down question subtypes — use analyze_topic_performance for that. kind selects full/mini/all mocks (default all). forceRefresh bypasses cache. Read-only. Returns ranked sections with averages and relative standing; SJ is summarised separately and not folded into cognitive totals.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoFilter mocks by kind. Default: all
forceRefreshNoRe-fetch mock scores before ranking. Default: false

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It declares 'Read-only', explains caching behavior via forceRefresh, and describes return value structure ('ranked sections with averages and relative standing; SJ is summarised separately').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences: purpose and scope, usage with alternative, and parameter/behavior details. Front-loaded with most important info, no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description fully explains return values. It covers read-only, caching, mock filtering, and the distinction between cognitive sections and SJ. All relevant context is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already describes kind and forceRefresh. The description adds value by stating default values ('default all') and behavioral effects ('bypasses cache'), which goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Rank VR, DM, and QR strengths and weaknesses from completed Medify UCAT mocks' and specifies both the verb (rank) and the resource (sections from completed mocks). It distinguishes from analyze_topic_performance by noting it does not break down question subtypes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use to answer “which section is weakest?” before recommending drills.' and provides a clear alternative: 'use analyze_topic_performance for that' when question subtype breakdown is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

analyze_topic_performanceA

Rank Medify UCAT question subtypes (e.g. logic puzzles, tables, VR without keywords, text/visual inference) by personal accuracy versus Medify population averages. Best tool for “what should I drill?” at the question-type level. Complements analyze_section_performance (sections) and analyze_question_timing (clock). includeSj defaults false (omit Situational Judgement). minN drops sparse subtypes (default 10 attempts). Read-only. Fetches live topic-performances from Medify (includes practice history aggregated by Medify, not only mocks).

ParametersJSON Schema
NameRequiredDescriptionDefault
minNNoMinimum personal attempts required for a subtype to appear. Default: 10
includeSjNoInclude Situational Judgement topics in the ranking. Default: false

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Clearly states 'Read-only' and 'Fetches live topic-performances from Medify (includes practice history aggregated by Medify, not only mocks).' Discloses behavior beyond defaults, with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise with 6 sentences, front-loaded with purpose and usage. Every sentence adds value: purpose, usage guidance, parameter details, data source. No redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given schema coverage 100% and no output schema, description covers parameters, read-only nature, data source, and sibling context. Lacks output format details (e.g., ranking presentation) but sufficient for selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for both parameters, so baseline is 3. Description adds value by stating defaults (includeSj false, minN 10) and explaining their effect ('omit Situational Judgement', 'drops sparse subtypes'), which aids agent understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states tool ranks UCAT question subtypes by personal accuracy vs population averages, with specific verb 'rank' and resource 'question subtypes'. Distinguishes from siblings by specifying it complements analyze_section_performance and analyze_question_timing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Best tool for what should I drill? at the question-type level.' Provides guidance on parameters (includeSj defaults false, minN defaults 10) and mentions complementary tools, giving clear when-to-use and when-not context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_connectionA

Verify that Medify authentication works and the UCAT courses-api score endpoint is reachable for this account. Call this first when setup fails, after changing MEDIFY_EMAIL/MEDIFY_PASSWORD/MEDIFY_SESSION_COOKIE, or before trusting other tools. Returns ok/authenticated flags, whether email or cookie env is configured, and a human-readable message. Does not list mocks or modify cache. Requires network access to app.medify.co; succeeds from a persisted session jar even if env credentials are unset.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that it is read-only (does not modify cache), requires network access, and succeeds from persisted session even without env credentials. No annotations provided, so description fully covers behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Informative but slightly verbose; could be tightened. However, front-loads purpose and uses clear structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Returns explained (flags, env config, message). Covers prerequisites, limitations, and behavior. No output schema, so description adequately documents return values and context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters, so schema coverage is 100%. Baseline for 0 params is 4; description adds no param info but doesn't need to.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it verifies authentication and endpoint reachability. Distinguishes from sibling tools which deal with mocks and analysis, not connection checking.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to call: after setup fails, after changing credentials, or before trusting other tools. Also states what it does not do (list mocks, modify cache).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_mocksA

Compare two completed Medify UCAT mocks section-by-section and by cognitive total (VR+DM+QR). Use when the user names two sits (ids or titles). For overall history use analyze_score_trends; for one mock use get_mock_details. idA and idB accept mock id, compositeId, or exact title. forceRefresh reloads the list before resolving idA. Read-only. Returns found=false with missing ids if either mock cannot be resolved; otherwise a structured section/total diff.

ParametersJSON Schema
NameRequiredDescriptionDefault
idAYesFirst mock id, compositeId, or exact title
idBYesSecond mock id, compositeId, or exact title
forceRefreshNoRefresh mock cache before resolving idA. Default: false

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description declares the tool is read-only, explains behavior when mocks are not found ('Returns found=false with missing ids'), and describes forceRefresh effect. Without annotations, this is strong transparency, though slight ambiguity in 'refresh the list'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with main purpose, no redundant words. Every sentence adds value, including usage guidance and return behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description covers return states (found=false, structured diff). For a 3-parameter tool with no nested objects, this is complete enough, though slightly more detail on the diff structure would push to 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% but description adds value by clarifying idA/idB accept 'mock id, compositeId, or exact title' and explaining forceRefresh refreshes cache. This goes beyond the schema's basic descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool compares two completed Medify UCAT mocks section-by-section and by cognitive total. It uses a specific verb ('compare') and resource ('mocks') and distinguishes from siblings by referencing analyze_score_trends and get_mock_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly says 'Use when the user names two sits (ids or titles)' and provides explicit alternatives: 'For overall history use analyze_score_trends; for one mock use get_mock_details.' It also explains input acceptance (ids, compositeId, titles).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mock_detailsA

Get detailed scores for one completed Medify UCAT mock looked up by id, compositeId, or exact title. Use after list_completed_mocks when you need a single sit (e.g. “Mock 12”). For side-by-side diffs use compare_mocks instead. Returns section scores, totals, dates, and optional raw fields. Missing id throws; unknown id returns not-found style result from the handler. Read-only. forceRefresh refreshes the mock list cache before lookup.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMock id, compositeId (e.g. date:U:…), or exact title string from Medify
includeRawNoInclude raw Medify payload fields. Default: false
forceRefreshNoBypass local cache and re-fetch the mock list before lookup. Default: false

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite no annotations, the description covers read-only nature, error handling ('Missing id throws; unknown id returns not-found style'), and caching behavior (forceRefresh).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with no redundant words, front-loaded with purpose, and efficiently structured in a few sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and no annotations, the description covers return fields, error behavior, cache refresh, and parameter variations, providing a complete picture for the agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds value by clarifying that id can be id, compositeId, or exact title, which is beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies the verb 'get' and resource 'detailed scores for one completed Medify UCAT mock', and distinguishes from siblings like list_completed_mocks and compare_mocks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states to use after list_completed_mocks when needing a single sit, and suggests compare_mocks for diffs, providing clear when-to and when-not-to guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_completed_mocksA

List completed Medify UCAT mocks for the signed-in account with section scores (VR/DM/QR, SJ when present) and cognitive totals. Use for inventory (“what have I sat?”) before trends or comparisons. Prefer analyze_* tools when you need ranked insights rather than a raw list. kind filters full mocks, mini-mocks, or all (default all). forceRefresh bypasses the local cache; includeRaw adds Medify payload fields for debugging. Read-only. Returns mocks plus cached/fetchedAt metadata. Empty list means no completed mocks or auth failed — call check_connection.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoFilter by mock kind. full = full papers, mini = section mini-mocks, all = both. Default: all
includeRawNoIf true, include raw Medify payload fields on each mock (debug only). Default: false
forceRefreshNoIf true, re-fetch from Medify and ignore the local score cache. Default: false

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so description carries full burden. Discloses read-only nature, caching behavior (forceRefresh bypasses), and empty list implying auth failure. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence adds value. Front-loaded with purpose, efficient with no fluff. Uses bullet-like formatting for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description explains return values (section scores, cognitive totals, metadata). Handling of empty list and auth failure completes the picture for this list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage 100%; description adds context beyond schema: kind filters, forceRefresh purpose, includeRaw for debugging. Significantly aids parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Explicitly states 'list completed Medify UCAT mocks with section scores and cognitive totals'. Distinguishes from analyze_* tools by noting they provide ranked insights. Clear verb and resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit use case: 'inventory before trends/comparisons'. Warns to prefer analyze_* for ranked insights. Explains empty list meaning and fallback action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recommend_focus_areasA

Recommend prioritised UCAT practice focus areas from mock history (weakest sections, declining trends, optional gap to a cognitive target). Use for a practice plan. For evidence behind the plan, also call analyze_topic_performance and/or analyze_question_timing. kind filters mocks. includeSj defaults true for SJ advice — set false for cognitive-only plans. targetTotal (e.g. 2250) adds a VR+DM+QR gap recommendation. Read-only. Returns ordered recommendations with reasons/suggestions plus a short summary. Does not create Medify practice sets.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoMock kind used for recommendations. Default: all
includeSjNoInclude Situational Judgement recommendations. Default: true
targetTotalNoTarget cognitive total (VR+DM+QR only), e.g. 2250. Adds a gap-to-target recommendation when set
forceRefreshNoRe-fetch mocks before recommending. Default: false

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, but description fully discloses behavior: 'Read-only', 'Returns ordered recommendations with reasons/suggestions plus a short summary', and 'Does not create Medify practice sets'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three focused sentences, front-loaded with purpose, no redundant words. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 4 optional params and no output schema, description covers what is returned and what is not done. Sufficient for an agent to correctly invoke.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds meaning for kind ('filters mocks'), includeSj ('defaults true for SJ advice'), and targetTotal ('adds a gap recommendation'). forceRefresh not elaborated, but overall useful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states 'Recommend prioritised UCAT practice focus areas from mock history' – a specific verb+resource. It distinguishes from sibling tools like analyze_topic_performance and analyze_question_timing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use for a practice plan' and suggests calling analyze_topic_performance and/or analyze_question_timing for evidence. Also clarifies kind filtering, includeSj default, and targetTotal usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

refresh_scoresA

Force re-fetch completed mock scores from Medify and update the local cache under MEDIFY_CACHE_DIR (default ~/.medify-mcp-server). Call after finishing a new mock when other tools still show stale data, or when cache TTL has not expired yet. Returns fetch metadata (count/fetchedAt). Does not analyse scores — pair with analyze_score_trends or list_completed_mocks afterward. Requires valid Medify auth. Overwrites the cached mock list only; does not change Medify account data.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully covers behavior: requires valid Medify auth, overwrites cache only, does not change Medify account data, and returns fetch metadata. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences concisely convey purpose, usage, limitations, and return value. No wasted words; essential information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a refresh/cache tool with no input or output schema, the description is fully complete. It covers triggers, effects, requirements, and limitations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has zero parameters, so parameter semantics are not applicable. The description effectively explains the tool's behavior without needing parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's specific action: force re-fetch completed mock scores from Medify and update local cache. It distinguishes from sibling tools like analyze_score_trends by noting it does not analyze scores.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (after finishing a mock with stale data or cache TTL not expired) and what not to use it for (does not analyze scores). Recommends pairing with analyze_score_trends or list_completed_mocks for further analysis.

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. Dates show when Glama detected each change.

  1. 10 tool updatesv1.2.0
    • First observedanalyze_question_timing
    • First observedanalyze_score_trends
    • First observedanalyze_section_performance
    • First observedanalyze_topic_performance
    • First observedcheck_connection
    • First observedcompare_mocks
    • First observedget_mock_details
    • First observedlist_completed_mocks
    • First observedrecommend_focus_areas
    • First observedrefresh_scores

TDQS

A4.8/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: auth check, list mocks, get details, various analyses (trends, sections, topics, timing), recommendations, comparison, and cache refresh. No overlap.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case (e.g., check_connection, list_completed_mocks, analyze_score_trends). Naming is predictable and clear.

Tool Count5/5

10 tools is well-scoped for UCAT analysis, covering browsing, detailed inspection, multiple analytical angles, recommendations, and cache management without redundancy.

Completeness5/5

The tool surface comprehensively covers the domain: listing, details, trends, section/topic/timing analysis, comparison, recommendations, and cache refresh. No obvious gaps for a read-only analysis server.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ankitforcode/medify-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server