Skip to main content
Glama
Aaryan-Kapoor

MCP Character Tools

MCP Character Tools

NPM Version TypeScript MCP License

The last thing you need for your LLM to work with individual characters or count the number of r's in a word. This is an MCP server providing 14+ comprehensive (and pretty) character and text analysis tools to help LLMs work with individual characters - something they struggle with due to tokenization.

See the Difference

Without MCP (Wrong)

With MCP (Correct)

Claims there are 2 r's in "garlic"

Correctly identifies 1 r in "garlic"

Related MCP server: Twitter MCP Server

Why This Exists

First of all, why not? Second, Large Language Models tokenize text into subwords, not individual characters. For example, "strawberry" might become tokens like ["straw", "berry"], so the model never truly "sees" individual letters. This MCP server gives LLMs "character-level vision" through a suite of tools.

Installation

npx mcp-character-tools

Via npm (global install)

npm install -g mcp-character-tools
mcp-character-tools

From source

git clone https://github.com/Aaryan-Kapoor/mcp-character-tools
cd mcp-character-tools
npm install
npm run build
npm start

Usage with Claude Desktop

Add to your Claude Desktop configuration (claude_desktop_config.json):

{
  "mcpServers": {
    "char-tools": {
      "command": "npx",
      "args": ["mcp-character-tools"]
    }
  }
}

All Tools Reference

See sample_outputs.md for complete examples with inputs and outputs for all 14+ tools.

Tool

Description

count_letter

Count a specific letter

count_letters

Count multiple letters at once

count_substring

Count substring occurrences

letter_frequency

Get frequency distribution

spell_word

Break into characters

char_at

Get character at index

nth_character

Get nth character (1-based)

word_length

Get exact length

reverse_text

Reverse text, detect palindromes

compare_texts

Compare two texts

analyze_sentence

Word-by-word breakdown

batch_count

Count across multiple words

get_tricky_words

List commonly miscounted words

check_tricky_word

Check if word is tricky

Development

# Install dependencies
npm install

# Build
npm run build

# Run tests
npm test

# Run tests with coverage
npm run test:coverage

# Development mode with auto-rebuild
npm run dev

Testing

The project includes comprehensive tests for all tools:

npm test

Test files:

  • tests/counting.test.ts - Counting tools tests

  • tests/spelling.test.ts - Spelling tools tests

  • tests/analysis.test.ts - Analysis tools tests

  • tests/tricky-words.test.ts - Tricky words resource tests

  • tests/visualization.test.ts - Visualization utility tests

License

MIT

Available Tools

14 tools
analyze_sentenceAnalyze SentenceA
Read-onlyIdempotent

Analyze a sentence word-by-word for a specific letter.

Shows exactly how many times a letter appears in each word.

Args:

  • text (string): The sentence to analyze

  • letter (string): The letter to count

  • case_sensitive (boolean): Match case exactly (default: false)

Returns: Per-word breakdown with counts and positions.

Example: analyze_sentence("The strawberry was very ripe", "r") → per-word counts

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe sentence to analyze
letterYesThe letter to count
case_sensitiveNoMatch case exactly

TDQS

A3.9/5.0
Behavior4/5

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

The description specifies that the tool returns per-word breakdowns with counts and positions, and explains the case_sensitive parameter. This adds context beyond the annotations (readOnlyHint, idempotentHint), which already indicate safety. The description is consistent and informative.

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 efficiently structured with a concise summary followed by a clear Args section and an example. Every sentence is purposeful, and the most critical information is front-loaded.

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

Completeness5/5

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

For a simple tool with three parameters, no output schema, and no nested objects, the description fully covers the tool's purpose, parameters, and expected output. It is complete and adequate for correct invocation.

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?

Schema coverage is 100%, so the baseline is 3. The description reiterates parameters and provides an illustrative example, which adds some value beyond the schema descriptions but does not significantly enhance parameter meaning.

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 clearly states the tool's purpose: analyzing a sentence word-by-word for a specific letter, showing per-word counts. The example reinforces the purpose and distinguishes it from sibling tools like count_letter which likely provides a total count.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool vs. alternatives such as count_letter, letter_frequency, or count_substring. The example implicitly suggests usage but fails to provide context for selection among siblings.

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

