inspect_governance_rules
inspect_governance_rules lists the governing rules for one asset: every deployed instruction decision from the current deployment publication that applies to the asset, optionally narrowed to one canonical scenario. Each rule is summarized from allow-listed published fields — decision, reason, scenario, enforcement mode, resolution provenance, policy provenance — never from raw policy prose. It is read-only and advisory, and clients that present hyphenated tool names can call it as inspect-governance-rules.
When to useDirect link to When to use
Use this tool to browse or audit the rule set itself:
- "What rules apply to
employees, and why do they apply?" — including how each rule reached the asset (direct selector, collection membership, or taxonomy match). - To review enforcement posture: which rules are
enforceableversusadvisory, and theirenforce/monitor/advisoryenforcement modes. - To gather
decision_idvalues for follow-upexplain_whycalls.
Versus get_decision_context: both tools read the same instruction rows and cite the same record shape, but get_decision_context additionally derives an effective_decision (the single winning verdict) and structured business_context. inspect_governance_rules returns the ranked rule list only — use it when you want the rules, and get_decision_context when you want the rules plus the bottom line. For a verdict on one concrete proposed use, use authorize_use instead.
InputDirect link to Input
| Parameter | Type | Required | Description |
|---|---|---|---|
asset | object | Yes | Reference to a governed table or column. |
asset.database | string | Yes | Normalized database name, as shown in the catalog. |
asset.schema | string | Yes | Normalized schema name. |
asset.table | string | Yes | Normalized table name. |
asset.column | string | No | Normalized column name. Omit it for a table-level reference. |
scenario_key | string | No | A canonical scenario key (for example access.read) to narrow the read to one scenario. Non-canonical values are rejected with invalid_parameters. |
The schema is strict: unknown keys are rejected with invalid_parameters. A table-level reference returns rules scoped to the table and to its columns.
OutputDirect link to Output
A successful call returns one JSON payload discriminated by state. When the state is answered:
| Field | Description |
|---|---|
state | "answered". |
asset | The resolved asset scope; column is always present and null for table-level. |
scenario_key | The scenario filter that was applied, or null for all scenarios. |
rules | The active instruction rules (at least one), in rank order: column-level before table-level, then more explicit resolution (selector over collection over taxonomy), then higher priority, then the more restrictive decision. |
publication | Current-publication provenance: publication_id, published_at. |
Each entry in rules is the same instruction record shape get_decision_context returns in decisions: decision_id, instruction_key, instruction_family, scenario_key, scenario_lane, category, priority, weight, enforcement_mode, decision, decision_reason, parameters (the extracted policy parameters, served verbatim — keys inside follow the policy YAML authoring convention), scope, provenance (policy_id, policy_version_id, policy_name, version_number), primary_resolution_source, resolution_paths, conflict_status, conflict_group_id, and conflicts_with. See get_decision_context for the field-by-field description.
There is deliberately no effective_decision field: this tool describes the rule set without collapsing it to a verdict.
Answer statesDirect link to Answer states
All three typed states are possible:
answered— as above.review_required— published rules exist but must not be presented as a settled listing.reason_codeisconflicted_published_state(rules in scope conflict; the payload adds aconflictgroup carrying every opposing source) ordecision_requires_review(the top-ranked rule is an explicitrequire_review). The payload keepsrulesand addsnext_actions.not_enough_published_state—reason_codeisno_current_publication,no_published_instruction_state(no published rule covers this asset and scenario — never returned as an empty rule list), orunresolved_published_target(withunresolved_targetsdetails). The payload carries the asset echo, a fixedmessage, andnext_actions.
See Typed answer states for the full model and reason-code semantics.
ExampleDirect link to Example
Request arguments:
{
"asset": {
"database": "acmecloud_demo",
"schema": "public",
"table": "employees"
},
"scenario_key": "access.read"
}
Response:
{
"state": "answered",
"asset": {
"database": "acmecloud_demo",
"schema": "public",
"table": "employees",
"column": null
},
"scenario_key": "access.read",
"rules": [
{
"decision_id": "accef000-0000-4000-8000-000000000040",
"instruction_key": "role_grant:spec.accessControl.deniedRoles:public:deny",
"instruction_family": "role_grant",
"scenario_key": "access.read",
"scenario_lane": "platform",
"category": "enforceable",
"priority": 2,
"weight": 1,
"enforcement_mode": "enforce",
"decision": "deny",
"decision_reason": "acme-employee-access v1 role_grant:spec.accessControl.deniedRoles:public:deny -> deny on acmecloud_demo.public.employees",
"parameters": {
"action": "deny",
"role": "PUBLIC"
},
"scope": {
"database": "acmecloud_demo",
"schema": "public",
"table": "employees",
"column": null
},
"provenance": {
"policy_id": "accef000-0000-4000-8000-000000000041",
"policy_version_id": "accef000-0000-4000-8000-000000000042",
"policy_name": "AcmeCloud employee data access",
"version_number": 1
},
"primary_resolution_source": "selector",
"resolution_paths": [{ "source": "selector", "ref": null }],
"conflict_status": "none",
"conflict_group_id": null,
"conflicts_with": []
}
],
"publication": {
"publication_id": "accef000-0000-4000-8000-000000000001",
"published_at": "2026-07-16T00:00:00.000Z"
}
}
Without the scenario_key filter, the same asset returns its full rule set across all scenarios (the sample workspace returns 25 rules for employees).
Limits and notesDirect link to Limits and notes
scenario_keymust be canonical. Free-text intents are not accepted here; there is noproposed_useoruseparameter on this tool. See Scenarios for the vocabulary, or take valid keys per asset fromdiscover_context.- Summaries only. Rules are composed from allow-listed published instruction fields. Raw policy source is never returned; read the policy itself in the app if you need the authored YAML.
- Conflicts are never ranked away. A conflict anywhere in the applicable rules turns the listing into
review_requiredwith every opposing source attached — the tool will not present conflicted state as a settled answer. - Metering. Every call that passes input validation consumes one MCP call before any read; over quota, the call fails with
quota_exceeded. Calls rejected withinvalid_parametersare not metered. - Error codes.
asset_not_found(the reference does not resolve in the workspace's current catalog — a cross-workspace reference is indistinguishable from not found),invalid_parameters,read_failed, plus the sharedunauthorized,auth_unavailable,rate_limited,quota_exceeded.
RelatedDirect link to Related
get_decision_context— the same rules plus the effective decision and business contextauthorize_use— an advisory verdict for one proposed useexplain_why— explain one cited rule bydecision_id- Governance model — policies, instructions, and publications
- Typed answer states — states and reason codes in depth
- MCP schemas — full input and output schema reference