Skip to content

Canonical Data Model & Database ERD ​

This document provides the complete, canonical data model and Entity-Relationship Diagram (ERD) for the C# Model Context Gateway (MCG) & Semantic Proxy. It documents all 12 core database entities, relationship cardinalities, column constraints, indexing strategies, multi-dialect support (SQLite SQLCipher, MS SQL Server, MySQL), and data protection models.

For dialect-specific SQL migrations and connection string setups, see database-providers.md. For end-to-end system architecture and data flow sequences, see architecture/index.md.


Entity-Relationship Diagram (Mermaid ERD) ​


Entity Catalog & Schema Specifications ​

1. Servers (Registered MCP Servers) ​

Stores backend downstream server registrations, transport parameters, credential shapes, and metadata.

ColumnTypeNullableConstraintsDescription
IdVARCHAR(100)NoPKUnique alphanumeric identifier (e.g. docker, plex, ha)
DisplayNameVARCHAR(255)NoFriendly name rendered in UI dashboards
UrlVARCHAR(1000)NoDownstream endpoint URL or local binary execution command
EnabledBOOLEAN / INTNoDefault 1Operational state (1 = active, 0 = disabled)
HiddenBOOLEAN / INTNoDefault 0Hides tools from tools/list while retaining routing capability
TypeVARCHAR(50)NoDefault 'sse'Transport protocol: sse, http, streamable, stdio
SecretProviderVARCHAR(50)NoDefault 'None'Credential provider: None, HashiCorpVault, WindowsRegistry, Environment
SecretItemKeyVARCHAR(255)YesTarget secret identifier or environment variable name
SecretMountVARCHAR(255)YesHashiCorp Vault KV mount point (e.g. secret/data/)
SecretPathVARCHAR(500)YesVault secret path or Windows Registry subkey
SecretFieldVARCHAR(255)YesJSON property key inside the secret payload
AuthShapeVARCHAR(50)NoDefault 'bearer'Header injection shape: bearer, basic, customHeader, query
CustomHeaderNameVARCHAR(255)YesHTTP header name if AuthShape = 'customHeader'
CategoriesTEXT / JSONYesJSON array of category strings (e.g. ["infrastructure", "media"])
ApiKeyVARCHAR(1000)YesStatic token (encrypted at rest; redacted in API responses)
HeadersJsonTEXT / JSONYesJSON dictionary of static downstream HTTP headers
AutoDiscoveredBOOLEAN / INTNoDefault 0Flag set when registered dynamically via Docker socket discovery

2. Tools (Cached Backend & Native Tools) ​

Stores cached metadata and JSON schemas for downstream MCP tools discovered during server warming.

ColumnTypeNullableConstraintsDescription
ToolIdINTNoPK, AUTOINCREMENTSurrogate integer identifier
ServerIdVARCHAR(100)NoFK -> Servers(Id)Reference to parent MCP server
ToolNameVARCHAR(255)NoUnnamespaced tool name (e.g. restart_container)
DescriptionTEXTYesDescription analyzed by LLMs and vector embedding index
InputSchemaJsonTEXT / JSONYesStandard JSON Schema defining input parameters
VaultSecretPathVARCHAR(500)YesOptional tool-level Vault override path
SecretProviderVARCHAR(50)YesOptional tool-level secret provider override
IsEnabledBOOLEAN / INTNoDefault 1Per-tool activation state
CreatedAtDATETIMENoDefault CURRENT_TIMESTAMPInitial discovery timestamp

3. AppKeys (Scoped API Keys) ​

Stores client API credentials used by IDEs, CLI tools, and background agents.

ColumnTypeNullableConstraintsDescription
IdVARCHAR(36)NoPKUnique GUID identifier
NameVARCHAR(255)NoDescriptive client label (e.g. Cursor IDE Laptop)
UsernameVARCHAR(255)NoSubject principal username associated with key
KeyPrefixVARCHAR(32)NoUK, INDEXHigh-entropy random prefix (mcp_app_key_xxxxxxxx)
EncryptedKeyVARCHAR(512)NoArgon2id / PBKDF2 cryptographic hash of secret key
ScopesJsonTEXT / JSONNoScopes JSON array: ["*"], ["server:docker"], ["category:media"]
ExpiresAtDATETIMEYesExpiration timestamp in UTC (NULL = Never)
CreatedAtDATETIMENoDefault CURRENT_TIMESTAMPCreation timestamp
OwnerSidVARCHAR(255)YesTarget user SID decoupled from admin creator principal