batch_countBatch CountA
Read-onlyIdempotent

Count a letter across multiple words at once.

Efficiently process a list of words.

Args:

  • words (string[]): Array of words to analyze

  • letter (string): The letter to count

  • case_sensitive (boolean): Match case exactly (default: false)

Returns: Results for each word, totals, sorted by count.

Example: batch_count(["strawberry", "raspberry", "blueberry"], "r") → individual and total counts

ParametersJSON Schema
NameRequiredDescriptionDefault
wordsYesWords to analyze
letterYesThe letter to count
case_sensitiveNoMatch case exactly

TDQS

A4.7/5.0
Behavior5/5

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

Annotations indicate read-only, idempotent, non-destructive. The description adds sorting by count, individual and total results, and an example. 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?

The description is brief yet informative, front-loaded with the main action, and includes an example. Every sentence adds value.

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

Completeness5/5

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

Given the tool's low complexity and full schema coverage, the description covers purpose, parameter meanings, behavior (sorting, totals), and example. No gaps.

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 3. The description adds meaning by explaining the default for case_sensitive and the overall purpose of each parameter, going slightly beyond schema 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 explicitly states 'Count a letter across multiple words at once' with a clear verb and resource. It distinguishes from siblings like count_letter (single word) by emphasizing batch processing.

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 implies when to use (multiple words) but does not explicitly state when not to use or reference alternatives. It is clear enough for context.

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

char_atCharacter At IndexA
Read-onlyIdempotent

Get the character at a specific index (0-based). Supports negative indices.

Args:

  • text (string): The text to index into

  • index (number): Position (0-based, negative counts from end)

Returns: The character at that position, or error if out of bounds.

Example: char_at("hello", 1) → 'e'; char_at("hello", -1) → 'o'

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to index into
indexYesPosition (0-based, negative from end)

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already indicate read-only, idempotent, non-destructive behavior. Description adds clarity about error handling ('or error if out of bounds') and provides concrete examples demonstrating expected behavior.

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?

Extremely concise yet informative: two sentences plus structured Args, Returns, Example sections. Every word adds value with no redundancy.

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

Completeness5/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 fully explains return values and error case. For a simple tool with rich annotations, this provides sufficient context for correct invocation.

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?

Schema coverage is 100% with clear descriptions for both parameters. The description reiterates schema content without adding new semantic details beyond clarifying the indexing behavior.

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

Purpose4/5

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

Clear verb 'Get' and resource 'character at a specific index' with index details (0-based, negative). However, does not differentiate from sibling 'nth_character' which may have similar functionality.

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?

Implies usage for single character retrieval by index, including negative indices, but provides no explicit guidance on when to choose this over sibling tools like 'nth_character' or 'count_letter'.

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

check_tricky_wordCheck Tricky WordA
Read-onlyIdempotent

Look up a specific word to see if it's a commonly miscounted word.

Args:

  • word (string): The word to check

Returns: Information about common mistakes if it's a tricky word, or empty if not.

Example: check_tricky_word("strawberry") → explains the 3 r's and common mistake of counting 2

ParametersJSON Schema
NameRequiredDescriptionDefault
wordYesThe word to check

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 and idempotentHint=true; description adds return behavior (info or empty) and example, going beyond 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?

Extremely concise: one-line purpose, clearly labeled Args, Returns, and example. No redundant text.

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

Completeness5/5

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

For a simple lookup tool with one parameter and no output schema, description fully explains input, output format, and provides example. 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?

Schema coverage is 100% with description 'The word to check'. Description repeats same info but provides usage example; baseline 3 with minimal added value.

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?

Description clearly states it checks a specific word for common miscounts, with an example. Distinguishes from siblings like get_tricky_words (lists all) and count_letter (counts a letter).

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?

Implied usage for checking individual words. Not explicit about when not to use or alternatives, but context is clear given sibling tool names like get_tricky_words.

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

compare_textsCompare TextsA
Read-onlyIdempotent

Compare letter frequencies between two texts.

