DotNetSearch — MCP-сервер для поиска и работы с PDF
Идентификатор MCP-сервера:
mcp-name: io.github.puneethdc99/dotnetsearch(Подтверждение владения пакетом для включения в GitHub MCP Registry)
DotNetSearch — автономный MCP-сервер (Model Context Protocol), который предоставляет GitHub Copilot, Claude, Cursor и другим AI-агентам высокопроизводительный поиск по кодовой базе, декомпиляцию пакетов NuGet, сокращение объёма пробельных символов и глубокое чтение и анализ PDF-документов:
Обзор основных инструментов
| Категория | Инструмент | Назначение |
|---|---|---|
| Поиск по коду | search | Находит файлы и строки по ключевому слову или запросу на естественном языке. Возвращает только совпавшие строки (около 110 токенов вместо примерно 2500 при чтении полного файла) |
| Поиск по коду | search_related | Находит фрагменты кода, структурно похожие на указанный участок. Подходит для поиска вызывающего кода, реализаций и шаблонов |
| Декомпиляция | decompile_type | Декомпилирует любой тип .NET из сборок подключённых пакетов NuGet. Возвращает полное определение класса C# без исходного кода |
| Оптимизация | compress_code | Сокращает отступы в коде C# с 4 до 1 пробела на каждый уровень вложенности и удаляет пустые строки. Экономит 10–20% токенов без изменения семантики |
| Чтение файлов | read_file | Читает файл с диска и при необходимости возвращает заданный диапазон строк. Удобно использовать после search, если нужен полный контекст файла |
| Чтение PDF | read_pdf_text | Извлекает чистый структурированный текст из PDF постранично или в заданном диапазоне страниц |
| Чтение PDF | get_pdf_info | Получает метаданные PDF, общее количество страниц, размеры отдельных страниц, автора, тему, дату создания и сведения о структуре |
| Визуальное содержимое PDF | render_pdf_page_as_image | Преобразует страницу PDF в изображение PNG высокого разрешения с заданным DPI. Подходит для просмотра диаграмм, схем, таблиц и отсканированных документов |
| Визуальное содержимое PDF | extract_pdf_images | Извлекает встроенные растровые изображения со страниц PDF и сохраняет их на диск вместе с координатами в пикселях |
| Структура PDF | get_pdf_bookmarks | Извлекает иерархическое оглавление, закладки и структуру документа со ссылками на целевые страницы |
| Формы PDF | get_pdf_form_fields | Читает интерактивные поля форм AcroForm (текстовые поля, флажки, переключатели и раскрывающиеся списки) и их значения |
| Вложения PDF | extract_pdf_attachments | Извлекает вложенные файлы из PDF-документов и сохраняет их на диск |
| Ссылки в PDF | get_pdf_hyperlinks | Извлекает все кликабельные веб-URL, ссылки на страницы внутри документа и ссылки на внешние документы, включая координаты ограничивающих рамок |
Вместо полных файлов (около 2500 токенов каждый) агент получает только совпавшие строки (около 110 токенов), экономя до 98% контекстного окна на каждом запросе. Если файл нужно прочитать целиком, сначала используйте compress_code: он удалит лишние пробелы и поможет дополнительно сэкономить 10–20% токенов. Для PDF-документации, технических руководств и спецификаций специальные инструменты извлекают нужный текст, изображения и таблицы, не перегружая контекстное окно модели.
Шаг 1 — Установка
Вариант A: установка через .NET CLI (инструмент NuGet)
Если у вас установлен .NET SDK (рекомендуется для разработчиков .NET):
dotnet tool install -g PuneethDC.DotNetSearch
После установки команда dotnetsearch будет доступна в любом терминале.
Чтобы в дальнейшем обновить инструмент до последней версии:
dotnet tool update -g PuneethDC.DotNetSearch
Вариант B: загрузка автономного исполняемого файла (без .NET)
Перейдите на страницу последнего выпуска и загрузите автономный исполняемый файл для своей платформы:
| Платформа | Файл для загрузки |
|---|---|
| Windows x64 | DotNetSearch-win-x64.exe |
| Linux x64 | DotNetSearch-linux-x64 |
| macOS ARM64 | DotNetSearch-osx-arm64 |
Устанавливать .NET не нужно. Среда выполнения уже включена в исполняемый файл.
Сохраните файл в постоянном расположении, например:
-
Windows:
C:\Tools\DotNetSearch.exe -
Linux/macOS:
/usr/local/bin/DotNetSearch
В Linux/macOS предоставьте файлу права на выполнение:
chmod +x /usr/local/bin/DotNetSearch
Шаг 2 — Добавление в конфигурацию MCP
Откройте или создайте глобальный файл конфигурации MCP:
| Клиент | Расположение файла конфигурации |
|---|---|
| Visual Studio | %USERPROFILE%\.mcp.json |
| VS Code + Copilot | %USERPROFILE%\.mcp.json |
| Claude Desktop | %APPDATA%\Claude\claude_desktop_config.json |
| Cursor | %USERPROFILE%\.cursor\mcp.json |
При установке через NuGet (.NET Tool):
Конфигурация работает одинаково в Windows, Linux и macOS, независимо от расположения файла:
{
"servers": {
"DotNetSearch": {
"type": "stdio",
"command": "dotnetsearch"
}
}
}
При использовании автономного исполняемого файла:
Windows:
{
"servers": {
"DotNetSearch": {
"type": "stdio",
"command": "C:\\Tools\\DotNetSearch.exe"
}
}
}
Linux / macOS:
{
"servers": {
"DotNetSearch": {
"type": "stdio",
"command": "/usr/local/bin/DotNetSearch"
}
}
}
Альтернатива: запуск по требованию через dnx (без установки):
{
"servers": {
"DotNetSearch": {
"type": "stdio",
"command": "dnx",
"args": ["PuneethDC.DotNetSearch"]
}
}
}
Если в файле уже настроены другие серверы, просто добавьте блок "DotNetSearch" в существующий объект "servers".
Шаг 3 — Проверка работы сервера
Visual Studio / VS Code:
-
Откройте GitHub Copilot Chat
-
Переключитесь в режим Agent Mode
-
Нажмите значок гаечного ключа / Select Tools
-
Убедитесь, что инструменты DotNetSearch появились в списке и включены:
-
Код и навигация:
search,search_related,decompile_type,compress_code,read_file -
Просмотр PDF-документов:
read_pdf_text,get_pdf_info,render_pdf_page_as_image,extract_pdf_images,get_pdf_bookmarks,get_pdf_form_fields,extract_pdf_attachments,get_pdf_hyperlinks
-
Шаг 4 — Обновление инструкций Copilot
Чтобы Copilot автоматически отдавал предпочтение DotNetSearch перед встроенным чтением файлов, добавьте приведённые ниже инструкции в файл инструкций Copilot. Их можно разместить в одном из двух мест: на уровне репозитория (действуют только для этого репозитория) или глобально (действуют для всех репозиториев).
Вариант A — инструкции на уровне репозитория (рекомендуется)
Расположение файла:
.github\copilot-instructions.md">
<your-repo-root>\.github\copilot-instructions.md
GitHub Copilot читает этот файл при каждом разговоре в соответствующем репозитории. Рекомендуется использовать этот вариант, если нужно, чтобы DotNetSearch применялся в первую очередь только для конкретного проекта.
Как найти или создать файл:
-
Перейдите в корневую папку репозитория
-
Найдите папку
.github; если её нет, создайте её -
В папке
.githubнайдите файлcopilot-instructions.md; если его нет, создайте его
Вариант B — глобальные инструкции (действуют для всех репозиториев)
Расположение файла глобальных инструкций:
| Клиент | Файл глобальных инструкций |
|---|---|
| Visual Studio | %APPDATA%\Microsoft\VisualStudio\Copilot\copilot-instructions.md |
| VS Code + Copilot | %USERPROFILE%\.github\copilot-instructions.md |
Как найти или создать файл:
-
Откройте указанный выше путь в File Explorer (вставьте его в адресную строку)
-
Если папки нет, создайте её
-
Если в папке нет файла
copilot-instructions.md, создайте его
Примечание: Если добавить инструкции в оба файла, Copilot объединит их — одновременно будут действовать оба набора инструкций.
Инструкции для добавления
Вставьте следующий текст в выбранный выше файл:
## Search Preference
When searching for code, symbols, or text in this repository, always prefer
the `DotNetSearch` MCP tool (`search` and `search_related`) over reading full
files or using built-in workspace search. DotNetSearch returns only matching
lines and is significantly more token-efficient (~98% fewer tokens per query).
Do not call DotNetSearch tools in parallel — run one search at a time.
## PDF Document Reading
When reading, analyzing, or searching PDF documents:
- Always prefer `read_pdf_text` and `get_pdf_info` over raw file operations.
- First call `get_pdf_info` to inspect total pages and document metadata.
- Call `read_pdf_text` with specific page ranges (`startPage`, `endPage`) to avoid token overflow.
- If the PDF contains visual charts, flowcharts, architectural diagrams, or scanned pages, use `render_pdf_page_as_image` to rasterize the page.
- For interactive PDF forms, use `get_pdf_form_fields` to extract user inputs.
## NuGet Type Inspection
When the user asks about a third-party or NuGet type and the source code is not
available in the workspace, use the `DotNetSearch` MCP tool `decompile_type` to
decompile the type from the project's referenced assemblies. Pass the short or
fully qualified type name and the absolute path to the .csproj file. The project
must have been built at least once before calling this tool.
## Code Compression
When reading source files to minimize context window usage, use the
`DotNetSearch` MCP tool `compress_code` — BUT ONLY for the following fully-safe
languages where indentation is cosmetic and braces/keywords define scope:
C#, Java, JavaScript, TypeScript, C, C++, Kotlin, Swift, Rust, Scala,
PHP, Ruby, CSS, SCSS, Less, JSON, XML
NEVER call `compress_code` on any other language. In particular, NEVER use it on
Python, YAML, CoffeeScript, Pug/Jade, HAML, or Makefile — these are
indentation-sensitive and compression WILL silently corrupt the file structure.
Before calling `compress_code`, check the file extension:
- Allowed: .cs .java .js .ts .jsx .tsx .kt .swift .rs .scala .php .rb .css .scss .less .json .xml .c .cpp .h
- Blocked: .py .yaml .yml .coffee .pug .jade .haml (and Makefiles with no extension)
Pass the absolute file path. For JavaScript/TypeScript projects using 2-space
indentation, set `sourceIndentSize=2`.
Шаг 5 — Готово
Специальные команды или изменения рабочего процесса не требуются. Продолжайте выполнять обычные задачи по разработке в Copilot Agent Mode — DotNetSearch будет автоматически использоваться, когда Copilot потребуется искать по кодовой базе или изучать PDF-документы.
Со временем вы заметите, что на каждый диалог расходуется меньше токенов. Это происходит потому, что DotNetSearch возвращает только совпадающие строки (обычно около 110 токенов), а не содержимое файлов целиком (около 2500 токенов). Это позволяет экономить до 98% контекстного окна при каждой операции поиска.
Справочник по инструментам
search
Ищет в локальном каталоге файлы, содержимое которых соответствует ключевому слову или запросу на естественном языке. Использует ранжирование BM25 и расширение токенов в CamelCase и snake_case.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
query | string | обязательный | Ключевое слово, идентификатор или фраза на естественном языке |
repo | string | обязательный | Абсолютный или относительный путь к каталогу для поиска |
top_k | int | 5 | Максимальное количество результатов (1–100) |
context_lines | int | 0 | Количество строк контекста до и после каждого совпадения (0–5) |
search_related
Находит фрагменты кода, структурно похожие на указанный участок файла. Используйте этот инструмент после search, чтобы изучить связанные реализации, вызывающий код или шаблоны.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
file_path | string | обязательный | Путь к файлу, указанный в предыдущем результате search |
line | int | обязательный | Номер строки (индексация с 1) из предыдущего результата search |
repo | string | обязательный | Абсолютный или относительный путь к каталогу для поиска |
top_k | int | 5 | Количество похожих фрагментов (1–100) |
read_file
Читает текстовый файл с диска и возвращает его содержимое. Используйте этот инструмент после search, когда нужный файл уже найден и требуется получить контекст целиком. Поддерживает абсолютные и относительные пути, а также необязательные аргументы start_line и end_line, задающие диапазон строк.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
path | string | обязательный | Абсолютный или относительный путь к файлу для чтения |
start_line | int | 1 | Номер первой строки для чтения (индексация с 1) |
end_line | int | 0 | Номер последней строки для чтения (0 = до конца файла) |
read_pdf_text
Извлекает из PDF чистый, отформатированный текст с указанием страниц. Подходит для документации, технических спецификаций, статей и руководств по архитектуре. Поддерживает извлечение всего документа или заданного диапазона страниц.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
path | string | обязательный | Абсолютный или относительный путь к PDF-файлу |
startPage | int | 1 | Номер первой страницы для извлечения (индексация с 1) |
endPage | int | 0 | Номер последней страницы для извлечения (0 = до конца документа) |
get_pdf_info
Получает подробные метаданные и сведения о физическом макете PDF-файла, не извлекая весь его текст. Используйте этот инструмент в первую очередь, чтобы спланировать извлечение нужных страниц.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
path | string | обязательный | Абсолютный или относительный путь к PDF-файлу |
Возвращает: общее количество страниц, размеры каждой страницы (widthPt, heightPt), название документа, автора, тему, ключевые слова, создателя, производителя, дату создания и дату изменения.
render_pdf_page_as_image
Преобразует указанную страницу PDF в изображение PNG высокого разрешения и сохраняет его на диск. Инструмент необходим для страниц со сложными графическими схемами, архитектурными диаграммами, чертежами, таблицами или отсканированными документами, текстового извлечения из которых недостаточно.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
path | string | обязательный | Абсолютный или относительный путь к PDF-файлу |
pageNumber | int | 1 | Номер страницы для преобразования (индексация с 1) |
dpi | int | 150 | Разрешение преобразования в DPI (например, 72 — черновое, 150 — стандартное, 300 — для печати или высокого разрешения) |
Возвращает: путь к созданному изображению .png и размеры изображения в пикселях.
extract_pdf_images
Извлекает все встроенные растровые изображения (например, фотографии, диаграммы, встроенные изображения JPEG/PNG) с указанной страницы PDF и сохраняет их непосредственно на диск.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
path | string | обязательный | Абсолютный или относительный путь к PDF-файлу |
pageNumber | int | 0 | Номер страницы (индексация с 1; 0 = извлечь изображения со всех страниц) |
outputDirectory | string | null | Каталог для сохранения изображений (по умолчанию /_images/) |
get_pdf_bookmarks
Извлекает иерархическую структуру закладок PDF (дерево содержания). Помогает агентам понять структуру всего документа, прежде чем запрашивать конкретные главы или страницы.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
path | string | обязательный | Абсолютный или относительный путь к PDF-файлу |
Возвращает: рекурсивное дерево закладок с названиями и номерами страниц, на которые они ведут.
get_pdf_form_fields
Читает все интерактивные поля форм AcroForm, встроенные в PDF-документ.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
path | string | обязательный | Абсолютный или относительный путь к PDF-файлу |
Возвращает: список полей формы с их именами, типами (текстовое поле, флажок, раскрывающийся список, переключатель) и текущими значениями.
extract_pdf_attachments
Извлекает файлы, непосредственно вложенные в каталог PDF (например, исходный код, примеры данных, схемы или сопутствующие файлы), и сохраняет их на диск.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
path | string | обязательный | Абсолютный или относительный путь к PDF-файлу |
outputDirectory | string | null | Каталог для сохранения извлечённых вложений |
get_pdf_hyperlinks
Извлекает все гиперссылки и кликабельные аннотации на страницах PDF.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
path | string | обязательный | Абсолютный или относительный путь к PDF-файлу |
pageNumber | int | 0 | Номер страницы (индексация с 1; 0 = извлечь ссылки со всех страниц) |
Возвращает: URL-адреса, переходы на страницы документа и координаты области каждой гиперссылки.
decompile_type
Декомпилирует тип .NET (класс, интерфейс, перечисление, структуру или делегат) из сборок NuGet-пакетов, на которые ссылается проект .NET. Инструмент полезен, когда нужно изучить сторонние API без исходного кода.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
typeName | string | обязательно | Короткое имя (Session) или полное имя с пространством имён (Opc.Ua.Client.Session) |
projectPath | string | обязательно | Абсолютный путь к файлу .csproj, в котором указан NuGet-пакет |
maxResults | int | 1 | Максимальное количество результатов, если такое имя встречается в нескольких сборках |
Примечание: Проект необходимо хотя бы один раз собрать, чтобы в папке
bin\появились сборки NuGet.
compress_code
Уменьшает отступы в коде с 4 пробелов (или заданного значения) до 1 пробела на уровень вложенности и удаляет пустые строки. Позволяет сократить количество токенов на 10–20% без изменения смысла. Такой способ безопасен для языков с блочной областью видимости и языков, использующих ключевые слова для обозначения блоков, где отступы служат лишь для форматирования. Принимает абсолютный путь к файлу или исходный код в виде строки. Возвращает сжатый код и метрики: originalLength, compressedLength, savingsPercent и количество строк до и после обработки.
✅ Безопасно для языков с блочной областью видимости и языков, использующих ключевые слова для обозначения блоков:
C#, Java, JavaScript, TypeScript, C, C++, Kotlin, Swift, Rust, Scala, PHP, Ruby, CSS, SCSS, Less, JSON, XML
❌ Не используйте для языков, чувствительных к отступам: код будет повреждён.
Python, YAML, CoffeeScript, Pug/Jade, HAML, Makefile
⚠️ С оговорками:
-
Go — безопасно для чтения LLM; язык использует табуляцию, поэтому задайте
sourceIndentSize=4(ширина табуляции). Для компиляции после преобразования потребуетсяgofmt. -
Markdown — не рекомендуется: согласно спецификации Markdown отступ в 4 пробела обозначает блок кода.
-
JavaScript/TypeScript — для проектов с отступами в 2 пробела задайте
sourceIndentSize=2. -
Многострочные строковые литералы (verbatim-строки C#,
"""в Java, шаблонные литералы JS) — внутренние пробелы в них тоже будут сокращены. Код останется читаемым для LLM, но обратное преобразование не будет безопасным для строк, в которых важно точное форматирование отступов.
| Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
filePath | string | null | Абсолютный путь к исходному файлу для сжатия. Укажите либо этот параметр, либо code. |
code | string | null | Исходный код для сжатия в виде строки. Используется, если не указан filePath. |
sourceIndentSize | int | 4 | Количество пробелов, соответствующее одному уровню отступа в исходном коде. Для проектов на JS/TS/Ruby/Scala задайте 2. |
targetIndentSize | int | 1 | Количество пробелов на уровень отступа в результирующем коде. |
Поддерживаемые типы файлов
.pdf .cs .ts .js .jsx .tsx .json .md .txt .xml .yaml .yml .html .css .py .java .cpp .c .h .go .rs .sh .ps1 .psm1 .psd1 .toml .ini .env .config .csproj .props .targets .razor .vue .svelte
Лицензия
MIT — подробности см. в файле LICENSE.