> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getmcp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Import from getMCP Manifest

> Round-trip a manifest produced by the export endpoint into a server.

Counterpart to [`POST /tools/export`](/api-reference/tools/export). Takes a manifest object (with the `getmcp/tools-v1` envelope, or a bare `tools[]` array) and creates the listed tools on the target server in a single round-trip — no two-phase confirmation step.

<Note>
  Slug collisions default to **skip** (the existing tool is left alone and the candidate appears in `skipped[]`). Pass `on_conflict: "duplicate"` to let `ToolManager` auto-suffix the new slug instead.
</Note>

<Note>
  Hard cap of **1000 tools per import**. Larger manifests return `413 Payload Too Large` — split the upload into multiple smaller manifests if you hit this.
</Note>

## Path Parameters

<ParamField path="server_id" type="string" required>
  The UUID of the server to import into (e.g. `836995ae-1cff-41ec-823e-a4f07ccca3a0`). Numeric IDs are also accepted for backwards compatibility.
</ParamField>

## Body Parameters

<ParamField body="format" type="string">
  Manifest format identifier. Must start with `getmcp/tools-v` (e.g. `getmcp/tools-v1`). Optional — bare arrays without an envelope are also accepted.
</ParamField>

<ParamField body="exported_at" type="string">
  Optional ISO 8601 timestamp from the source manifest. Carried through for traceability; not validated.
</ParamField>

<ParamField body="server" type="object">
  Optional `{ name, slug }` block from the source server. Carried through for traceability; not used to override the target.
</ParamField>

<ParamField body="tools" type="array" required>
  Array of tool objects produced by the export endpoint. Each entry uses the same shape as the export manifest: `name`, `slug`, `description`, `endpoint_url`, `http_method`, `input_schema`, `parameter_mapping`, `response_mapping`, `headers`, `timeout`, `cache_ttl`, `retry_count`, `retry_backoff`, `rate_limit_per_min`, `status`, `tags`, `sort_order`. The `name` field is required per row.
</ParamField>

<ParamField body="on_conflict" type="string" default="skip">
  How to handle slug collisions. One of: `skip` (default — record goes into `skipped[]`), `duplicate` (auto-suffix the slug).
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST \
       --url https://yoursite.com/wp-json/getmcp/v1/servers/836995ae-1cff-41ec-823e-a4f07ccca3a0/tools/import-getmcp \
       --header 'Authorization: Bearer gmcp_your_api_key' \
       --header 'content-type: application/json' \
       --data @./manifest.json
  ```

  ```python Python theme={null}
  import json, requests

  with open("./manifest.json") as f:
      manifest = json.load(f)

  response = requests.post(
      "https://yoursite.com/wp-json/getmcp/v1/servers/836995ae-1cff-41ec-823e-a4f07ccca3a0/tools/import-getmcp",
      headers={
          "Authorization": "Bearer gmcp_your_api_key",
          "Content-Type": "application/json",
      },
      json={**manifest, "on_conflict": "duplicate"},
  )
  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const manifest = await (await fetch("./manifest.json")).json();

  const response = await fetch(
    "https://yoursite.com/wp-json/getmcp/v1/servers/836995ae-1cff-41ec-823e-a4f07ccca3a0/tools/import-getmcp",
    {
      method: "POST",
      headers: {
        "Authorization": "Bearer gmcp_your_api_key",
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ ...manifest, on_conflict: "skip" }),
    }
  );
  const data = await response.json();
  ```

  ```php PHP theme={null}
  $manifest = json_decode( file_get_contents( __DIR__ . '/manifest.json' ), true );
  $manifest['on_conflict'] = 'skip';

  $response = wp_remote_post(
      "https://yoursite.com/wp-json/getmcp/v1/servers/836995ae-1cff-41ec-823e-a4f07ccca3a0/tools/import-getmcp",
      [
          "headers" => [
              "Authorization" => "Bearer gmcp_your_api_key",
              "Content-Type"  => "application/json",
          ],
          "body" => wp_json_encode( $manifest ),
      ]
  );
  $data = json_decode( wp_remote_retrieve_body( $response ), true );
  ```
</RequestExample>

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "created": [
      { "tool_id": 91, "uuid": "5376af81-6bb8-4b01-800c-508d7672e394", "name": "Get Weather", "slug": "get_weather" },
      { "tool_id": 92, "uuid": "1a2b3c4d-5e6f-7081-92a3-b4c5d6e7f809", "name": "List Forecasts", "slug": "list_forecasts" }
    ],
    "skipped": [
      { "temp_id": "idx_2", "name": "Existing Tool", "reason": "slug_exists" }
    ],
    "failed": [
      { "temp_id": "idx_5", "name": "", "error": "name is required" }
    ]
  }
  ```

  ```json 400 Bad Request — empty payload theme={null}
  {
    "code": "invalid_manifest",
    "message": "No tools found in the import payload. Expected a getMCP export manifest with a \"tools\" array.",
    "data": { "status": 400 }
  }
  ```

  ```json 400 Bad Request — unsupported format theme={null}
  {
    "code": "unsupported_format",
    "message": "Unsupported manifest format \"getmcp/tools-v999\". Expected getmcp/tools-v1 or later.",
    "data": { "status": 400 }
  }
  ```

  ```json 413 Payload Too Large theme={null}
  {
    "code": "manifest_too_large",
    "message": "Manifest contains 1500 tools — limit is 1000 per import.",
    "data": { "status": 413 }
  }
  ```

  ```json 403 Forbidden — tier limit theme={null}
  {
    "code": "tier_limit_import_method",
    "message": "Importing tools from GETMCP is not available on your FREE plan.",
    "data": {
      "status": 403,
      "tier": "free",
      "upgrade_url": "https://getmcp.com/pricing"
    }
  }
  ```
</ResponseExample>

## Status Codes

| Code  | Meaning                                                                             |
| ----- | ----------------------------------------------------------------------------------- |
| `200` | Import processed. Inspect `created`, `skipped`, and `failed` for per-tool outcomes. |
| `400` | Empty manifest or unsupported `format`.                                             |
| `402` | 14-day trial expired and no active license.                                         |
| `403` | Current license tier does not allow getMCP manifest import.                         |
| `404` | Server not found.                                                                   |
| `413` | Manifest exceeds the 1000-tool per-import cap.                                      |