Useful for analyzing similarity or differences.

Args:

  • text1 (string): First text

  • text2 (string): Second text

  • case_sensitive (boolean): Distinguish case (default: false)

Returns: Common characters, unique to each, frequency comparison, similarity score.

Example: compare_texts("hello", "world") → common: ['l', 'o'], unique_to_text1: ['h', 'e'], etc.

ParametersJSON Schema
NameRequiredDescriptionDefault
text1YesFirst text
text2YesSecond text
case_sensitiveNoDistinguish case

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description does not need to add much. It mentions the return fields (common characters, unique, etc.), which adds some context beyond annotations, but not significantly.

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

Conciseness4/5

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

The description is well-structured with brief intro, Args list, Returns, and an example. It is concise and front-loaded, though slightly verbose with the 'Useful for...' line. Overall efficient.

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

Completeness5/5

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

Given 3 parameters, 100% schema coverage, good annotations, and no output schema, the description covers all necessary context: what the tool does, parameters, return values, and an example. It is complete for an agent to use correctly.

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?

Schema coverage is 100%, and the description restates parameter names and types. It adds the default value for case_sensitive, which is already in the schema. No additional meaning beyond what the schema provides.

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 clearly states it compares letter frequencies between two texts, with a specific verb-resource combination. It distinguishes from siblings like count_letter and letter_frequency by emphasizing comparison of two texts.

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 mentions it is useful for analyzing similarity or differences, implying when to use. It does not explicitly state when not to use or list alternatives, but the example and context provide adequate guidance.

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

count_letterCount LetterA
Read-onlyIdempotent

Count occurrences of a specific letter in text.

Returns the count, positions, a visual breakdown showing where each letter appears, and a density percentage.

Args:

  • text (string): The text to analyze

  • letter (string): The single letter to count

  • case_sensitive (boolean): Whether to match case exactly (default: false)

Returns: count, positions array, visual breakdown, and density summary.

Example: count_letter("strawberry", "r") → count: 3, positions: [2, 5, 8]

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to analyze
letterYesThe letter to count
case_sensitiveNoMatch case exactly

TDQS

A4.6/5.0
Behavior5/5

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

Annotations indicate read-only, idempotent, non-destructive. Description adds behavioral details: returns count, positions, visual breakdown, density. No contradiction.

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?

Well-structured with sections: summary, return details, Args, Returns, Example. No redundant sentences, efficient.

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?

Complete for a 3-param tool with no output schema. Explains what it does and returns. Could mention edge cases like empty text, but schema has minLength constraints.

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% with good descriptions. Description adds value with example and explanation of return structure, but schema already covers parameter meanings.

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?

Description clearly states it counts occurrences of a specific letter in text, with a specific verb and resource. It distinguishes from siblings like 'count_letters' (plural) and 'count_substring' (different entity).

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?

Description implies usage for single letter counting with example, but does not explicitly state when not to use or compare to siblings. It provides clear context for its intended use case.

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

count_lettersCount Multiple LettersA
Read-onlyIdempotent

Count occurrences of multiple letters at once.

Efficiently counts several letters in a single call.

Args:

  • text (string): The text to analyze

  • letters (string[]): Array of letters to count

  • case_sensitive (boolean): Match case exactly (default: false)

Returns: Results for each letter with counts and positions.

Example: count_letters("strawberry", ["r", "s", "e"]) → r: 3, s: 1, e: 1

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to analyze
lettersYesLetters to count
case_sensitiveNoMatch case exactly

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already indicate readOnly and idempotent. Description adds that it returns counts and positions, and case_sensitive defaults to false, providing behavioral context beyond 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?

Description is concise with clear sections for Args, Returns, and Example. Every sentence adds value without redundancy.

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?

With no output schema, description adequately describes return format (counts and positions). Tool complexity is low, and the description covers key aspects for an agent to use it correctly.

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%, but description adds an example showing how parameters work together and clarifies that letters are an array of single characters, adding value beyond schema.

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 clearly states the tool counts multiple letters at once, using specific verb+resource. It distinguishes from sibling 'count_letter' by explicitly saying 'multiple letters' and provides an example.

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 suggests efficiency for multiple letters, implying use over single-letter calls. However, it lacks explicit when-not-to-use or alternative tool names.

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

