Skip to main content

Endpoint Type Entity Feasibility

Date: 2026-02-27

Context: The Clarity UX spec uses "Endpoint Type" in the verdict sentence template:

<N> autonomous paths exercised <Domain>-scoped authority and invoked <Endpoint Type> <X> times in the last 30 days.

This term does not exist as an entity in the current data model. This document assesses whether it should.


Executive Answer

"Endpoint type" is not a new entity. It is a composite of data we already collect.

Three existing fields combine to produce what the Clarity spec calls "Endpoint Type":

Existing FieldSourceExample Values
connection_typeFoundry Connections APIAzureOpenAI, AzureBlob, AzureSearch, S3, MCP, Custom
egress_categoryEgress classifier (computed from URL)llm, cloud, external, internal
resource_display_nameEntra sign-in logsMicrosoft Graph, Azure Key Vault, Azure Storage

No new entity type. No schema migration. Just surface and compose existing data.


What Already Exists

1. Azure Foundry Connector — Richest Source

The Foundry connector already captures structured endpoint type data on connection nodes:

Connection properties (transformer.py lines 246-265):

properties = {
"connection_type": "AzureOpenAI", # Standardized enum
"endpoint": "https://my.openai.azure.com", # Raw URL
"egress_category": "llm", # Classified type
"authentication_type": "aad_default",
}

Supported connection_type values (from Foundry Connections API):

  • AzureOpenAI, Serverless, ManagedOnlineEndpoint — AI/LLM endpoints
  • AzureBlob, AzureDataLakeGen2, S3 — Storage endpoints
  • AzureSearch, AzureSqlDb, AzureCosmosDb — Data endpoints
  • AzureKeyVault — Secrets endpoints
  • ContainerRegistry — Infrastructure endpoints
  • MCP, Custom — External/custom endpoints

Egress classifier (egress_classifier.py) automatically categorizes endpoint URLs:

CategoryPattern Matches
llmopenai.azure.com, api.openai.com, api.anthropic.com, generativelanguage.googleapis.com, .inference.ai.azure.com
cloud.blob.core.windows.net, .vault.azure.net, .servicebus.windows.net, .cosmos.azure.com, graph.microsoft.com, management.azure.com
internallocalhost, RFC 1918 ranges
externalEverything else

2. Entra-ServiceNow Connector — Partial Data

Sign-in evidence nodes (transformer.py line 1957):

properties = {
"target_resource": sign_in.get("resource_display_name", ""), # Free-text
# e.g., "Microsoft Graph", "Azure Key Vault", "Azure Storage"
}

This captures what was accessed but as a free-text string — not classified into types.

3. ServiceNow Connection Entities

Connection node properties (from data model spec):

connection_subtype: rest_message | rest_method | soap_message | http_connection
endpoint_url: https://...
authentication_type: oauth2 | basic | api_key | certificate

These already carry protocol-level endpoint type information (REST vs SOAP vs HTTP).


Mapping to the Verdict Sentence

The Clarity template: <N> autonomous paths exercised <Domain>-scoped authority and invoked <Endpoint Type> <X> times in the last 30 days.

SlotSourceAvailable Now?
<N>Count of execution_paths[]Yes
<Domain>business_domain on resource entitiesYes
<Endpoint Type>Composed from connection_type + egress_categoryYes — needs composition
<X> (invocation count)execution_evidence aggregationPartially — workload-level, not per-endpoint
last 30 daysFilter by last_activity_atYes

The one gap: invocation count (<X>) is tracked per-workload, not per-endpoint-pair. Getting "invoked Graph API 47 times" requires either:

  • Aggregating execution_evidence records filtered by (workload, target_resource) — possible today for sign-in evidence
  • Storing invocation counts per connection entity — enhancement needed

Recommendation: Derive, Don't Invent

Option A — Composition at Query Time (MVP)

Materialize endpoint_type as a derived property during path materialization by combining existing fields:

connection_type = "AzureOpenAI" + egress_category = "llm"
→ endpoint_type = "LLM API (Azure OpenAI)"

connection_subtype = "rest_message" + egress_host = "api.openai.com"
→ endpoint_type = "REST API (OpenAI)"

resource_display_name = "Microsoft Graph"
→ endpoint_type = "Microsoft Graph API"

Effort: ~1 Claude Code session Schema impact: None — computed at materialization time

Option B — Enriched Property on Connection Nodes

Add a normalized_endpoint_type property to connection entities during ingestion:

# In transformer, after egress classification:
properties["normalized_endpoint_type"] = derive_endpoint_type(
connection_type=properties.get("connection_type"),
egress_category=properties.get("egress_category"),
endpoint_url=properties.get("endpoint"),
)

Effort: ~1 Claude Code session Schema impact: One new property per connection entity (~50 bytes)

Creating a standalone endpoint_type entity with its own nodes and edges would be over-engineering. The data is already on connection nodes — adding another entity type creates redundancy and complicates the graph without adding new relationships.


What Would Improve Over Time

EnhancementSourceCustomer RequirementEffort
Per-API-call endpoint URIsMicrosoft Graph Activity LogsEnable Azure Monitor export (Entra P1/P2)2-3 sessions
Per-run tool invocationsFoundry Runs API + Run StepsNone (already have permissions)2-3 sessions
ServiceNow outbound HTTP logssys_outbound_http_logEnable glide.rest.outbound_log_level=elevated1-2 sessions
Normalized resource_display_nameSign-in log mapping tableNone1 session

These are additive enrichments, not prerequisites. The verdict sentence works today with existing data.


Verdict

QuestionAnswer
Is "endpoint type" feasible?Yes — it already exists as raw data
Is it a new entity type?No — it's a derived property on existing connection/evidence nodes
Is it too specific for SV0?No — it directly supports the Clarity UX verdict sentence and aligns with execution-determined framing
What's the implementation path?Option A or B — compose from existing connection_type, egress_category, resource_display_name
Effort?~1 Claude Code session for MVP

The Clarity spec can reference "Endpoint Type" in the verdict sentence. The backend just needs to compose it from fields the connectors already produce.