TOEIC Speaking MCP Server
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., "@TOEIC Speaking MCP ServerLet's start TOEIC speaking practice."
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.
๐ฏ TOEIC Speaking MCP Server
ํ ์ต ์คํผํน ๋ง๋ฅ๋ฌธ์ฅ ์๊ธฐ ํ ์คํธ๋ฅผ ์ํ MCP ์๋ฒ์ ๋๋ค. Claude Desktop ์ฑ๊ณผ ์ฐ๋ํ์ฌ ์์ฑ์ผ๋ก ํ ์ต ์คํผํน ๋ฌธ์ฅ์ ํ์ตํ๊ณ ์ฆ์ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์์ต๋๋ค.
์ถ์ฒ: ์ ํ๋ธ ์๊ณํ ๋ผ์ ๋์ค
๐ ๋ชฉ์ฐจ
Related MCP server: mcp-server-pronunciation
โจ ์ฃผ์ ํน์ง
๐ค ์์ฑ ํ์ต: Claude Desktop ์์ฑ ์ธ์์ผ๋ก ์์ฐ์ค๋ฌ์ด ํ์ต
๐ง ์ ์ํ ์ถ์ : mastery_score ๊ธฐ๋ฐ ์ทจ์ฝ ๋ฌธ์ฅ ์ฐ์ ์ถ์
โก ์ฆ์ ํผ๋๋ฐฑ: ํค์๋ ๋งค์นญ ๋ถ์์ผ๋ก ์ค์๊ฐ ํ์ต ํจ๊ณผ ํ์ธ
๐ ์๋ ์ ์ ๊ด๋ฆฌ: ๋ต๋ณ ์ ํ๋์ ๋ฐ๋ฅธ ์๋ ์ ์ ์ ๋ฐ์ดํธ (0-100)
๐ ํ์ ์์ ์ฑ: TypeScript strict ๋ชจ๋ + Zod ์คํค๋ง ๊ฒ์ฆ
๐๏ธ ๊ธฐ์ ์คํ
Framework: NestJS 11 + TypeScript 5 (strict mode)
Protocol: Model Context Protocol (MCP) SDK
Database: Supabase PostgreSQL
Validation: Zod schema validation
Architecture: Domain-driven layered architecture
๐ ์ค์น ๋ฐ ์ค์
1. ์์กด์ฑ ์ค์น
npm install2. ํ๊ฒฝ ๋ณ์ ์ค์
.env ํ์ผ ํ์ธ:
SUPABASE_URL=your_supabase_url
SUPABASE_ANON_KEY=your_supabase_anon_key3. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์
Supabase SQL Editor์์ migrate.sql ์คํ:
-- mastery_score, last_reviewed_at, review_count ์ปฌ๋ผ ์ถ๊ฐ
-- ์ธ๋ฑ์ค ์์ฑ4. ์ํ ๋ฐ์ดํฐ ์ฝ์ (์ ํ ์ฌํญ)
node seed.js5. ๋น๋
npm run build6. Claude Desktop ์ค์
~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"toeic-speaking": {
"command": "node",
"args": ["/์ ๋/๊ฒฝ๋ก/dist/main.js"],
"env": {
"SUPABASE_URL": "your_url",
"SUPABASE_ANON_KEY": "your_key"
}
}
}
}โ ๏ธ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋ก์ ํธ ๊ฒฝ๋ก๋ก ์์ ํ Claude Desktop ์ฌ์์
๐ ๏ธ MCP ๋๊ตฌ
1. get_quiz_sentence - ๋ฌธ์ ์ถ์
ํ๋ผ๋ฏธํฐ:
mode(์ ํ):'weak_first'|'random'(๊ธฐ๋ณธ:'weak_first')part(์ ํ): ํํธ ๋ฒํธ ํํฐ
์๋ต:
{
"id": "uuid",
"sentence_ko": "์ด ์ฌ์ง์ ๊ณต์์์ ์ฐํ ์ฌ์ง์
๋๋ค.",
"part": 2,
"current_mastery": 0
}2. verify_answer - ๋ต๋ณ ๊ฒ์ฆ
ํ๋ผ๋ฏธํฐ (ํ์):
sentence_id: ๋ฌธ์ฅ IDuser_answer: ์ฌ์ฉ์ ๋ต๋ณ (์์ด ๋ฌธ์ฅ)
์๋ต:
{
"success": true,
"original_sentence": "This is a picture taken at a park.",
"matched_keywords": ["picture", "taken", "park"],
"missing_keywords": [],
"match_rate": "100.0%",
"score_change": 10,
"feedback": "Perfect! All keywords matched. Score increased by 10 points."
}์ ์ ๊ท์น:
๋งค์นญ๋ฅ | ์ ์ ๋ณํ |
100% | +10 |
70-99% | +5 |
50-69% | 0 |
0-49% | -5 |
๐ฌ ์ฌ์ฉ ์์
๐ค "ํ ์ต ์คํผํน ์ฐ์ต ์์ํ ๊ฒ์"
๐ค [get_quiz_sentence ํธ์ถ]
๋ฌธ์ : "์ด ์ฌ์ง์ ๊ณต์์์ ์ฐํ ์ฌ์ง์
๋๋ค."
(ํ์ฌ ์๋ จ๋: 0์ )
๐ค [์์ฑ] "This is a picture taken at a park"
๐ค [verify_answer ํธ์ถ]
โ
์๋ฒฝํฉ๋๋ค!
- ํฌํจ๋ ํค์๋: picture, taken, park (3/3)
- ๋งค์นญ๋ฅ : 100.0%
- ์ ์ ๋ณํ: +10์ ๐ ํ๋ก์ ํธ ๊ตฌ์กฐ
src/
โโโ main.ts # MCP ์๋ฒ ์ํธ๋ฆฌํฌ์ธํธ
โโโ app.module.ts # ๋ฃจํธ ๋ชจ๋
โโโ config/
โ โโโ supabase.config.ts # Supabase DI Provider
โโโ types/
โ โโโ sentence.interface.ts # TypeScript ์ธํฐํ์ด์ค
โโโ mcp/
โ โโโ mcp.module.ts
โ โโโ mcp.service.ts # MCP ๋๊ตฌ ์ ์ + Zod ๊ฒ์ฆ
โโโ quiz/ # Quiz ๋๋ฉ์ธ
โ โโโ quiz.module.ts
โ โโโ quiz.service.ts # ๋ฌธ์ ์ถ์ ๋ก์ง
โ โโโ quiz.repository.ts # DB ์ฟผ๋ฆฌ
โโโ answer/ # Answer ๋๋ฉ์ธ
โโโ answer.module.ts
โโโ answer.service.ts # ํค์๋ ๋งค์นญ ์๊ณ ๋ฆฌ์ฆ
โโโ answer.repository.ts # ์ ์ ์
๋ฐ์ดํธ์ํคํ ์ฒ:
Claude Desktop (stdio)
โ
MCP Layer (Zod ๊ฒ์ฆ)
โ
Domain Layer (Quiz/Answer)
โ
Supabase PostgreSQL๐๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง
์ปฌ๋ผ | ํ์ | ์ค๋ช |
| uuid | PK |
| integer | TOEIC ํํธ ๋ฒํธ |
| text | ์์ด ์๋ฌธ (์ ๋ต) |
| text | ํ๊ตญ์ด ๋ฒ์ญ (๋ฌธ์ ) |
| text[] | ํต์ฌ ํค์๋ ๋ฐฐ์ด |
| integer | ํ์ต ์๋ จ๋ (0-100) |
| timestamptz | ๋ง์ง๋ง ๋ณต์ต ์๊ฐ |
| integer | ์ด ๋ณต์ต ํ์ |
์ธ๋ฑ์ค:
idx_mastery_score: mastery_scoreidx_part_mastery: (part, mastery_score)
๐ง ํธ๋ฌ๋ธ์ํ
MCP ์๋ฒ๊ฐ ๋ณด์ด์ง ์๋ ๊ฒฝ์ฐ
๋น๋ ํ์ธ:
npm run buildํ์ผ ํ์ธ:
ls dist/main.js์๋ ์คํ:
node dist/main.jsClaude Desktop ๋ก๊ทธ ํ์ธ:
View > Toggle Developer Tools > ConsoleClaude Desktop ์์ ํ ์ฌ์์
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ค๋ฅ
claude_desktop_config.json์env์น์ ํ์ธstdio ํ๊ฒฝ์์๋
.envํ์ผ ๋์ ์ค์ ํ์ผ์ ํ๊ฒฝ ๋ณ์ ํ์Supabase ํ๋ก์ ํธ ํ์ฑ ์ํ ํ์ธ
migrate.sql์คํ ํ์ธ
ํ์ ์๋ฌ
rm -rf node_modules package-lock.json
npm install
npm run build๐ ๏ธ ๊ฐ๋ฐ ๋ช ๋ น์ด
# ๋น๋
npm run build
# ๊ฐ๋ฐ ๋ชจ๋
npm run start:dev
# ์คํ
npm start
# ์ํ ๋ฐ์ดํฐ
node seed.js
# ํ์
์ฒดํฌ
npx tsc --noEmit๐ ํ์ต ํ
๋งค์ผ 10-15๋ถ ๊พธ์คํ ์ฐ์ต
weak_first ๋ชจ๋ ํ์ฉ์ผ๋ก ์ทจ์ฝ ๋ฌธ์ฅ ์ง์ค ๊ณต๋ต
ํค์๋ ์ค์ฌ ํ์ต (์ ์ฒด ๋ฌธ์ฅ๋ณด๋ค ํต์ฌ ํค์๋ ๋จผ์ ์๊ธฐ)
์์ฑ ์ ๋ ฅ ์ฌ์ฉ์ผ๋ก ๋ฐ์ ์ฐ์ต ๋ณํ
์ ์ 80์ ์ด์ ๋๋ฉด ์๋์ผ๋ก ๋ค๋ฅธ ๋ฌธ์ฅ ์ถ์
๐ ํฅํ ๊ณํ
187๊ฐ ์ ์ฒด ๋ฌธ์ฅ ๋ฐ์ดํฐ ์ถ๊ฐ
Part 3, 4, 5 ์ง์
ํ์ต ํต๊ณ ๋์๋ณด๋
์ฌ์ฉ์๋ณ ํ์ต ๊ธฐ๋ก
๋ฐ์ ํ๊ฐ API ์ฐ๋
๐ ์ฐธ๊ณ ์๋ฃ
๐ ๋ผ์ด์ ์ค
ISC
Version: 1.0.0 | Last Updated: 2026-03-15
Available Tools
2 toolsget_quiz_sentenceB
mastery_score๊ฐ ๋ฎ์ ๋ฌธ์ฅ ์ฐ์ ์ผ๋ก ํด์ฆ ๋ฌธ์ ๋ฅผ ์ถ์ ํฉ๋๋ค
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ์ถ์ ๋ชจ๋ (๊ธฐ๋ณธ๊ฐ: weak_first) | |
| part | No | ํํธ ๋ฒํธ ํํฐ (์ ํ ์ฌํญ) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosure. It does mention the prioritization behavior (low mastery_score first), but it does not explain what the tool returns (e.g., a single sentence or a list), how many items are generated, or whether any state changes occur. This is a significant gap for a generation tool.
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 that front-loads the primary purpose. Every word earns its place, with no redundant filler.
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 relatively simple with two optional parameters and no output schema, so the description is adequate for basic understanding. However, it omits return value details (what exactly the tool returns) and lacks explicit connection to the sibling verify_answer tool, leaving some context 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 100%, with both parameters ('mode' and 'part') already documented in the schema. The description adds no additional meaning beyond the schema, so the baseline score of 3 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 uses a specific verb ('์ถ์ ' = generate/select questions), names the resource ('quiz sentence'), and includes a key detail (prioritizing low mastery_score). This clearly distinguishes it from the sibling tool verify_answer, which verifies answers rather than generating questions.
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?
No guidance is given on when to use this tool versus verify_answer, nor when to choose the 'weak_first' or 'random' modes. The description implies usage for quiz generation but does not provide explicit context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_answerA
์ฌ์ฉ์ ๋ต๋ณ์ ๊ฒ์ฆํ๊ณ ํค์๋ ํฌํจ ์ฌ๋ถ์ ๋ฐ๋ผ ์ ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค
| Name | Required | Description | Default |
|---|---|---|---|
| sentence_id | Yes | ๋ฌธ์ฅ ID | |
| user_answer | Yes | ์ฌ์ฉ์๊ฐ ๋งํ ์์ด ๋ฌธ์ฅ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It discloses that the tool updates scores based on keyword inclusion, which is useful context, but it does not explain side effects, irreversibility, permission requirements, or return values. The description gives partial transparency but leaves important gaps.
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 concise sentence that directly conveys the tool's purpose and core behavior. No wasted words or redundant details.
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 relatively simple with two parameters and no output schema, but the description does not mention what the tool returns or what 'updates the score' entails. It provides the core action but lacks context about the response and any prerequisites, leaving the description minimally sufficient rather than 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 100%, and the description does not add meaningful information beyond the parameter descriptions already present. The baseline of 3 applies because the schema handles parameter semantics adequately.
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 a specific action: verifying the user's answer and updating the score based on keyword inclusion. It distinguishes the tool from its sibling 'get_quiz_sentence' by focusing on verification and score update rather than retrieval.
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?
No explicit guidance is provided on when to use this tool versus alternatives. The description implies it is used for answer verification and scoring, but does not state prerequisites, exclusions, or when a different tool would be more appropriate.
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.
2 tool updates
v1.0.0- First observed
get_quiz_sentence - First observed
verify_answer
TDQS
Scored across 2 tools
The two tools have clearly distinct roles: one generates a quiz question, the other validates the user's answer. There is no functional overlap between them.
Both tool names follow a consistent verb_noun pattern: 'get_quiz_sentence' and 'verify_answer'. This predictable naming makes the tool set easy to navigate.
With only 2 tools, the server is on the thin side, but the narrow quiz-taking purpose makes this count borderline acceptable. It covers the essential actions without being bloated.
The tools form a complete core workflow: retrieve a question and verify a response. Minor gaps exist, such as no explicit score retrieval or session management, but the primary quiz loop is fully covered.
Maintenance
Related MCP Connectors
Pronunciation scoring, speech-to-text, and text-to-speech for language learning
Pronunciation assessment, phoneme scoring, speaker voice ID, audio transcription, speech synthesis.
Spaced-repetition flashcards your AI writes, quizzes you on by voice, and schedules with FSRS.
Voice-led, FSRS-scheduled flashcards from YouTube, PDFs, web, or text. Auto-graded quizzes.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA professional 1-on-1 English tutoring server that enables AI assistants to provide oral practice, grammar correction, and vocabulary recommendations. It features specialized tools for generating conversation topics, tracking progress, and creating immersive role-play scenarios.MIT
- AlicenseAqualityCmaintenanceLocal MCP voice coach that provides English pronunciation, grammar, and fluency feedback from microphone recordings. It supports free-form voice conversation, focused practice drills, phoneme-level feedback, prosody hints, and learner-profile guidance.83MIT
- AlicenseNot gradedqualityDmaintenanceServes daily language lessons from a structured curriculum, enabling natural practice through conversation with AI tutors that track progress.6 npm1Apache 2.0
- FlicenseNot gradedqualityBmaintenanceGives your AI agent real-time pronunciation scoring and multi-dimensional speech assessment through CHIVOX server.-