count_substringCount SubstringA
Read-onlyIdempotent

Count occurrences of a substring or pattern in text.

Can count overlapping or non-overlapping matches.

Args:

  • text (string): The text to search in

  • substring (string): The pattern to find

  • case_sensitive (boolean): Match case exactly (default: false)

  • overlapping (boolean): Count overlapping matches (default: false)

Returns: count and positions of each match.

Example: count_substring("banana", "ana", overlapping=true) → count: 2, positions: [1, 3]

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to search in
substringYesThe pattern to find
overlappingNoCount overlapping matches
case_sensitiveNoMatch case exactly

TDQS

A4.3/5.0
Behavior4/5

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

Annotations indicate read-only, idempotent, non-destructive. Description adds details about overlapping matches, case sensitivity, and return format (count and positions), providing behavioral context beyond 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?

The description is concise, well-structured with Args, Returns, and Example sections. It is front-loaded with the purpose and efficiently uses sentences.

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

Completeness5/5

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

Given no output schema, the description explains return values (count and positions). It covers all parameters, behavior, and an example. The tool is well-defined for an AI agent.

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% with descriptions. The description repeats parameter info but adds an example with 'overlapping=true' clarifying behavior, enhancing semantics beyond the schema alone.

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 'Count occurrences of a substring or pattern in text' with clear distinction of overlapping vs non-overlapping. It is specific and differentiates from sibling tools like count_letter or count_letters.

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. The description implies usage via parameter details and example, but lacks comparisons to siblings like batch_count or compare_texts.

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

get_tricky_wordsGet Tricky WordsA
Read-onlyIdempotent

Get a list of words that are commonly miscounted by LLMs.

These are words with double letters, repeated patterns, or other features that cause counting errors.

Returns: List of tricky words with correct counts and explanations.

Example: Returns "strawberry" with explanation that it has 3 r's, not 2.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds value by explaining the nature of words (double letters, repeated patterns) and the return format with an example. 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.

Conciseness4/5

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

The description is a single paragraph of three sentences, front-loaded with the purpose. It is clear and efficient, though slightly verbose with the example.

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

Completeness5/5

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

Given no parameters and no output schema, the description fully covers what the tool does and returns. The example clarifies the structure of the response.

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?

No parameters exist, so the baseline is 4. The description does not need to add parameter 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?

The description clearly states 'Get a list of words that are commonly miscounted by LLMs', specifying the verb, resource, and context. It distinguishes from sibling tools like 'check_tricky_word' and 'count_letter'.

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 usage for obtaining known tricky words but does not explicitly state when to use this tool versus alternatives like 'check_tricky_word'. No exclusions or context are given.

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

letter_frequencyLetter FrequencyA
Read-onlyIdempotent

Get frequency distribution of all characters in text.

Provides a complete breakdown of character frequencies.

Args:

  • text (string): The text to analyze

  • case_sensitive (boolean): Distinguish upper/lowercase (default: false)

  • include_spaces (boolean): Include spaces in count (default: false)

  • include_punctuation (boolean): Include punctuation (default: false)

  • letters_only (boolean): Only count a-z letters (default: true)

Returns: Frequency map, sorted list, most/least common characters.

Example: letter_frequency("hello") → h: 1, e: 1, l: 2, o: 1

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to analyze
letters_onlyNoOnly count a-z letters
case_sensitiveNoDistinguish upper/lowercase
include_spacesNoInclude spaces
include_punctuationNoInclude punctuation

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds context about the output format (frequency map, sorted list, most/least common) and parameters that affect behavior (case_sensitive, include_spaces). This goes beyond the annotations' safety profile.

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

Conciseness4/5

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

The description is well-structured with Args, Returns, and an Example section. It front-loads the main purpose. While it is slightly long, every sentence earns its place and the structure aids readability.

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

Completeness5/5

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

