Skip to main content
Glama
BluesPrince

THIRI Chord Intelligence — Music Theory MCP Server

🎷 THIRI Chord Intelligence — MCP Server

npm npm downloads CI license MCP Glama score

Give your AI real music theory. THIRI is the deterministic music theory MCP server + API for AI builders — it lets Claude, Cursor, or any MCP agent analyze chords, run roman-numeral analysis, generate voicings, and reharmonize progressions with answers that are computed, not guessed.

LLMs hallucinate music theory: wrong notes, fake roman numerals, voicings that don't voice-lead. THIRI is a deterministic engine (pitch-class-set theory over ℤ/12) behind a hosted API — so C7sus4 keeps its suspension, Caug spells C E G#, and "Coltrane changes on Dm7 G7 Cmaj7" returns Cmaj7 Ab7 Abmaj7 E7, every time.

Downstream of Suno / Udio or any generator? Wrap the output and get a correct chord chart your agent can trust. And unlike tonal.js or music21, THIRI is hosted and agent-native (no install, any language) — and it reharmonizes and voice-leads, not just looks chords up.

⭐ If this is useful, star the repo — it helps other musicians and agent builders find it.

👥 Join the First 55 AI Music Builders: Want elevated rate limits (300 req/min), direct founder support, and early access to upcoming tools? Join our developer community on Skool — Blues People AI.

Musicians: 2-minute setup (no code)

  1. Get a free key at build.thiri.ai/developers

  2. In Claude: Settings → ConnectorsAdd custom connector → URL https://mcp.thiri.ai/mcp → paste your sk_live_ key

  3. Ask Claude: "Reharmonize Dm7 G7 Cmaj7 with Coltrane changes."

That's it — no install, no config file. Builders: full install options (Claude Code, Desktop config, raw HTTP) are below.

Related MCP server: Music MCP

What you can ask

"Analyze Dm7b5 in C."iiø7, half-diminished, borrowed predominant, + scale options "What notes are in C7sus4?"C F G Bb (the suspension survives) "Give me a rootless Cmaj7 voicing, then voice-lead into Dm7." → voicings + a voice-leading score "Reharmonize Dm7 G7 Cmaj7 with Coltrane changes."Cmaj7 Ab7 Abmaj7 E7

Tools

Tool

What it does

analyze_chord

Chord → root, quality, intervals, roman numeral & harmonic function (secondary dominants, modal-interchange labels)

resolve_chord

Chord → spelled notes (enharmonically correct), frequencies, MIDI, scale recommendations

generate_voicing

Instrument-ready voicings (rootless/bill_evans, shell, triad, pad, guide-tones, drop-2/3); pass previousNotes for a voice-leading score; colorPreferences for explicit tensions

reharmonize

Progression reharmonization — 8 techniques: tritone_sub, ii_v_insertion, modal_interchange, diminished_passing, secondary_dominant, chain_of_dominants, coltrane_changes, backdoor (or auto)

conduct_band

Natural-language band conduct → lanes + MIDI (hosted MCP v0.3+)

Runs on the v2 grid engine — correct sus chords, real triads, enharmonic spelling, all altered dominants — with request timeouts, quota reporting, and structured errors.

Conductor & composition companions (Desktop only)

For hear-it agent loops (conduct → server-side render → WAV through your speakers), add a second local server alongside hosted theory tools:

{
  "mcpServers": {
    "thiri": {
      "command": "npx",
      "args": ["-y", "@bluesprincemedia/thiri-mcp"],
      "env": { "THIRI_API_KEY": "sk_live_your_key" }
    },
    "thiri-conductor": {
      "command": "npx",
      "args": ["-y", "@bluesprincemedia/thiri-mcp", "thiri-conductor-mcp"],
      "env": { "THIRI_API_KEY": "sk_live_your_key" }
    },
    "thiri-composition": {
      "command": "npx",
      "args": ["-y", "@bluesprincemedia/thiri-mcp", "thiri-composition-mcp"]
    }
  }
}

Bin

Tools

thiri-conductor-mcp

conduct_band, render_audio (server-side Csound via POST /v2/render), play_audio, search_corpus

thiri-composition-mcp

