curl --request POST \
--url https://api.example.com/api/registry/mcp-servers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"scope": "personal",
"name": "",
"display_name": "",
"description": "",
"sharing": "per_user",
"version": "0.1.0",
"credential": {
"value": "<string>",
"kind": "bearer",
"header_name": "Authorization",
"refresh_value": "<string>",
"token_url": "<string>",
"client_id": "<string>",
"expires_at": "2023-11-07T05:31:56Z"
}
}
'import requests
url = "https://api.example.com/api/registry/mcp-servers"
payload = {
"url": "<string>",
"scope": "personal",
"name": "",
"display_name": "",
"description": "",
"sharing": "per_user",
"version": "0.1.0",
"credential": {
"value": "<string>",
"kind": "bearer",
"header_name": "Authorization",
"refresh_value": "<string>",
"token_url": "<string>",
"client_id": "<string>",
"expires_at": "2023-11-07T05:31:56Z"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
url: '<string>',
scope: 'personal',
name: '',
display_name: '',
description: '',
sharing: 'per_user',
version: '0.1.0',
credential: {
value: '<string>',
kind: 'bearer',
header_name: 'Authorization',
refresh_value: '<string>',
token_url: '<string>',
client_id: '<string>',
expires_at: '2023-11-07T05:31:56Z'
}
})
};
fetch('https://api.example.com/api/registry/mcp-servers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/registry/mcp-servers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => '<string>',
'scope' => 'personal',
'name' => '',
'display_name' => '',
'description' => '',
'sharing' => 'per_user',
'version' => '0.1.0',
'credential' => [
'value' => '<string>',
'kind' => 'bearer',
'header_name' => 'Authorization',
'refresh_value' => '<string>',
'token_url' => '<string>',
'client_id' => '<string>',
'expires_at' => '2023-11-07T05:31:56Z'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/registry/mcp-servers"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"scope\": \"personal\",\n \"name\": \"\",\n \"display_name\": \"\",\n \"description\": \"\",\n \"sharing\": \"per_user\",\n \"version\": \"0.1.0\",\n \"credential\": {\n \"value\": \"<string>\",\n \"kind\": \"bearer\",\n \"header_name\": \"Authorization\",\n \"refresh_value\": \"<string>\",\n \"token_url\": \"<string>\",\n \"client_id\": \"<string>\",\n \"expires_at\": \"2023-11-07T05:31:56Z\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/registry/mcp-servers")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"scope\": \"personal\",\n \"name\": \"\",\n \"display_name\": \"\",\n \"description\": \"\",\n \"sharing\": \"per_user\",\n \"version\": \"0.1.0\",\n \"credential\": {\n \"value\": \"<string>\",\n \"kind\": \"bearer\",\n \"header_name\": \"Authorization\",\n \"refresh_value\": \"<string>\",\n \"token_url\": \"<string>\",\n \"client_id\": \"<string>\",\n \"expires_at\": \"2023-11-07T05:31:56Z\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/registry/mcp-servers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"scope\": \"personal\",\n \"name\": \"\",\n \"display_name\": \"\",\n \"description\": \"\",\n \"sharing\": \"per_user\",\n \"version\": \"0.1.0\",\n \"credential\": {\n \"value\": \"<string>\",\n \"kind\": \"bearer\",\n \"header_name\": \"Authorization\",\n \"refresh_value\": \"<string>\",\n \"token_url\": \"<string>\",\n \"client_id\": \"<string>\",\n \"expires_at\": \"2023-11-07T05:31:56Z\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "agent",
"scope": "personal",
"name": "<string>",
"display_name": "<string>",
"description": "<string>",
"owner_id": "<string>",
"is_system": true,
"updated_at": "2023-11-07T05:31:56Z",
"versions": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"artifact_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": "<string>",
"status": "draft",
"spec": {},
"changelog": "<string>",
"created_by": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"submitted_by": "<string>",
"submitted_at": "2023-11-07T05:31:56Z",
"reviewed_by": "<string>",
"reviewed_at": "2023-11-07T05:31:56Z",
"review_reason": "<string>",
"deprecated_at": "2023-11-07T05:31:56Z",
"withdrawn_at": "2023-11-07T05:31:56Z",
"withdrawn_reason": "<string>",
"promoted_from_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"used_in_templates": 0
}
],
"parent_artifact_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"promoted_from_artifact_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"latest_version": "<string>",
"latest_status": "draft",
"latest_approved_version": "<string>",
"has_draft": false,
"used_in_templates": 0,
"used_in_agents": 123,
"write": true,
"needs_sign_off": true,
"sensitivity": "<string>",
"health": "ok",
"can_use": true
}{
"error": "<string>",
"code": 500
}{
"error": "<string>",
"code": 500
}{
"error": "<string>",
"code": 500
}{
"error": "<string>",
"code": 500
}Register an MCP server
Record an MCP server by its URL.
How it signs in is found from the server: none (tools are discovered at
once), an API key (send it as credential), or OAuth (then call
oauth/start). For a Global server, sharing picks each person’s own
account (default) or one shared connection. Any public https URL works;
internal hosts must be listed in NLP_API_REGISTRY_MCP_INTERNAL_HOSTS.
Each discovered tool becomes a tool artifact.
curl --request POST \
--url https://api.example.com/api/registry/mcp-servers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"scope": "personal",
"name": "",
"display_name": "",
"description": "",
"sharing": "per_user",
"version": "0.1.0",
"credential": {
"value": "<string>",
"kind": "bearer",
"header_name": "Authorization",
"refresh_value": "<string>",
"token_url": "<string>",
"client_id": "<string>",
"expires_at": "2023-11-07T05:31:56Z"
}
}
'import requests
url = "https://api.example.com/api/registry/mcp-servers"
payload = {
"url": "<string>",
"scope": "personal",
"name": "",
"display_name": "",
"description": "",
"sharing": "per_user",
"version": "0.1.0",
"credential": {
"value": "<string>",
"kind": "bearer",
"header_name": "Authorization",
"refresh_value": "<string>",
"token_url": "<string>",
"client_id": "<string>",
"expires_at": "2023-11-07T05:31:56Z"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
url: '<string>',
scope: 'personal',
name: '',
display_name: '',
description: '',
sharing: 'per_user',
version: '0.1.0',
credential: {
value: '<string>',
kind: 'bearer',
header_name: 'Authorization',
refresh_value: '<string>',
token_url: '<string>',
client_id: '<string>',
expires_at: '2023-11-07T05:31:56Z'
}
})
};
fetch('https://api.example.com/api/registry/mcp-servers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/registry/mcp-servers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => '<string>',
'scope' => 'personal',
'name' => '',
'display_name' => '',
'description' => '',
'sharing' => 'per_user',
'version' => '0.1.0',
'credential' => [
'value' => '<string>',
'kind' => 'bearer',
'header_name' => 'Authorization',
'refresh_value' => '<string>',
'token_url' => '<string>',
'client_id' => '<string>',
'expires_at' => '2023-11-07T05:31:56Z'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/registry/mcp-servers"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"scope\": \"personal\",\n \"name\": \"\",\n \"display_name\": \"\",\n \"description\": \"\",\n \"sharing\": \"per_user\",\n \"version\": \"0.1.0\",\n \"credential\": {\n \"value\": \"<string>\",\n \"kind\": \"bearer\",\n \"header_name\": \"Authorization\",\n \"refresh_value\": \"<string>\",\n \"token_url\": \"<string>\",\n \"client_id\": \"<string>\",\n \"expires_at\": \"2023-11-07T05:31:56Z\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/registry/mcp-servers")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"scope\": \"personal\",\n \"name\": \"\",\n \"display_name\": \"\",\n \"description\": \"\",\n \"sharing\": \"per_user\",\n \"version\": \"0.1.0\",\n \"credential\": {\n \"value\": \"<string>\",\n \"kind\": \"bearer\",\n \"header_name\": \"Authorization\",\n \"refresh_value\": \"<string>\",\n \"token_url\": \"<string>\",\n \"client_id\": \"<string>\",\n \"expires_at\": \"2023-11-07T05:31:56Z\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/registry/mcp-servers")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"scope\": \"personal\",\n \"name\": \"\",\n \"display_name\": \"\",\n \"description\": \"\",\n \"sharing\": \"per_user\",\n \"version\": \"0.1.0\",\n \"credential\": {\n \"value\": \"<string>\",\n \"kind\": \"bearer\",\n \"header_name\": \"Authorization\",\n \"refresh_value\": \"<string>\",\n \"token_url\": \"<string>\",\n \"client_id\": \"<string>\",\n \"expires_at\": \"2023-11-07T05:31:56Z\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "agent",
"scope": "personal",
"name": "<string>",
"display_name": "<string>",
"description": "<string>",
"owner_id": "<string>",
"is_system": true,
"updated_at": "2023-11-07T05:31:56Z",
"versions": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"artifact_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"version": "<string>",
"status": "draft",
"spec": {},
"changelog": "<string>",
"created_by": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"submitted_by": "<string>",
"submitted_at": "2023-11-07T05:31:56Z",
"reviewed_by": "<string>",
"reviewed_at": "2023-11-07T05:31:56Z",
"review_reason": "<string>",
"deprecated_at": "2023-11-07T05:31:56Z",
"withdrawn_at": "2023-11-07T05:31:56Z",
"withdrawn_reason": "<string>",
"promoted_from_version_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"used_in_templates": 0
}
],
"parent_artifact_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"promoted_from_artifact_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"latest_version": "<string>",
"latest_status": "draft",
"latest_approved_version": "<string>",
"has_draft": false,
"used_in_templates": 0,
"used_in_agents": 123,
"write": true,
"needs_sign_off": true,
"sensitivity": "<string>",
"health": "ok",
"can_use": true
}{
"error": "<string>",
"code": 500
}{
"error": "<string>",
"code": 500
}{
"error": "<string>",
"code": 500
}{
"error": "<string>",
"code": 500
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Body
Register an MCP server by its URL. Nothing is provisioned.
How it signs in is found from the server; sharing decides, for a
Global server, whether each person connects their own account or one
shared connection is used. auth_mode overrides the inference.
2048Who an artifact is for. tenant is shown as "Global".
personal, tenant 1282002000per_user, shared none, passthrough, user_credential, service_credential Connect a credential now, so discovery can run at once.
Show child attributes
Show child attributes
Response
Successful Response
An artifact with all its versions.
What an artifact is.
agent, skill, mcp_server, tool, context_pack, ontology, prompt, workflow, brand, code_repo Who an artifact is for. tenant is shown as "Global".
personal, tenant Show child attributes
Show child attributes
Newest version of any status.
Lifecycle of one version.
draft, submitted, approved, rejected, deprecated, withdrawn Context packs only: visible agents whose newest version loads it.
Tools only: effective write flag.
Tools only: a write tool not yet signed off.
Context packs only: the newest approved version's effective sensitivity.
Context packs only: whether its items resolve.
ok, stale, broken False: you are limited and it is given to you to view only.
Was this page helpful?