Despite no output schema, the description fully explains the return values (frequency map, sorted list, most/least common characters) and provides a detailed example. All 5 parameters are explained, and the annotations cover safety and idempotence. The description is complete for this task.

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% with descriptions for all 5 parameters. The description adds value by providing a concrete example ('hello' case) and clarifying the return structure (frequency map, sorted list, most/least common), which helps interpret parameter effects.

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 clearly states the tool's purpose: 'Get frequency distribution of all characters in text.' It distinguishes itself from siblings like 'count_letter' and 'count_letters' by providing a full distribution rather than a single count, and the example further clarifies the output.

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 provides a clear function but does not explicitly mention when to use this tool versus alternatives like 'count_letter' or 'analyze_sentence'. It implies usage through the detailed description but lacks explicit guidance on exclusions or when not to use.

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

nth_characterNth CharacterA
Read-onlyIdempotent

Get the nth character (1-based, human-friendly numbering).

"What's the 3rd letter?" uses position=3.

Args:

  • text (string): The text to examine

  • position (number): Which character (1 = first, 2 = second, etc.)

  • from_end (boolean): Count from end instead (default: false)

Returns: The character and a human-readable description.

Example: nth_character("hello", 2) → 'e' (the 2nd character)

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to examine
from_endNoCount from end instead
positionYesWhich character (1-based)

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already indicate readOnlyHint and idempotentHint. Description adds 1-based indexing and from_end behavior, but omits behavior on out-of-bounds positions (e.g., position > text length). Does not contradict 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?

Very concise: three sentences plus Args list and Example. Front-loaded with purpose. No fluff, 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?

For a simple tool with full schema coverage and clear annotations, the description is mostly complete. Lacks error handling details and differentiation from similar sibling tools, but otherwise sufficient.

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. Description adds context: '1-based, human-friendly numbering' for position, default false for from_end, and an example. This enhances understanding beyond schema.

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

Purpose4/5

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

Clearly states 'Get the nth character' with 1-based numbering. Provides example and argument details. However, does not explicitly differentiate from sibling tool 'char_at' which likely has similar purpose.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives like 'char_at' or 'reverse_text'. The description gives a natural language example but lacks usage context and exclusions.

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

reverse_textReverse TextA
Read-onlyIdempotent

Reverse text character-by-character or word-by-word.

Also detects if the text is a palindrome.

Args:

  • text (string): The text to reverse

  • reverse_words_only (boolean): Reverse word order only, not characters (default: false)

Returns: Reversed text, palindrome detection.

Example: reverse_text("hello") → "olleh"; reverse_text("racecar") → "racecar" (palindrome!)

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to reverse
reverse_words_onlyNoReverse word order only

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the tool is safe and idempotent. The description adds the palindrome detection behavior and example outputs, but does not contradict 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?

The description is very concise: three short paragraphs covering purpose, arguments, returns, and an example. No wasted words.

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

Completeness5/5

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

For a simple tool with two parameters and no output schema, the description is complete. It explains the operation, argument types, behavior with boolean flag, return value, and shows an example.

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 parameters are documented. The description adds value with examples (e.g., 'hello' → 'olleh') and clarifies the effect of reverse_words_only.

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 clearly states the tool reverses text character-by-character or word-by-word, and detects palindromes. This is a unique operation among siblings, which are all text analysis or counting tools.

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 does not explicitly state when to use this tool versus alternatives, but the purpose is specific enough that usage is implied. No exclusions or alternative tools are mentioned.

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

spell_wordSpell WordA
Read-onlyIdempotent

Break text into individual characters with optional indices.

Perfect for verifying character-by-character content.

Args:

  • text (string): The text to spell out

  • include_indices (boolean): Include position numbers (default: true)

Returns: Array of characters, indexed list, spelled out string.

Example: spell_word("cat") → ['c', 'a', 't'] with indices [0:'c', 1:'a', 2:'t']

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to spell out
include_indicesNoInclude position numbers

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds the return format (array of characters, indexed list) which provides useful context beyond annotations, but does not disclose additional behaviors like rate limits or authentication needs.

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 very concise: two short paragraphs plus a clear args list and example. Every sentence serves a purpose, and the main action is front-loaded. No wasted words.

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?

