Overview
- An integration is a configured source (for example your Anthropic account). Each has a connector that runs discovery through an adapter.
- Adapters run in mock mode (fictional data, for evaluation) or live mode (calls the provider's API with a credential you reference).
- Discovery never writes: adapters list and read, and change nothing in the source system.
- Results are reconciled into the registry: new agents, models, MCP servers, tools, resources, identities and permissions are added; risk scores and the Agent Security Graph are recalculated afterwards.
Connector catalogue
Every adapter is available in mock mode. Live modes have the status shown.
| Kind | Live mode reads | Configuration | Live status |
|---|---|---|---|
anthropic | Models, and managed agents where the API key has access (otherwise the model inventory) | environment | Preview |
openai | The models available to the account | base_url (default the OpenAI API; HTTPS required) | Preview |
mcp | One MCP server's identity and tool list (see below) | endpoint, name, tool_prefix | Beta |
entra_id | Service principals carrying a tag (default cydra-agent), via Microsoft Graph | directory_tenant_id, client_id, agent_tag | Preview |
github | Agent manifests (.cydra/agent.json) in the organisation's repositories (up to 100) | organisation | Preview |
Agents built on other platforms can be registered in the portal, through the API, or with a manifest in GitHub. The integrations planned next are listed on the platform page.
Running discovery
- Create an integration: Integrations → Add integration (kind, name, mode, an optional credential reference and non-secret JSON configuration).
- Choose Run discovery. Runs are manual in this release. You can pass an
idempotency_keythrough the API so a retried request returns the original run. - Each run records its status (
running, thensucceededorfailed), counters (agents, models, MCP servers, tools, resources and identities added; tools changed; findings opened), warnings and any error. Runs are audited.
How results are reconciled
| Record | Matched on | Behaviour |
|---|---|---|
| Agents | External reference | New agents are added with an owner-attestation finding; existing agents get a last-seen time and a new version when their model or description changes |
| MCP servers | Endpoint | New servers with unknown or unsigned provenance open a finding; a change in the server's tool set opens a finding and moves an approved server back to unknown |
| Tools | Tool key | New financial, destructive and admin tools require single approval by default; schema changes are recorded |
| Models, resources | Provider and name / name | Added when new; existing records are kept |
Discovery never deletes records. Items that disappear from a source stay in the registry until you remove or contain them.
Credentials
- Live adapters use a credential reference: a pointer to a secret in your secret store (provider and path), never the secret itself. Integration configuration rejects keys such as
secret,password,api_key,tokenandclient_secret. - The secret is resolved at run time and sent to the provider's own endpoint and nowhere else. It is never stored or returned by CydraLabs.
- Credential references can be revoked or rotated as a containment action.
- Outbound requests from live adapters are checked against SSRF rules: loopback, private, link-local and cloud metadata addresses are refused.
MCP discovery
The MCP connector reads one server over the streamable HTTP transport:
initialize(protocol version2025-06-18, clientcydra-discovery), keeping theMcp-Session-Idthe server returns.notifications/initialized, thentools/list. JSON and server-sent-event responses are accepted (up to 2 MB); redirects are not followed.- Each tool becomes
<tool_prefix>.<tool name>with its title, description and input schema.
CydraLabs assigns each tool a privilege class (read, write, destructive, financial or admin) from its name and description, independently of what the server claims. A server's readOnlyHint annotation is recorded: if the server declares a tool as not modifying anything while CydraLabs classifies it as able to change something, a high severity tool poisoning finding is opened. Security teams can reclassify any tool.
MCP trust states
| State | Meaning | Effect |
|---|---|---|
approved | Provenance reviewed and accepted | Its tools are evaluated like any other granted tool |
unknown | Not reviewed (the default for discovered servers) | Privileged tools denied; adds 6 points to the Agent Risk Score |
unsigned | Provenance cannot be established | Privileged tools denied; adds 12 points |
quarantined | Deliberately isolated by your security team | Privileged tools denied; adds 12 points |
- "Privileged" means write, destructive, financial or admin. Baseline rule POL-006 denies those calls with
UNTRUSTED_MCP_PRIVILEGED_TOOL; read tools stay available. To stop a specific tool entirely, block it. - Changing a trust state (
PATCH /api/v1/mcp-servers/{id}with a reason) needs theinventory:controlpermission and is written to the audit log and the evidence chain. - If a later discovery finds that an approved server's tools changed (a different capability hash), the server returns to
unknownand a finding is opened, so changed tools are reviewed before privileged use. - In the Agent Security Graph, servers appear as
mcp_servernodes linked to the tools they expose and the agents that use them; unknown, unsigned and quarantined servers are highlighted on high-risk paths.
MCP mediation
Agents send each proposed MCP tool call to CydraGateway as an action, before calling the tool. The gateway resolves the tool and its MCP server, adds tool.target_type = "mcp_tool" and the server's tool.mcp_trust_state to the decision input, and applies the same ten-step decision as any other action: policy, inspection, approval and evidence. See the architecture and policy language.
POST /api/v1/actions
Authorization: Bearer <agent workload token>
Idempotency-Key: crm-update-7f3c
{
"tool": "hr-records.employees.update",
"operation": "invoke",
"target": "hr://employees/E-1042",
"parameters": {"employee_id": "E-1042", "department": "Finance"},
"justification": "Transfer approved by HR ticket HR-5521"
}GitHub agent manifest
The GitHub connector reads .cydra/agent.json from each repository. One manifest describes one agent:
{
"name": "Code Review Agent",
"description": "Reviews pull requests and suggests changes",
"purpose": "Developer productivity",
"framework": "langgraph",
"environment": "production",
"owner": {"name": "Sam Rivera", "email": "sam.rivera@example.com"},
"tools": ["github.pull_requests.read", "github.comments.create"]
}Tool keys listed in the manifest become permissions for the agent when the tools exist in your inventory (for example from the MCP connector).
Connector contract
Adapters implement one small interface, which keeps model, identity and developer platforms interchangeable. Pilot customers can add adapters for their own systems with CydraLabs.
class ConnectorAdapter(Protocol):
key: str # e.g. "mcp" or "mock.mcp"
kind: str # openai | anthropic | mcp | entra_id | github
mode: str # "live" or "mock"
def discover(self, config: dict[str, Any], secret: str | None) -> DiscoveryResult: ...| Element | Fields |
|---|---|
DiscoveryResult | adapter, mode, agents, models, mcp_servers, resources, warnings |
DiscoveredAgent | external_ref, name, description, purpose, framework, environment, model, owner name and email, data classification, exposure attributes (internet, code execution, memory, approval coverage), business unit, identities, tool and resource grants, delegations |
DiscoveredMCPServer | name, endpoint, transport, auth type, publisher, trust state, protocol version, tools |
DiscoveredTool | tool_key, name, description, privilege class, input schema, declared readOnlyHint, operations, related data or API resource, idempotent |
DiscoveredModel | provider, model name and version, hosting, data policy |
DiscoveredResource | name, kind (data or api), system, classification, contains personal data, base URL |
DiscoveredIdentity | identity type, subject, issuer, authentication strength |
Adapters raise a connector error for expected failures (for example a missing credential); the run is then recorded as failed with the message.
Endpoints
| Endpoint | Permission | Purpose |
|---|---|---|
GET /integrations | integration:read | Integrations and their connectors |
GET /integrations/catalogue | integration:read | Adapters and their status |
POST /integrations | integration:manage | Create an integration (kind, name, mode, configuration, credential reference) |
POST /integrations/{id}/status | integration:manage | Activate or disable an integration |
POST /connectors/{id}/run | connector:run | Run discovery now |
GET /connectors/{id}/runs | integration:read | Run history (last 50) |
POST /connectors/{id}/enabled | integration:manage | Enable or disable a connector (containment) |
GET / POST /mcp-servers | inventory:read / inventory:write | List or register MCP servers |
PATCH /mcp-servers/{id} | inventory:control | Change trust state (with a reason) |
GET / POST /tools, PATCH /tools/{id} | inventory:read / inventory:write | List, register or reclassify tools |
POST /tools/{id}/block | inventory:control | Block or unblock a tool |
POST /resources/credentials | integration:manage | Register a credential reference |
All paths are under /api/v1. Full request and response details are in the API reference.
Applies to the CydraLabs proof-of-concept platform. Last updated 4 October 2026. Questions or corrections: contact us.