curl --request GET \
--url https://api.runaether.dev/v1/integration-search \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.runaether.dev/v1/integration-search"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.runaether.dev/v1/integration-search', 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.runaether.dev/v1/integration-search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.runaether.dev/v1/integration-search"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.runaether.dev/v1/integration-search")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/v1/integration-search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"results": [
{
"installed": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "plugin"
},
"kind": "aether",
"server": {
"aliases": [
"<string>"
],
"category": "source_control",
"default_credential_policy": "creator",
"description": "<string>",
"display_name": "<string>",
"key": "<string>",
"url": "<string>"
}
}
],
"sources": [
{
"kind": "directory",
"status": {
"state": "available"
}
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "org_membership_required",
"error": "<string>"
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}Search integrations by name
Finds integrations across Aether’s own MCP servers, Aether’s integration directory and the organization’s plugin marketplaces (the official Claude Code and Codex ones), one result per integration: one of Aether’s servers the organization’s catalog holds, installed already; an integration of the directory, installed by its key; or a plugin a marketplace lists, installed by the marketplace’s URL and its name. The MCP registry is searched apart (searchIntegrationRegistry). Every word of q must be in an integration’s name, an alias, its description or its category, or in a marketplace plugin’s name or category: a plugin’s description is its vendor’s copy, which names other products. Aether’s servers and the directory’s integrations come first, then the marketplaces’ plugins, each group those matching by name or alias before the others. Aether’s servers and a directory entry hide every marketplace plugin of their names, the one an entry prefers included. An integration’s source says what it contains and its default_credential_policy whose connection it takes; a marketplace’s listing does not say what a plugin bundles, which Aether reads from its files when it installs it. installed names the card of what the organization installed: one of Aether’s servers; an integration’s plugin or, installed as its server alone, that server; the organization’s plugin of a marketplace plugin’s name. It is absent for what is not installed. sources reports every source with its status: a marketplace Aether could not read is unavailable, with why, and contributes no results; it is never reported as listing none. A marketplace’s listing is read again once it is ten minutes old, and a marketplace that could not be read is tried again a minute later.
curl --request GET \
--url https://api.runaether.dev/v1/integration-search \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.runaether.dev/v1/integration-search"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.runaether.dev/v1/integration-search', 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.runaether.dev/v1/integration-search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.runaether.dev/v1/integration-search"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.runaether.dev/v1/integration-search")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.runaether.dev/v1/integration-search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"results": [
{
"installed": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"kind": "plugin"
},
"kind": "aether",
"server": {
"aliases": [
"<string>"
],
"category": "source_control",
"default_credential_policy": "creator",
"description": "<string>",
"display_name": "<string>",
"key": "<string>",
"url": "<string>"
}
}
],
"sources": [
{
"kind": "directory",
"status": {
"state": "available"
}
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"code": "org_membership_required",
"error": "<string>"
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}{
"error": "<string>",
"code": "<string>",
"errors": [
{
"location": "<string>",
"message": "<string>",
"value": "<unknown>"
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
What to find: each of its words matched, ignoring case, against each integration's name and aliases, then its description and category; a marketplace plugin's against its name, then its category.
1 - 100\SResponse
OK
One per integration whose name, aliases, description or category hold every word of the query (a marketplace plugin by its name and category alone: its description is its vendor's copy): Aether's servers and a directory entry hide every marketplace plugin of their names, the one an entry prefers included, and of the plugins marketplaces list under one name the first that matches is the result. Aether's servers and the directory's integrations come first, then the marketplaces' plugins, each group those whose name or aliases hold every word before the others; within each, Aether's servers, then the directory's, then each marketplace's in turn.
- Option 1
- Option 2
- Option 3
Show child attributes
Show child attributes
The integration directory, then each of the organization's marketplaces, each with its status.
- Option 1
- Option 2
Show child attributes
Show child attributes