For a simple tool with only two parameters and full annotation coverage, the description provides enough context. It explains the return format and includes an example. Minor gap: the description could clarify the exact return structure when include_indices is false.

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?

Input schema coverage is 100% and the description repeats the parameter descriptions without adding significant new meaning. The example usage provides some context, but the baseline is appropriate as the schema already documents the parameters adequately.

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 clearly states the tool's action: 'Break text into individual characters with optional indices.' This is a specific verb-resource pair that distinguishes it from sibling tools like char_at (single character) or count_letters (counting).

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 says 'Perfect for verifying character-by-character content,' which provides clear context for when to use it. However, it does not explicitly mention when not to use it or provide exclusion criteria relative to similar tools.

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

word_lengthWord LengthA
Read-onlyIdempotent

Get the exact length of text with detailed breakdown.

Args:

  • text (string): The text to measure

  • count_spaces (boolean): Include spaces in length (default: true)

Returns: Total length, length without spaces, space count, word count.

Example: word_length("hello world") → 11 total, 10 without spaces, 2 words

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe text to measure
count_spacesNoInclude spaces in length

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already provide readOnlyHint, idempotentHint, and destructiveHint, so the description adds value by detailing the return breakdown and example behavior beyond what annotations cover.

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?

Extremely concise with a structured format: brief purpose, args, returns, and example. No redundant or unnecessary information.

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

Completeness5/5

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

Given the simple tool with 2 parameters, high schema coverage, good annotations, and a clear explanation of return values, the description is fully complete for an AI agent to correctly select and invoke the tool.

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%, but the description adds a concrete example showing how parameters affect output, which provides practical understanding beyond the schema.

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 it gets the exact length of text with a detailed breakdown, including total length, without spaces, space count, and word count. This distinguishes it from sibling tools like count_letter or analyze_sentence.

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 use for measuring text length, but does not explicitly state when to use this tool over alternatives like analyze_sentence or count_substring, nor provides exclusion criteria.

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. Dates show when Glama detected each change.

  1. 14 tool updates
    • First observedanalyze_sentence
    • First observedbatch_count
    • First observedchar_at
    • First observedcheck_tricky_word
    • First observedcompare_texts
    • First observedcount_letter
    • First observedcount_letters
    • First observedcount_substring
    • First observedget_tricky_words
    • First observedletter_frequency
    • First observednth_character
    • First observedreverse_text
    • First observedspell_word
    • First observedword_length

TDQS

A3.9/5.0
Disambiguation4/5

Most tools have distinct purposes, but char_at (0-based) and nth_character (1-based) could cause confusion, as could check_tricky_word vs get_tricky_words. Otherwise, tools like count_letter, count_letters, and count_substring are clearly differentiated.

Naming Consistency3/5

Tool names follow a verb_noun pattern but vary in detail (e.g., 'char_at' is abbreviated, 'nth_character' is more descriptive, 'letter_frequency' is noun_noun). Inconsistent use of 'count_letter' vs 'count_letters' and 'get_tricky_words' vs 'check_tricky_word' adds to the mixed style.

Tool Count5/5

14 tools is well-scoped for a character analysis server. Each tool serves a specific purpose (counting, indexing, frequency, tricky words, reversing, etc.) without being redundant or too many.

Completeness4/5

The set covers core character operations like counting, indexing, frequency, and substring analysis. Minor gaps exist (e.g., no case conversion or word-level tokenization beyond length), but the domain is well-served for typical letter-counting tasks.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    Precise character-level string indexing for LLMs. Provides tools for finding, extracting, and manipulating text by exact character position to solve position-based operations.
    12
    3
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Provides tools for accurate Twitter/X post character counting, validation, and optimization using official counting methods. It enables users to extract entities like URLs and hashtags to ensure content fits within platform constraints.
    4
    1
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides tools for AI models to count characters and words in text, supporting English and other space-delimited languages.
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Accurately counts characters, bytes, and manuscript paper based on Unicode grapheme clusters, and provides deterministic feedback to help AI meet exact length limits for self-introductions or school records.
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Aaryan-Kapoor/mcp-character-tools'

If you have feedback or need assistance with the MCP directory API, please join our Discord server