4. AdGroups & GroupMappings (Identity & RBAC) ​

Resolves enterprise Active Directory SIDs and maps external SSO reverse-proxy claims to internal router roles.

AdGroups ​

ColumnTypeNullableConstraintsDescription
GroupIdINTNoPK, AUTOINCREMENTSurrogate integer identifier
ObjectSidVARCHAR(255)NoUK, INDEXWindows Security Identifier (e.g. S-1-5-32-544)
GroupNameVARCHAR(255)NoDomain or local group name (e.g. Administrators)
DescriptionTEXTYesGroup purpose and description
IsActiveBOOLEAN / INTNoDefault 1Group active state
CreatedAtDATETIMENoDefault CURRENT_TIMESTAMPRegistration timestamp

GroupMappings ​

ColumnTypeNullableConstraintsDescription
IdVARCHAR(36)NoPKUnique GUID identifier
ExternalIdVARCHAR(255)NoINDEXExternal header/claim value (e.g. house_member, sso_admin)
InternalGroupVARCHAR(255)NoMapped internal role or AD group name (e.g. full_admin)
CreatedAtDATETIMENoDefault CURRENT_TIMESTAMPMapping creation timestamp

5. AccessPolicies & ToolAccessPolicies (Governance) ​

Controls fine-grained authorization for servers, categories, tools, resources, and prompts.

AccessPolicies ​

ColumnTypeNullableConstraintsDescription
IdVARCHAR(36)NoPKUnique GUID identifier
TargetIdVARCHAR(255)NoINDEXTarget identifier: server:<id>, category:<name>, tool:<name>
RequiredGroupVARCHAR(255)NoRequired internal group, role, or AD SID
IsAllowedBOOLEAN / INTNoDefault 1Policy decision (1 = ALLOW, 0 = DENY)
CreatedAtDATETIMENoDefault CURRENT_TIMESTAMPPolicy assignment timestamp

ToolAccessPolicies ​

ColumnTypeNullableConstraintsDescription
ToolPolicyIdINTNoPK, AUTOINCREMENTSurrogate primary key
ToolIdINTNoFK -> Tools(ToolId)Reference to target tool
GroupIdINTNoFK -> AdGroups(GroupId)Reference to authorized AD group
IsAllowedBOOLEAN / INTNoDefault 1Access grant decision
RateLimitPerMinINTNoDefault 0Maximum executions per minute (0 = unlimited)
CreatedAtDATETIMENoDefault CURRENT_TIMESTAMPCreation timestamp

6. SecretProviders & AuthProviderConfigs (Dynamic Providers) ​

Stores encrypted connection credentials and runtime configuration for pluggable secret and identity backends.

SecretProviders ​

ColumnTypeNullableConstraintsDescription
ProviderIdINTNoPK, AUTOINCREMENTSurrogate integer identifier
ProviderNameVARCHAR(100)NoUKUnique provider key (HashiCorpVault, WindowsRegistry, Environment)
DisplayNameVARCHAR(255)NoFriendly name rendered in Settings UI
EncryptedConfigJsonTEXTNoAES-256-GCM encrypted JSON settings (Vault URL, Tokens, etc.)
IsEnabledBOOLEAN / INTNoDefault 1Provider enabled toggle
UpdatedAtDATETIMENoDefault CURRENT_TIMESTAMPLast modification timestamp

AuthProviderConfigs ​

ColumnTypeNullableConstraintsDescription
AuthIdINTNoPK, AUTOINCREMENTSurrogate integer identifier
ProviderNameVARCHAR(100)NoUKIdentity provider key (ActiveDirectory, OidcHeader)
DisplayNameVARCHAR(255)NoFriendly name rendered in Settings UI
UserHeaderVARCHAR(100)NoDefault 'Remote-User'Incoming HTTP header for username resolution
GroupsHeaderVARCHAR(100)NoDefault 'Remote-Groups'Incoming HTTP header for group claim extraction
EncryptedConfigJsonTEXTNoAES-256-GCM encrypted provider settings (LDAP server, Base DN, etc.)
IsEnabledBOOLEAN / INTNoDefault 1Provider enabled toggle
UpdatedAtDATETIMENoDefault CURRENT_TIMESTAMPLast modification timestamp

