blackmount-nlp-mcp
blackmount-nlp-mcp is a lightweight, dependency-free NLP server providing 45+ text analysis tools, covering:
Tokenization: Split text into words/sentences; generate word-level or character-level n-grams.
Readability: Flesch Reading Ease, Flesch-Kincaid Grade, Gunning Fog, Coleman-Liau, ARI, SMOG, syllable counts, and a full readability report via
get_reading_level.Sentiment Analysis: Compound score (−1 to +1), positive/negative/neutral label, per-sentence breakdown, and aspect-based sentiment.
Keyword Extraction: TF-IDF (corpus-level), RAKE (key phrases), top words by frequency, and top n-gram phrases.
Text Similarity: Jaccard similarity, cosine similarity, Levenshtein edit distance (raw and normalized), and Longest Common Subsequence length.
Text Cleaning: Remove stopwords (500+ built-in), punctuation, numbers, URLs, emails, or HTML tags; normalize whitespace; lowercase; Porter stemming; and a configurable multi-step cleaning pipeline.
Detection & Statistics: Detect language (18 languages with confidence scores), identify character encoding/script type, get English confidence score, and count words, sentences, and paragraphs with average lengths.
Summarization: Extractive summarization (top-scored sentences) and a full document profile including word count, readability scores, language, and estimated reading time.
blackmount-nlp-mcp
Deterministic local text analysis for Claude Desktop, Cursor, Cline, and any MCP client. Built by Blackmount.
45 text analysis tools as a FastMCP server — sentiment, readability, keywords, similarity, summarization, language detection. No NLTK. No spaCy. No transformers. No API keys. One dependency (mcp[cli]), 42 KB wheel, installs in seconds. Python 3.10+.
Why this exists
blackmount-nlp-mcp | NLTK | spaCy | transformers | |
Wheel size | 42 KB | 1.5 MB | 6 MB+ (+ models) | 10 MB+ (+ models) |
Direct dependencies | 1 | many | many | many |
Tokenization | ✅ | ✅ | ✅ | ✅ |
Sentiment analysis | ✅ | ✅ | ❌ | ✅ |
Readability scores | ✅ | ❌ | ❌ | ❌ |
Keyword extraction | ✅ | ✅ | ❌ | ❌ |
Text similarity | ✅ | ✅ | ✅ | ✅ |
Language detection | ✅ (18 langs) | ❌ | ❌ | ❌ |
Everything is implemented from scratch in pure Python — Porter stemmer, TF-IDF, RAKE, Levenshtein, VADER-style sentiment, Flesch / Gunning Fog / Coleman-Liau / ARI / SMOG readability, extractive summarization, language detection — plus a built-in 2000+ word sentiment lexicon and 500+ stopword list, all baked into the package.
Related MCP server: LODA MCP Server
Quick start
pip install blackmount-nlp-mcpClaude Desktop
Add to your config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"nlp": {
"command": "blackmount-nlp-mcp"
}
}
}Cursor
Add to .cursor/mcp.json in your project root:
{
"mcpServers": {
"nlp": {
"command": "blackmount-nlp-mcp"
}
}
}Any MCP client
The server runs over stdio. Point your client at the blackmount-nlp-mcp command:
blackmount-nlp-mcpRestart your editor. All 45 NLP tools are now available — just ask in natural language.
Tool catalog
Tokenization (4 tools)
Tool | Description | Try asking |
| Split text into words, handling contractions and punctuation | "Tokenize this paragraph into words" |
| Split into sentences, handling common abbreviations | "Break this text into individual sentences" |
| Generate word-level n-grams from a token list | "Generate bigrams from these tokens" |
| Generate character-level n-grams | "Get character trigrams for this word" |
Readability (8 tools)
All readability functions return 0.0 for empty or whitespace-only input.
Tool | Description | Try asking |
| 0–100 ease score (higher = easier) | "Calculate the Flesch Reading Ease score" |
| US grade level estimate | "What grade level is this written at?" |
| Fog index based on complex word ratio | "Calculate the Fog index for this text" |
| Coleman-Liau grade-level index | "Get the Coleman-Liau score" |
| ARI grade-level index | "What's the ARI for this document?" |
| SMOG grade (recommended for healthcare text) | "Calculate the SMOG grade for this document" |
| Syllable count estimation for any word | "How many syllables in 'extraordinary'?" |
| All readability scores in one call with a plain-English label | "Give me a full readability report for this text" |
Sentiment Analysis (4 tools)
Tool | Description | Try asking |
| Compound sentiment score from −1.0 to +1.0 | "What's the sentiment of this customer review?" |
| Returns | "Is this feedback positive or negative?" |
| Per-sentence sentiment breakdown | "Show me the sentiment of each sentence" |
| Sentiment scoped to specific topics | "What's the sentiment around 'pricing' in these reviews?" |
Keyword Extraction (4 tools)
Tool | Description | Try asking |
| TF-IDF keyword ranking across a corpus | "What are the key terms across these docs?" |
| RAKE algorithm — phrase-level keyword extraction | "Extract the key phrases from this article" |
| Top words by frequency, stopwords excluded | "What are the most common words in this text?" |
| Top n-gram phrases by frequency | "What two-word phrases appear most often?" |
Text Similarity (5 tools)
Tool | Description | Try asking |
| Word-set overlap, 0–1 | "How similar are these two paragraphs?" |
| Bag-of-words cosine similarity, 0–1 | "Calculate cosine similarity between these texts" |
| Levenshtein edit distance | "How many edits to turn 'kitten' into 'sitting'?" |
| Edit distance normalized to 0–1 | "How different are these two strings?" |
| LCS length between two strings | "What's the LCS length of these two strings?" |
Text Cleaning (10 tools)
Tool | Description | Try asking |
| Strip 500+ English stopwords | "Remove stopwords from this text" |
| Remove all punctuation | "Strip the punctuation" |
| Remove numeric tokens | "Remove all numbers from this" |
| Strip URLs | "Clean out the URLs" |
| Strip email addresses | "Remove email addresses from this text" |
| Strip HTML tags | "Strip the HTML from this content" |
| Collapse and trim whitespace | "Normalize the whitespace" |
| Lowercase the text | "Convert this to lowercase" |
| Porter stemmer (pure Python, no NLTK) | "Stem the word 'running'" |
| Configurable multi-step cleaning in one call | "Clean this text: remove HTML, URLs, and stopwords" |
Detection (8 tools)
Tool | Description | Try asking |
| Identify language from 18 supported languages | "What language is this text written in?" |
| Detect script: ASCII, Latin, Cyrillic, CJK, Arabic | "What script does this text use?" |
| English confidence score, 0–1 | "Is this text in English?" |
| Word count | "How many words are in this?" |
| Sentence count | "Count the sentences" |
| Paragraph count | "How many paragraphs?" |
| Mean word length in characters | "What's the average word length?" |
| Mean sentence length in words | "How long are the sentences on average?" |
Summarization (2 tools)
Tool | Description | Try asking |
| Select the N highest-scoring sentences from a document | "Summarize this article in 3 sentences" |
| Full document stats: words, readability, language, reading time | "Give me a statistical profile of this text" |
Use as a library
The submodules are importable directly — no MCP server required:
from blackmount_nlp_mcp.sentiment import sentiment_score, sentiment_label
from blackmount_nlp_mcp.readability import reading_level
from blackmount_nlp_mcp.keywords import rake_keywords
text = "This product is absolutely amazing! The quality is excellent."
print(sentiment_score(text))
# 0.9285
print(sentiment_label(text))
# 'positive'
print(reading_level(text))
# {'grade_level': 12.39, 'label': 'college',
# 'flesch_reading_ease': 14.27, 'flesch_kincaid_grade': 12.39,
# 'gunning_fog': 19.58, 'coleman_liau': 10.94,
# 'automated_readability': 7.51, 'smog_grade': 11.21}
print(rake_keywords(text))
# [{'phrase': 'absolutely amazing', 'score': 4.0},
# {'phrase': 'product', 'score': 1.0},
# {'phrase': 'quality', 'score': 1.0},
# {'phrase': 'excellent', 'score': 1.0}]Development
git clone https://github.com/BlackMount-ai/blackmount-nlp-mcp
cd blackmount-nlp-mcp
pip install -e .
pytest tests/ -vBlackmount ecosystem
blackmount-nlp-mcp is built by Blackmount — tools for people who work with AI.
blackmount-mcp — Local browser context (history, bookmarks, tabs, downloads) as an MCP server. Pair it with blackmount-nlp-mcp to analyze your browsing: extract keywords from page titles, summarize research topics, detect reading-level trends across the sites you visit.
app.blackmount.ai — The full Blackmount platform. Search, organize, and analyze everything your AI tools produce.
Star History
License
MIT
Available Tools
45 toolsautomated_readability_indexC
Automated Readability Index (ARI). Grade level from character and word counts.
Inputs: text (required). Returns: result
check_is_englishC
Confidence that text is English (0-1 scale).
Inputs: text (required). Returns: result
clean_lowercaseC
Convert text to lowercase.
Inputs: text (required). Returns: result
clean_normalize_whitespaceB
Collapse multiple whitespace into single spaces.
Inputs: text (required). Returns: result
clean_remove_emailsC
Remove email addresses from text.
Inputs: text (required). Returns: result
clean_remove_htmlA
Remove HTML tags from text.
Inputs: text (required). Returns: result
clean_remove_numbersC
Remove all numbers from text.
Inputs: text (required). Returns: result
clean_remove_punctuationA
Remove all punctuation from text.
Inputs: text (required). Returns: result
clean_remove_stopwordsC
Remove English stopwords (500+ built-in) from text.
Inputs: text (required). Returns: result
clean_remove_urlsB
Remove URLs from text.
Inputs: text (required). Returns: result
clean_text_pipelineA
Configurable cleaning pipeline. Steps: html, urls, emails, numbers, punctuation, stopwords, whitespace, lowercase.
Inputs: text (required), steps. Returns: result
coleman_liau_indexC
Coleman-Liau Index. Grade level based on characters per word and sentences per word.
Inputs: text (required). Returns: result
count_paragraphsA
Count paragraphs in text (separated by blank lines).
Inputs: text (required). Returns: result
count_sentencesC
Count sentences in text.
Inputs: text (required). Returns: result
count_syllablesA
Estimate syllable count for a single word using heuristics.
Inputs: word (required). Returns: result
count_wordsC
Count words in text.
Inputs: text (required). Returns: result
detect_text_encoding_typeC
Detect character encoding type: ASCII, Latin, Cyrillic, CJK, Arabic, etc.
Inputs: text (required). Returns: result
detect_text_languageA
Detect language from text. Returns top 5 matches with confidence scores. Supports 18 languages.
Inputs: text (required). Returns: result
extract_rake_keywordsC
RAKE keyword extraction (Rapid Automatic Keyword Extraction). Finds multi-word key phrases.
Inputs: text (required), top_n. Returns: result
extract_tfidf_keywordsA
Extract keywords using TF-IDF computed from scratch. Pass multiple docs for best results.
Inputs: documents (required), top_n. Returns: result
flesch_kincaid_gradeC
Flesch-Kincaid Grade Level. Returns US school grade level needed to understand text.
Inputs: text (required). Returns: result
flesch_reading_easeC
Flesch Reading Ease score. 90-100=very easy, 60-69=standard, 0-29=very confusing.
Inputs: text (required). Returns: result
generate_char_ngramsB
Generate character-level n-grams from text.
Inputs: text (required), n. Returns: result
generate_ngramsA
Generate n-grams from a list of tokens. Returns list of n-gram lists.
Inputs: tokens (required), n. Returns: result
get_aspect_sentimentA
Sentiment around specific topics/aspects. Finds sentences mentioning each aspect and averages their sentiment.
Inputs: text (required), aspects (required).
get_avg_sentence_lengthC
Average sentence length in words.
Inputs: text (required). Returns: result
get_avg_word_lengthC
Average word length in characters.
Inputs: text (required). Returns: result
get_cosine_similarityC
Cosine similarity using bag-of-words vectors. 0=orthogonal, 1=identical.
Inputs: text1 (required), text2 (required). Returns: result
get_edit_distanceA
Levenshtein edit distance. Minimum single-character edits to transform s1 into s2.
Inputs: s1 (required), s2 (required). Returns: result
get_extractive_summaryA
Extract the best N sentences as a summary. Scores by position, keyword frequency, length, and title overlap.
Inputs: text (required), n_sentences, title. Returns: result
get_jaccard_similarityB
Jaccard similarity (word-level set overlap). 0=no overlap, 1=identical word sets.
Inputs: text1 (required), text2 (required). Returns: result
get_longest_common_subsequenceB
Length of longest common subsequence (LCS) between two strings.
Inputs: s1 (required), s2 (required). Returns: result
get_normalized_edit_distanceA
Normalized edit distance on 0-1 scale. 0=identical, 1=completely different.
Inputs: s1 (required), s2 (required). Returns: result
get_phrase_frequencyC
Most frequent n-grams (phrases). Default bigrams. Returns [{phrase, count}].
Inputs: text (required), n, top_n. Returns: result
get_reading_levelA
Comprehensive reading level: grade level, label (elementary/middle/high school/college/graduate), and all readability scores.
Inputs: text (required).
get_sentence_sentimentsA
Per-sentence sentiment breakdown. Returns list of {sentence, score, label}.
Inputs: text (required). Returns: result
get_sentiment_labelC
Classify text as 'positive', 'negative', or 'neutral'.
Inputs: text (required). Returns: result
get_sentiment_scoreA
Compound sentiment score from -1 (negative) to 1 (positive). VADER-style with built-in 2000+ word lexicon.
Inputs: text (required). Returns: result
get_text_statisticsA
Comprehensive text stats: words, sentences, paragraphs, reading time, readability scores, language.
Inputs: text (required).
get_word_frequencyA
Most frequent words excluding stopwords. Returns [{word, count}].
Inputs: text (required), top_n. Returns: result
gunning_fog_indexA
Gunning Fog Index. Estimates years of formal education needed to understand text.
Inputs: text (required). Returns: result
porter_stemA
Porter stemmer from scratch. Reduce word to its stem (e.g., 'running' -> 'run').
Inputs: word (required). Returns: result
sentence_tokenizeA
Split text into sentences. Handles abbreviations (Mr., Dr., etc.) and tricky boundaries.
Inputs: text (required). Returns: result
smog_grade_indexA
SMOG Grade. Best for healthcare/medical texts. Counts polysyllabic words.
Inputs: text (required). Returns: result
word_tokenizeA
Split text into word tokens. Handles contractions, hyphenated words, numbers, and punctuation.
Inputs: text (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 45 tools
Many tools have clear purposes, but multiple readability indices (ARI, Coleman-Liau, Flesch, etc.) and multiple sentiment tools (aspect, sentence, overall) overlap in function, creating confusion for agents.
Most tools follow a verb_noun pattern (e.g., clean_lowercase, get_cosine_similarity), but some use different verbs like 'detect_text_encoding_type' vs 'check_is_english', with minor inconsistency.
45 tools is on the high side for an NLP toolkit; many functionalities could be consolidated (e.g., several readability formulas into one tool). Still, each individual tool is specific.
The server covers a wide range of text analysis: cleaning, tokenization, readability, similarity, sentiment, keyword extraction, language detection. Missing lemmatization, but comprehensive overall.
Maintenance
Related MCP Connectors
Sentiment, language detection, readability, keywords, summaries and profanity filtering
50+ pandas-powered tools for data loading, cleaning, visualization, and ML workflows
Deterministic AI agent microtools, no accounts/API keys. fetch_extract: 98% token cut. 47 tools.
Web scraping, code review, content gen, sentiment. Zero Core Tools.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceProvides intelligent summarization capabilities through a clean, extensible architecture. Mainly built for solving AI agents issues on big repositories, where large files can eat up the context window.14 npm37MIT
- AlicenseNot gradedqualityDmaintenanceProvides token-efficient document search and retrieval for LLMs by returning relevant document sections within specified token budgets. It utilizes section-aware parsing and Bloom filter elimination to offer high-speed, zero-dependency access to large documents.MIT
- AlicenseAqualityAmaintenanceWeb content extraction for AI agents. 10 tools: scrape, crawl, map, batch, extract, summarize, diff, brand, search, research. Uses TLS fingerprinting to bypass anti-bot without a headless browser. Outputs LLM-optimized markdown with 67% fewer tokens than raw HTML.102,436AGPL 3.0
- AlicenseAqualityDmaintenanceSmart memory for AI agents. Solves the Karpathy problem: memories decay, topics are frequency-weighted, one-time questions don't become obsessions. 7 tools. Zero deps.411 npm2MIT