server.json, имена и проверка владения
Поля записи server.json для официального реестра MCP, ограничения схемы, пространства имён и способы доказать владение ими, отличие packages от remotes
описана схема 2025-12-11, сверено с первичными источниками 4 октября 2026
Версия схемы
Заголовок раздела «Версия схемы»Действующая схема лежит по адресу https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json. Этот адрес стоит во всех примерах документации и в записях, которые отдаёт сама служба.
По журналу изменений схемы 2025-12-11 - последняя датированная версия. Выше неё в журнале стоит раздел «Draft (Unreleased)»: черновик существует, но не выпущен.
Наименьший рабочий пример
Заголовок раздела «Наименьший рабочий пример»Пример взят со страницы «Package types» официальной документации без изменений.
{ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", "name": "io.github.username/email-integration-mcp", "title": "Email Integration", "description": "Send emails and manage email accounts", "version": "1.0.0", "packages": [ { "registryType": "npm", "identifier": "@username/email-integration-mcp", "version": "1.0.0", "transport": { "type": "stdio" } } ]}Пример взят из официальной документации реестра (прочитана 4 октября 2026) и здесь не запускался.
Поля верхнего уровня
Заголовок раздела «Поля верхнего уровня»Данные - из схемы 2025-12-11.
| Поле | Обязательно | Ограничения |
|---|---|---|
name |
да | от 3 до 200 знаков, вид пространство/название, шаблон ^[a-zA-Z0-9.-]+/[a-zA-Z0-9._-]+$ |
description |
да | от 1 до 100 знаков |
version |
да | до 255 знаков |
title |
нет | от 1 до 100 знаков |
$schema |
нет | адрес схемы |
packages |
нет | список пакетов для установки |
remotes |
нет | список удалённых адресов |
repository |
нет | если есть, обязательны url и source |
websiteUrl |
нет | - |
icons |
нет | - |
_meta |
нет | см. раздел ниже |
Ограничение в 100 знаков для description жёсткое: длинное описание схему не пройдёт.
Пространства имён
Заголовок раздела «Пространства имён»Способ входа определяет, какое имя можно занять. Это правило страницы «Authentication»: слово «обязано» ниже передаёт её «MUST».
| Способ входа | Вид имени | Пример |
|---|---|---|
| через GitHub | io.github.username/* или io.github.orgname/* |
io.github.alice/weather-server |
| через домен | com.example.*/* - домен в обратной записи |
io.modelcontextprotocol/everything |
Имена io.github.*
Заголовок раздела «Имена io.github.*»Имя сервера обязано начинаться с io.github. и имени пользователя или организации. Подтвердить его можно двумя путями:
- вход через GitHub - команда
mcp-publisher login githubпоказывает код, который вводят на страницеgithub.com/login/device; - OIDC в GitHub Actions - команда
mcp-publisher login github-oidc. По справке по командам она использует токены OIDC из GitHub Actions и требует разрешенияid-token: writeв сценарии сборки.
Имена по домену
Заголовок раздела «Имена по домену»Имя обязано начинаться с домена в обратной записи: для example.com это com.example. Владение доменом доказывают парой ключей. Открытый ключ публикуют одним из двух способов.
Запись DNS. В зону домена добавляют запись TXT такого вида:
example.com. IN TXT "v=MCPv1; k=ed25519; p=${PUBLIC_KEY}"Пример взят из официальной документации реестра (прочитана 4 октября 2026) и здесь не запускался.
Вместо ed25519 допускается ecdsap384. Затем выполняют mcp-publisher login dns с доменом и закрытым ключом. Ключ можно держать в Google KMS или Azure Key Vault - для этого у команды есть отдельные варианты.
Файл по HTTP. На домене размещают файл /.well-known/mcp-registry-auth с той же строкой v=MCPv1; k=ed25519; p=.... Затем выполняют mcp-publisher login http.
Команды создания ключей приведены на странице «Authentication».
packages и remotes
Заголовок раздела «packages и remotes»Запись может описывать сервер двумя способами, и их можно совмещать.
| Раздел | Что описывает | Обязательные поля записи |
|---|---|---|
packages |
пакет, который устанавливают и запускают у себя | registryType, identifier, transport |
remotes |
работающий сервер по адресу в сети | type, url |
По странице «Remote servers» оба раздела могут стоять в одном файле, чтобы приложение выбрало удобный способ подключения.
Пример записи только с удалённым адресом, с той же страницы без изменений:
{ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", "name": "com.example/acme-analytics", "title": "ACME Analytics", "description": "Real-time business intelligence and reporting platform", "version": "2.0.0", "remotes": [ { "type": "streamable-http", "url": "https://analytics.example.com/mcp" } ]}Пример взят из официальной документации реестра (прочитана 4 октября 2026) и здесь не запускался.
Правила для remotes
Заголовок раздела «Правила для remotes»- Удалённый сервер обязан быть общедоступен по указанному адресу.
- В адресе допускаются переменные в фигурных скобках, например
https://{tenant_id}.analytics.example.com/mcp. Эта возможность появилась в схеме2025-12-11. - Поле
headersперечисляет заголовки HTTP, которые клиент должен отправлять. - Служба не принимает адрес, который уже занят другим сервером: в коде реестра есть отказ с текстом
remote URL ... is already used by server .... В документации для издателей это правило не описано.
Допустимые транспорты
Заголовок раздела «Допустимые транспорты»| Где | Значения type |
Источник |
|---|---|---|
packages[].transport |
stdio, streamable-http, sse |
схема 2025-12-11, определение LocalTransport |
remotes[] |
streamable-http, sse |
страница «Remote servers» |
Значение sse здесь означает старый транспорт HTTP+SSE. Документация реестра называет его устаревшим и советует публиковать адрес sse только ради существующих клиентов. Это не то же самое, что поток SSE как форма ответа внутри Streamable HTTP. Разница объяснена на странице «Streamable HTTP и переход с HTTP+SSE».
Редакцию протокола - Modern или Legacy - запись server.json не указывает. Такого поля в схеме 2025-12-11 нет.
Тип пакета и метка владения
Заголовок раздела «Тип пакета и метка владения»Поле registryType в схеме - обычная строка с примерами, а не закрытый перечень. Допустимый набор проверяет служба. В опубликованной схеме 2025-12-11 среди примеров пять значений: npm, pypi, oci, nuget, mcpb. Шестое, cargo, описано на странице «Package types» и есть в коде службы.
У каждого типа свой способ связать пакет с именем сервера: поле mcpName, строка mcp-name: в README или аннотация образа. Таблица по всем типам - на странице «Публикация сервера».
Правила - со страницы «Versioning».
- Сервер обязан указать строку версии.
- Строка обязана быть новой при каждой публикации. После публикации ни версию, ни остальные метаданные изменить нельзя.
- Реестр рекомендует семантические версии, но принимает любую строку. Если строку разобрать не удалось, эта версия всегда помечается как последняя.
- Строки, похожие на диапазон, запрещены:
^1.2.3,~1.2.3,>=1.2.3,1.x,1.2.*.
Если нужно исправить только метаданные, документация предлагает предварительные версии вида 1.2.3-1. Там же оговорка: опубликованная после 1.2.3, такая версия не будет помечена как последняя.
Правило _meta
Заголовок раздела «Правило _meta»Слово _meta встречается в двух разных местах.
В вашем файле. По требованиям официального реестра сохраняется только то, что лежит под ключом io.modelcontextprotocol.registry/publisher-provided. Все остальные ключи в _meta молча отбрасываются при публикации. Объём ограничен 4 КБ (4096 байт JSON): при превышении публикация завершится ошибкой.
В ответе службы. Реестр добавляет рядом с записью свой блок под ключом io.modelcontextprotocol.registry/official: status, statusChangedAt, publishedAt, updatedAt, isLatest. Издатель эти поля не задаёт.
Что имя доказывает и чего не доказывает
Заголовок раздела «Что имя доказывает и чего не доказывает»| Имя доказывает | Имя не доказывает |
|---|---|
| издатель вошёл под учётной записью GitHub с таким именем или владеет ключом, опубликованным на домене | что сервер безопасен: реестр код не проверяет |
пакет помечен этим же именем сервера (кроме mcpb) |
что сервер работает и делает заявленное |
| запись не менялась после публикации, кроме статуса | что сервер выпущен самим поставщиком сервиса, с которым он работает |
| - | что сервер поддерживает какую-либо редакцию протокола |
Третья строка правого столбца важна на практике. Имя io.github.someuser/slack-tools говорит только о том, что запись опубликовал владелец учётной записи someuser. К компании, чей сервис назван в имени, оно может не иметь отношения. Имя по домену надёжнее лишь в одном: оно привязано к тому, кто управляет доменом.
Что читать дальше
Заголовок раздела «Что читать дальше»- Официальный реестр MCP - что это за служба и в каком она статусе.
- Публикация сервера - порядок действий от пакета до записи.
- Каталоги и хабы - где ещё появляются записи о серверах.
- Как выбрать сервер - на что смотреть помимо имени.