ielts-speaking-coach MCP Server
The ielts-speaking-coach MCP server provides a local, privacy-focused IELTS speaking practice workflow that manages practice sessions, question banks, reviews, and progress data entirely on the learner's own computer.
Initialize workspace: Set up a private local data folder for the learner.
Open dashboard: Launch the local dashboard in the browser for button-first practice selection.
Set training selection: Record the learner's chosen route, part (Part 1/2/3 or Full mock), question(s), session length, and optional single goal.
Get training context: Retrieve current session state, recent sessions, and optional retraining target.
List question bank: Browse imported IELTS topics/questions, optionally filtered by Part or search text.
Import question bank: Add normalized IELTS questions from a JSON array.
Save session review: Store a structured Markdown and JSON review for a practice session.
List practice history: Retrieve past sessions, saved targets, and question data.
Get dashboard data: Fetch all sessions, targets, learner info, and dashboard template for progress summaries.
Local data storage: All learner data (transcripts, recordings, reports, etc.) is stored exclusively on the local computer.
Integrates with ChatGPT Voice, using an Electron desktop bridge to control the ChatGPT web interface, launch Voice sessions, capture conversation text, and generate structured reviews from ChatGPT conversations.
Click on "Deploy 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., "@ielts-speaking-coach MCP ServerShow me my IELTS speaking practice dashboard and recent history"
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.
IELTS Speaking Coach
A GitHub-ready IELTS Speaking desktop app, Codex plugin, and local MCP workflow:
launch ChatGPT Voice from a Windows or macOS desktop dashboard;
send the saved IELTS examiner prompt and capture visible conversation text;
import an IELTS question bank;
choose Part 1, Part 2, Part 3, or a full mock;
create a 7-day, 14-day, or 30-day plan;
generate the same structured review after every session;
freely continue the last question, move to the next question, or select any historical session;
save recommended targets and retrain one selected target through transfer;
automatically ask for a delimited structured review and save it locally;
review history, recurring issues, vocabulary, optional targets, and progress in the dashboard.
Privacy and question-bank content
Learner transcripts, recordings, reports, and login state stay on the local computer and are excluded from this repository. The repository ships only a small original sample question bank so the app can run after cloning. Bring your own licensed IELTS question bank through the import workflow; third-party or OCR-extracted commercial question banks are intentionally not included.
IELTS is a trademark of its respective owners. This independent project is not endorsed by or affiliated with the IELTS test partners. ChatGPT is a trademark of OpenAI; this project is not an official OpenAI product.
Related MCP server: MCP Study Agent
Desktop app
Run locally:
npm install
npm run desktopThe dashboard opens as a desktop window. Click 打开ChatGPT once and sign in yourself. The login is kept in an Electron persistent browser partition. Then select an IELTS question and click 保存并一键启动Voice. End Voice in ChatGPT when the practice is complete. The desktop bridge automatically generates and caches the review; click 同步复盘报告 to save it into the local learning record. If automatic generation does not start, click 补生成复盘报告 and then synchronize it.
After a requested review is saved, the desktop bridge immediately refreshes the latest report, practice history, issue archive, vocabulary archive, and optional retraining target without reloading the whole dashboard.
If the report already exists in the currently open ChatGPT conversation, click 同步复盘报告. The desktop bridge reads that conversation directly and falls back to the clipboard only when necessary. Slightly malformed JSON is repaired when possible before validation and synchronization. The synchronization button never generates a new report; 补生成复盘报告 is the explicit recovery action.
The desktop bridge attempts to locate ChatGPT's current web controls. If ChatGPT changes its interface, the prompt remains available and the learner may need to click Voice manually until selectors are updated.
Build a Windows installer:
npm run package:winBuild the macOS installers on a Mac:
npm run package:macThe macOS build produces separate DMG and ZIP artifacts for Intel (x64) and
Apple silicon (arm64) Macs. A Windows .exe cannot run on macOS, and the
macOS artifacts must be built and tested on macOS. Public distribution also
requires Apple Developer ID signing and notarization; unsigned local builds may
be blocked by Gatekeeper.
Upgrade page
The dashboard includes a highlighted 功能升级 entry below the training navigation.
Set the personal-site destination in mcp/upgrade-page.json:
{
"websiteUrl": "https://your-domain.example/ielts-speaking-coach"
}Only HTTPS destinations are accepted. In the packaged desktop app, the page opens in the learner's default browser so product copy, checkout, and delivery can be updated without changing the local dashboard workflow.
The plugin now includes a local STDIO MCP server. It stores selections, reports, history, and retraining targets on the learner's computer without a hosted backend.
Local MCP
Install dependencies once:
npm installRun the automated MCP smoke test:
npm run test:mcpThe local MCP exposes:
initialize_ielts_workspaceopen_dashboardset_training_selectionget_training_contextsave_session_reviewlist_practice_historyget_dashboard_data
By default, learner data is stored under %LOCALAPPDATA%\IELTS Speaking Coach
on Windows and Electron's application data directory on macOS. Audio recording
is off by default. When the learner explicitly enables it, microphone-only
recordings are stored locally under the recordings folder and can be played or
deleted from the dashboard.
Button-first practice
Ask Codex to 打开雅思口语仪表盘. The open_dashboard
tool opens http://127.0.0.1:43127 in the learner's browser. The learner
chooses a route, Part, exact question, length, and optional single goal. In the
desktop app, the learner starts and ends the complete workflow with buttons.
Prototype boundary
The Skill and MCP do not add Voice by themselves. The optional desktop bridge controls the visible ChatGPT web interface and therefore depends on the learner's ChatGPT access and the current webpage structure. Audio is never stored unless the learner enables the local recording switch.
Try the dashboard
Open demo/dashboard.html in a browser. It contains sample data and demonstrates:
choosing a Part and starting a Voice session;
reviewing a standardized report;
entering a one-target retraining session;
browsing history, issue status, and vocabulary records.
Plugin structure
The installable skill is under skills/ielts-speaking-coach/. The plugin manifest is .codex-plugin/plugin.json.
Available Tools
9 toolsget_dashboard_dataGet IELTS dashboard dataARead-only
Return the learner's local session and target data for a dashboard or progress summary.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| learner | No | |
| targets | Yes | |
| dataRoot | Yes | |
| sessions | Yes | |
| currentSession | No | |
| dashboardTemplate | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true and destructiveHint=false, largely covering the safety profile. The description adds scope context ('local session and target data') beyond annotations. It doesn't disclose whether data requires initialization or whether an empty result is possible if no session exists, but with annotations covering safety, a mid score is appropriate.
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?
Single, efficient sentence. Zero wasted words, clearly front-loaded with the resource type and purpose. Nothing extraneous.
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?
The tool is a simple no-parameter read operation with strong annotations (readOnlyHint, destructiveHint) and an output schema present. For a zero-parameter retrieval tool, the description adequately captures scope. Could note behavior when no data exists yet, but the output schema likely handles structure, keeping this mostly complete.
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?
The tool has 0 parameters and schema coverage is 100%, so the baseline is 4. With no parameters to document, the description doesn't need to add parameter semantics. There is nothing missing here since there are no params.
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?
Clear verb+resource: 'Return the learner's local session and target data' specifies what data is retrieved. The purpose for a dashboard/progress summary is stated. It doesn't explicitly distinguish from siblings like get_training_context, but the resource ('local session and target data') is reasonably specific.
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 implies use when building a dashboard or progress summary. It doesn't name alternatives or exclusions, though sibling tools like open_dashboard could overlap. The context is implied rather than explicit, and no when-not-to-use guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_training_contextGet IELTS training contextARead-only
Read the current selection, recent sessions, and optional saved target before continuing or retraining.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| dataRoot | Yes | |
| routeChoices | Yes | |
| currentSession | No | |
| recentSessions | Yes | |
| recommendedTarget | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds context about what data is read (selection, sessions, saved target) but doesn't disclose details like return format, size of data returned, or rate limits. With annotations covering the safety profile, the additional value is the 'optional saved target' mention, which is modest. No contradiction with annotations.
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?
Single sentence, zero wasted words. Every clause adds meaning: what's read (selection, sessions, saved target), and when (before continuing or retraining). Perfectly front-loaded with the action verb and resource in the opening clause.
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?
The tool is simple (0 params, read-only, no nested objects) and has an output schema present, which covers return-value documentation. The description sufficiently establishes what context is gathered and when to call it. It is complete for a parameterless read tool with annotations and an output schema.
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?
The tool has 0 parameters, so schema coverage is trivially 100%. Per the rubric, 0 params earns a baseline of 4. The description correctly implies no inputs are needed and simply reads current state, which aligns with the parameterless signature. No parameter ambiguity exists to resolve.
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?
Clear verb+resource: 'Read the current selection, recent sessions, and optional saved target' precisely describes what this tool retrieves (training context) for the purpose of continuing or retraining. It distinguishes adequately from siblings like get_dashboard_data and list_practice_history since it's specifically about training context rather than dashboards or raw history.
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 phrase 'before continuing or retraining' provides clear context for when to use the tool (at the start of a training flow). However, it doesn't explicitly exclude alternatives or name sibling tools that might be confused with it. The usage guidance is implied through the purpose statement rather than explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_question_bankImport IELTS question bankC
Import normalized IELTS speaking questions from a JSON array and save them to the learner's local question bank.
| Name | Required | Description | Default |
|---|---|---|---|
| sourceUrl | No | ||
| sourceName | Yes | ||
| questionsJson | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| imported | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, openWorldHint=false, destructiveHint=false, which indicate this mutates local state. The description says 'save them to the learner's local question bank' which implies persistence, but doesn't disclose whether existing questions are overwritten, merged, or duplicated. It doesn't mention validation behavior, failure handling, or whether the import is transactional. With no destructive hint and multiple possible write behaviors, more disclosure is needed.
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?
Single efficient sentence that conveys the core action and target within one clause. No wasted words. It's appropriately compact, though it could arguably be longer given the lack of behavioral disclosure elsewhere. Structure is clean and front-loaded with the primary verb.
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?
The tool has 3 parameters with 0% schema description coverage, no enums, and no nested objects, so the description is the primary documentation source. Yet it fails to explain the JSON format requirements, the relationship between sourceName/sourceUrl, merge vs replace behavior, response/return values (though output schema exists), and interaction with siblings like list_question_bank. For an import tool, this is notably incomplete.
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 0%, so the description carries the full burden for parameter meaning. However, the description itself mentions 'JSON array' which aligns with questionsJson, and 'normalized' hints at expected format. But it doesn't explain sourceName vs sourceUrl distinction, what maxLength limits imply, or what 'normalized' actually means structurally. The description adds partial meaning beyond the schema but leaves the parameter semantics significantly under-specified.
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 action (import), the resource (IELTS speaking questions from a JSON array), and the destination (learner's local question bank). It uses a specific verb+resource construction that effectively communicates the core function. It doesn't explicitly distinguish from sibling tools like list_question_bank, but the import-vs-list distinction is reasonably implied.
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 gives no guidance on when to use this tool versus alternatives like list_question_bank or initialize_ielts_workspace. It also doesn't clarify whether an initial workspace must exist before importing, whether the import appends to or replaces existing questions, or what format expectations exist beyond 'normalized.' No exclusions or alternative tool recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
initialize_ielts_workspaceInitialize IELTS speaking workspaceC
Create the learner's private local data workspace before the first practice session.
| Name | Required | Description | Default |
|---|---|---|---|
| displayName | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| dataRoot | Yes | |
| initialized | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=false, which partially signals this is a mutating operation, and the description's 'Create' verb aligns. However, no annotations declare auth requirements or idempotency, and the description adds nothing about what 'creating a workspace' entails — does it overwrite existing data? Is it safe to call multiple times? What gets created? With a mutating operation and only minimal annotation coverage, the description carries more burden than it satisfies.
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 a single, efficient sentence with zero waste. It front-loads the core action ('Create the learner's private local data workspace') and adds relevant timing context. Brief but complete for what it attempts to convey.
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 stateful initialization tool (readOnlyHint=false) with no output schema explanation in the description and an optional parameter that isn't explained, this is under-specified. The description doesn't address idempotency (a key concern for 'initialize' operations), return behavior, or the effect of the displayName parameter. Given the tool's mutating nature and the existence of an output schema, more disclosure is warranted.
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?
There is only one optional parameter, displayName, with no required params and 0% schema description coverage. The description does not mention displayName at all — what it does or how it affects workspace creation. However, with a single, self-explanatory parameter name (displayName), the schema arguably conveys most meaning. The description adds nothing beyond schema for this parameter, so baseline is appropriate.
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 states a specific verb (Create) and a resource (learner's private local data workspace), and provides clear context (before the first practice session). It distinguishes the action from sibling tools like set_training_selection and open_dashboard, though it doesn't explicitly contrast them. The purpose is genuinely clear and specific.
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 implies usage context via 'before the first practice session' but provides no when-to-use vs alternatives guidance, no prerequisites, and no exclusion scenarios. There is no mention of when NOT to call this tool (e.g., if workspace already exists) or whether it's safe to call repeatedly. The one usage hint ('before first session') is helpful but insufficient for an initialize/stateful operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_practice_historyList IELTS practice historyARead-only
List recent locally saved IELTS speaking sessions for review or optional retraining.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| targets | Yes | |
| sessions | Yes | |
| questions | Yes | |
| questionSources | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, so the safety profile is already established. The description adds the 'locally saved' scoping detail, clarifying that sessions are stored locally rather than cloud-based. However, it doesn't describe return format, ordering, or pagination behavior. The description adds modest value beyond annotations but not rich context.
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?
A single concise sentence that states the action clearly without wasted words. It names the verb (list), resource (recent locally saved IELTS speaking sessions), and purpose (for review or optional retraining). Efficient and well-structured.
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?
The tool has only one parameter already fully documented in the schema (limit with min/max/default), a readOnly annotation, and an output schema. For such a simple listing tool, the description covers the essential intent. The purpose statement ('for review or optional retraining') adds useful context for when the agent might want this. Adequate completeness for a low-complexity 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 description coverage is 0%, meaning the description itself contains no parameter documentation. However, the single parameter 'limit' is fully self-documenting via the schema (integer, default 10, min 1, max 50) — its semantics are obvious. With only 1 param and the description noting 'recent' sessions (implying ordered output), the parameter meaning is clear without additional explanation. No meaningful gap exists.
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?
'List recent locally saved IELTS speaking sessions' uses a specific verb (list) plus a clear resource (IELTS speaking sessions) and a scoping modifier (recent, locally saved). The purpose statement 'for review or optional retraining' adds valuable intent context. It distinguishes from siblings like get_dashboard_data (which aggregates different data) and get_training_context (training-specific). Clear and specific.
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 implies use cases ('for review or optional retraining') but does not explicitly distinguish when to use this tool versus siblings like get_dashboard_data, save_session_review, or set_training_selection. No when-not-to-use guidance or alternative recommendations are provided. Some context is implied via the purpose phrase, but explicit comparison to alternatives is absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_question_bankList IELTS question bankARead-only
List imported IELTS speaking topics or exact questions, optionally filtered by Part or search text.
| Name | Required | Description | Default |
|---|---|---|---|
| part | No | ||
| limit | No | ||
| search | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| sources | Yes | |
| questions | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the agent knows this is a safe, bounded read operation. The description adds that it lists 'imported' content (establishing the data source). With annotations covering the safety profile, the description's marginal value is modest but present, landing at a 3 rather than higher.
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?
A single concise sentence that front-loads the core purpose and mentions the filtering options. Zero wasted words, appropriately sized for a read-only listing tool. Every element earns its place.
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?
The tool has an output schema (which explains return values, reducing the description's burden) and good annotations for safety. The description covers the primary function and filter options. However, with 0% schema coverage for the three params, it would benefit from a bit more prose on search semantics and limit behavior to be fully complete.
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 0%, meaning the description must compensate for documenting parameters. The description mentions filtering by 'Part or search text' which maps to the part and search parameters, and implies limit exists. However, it doesn't clarify the exact 'Part' enum values beyond what the schema shows, nor whether search applies to topic names, exact question text, or both. The limit param's semantics and default are undocumented in prose.
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 states a clear verb+resource ('List imported IELTS speaking topics or exact questions') with optional filters. It distinguishes the read-only listing purpose from sibling tools like import_question_bank (ingestion) and get_training_context (retrieval of a specific session context). However, it doesn't explicitly differentiate from other read-only list tools like get_dashboard_data or list_practice_history, though the domain (question bank vs practice history) is implied.
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 implies usage context ('imported topics', 'optionally filtered by Part or search') which suggests this operates on an already-imported bank, and the sibling name import_question_bank implies the prerequisite. However, it doesn't explicitly state when to use this vs alternatives like get_dashboard_data or get_training_context, nor does it state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
open_dashboardOpen IELTS speaking dashboardA
Open the learner's private local dashboard to choose a practice route with buttons.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| opened | Yes | |
| dashboardUrl | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=false, openWorldHint=false, and destructiveHint=false, which give some baseline. The description adds that this opens a 'learner's private local' dashboard, conveying a personal-scope and UI-navigation behavior. However, it doesn't disclose what 'open' entails (e.g., whether it navigates the learner's browser, launches a local file, or returns a view) or any side effects, leaving behavioral clarity incomplete.
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?
One clean sentence that states the action, target, and purpose. It is front-loaded and free of filler. A minor deduction because 'with buttons' is slightly redundant detail, but the overall structure is tight and effective.
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 this is a zero-parameter, navigation-style tool with an output schema present, the description is adequately complete. It explains the purpose and scope. It could be enhanced by clarifying what happens after opening (what the output represents) and its relationship to get_dashboard_data, but the presence of an output schema reduces that burden.
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?
The tool has zero parameters, and schema coverage is 100% (nothing to document). Per the rubric, 0 params earns a baseline of 4. The description doesn't need to add parameter semantics since there are none, and it correctly conveys the tool requires no inputs.
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 states a specific verb ('Open') and resource ('learner's private local dashboard') with a clear purpose ('to choose a practice route with buttons'). It distinguishes itself from siblings like get_dashboard_data, which likely returns data rather than opening a UI. Slight ambiguity about what 'open' means in an MCP context (navigate vs. launch) prevents a 5.
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 implies this is a navigation/action tool to reach the dashboard for choosing practice routes, contrasting with get_dashboard_data. However, it does not explicitly state when to use this versus get_dashboard_data or when not to use it. There is also no mention of prerequisites like whether the workspace must be initialized first (sibling initialize_ielts_workspace suggests this may be needed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_session_reviewSave standardized IELTS reviewA
Save the fixed-format Markdown review and its machine-readable JSON record after a practice session.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | No | ||
| reportJson | Yes | ||
| reportMarkdown | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| saved | Yes | |
| jsonPath | Yes | |
| sessionId | Yes | |
| markdownPath | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, which already indicate this is a write (non-readonly) operation that isn't destructive. The description adds that it saves 'the fixed-format Markdown review' and 'its machine-readable JSON record', giving some specification about what gets persisted. It doesn't mention overwrite behavior, ID association, or whether the session must exist first.
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?
A single, concise sentence that fronts the verb and resource clearly. Every word earns its place - no filler, no redundancy, efficient delivery of purpose.
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 tool with 2 required params, 0% schema coverage, and no explanation of the fixed format or how sessionId relates, some gap remains. The output schema exists but its content isn't shown in the definition. The description adequately covers the core save action but omits details about the reportJson format requirements and session association semantics.
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 0%, so the description carries the burden for parameter meaning. It references reportMarkdown (fixed-format Markdown review) and reportJson (machine-readable JSON record), adding meaning beyond the bare schema. However, it doesn't explain the 'fixed format' specifics, required format of reportJson, or the role of sessionId (which is optional in 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 states a clear action: saving a fixed-format Markdown review and its JSON record after a practice session. It identifies the two artifacts (reportMarkdown, reportJson) and the timing ('after a practice session'). However, it doesn't distinguish from potential siblings like list_practice_history, though those are reading tools, so sibling differentiation is less critical here.
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 conveys this is used post-practice-session to persist review artifacts. It doesn't explicitly state when NOT to use it or name alternatives, but the context (after a practice session) is clear. No exclusions or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_training_selectionSet IELTS training selectionB
Save the learner's freely chosen route and today's practice settings before a Voice session.
| Name | Required | Description | Default |
|---|---|---|---|
| part | Yes | ||
| route | Yes | ||
| length | No | standard | |
| planItemId | No | ||
| questionId | No | ||
| singleGoal | No | ||
| questionIds | No | ||
| selectedReference | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| session | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, providing a baseline safety profile. The description adds that it 'saves' a 'freely chosen route' and 'practice settings,' implying a persistence/write action. It doesn't disclose side effects like overwriting existing selections or whether the save is required for a valid session, but annotations already cover the mutation/destruction dimensions.
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?
A single, efficient sentence that earns its place by defining scope ('before a Voice session') and content ('freely chosen route' and 'practice settings'). No wasted words. Could slightly enrich by listing the key saved fields, but stays appropriately tight.
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?
The tool has 8 parameters (3 enums), 0% schema coverage, and an output schema exists. For a complex setup tool with multiple route enums and conditional parameters (questionId vs questionIds, planItemId, selectedReference), the description provides minimal context: it says it saves route and settings but doesn't explain the selection logic, how the route values map to required parameters, or what the output represents. The output schema exists, which slightly lowers the burden, but for a tool with this param complexity, the 2-3 sentence description is insufficient.
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 0%, so the description must compensate for explaining parameters. The description mentions 'route' and 'practice settings' at a high level, partially mapping to 'route' and 'length' parameters, but it does not explain the semantics of required parameter 'part' (Part 1/2/3 vs Full mock) or optional params like questionId vs questionIds, planItemId, or singleGoal, nor when each route value is appropriate. With 8 parameters at 0% coverage, this is a significant gap.
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 states a specific action ('Save the learner's freely chosen route and today's practice settings before a Voice session') with a clear resource (training selection). It distinguishes the tool's role as a pre-session setup action versus siblings like 'save_session_review' (post-session). However, it does not explicitly differentiate from 'get_training_context' or 'initialize_ielts_workspace' beyond implying setup.
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 signals the timing ('before a Voice session'), giving a clear context for when to call it. However, it does not explicitly state when NOT to use it or name alternative tools. There is no exclusion guidance, e.g., when to use save_session_review vs this, or get_training_context vs this.
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.
9 tool updates
v0.1.48- First observed
get_dashboard_data - First observed
get_training_context - First observed
import_question_bank - First observed
initialize_ielts_workspace - First observed
list_practice_history - First observed
list_question_bank - First observed
open_dashboard - First observed
save_session_review - First observed
set_training_selection
TDQS
Scored across 9 tools
Most tools are clearly distinct: initialization, selection, dashboard, context, question bank (list/import), session review, history, and data retrieval each serve a unique purpose. The only minor ambiguity is between get_dashboard_data and get_training_context, and between open_dashboard and get_dashboard_data, which both touch dashboard-related concerns but differ in interaction style (UI open vs data fetch).
Tools follow a consistent verb_noun pattern: initialize/list/import/save/get/set/open prefixes with clear object nouns. The pattern is largely predictable, though mixing first-word verbs (initialize, set, open, get, list, import, save) is fine—the objects (workspace, selection, dashboard, context, question_bank, session_review, history, data) are consistently snake_case nouns.
Nine tools is well-scoped for an IELTS speaking coach server. Each tool covers a distinct workflow step (init, configure, view options, retrieve context, browse/import questions, save review, view history, fetch dashboard), and none feel redundant or trivial.
The tool surface covers the full practice lifecycle: workspace setup, training selection/configuration, question bank management (list/import), session review saving, and history/dashboard retrieval. Minor gaps include no tool to update or delete the question bank (only import), and no tool to directly edit saved reviews, but the core workflow is complete and functional.
Maintenance
Related MCP Connectors
The Instant MCP server is a wrapper around the Instant Platform SDK that enables creating, managing, and updating InstantDB applications directly within an editor. It provides tools for fetching rules files for LLMs, retrieving and pushing app schemas, managing permission rules, and executing database queries. Key capabilities include schema management (get-schema, push-schema), permission management (get-perms, push-perms), query execution, and listing recent query history.
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
- mcpOAuthcom.gibsonai
GibsonAI MCP server: manage your databases with natural language
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA tutorial MCP server for learning the Model Context Protocol by building file and system tools. Provides hands-on experience creating custom tools that enable AI models to interact with files and execute system commands.-
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables users to interact with local documents for educational purposes through tools for listing and reading files. It features an integrated agent capable of automatically generating document summaries and study flashcards.-
- AlicenseBqualityDmaintenanceAn MCP server that locally saves and categorizes user prompts from LLM sessions to facilitate metacognition and track learning progress. It provides tools to review study history, analyze question types, and calculate learning depth scores based on the nature of inquiries.55 npm1ISC
- FlicenseNot gradedqualityCmaintenanceLocal MCP server enabling ChatGPT to reference large files by path, manage long-running jobs, and register local resources like screenshots and logs without modifying source files.-