codebase-cartographer
Codebase Cartographer
MCP-сервер, который строит граф символов локального Python-репозитория на основе AST и выполняет проверяемые многофайловые рефакторинги в нём.
Большинство агентов кодинга рефакторят, ища строку и переписывая найденное. Такой подход не отличает вызов compute() от локальной переменной, которая случайно называется compute, и понятия не имеет, какие двенадцать файлов сломаются при переименовании. Этот сервер даёт модели настоящий индекс вместо этого: разрешённые по областям видимости ссылки, граф импортов и двухфазный протокол редактирования, который отказывается записывать то, что не может проверить.
Что он делает
Строит карту. Обходит репозиторий (учитывая .gitignore), разбирает каждый модуль и строит таблицу символов: функции, классы, методы и переменные уровня модуля, а также граф импортов между модулями.
Разрешает ссылки. Находит ссылки с помощью настоящего анализа областей видимости — цепочки LEGB, объявлений global и nonlocal, областей видимости генераторов, привязок walrus и правила, что тела классов невидимы для вложенных функций. Локальная переменная, затеняющая символ уровня модуля, не является ссылкой на него, и инструмент знает разницу.
Рефакторит. Переименовывает, перемещает и удаляет символы во всех файлах, которые их затрагивают — переписывая from x import y, import x + доступ к атрибуту x.y, псевдонимы as и записи __all__. Ничего не записывается, пока вы не примените план, для которого видели diff.
Related MCP server: MCP Python Code Navigation Server
Модель безопасности
Рефакторинг двухфазный, и первая фаза никогда не касается диска.
plan_rename_symbol/plan_move_symbol/plan_delete_symbolвозвращают идентификатор плана, unified diff и список предупреждений. Для каждого затронутого файла записывается хэш содержимого.apply_planповторно проверяет эти хэши (прерываясь, если что-то изменилось на диске с момента планирования), строит новое содержимое для каждого файла, повторно разбирает каждый из них и отказывается записывать, если какой-либо файл окажется неразбираемым. Оригиналы копируются в.cartographer-backups/<plan_id>/. При сбое в середине записи все файлы откатываются.
Дополнительные ограждения: пути за пределами корня карты отклоняются; переименование метода требует явного allow_heuristic=true, потому что сопоставление атрибутов не может быть разрешено без вывода типов; удаление символа, у которого всё ещё есть ссылки, отклоняется, если не принудительно.
Что он не может видеть
У статического анализа есть жёсткая граница, и инструмент создан так, чтобы указывать, где эта граница, а не притворяться, что её нет.
find_dynamic_references сообщает о строковых литералах, совпадающих с именем символа — getattr(mod, "compute"), реестрах плагинов, строковых настройках с точками, таблицах точек входа — и обнаруживает импорты нативных модулей с подчёркиванием в начале. Эти предупреждения прикрепляются к каждому плану рефакторинга.
Это имеет конкретное значение. Переименование JSONDecodeError в копии пакета json из стандартной библиотеки корректно переписывает все 19 ссылок на Python и всё равно ломает пакет, потому что C-ускоритель _json разрешает это имя во время выполнения через C API. Никакой чисто Python-анализ не может проследить это. Инструмент помечает импорт нативного ускорителя и говорит вам проверить вручную.
Также невидимы: реэкспорты from x import * (сообщается как предупреждение), динамическое monkey-patching и ссылки из других языков или конфигурационных файлов.
Инструменты
Инструмент | Назначение |
| Сканировать каталог и построить индекс. Вызывайте это первым и снова после применения. |
| Статистика, пакеты, циклы импортов, наиболее зависимые модули. |
| Индексированные модули, фильтруемые по точечному префиксу. |
| Импорты и определения одного файла. |
| Найти определения по подстроке, типу или префиксу модуля. |
| Полный исходный код одного определения с docstring и декораторами. |
| Каждое использование символа, разрешённое по областям видимости. |
| Строковые литералы и нативные импорты, которые статический анализ не может отследить. |
| Внутренние рёбра импортов, весь граф или окрестность одного модуля. |
| Транзитивные зависимые — радиус поражения при редактировании модуля. |
| Определения уровня модуля без обнаруживаемых ссылок. |
| Спланировать переименование по всему репозиторию. Ничего не записывает. |
| Спланировать перемещение определения в другой модуль. Ничего не записывает. |
| Спланировать удаление определения и его записи в |
| Повторно отобразить diff ожидающего плана. |
| Просмотреть или отбросить ожидающие планы. |
| Зафиксировать план с проверкой хэшей, проверкой синтаксиса и резервными копиями. |
Установка
pip install -e .Зарегистрируйте его в MCP-клиенте:
{
"mcpServers": {
"codebase-cartographer": {
"command": "python",
"args": ["-m", "cartographer"],
"env": { "CARTOGRAPHER_ROOT": "/path/to/your/repo" }
}
}
}CARTOGRAPHER_ROOT — это только значение по умолчанию для map_repository; инструмент также принимает явный аргумент root.
Типичный сеанс
map_repository(root="~/work/service")
-> 412 files, 1 import cycle, 38k LOC
impact_of_change(module="service.auth.tokens")
-> 23 transitive dependents
find_references(qualname="service.auth.tokens.decode_jwt")
-> 31 references across 12 files
find_dynamic_references(name="decode_jwt")
-> 1 string literal in service/registry.py:44 <- read this before proceeding
plan_rename_symbol(qualname="service.auth.tokens.decode_jwt", new_name="decode_access_token")
-> plan 9f2a1c: 31 edits across 12 files, with diff
apply_plan(plan_id="9f2a1c")
-> written, backed up to .cartographer-backups/9f2a1c/Разработка
pip install -e ".[dev]"
pytest65 тестов покрывают разрешение областей видимости (затенение, global, генераторы, видимость тел классов), поиск ссылок во всех стилях импорта, корректность переименования/перемещения/удаления, стиль сгенерированных импортов и гарантии фазы применения: обнаружение устаревших файлов, проверка синтаксиса и откат.
Самая сильная проверка набора — то, что инструмент рефакторит свой собственный исходный код — переименовывает функцию в реализации и тестах и перемещает одну между модулями — после чего весь набор всё ещё проходит на переписанной копии.
Требования
Python 3.10+ (использует позиционные атрибуты ast.alias). Только исходный код на Python.
Лицензия
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables querying and analyzing code relationships by building a lightweight graph of TypeScript and Python symbols. Supports symbol lookup, reference tracking, impact analysis from diffs, and code snippet retrieval through natural language.
- AlicenseNot gradedqualityDmaintenanceProvides tools for Python code navigation, analysis, and refactoring, including finding definitions, references, and symbol lists. It enables automated tasks such as renaming symbols and organizing imports to enhance AI-driven development.Apache 2.0
- AlicenseAqualityDmaintenanceProvides Python refactoring capabilities via the Rope library, enabling AI agents to perform safe, project-wide code transformations such as renaming symbols, moving modules, and extracting methods.101MIT
- AlicenseAqualityBmaintenanceEnables coding agents to perform safe, project-wide Python refactoring (rename, move, extract, inline, change signature, organize imports, etc.) with a dry-run safety contract and LSP-coordinate addressing.15MIT
Related MCP Connectors
Deterministic context layer for your codebase: change impact, blast radius, answers with receipts.
Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.
Give your AI agent a persistent map of your project's structure, dependencies, and bugs.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/sdg5-hub/MCP-Cartographer'
If you have feedback or need assistance with the MCP directory API, please join our Discord server