Skip to main content

MCP Governance Overview

FieldValue
Document IDASCEND-MCP-001
Version2026.04
Last UpdatedApril 2026
AuthorAscend Engineering Team
PublisherOW-KAI Technologies Inc.
ClassificationEnterprise Client Documentation
ComplianceSOC 2 CC6.1/CC6.2, PCI-DSS 7.1/8.3, HIPAA 164.312, NIST 800-53 AC-2/SI-4

Reading Time: 8 minutes | Skill Level: Advanced

Overview

ASCEND provides comprehensive governance for Model Context Protocol (MCP) servers, extending the same enterprise-grade security controls used for AI agents to MCP tool use. Every MCP server action is evaluated, approved, and audited using unified governance policies.

Default Deny

MCP governance uses a default-deny policy model. Any MCP tool invocation that does not match an explicit allow policy is blocked. Register all MCP servers and configure policies before enabling governance.

What is MCP?

Model Context Protocol (MCP) is a standard for AI models to interact with external tools and data sources. MCP servers provide capabilities like:

  • File System Access - Read/write files
  • Database Queries - Execute SQL queries
  • API Calls - Interact with external services
  • Code Execution - Run code in sandboxes

Why MCP Governance?

Without governance, MCP servers present significant security risks:

RiskWithout GovernanceWith ASCEND
Unauthorized file accessUnrestrictedRisk-assessed + approved
Database manipulationOpen accessPolicy-controlled
Sensitive data exposureNo protectionPII detection + masking
Compliance violationsUnknownAudit trail + evidence

MCP Governance Architecture

+---------------------------------------------------------------------------------+
| MCP GOVERNANCE SYSTEM |
+---------------------------------------------------------------------------------+
| |
| MCP CLIENT (Claude, etc.) |
| +-------------------------------------------------------------------------+ |
| | | |
| | Tool Request: filesystem.read_file("/etc/passwd") | |
| | | |
| +-------------------------------------------------------------------------+ |
| | |
| v |
| +-------------------------------------------------------------------------+ |
| | ASCEND MCP GATEWAY | |
| | | |
| | 1. Intercept MCP request | |
| | 2. Evaluate against policies | |
| | 3. Calculate risk score | |
| | 4. Route to approval workflow (if needed) | |
| | 5. Execute or deny | |
| | 6. Log to audit trail | |
| | | |
| +-------------------------------------------------------------------------+ |
| | |
| +-------------------+-------------------+ |
| | | |
| v v |
| +------------------+ +------------------+ |
| | AUTO-APPROVED | | PENDING APPROVAL | |
| | Risk < threshold | | Risk >= threshold| |
| | -> Execute | | -> Human review | |
| +------------------+ +------------------+ |
| | | |
| +-------------------+-------------------+ |
| | |
| v |
| +-------------------------------------------------------------------------+ |
| | MCP SERVER | |
| | - Filesystem - Database - API - Code Execution | |
| +-------------------------------------------------------------------------+ |
| |
+---------------------------------------------------------------------------------+

Unified Governance

ASCEND provides a unified governance model for both AI agents and MCP servers:

FeatureAI AgentsMCP Servers
Risk Assessment0-100 score0-100 score
Policy EngineSmart RulesSmart Rules
Approval WorkflowMulti-levelMulti-level
Audit TrailImmutableImmutable
Kill SwitchSupportedSupported

Unified Authorization Center

The unified view of agent + MCP actions is served from the orchestration topology + unified governance endpoints. In the admin UI, use the Activity tab. In the SDK, use AscendClient.evaluate_mcp_action (SDK 2.2.0+); the backend writes both agent and MCP actions through the same EnterpriseRiskPipeline, so they land in the same audit surface.

MCP Action Evaluation

Endpoint

MCP tool calls are governed by the dedicated MCP pipeline endpoint introduced in FEAT-008:

POST /api/v1/mcp/actions/submit

This endpoint runs the same 11-stage EnterpriseRiskPipeline as agent actions, with MCP-specific branches in CVSS / MITRE / NIST scoring and the mcp_tool_risk_defaults safety floor.

Evaluate MCP Action (cURL)

curl -X POST "https://pilot.owkai.app/api/v1/mcp/actions/submit" \
-H "Authorization: Bearer <api_key_or_jwt>" \
-H "Content-Type: application/json" \
-d '{
"mcp_server": "filesystem-server",
"namespace": "filesystem",
"verb": "read_file",
"resource": "/data/reports/financial.csv",
"action_type": "filesystem.read_file",
"parameters": {
"encoding": "utf-8"
},
"context": {
"session_id": "session_abc123",
"client_id": "claude-desktop"
},
"environment": "production"
}'

Evaluate MCP Action (Python SDK 2.3.0)

from ascend import AscendClient

client = AscendClient(api_key="owkai_...")

decision = client.evaluate_mcp_action(
mcp_server="filesystem-server",
namespace="filesystem",
verb="read_file",
resource="/data/reports/financial.csv",
action_type="filesystem.read_file", # optional — defaults to "<namespace>.<verb>"
parameters={"encoding": "utf-8"},
context={"session_id": "session_abc123"},
environment="production",
)

if decision.decision.value == "allowed":
# Proceed with tool execution
...
elif decision.decision.value == "pending":
# Human approval required; poll or wait
...
else:
raise PermissionError(decision.reason)

Response:

