SprutTechnology.ExtensionStoreMcp
0.2.3
dotnet tool install --global SprutTechnology.ExtensionStoreMcp --version 0.2.3
dotnet new tool-manifest
dotnet tool install --local SprutTechnology.ExtensionStoreMcp --version 0.2.3
#tool dotnet:?package=SprutTechnology.ExtensionStoreMcp&version=0.2.3
nuke :add-package SprutTechnology.ExtensionStoreMcp --version 0.2.3
sprutcam-extension-mcp
MCP-сервер для потока «написать расширение СПРУТКАМа в Cursor, ни разу не скопировав файл руками». Работает вместе с шаблоном sprutcam-extension-template.
| Инструмент | Что делает |
|---|---|
create_extension_from_template |
Клонирует шаблон в папку с вашим именем, отвязывает его историю и переименовывает всё внутри. |
publish_extension |
Собирает Release на вашей машине, отправляет результат сборки в магазин; магазин сам пакует .nupkg и заводит карточку. |
check_extension_status |
Что магазин знает о расширении: есть ли карточка, одобрена ли, какая версия последняя. |
get_extension_guide |
Библиотека навыков: какую из восьми точек входа СПРУТКАМа реализовать, как её зарегистрировать, минимальный скелет и грабли. Сначала type=list, потом сам тип. |
Где документация самого API
Руководства этого сервера отвечают на «какую точку входа реализовать» — какой интерфейс написать и как его зарегистрировать. То, что вы вызываете внутри, описано отдельно:
- Справочник CAM API — все интерфейсы, свойства и методы.
- Уроки — тот же API по порядку, начиная с первого расширения.
- cam-api-examples — рабочий пример на каждый тип расширения.
Полный список публичной документации СПРУТКАМа — public-docs.
Как устроена публикация
Исходники живут на GitVerse, а он не выдаёт подписанных жетонов сборки — тех, по которым магазин мог бы поверить роботу, что прогон и правда идёт из нужного репозитория. Конвейера в репозиториях расширений поэтому нет, и всё делается с машины автора:
- сборка локальная.
publish_extensionвызываетdotnet build -c Release -t:PackReadyу вас, загружает файлы сборки в магазин и просит его упаковать — пакет собирает сервер, а запускает это человек, а не робот; - репозиторий инструмент не создаёт. У GitVerse нет своего
gh, а создание репозитория первым пушем в организацию у них запрещено («Push to create is not enabled for organizations»). Репозиторий заводите сами, аcreate_extension_from_templateдаёт готовую папку; - привязки «репозиторий → имя пакета» нет. Она нужна только доверенной публикации из CI; без CI привязывать нечего.
Установка (Cursor)
Нужны git и .NET SDK: 8 для самого инструмента и 10 для сборки расширения — шаблон
собирается под net10.0-windows, потому что на .NET 10 работает сам СПРУТКАМ 20 (dotnet --list-sdks
должен показать обе линии; ставятся рядом, с https://dot.net).
dotnet tool install -g SprutTechnology.ExtensionStoreMcp
sprutcam-extension-mcp setup
Пакет лежит на nuget.org (с 08.09.2026); обновление — dotnet tool update -g SprutTechnology.ExtensionStoreMcp.
setup прописывает сервер в ~/.cursor/mcp.json (файл сливается, чужие MCP-серверы остаются),
регистрирует его в Claude Code, если тот установлен, и выполняет вход в магазин. После этого Cursor
нужно перезапустить. --no-login пропускает вход.
Вход — sprutcam-extension-mcp login — открывает страницу входа в браузере; инструмент хранит
только refresh-токен (в %APPDATA%) и пароля не видит, поэтому работают SSO и двухфакторка.
--password оставлен запасным путём для машины без браузера.
Руками вместо setup — это login плюс в ~/.cursor/mcp.json:
{
"mcpServers": {
"sprutcam-extension-store": {
"command": "sprutcam-extension-mcp"
}
}
}
Как это выглядит в работе
- «создай расширение СПРУТКАМа с именем ToolpathTimer» →
create_extension_from_templateразворачивает шаблон рядом с вашей рабочей папкой. - «оно должно добавлять пункт в контекстное меню операции» →
get_extension_guide(list→operation_popup) называет интерфейс, ключ в*.settings.jsonи то, что ломается. Те же тексты лежат в шаблоне как правила Cursor (.cursor/rules/type-*.mdc) — они генерируются изguides/этого репозитория, инструмент отдаёт свежую копию. - Пишете код в
src/. - «опубликуй как 0.1.0» →
publish_extension. - «опубликовалось?» →
check_extension_status. Новое расширение ждёт модератора; ссылка на его карточку работает сразу, новые версии одобренного публикуются без ожидания.
Настройки
| Переменная | Зачем |
|---|---|
SPRUTCAM_STORE_API |
другой адрес API магазина (стенд); по умолчанию — адрес из src/Brand.cs |
SPRUTCAM_STORE_TOKEN |
готовый токен вместо сохранённого входа (отладка, CI) |
Всё, что привязывает инструмент к магазину, лежит значениями в одном файле — src/Brand.cs
(адрес магазина, Keycloak, метка пакета, адрес шаблона). Переезд магазина на постоянное имя — правка
одной строки там.
Выпуск
dotnet pack src -c Release -o pkg # pkg\SprutTechnology.ExtensionStoreMcp.<версия>.nupkg
. ools\push-nuget.ps1 # спросит ключ nuget.org скрытым вводом; -Remember сохранит его
Разработка
dotnet test tests/SprutCamExtensionMcp.Tests.csproj # логика; процессы и магазин подделаны
dotnet run --project src # stdio-сервер, говорить с ним JSON-RPC
Руководства в guides/ — единственный источник правды: они вшиты в сборку для
get_extension_guide, и из них же генерируется снимок правил Cursor в репозитории шаблона.
После правки руководства:
powershell -NoProfile -File tools/sync-rules.ps1 # .cursor/rules/*.mdc + AGENTS.md в шаблоне
powershell -NoProfile -File tools/sync-rules.ps1 -Check # exit 1, если снимок разошёлся
Два формата, один источник: Cursor сам подхватывает .cursor/rules/*.mdc, а Claude Code, Codex и
Copilot читают AGENTS.md — поэтому генератор пишет ещё и его. Ссылки ведут на те же .mdc, ничего
не дублируется.
-TemplateDir указывает на шаблон, если он лежит не рядом. Коммитить шаблон надо отдельно —
скрипт только пишет файлы. Новая точка входа = файл руководства, строка в guides/_index.json
(его читают тесты) и повторный прогон скрипта.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.