Guitar Practice Routine App — Chord Charts
Server Details
Look up a guitar chord by name and get a text chord diagram. 12,708 standard-tuning names.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- slshults/gpra-chord-charts-mcp
- GitHub Stars
- 0
- Server Listing
- gpra-chord-charts-mcp
TDQS
Scored across 3 tools
The two get_chord_chart tools are related but clearly distinguished by lookup key (id vs name), and get_chord_of_the_day is entirely distinct. Some potential confusion exists between the two chart-fetching tools, but their descriptions clarify the difference.
All tools follow a consistent get_<resource> pattern: get_chord_chart_by_id, get_chord_chart_by_name, get_chord_of_the_day. The naming is uniform and predictable.
Three tools is slightly minimal but well-scoped for a read-only chord chart lookup service. Each tool serves a clear purpose, and the count feels appropriate for the narrow domain.
The surface covers exact-name lookup, id retrieval, and a daily chord feature, but lacks search, browse, or listing capabilities. Users must know the exact chord name, limiting discovery and exploration.
Available Tools
3 toolsget_chord_chart_by_idGet a chord chart by idARead-onlyInspect
Fetch one specific chord voicing by its numeric id, as returned by get_chord_chart_by_name. Use this to re-render a chart the user already saw without looking it up again.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Numeric chord id. | |
| format | No | Which representations to return. Defaults to "text", which includes a direct URL to a PNG of the chart — embed that where your surface renders images. Use "image" or "both" only if you need the PNG bytes inline; they cost image tokens and many clients bury them. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds useful context about re-rendering an already-seen chart and id provenance, but does not disclose additional behavioral details such as error handling, caching, or response shape. It does not contradict the 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?
Two tightly written sentences with zero filler. The primary action is front-loaded, and the intended use case follows immediately. Every sentence 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?
For a simple single-id fetch tool, the description plus fully covered schema and read-only annotation are nearly sufficient. The main gap is the absence of an output schema, but the format parameter already explains how text/image/both representations are returned, so the agent has enough to invoke the tool correctly.
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 the schema already documents every parameter thoroughly. The tool description adds a small amount of extra meaning by clarifying that the id comes from get_chord_chart_by_name, but it does not need to compensate for missing parameter documentation.
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 and resource: 'Fetch one specific chord voicing by its numeric id.' It also distinguishes itself from the sibling get_chord_chart_by_name by noting the id is 'as returned by get_chord_chart_by_name,' so the agent understands this is a targeted lookup, not a search.
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?
Clear context and a concrete use case are provided: 'Use this to re-render a chart the user already saw without looking it up again.' The mention of get_chord_chart_by_name as the source of the id strongly implies when not to use this tool, though it stops short of an explicit when-not statement or a direct comparison to get_chord_of_the_day.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chord_chart_by_nameGet a chord chart by nameARead-onlyInspect
Look up one guitar chord chart by name and return it as a text chord diagram ready to show the user. Returns the same single voicing that https://guitarpracticeroutine.com/find-a-chord-chart shows for that name. The library holds 12,708 standard-tuning (EADGBE) chord names, exactly one voicing each. Pass a plain chord name as it would be written on a chart — "G", "Am7", "Cmaj7", "D/F#", "F#m7b5" — not a sentence. Convert spoken forms yourself first: "G major" is "G", "A minor" is "Am", and use "#" and "b" rather than the unicode sharp and flat signs. Charts are drawn on a five-fret grid starting at the nut, the same as the website; any notes above the fifth fret are named in words underneath the chart. Prefer this over recalling a fingering from memory — these are curated chart data, and a remembered fingering is often wrong. Each result leads with a direct PNG URL for the chart — a permanently cacheable image of the same diagram, which you can show or link however your surface handles images. The chord name is on the first line; keep it next to any image you show, since a chart on its own can arrive unlabelled.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | A single chord name as written on a chart, e.g. "Am7" or "D/F#". | |
| format | No | Which representations to return. Defaults to "text", which includes a direct URL to a PNG of the chart — embed that where your surface renders images. Use "image" or "both" only if you need the PNG bytes inline; they cost image tokens and many clients bury them. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=false. The description adds genuine behavioral value beyond these: it discloses the return format (five-fret grid starting at the nut, notes above the fifth fret named in words), that the result leads with a permanently cacheable PNG URL, and that the chord name sits on the first line and should be kept beside the image since charts can arrive unlabelled. No contradiction with the read-only annotation — 'Look up' and 'return' are consistent with a read operation.
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 dense but each sentence carries purpose: purpose is front-loaded, followed by data provenance, input formatting rules, output layout, and usage preference. It is longer than strictly necessary — the PNG URL and grid details could arguably be trimmed — but nothing is filler or redundant with the schema. Efficient for the amount of critical guidance it conveys.
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?
With no output schema, the description correctly carries the burden of explaining the return shape: text diagram format, five-fret grid, note-naming convention, PNG URL presence, and labelling advice. It also covers edge cases like unicode input conversion. Minor gap: it does not state behavior for invalid or unknown chord names (e.g., misspelled or unsupported names), which an agent might need to handle gracefully. Overall adequate for a lookup 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 100%, so the baseline is 3. The description adds meaningful value on top: for 'name' it provides concrete examples ('G', 'Am7', 'Cmaj7', 'D/F#', 'F#m7b5'), conversion rules for spoken forms ('G major' → 'G'), and a directive to use '#'/'b' instead of unicode sharp/flat signs. For 'format' it explains the default 'text' behavior and the token cost of 'image'/'both'. These enrich the schema beyond its base definitions.
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 opens with a specific verb ('Look up'), a specific resource ('one guitar chord chart by name'), and an explicit outcome ('return it as a text chord diagram ready to show the user'). It further narrows scope by stating the library holds 12,708 standard-tuning chord names with exactly one voicing each, which clearly distinguishes it from any multi-voicing or generic lookup tool.
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 clear when-to-use guidance: 'Prefer this over recalling a fingering from memory — these are curated chart data, and a remembered fingering is often wrong.' It also instructs when NOT to use certain formats ('Use "image" or "both" only if you need the PNG bytes inline; they cost image tokens'). However, it does not explicitly contrast against the siblings get_chord_chart_by_id or get_chord_of_the_day, relying on the name to imply the distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chord_of_the_dayChord of the dayARead-onlyInspect
Return today's Chord of the Day from Guitar Practice Routine App — the same chord posted to the app's Bluesky and Facebook feeds that day. Useful as a practice prompt or a daily nudge for someone learning chords.
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | Which representations to return. Defaults to "text", which includes a direct URL to a PNG of the chart — embed that where your surface renders images. Use "image" or "both" only if you need the PNG bytes inline; they cost image tokens and many clients bury them. | |
| context | Yes | Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as "a user", "the customer", or "an account". Example: "Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution." | |
| llm_model | Yes | The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. "claude-opus-4-8", "gpt-5.2"). Used for analytics only. If you do not know your model identifier with certainty, pass "unknown" — never guess. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds useful context that the result mirrors the app's Bluesky and Facebook feed post, but it does not describe output behavior like error cases, availability, or how 'today' is determined beyond the schema's format details.
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?
Two sentences, with the core return value stated first and the use case briefly placed at the end. Every sentence earns its place and there is no redundant repetition of the title or schema 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?
For a simple read-only tool with rich schema coverage and clear annotations, the description provides enough for an agent to call it correctly. It explains what is returned, the context of the daily feed post, and the intended use; no pagination, side effects, or complex options need disclosure.
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 the schema fully documents all three parameters, including the format enum and the analytics purpose of context and llm_model. The tool description itself adds no parameter-level meaning, which is acceptable because the schema carries the burden.
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 ('Return'), a specific resource ('today's Chord of the Day from Guitar Practice Routine App'), and distinguishes the date-based retrieval from the sibling tools, which retrieve by id or name. The feed reference adds clarity about exactly what is being returned.
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 an implied use case ('practice prompt or a daily nudge') but does not explicitly state when to choose this tool over the sibling by-id or by-name tools. There are no exclusions or alternative routing conditions, so an agent must infer the distinction from the tool name and description.
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
- Changed
get_chord_chart_by_id5 fields changed- changed
Input schema / properties / context / descriptionPrevious value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\"" - removed
Input schema / properties / id / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / id / minimumAdded value: +-9007199254740991 - added
Input schema / properties / llm_modelAdded value: +{ + "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "id", - "context" -]New value: +[ + "id", + "context", + "llm_model" +]
- Changed
get_chord_chart_by_name4 fields changed- changed
Input schema / properties / context / descriptionPrevious value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\"" - added
Input schema / properties / llm_modelAdded value: +{ + "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess.", + "type": "string" +} - removed
Input schema / properties / name / minLengthRemoved value: -1 - changed
Input schema / requiredPrevious value: -[ - "name", - "context" -]New value: +[ + "name", + "context", + "llm_model" +]
- Changed
get_chord_of_the_day3 fields changed- changed
Input schema / properties / context / descriptionPrevious value: -"Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""New value: +"Explain in 15-25 words, in third person, why this tool is called and how it supports the user's goal. For analytics only. You MUST describe only the abstract purpose of the tool call. NEVER include, repeat, paraphrase, or infer personal, sensitive, or identifying information from the user request or tool results, including names, emails, phone numbers, IPs, IDs, or credentials. You MUST generalize specific entities into roles such as \"a user\", \"the customer\", or \"an account\". Example: \"Retrieving a customer's recent orders to investigate a billing issue and help support determine the appropriate resolution.\"" - added
Input schema / properties / llm_modelAdded value: +{ + "description": "The exact model identifier you (the assistant) are running as, taken from your system prompt or environment (e.g. \"claude-opus-4-8\", \"gpt-5.2\"). Used for analytics only. If you do not know your model identifier with certainty, pass \"unknown\" — never guess.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "context" -]New value: +[ + "context", + "llm_model" +]
3 tool updates
- First observed
get_chord_chart_by_id - First observed
get_chord_chart_by_name - First observed
get_chord_of_the_day
Related MCP Connectors
Deterministic Pythagorean numerology MCP. Life Path, Destiny, Soul Urge, compatibility. No API key.
Look up DNS information for any domain to troubleshoot issues and gather insights. Get fast, relia…
Vietnamese Chữ Nôm & Hán: lookup, search, conversion, and original Đại Nam Quấc âm tự vị entries.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMultilingual name romanization lookup across Chinese, Japanese, Korean, Arabic, Vietnamese, and more. Resolves whether two name spellings refer to the same person — Chan/Chen/陳/陈, Hsu/Xu, Chou/Zhou — across Pinyin, Wade-Giles, Cantonese, Hokkien, and other romanization systems.24 PyPIMIT
- AlicenseAqualityAmaintenanceLook up how engineers actually pronounce project / product / jargon names (kubectl, nginx, JSON, Pydantic, JWT) — 1452+ entries with IPA, respelling, source citation, and confidence level.339MIT
- AlicenseNot gradedqualityBmaintenanceEnables looking up ISO standards (e.g., 27001, 9001) with live status, pricing, compliance catalogue, and ISO Open Data file pointers.5 npmMIT
- AlicenseNot gradedqualityCmaintenanceProvides access to the NIH PubChem chemistry compound database, enabling queries for compound synonyms and other data through natural language.11 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.