Перейти к содержимому
Выберите тему

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» официальной документации без изменений.

server.json
{
"$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. и имени пользователя или организации. Подтвердить его можно двумя путями:

  • вход через 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 такого вида:

Запись 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 пакет, который устанавливают и запускают у себя registryType, identifier, transport
remotes работающий сервер по адресу в сети type, url

По странице «Remote servers» оба раздела могут стоять в одном файле, чтобы приложение выбрало удобный способ подключения.

Пример записи только с удалённым адресом, с той же страницы без изменений:

server.json
{
"$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) и здесь не запускался.

  • Удалённый сервер обязан быть общедоступен по указанному адресу.
  • В адресе допускаются переменные в фигурных скобках, например 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 встречается в двух разных местах.

В вашем файле. По требованиям официального реестра сохраняется только то, что лежит под ключом 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. К компании, чей сервис назван в имени, оно может не иметь отношения. Имя по домену надёжнее лишь в одном: оно привязано к тому, кто управляет доменом.