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
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())
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();
$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 );
{
"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" }
]
}
{
"code": "invalid_manifest",
"message": "No tools found in the import payload. Expected a getMCP export manifest with a \"tools\" array.",
"data": { "status": 400 }
}
{
"code": "unsupported_format",
"message": "Unsupported manifest format \"getmcp/tools-v999\". Expected getmcp/tools-v1 or later.",
"data": { "status": 400 }
}
{
"code": "manifest_too_large",
"message": "Manifest contains 1500 tools — limit is 1000 per import.",
"data": { "status": 413 }
}
{
"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"
}
}
Tools
Import from getMCP Manifest
Round-trip a manifest produced by the export endpoint into a server.
POST
/
wp-json
/
getmcp
/
v1
/
servers
/
{server_id}
/
tools
/
import-getmcp
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
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())
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();
$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 );
{
"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" }
]
}
{
"code": "invalid_manifest",
"message": "No tools found in the import payload. Expected a getMCP export manifest with a \"tools\" array.",
"data": { "status": 400 }
}
{
"code": "unsupported_format",
"message": "Unsupported manifest format \"getmcp/tools-v999\". Expected getmcp/tools-v1 or later.",
"data": { "status": 400 }
}
{
"code": "manifest_too_large",
"message": "Manifest contains 1500 tools — limit is 1000 per import.",
"data": { "status": 413 }
}
{
"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"
}
}
Counterpart to
POST /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.
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.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.Path Parameters
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.Body Parameters
string
Manifest format identifier. Must start with
getmcp/tools-v (e.g. getmcp/tools-v1). Optional — bare arrays without an envelope are also accepted.string
Optional ISO 8601 timestamp from the source manifest. Carried through for traceability; not validated.
object
Optional
{ name, slug } block from the source server. Carried through for traceability; not used to override the target.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.string
default:"skip"
How to handle slug collisions. One of:
skip (default — record goes into skipped[]), duplicate (auto-suffix the slug).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
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())
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();
$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 );
{
"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" }
]
}
{
"code": "invalid_manifest",
"message": "No tools found in the import payload. Expected a getMCP export manifest with a \"tools\" array.",
"data": { "status": 400 }
}
{
"code": "unsupported_format",
"message": "Unsupported manifest format \"getmcp/tools-v999\". Expected getmcp/tools-v1 or later.",
"data": { "status": 400 }
}
{
"code": "manifest_too_large",
"message": "Manifest contains 1500 tools — limit is 1000 per import.",
"data": { "status": 413 }
}
{
"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"
}
}
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. |

