curl --request POST \
--url https://api.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"auth": {
"type": "none"
}
}
'import requests
url = "https://api.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools"
payload = {
"url": "<string>",
"auth": { "type": "none" }
}
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>', auth: {type: 'none'}})
};
fetch('https://api.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools', 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.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools",
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>',
'auth' => [
'type' => 'none'
]
]),
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.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"auth\": {\n \"type\": \"none\"\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.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"auth\": {\n \"type\": \"none\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools")
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 \"auth\": {\n \"type\": \"none\"\n }\n}"
response = http.request(request)
puts response.read_body{
"protocol_version": "<string>",
"server_info": {
"name": "<string>",
"version": "<string>",
"title": "<string>",
"description": "<string>",
"website_url": "<string>"
},
"tools": [
{
"name": "<string>",
"input_schema": {},
"title": "<string>",
"description": "<string>",
"output_schema": {},
"annotations": {
"title": "<string>",
"read_only_hint": true,
"destructive_hint": true,
"idempotent_hint": true,
"open_world_hint": true
}
}
]
}{
"error": "<string>",
"code": "invalid_request",
"issues": [
{
"path": "<string>",
"message": "<string>",
"line": 2,
"column": 2
}
]
}{
"error": "<string>",
"code": "invalid_request",
"issues": [
{
"path": "<string>",
"message": "<string>",
"line": 2,
"column": 2
}
]
}{
"error": "<string>",
"code": "invalid_request",
"issues": [
{
"path": "<string>",
"message": "<string>",
"line": 2,
"column": 2
}
]
}{
"error": "<string>",
"code": "invalid_request",
"issues": [
{
"path": "<string>",
"message": "<string>",
"line": 2,
"column": 2
}
]
}{
"error": "<string>",
"code": "unprocessable",
"auth": {
"type": "oauth",
"scopes": [
"<string>"
],
"authorization_server": "<string>"
}
}{
"error": "<string>",
"code": "invalid_request",
"issues": [
{
"path": "<string>",
"message": "<string>",
"line": 2,
"column": 2
}
]
}{
"error": "<string>",
"code": "invalid_request",
"issues": [
{
"path": "<string>",
"message": "<string>",
"line": 2,
"column": 2
}
]
}{
"error": "<string>",
"code": "invalid_request"
}{
"error": "<string>",
"code": "internal_error"
}List an MCP server's tools
Connects to a remote MCP server over streamable HTTP, completes the initialize handshake, and returns the server’s tools/list result. The request is not stored; use it to preview which tools a server exposes before referencing it from an agent config. Authentication mirrors the agent config mcp_servers.<key>.auth shape and resolves secrets available to the project. When the server rejects the connection with HTTP 401 or 403, the API probes the server’s authorization requirements and responds 422 with an auth hint — oauth when the server advertises an OAuth authorization server, bearer when it expects a token but advertises no OAuth metadata.
curl --request POST \
--url https://api.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"auth": {
"type": "none"
}
}
'import requests
url = "https://api.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools"
payload = {
"url": "<string>",
"auth": { "type": "none" }
}
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>', auth: {type: 'none'}})
};
fetch('https://api.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools', 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.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools",
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>',
'auth' => [
'type' => 'none'
]
]),
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.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"auth\": {\n \"type\": \"none\"\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.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"auth\": {\n \"type\": \"none\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.omnara.com/v1/orgs/{orgID}/projects/{projectID}/mcp-servers/tools")
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 \"auth\": {\n \"type\": \"none\"\n }\n}"
response = http.request(request)
puts response.read_body{
"protocol_version": "<string>",
"server_info": {
"name": "<string>",
"version": "<string>",
"title": "<string>",
"description": "<string>",
"website_url": "<string>"
},
"tools": [
{
"name": "<string>",
"input_schema": {},
"title": "<string>",
"description": "<string>",
"output_schema": {},
"annotations": {
"title": "<string>",
"read_only_hint": true,
"destructive_hint": true,
"idempotent_hint": true,
"open_world_hint": true
}
}
]
}{
"error": "<string>",
"code": "invalid_request",
"issues": [
{
"path": "<string>",
"message": "<string>",
"line": 2,
"column": 2
}
]
}{
"error": "<string>",
"code": "invalid_request",
"issues": [
{
"path": "<string>",
"message": "<string>",
"line": 2,
"column": 2
}
]
}{
"error": "<string>",
"code": "invalid_request",
"issues": [
{
"path": "<string>",
"message": "<string>",
"line": 2,
"column": 2
}
]
}{
"error": "<string>",
"code": "invalid_request",
"issues": [
{
"path": "<string>",
"message": "<string>",
"line": 2,
"column": 2
}
]
}{
"error": "<string>",
"code": "unprocessable",
"auth": {
"type": "oauth",
"scopes": [
"<string>"
],
"authorization_server": "<string>"
}
}{
"error": "<string>",
"code": "invalid_request",
"issues": [
{
"path": "<string>",
"message": "<string>",
"line": 2,
"column": 2
}
]
}{
"error": "<string>",
"code": "invalid_request",
"issues": [
{
"path": "<string>",
"message": "<string>",
"line": 2,
"column": 2
}
]
}{
"error": "<string>",
"code": "invalid_request"
}{
"error": "<string>",
"code": "internal_error"
}Authorizations
An opaque Omnara personal or organization bearer token.
Path Parameters
^org_[a-z2-7]{26}$^proj_[a-z2-7]{26}$Body
Streamable HTTP MCP endpoint. Must use HTTPS, except that HTTP is allowed for loopback hosts during local development.
1 - 2048How Omnara authenticates to the MCP server. Secret references must be available to the project, either owned by it or granted to it.
- Option 1
- Option 2
- Option 3
- Option 4
Show child attributes
Show child attributes