# server.json, имена и проверка владения

> Поля записи server.json для официального реестра MCP, ограничения схемы, пространства имён и способы доказать владение ими, отличие packages от remotes

Страница: https://mcpdoc.ru/registry/server-json/
Указатель сайта: https://mcpdoc.ru/llms.txt

`server.json` - это файл с описанием сервера, который издатель отправляет в официальный реестр MCP. Обязательных полей три: `name`, `description` и `version`. Имя состоит из пространства имён и названия через косую черту, и пространство имён нужно подтвердить: учётной записью GitHub или своим доменом.

Подтверждённое имя говорит, кто опубликовал запись. О том, что делает сервер и безопасен ли он, имя не говорит ничего.

описана схема 2025-12-11, сверено с первичными источниками 4 октября 2026

## Версия схемы

Действующая схема лежит по адресу `https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json`. Этот адрес стоит во всех примерах документации и в записях, которые отдаёт сама служба.

По [журналу изменений схемы](https://github.com/modelcontextprotocol/registry/blob/main/docs/reference/server-json/CHANGELOG.md) `2025-12-11` - последняя датированная версия. Выше неё в журнале стоит раздел «Draft (Unreleased)»: черновик существует, но не выпущен.

Документация реестра предупреждает, что до общей доступности возможны несовместимые изменения. Версия схемы может смениться. Сверяйте адрес схемы с [официальным руководством](https://modelcontextprotocol.io/registry/quickstart) перед публикацией.

## Наименьший рабочий пример

Пример взят со страницы [«Package types»](https://modelcontextprotocol.io/registry/package-types) официальной документации без изменений.

```json title="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»](https://modelcontextprotocol.io/registry/authentication): слово «обязано» ниже передаёт её «MUST».

| Способ входа | Вид имени | Пример |
|---|---|---|
| через GitHub | `io.github.username/*` или `io.github.orgname/*` | `io.github.alice/weather-server` |
| через домен | `com.example.*/*` - домен в обратной записи | `io.modelcontextprotocol/everything` |

### Имена `io.github.*`

Имя сервера обязано начинаться с `io.github.` и имени пользователя или организации. Подтвердить его можно двумя путями:

- **вход через GitHub** - команда `mcp-publisher login github` показывает код, который вводят на странице `github.com/login/device`;
- **OIDC в GitHub Actions** - команда `mcp-publisher login github-oidc`. По [справке по командам](https://github.com/modelcontextprotocol/registry/blob/main/docs/reference/cli/commands.md) она использует токены OIDC из GitHub Actions и требует разрешения `id-token: write` в сценарии сборки.

### Имена по домену

Имя обязано начинаться с домена в обратной записи: для `example.com` это `com.example`. Владение доменом доказывают парой ключей. Открытый ключ публикуют одним из двух способов.

**Запись DNS.** В зону домена добавляют запись TXT такого вида:

```text title="Запись 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»](https://modelcontextprotocol.io/registry/authentication).

## `packages` и `remotes`

Запись может описывать сервер двумя способами, и их можно совмещать.

| Раздел | Что описывает | Обязательные поля записи |
|---|---|---|
| `packages` | пакет, который устанавливают и запускают у себя | `registryType`, `identifier`, `transport` |
| `remotes` | работающий сервер по адресу в сети | `type`, `url` |

По странице [«Remote servers»](https://modelcontextprotocol.io/registry/remote-servers) оба раздела могут стоять в одном файле, чтобы приложение выбрало удобный способ подключения.

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

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

### Правила для `remotes`

- Удалённый сервер обязан быть общедоступен по указанному адресу.
- В адресе допускаются переменные в фигурных скобках, например `https://{tenant_id}.analytics.example.com/mcp`. Эта возможность появилась в схеме `2025-12-11`.
- Поле `headers` перечисляет заголовки HTTP, которые клиент должен отправлять.
- Служба не принимает адрес, который уже занят другим сервером: в [коде реестра](https://github.com/modelcontextprotocol/registry/blob/main/internal/service/registry_service.go) есть отказ с текстом `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»](https://mcpdoc.ru/deployment/http-sse/).

Редакцию протокола - Modern или Legacy - запись `server.json` не указывает. Такого поля в схеме `2025-12-11` нет.

## Тип пакета и метка владения

Поле `registryType` в схеме - обычная строка с примерами, а не закрытый перечень. Допустимый набор проверяет служба. В опубликованной схеме `2025-12-11` среди примеров пять значений: `npm`, `pypi`, `oci`, `nuget`, `mcpb`. Шестое, `cargo`, описано на странице [«Package types»](https://modelcontextprotocol.io/registry/package-types) и есть в коде службы.

У каждого типа свой способ связать пакет с именем сервера: поле `mcpName`, строка `mcp-name:` в README или аннотация образа. Таблица по всем типам - на странице [«Публикация сервера»](https://mcpdoc.ru/deployment/npm/).

## Версия

Правила - со страницы [«Versioning»](https://modelcontextprotocol.io/registry/versioning).

- Сервер обязан указать строку версии.
- Строка обязана быть новой при каждой публикации. После публикации ни версию, ни остальные метаданные изменить нельзя.
- Реестр рекомендует семантические версии, но принимает любую строку. Если строку разобрать не удалось, эта версия всегда помечается как последняя.
- Строки, похожие на диапазон, запрещены: `^1.2.3`, `~1.2.3`, `>=1.2.3`, `1.x`, `1.2.*`.

Если нужно исправить только метаданные, документация предлагает предварительные версии вида `1.2.3-1`. Там же оговорка: опубликованная после `1.2.3`, такая версия не будет помечена как последняя.

## Правило `_meta`

Слово `_meta` встречается в двух разных местах.

**В вашем файле.** По [требованиям официального реестра](https://github.com/modelcontextprotocol/registry/blob/main/docs/reference/server-json/official-registry-requirements.md) сохраняется только то, что лежит под ключом `io.modelcontextprotocol.registry/publisher-provided`. Все остальные ключи в `_meta` молча отбрасываются при публикации. Объём ограничен 4 КБ (4096 байт JSON): при превышении публикация завершится ошибкой.

**В ответе службы.** Реестр добавляет рядом с записью свой блок под ключом `io.modelcontextprotocol.registry/official`: `status`, `statusChangedAt`, `publishedAt`, `updatedAt`, `isLatest`. Издатель эти поля не задаёт.

Если вы положили в `_meta` свои данные под другим ключом, публикация пройдёт, но данные не сохранятся. Ошибки при этом не будет.

## Что имя доказывает и чего не доказывает

| Имя доказывает | Имя не доказывает |
|---|---|
| издатель вошёл под учётной записью GitHub с таким именем или владеет ключом, опубликованным на домене | что сервер безопасен: реестр код не проверяет |
| пакет помечен этим же именем сервера (кроме `mcpb`) | что сервер работает и делает заявленное |
| запись не менялась после публикации, кроме статуса | что сервер выпущен самим поставщиком сервиса, с которым он работает |
| - | что сервер поддерживает какую-либо редакцию протокола |

Третья строка правого столбца важна на практике. Имя `io.github.someuser/slack-tools` говорит только о том, что запись опубликовал владелец учётной записи `someuser`. К компании, чей сервис назван в имени, оно может не иметь отношения. Имя по домену надёжнее лишь в одном: оно привязано к тому, кто управляет доменом.

## Что читать дальше

- [Официальный реестр MCP](https://mcpdoc.ru/registry/) - что это за служба и в каком она статусе.
- [Публикация сервера](https://mcpdoc.ru/deployment/npm/) - порядок действий от пакета до записи.
- [Каталоги и хабы](https://mcpdoc.ru/registry/catalogs/) - где ещё появляются записи о серверах.
- [Как выбрать сервер](https://mcpdoc.ru/servers/choose/) - на что смотреть помимо имени.