7. Settings (System Singleton) ​

Stores global singleton settings controlling vector embeddings, user quotas, and secret storage strategies.

ColumnTypeNullableConstraintsDescription
IdVARCHAR(50)NoPKFixed singleton key (e.g. 'default')
EmbeddingProviderVARCHAR(50)NoDefault 'local'Embedding engine: local (ONNX CPU), openai, ollama
EmbeddingApiUrlVARCHAR(1000)YesRemote embedding API endpoint
EmbeddingApiKeyVARCHAR(500)YesEncrypted embedding API authentication key
EmbeddingApiModelVARCHAR(100)YesRemote embedding model identifier (e.g. text-embedding-3-small)
EmbeddingModelDirVARCHAR(500)YesLocal path to ONNX model weights (/app/data/models)
UserSecretStorageVARCHAR(50)NoDefault 'Database'Storage strategy for user-supplied secrets (Database, Vault)
GlobalMaxKeysINTNoDefault 0Gateway-wide limit on active AppKeys (0 = Unlimited)
UserMaxKeysINTNoDefault 0Per-user limit on active AppKeys (0 = Unlimited)

8. AuditLogs (Security & Observability) ​

Stores append-only, PII-sanitized audit trails of all tool calls, prompt evaluations, and administrative changes.

ColumnTypeNullableConstraintsDescription
AuditIdBIGINTNoPK, AUTOINCREMENTSequential integer audit record identifier
RequestIdVARCHAR(100)NoINDEXUnique client request correlation GUID
UserPrincipalNameVARCHAR(255)NoCaller username, SSO principal, or AppKey owner
UserSidVARCHAR(255)YesCaller Windows SID or AppKey OwnerSid
ServerCodeNameVARCHAR(100)YesTarget backend server ID (e.g. docker, plex)
ItemNameVARCHAR(255)NoTarget tool name, prompt name, or resource URI
RequestMethodVARCHAR(100)NoMCP JSON-RPC method (tools/call, prompts/get, etc.)
RequestParamsTEXT / JSONYesPII-sanitized arguments JSON (passwords, tokens redacted)
ResponseStatusVARCHAR(50)NoExecution outcome: SUCCESS, DENIED, ERROR, PENDING
ExecutionDurationMsINTNoTotal round-trip execution latency in milliseconds
TimestampDATETIMENoDefault CURRENT_TIMESTAMPUTC event creation timestamp

9. OAuthClients (RFC 7591 & Dynamic Client Registration) ​

Stores registered OAuth 2.0 / 2.1 client applications, redirect URIs, grant types, and SHA-256 hashed secrets.

ColumnTypeNullableConstraintsDescription
ClientIdVARCHAR(100)NoPKUnique OAuth client identifier (e.g. client-xxx, GUID)
ClientSecretHashVARCHAR(128)NoDefault ''Hex-encoded SHA-256 hash of plaintext client secret
ClientNameVARCHAR(255)NoFriendly client / application name
ClientTypeVARCHAR(50)NoDefault 'confidential'Client type: 'confidential' or 'public'
RedirectUrisJsonTEXT / JSONNoDefault '[]'JSON array of whitelisted redirect URI strings
GrantTypesJsonTEXT / JSONNoDefault '[]'JSON array of allowed grant types (authorization_code, etc.)
ScopesJsonTEXT / JSONNoDefault '[]'JSON array of allowed OAuth scopes (mcp_client, category:*)
OwnerSidVARCHAR(200)NoDefault ''Target owner SID (empty string for machine clients)
CreatedByVARCHAR(256)NoDefault ''Creator username or 'dcr'
ExpiresAtDATETIMEYesNULLOptional client secret expiration UTC timestamp
CreatedAtDATETIMENoDefault CURRENT_TIMESTAMPUTC client registration creation timestamp

Cryptographic & Envelope Encryption Model ​


Released under the Apache 2.0 License.