Composition IR tools + play_composition (fluidsynth preview)

Rendering runs server-side as of v0.5.0 — no Csound install needed. Proof: npm run test:conductor · live docs: build.thiri.ai/lab/conductor-mcp · agent recipes.

Conductor Agent (vibe compose)

End-to-end persona for local vibe composition — skill, CLI, and Band dashboard panel:

Entry

Command / path

Cursor skill

Copy THIRI/lab/skills/thiri-conductor-agent/SKILL.md~/.cursor/skills/thiri-conductor-agent/SKILL.md

CLI

cd thiri-mcp && npm run conductor:vibe -- "gospel ballad in F minor"

Dashboard

npm run dev:studiolocalhost:5173/bandVibe Conduct panel

Lab proof

build.thiri.ai/lab/conductor-agent

Dual MCP config above + mapConductResultToStudioModules after each conduct_band. Last CLI render writes ~/.thiri/conductor-last.json (local only, not committed).

Flagship agent recipe (analyze → conduct → render → critique)

Paste in order after dual MCP config above:

  1. Analyze"Analyze Dm7 G7 Cmaj7 in key C with analyze_chord; summarize roman numerals and tension."

  2. Conduct"conduct_band: warm Rhodes pad, walking bass, brush drums, 8 bars medium swing in C."

  3. Render"render_audio from the conduct result at tempo 120."

  4. Critique"play_audio; critique voice-leading and register balance; suggest one revision."

Full prompts: build.thiri.ai/lab/agent-recipes

Hosted vs local boundary

Surface

Audio render

mcp.thiri.ai / hosted connector

No — theory + conduct_band lanes only

Local thiri-conductor-mcp

Yes — WAV rendered server-side (POST /v2/render), played locally; no Csound install needed

Install

Get a free key at build.thiri.ai/developers, then pick a path:

Claude Desktop / web / mobile — hosted (one-click custom connector, nothing to install): Settings → Connectors → Add custom connector → URL https://mcp.thiri.ai/mcp → paste your sk_live_ key on the consent page. Same 5 tools, same key, same quota — no config file, no npx.

Claude Code (one line):

claude mcp add thiri --env THIRI_API_KEY=sk_live_your_key -- npx -y @bluesprincemedia/thiri-mcp

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "thiri": {
      "command": "npx",
      "args": ["-y", "@bluesprincemedia/thiri-mcp"],
      "env": { "THIRI_API_KEY": "sk_live_your_key" }
    }
  }
}

Prefer raw HTTP? (no MCP needed)

The same engine is a plain REST API:

curl -X POST https://chords.thiri.ai/v2/analyze \
  -H "Authorization: Bearer YOUR_KEY" -H "content-type: application/json" \
  -d '{"chord":"Dm7b5","key":"C"}'

Five endpoints: /v2/analyze, /v2/resolve, /v2/voicing, /v2/reharmonize, /v2/conduct. See openapi.yaml.

Environment variables

Variable

Default

Description

THIRI_API_KEY

(none)

Bearer token (sk_live_…) — get one at build.thiri.ai/developers

THIRI_API_URL

https://chords.thiri.ai

API base (override only for local dev)

Development

npm install && npm run build && npm start

License

PolyForm Noncommercial 1.0.0 — © 2026 Blues Prince Media. Free for personal, research, and noncommercial use; commercial use requires a license (dennison@bluesprincemedia.com). See LICENSE. Versions published at or before v0.5.0 remain under the MIT/PolyForm dual license they shipped with.

As of v0.5.0 the composition engine and Csound renderer run server-side behind the hosted API (POST /v2/compose, POST /v2/render); their source no longer ships in this package.

Available Tools

5 tools
analyze_chordA
Read-onlyIdempotent
Inspect

