This is a fictional compile-time fixture, not a vendor connector or hosted
test service. An API implementing the contract below would be configured with
a full base URL such as https://directory.example, without a trailing slash.
The fixed /v1 prefix stays in each request path.
Every endpoint returns this page shape:
{
"items": [],
"offset": 0,
"limit": 100,
"total": 0
}The fictional endpoints are:
GET /v1/users: item{ "id", "name", "email", "active" }GET /v1/groups: item{ "id", "name" }GET /v1/groups/{groupId}/members: item{ "userId" }- Pagination uses the
offsetandlimitquery parameters; responses carryoffset,limit, andtotal.
config-schema.json and runtime-schema.json's runtime.config_schema
declare the same tenant inputs using different JSON shapes. Keep their field
names and UI/security metadata aligned; do not copy the camelCase
configuration-proto shape into the snake_case runtime schema.
The connector declares a graph:
config(...)creates opaque public and secret references.http.v1(...)declares native basic authentication. Connector code never reads the account email or API token.- Each
nodereturns adirectory.GET(...)descriptor with offset pagination. The hosted runtime executes requests and advances pages. - Node results populate slots. Walks map slot rows to users and groups, then map membership rows to grants.
connector({ transports: {directory} })registers the same transport object referenced by every node.
The companion files describe how the graph is hosted:
capabilities.jsondeclares connector and resource-type capabilities.config-schema.jsondeclares the tenant configuration form.runtime-schema.jsondeclares the hosted bundle entrypoint and runtime configuration contract.
This example is read-only. It declares sync surfaces and emits membership entitlements and grants, but it does not implement grant or revoke operations.