Collection of MCP servers for file search, SQLite operations, fuzzy search, and sequential thinking
mcp-personal is a collection of 14 file-search, database, and thinking tools. Strengths: all tools have descriptions (some detailed), parameter schemas are present and typed, and the search tools are well-differentiated. Weaknesses: descriptions are verbose and example-heavy (violating 'no example values' pattern); many descriptions exceed 200 chars, wasting tokens; parameter descriptions are generic ('Defaults to current dir') rather than actionable; no documented output schemas or field descriptions; several tools lack idempotency or error recovery guidance; the sequentialthinking tool is vaguely specified with sparse parameter documentation; error handling is minimal across all tools. Many tools describe behavior (what they do) but do not explain when/why to use them or what to do when they fail. Overall, definitions are present but lack the LLM-optimization rigor of production-grade agent tools.
Create a new table in the SQLite database. Note: Requires write permissions to be enabled. Args: query (str): The CREATE TABLE SQL statement db_path (str, optional): Path to the database file. Uses default if not provided. Returns: Success status or error message Examples: create_table('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)') # Uses default db_path create_table('CREATE TABLE posts (id INTEGER PRIMARY KEY, title TEXT, content TEXT)', 'blog.db') # Specific database
Get schema information for a specific table in the SQLite database. Args: table (str): The table name to describe db_path (str, optional): Path to the database file. Uses default if not provided. Returns: Schema information including column names, types, and constraints Examples: describe_table('users') # Uses default db_path describe_table('users', 'myapp.db') # Specific database describe_table('orders', ':memory:') # In-memory database
Execute INSERT, UPDATE, or DELETE queries on the SQLite database. Note: Requires write permissions to be enabled. Args: query (str): The SQL query to execute db_path (str, optional): Path to the database file. Uses default if not provided. Returns: Success status with affected row count, or error message Examples: execute('INSERT INTO users (name, email) VALUES ("John", "john@example.com")') # Uses default db_path execute('INSERT INTO logs (message) VALUES ("Started")', 'app.db') # Specific database execute('UPDATE users SET active = 0 WHERE id = 5', '/var/data/users.db') # Absolute path execute('UPDATE settings SET value = "dark" WHERE key = "theme"', ':memory:') # In-memory database execute('UPDATE users SET active = 0 WHERE last_login < date("now", "-1 year")', 'users.db') execute('DELETE FROM sessions WHERE expired = 1', 'sessions.db')
Descriptions contain example values (e.g., 'pattern=\.py$' or 'filter="mainpy"'), violating the 'no example values in descriptions' pattern. LLMs tend to reuse these literally rather than adapt them to context. Extract examples into separate formatted constraint fields or enum enumerations.
Descriptions are verbose (many 200+ chars), wasting tokens and burying key details. Shorten to 50 - 150 chars following the pattern: 'WHAT + WHEN + CONSTRAINT'. E.g., 'search_files: Find files by regex/glob pattern (use filter_files for fuzzy matching instead).'
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 48 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 16 | - | v1 |
Extract text content from specific PDF pages. Extract and return text from one or more pages in a PDF file. Supports page ranges and individual page selection. Args: pdf_path (str): Path to the PDF file page_spec (str, optional): Page specification (0-based or 1-based ranges) Returns: Extracted text from specified pages Examples: extract_pdf_pages('document.pdf', '0-4') # Extract pages 0-4 extract_pdf_pages('document.pdf', '1-5') # Extract pages 1-5 (1-based)
Filter files using fuzzy matching (powered by fzf - fuzzy finder). PURPOSE: Find files with partial/fuzzy names when exact patterns are unknown. FUZZY MATCHING: Uses fzf's fuzzy matching (NOT regex!). Args: filter (str): Fuzzy search pattern. Spaces separate AND patterns. path (str, optional): Directory to search in. Defaults to current dir. limit (int, optional): Maximum number of results to return. Default 0 (no limit). flags (str, optional): Extra flags for fd (e.g., '--hidden' for hidden files). Examples: filter='mainpy' - Finds 'main.py', 'main_py.txt', etc. filter='config json' - Finds files with 'config' AND 'json' filter='test py$' - Finds test files ending with '.py'
Search file contents with ripgrep, then apply fuzzy filtering to the results. Combines ripgrep's powerful content search with fzf's fuzzy filtering. Supports both path+content and content-only matching modes. Args: fuzzy_filter (str): Fuzzy search pattern (NOT regex) path (str, optional): Directory to search in. Defaults to '.'. limit (int, optional): Maximum number of results. Default 20. rg_flags (str, optional): Additional ripgrep flags. content_only (bool, optional): Match only content, not paths. Default False. multiline (bool, optional): Enable multiline search. Default False. Returns: List of matching lines with file paths Examples: fuzzy_search_content('update config', path='src/', rg_flags='-t py') # Find update and config in Python files fuzzy_search_content('className', content_only=True) # Find className only in content
Search PDF documents by content using ripgrep and fzf. Extract and search text from PDF files, applying fuzzy filtering to find matching pages. Requires PyMuPDF (fitz) to be installed. Args: fuzzy_filter (str): Fuzzy search pattern (NOT regex) path (str, optional): Directory to search for PDFs. Defaults to '.'. limit (int, optional): Maximum number of results. Default 20. recursive (bool, optional): Search recursively. Default True. Returns: List of matching PDF pages with content excerpts Examples: fuzzy_search_documents('invoice total') # Find pages mentioning invoice and total fuzzy_search_documents('copyright 2024', path='./docs/') # Search in docs directory
Search for file paths using fuzzy matching. Fuzzy search through file paths using fzf's powerful fuzzy matching algorithm. Supports space-separated AND patterns and fzf's extended search syntax. Args: fuzzy_filter (str): Fuzzy search pattern (NOT regex) path (str, optional): Directory to search in. Defaults to '.'. limit (int, optional): Maximum number of results. Default 20. hidden (bool, optional): Include hidden files. Default False. rg_flags (str, optional): Additional ripgrep flags. Returns: List of matching file paths Examples: fuzzy_search_files('Modal tsx$') # Find React Modal components fuzzy_search_files('config json') # Find config files with json in path
Get the outline/table of contents from a PDF document. Extract the document structure (outline/TOC) from a PDF file. Useful for understanding document organization before searching. Args: pdf_path (str): Path to the PDF file Returns: Hierarchical outline of the document Examples: get_pdf_outline('book.pdf') # Get table of contents get_pdf_outline('/path/to/document.pdf') # Get outline structure
List all tables in the SQLite database. Args: db_path (str, optional): Path to the database file. Uses default if not provided. Returns: List of table names in the database Examples: list_tables() # Uses default db_path list_tables('myapp.db') # Specific database file list_tables('/path/to/database.db') # Absolute path list_tables(':memory:') # List tables in in-memory database
Execute a SELECT query on the SQLite database. Args: query (str): The SELECT query to execute db_path (str, optional): Path to the database file. Uses default if not provided. Returns: List of dictionaries representing rows, or error message Examples: query('SELECT * FROM users') # Uses default db_path query('SELECT * FROM users', 'myapp.db') # Specific database query('SELECT * FROM users', '/path/to/data.db') # Absolute path query('SELECT * FROM users', ':memory:') # In-memory database query('SELECT name, email FROM users WHERE active = 1', 'users.db') query('SELECT COUNT(*) as count FROM orders', 'sales.db')
Search for files using patterns (powered by fd - a fast file finder). PURPOSE: Find files when you know exact patterns, extensions, or regex. NOT FUZZY: This uses exact pattern matching, not fuzzy search. Args: pattern (str): Regex or glob pattern to match filenames. Required. path (str, optional): Directory to search in. Defaults to current dir. limit (int, optional): Maximum number of results to return. Default 0 (no limit). flags (str, optional): Extra flags for fd (e.g., '--hidden' for hidden files). Examples: pattern='\.py$' - Find all Python files pattern='test_.*\.js$' - Find JavaScript test files pattern='config' - Find files with 'config' in the name
Search for multiline patterns in files (powered by ripgrep). PURPOSE: Find complex patterns spanning multiple lines. USES REGEX: This supports full regex patterns (unlike filter_files). Args: pattern (str): Regex pattern to match. Required. path (str, optional): Directory to search in. Defaults to current dir. limit (int, optional): Maximum number of results to return. Default 0 (no limit). flags (str, optional): Extra flags for ripgrep. Examples: pattern='def.*?return' - Find function definitions with returns pattern='class.*?__init__' - Find class definitions with __init__
Record one step in an iterative thinking process. Allows a model to record an evolving chain of thoughts, branch off to explore alternatives, revise earlier steps, and adjust the planned thought count on the fly. The server keeps the running history in memory for the lifetime of the process. Args: thought (str): The thought content to record thoughtNumber (int): Current thought number in sequence totalThoughts (int): Total planned thoughts isRevision (bool, optional): Whether this revises an earlier thought. Default False. revisesThought (int, optional): Which thought number this revises (if isRevision=True) branchFromThought (int, optional): Which thought this branches from (if creating a branch) branchId (str, optional): Identifier for this branch Returns: Confirmation of recorded thought and current history Examples: sequentialthinking('First step', 1, 5) # Record first of 5 planned thoughts sequentialthinking('Better approach', 2, 5, isRevision=True, revisesThought=1) # Revise thought 1
No documented output schemas. Tools return results, but descriptions do not specify structure, field names, or types. This forces LLMs to infer and causes errors when chaining tools. Document: 'Returns array of {path: string, size: int, modified: ISO8601}'.
Parameter descriptions are minimal and generic (e.g., 'Defaults to current dir'). Add actionable constraints: min/max, format, when to use. E.g., 'path: Directory to search (defaults to current dir; relative or absolute paths accepted).'
Error handling is absent or minimal. Tools do not document what happens on failure (file not found, regex error, database connection failed) or what the LLM should do next. Add error classification and recovery guidance to each tool description.
sequentialthinking is poorly specified. Description lacks context: what is this for? When should an LLM use it? Parameters like 'branchFromThought', 'branchId', and 'revisesThought' are vague. Revisit design: is this a logging tool, a multi-path planner, or an internal state mechanism? Document the intent and expected usage pattern.
Database tools (query, execute, create_table) lack permission gating and audit guidance. These are write-capable tools, descriptions should clarify what permissions are required and recommend logging/audit trails for compliance.
db_path parameter (in database tools) has no format validation or constraints. Can an LLM pass arbitrary paths? Should it be restricted? Add constraint: 'Relative paths are resolved from CWD; absolute paths must be within [allowed_dir].'
No documented limits on query result size or statement execution time. Tools should declare: 'Returns max 100 rows; queries taking >5s will timeout.' Without this, runaway queries can consume resources and hang agents.