Parse a chord symbol into its root, quality, intervals, extensions, and harmonic function. When a key is provided, returns the Roman numeral, scale degree, and whether the chord is diatonic.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoKey center for functional analysis (e.g. 'C', 'Bb')
chordYesChord symbol (e.g. 'Dm7', 'Cmaj7/E', 'G7#11')

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which matches the parse-only behavior described. The description adds value by listing specific return components (root, quality, intervals, extensions, harmonic function) and conditional fields with key, beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, no wasted words, and front-loads the primary function. Every sentence adds value, making it efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description bears full burden. It clearly explains return values for both with and without key scenarios, covering the main outputs. It could mention error handling or invalid input, but what's provided is sufficient for most use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds meaning by explaining that providing a key returns Roman numeral, scale degree, and diatonic status, which is not in the schema. This clarifies the key parameter's effect on output, earning a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it parses a chord symbol into root, quality, intervals, extensions, and harmonic function. It distinguishes itself from sibling tools like 'generate_voicing' (creates voicings) and 'reharmonize' (changes harmony), so purpose is 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance is provided. Usage is implied by the tool name and description, but the description does not mention alternatives or exclusions, so guidance is insufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

conduct_bandA
Read-only
Inspect

Arrange a 4-piece band from a natural-language prompt. Returns conductor tempo/groove, 4 lanes of note events, lead sheet, and base64 MIDI. Browser/client synthesizes audio via Csound; use thiri-conductor-mcp locally to render WAV.

ParametersJSON Schema
NameRequiredDescriptionDefault
promptYesMusical direction (e.g. '12-second neo-soul band in Eb, Rhodes + analog bass')
durationSecNoOptional target duration override

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds value beyond annotations by specifying browser/client synthesis and local rendering path for WAV. Annotations already declare readOnlyHint=true, which is consistent as no external state is mutated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words, front-loaded with core purpose. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes outputs (tempo, lanes, lead sheet, MIDI) and synthesis context despite no output schema. For a complex creative tool, this is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline 3. Description adds meaningful example for prompt ('12-second neo-soul band in Eb...') and clarifies durationSec as optional override, enhancing understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb 'Arrange a 4-piece band' with clear resource and outcome. Distinct from sibling chord-analysis tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States output and local rendering requirement explicitly, providing context for use vs alternatives. No when-not-to-use guidance, but siblings are clearly different.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_voicingA
Read-onlyIdempotent
Inspect

Generate instrument-ready voicings for a chord in a specified style. Pass previousNotes (or a previousVoicing object) from an earlier result to get a voiceLeadingScore for the transition. Styles: rootless, bill_evans, shell, triad, pad, guide-tones, guide-tone-1, guide-tone-2, both-guide-tones, drop-2, drop-3.

ParametersJSON Schema
NameRequiredDescriptionDefault
chordYesChord symbol (e.g. 'Dm7')
styleNoVoicing style (default: 'pad'). bill_evans is an alias of rootless.
octaveNoBase octave (default: 3)
densityNoTarget voicing density / note count hint
keyContextNoKey context for diatonic color hooks (e.g. 'C major')
previousNotesNoPrevious voicing notes for voice leading (e.g. ['E3', 'G3', 'Bb3', 'D4'])
previousVoicingNoPrior generate_voicing JSON result for strict guide-tone line tracking
colorPreferencesNoExplicit color-tone overrides

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds behavioral detail (returns a voiceLeadingScore) without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first defines the core purpose, second adds voice leading usage. No wasted words, front-loaded, and all information is relevant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description could detail the return format (e.g., a JSON object with voicing notes and score). The current description mentions 'instrument-ready voicings' and 'voiceLeadingScore' but is vague on structure. Adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by explaining the relationship between previousNotes and previousVoicing and returning a voiceLeadingScore, which goes beyond the individual parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('generate') and resource ('instrument-ready voicings') and lists all supported styles. It clearly distinguishes from sibling tools (analyze_chord, reharmonize, resolve_chord) which serve different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to use previousNotes or previousVoicing for voice leading, which provides clear context. It doesn't explicitly exclude scenarios or compare to siblings, but the context is sufficient for an AI to decide when to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reharmonizeA
Read-onlyIdempotent
Inspect

