tinci-mcp
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., "@tinci-mcpfind rhymes for 月"
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.
tinci-mcp (填詞)
An MCP (Model Context Protocol) server for Cantonese lyric writing (粵語填詞), providing pronunciation lookup, tonal pattern analysis, and rhyme lookup.
Features
Jyutping Romanization: Convert Cantonese text to Jyutping pronunciation using ToJyutping
Tonal Pattern Analysis: Analyze lyrics using the 1056/0243 classification systems for matching syllables to melody
Rhyme Lookup: Find rhyming characters based on Jyutping finals (韻母), with tone filtering options. Data sourced from Mr. Pinyin's Rhyme Table
Related MCP server: cangjie-mcp
Installation
Requires Python 3.10+ and uv.
# Clone or navigate to the project directory
cd tinci-mcp
# Install dependencies
uv syncUsage
Running the Server
uv run tinci-mcpConfiguring with Claude Desktop
Add to your Claude Desktop configuration (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"tinci-mcp": {
"command": "uv",
"args": ["--directory", "/path/to/tinci-mcp", "run", "tinci-mcp"]
}
}
}Configuring with Cursor
Add to your Cursor MCP settings:
{
"mcpServers": {
"tinci-mcp": {
"command": "uv",
"args": ["--directory", "/path/to/tinci-mcp", "run", "tinci-mcp"]
}
}
}Tools
get_jyutping
Convert Cantonese text to Jyutping romanization.
Input:
text: Cantonese text (Traditional or Simplified Chinese)
Output:
{
"text": "你好",
"jyutping": [
["你", "nei5"],
["好", "hou2"]
],
"romanization": "nei5 hou2"
}get_tone_pattern
Analyze tonal patterns for lyric writing using the 1056 or 0243 system.
Input:
text: Cantonese text to analyzesystem: Either"1056"or"0243"(default:"0243")
Output:
{
"text": "你好",
"system": "0243",
"pattern": "43",
"breakdown": [
{ "character": "你", "jyutping": "nei5", "tone": 5, "mapped": "4" },
{ "character": "好", "jyutping": "hou2", "tone": 2, "mapped": "3" }
]
}get_rhyming_characters
Find characters that rhyme with the input character (same Jyutping final/韻母).
Input:
character: A single Chinese character to find rhymes fortone_filter: How to filter by tone (default:"all")"all": Return all rhyming characters regardless of tone"same": Only return characters with the exact same tone"group": Return characters in the same tone group (1056/0243)
system: Tonal classification system ("1056"or"0243", default:"0243")limit: Maximum number of results (default:50)target_tone: Find rhymes with a specific tone (1-9), overridestone_filtertarget_group: Find rhymes in a specific tone group, overridestone_filter
Example 1: Basic rhyme lookup
// Input: character="來"
{
"input": {
"character": "來",
"jyutping": "loi4",
"tone": 4,
"tone_group": "0"
},
"final": "oi",
"rhymes": [
{ "character": "愛", "jyutping": "oi3", "tone": 3, "tone_group": "4" },
{
"character": "外",
"jyutping": "ngoi6",
"tone": 6,
"tone_group": "2"
},
{ "character": "改", "jyutping": "goi2", "tone": 2, "tone_group": "3" }
],
"total_count": 190
}Example 2: Find rhymes with a different tone
// Input: character="泉", target_tone=1
// 泉 is cyun4 (tone 4), but we want rhymes with tone 1
{
"input": {
"character": "泉",
"jyutping": "cyun4",
"tone": 4,
"tone_group": "0"
},
"final": "yun",
"target_tone": 1,
"rhymes": [
{
"character": "村",
"jyutping": "cyun1",
"tone": 1,
"tone_group": "3"
},
{
"character": "川",
"jyutping": "cyun1",
"tone": 1,
"tone_group": "3"
},
{ "character": "穿", "jyutping": "cyun1", "tone": 1, "tone_group": "3" }
],
"total_count": 74
}Example 3: Find rhymes in a different tone group
// Input: character="泉", target_group="3"
// 泉 is in group 0, but we want rhymes in group 3 (tones 1, 2, 7)
{
"input": {
"character": "泉",
"jyutping": "cyun4",
"tone": 4,
"tone_group": "0"
},
"final": "yun",
"target_group": "3",
"rhymes": [
{
"character": "忖",
"jyutping": "cyun2",
"tone": 2,
"tone_group": "3"
},
{
"character": "村",
"jyutping": "cyun1",
"tone": 1,
"tone_group": "3"
},
{ "character": "川", "jyutping": "cyun1", "tone": 1, "tone_group": "3" }
],
"total_count": 119
}Tonal Systems
The 1056 and 0243 systems group Cantonese's 9 tones into 4 categories for matching with musical notes:
Tone Numbers | 1056 Value | 0243 Value | Description |
1, 2, 7 | 1 | 3 | High tones |
4 | 0 | 0 | Low falling |
3, 5, 8 | 5 | 4 | Mid tones |
6, 9 | 6 | 2 | Low tones |
Reference: HK01 Article on Cantonese Lyric Writing
Data Sources
Jyutping Data: ToJyutping - Cantonese romanization library
Rhyme Data: Mr. Pinyin's Rhyme Table (押韻 Rhyme) - Curated rhyming characters organized by Jyutping finals (韻母), specifically designed for Cantonese lyric writing
License
MIT
Available Tools
3 toolsget_jyutpingA
Convert Cantonese text to Jyutping romanization.
Returns the Jyutping pronunciation for each character in the input text. Jyutping is the standard romanization system for Cantonese, where each syllable ends with a tone number from 1-6 (with 7-9 for entering tones).
Args: text: Cantonese text to convert (Traditional or Simplified Chinese)
Returns: Dictionary with the original text and a list of character-pronunciation pairs
Example: Input: "你好" Output: {"text": "你好", "jyutping": [["你", "nei5"], ["好", "hou2"]]}
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
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 the return format and example, but does not address error handling, character coverage limitations, or performance. For a simple read-like tool, this is adequate but not thorough.
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 wasted words. It starts with the main action, followed by explanation and example. Every sentence adds value, and the structure is clear.
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 (1 parameter, no output schema), the description is nearly complete. It covers purpose, parameter meaning, return format, and example. Minor gaps like error behavior or edge cases are acceptable for such a straightforward 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?
The input schema has 0% description coverage for the only parameter 'text'. The description adds meaning by specifying 'Cantonese text to convert (Traditional or Simplified Chinese)', which clarifies the input beyond the schema's bare type definition.
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 purpose: 'Convert Cantonese text to Jyutping romanization.' It explains what Jyutping is and provides an illustrative example. The tool is distinct from siblings (get_rhyming_characters, get_tone_pattern) as it covers conversion to romanization.
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 on when to use this tool versus alternatives. While the purpose is clear, there is no explicit when-to-use or when-not-to-use context, nor mention of prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rhyming_charactersA
Find characters that rhyme with the input character for lyrics composition.
Returns characters sharing the same Jyutping final (韻母) as the input character. This is essential for writing Cantonese lyrics where rhyming is based on the final sound of syllables.
Args: character: A single Chinese character to find rhymes for tone_filter: How to filter results by tone: - "all": Return all rhyming characters regardless of tone - "same": Only return characters with the exact same tone number - "group": Return characters in the same tone group (e.g., in the 0243 system, tones 1, 2 and 7 are in the same group (3); tones 3, 5 and 8 are in the same group (4); tones 6 and 9 are in the same group (2)) system: Tonal classification system for "group" filtering and tone display (1056 or 0243) limit: Maximum number of rhyming characters to return (default 50) target_tone: If specified, find rhyming characters with this specific tone (1-9). Overrides tone_filter. Example: character="泉" (tone 4), target_tone=1 returns rhyming characters with tone 1. target_group: If specified, find rhyming characters in this tone group. Overrides tone_filter. For 0243 system: "0" (tone 4), "2" (tones 6,9), "3" (tones 1,2,7), "4" (tones 3,5,8). Example: character="泉" (group 0), target_group="3" returns rhyming characters with tones 1, 2, or 7.
Returns: Dictionary with: - input: Info about the input character (character, jyutping, tone, tone_group) - final: The jyutping final (韻母) used for matching - rhymes: List of rhyming characters with their jyutping and tone info - count: Number of rhyming characters returned - total_count: Total available (before limit) - target_tone: (if specified) The target tone used for filtering - target_group: (if specified) The target group used for filtering
Example: Input: character="來", tone_filter="all" Returns rhyming characters like 愛 (oi3), 外 (ngoi6), 改 (goi2), etc. that share the same "oi" final.
Input: character="泉", target_tone=1
Returns rhyming characters with final "yun" but with tone 1.
Input: character="泉", target_group="3"
Returns rhyming characters with final "yun" but with tones 1, 2, or 7 (group 3).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| system | No | 0243 | |
| character | Yes | ||
| target_tone | No | ||
| tone_filter | No | all | |
| target_group | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries full burden. It discloses that it matches on final, explains tone filtering, systems, and override behavior. No destructive or permission info, but for a read tool this is sufficient.
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 lengthy but well-structured with sections for purpose, args, returns, and examples. Nearly every sentence adds value given the complexity of tone filtering and grouping.
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?
Covers all parameters, return format, and provides multiple examples. No output schema but description includes detailed return keys. Could mention error handling or input validation, but overall complete for a read 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 is 0%, so description explains all 6 parameters in detail, including enums, defaults, and override relationships. Examples clarify usage. This adds significant value beyond 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 finds characters that rhyme with the input character for lyrics composition, based on Jyutping final. It distinguishes from sibling tools (get_jyutping, get_tone_pattern) by focusing on rhyming.
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 for rhyming needs and provides examples. It does not explicitly contrast with siblings but context makes it clear. Slightly lacking explicit when-not-to-use guidance, but adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tone_patternA
Analyze the tonal pattern of Cantonese text for lyrics writing.
Converts each character's tone to the 1056 or 0243 system used in Cantonese lyric writing to match syllables with melody notes.
The 1056 system groups Cantonese tones as:
1: High tones (tones 1, 2, 7) - highest pitch
0: Low falling (tone 4) - falling pitch
5: Mid tones (tones 3, 5, 8) - middle pitch
6: Low tones (tones 6, 9) - lowest pitch
The 0243 system uses different digits but same groupings:
3: High tones (tones 1, 2, 7)
0: Low falling (tone 4)
4: Mid tones (tones 3, 5, 8)
2: Low tones (tones 6, 9)
Args: text: Cantonese text to analyze system: Tonal classification system, either "1056" or "0243"
Returns: Dictionary with: - text: Original input text - system: The system used (1056 or 0243) - pattern: Condensed tone pattern string (e.g., "1560") - breakdown: Detailed per-character analysis
Example: Input: "今天天氣", system="1056" Output includes pattern like "1516" showing the tonal contour
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| system | No | 0243 |
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 behavioral disclosure. It details the tone grouping algorithms for both systems, the return structure (text, system, pattern, breakdown), and includes an example. It does not discuss error handling, performance, or limitations, but for a straightforward analysis tool, the transparency is adequate.
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 well-structured with sections for purpose, system explanations, args, returns, and example. It is slightly lengthy but each section is justified. The bullet points for tone groupings are clear. Minor redundancy (e.g., repeating 'the X system uses different digits but same groupings') could be trimmed.
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 moderate complexity (2 parameters, no output schema), the description provides comprehensive information: input format, system choices with rationale, output structure, and a concrete example. It covers all necessary aspects for correct invocation and interpretation of results.
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 input schema has 0% description coverage, but the description compensates fully. It explains both parameters: 'text' as Cantonese text to analyze, and 'system' as an enum with detailed explanations of each option (1056 and 0243), including the tone groupings. The example further clarifies usage. This adds significant value 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's purpose: analyzing tonal patterns of Cantonese text for lyrics writing. It specifies the verb ('analyze'), resource ('tonal pattern'), and domain ('Cantonese lyrics writing'). It distinguishes from siblings like get_jyutping (romanization) and get_rhyming_characters (rhyming) by focusing on tone mapping systems.
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 implicitly provides usage context by explaining the two tonal classification systems (1056 and 0243) and their relevance to Cantonese lyrics. However, it does not explicitly state when to use this tool versus alternatives like get_jyutping or get_rhyming_characters, leaving the differentiation to the user's understanding of the tool's purpose.
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.
3 tool updates
v0.1.0- First observed
get_jyutping - First observed
get_rhyming_characters - First observed
get_tone_pattern
TDQS
Scored across 3 tools
Each tool serves a distinct purpose: converting text to Jyutping, finding rhyming characters, and analyzing tone patterns. No overlap or ambiguity.
All tool names follow a consistent verb_noun pattern using snake_case (get_jyutping, get_rhyming_characters, get_tone_pattern).
With 3 tools, the set is focused but covers the core needs for Cantonese lyrics writing. It feels slightly minimal but still appropriate for its niche scope.
The tool set covers the essential operations for Cantonese phonetics in lyrics: pronunciation, rhyming, and tonal analysis. Minor gaps like character lookup exist but are not central.
Maintenance
Related MCP Connectors
MCP server for Suno AI music generation, lyrics, and covers
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
MCP server for Speech-to-Text
MCP server for Text-to-Speech
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP server for Synthesizer V AI Vocal Studio, which allows LLMs to create/edit vocal tracks e.g. adding lyrics to the melody.612Apache 2.0
- AlicenseNot gradedqualityBmaintenanceMCP server for the Cangjie programming language, providing documentation search and LSP-based code intelligence.4MIT
- AlicenseNot gradedqualityAmaintenanceMCP server that enables LLMs to search, play, and manage music from multiple platforms (NetEase, QQ, Kugou) and local files, with lyrics retrieval and playback control.MIT
- AlicenseAqualityBmaintenanceMCP server for lyrics.com that enables searching songs by lyrics or title and retrieving full lyrics, with no API key required.3103 npmMIT