Medify UCAT MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Medify UCAT MCP ServerAnalyse my score trends for full mocks"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Medify UCAT MCP Server
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 |
| Verify Medify authentication |
| List completed mocks ( |
| Detail for one mock by id or title |
| Totals + section trends over time |
| Rank VR / DM / QR (+ SJ when present) |
| Rank question subtypes vs population |
| Timing / tag analysis from recent full mocks |
| Prioritised practice suggestions |
| Diff two mocks |
| 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 buildEnvironment
Variable | Required | Description |
| one of email+password or cookie | Medify member email |
| with email | Medify password |
| alternative | Value of |
| no | Cache directory (default |
| no | Score cache TTL (default |
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 serverProject 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 safelyWhen you add or change MCP tools, update both skills (and tools-reference.md) in the same PR.
How it works
Authenticate via Devise login or an injected
_medify_session_cookie.Read scaled scores from
/courses-api/mock-scores-stats?course=ucat.Optionally load JSON:API scripts from
/courses-api/mock-exam-scriptsfor timing.Read practice analytics from
/courses-api/courses/ucat/topic-performances.Cache mocks locally; analysis tools run on the cached / freshly fetched data.
Security
Never commit
.envor 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 toolsanalyze_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.
| Name | Required | Description | Default |
|---|---|---|---|
| minN | No | Minimum tagged attempts to rank a subtype. Default: 10 | |
| limit | No | Number of recent full mocks to inspect (1–15). Default: 10 | |
| forceRefresh | No | Refresh mock list cache before selecting scripts. Default: false |
TDQS
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.
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.
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.
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.
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.
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_score_trendsA
Analyse personal Medify UCAT mock score trends over time: cognitive totals, per-section averages (VR/DM/QR), best/worst sits, and recent vs earlier comparison. Use when the user asks how scores are moving, whether they are improving, or for a history chart. For subtype drills use analyze_topic_performance; for clock use analyze_question_timing. kind filters which mocks enter the series (full/mini/all; default all). forceRefresh reloads from Medify first. Read-only. Cognitive total is VR+DM+QR only (SJ excluded from totals). Returns analysis plus cache metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Which mocks to include in the trend series. Default: all | |
| forceRefresh | No | Re-fetch mock scores from Medify before analysing. Default: false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It discloses read-only behavior, explains that cognitive total excludes SJ, and mentions cache metadata in returns. This is thorough, though it could mention potential rate limiting or caching effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with purpose, then usage guidance, then parameter explanations. Every sentence is essential and no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, no output schema), the description covers inputs, behavior, and return content (analysis plus cache metadata). However, it is slightly vague on the exact output format (e.g., chart vs text), which could be clarified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value by explaining that 'kind' filters mock types (full/mini/all) and 'forceRefresh' reloads from Medify, providing context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool analyzes personal Medify UCAT mock score trends over time, including cognitive totals, per-section averages, best/worst sits, and comparisons. It also explicitly distinguishes from sibling tools, making its purpose unique.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool (for score trends, improvement, or history chart) and when not to use it (for subtype drills or timing analysis), naming specific alternative tools.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter mocks by kind. Default: all | |
| forceRefresh | No | Re-fetch mock scores before ranking. Default: false |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| minN | No | Minimum personal attempts required for a subtype to appear. Default: 10 | |
| includeSj | No | Include Situational Judgement topics in the ranking. Default: false |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| idA | Yes | First mock id, compositeId, or exact title | |
| idB | Yes | Second mock id, compositeId, or exact title | |
| forceRefresh | No | Refresh mock cache before resolving idA. Default: false |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mock id, compositeId (e.g. date:U:…), or exact title string from Medify | |
| includeRaw | No | Include raw Medify payload fields. Default: false | |
| forceRefresh | No | Bypass local cache and re-fetch the mock list before lookup. Default: false |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter by mock kind. full = full papers, mini = section mini-mocks, all = both. Default: all | |
| includeRaw | No | If true, include raw Medify payload fields on each mock (debug only). Default: false | |
| forceRefresh | No | If true, re-fetch from Medify and ignore the local score cache. Default: false |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Mock kind used for recommendations. Default: all | |
| includeSj | No | Include Situational Judgement recommendations. Default: true | |
| targetTotal | No | Target cognitive total (VR+DM+QR only), e.g. 2250. Adds a gap-to-target recommendation when set | |
| forceRefresh | No | Re-fetch mocks before recommending. Default: false |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
v1.2.0- First observed
analyze_question_timing - First observed
analyze_score_trends - First observed
analyze_section_performance - First observed
analyze_topic_performance - First observed
check_connection - First observed
compare_mocks - First observed
get_mock_details - First observed
list_completed_mocks - First observed
recommend_focus_areas - First observed
refresh_scores
TDQS
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.
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.
10 tools is well-scoped for UCAT analysis, covering browsing, detailed inspection, multiple analytical angles, recommendations, and cache management without redundancy.
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
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
MCP server providing access to the Scorecard API to evaluate and optimize LLM systems.
The official MCP Server for the Mux API
MCP server providing attendance data queries via the CloudTime API.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceMCP server for managing self-hosted Uptime Kuma monitors and querying uptime statistics from Claude.-
- AlicenseBqualityAmaintenanceMCP server exposing 30 tools for League of Legends player analysis, match review, and training-plan generation.3523MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for Valorant match analysis. Enables fetching player stats, match history, agent performance, and more via Henrik's Valorant API.-
- AlicenseAqualityCmaintenanceMCP server for UNSW students to read Moodle, Ed, and official course outlines, including courses, assignments, grades, forums, and AI use policies, with some write capabilities.40MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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