List connectors
Every connector visible to the caller, with connection status and account state.
https://api.corespeed.io/connectorsAuthorizations
AuthorizationstringheaderrequiredBearer <sk-cs-…>— a CoreSpeed API key, or a user session JWT.x-api-key: <sk-cs-…>is accepted in its place.
The array holds two entry variants, discriminated by the presence of kind:
- OAuth connector — no
kindfield. Carriesauthand a realicon_url. - Remote MCP connector —
kind: "remote-mcp", an org-registered upstream MCP server. Carries aremoteblock, noauth,icon_url: null, and always an emptyaccountsarray.
A client that requires auth or a non-null icon_url will reject valid remote
entries. Branch on kind first.
Shared fields
idstringrequiredConnector id (a slug for remote entries), and the prefix of its tool names (
notion__create_page).kind"remote-mcp"optionalPresent only on org-registered remote MCP connectors. Absent on OAuth connectors — that absence is the discriminator.
categorystringrequired"connector"on both variants.namestringrequiredDisplay name as the provider brands it, or the registered display name.
descriptionstringrequiredWhat the connector's tools can do. On remote entries this is generated and marks the upstream as self-described and unverified.
urlstringrequiredThe connector's own resource URL on this host.
mcp_urlstringrequiredAlways the unified
POST /mcpendpoint. Per-connector MCP URLs are retired and return404.statusstringrequired"connected" | "needs_reauth" | "disconnected"for this caller.icon_urlstring | nullrequiredIcon URL. The field is
icon_url— noticon— and it isnullon remote entries.accountsarrayrequiredConnected accounts visible to this caller. Empty when disconnected, and always empty on remote entries.
OAuth connector only
authobjectrequiredOAuth grant metadata. See the four shapes below. Never present on remote entries.
Remote MCP connector only
remote.upstream_urlstringrequiredThe registered upstream MCP server URL.
remote.auth_modestringrequiredHow CoreSpeed authenticates to the upstream.
"none"additionally carries aremote.warning.remote.tool_countnumber | nullrequiredTools in the last snapshot, or
nulluntil the first successful snapshot — a registration is kept when its initial snapshot fails or while OAuth authorization is still pending. The single-connector read (GET /connectors/:id) also returnsremote.tools. Those are CoreSpeed snapshot records, not upstream MCPToolobjects: each carries the sanitized publishedname, theoriginal_nameit maps back to, a snake-caseinput_schema, and aschema_hash. A client readinginputSchemaoff these will find nothing.remote.snapshot_fetched_atstring | nullrequiredWhen that snapshot was taken,
nullin the same no-snapshot case. So isremote.full_schema_hash— a bare SHA-256 as 64 lowercase hex characters, with nosha256:prefix to strip. Treat all three as one signal: null means "this upstream has never answered yet", not "no tools".remote.created_by_user_idandremote.created_atare always present.remote.oauthobjectoptionalPresent when the upstream uses OAuth.
Account fields
accounts[].idstringrequiredStable account id.
accounts[].aliasstringrequiredHuman-chosen label. Use the alias to select an account instead of putting a provider account id or token into a prompt.
accounts[].identitystringrequiredHow the provider identifies the account (handle, workspace, mailbox).
accounts[].scopestringrequired"private"(owned by one member) or"shared"(available inside the organization).accounts[].statusstringrequired"connected"or"needs_reauth". Aneeds_reauthaccount still contributes tools, and those calls fail until it is reauthorized.accounts[].can_removebooleanrequiredWhether this caller may remove the account. Private accounts: the owning member only. Shared accounts: the creator or an organization admin.
The four grant shapes
auth.scopesstring[]requiredRequired request-time grants, described by
scope_descriptions(same keys).auth.optional_scopesstring[]optionalProvider-optional grants, described by
optional_scope_descriptions. An unavailable optional grant does not block the connection.auth.user_scopesstring[]optionalGrants issued to a separate authorizing-user token — tools that act with the connecting user's own identity — described by
user_scope_descriptions.auth.access_summarystringoptionalUsed when the provider fixes access in its app registration instead of accepting meaningful request scopes. Then
scopesis empty. Mutually exclusive with request scopes.
curl https://api.corespeed.io/connectors \
-H "Authorization: Bearer $CORESPEED_API_KEY"const res = await fetch("https://api.corespeed.io/connectors", {
headers: { Authorization: `Bearer ${process.env.CORESPEED_API_KEY}` },
});
const { connectors } = await res.json();
for (const connector of connectors) {
console.log(connector.id, connector.status, connector.accounts.length);
}import os
import httpx
res = httpx.get(
"https://api.corespeed.io/connectors",
headers={"Authorization": f"Bearer {os.environ['CORESPEED_API_KEY']}"},
)
for connector in res.json()["connectors"]:
print(connector["id"], connector["status"], len(connector["accounts"]))package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("GET", "https://api.corespeed.io/connectors", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("CORESPEED_API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var out struct {
Connectors []struct {
ID string `json:"id"`
Status string `json:"status"`
Accounts []struct {
Alias string `json:"alias"`
} `json:"accounts"`
} `json:"connectors"`
}
json.NewDecoder(res.Body).Decode(&out)
for _, c := range out.Connectors {
fmt.Println(c.ID, c.Status, len(c.Accounts))
}
}{
"connectors": [
{
"id": "notion",
"category": "connector",
"name": "Notion",
"description": "Read and write pages and databases in a Notion workspace.",
"auth": {
"type": "oauth2",
"scopes": [],
"access_summary": "Read & write pages and databases shared with this Notion connection, including their accessible children."
},
"url": "https://api.corespeed.io/connectors/notion",
"mcp_url": "https://api.corespeed.io/mcp",
"icon_url": "https://api.corespeed.io/icons/notion.svg",
"status": "connected",
"accounts": [
{
"id": "acct_01J…",
"alias": "product-wiki",
"identity": "Acme workspace",
"scope": "private",
"status": "connected",
"can_remove": true
}
]
}
]
}kind: "remote-mcp" — no auth, icon_url: null, accounts empty, and a
remote block instead. Remote entries share the one connectors array with
OAuth entries; the top-level shape never changes.
{
"connectors": [
{
"id": "acme-internal",
"kind": "remote-mcp",
"category": "connector",
"name": "Acme internal tools",
"description": "Org-registered remote MCP server at mcp.acme.internal (upstream self-described, unverified).",
"url": "https://api.corespeed.io/connectors/acme-internal",
"mcp_url": "https://api.corespeed.io/mcp",
"icon_url": null,
"status": "connected",
"accounts": [],
"remote": {
"upstream_url": "https://mcp.acme.internal/mcp",
"auth_mode": "oauth",
"tool_count": 12,
"snapshot_fetched_at": "2026-07-24T09:12:04Z",
"full_schema_hash": "9f2c1ab4e7d05836bc41f0a29d7e655813cf84a0b2e7d691c5038af74be2019d",
"created_by_user_id": "user_01J…",
"created_at": "2026-07-02T18:40:11Z"
}
}
]
}No meaningful request scopes: scopes is empty and access_summary describes
the access the provider's app registration grants.
{
"auth": {
"type": "oauth2",
"scopes": [],
"access_summary": "Read and write the repositories you choose when installing the app."
}
}{
"auth": {
"type": "oauth2",
"scopes": ["chat:write", "users:read"],
"scope_descriptions": {
"chat:write": "send messages as the CoreSpeed app",
"users:read": "see workspace members"
},
"optional_scopes": ["canvases:write"],
"optional_scope_descriptions": {
"canvases:write": "create and edit canvases"
},
"user_scopes": ["chat:write", "im:write"],
"user_scope_descriptions": {
"chat:write": "send messages as you",
"im:write": "start direct messages as you"
}
}
}