# client.mcp.endpoints

> client.mcp.endpoints — the mcp.endpoints operations.

`client.mcp.endpoints` — the `mcp.endpoints` operations.

On `AsyncKindgi` every method is the same, awaited.

## `client.mcp.endpoints.list()`

```python signature
list(
    *,
    limit: int | None = None,
    cursor: str | None = None,
    transport: Literal['stdio', 'http-sse', 'streamable-http'] | None = None,
    scope_kind: Literal['tenant', 'org', 'project'] | None = None,
    scope_id: str | UUID | None = None,
    inherit: bool | None = None,
    timeout: float | None = None,
) -> MCPEndpointCollectionPage
```

List MCP endpoints. `GET /v1/mcp/endpoints`

Cursor-paginated. Optional `?transport=` narrows to a single variant (`stdio | http-sse | streamable-http`). `?scopeKind + ?scopeId + ?inherit` narrow to a specific scope; `inherit` is LOAD-BEARING here (policy/config-scoped binding — controls the upward-hierarchy walk).

## `client.mcp.endpoints.register()`

```python signature
register(
    body: RegisterMCPEndpointBody | Mapping[str, Any] | None = None,
    /,
    *,
    idempotency_key: str | None = None,
    timeout: float | None = None,
    **fields: Any,
) -> RegisterMCPEndpointResult
```

Register an MCP endpoint. `POST /v1/mcp/endpoints`

Body is a full `MCPEndpoint` plus the scope to register it in (`scopeKind` + `scopeId`); authorization checks that scope. Server validates the closed transport enum + the `config.transport` matches `transport` guardrail + per-variant required fields (`command` for stdio; `url` for http-sse / streamable-http), and refuses unknown fields. `secretRef` names a secret in the deployment's store — plaintext secrets never cross the wire — and never a model provider's key (`400 provider-key-refused`). Where each secret it names is read is recorded on it now (`secretScopes`): the first of its own scope, its project's org and the tenant that has the secret and that the caller administers, else the broadest they administer; the runtime reads it there only. A deployment with `KINDGI_TENANT_HOST_ACCESS=deployed` (the default outside development) refuses a `stdio` endpoint, which would run a command on the server's host: `403 host-access-denied`.

## `client.mcp.endpoints.get()`

```python signature
get(endpoint_id: str | UUID, /, *, timeout: float | None = None) -> MCPEndpoint
```

Fetch an MCP endpoint. `GET /v1/mcp/endpoints/{endpointId}`

Returns the wire-safe `MCPEndpoint` (secrets never cross the wire — `secretRef` names a secret the runtime resolves inside the deployment).

## `client.mcp.endpoints.unregister()`

```python signature
unregister(
    endpoint_id: str | UUID,
    /,
    *,
    idempotency_key: str | None = None,
    timeout: float | None = None,
) -> UnregisterMCPEndpointResult
```

Unregister an MCP endpoint. `POST /v1/mcp/endpoints/{endpointId}/unregister`
