{"id":28794160,"url":"https://github.com/codybrom/docsetmcp","last_synced_at":"2026-04-21T16:38:01.128Z","repository":{"id":299169081,"uuid":"1002268766","full_name":"codybrom/DocsetMCP","owner":"codybrom","description":"Model Context Protocol server for Dash-style docsets","archived":false,"fork":false,"pushed_at":"2025-06-16T00:17:59.000Z","size":120,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-16T00:40:35.014Z","etag":null,"topics":["dash","docset","macos","mcp-server"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codybrom.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-15T04:57:08.000Z","updated_at":"2025-06-16T00:18:02.000Z","dependencies_parsed_at":"2025-06-16T00:40:44.841Z","dependency_job_id":"3a7ce68f-0bb2-4343-8b58-a8ed24b77ac2","html_url":"https://github.com/codybrom/DocsetMCP","commit_stats":null,"previous_names":["codybrom/dashmcp","codybrom/docsetmcp"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/codybrom/DocsetMCP","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codybrom%2FDocsetMCP","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codybrom%2FDocsetMCP/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codybrom%2FDocsetMCP/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codybrom%2FDocsetMCP/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codybrom","download_url":"https://codeload.github.com/codybrom/DocsetMCP/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codybrom%2FDocsetMCP/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260471627,"owners_count":23014254,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dash","docset","macos","mcp-server"],"created_at":"2025-06-18T02:04:54.617Z","updated_at":"2026-04-21T16:38:01.117Z","avatar_url":"https://github.com/codybrom.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DocsetMCP\n\n[![PyPI](https://img.shields.io/pypi/v/docsetmcp)](https://pypi.org/project/docsetmcp/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Python](https://img.shields.io/pypi/pyversions/docsetmcp)](https://pypi.org/project/docsetmcp/)\n\n**Access your local Dash documentation directly from AI assistants** 🚀\n\nDocsetMCP is a Model Context Protocol (MCP) server that seamlessly integrates your local Dash docsets with AI assistants like Claude, enabling instant access to offline documentation without leaving your conversation.\n\n## 📋 Table of Contents\n\n- [Why DocsetMCP?](#why-docsetmcp)\n- [Quick Start](#quick-start)\n- [Features](#-features)\n- [Prerequisites](#prerequisites)\n- [Installation](#installation)\n- [Configuration](#configuration)\n- [Usage Examples](#usage-examples)\n- [Available Tools](#available-tools)\n- [Troubleshooting](#troubleshooting)\n- [Development](#development)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Why DocsetMCP?\n\n- 📚 **Instant Documentation**: No switching, no web searches. Get straight to the docs directly in your AI conversation\n- 🔒 **Local and Private**: Work with docset files on your machine\n- ⚡ **Lightning Fast**: Optimized caching and direct database queries\n- 🎯 **Precise Results**: Get exactly what you need with smart filtering\n\n## Quick Start\n\n```json\n{\n  \"mcpServers\": {\n    \"docsetmcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\"docsetmcp\"]\n    }\n  }\n}\n```\n\nAdd to your MCP config and restart your MCP client. Then try asking something like \"Find me the AppIntent documentation\"\n\n## ✨ Features\n\n### Documentation Search\n\n- **Multi-Docset Support**: Search across 165+ supported docsets including Apple, NodeJS, Python, and more\n- **Language Filtering**: Target specific programming languages within docsets\n- **Name-Based Search**: Only returns entries where search terms match item names for precise results\n- **Smart Ranking**: Results ranked by match type (exact \u003e prefix \u003e substring) and dynamic type ordering\n- **Container Guidance**: Framework and class entries show drilldown notes for exploring members\n\n### Cheatsheet Access\n\n- **Quick Reference**: Instant access to Git, Vim, Docker, and 40+ other cheatsheets\n- **Fuzzy Matching**: Find cheatsheets even with partial names\n- **Category Browsing**: Explore commands by category within each cheatsheet\n- **Search Within**: Query specific commands inside any cheatsheet\n\n### Performance \u0026 Integration\n\n- **Efficient Caching**: In-memory caching for repeated queries\n- **Direct Database Access**: No intermediate servers or APIs\n- **Universal**: Works with Claude Desktop, Cursor, VS Code, and any MCP-compatible client\n- **Framework Discovery**: List all available frameworks/types in any docset\n- **Container Guidance**: Automatic drilldown notes for frameworks and classes with members\n\n## 📦 Supported Docsets\n\nDocsetMCP supports 165+ docsets including:\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ePopular Languages\u003c/b\u003e\u003c/summary\u003e\n\n- Python (2 \u0026 3)\n- JavaScript / TypeScript\n- Java\n- C / C++\n- Go\n- Rust\n- Ruby\n- Swift / Objective-C\n- PHP\n- Bash\n- And many more...\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eWeb Frameworks\u003c/b\u003e\u003c/summary\u003e\n\n- React / Angular / Vue\n- Node.js / Express\n- Django / Flask\n- Ruby on Rails\n- Bootstrap\n- jQuery\n- And many more...\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDeveloper Tools\u003c/b\u003e\u003c/summary\u003e\n\n- Git (cheatsheet)\n- Docker (cheatsheet)\n- Vim (cheatsheet)\n- MySQL / PostgreSQL\n- MongoDB / Redis\n- nginx / Apache\n- And many more...\n\n\u003c/details\u003e\n\nUse `list_available_docsets` to see all docsets installed on your system.\n\n## Prerequisites\n\n- macOS (Dash is Mac-only)\n- [Dash](https://kapeli.com/dash) with desired docsets downloaded\n- Python 3.10 or higher\n- UV package manager ([How to Install](https://docs.astral.sh/uv/getting-started/installation/))\n- An AI assistant that supports MCP (Claude Desktop, Claude Code CLI, Cursor IDE, etc.)\n\n## Configuration\n\n### Custom Docset Locations\n\nBy default, DocsetMCP looks for docsets in Dash's standard directories:\n\n- **Docsets**: `~/Library/Application Support/Dash/DocSets`\n- **Cheatsheets**: `~/Library/Application Support/Dash/Cheat Sheets`\n\nYou can customize these locations using:\n\n#### Environment Variables\n\n```bash\n# Set custom docset directory\nexport DOCSET_PATH=\"/path/to/your/docsets\"\n\n# Set custom cheatsheet directory  \nexport CHEATSHEET_PATH=\"/path/to/your/cheatsheets\"\n\n# Run with custom paths\ndocsetmcp\n```\n\n#### Command Line Arguments\n\n```bash\n# Test with custom docset path\ndocsetmcp --docset-path \"/path/to/your/docsets\" --list-docsets\n\n# Test with custom cheatsheet path\ndocsetmcp --cheatsheet-path \"/path/to/your/cheatsheets\" --test-connection\n\n# Use both custom paths\ndocsetmcp --docset-path \"/custom/docsets\" --cheatsheet-path \"/custom/cheatsheets\"\n\n# Use additional search paths (searches multiple locations)\ndocsetmcp --additional-docset-paths \"/extra/docsets\" \"/more/docsets\"\ndocsetmcp --additional-cheatsheet-paths \"/extra/cheatsheets\" \"/more/cheatsheets\"\n```\n\n**Priority Order:**\n\n1. CLI arguments (highest priority)\n2. Environment variables  \n3. Default Dash locations (lowest priority)\n\n**Additional Search Paths:**\n\nThe `--additional-docset-paths` and `--additional-cheatsheet-paths` options allow DocsetMCP to search in multiple locations beyond the primary path. This is useful when:\n\n- You have docsets in multiple directories\n- You want to include third-party or custom docsets\n- You're sharing docsets across different tools\n\nDocsetMCP will automatically discover and configure docsets found in these additional paths.\n\n### MCP Client Setup\n\nChoose your MCP client below for specific setup instructions:\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🤖 Claude Desktop\u003c/b\u003e\u003c/summary\u003e\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"docsetmcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\"docsetmcp\"]\n    }\n  }\n}\n```\n\n**For custom docset locations:**\n\n```json\n{\n  \"mcpServers\": {\n    \"docsetmcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\"docsetmcp\"],\n      \"env\": {\n        \"DOCSET_PATH\": \"/path/to/your/docsets\",\n        \"CHEATSHEET_PATH\": \"/path/to/your/cheatsheets\"\n      }\n    }\n  }\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e⌨️ Claude Code CLI\u003c/b\u003e\u003c/summary\u003e\n\n```bash\n# For current project\nclaude mcp add docsetmcp \"uvx docsetmcp\"\n\n# For all projects\nclaude mcp add --scope user docsetmcp \"uvx docsetmcp\"\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e📝 Cursor, VS Code, Windsurf and other MCP-compatible clients\u003c/b\u003e\u003c/summary\u003e\n\nAdd to your MCP configuration (Cursor: `.mcp/mcp.json` in your project root:\n\n```json\n{\n  \"mcpServers\": {\n    \"docsetmcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\"docsetmcp\"]\n    }\n  }\n}\n```\n\n**Note**: Restart your client and check your MCP settings for connection status.\n\n\u003c/details\u003e\n\n## Installation\n\n### No Installation Required (Recommended)\n\nIf your MCP client supports `uvx`, no installation is needed! The package will be automatically downloaded and run when needed. See the [Quick Start](#quick-start) or [Configuration](#configuration) sections.\n\n### Manual Installation\n\nIf you prefer to install locally or your MCP client doesn't support `uvx`:\n\n```bash\npip install docsetmcp\n```\n\nThen use `docsetmcp` instead of `uvx docsetmcp` in your configuration.\n\n### Development Installation\n\n1. **Clone and install**:\n\n   ```bash\n   git clone https://github.com/codybrom/docsetmcp.git\n   cd docsetmcp\n   pip install -e .\n   ```\n\n2. **Run tests** (optional):\n\n   ```bash\n   # Install test dependencies\n   pip install pytest pytest-cov pytest-xdist\n\n   # Run basic tests\n   pytest tests/test_docsets.py::TestDocsets::test_yaml_structure -v\n\n   # Run quick tests (structure + existence checks)\n   pytest tests/ -k \"yaml_structure or test_docset_exists\" -v\n\n   # Run full test suite (all docsets)\n   pytest tests/ -v\n\n   # Run with coverage\n   pytest tests/ --cov=docsetmcp --cov-report=html -v\n\n   # Validate all local cheatsheets work (integration test)\n   python scripts/validate_cheatsheets.py\n   ```\n\n## Usage Examples\n\nOnce configured, you can ask your AI assistant to search documentation naturally:\n\n### 🍎 iOS/macOS Development\n\n```text\n\"Search for URLSession documentation\"\n\"Show me how to use AppIntent in SwiftUI\"\n\"Find CarPlay framework documentation\"  # Returns framework + related entries with drilldown notes\n\"Search for CPListTemplate class\"       # Returns specific CarPlay class\n\"Find NSPredicate examples\"\n```\n\n### 🌐 Web Development\n\n```text\n\"Look up Express.js middleware documentation\"\n\"Search React hooks in the React docset\"\n\"Find CSS flexbox properties\"\n```\n\n### 🛠️ DevOps \u0026 Terminal\n\n```text\n\"Search git rebase commands in the Git cheatsheet\"\n\"Show Docker compose syntax from the cheatsheet\"\n\"Find bash array manipulation commands\"\n```\n\n### 📊 Data Science\n\n```text\n\"Search pandas DataFrame methods\"\n\"Look up NumPy array broadcasting\"\n\"Find matplotlib pyplot functions\"\n```\n\n### Advanced Usage\n\n```text\n# Search specific docset with language filter\n\"Use search_docs for 'URLSession' in the apple_api_reference docset with Swift language\"\n\n# Explore framework members using drilldown guidance\n\"Search for 'SwiftData' then follow the drilldown note to see all members\"\n\n# List all available tools\n\"What frameworks are available in the nodejs docset?\"\n\n# Browse cheatsheet categories\n\"Show all categories in the vim cheatsheet\"\n```\n\n## Discovery Workflow\n\nDocsetMCP is designed for **name-based searches**, not keyword searching. Follow this workflow:\n\n### 1. **Start with Discovery Tools**\n\n```text\n# Find what languages are available\n\"List all available programming languages\"\n\n# Find docsets for your language\n\"Show me all Python docsets\"\n\n# See what types are available in a docset\n\"List all types in the apple_api_reference docset for Swift\"\n\n# Browse entries by type with letter filters\n\"Show me all Classes starting with 'UI' in apple_api_reference for Swift\"\n```\n\n### 2. **Then Search by Exact Names**\n\n```text\n# Once you know exact names, search for them\n\"Search for UIViewController in apple_api_reference with Swift\"\n\"Find readFile documentation in nodejs docset\"\n\"Show me the CarPlay framework documentation\"\n```\n\n### 3. **Use Drilldown Notes**\n\nWhen you find container types (frameworks, classes), follow the drilldown guidance:\n\n```text\n# Container entry will show: \"contains 42 additional members - use search_docs('ContainerName', max_results=50)\"\n\"Search for SwiftData in apple_api_reference with max_results=50\"\n```\n\n## How It Works\n\n1. **Multi-Format Support**: Handles both Apple cache format and tarix compression\n2. **Direct Database Access**: Queries Dash's SQLite databases for fast lookups\n3. **Name-Based Matching**: Only returns entries where search terms match item names (no false positives)\n4. **Smart Ranking**: Prioritizes exact matches, then prefix matches, then substring matches\n5. **Dynamic Type Ordering**: Uses docset configuration files for intelligent result prioritization\n6. **Container Detection**: Automatically detects frameworks/classes with members and provides exploration guidance\n7. **Smart Extraction**: Decompresses Apple's DocC JSON or extracts HTML from tarix archives\n8. **Markdown Formatting**: Converts documentation to readable Markdown\n\n## Available Tools\n\nDocsetMCP provides eleven powerful tools for accessing your documentation:\n\n### 🔍 `search_docs`\n\nSearch and extract documentation from any docset.\n\n| Parameter | Type | Description | Default |\n|-----------|------|-------------|---------|\n| `query` | string | **Exact name** to search (not keywords) | *required* |\n| `docset` | string | Target docset (e.g., 'nodejs', 'python_3') | *required* |\n| `language` | string | Programming language filter | docset default |\n| `max_results` | int | Number of results (1-10) | 3 |\n\n### 📋 `search_cheatsheet`\n\nSearch Dash cheatsheets for quick command reference.\n\n| Parameter | Type | Description | Default |\n|-----------|------|-------------|---------|\n| `cheatsheet` | string | Cheatsheet name (e.g., 'git', 'vim') | *required* |\n| `query` | string | Search within cheatsheet | - |\n| `category` | string | Filter by category | - |\n| `max_results` | int | Number of results (1-50) | 10 |\n\n### 📚 `list_available_docsets`\n\nList all installed Dash docsets with their supported languages.\n\n### 📝 `list_available_cheatsheets`\n\nList all available Dash cheatsheets that can be searched.\n\n### 🏗️ `list_frameworks`\n\nList frameworks/types within a specific docset.\n\n| Parameter | Type | Description | Default |\n|-----------|------|-------------|---------|\n| `docset` | string | Target docset | *required* |\n| `filter` | string | Filter framework names | - |\n\n### 🌍 `list_languages`\n\nDiscover all programming languages with available documentation.\n\n### 📖 `list_docsets_by_language`\n\nFind all docsets that support a specific programming language.\n\n| Parameter | Type | Description | Default |\n|-----------|------|-------------|---------|\n| `language` | string | Programming language | *required* |\n\n### 🏷️ `list_types`\n\nList all available types (Class, Protocol, Function, etc.) in a docset/language.\n\n| Parameter | Type | Description | Default |\n|-----------|------|-------------|---------|\n| `docset` | string | Target docset | *required* |\n| `language` | string | Programming language filter | - |\n\n### 📋 `list_entries`\n\nList entries filtered by type and optional name prefix.\n\n| Parameter | Type | Description | Default |\n|-----------|------|-------------|---------|\n| `docset` | string | Target docset | *required* |\n| `type_name` | string | Type to filter by (e.g., 'Class', 'Protocol') | *required* |\n| `language` | string | Programming language filter | - |\n| `name_filter` | string | Filter entries by name prefix | - |\n| `max_results` | int | Number of results (1-100) | 20 |\n\n### 📂 `list_cheatsheet_categories`\n\nList all categories within a specific cheatsheet.\n\n| Parameter | Type | Description | Default |\n|-----------|------|-------------|---------|\n| `cheatsheet` | string | Cheatsheet name | *required* |\n\n### 📄 `fetch_cheatsheet`\n\nFetch entire cheatsheet content (recommended for comprehensive access).\n\n| Parameter | Type | Description | Default |\n|-----------|------|-------------|---------|\n| `cheatsheet` | string | Cheatsheet name | *required* |\n\n## Troubleshooting\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e❌ \"Docset not found\" error\u003c/b\u003e\u003c/summary\u003e\n\nThis means the docset isn't installed in Dash. To fix:\n\n1. Open Dash.app\n2. Go to Preferences → Downloads\n3. Download the required docset\n4. Restart your MCP client\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🔌 MCP connection failed\u003c/b\u003e\u003c/summary\u003e\n\n1. **Check installation**: Run `pip show docsetmcp` to verify installation\n2. **Test manually**: Run `uvx docsetmcp` in terminal - you should see MCP output\n3. **Check logs**:\n   - Claude Desktop: Check Console.app for Claude logs\n   - Cursor: Check Output → MCP panel\n4. **Verify config path**: Ensure config file is in the correct location\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e📭 No results found\u003c/b\u003e\u003c/summary\u003e\n\n- The content might not be in your local Dash cache\n- Try searching with different terms or partial matches\n- Use `list_available_docsets` to verify the docset is loaded\n- Some docsets may use different naming conventions (e.g., 'fs' vs 'filesystem')\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e🐛 Other issues\u003c/b\u003e\u003c/summary\u003e\n\n1. **Python version**: Ensure you have Python 3.10 or higher\n2. **UV not found**: Install UV package manager from \u003chttps://docs.astral.sh/uv/\u003e\n3. **Permission denied**: Check file permissions on Dash docsets directory\n4. **Report bugs**: Open an issue at \u003chttps://github.com/codybrom/docsetmcp/issues\u003e\n\n\u003c/details\u003e\n\n## Development\n\n### Building from Source\n\n```bash\n# Clone the repository\ngit clone https://github.com/codybrom/docsetmcp.git\ncd docsetmcp\n\n# Install in development mode\npip install -e .\n\n# Install all development dependencies\npip install -r requirements.txt\n\n# Set up pre-commit hooks\npre-commit install\n```\n\n### Testing\n\n```bash\n# Run basic structure tests\npytest tests/test_docsets.py::TestDocsets::test_yaml_structure -v\n\n# Run quick tests (structure + existence)\npytest tests/ -k \"yaml_structure or test_docset_exists\" -v\n\n# Run full test suite (all docsets)\npytest tests/ -v\n\n# Run with coverage\npytest tests/ --cov=docsetmcp --cov-report=html -v\n\n# Run tests in parallel\npytest tests/ -n auto -v\n\n# Validate cheatsheets\npython scripts/validate_cheatsheets.py\n```\n\n### Code Quality\n\n```bash\n# Format Python code with Black\nblack docsetmcp/\n\n# Format YAML files with yamlfix\nyamlfix docsetmcp/docsets/*.yaml\n\n# Run all pre-commit hooks\npre-commit run --all-files\n\n# Run specific hook\npre-commit run yamlfix --all-files\n\n# Run spell check (cspell installed automatically during setup)\nnpm run spell\n```\n\n### CLI Commands\n\n```bash\n# Test version\ndocsetmcp --version\n\n# List available docsets\ndocsetmcp --list-docsets\n\n# Test server startup\ndocsetmcp --test-connection\n\n# Test with custom paths\ndocsetmcp --docset-path \"/custom/path\" --list-docsets\n```\n\n### Building Distribution\n\n```bash\n# Build package\npython setup.py sdist bdist_wheel\n\n# Install from source\npip install .\n```\n\n## Architecture\n\n### Core Components\n\n- **docsetmcp/server.py**: Main MCP server implementation using FastMCP. Contains the DashExtractor class that handles:\n  - Apple cache format (SHA-1 UUID-based with brotli compression)\n  - Tarix format (tar.gz archives)\n  - SQLite database queries for documentation lookup\n  - HTML to Markdown conversion\n\n- **docsetmcp/config_loader.py**: Configuration system that loads YAML configs for 165+ supported docsets. Provides smart defaults and handles both simple and complex configuration formats.\n\n- **docsetmcp/docsets/**: YAML configuration files for each supported docset, defining:\n  - Docset paths and formats\n  - Language variants and filters\n  - Type priorities for search results\n\n### Key Implementation Details\n\n1. **Multi-Format Support**: The server detects and handles both Apple's modern cache format (using SHA-1 based UUIDs) and the older tarix compression format automatically based on docset configuration.\n\n2. **Caching Strategy**: Extracted documentation is cached in memory (_fs_cache for Apple format, _html_cache for tarix) to improve performance on repeated queries.\n\n3. **Search Algorithm**: Uses SQLite case-insensitive LIKE queries on the optimizedIndex.dsidx database. Results are ranked by match type (exact \u003e prefix \u003e substring) and then by dynamic type ordering from docset configuration files. Only returns entries where the search term matches the item name.\n\n4. **Configuration Loading**: The ConfigLoader applies smart defaults, allowing minimal YAML configs while supporting complex overrides when needed.\n\n5. **Container Type Detection**: Framework, class, and module entries automatically include drilldown notes when they contain additional members, guiding users to search for more specific content.\n\n## Contributing\n\nWe welcome contributions! Here's how you can help:\n\n### Adding New Docset Support\n\n1. Create a YAML configuration in `docsetmcp/docsets/`:\n\n   ```yaml\n   # docsetmcp/docsets/my_docset.yaml\n   name: My Docset\n   description: Brief description of the docset\n   docset_path: My_Docset/My_Docset.docset\n   languages:\n     - python\n     - javascript\n   ```\n\n2. Test your configuration:\n\n   ```bash\n   pytest tests/test_docsets.py -k \"my_docset\" -v\n   ```\n\n3. Submit a pull request\n\n### Reporting Issues\n\n- 🐛 [Bug Reports](https://github.com/codybrom/docsetmcp/issues/new?labels=bug)\n- 💡 [Feature Requests](https://github.com/codybrom/docsetmcp/issues/new?labels=enhancement)\n- 📚 [Documentation Issues](https://github.com/codybrom/docsetmcp/issues/new?labels=documentation)\n\n### Development Guidelines\n\n- Follow PEP 8 style guidelines\n- Add tests for new features\n- Update documentation as needed\n- Keep commits focused and descriptive\n\n## Technical Architecture\n\nDocsetMCP leverages Dash's internal structure for efficient documentation access:\n\n- **Format Support**: Handles both Apple's modern cache format (SHA-1 UUID-based with brotli compression) and traditional tarix archives\n- **Caching Strategy**: In-memory caching for repeated queries\n- **Database Access**: Direct SQLite queries to Dash's optimized indexes\n- **Content Extraction**: Smart extraction with fallback strategies\n- **Type System**: Full type hints for better IDE support\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Acknowledgments\n\n- Thanks to [Kapeli](https://kapeli.com/) for creating Dash\n- Built on the [Model Context Protocol](https://modelcontextprotocol.io/) standard\n- Inspired by the MCP community and ecosystem\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodybrom%2Fdocsetmcp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodybrom%2Fdocsetmcp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodybrom%2Fdocsetmcp/lists"}