Публикация сервера
Как опубликовать сервер MCP - пакет в npm, PyPI, NuGet, Cargo, OCI или MCPB, метка владения, запись в официальном реестре через mcp-publisher или GitHub Actions
сверено с первичными источниками 4 октября 2026
Два разных реестра
Заголовок раздела «Два разных реестра»| Реестр пакетов | Официальный реестр MCP | |
|---|---|---|
| Что хранит | код и двоичные файлы | метаданные: файл server.json |
| Примеры | npm, PyPI, NuGet, crates.io, Docker Hub | registry.modelcontextprotocol.io |
| Зачем нужен | чтобы сервер можно было установить и запустить | чтобы каталоги и приложения могли сервер найти |
| Как туда попасть | средствами этого реестра, например npm publish |
командой mcp-publisher publish |
Это разделение задано документацией: реестр MCP хранит только метаданные, не сами пакеты. Поэтому пакет нужно выложить до публикации записи.
Реестр MCP работает в режиме preview: документация предупреждает о возможных несовместимых изменениях и сбросе данных до общей доступности. Что это за служба, рассказано на странице «Официальный реестр MCP».
Порядок действий
Заголовок раздела «Порядок действий»- Выберите имя сервера и способ подтвердить его пространство имён.
- Добавьте в пакет метку владения - для npm это поле
mcpName. - Выложите пакет в реестр пакетов.
- Создайте
server.json. - Войдите в реестр MCP и опубликуйте запись.
Ниже путь показан на пакете npm, как в официальном руководстве. Для других типов пакетов меняются только шаги 2 и 3.
Шаг 1. Метка владения в пакете
Заголовок раздела «Шаг 1. Метка владения в пакете»Реестр проверяет, что пакет действительно относится к серверу с таким именем. Для npm в package.json добавляют поле mcpName. Пример со страницы «Package types»:
{ "name": "@username/email-integration-mcp", "version": "1.0.0", "mcpName": "io.github.username/email-integration-mcp"}Пример взят из официальной документации реестра (прочитана 4 октября 2026) и здесь не запускался.
Значение mcpName обязано совпадать с полем name в server.json. При входе через GitHub имя обязано начинаться с io.github. и вашего имени пользователя или организации.
Метка для каждого типа пакета
Заголовок раздела «Метка для каждого типа пакета»Источник всех строк - страница «Package types».
registryType |
Допустимый реестр | Метка владения |
|---|---|---|
npm |
только https://registry.npmjs.org |
поле mcpName в package.json |
pypi |
только https://pypi.org |
строка mcp-name: имя-сервера в README; может быть в скрытом комментарии |
nuget |
только https://api.nuget.org/v3/index.json |
строка mcp-name: имя-сервера в README; может быть в скрытом комментарии |
cargo |
только https://crates.io |
строка mcp-name: имя-сервера в README видимым текстом |
oci |
Docker Hub, GHCR, Google Artifact Registry, Azure Container Registry, Microsoft Container Registry | аннотация io.modelcontextprotocol.server.name в образе |
mcpb |
выпуски GitHub или GitLab | метки нет; адрес обязан содержать строку mcp, в записи обязано быть поле fileSha256 |
Три замечания к таблице.
Cargo. crates.io вырезает комментарии HTML при показе README. Скрытая строка, которая годится для PyPI и NuGet, здесь не сработает: метку нужно писать видимым текстом.
OCI. Аннотацию задают в Dockerfile, например: LABEL io.modelcontextprotocol.server.name="io.github.username/kubernetes-manager-mcp".
MCPB. Владение не проверяется. Хеш fileSha256 реестр не сверяет - по документации его сверяют клиенты перед установкой.
Шаг 2. Публикация пакета
Заголовок раздела «Шаг 2. Публикация пакета»Соберите пакет и выложите его средствами реестра пакетов. Для npm руководство приводит такие команды:
# If necessary, authenticate to npmnpm adduser
# Publish the packagenpm publish --access publicПример взят из официальной документации реестра (прочитана 4 октября 2026) и здесь не запускался.
Правила самого npm - области имён, права, метки версий - описаны в документации npm. Правилами MCP они не являются.
Шаг 3. Установка mcp-publisher
Заголовок раздела «Шаг 3. Установка mcp-publisher»mcp-publisher - официальная программа командной строки для публикации в реестр. Руководство предлагает готовый двоичный файл или Homebrew:
curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher && sudo mv mcp-publisher /usr/local/bin/brew install mcp-publisherПримеры взяты из официальной документации реестра (прочитана 4 октября 2026) и здесь не запускались.
Команда для Windows приведена в том же руководстве.
Шаг 4. Файл server.json
Заголовок раздела «Шаг 4. Файл server.json»mcp-publisher initПример взят из официальной документации реестра (прочитана 4 октября 2026) и здесь не запускался.
Команда создаёт заготовку server.json и подставляет то, что смогла определить по проекту. По справке по командам она не задаёт вопросов и не принимает параметров, а для полей, которые определить не удалось, пишет пометки TODO:.
Заготовку нужно проверить руками: имя, версию пакета, описание не длиннее 100 знаков. Поля и ограничения разобраны на странице «server.json, имена и проверка владения».
В той же справке есть команда mcp-publisher validate, которая проверяет файл без публикации. В выводе --help из руководства её нет.
Шаг 5. Вход
Заголовок раздела «Шаг 5. Вход»Способ входа определяет, какое пространство имён вам доступно.
| Команда | Для чего | Пространство имён |
|---|---|---|
mcp-publisher login github |
вход с подтверждением в браузере | io.github.* |
mcp-publisher login github-oidc |
вход из GitHub Actions | io.github.* |
mcp-publisher login dns |
подтверждение записью TXT | домен в обратной записи |
mcp-publisher login http |
подтверждение файлом на домене | домен в обратной записи |
mcp-publisher login none |
без проверки, только для локальных испытаний | - |
При обычном входе через GitHub программа печатает код и просит ввести его на странице github.com/login/device:
mcp-publisher login githubПример взят из официальной документации реестра (прочитана 4 октября 2026) и здесь не запускался.
Шаг 6. Публикация записи
Заголовок раздела «Шаг 6. Публикация записи»mcp-publisher publishПример взят из официальной документации реестра (прочитана 4 октября 2026) и здесь не запускался.
Проверить результат руководство предлагает запросом к API:
curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.my-username/weather"Пример взят из официальной документации реестра (прочитана 4 октября 2026) и здесь не запускался.
Типичные отказы из того же руководства:
| Сообщение | Что делать |
|---|---|
Registry validation failed for package |
в пакете нет метки владения, например mcpName |
Invalid or expired Registry JWT token |
войти заново |
You do not have permission to publish this server |
имя сервера не соответствует способу входа |
Публикация из GitHub Actions
Заголовок раздела «Публикация из GitHub Actions»Документация называет вход по OIDC рекомендуемым способом для GitHub Actions: отдельный секрет для реестра MCP при нём не нужен. Сценарий с той же страницы:
name: Publish to MCP Registry
on: push: tags: ["v*"] # Triggers on version tags like v1.0.0
jobs: publish: runs-on: ubuntu-latest permissions: id-token: write # Required for OIDC authentication contents: read
steps: - name: Checkout code uses: actions/checkout@v5
### Publish underlying npm package:
- name: Set up Node.js uses: actions/setup-node@v5 with: node-version: "lts/*"
- name: Install dependencies run: npm ci
- name: Run tests run: npm run test --if-present
- name: Build package run: npm run build --if-present
- name: Publish package to npm run: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
### Publish MCP server:
- name: Install mcp-publisher run: | curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
- name: Authenticate to MCP Registry run: ./mcp-publisher login github-oidc
- name: Publish server to MCP Registry run: ./mcp-publisher publishПример взят из официальной документации реестра (прочитана 4 октября 2026) и здесь не запускался. Необязательный закомментированный шаг с подстановкой версии опущен.
Что здесь важно:
- разрешение
id-token: writeобязательно для входа по OIDC; - секрет
NPM_TOKENнужен для npm, к реестру MCP он не относится; - порядок шагов тот же, что и вручную: сначала пакет, потом запись.
Там же описаны два других варианта: вход по личному токену GitHub с правами read:org и read:user и вход по DNS с закрытым ключом в секрете.
Что реестр проверяет и чего не проверяет
Заголовок раздела «Что реестр проверяет и чего не проверяет»По справке по командам публикация проходит так: программа сверяет файл со схемой, служба проверяет владение пакетом, затем право на пространство имён.
| Проверяется | Не проверяется |
|---|---|
соответствие server.json схеме |
безопасность кода сервера |
| право издателя на пространство имён | работает ли сервер и делает ли заявленное |
метка владения в пакете (кроме mcpb) |
хеш файла MCPB |
| новизна строки версии | качество: слабые и повторяющиеся серверы не удаляются |
Проверку кода документация оставляет другим: реестрам пакетов и последующим агрегаторам. О модерации сказано, что потребителям следует исходить из того, что она минимальна или отсутствует.
Правила - со страницы «Versioning».
- Каждая публикация обязана иметь новую строку версии.
- Опубликованную версию изменить нельзя. Чтобы обновить метаданные, публикуют новую версию.
- Диапазоны вроде
^1.2.3или1.xв строке версии запрещены. - Семантические версии рекомендованы, но не обязательны.
Удаление: документы говорят по-разному
Заголовок раздела «Удаление: документы говорят по-разному»Здесь официальные источники расходятся, поэтому приводим оба.
| Источник | Что сказано |
|---|---|
| FAQ реестра | на вопрос, можно ли удалить или отозвать сервер, ответ: «сейчас нет», идёт обсуждение |
| Справка по командам | есть команда mcp-publisher status --status со значениями active, deprecated, deleted; deleted означает, что сервер скрыт из обычных списков |
| Описание общего API | запрос DELETE для версии сервера назван необязательным и не реализованным в официальном реестре |
| Страница для агрегаторов | метаданные в целом неизменяемы, кроме поля status, которое может стать deprecated или deleted |
Эти утверждения совместимы, если читать их так: стереть запись издатель не может, а пометить версию устаревшей или удалённой - может. Это наше прочтение, в документации такой общей формулировки нет. Работает ли команда status на действующей службе, здесь не проверялось.
Чего реестр не поддерживает
Заголовок раздела «Чего реестр не поддерживает»- Закрытые серверы. Документация прямо говорит, что реестр их не поддерживает. Удалённый сервер из раздела
remotesобязан быть общедоступен по своему адресу. - Закрытые реестры пакетов. Для каждого типа пакета принимается только названный общий реестр.
- Размещение у себя. Код реестра не рассчитан на собственную установку, и сопровождающие такую установку не поддерживают.
Для внутренних серверов организации используют закрытые реестры. Они перечислены на странице «Каталоги и хабы».
Что читать дальше
Заголовок раздела «Что читать дальше»- server.json, имена и проверка владения - поля записи и правила имён.
- Официальный реестр MCP - статус службы и версии API.
- Каталоги и хабы - куда запись попадает дальше.
- Развёртывание в Docker - если сервер распространяется образом.