---
title: "Create MCP Server"
method: POST
path: "/api/v1/servers"
tags: ["Servers"]
---

# Create MCP Server

`POST /api/v1/servers`

Create a new MCP server. If iconUrl is provided, the server will fetch the icon from the external URL and upload it to R2 storage. The response will contain the R2 URL.

## Request body

- ServerCreate
  - `scope` string, required
  - `packageName` string, required
  - `displayName` string, required
  - `description` string, required
  - `repository` Repository, nullable
    - `url` string, uri, required
    - `source` string, required
  - `iconUrl` string, uri — External icon URL. The server will fetch the icon from this URL and upload it to R2 storage. The response will contain the R2 URL.
  - `detailedDescription` string
  - `version` string
  - `packages` Package[]
    - `registryName` string, required
    - `name` string, required
    - `version` string, required
    - `runtimeHint` string
    - `runtimeArguments` Argument[]
      - `type` 'positional' | 'named', required
      - `name` string
      - `isRepeated` boolean
      - `valueHint` string
      - `description` string
      - `isRequired` boolean
      - `format` 'string' | 'number' | 'boolean' | 'file_path'
      - `value` string
      - `isSecret` boolean
      - `default` string
      - `choices` string[]
      - `template` string
      - `properties` object
      - `variables` object
    - `packageArguments` Argument[]
      - `type` 'positional' | 'named', required
      - `name` string
      - `isRepeated` boolean
      - `valueHint` string
      - `description` string
      - `isRequired` boolean
      - `format` 'string' | 'number' | 'boolean' | 'file_path'
      - `value` string
      - `isSecret` boolean
      - `default` string
      - `choices` string[]
      - `template` string
      - `properties` object
      - `variables` object
    - `environmentVariables` KeyValueInput[]
      - `name` string, required
      - `description` string
      - `isRequired` boolean
      - `format` 'string' | 'number' | 'boolean' | 'file_path'
      - `value` string
      - `isSecret` boolean
      - `default` string
      - `choices` string[]
      - `template` string
      - `properties` object
      - `variables` object
  - `remotes` Remote[]
    - `transportType` string, required
    - `url` string, uri, required
    - `headers` KeyValueInput[]
      - `name` string, required
      - `description` string
      - `isRequired` boolean
      - `format` 'string' | 'number' | 'boolean' | 'file_path'
      - `value` string
      - `isSecret` boolean
      - `default` string
      - `choices` string[]
      - `template` string
      - `properties` object
      - `variables` object
  - `author` string
  - `category` string
  - `tags` string[]

## Response `201`

Server created successfully

- ServerResponse
  - `server` ServerDetail, required
    - `scope` string, required
    - `packageName` string, required
    - `displayName` string, required
    - `description` string, required
    - `repository` Repository, nullable
      - `url` string, uri, required
      - `source` string, required
    - `iconUrl` string, uri
    - `detailedDescription` string
    - `version` string
    - `author` string
    - `category` string
    - `tags` string[]
    - `createdAt` string, date-time
    - `updatedAt` string, date-time, required
    - `developerId` string
    - `source` 'gateway' | 'api' | 'seed'
    - `packages` Package[]
      - `registryName` string, required
      - `name` string, required
      - `version` string, required
      - `runtimeHint` string
      - `runtimeArguments` Argument[]
        - `type` 'positional' | 'named', required
        - `name` string
        - `isRepeated` boolean
        - `valueHint` string
        - `description` string
        - `isRequired` boolean
        - `format` 'string' | 'number' | 'boolean' | 'file_path'
        - `value` string
        - `isSecret` boolean
        - `default` string
        - `choices` string[]
        - `template` string
        - `properties` object
        - `variables` object
      - `packageArguments` Argument[]
        - `type` 'positional' | 'named', required
        - `name` string
        - `isRepeated` boolean
        - `valueHint` string
        - `description` string
        - `isRequired` boolean
        - `format` 'string' | 'number' | 'boolean' | 'file_path'
        - `value` string
        - `isSecret` boolean
        - `default` string
        - `choices` string[]
        - `template` string
        - `properties` object
        - `variables` object
      - `environmentVariables` KeyValueInput[]
        - `name` string, required
        - `description` string
        - `isRequired` boolean
        - `format` 'string' | 'number' | 'boolean' | 'file_path'
        - `value` string
        - `isSecret` boolean
        - `default` string
        - `choices` string[]
        - `template` string
        - `properties` object
        - `variables` object
    - `remotes` Remote[]
      - `transportType` string, required
      - `url` string, uri, required
      - `headers` KeyValueInput[]
        - `name` string, required
        - `description` string
        - `isRequired` boolean
        - `format` 'string' | 'number' | 'boolean' | 'file_path'
        - `value` string
        - `isSecret` boolean
        - `default` string
        - `choices` string[]
        - `template` string
        - `properties` object
        - `variables` object
    - `id` string, required

## Other responses

- `400` — Invalid request data
- `401` — Unauthorized - authentication required
- `500` — Internal server error

## Changes

- **2026-01-21** `c98a8ef6cda7` — 1 info
  - added the new optional request property `detailedDescription`
- **2026-01-21** `ba253fbf08a7` — 1 breaking, 1 warning, 4 info
  - the response property `server/version` became optional for the status `201`
  - removed the optional property `server/documentationUrl` from the response with the `201` status
  - the request property `version` became optional
  - the `version` request property default value `1.0.0` was added
  - …2 more
- **2026-01-18** `b0e6563d3fce` — 4 breaking, 2 warning, 5 info
  - the response property `server/repository` became nullable for the status `201`
  - the response property `server/repository` became optional for the status `201`
  - the `code` response property const value `INTERNAL_SERVER_ERROR` was removed for the status `500`
  - the `code` response property const value `UNAUTHORIZED` was removed for the status `401`
  - …7 more
- **2026-01-17** `4f3d96fe2656` — 1 warning, 7 info
  - removed the request property `documentationUrl`
  - added the new optional request property `author`
  - added the new optional request property `category`
  - added the new optional request property `tags`
  - …4 more
- **2025-11-10** `dd3fac5bdb5c` — 7 breaking, 3 warning, 6 info
  - added the new required request property `displayName`
  - added the new required request property `packageName`
  - added the new required request property `scope`
  - added the new required request property `version`
  - …12 more

[Change history](https://skmtc.dev/corespeed-io/apis/mcp-store-api/changes/api/v1/servers/post.md)

---

[API](https://skmtc.dev/corespeed-io/apis/mcp-store-api.md) · [All operations](https://skmtc.dev/corespeed-io/apis/mcp-store-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/corespeed-io/mcp-store-api/revisions/25721894961a/schema)
