Text preprocessing and NLP server for CSV-based text processing tasks including lowercasing, punctuation removal, stopword removal, stemming, lemmatization, and emoji/emoticon removal.
TextProcessingMCP has significant structural and quality issues. While all 9 tools are explicitly registered with @mcp.tool() decorators and have basic descriptions, the definitions lack rigor required for production use. Naming conventions are inconsistent (lowercasing, remove_punctuation follow verb_noun, but lack clear action verbs in some cases). Descriptions vary widely in clarity and completeness. Parameter descriptions are minimal to missing. Output schemas are never documented, responses are free-form dicts without field definitions. Error handling is weak, returning generic error strings without guidance. The server has implicit state dependencies (temp.csv file) that are not well-documented. Critical security gap: tools operate on hardcoded file paths with minimal validation.
Accesses the temp.csv file if saved previously. Uses this CSV file to tokenize, lemmatize and de-tokenize the text from the column passed as parameter. Saves the csv file after adding the new processed column.
Accesses the temp.csv file if saved previously. Uses this CSV file to convert the text from the column passed as parameter to lowercase. Saves the csv file after adding the new processed column.
Read a CSV file and return basic information about it.
Accesses the temp.csv file if saved previously. Uses this CSV file to remove emojis from the column passed as parameter. Saves the csv file after adding the new processed column.
Accesses the temp.csv file if saved previously. Uses this CSV file to remove emoticons from the column passed as parameter. Saves the csv file after adding the new processed column.
Accesses the temp.csv file if saved previously. Uses this CSV file to remove punctuations from the text from the column passed as parameter. Saves the csv file after adding the new processed column.
No output schemas documented. All tools return free-form dicts with fields like 'success', 'error', 'sample text before', 'processed text in column' without type definitions. LLMs cannot plan downstream tool calls or extract structured data reliably.
Implicit state dependencies and file system coupling. Tools write to hardcoded 'temp.csv' and expect previous operations to have written it. This breaks composition and idempotency. The description for tools like lowercasing says 'Accesses the temp.csv file if saved previously' but does not explain how or when temp.csv is created, or what happens if it does not exist.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 8 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 32 | - | v1 |
Accesses the temp.csv file if saved previously. Uses this CSV file to tokenize, remove stopwords and de-tokenize the text from the column passed as parameter. Saves the csv file after adding the new processed column.
Accesses the temp.csv file if saved previously. Uses this CSV file to tokenize, remove stopwords and de-tokenize the text from the column passed as parameter. Saves the csv file after adding the new processed column.
Read CSV file. Generates a dataframe with provided columns and saves it in a seperate csv file.
Weak input validation and error handling. check_path() does not raise an exception or halt execution, it returns an error dict but the calling function continues. Error responses are generic strings like 'Error reading file: {str(e)}' without guidance on what the LLM should do next or how to recover.
Parameter descriptions are minimal or missing detail. 'file_path: filepath to csv file.' lacks format constraints, required directory structure, encoding assumptions, or example valid values. 'col: column containing text data.' does not specify if the column name must exist, is case-sensitive, or what happens if it does not.
Broken tool chaining. use_cols() writes output to hardcoded 'temp.csv' but the file_path parameter of downstream tools defaults to 'temp.csv'. If a user calls lowercasing(col='text', file_path='myfile.csv'), it silently overwrites the result back to 'temp.csv' on line: df.to_csv(file_path,index=False) in remove_punctuation() but df.to_csv("temp.csv",index=False) in remove_punctuation(), inconsistent. This breaks agent composition.
Missing or incomplete descriptions for several tools. stemming() says 'tokenize, remove stopwords and de-tokenize' but should say 'tokenize and apply stemming', the description appears to be copy-pasted from remove_stopwords(). remove_punctuation() does not document which punctuation set is removed (string.punctuation is mentioned only in a 'message' field of the response, not in the tool description).
No idempotency contract. If an LLM retries lowercasing() after a partial failure, it creates a second 'processed_text' column or overwrites the first. Tools should document whether they are idempotent or support a mode/dry-run to prevent side effects.
Parameter constraints not specified. 'cols' in use_cols() is described as 'list of columns to be used' but does not state whether columns must exist, whether the list can be empty, or what happens on duplicates or invalid column names.