Skip to main content
Glama
GongRzhe

Office Word MCP Server

find_text_in_document

Locate specific text in Microsoft Word documents by searching with customizable options like case sensitivity and whole word matching.

Instructions

Find occurrences of specific text in a Word document.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
filenameYes
text_to_findYes
match_caseNo
whole_wordNo

Implementation Reference

  • Registers the 'find_text_in_document' tool using FastMCP's @mcp.tool() decorator. This wrapper function delegates execution to the implementation in extended_document_tools.
    @mcp.tool()
    def find_text_in_document(filename: str, text_to_find: str, match_case: bool = True,
                             whole_word: bool = False):
        """Find occurrences of specific text in a Word document."""
        return extended_document_tools.find_text_in_document(
            filename, text_to_find, match_case, whole_word
        )
  • Main handler function that performs input validation, ensures DOCX extension, calls the core find_text utility, formats results as JSON, and handles errors.
    async def find_text_in_document(filename: str, text_to_find: str, match_case: bool = True, whole_word: bool = False) -> str:
        """Find occurrences of specific text in a Word document.
        
        Args:
            filename: Path to the Word document
            text_to_find: Text to search for in the document
            match_case: Whether to match case (True) or ignore case (False)
            whole_word: Whether to match whole words only (True) or substrings (False)
        """
        filename = ensure_docx_extension(filename)
        
        if not os.path.exists(filename):
            return f"Document {filename} does not exist"
        
        if not text_to_find:
            return "Search text cannot be empty"
        
        try:
            
            result = find_text(filename, text_to_find, match_case, whole_word)
            return json.dumps(result, indent=2)
        except Exception as e:
            return f"Failed to search for text: {str(e)}"
  • Core helper function implementing the text search logic. Searches paragraphs and table cells, supports case-sensitive/insensitive and whole-word/substring matching, collects detailed occurrence information.
    def find_text(doc_path: str, text_to_find: str, match_case: bool = True, whole_word: bool = False) -> Dict[str, Any]:
        """
        Find all occurrences of specific text in a Word document.
        
        Args:
            doc_path: Path to the Word document
            text_to_find: Text to search for
            match_case: Whether to perform case-sensitive search
            whole_word: Whether to match whole words only
        
        Returns:
            Dictionary with search results
        """
        import os
        if not os.path.exists(doc_path):
            return {"error": f"Document {doc_path} does not exist"}
        
        if not text_to_find:
            return {"error": "Search text cannot be empty"}
        
        try:
            doc = Document(doc_path)
            results = {
                "query": text_to_find,
                "match_case": match_case,
                "whole_word": whole_word,
                "occurrences": [],
                "total_count": 0
            }
            
            # Search in paragraphs
            for i, para in enumerate(doc.paragraphs):
                # Prepare text for comparison
                para_text = para.text
                search_text = text_to_find
                
                if not match_case:
                    para_text = para_text.lower()
                    search_text = search_text.lower()
                
                # Find all occurrences (simple implementation)
                start_pos = 0
                while True:
                    if whole_word:
                        # For whole word search, we need to check word boundaries
                        words = para_text.split()
                        found = False
                        for word_idx, word in enumerate(words):
                            if (word == search_text or 
                                (not match_case and word.lower() == search_text.lower())):
                                results["occurrences"].append({
                                    "paragraph_index": i,
                                    "position": word_idx,
                                    "context": para.text[:100] + ("..." if len(para.text) > 100 else "")
                                })
                                results["total_count"] += 1
                                found = True
                        
                        # Break after checking all words
                        break
                    else:
                        # For substring search
                        pos = para_text.find(search_text, start_pos)
                        if pos == -1:
                            break
                        
                        results["occurrences"].append({
                            "paragraph_index": i,
                            "position": pos,
                            "context": para.text[:100] + ("..." if len(para.text) > 100 else "")
                        })
                        results["total_count"] += 1
                        start_pos = pos + len(search_text)
            
            # Search in tables
            for table_idx, table in enumerate(doc.tables):
                for row_idx, row in enumerate(table.rows):
                    for col_idx, cell in enumerate(row.cells):
                        for para_idx, para in enumerate(cell.paragraphs):
                            # Prepare text for comparison
                            para_text = para.text
                            search_text = text_to_find
                            
                            if not match_case:
                                para_text = para_text.lower()
                                search_text = search_text.lower()
                            
                            # Find all occurrences (simple implementation)
                            start_pos = 0
                            while True:
                                if whole_word:
                                    # For whole word search, check word boundaries
                                    words = para_text.split()
                                    found = False
                                    for word_idx, word in enumerate(words):
                                        if (word == search_text or 
                                            (not match_case and word.lower() == search_text.lower())):
                                            results["occurrences"].append({
                                                "location": f"Table {table_idx}, Row {row_idx}, Column {col_idx}",
                                                "position": word_idx,
                                                "context": para.text[:100] + ("..." if len(para.text) > 100 else "")
                                            })
                                            results["total_count"] += 1
                                            found = True
                                    
                                    # Break after checking all words
                                    break
                                else:
                                    # For substring search
                                    pos = para_text.find(search_text, start_pos)
                                    if pos == -1:
                                        break
                                    
                                    results["occurrences"].append({
                                        "location": f"Table {table_idx}, Row {row_idx}, Column {col_idx}",
                                        "position": pos,
                                        "context": para.text[:100] + ("..." if len(para.text) > 100 else "")
                                    })
                                    results["total_count"] += 1
                                    start_pos = pos + len(search_text)
            
            return results
        except Exception as e:
            return {"error": f"Failed to search for text: {str(e)}"}

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/GongRzhe/Office-Word-MCP-Server'

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