curl --request POST \
--url https://{command_center_host}/api/v1/agents/{id}/plugins \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"plugin_id": "<string>"
}
'import requests
url = "https://{command_center_host}/api/v1/agents/{id}/plugins"
payload = { "plugin_id": "<string>" }
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({plugin_id: '<string>'})
};
fetch('https://{command_center_host}/api/v1/agents/{id}/plugins', 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://{command_center_host}/api/v1/agents/{id}/plugins",
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([
'plugin_id' => '<string>'
]),
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://{command_center_host}/api/v1/agents/{id}/plugins"
payload := strings.NewReader("{\n \"plugin_id\": \"<string>\"\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://{command_center_host}/api/v1/agents/{id}/plugins")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"plugin_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{command_center_host}/api/v1/agents/{id}/plugins")
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 \"plugin_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "agt_a9bf5a2b-...",
"name": "linux-ops - web-01",
"status": "idle",
"org_id": "org_460b541c-...",
"tenant_id": "ten_115bea44-...",
"host_id": "hst_8272f9b4-...",
"specialty_id": "spc_9e274f8c-...",
"main_engine": "qwen3-coder-480b",
"secondary_engine": "qwen3-coder-30b",
"credential_config": [
{
"credential_id": "crd_1f3c8a90-...",
"credential_role": "ssh_username",
"order": 123,
"is_required": true
}
],
"disabled_rule_ids": [
"<string>"
],
"accessible_credential_ids": [
"<string>"
],
"created_at": "2026-08-26T10:00:26.380Z",
"updated_at": "2026-08-26T10:00:26.380Z",
"plugin_count": 1
}{
"code": "VALIDATION_FAILED",
"message": "Validation failed",
"request_id": "req_3702b7e7-...",
"field": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
],
"details": {}
}{
"code": "VALIDATION_FAILED",
"message": "Validation failed",
"request_id": "req_3702b7e7-...",
"field": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
],
"details": {}
}{
"code": "VALIDATION_FAILED",
"message": "Validation failed",
"request_id": "req_3702b7e7-...",
"field": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
],
"details": {}
}{
"code": "VALIDATION_FAILED",
"message": "Validation failed",
"request_id": "req_3702b7e7-...",
"field": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
],
"details": {}
}Save a plugin assignment
Assigns a plugin to the agent and returns the agent, not the assignment. Saving a plugin the agent already holds changes nothing, and no endpoint or credential is contacted.
curl --request POST \
--url https://{command_center_host}/api/v1/agents/{id}/plugins \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"plugin_id": "<string>"
}
'import requests
url = "https://{command_center_host}/api/v1/agents/{id}/plugins"
payload = { "plugin_id": "<string>" }
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({plugin_id: '<string>'})
};
fetch('https://{command_center_host}/api/v1/agents/{id}/plugins', 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://{command_center_host}/api/v1/agents/{id}/plugins",
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([
'plugin_id' => '<string>'
]),
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://{command_center_host}/api/v1/agents/{id}/plugins"
payload := strings.NewReader("{\n \"plugin_id\": \"<string>\"\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://{command_center_host}/api/v1/agents/{id}/plugins")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"plugin_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{command_center_host}/api/v1/agents/{id}/plugins")
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 \"plugin_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "agt_a9bf5a2b-...",
"name": "linux-ops - web-01",
"status": "idle",
"org_id": "org_460b541c-...",
"tenant_id": "ten_115bea44-...",
"host_id": "hst_8272f9b4-...",
"specialty_id": "spc_9e274f8c-...",
"main_engine": "qwen3-coder-480b",
"secondary_engine": "qwen3-coder-30b",
"credential_config": [
{
"credential_id": "crd_1f3c8a90-...",
"credential_role": "ssh_username",
"order": 123,
"is_required": true
}
],
"disabled_rule_ids": [
"<string>"
],
"accessible_credential_ids": [
"<string>"
],
"created_at": "2026-08-26T10:00:26.380Z",
"updated_at": "2026-08-26T10:00:26.380Z",
"plugin_count": 1
}{
"code": "VALIDATION_FAILED",
"message": "Validation failed",
"request_id": "req_3702b7e7-...",
"field": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
],
"details": {}
}{
"code": "VALIDATION_FAILED",
"message": "Validation failed",
"request_id": "req_3702b7e7-...",
"field": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
],
"details": {}
}{
"code": "VALIDATION_FAILED",
"message": "Validation failed",
"request_id": "req_3702b7e7-...",
"field": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
],
"details": {}
}{
"code": "VALIDATION_FAILED",
"message": "Validation failed",
"request_id": "req_3702b7e7-...",
"field": "<string>",
"errors": [
{
"field": "<string>",
"message": "<string>"
}
],
"details": {}
}Authorizations
An API key minted in Command Center (Settings -> API Keys), sent as Authorization: Bearer 2501_ak_.... A Command Center session cookie is also accepted.
Path Parameters
Body
The plugin to assign. One the agent's organization cannot use, unknown, hidden from the caller or another organization's, returns 400 with details.plugin_ids.
Response
The agent
"agt_a9bf5a2b-..."
"linux-ops - web-01"
idle, running, error, archived "org_460b541c-..."
"ten_115bea44-..."
"hst_8272f9b4-..."
"spc_9e274f8c-..."
"qwen3-coder-480b"
"qwen3-coder-30b"
Show child attributes
Show child attributes
"2026-08-26T10:00:26.380Z"
"2026-08-26T10:00:26.380Z"
Effective direct and specialty-inherited MCP assignments, present on list and search responses
x >= 0