Reharmonize a chord progression using jazz techniques. Returns one alternative per applicable technique, each with the new progression, the changes, and a plain-English explanation. With technique 'auto' (default) it returns every technique that applies. Techniques: tritone_sub, ii_v_insertion, modal_interchange, diminished_passing, secondary_dominant, chain_of_dominants, coltrane_changes, backdoor. (modal_interchange and backdoor require a key.)

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoKey center (e.g. 'C') — enables modal_interchange and backdoor
techniqueNoReharmonization technique (default: 'auto' = all applicable)
progressionYesChord symbols, one per bar (e.g. ['Cmaj7', 'Dm7', 'G7', 'Cmaj7'])

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnly and idempotent hints. Description adds behavioral details: returns one alternative per technique with progression, changes, explanation; 'auto' returns all applicable techniques. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two focused sentences plus a list and note. Front-loaded with core purpose. No extraneous words; every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequately covers return format, technique behavior, and prerequisites. No output schema, but description explains outputs. Could briefly explain each technique, but not essential given jazz context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all parameters with descriptions (100% coverage). Description adds value by explaining default technique behavior and key requirement for certain techniques, exceeding schema info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Reharmonize a chord progression using jazz techniques' with specific verb and resource. Distinguishes from sibling tools (analyze_chord, generate_voicing, resolve_chord) by focusing on reharmonization. Lists techniques and return format.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Indicates when to use (reharmonization context) and notes conditions for some techniques (require key). Does not explicitly compare to alternatives, but sibling tool names imply distinct purposes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_chordA
Read-onlyIdempotent
Inspect

Resolve a chord symbol to spelled note names, frequencies in Hz, MIDI numbers, and recommended improvisation scales.

ParametersJSON Schema
NameRequiredDescriptionDefault
chordYesChord symbol (e.g. 'Cm7', 'F#dim7')

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the description's primary transparency contribution is listing the returned data types (note names, frequencies, MIDI numbers, scales). This adds useful behavioral context beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that efficiently enumerates four distinct output categories. Every word contributes value, no repetition or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description adequately lists the main return values. However, it could be more complete by noting error handling or format details. Still, for a simple lookup tool, it is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'chord' has 100% schema description coverage with examples. The description does not add extra meaning about the parameter syntax or format beyond the schema, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'resolve' and identifies the resource as a chord symbol. It clearly lists the outputs (note names, frequencies, MIDI numbers, scales), which distinguishes it from sibling tools like analyze_chord (analysis) and generate_voicing (voicing).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is for retrieving detailed chord data, but it does not explicitly state when to prefer it over siblings (e.g., analyze_chord, reharmonize). No usage context or exclusions are provided.

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.

  1. 1 tool updatev0.3.1
    • Addedconduct_band
  2. 4 tool updatesv0.3.0
    • First observedanalyze_chord
    • First observedgenerate_voicing
    • First observedreharmonize
    • First observedresolve_chord

TDQS

A4.3/5.0

Scored across 5 tools

Disambiguation4/5

Each tool targets a distinct musical operation: resolving, analyzing, voicing, reharmonizing, and arranging. The only mild overlap is between resolve_chord and analyze_chord, since both accept chord symbols, but their output purposes are clearly separated by the descriptions.

Naming Consistency4/5

Four of five tools follow a clear verb_noun pattern (resolve_chord, analyze_chord, generate_voicing, conduct_band). The exception is reharmonize, which is a single verb without an explicit object, but it is still recognizable and does not create confusion.

Tool Count5/5

Five tools is well-scoped for a specialized music theory server. Each tool addresses a distinct and meaningful part of chord intelligence, from analysis and resolution to voicing, reharmonization, and full band arrangement.

Completeness5/5

The tool surface covers the core chord intelligence workflow: parse/analyze chords, resolve them to concrete musical data, generate voicings with voice-leading support, reharmonize progressions, and produce a full arrangement. There are no obvious dead ends or missing essential operations for the stated domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A composition-focused server built on music21 for generative music workflows, enabling melody generation, musical transformations, chord reharmonization, counterpoint creation, and MIDI export through constraint-based algorithmic composition tools.
    1
    MIT
  • A
    license
    Not graded
    quality
    F
    maintenance
    Enables AI assistants to control Apple Music on macOS using AppleScript for playback, library management, and playlist operations. It supports features like searching tracks, managing the play queue, and retrieving detailed metadata through a structured interface.
    19
    7
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server for controlling local music playback via NetEase Cloud Music, enabling search, play, pause, skip, and lyrics display through a local web player.
    13
    76
    MIT