{
"success": true,
"action_id": 12345,
"request_id": "mcp-1711234567890",
"mcp_server": "filesystem-server",
"namespace": "filesystem",
"verb": "read_file",
"resource": "/data/reports/financial.csv",
"status": "PENDING",
"risk_score": 72,
"risk_level": "HIGH",
"requires_approval": true,
"compliance": {
"cvss_score": 6.8,
"cvss_severity": "MEDIUM",
"mitre_tactic": "TA0009",
"mitre_technique": "T1005",
"nist_control": "AC-6"
},
"automation": {
"playbook_matched": false,
"playbook_name": null,
"workflow_triggered": true,
"alert_created": false
},
"meta": {
"pipeline_version": "1.0.0",
"stages_completed": 11,
"processing_time_ms": 42.3,
"errors": []
}
}

Fail-Secure Responses

The endpoint fails secure on several conditions before running the pipeline:

ConditionResponseNotes
MCP server not registered for this tenant404 Not FoundPrevents cross-tenant enumeration
MCPServerConfig.governance_enabled == False403 ForbiddenTenant explicitly ungoverned
MCPServerConfig.is_active == False (kill-switch)200 OK with status: "denied" + reason: "mcp_server_blocked_by_kill_switch"Logged to immutable audit as MCP_ACTION_DENIED_KILL_SWITCH
Tool in blocked_tools list200 OK with status: "denied" + reason: "tool_in_blocked_list"Catalog-independent tool blocklist

Decision Values

The response shape matches the agent-action pipeline. In the SDK, evaluate_mcp_action() normalizes to the AuthorizationDecision enum:

DecisionMeaningAction
ALLOWEDApproved by pipelineExecute immediately
DENIEDBlocked by policy, kill-switch, or blocked-tool listRaise authorization error
PENDINGRequires human approvalWait or queue

Risk Assessment

Risk Factors

# MCP-specific risk factors
MCP_RISK_FACTORS = {
"sensitive_path": {
"patterns": ["/etc/", "/var/secrets/", "*.pem", "*.key"],
"weight": 30
},
"write_operation": {
"verbs": ["write_file", "delete_file", "create_directory"],
"weight": 25
},
"database_mutation": {
"verbs": ["execute_query", "insert", "update", "delete"],
"weight": 35
},
"external_api": {
"namespaces": ["http", "api", "webhook"],
"weight": 20
},
"pii_detected": {
"data_types": ["ssn", "credit_card", "health_data"],
"weight": 40
}
}

Risk Score Calculation

Risk Score = Base Score + Sum(Applicable Risk Factors)

Example:
- Base Score: 20
- sensitive_path (/etc/): +30
- read_operation: +0
- Total: 50 (MEDIUM risk)

MCP Server Registration

MCP servers are registered through the agent registry (/api/registry/mcp-servers) with the same admin-level controls used for agents. Admin role is required (JWT or admin API key).

Register Server

curl -X POST "https://pilot.owkai.app/api/registry/mcp-servers" \
-H "Authorization: Bearer <admin_jwt_or_api_key>" \
-H "Content-Type: application/json" \
-d '{
"server_name": "filesystem-server",
"display_name": "Filesystem Access Server",
"endpoint_url": "stdio://filesystem-server",
"governance_enabled": true,
"blocked_tools": [],
"allowed_namespaces": ["filesystem"]
}'

List Servers

curl "https://pilot.owkai.app/api/registry/mcp-servers" \
-H "Authorization: Bearer <admin_jwt_or_api_key>"

Update / Delete / Activate / Deactivate

ActionEndpoint
Get detailsGET /api/registry/mcp-servers/{server_name}
UpdatePUT /api/registry/mcp-servers/{server_name}
DeleteDELETE /api/registry/mcp-servers/{server_name}
ActivatePOST /api/registry/mcp-servers/{server_name}/activate
Deactivate (soft kill-switch)POST /api/registry/mcp-servers/{server_name}/deactivate

Deactivation flips MCPServerConfig.is_active = False, which causes subsequent POST /api/v1/mcp/actions/submit calls targeting that server to return a denied decision with reason = "mcp_server_blocked_by_kill_switch" — no pipeline work is performed.

Approval Workflow

MCP actions flow through the same approval workflow as agent actions. After an MCP action is evaluated with requires_approval: true, it can be approved or denied via the unified action-approval endpoints:

ActionEndpoint
Approve an actionPOST /api/v1/actions/{action_id}/approve
Reject an actionPOST /api/v1/actions/{action_id}/reject

See API — Actions for full request/response shape. This unification means one approval UI and one audit path for both agent and MCP actions.

Analytics

Analytics for MCP governance are served from the platform analytics endpoints (analytics_routes), not a dedicated MCP endpoint. Filter by action_source=mcp or use the Activity tab in the admin UI for an MCP-specific view. Real-time dashboards use the existing platform WebSocket channels; there is no dedicated MCP WebSocket in the current release.

Best Practices

1. Defense in Depth

# Layer multiple controls
{
"trust_level": "restricted",
"require_approval_by_default": True,
"path_allowlist": ["/data/public/", "/tmp/"],
"path_denylist": ["/etc/", "/var/secrets/"]
}

2. Least Privilege

# Grant minimum necessary capabilities
{
"capabilities": {
"verbs": ["read_file"], # No write access
"path_patterns": ["/data/reports/*"] # Specific paths only
}
}

3. Monitor and Alert

# Set up anomaly detection
{
"alerts": {
"high_risk_spike": True,
"new_path_access": True,
"unusual_hours": True
}
}

Next Steps


Document Version: 2026.04 | Last Updated: April 2026