get_decision_context
get_decision_context returns the full decision picture for one governed asset: every deployed instruction decision from the current deployment publication that applies to the asset (optionally narrowed to one canonical scenario), ranked with the winning instruction first, plus the effective decision and structured business context. It is read-only and advisory — it describes published decisions, it never performs them. Clients that present hyphenated tool names can call it as get-decision-context.
When to useDirect link to When to use
- You want everything that governs an asset — every applicable instruction with its decision, reason, and provenance — not just one verdict.
- You want the published business ownership facts (
owner,steward,domain,purpose) for an asset as structured fields. - For a verdict on one specific proposed use, prefer
authorize_use; for the rule list without a verdict, useinspect_governance_rules.
InputDirect link to Input
At least one of asset or proposed_use must be provided.
| Parameter | Type | Required | Description |
|---|---|---|---|
asset | object | No* | Reference to a governed table or column (shape below). |
proposed_use | string | No* | Free-text description of an intended use, 1–2000 characters. Without an asset, this answers with a not_supported error today (see below). |
scenario_key | string | No | A canonical scenario key (for example ai.training) to narrow the read to one scenario. Non-canonical values are rejected with invalid_parameters. |
The asset reference is a strict object — exactly these keys, no others:
| Field | Type | Required | Description |
|---|---|---|---|
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. |
A table-level reference returns decisions scoped to the table and to its columns; column-scoped instructions outrank table-scoped ones in the ranking.
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. |
decisions | Every applicable instruction record (at least one), in rank order with the winner first: column-level before table-level, then more explicit resolution (selector over collection over taxonomy), then higher priority, then the more restrictive decision. |
effective_decision | The single effective verdict over decisions — one of allow, deny, mask_full, mask_partial, conditional, log_only, retain. An effective require_review is returned as the review_required state instead. |
business_context | Structured facts from the asset's published business-context instruction: owner, steward, domain, purpose (each null when not declared), or null when no business-context instruction governs the asset. These are served as fields — you never parse them out of reason prose. |
publication | Current-publication provenance: publication_id, published_at. |
Each entry in decisions is an instruction record citing one deployed instruction decision:
decision_id— the cited serving row's UUID; pass it toexplain_whyto explain this exact record.instruction_key,instruction_family— the stable instruction identity and its family (for examplemasking,ai_governance,usage_guidance,business_context).scenario_key,scenario_lane— the canonical scenario and its lane (platform,agent, orhuman).category(enforceableoradvisory),priority(integer 0–3, low to critical),weight,enforcement_mode(enforce,monitor, oradvisory).decision,decision_reason— the instruction decision value and its bounded reason text.parameters— the instruction's extracted policy parameters, served verbatim; keys inside follow the policy YAML authoring convention rather than the snake_case wire convention.scope,provenance— the resolved asset scope and the policy provenance (policy_id,policy_version_id,policy_name,version_number).primary_resolution_sourceandresolution_paths— how the asset entered the instruction's scope (selector,collection, ortaxonomy; every matching path is kept, with the collection ID or taxonomy type key asref).conflict_status,conflict_group_id,conflicts_with— the typed conflict state.
Answer statesDirect link to Answer states
All three typed states are possible:
answered— as above.review_required— published rows exist but the answer needs review.reason_codeisdecision_requires_review(the effective decision is an explicitrequire_review) orconflicted_published_state(applicable rows conflict). The payload keepsdecisions, addsnext_actions, and — only for conflicts — aconflictgroup carrying every opposing source, never just the winner.not_enough_published_state—reason_codeisno_current_publication,no_published_instruction_state, orunresolved_published_target(the latter withunresolved_targetsdetails:policy_name,instruction_key,kind,ref,reason). Missing state is a typed answer, never a fabricated decision.
ExampleDirect link to Example
Request arguments:
{
"asset": {
"database": "acmecloud_demo",
"schema": "public",
"table": "customers"
}
}
Response (trimmed to two of the applicable instructions):
{
"state": "answered",
"asset": {
"database": "acmecloud_demo",
"schema": "public",
"table": "customers",
"column": null
},
"scenario_key": null,
"decisions": [
{
"decision_id": "accef000-0000-4000-8000-000000000008",
"instruction_key": "usage_guidance:spec.usage.prohibitedUses:prohibited",
"instruction_family": "usage_guidance",
"scenario_key": "purpose.prohibited_use",
"scenario_lane": "human",
"category": "advisory",
"priority": 2,
"weight": 1,
"enforcement_mode": "enforce",
"decision": "deny",
"decision_reason": "acme-customer-use v1 usage_guidance:spec.usage.prohibitedUses:prohibited -> deny on acmecloud_demo.public.customers",
"parameters": {
"kind": "prohibited",
"uses": ["marketing", "advertising", "personalization", "ml_training"]
},
"scope": {
"database": "acmecloud_demo",
"schema": "public",
"table": "customers",
"column": null
},
"provenance": {
"policy_id": "accef000-0000-4000-8000-000000000006",
"policy_version_id": "accef000-0000-4000-8000-000000000007",
"policy_name": "AcmeCloud customer use guardrails",
"version_number": 1
},
"primary_resolution_source": "selector",
"resolution_paths": [{ "source": "selector", "ref": null }],
"conflict_status": "none",
"conflict_group_id": null,
"conflicts_with": []
},
{
"decision_id": "accef000-0000-4000-8000-000000000013",
"instruction_key": "business_context:metadata.businessContext",
"instruction_family": "business_context",
"scenario_key": "metadata.domain",
"scenario_lane": "platform",
"category": "advisory",
"priority": 2,
"weight": 1,
"enforcement_mode": "enforce",
"decision": "log_only",
"decision_reason": "acme-customer-use v1 business_context:metadata.businessContext -> log_only on acmecloud_demo.public.customers",
"parameters": {
"owner": "Revenue Operations",
"steward": "privacy-review@example.com",
"domain": "Customer Data",
"purpose": "Customer master data used for approved reporting, analytics, support, and controlled operational exports."
},
"scope": {
"database": "acmecloud_demo",
"schema": "public",
"table": "customers",
"column": null
},
"provenance": {
"policy_id": "accef000-0000-4000-8000-000000000006",
"policy_version_id": "accef000-0000-4000-8000-000000000007",
"policy_name": "AcmeCloud customer use guardrails",
"version_number": 1
},
"primary_resolution_source": "selector",
"resolution_paths": [{ "source": "selector", "ref": null }],
"conflict_status": "none",
"conflict_group_id": null,
"conflicts_with": []
}
],
"effective_decision": "deny",
"business_context": {
"owner": "Revenue Operations",
"steward": "privacy-review@example.com",
"domain": "Customer Data",
"purpose": "Customer master data used for approved reporting, analytics, support, and controlled operational exports."
},
"publication": {
"publication_id": "accef000-0000-4000-8000-000000000001",
"published_at": "2026-07-16T00:00:00.000Z"
}
}
Limits and notesDirect link to Limits and notes
proposed_usealone is refused. Without anasset, the call returns anot_supportederror — there is no deterministic way to resolve free text to an asset, and the tool never guesses. Resolve the asset first withdiscover_context.scenario_keymust be canonical. Values outside the canonical scenario vocabulary are rejected withinvalid_parameters; see Scenarios.business_contextfollows scope. It is derived from the asset's published business-context instruction row; when ascenario_keyfilter excludes that row,business_contextisnull.- 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 this workspace's catalog; cross-workspace references are indistinguishable from not found),invalid_parameters,not_supported,read_failed, plus the sharedunauthorized,auth_unavailable,rate_limited,quota_exceeded.
RelatedDirect link to Related
authorize_use— a single advisory verdict for a proposed useinspect_governance_rules— the rule list without an effective verdictexplain_why— explain one cited record bydecision_id- Typed answer states — states and reason codes in depth
- MCP schemas — full input and output schema reference