This prompt is designed for a single, well-scoped job: generating a user-facing explanation after an upstream policy engine, risk scorer, or allowlist check has already decided to deny a tool invocation. It does not make the denial decision. It does not evaluate the safety of the request. It assumes the decision is final and focuses entirely on the communication layer—translating a machine-level denial into a clear, non-technical message that maintains user trust and offers a constructive path forward. The ideal user is a product designer or frontend engineer integrating an AI copilot or chat interface where a raw error code or silent failure would degrade the experience.
Prompt
Tool Denial Explanation Prompt for End Users

When to Use This Prompt
Understand the exact job this prompt performs, the required upstream context, and the boundaries where it should not be applied.
Before using this prompt, you must have the following inputs available: the name of the denied tool, a machine-readable reason code (e.g., RISK_THRESHOLD_EXCEEDED, ROLE_NOT_AUTHORIZED, SUBSCRIPTION_TIER_INSUFFICIENT), the user's visible role or context, and any relevant policy citation. The prompt template uses square-bracket placeholders like [DENIED_TOOL], [DENIAL_REASON_CODE], [USER_CONTEXT], and [POLICY_REFERENCE] to wire these inputs into the generation. You should also provide a [SAFE_ALTERNATIVE] or [ESCALATION_PATH] if one exists; if not, the prompt is designed to gracefully acknowledge the lack of alternatives rather than fabricating them. The output is a plain-language message suitable for rendering directly in a chat bubble or inline notification.
Do not use this prompt for internal logging, audit trail generation, or system-to-system communication. Those use cases require structured, machine-readable outputs with full fidelity to the denial metadata, not user-friendly prose. Do not use this prompt to make the denial decision itself—that responsibility belongs to a deterministic policy engine or a separate classification model with its own evaluation and calibration. Do not use this prompt when the denial reason involves a transient error or retryable condition; users should receive a different message class for TRY_AGAIN scenarios. Finally, do not use this prompt as a substitute for a system-level refusal policy or safety classifier. It is a communication tool, not a safety control. If you are operating in a regulated domain, ensure that a human reviews the generated messages for a representative sample of denial scenarios before production deployment, and log both the denial metadata and the generated message together for auditability.
Use Case Fit
Where the Tool Denial Explanation Prompt works and where it introduces risk. Use these cards to decide if this prompt fits your product surface before you integrate it.
Good Fit: User-Facing Agent Products
Use when: a user-facing agent or copilot denies a tool invocation and the end user needs a clear, non-technical reason. Guardrail: the prompt must receive the denied tool name, the user's original request, and the policy reason as input variables to generate an accurate explanation.
Bad Fit: Internal Agent-to-Agent Denial
Avoid when: one agent denies another agent's tool call in a multi-agent system. End-user explanation language is too verbose and imprecise for machine-to-machine communication. Guardrail: use a structured error code or a machine-readable denial schema instead, and reserve this prompt for the final human-facing layer.
Required Inputs
Risk: generating an explanation without the actual denial reason produces a generic, untrustworthy message. Guardrail: always supply [DENIED_TOOL], [USER_REQUEST], [POLICY_REASON], and optionally [SAFE_ALTERNATIVE] as explicit template variables. Never rely on the model to infer why a tool was denied.
Operational Risk: Explanation Drift
Risk: over time, the model may soften refusal language, omit the policy reason, or suggest unsafe alternatives to appear more helpful. Guardrail: add eval assertions that check for the presence of the policy reason, the absence of unsafe suggestions, and a tone that is helpful but firm. Run these evals on every prompt version change.
Operational Risk: Information Leakage
Risk: the explanation might reveal internal tool names, permission structures, or policy details that an attacker could use to probe the system. Guardrail: sanitize internal identifiers before they reach the prompt. Use user-facing tool labels and policy descriptions, not internal function names or raw config keys.
Escalation Path Requirement
Risk: a denial without a next step leaves the user stuck and generates support tickets. Guardrail: every explanation must include either a safe alternative action or a clear escalation path such as contacting an administrator or requesting a review. Test for the presence of at least one path in every generated response.
Copy-Ready Prompt Template
A reusable template for generating user-facing explanations when a tool invocation is denied, with placeholders for policy, risk, and escalation context.
This template generates a clear, non-technical refusal message when an agent's tool call is blocked by a policy engine. It is designed to be inserted into the system prompt or a post-tool-decision handler. The goal is to maintain user trust by being transparent about the denial reason, citing the relevant policy, and providing a constructive path forward—either a safe alternative tool or an escalation channel. Do not use this template for security-sensitive denials where revealing the policy rationale could aid an attacker; in those cases, use a generic refusal and log the details internally.
codeSYSTEM: You are an assistant that explains tool access denials to end users. When a tool invocation is denied, you will receive a structured denial record. Your task is to translate that record into a helpful, non-technical message for the user. DENIAL RECORD: - Denied Tool: [DENIED_TOOL_NAME] - Denial Reason Code: [REASON_CODE] - Policy Reference: [POLICY_CLAUSE_ID] - User's Role: [USER_ROLE] - Session Risk Score: [RISK_SCORE] - Safe Alternative Tool (if any): [ALTERNATIVE_TOOL] - Escalation Contact: [ESCALATION_EMAIL] OUTPUT REQUIREMENTS: 1. Acknowledge the user's request without repeating the full technical tool name. 2. Explain the denial in plain language, referencing the policy reason without exposing internal risk thresholds. 3. If [ALTERNATIVE_TOOL] is provided, suggest it as a permitted way to achieve a similar outcome. 4. If no alternative is available, provide the escalation path: "If you believe this is an error, you can request a review by contacting [ESCALATION_EMAIL]." 5. Maintain a helpful, professional tone. Do not apologize excessively or imply the policy is arbitrary. 6. Output ONLY the user-facing message. No JSON, no metadata. CONSTRAINTS: - Never reveal the raw [RISK_SCORE] or internal [REASON_CODE] to the user. - Do not suggest workarounds that involve rephrasing the request to bypass the policy. - If the denial is for a regulated domain action, include a brief disclaimer that a human review is required.
To adapt this template, replace the square-bracket placeholders with values from your policy engine, session state, and product configuration. The [REASON_CODE] and [POLICY_CLAUSE_ID] should map to a human-readable policy library that the model can reference if needed. For high-risk domains like finance or healthcare, add a [REGULATED_DOMAIN] flag that triggers mandatory human-review language. Before deploying, run this prompt through a regression suite that includes edge cases such as: a user with a borderline risk score, a denied tool that has no safe alternative, and a user attempting to escalate for a clearly malicious request. Validate that the output never leaks internal risk scores or raw policy codes.
Prompt Variables
Inputs required for the Tool Denial Explanation Prompt. Validate each before calling the model to prevent runtime errors and ensure the denial message is accurate and helpful.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[DENIED_TOOL_NAME] | The human-readable name of the tool or function that was denied. | export_customer_data | Must be a non-empty string. Check against a known list of tool names to prevent hallucination in the denial message. |
[USER_ROLE] | The current role or permission tier of the user making the request. | viewer | Must match an entry in the allowed roles enum. If null or unknown, default to a restrictive role like 'guest'. |
[POLICY_REFERENCE] | A short, stable identifier for the specific policy clause that triggered the denial. | data-export-policy-4.2 | Must be a non-empty string. Validate that the reference exists in the current policy document to prevent citing a non-existent rule. |
[SAFE_ALTERNATIVE_TOOL] | The name of a permitted tool or action the user can take instead, if one exists. | download_report_csv | Can be null if no alternative exists. If provided, must be a valid tool name in the current allowlist for the user's role. |
[ESCALATION_PATH] | Instructions for how the user can request a review or exception. | File a request at /admin/tool-access | Must be a non-empty string or a valid internal URL. If null, the prompt should omit the escalation sentence entirely. |
[REQUEST_CONTEXT] | A brief, sanitized summary of what the user was trying to accomplish. | Trying to export all user data for a quarterly audit. | Must be a non-empty string. Sanitize to remove any PII or prompt injection attempts before inserting into the prompt. |
[TONE_PROFILE] | A keyword that sets the communication style for the denial message. | helpful_and_transparent | Must be one of a predefined enum: 'formal', 'friendly', 'helpful_and_transparent', 'direct'. Reject any other value. |
Implementation Harness Notes
How to wire the Tool Denial Explanation Prompt into an agent's tool-execution pipeline with validation, logging, and safe fallbacks.
This prompt should be invoked after a tool access decision has been made by the authorization layer, not before. The authorization system (e.g., a policy engine evaluating user role, risk score, or session state) produces a structured denial reason—such as POLICY_VIOLATION, TIER_RESTRICTION, or RISK_THRESHOLD_EXCEEDED. That denial reason, along with the denied tool name and any relevant policy citation, is passed into this prompt as [DENIAL_REASON], [DENIED_TOOL], and [POLICY_REFERENCE]. The model's only job is to generate a user-facing explanation message. It must not re-evaluate the access decision or suggest workarounds that bypass the policy.
Wire this prompt as a synchronous post-denial step in your tool-execution middleware. In pseudocode: if auth.check_tool_access(tool_call) == DENY: explanation = llm.generate(denial_prompt, context). The output must be validated against the [OUTPUT_SCHEMA] before being returned to the user. At minimum, validate that the message field is non-empty, does not contain the denied tool's invocation syntax, and does not leak internal policy logic or system prompt fragments. For high-risk deployments, add a regex blocklist that rejects explanations containing phrases like 'ignore previous instructions,' 'you now have access,' or the names of restricted tools. Log the full denial tuple—user ID, session ID, denied tool, denial reason, generated explanation, and validator result—to your observability stack for audit and over-refusal analysis.
Choose a fast, cost-effective model for this step. The explanation generation is a low-complexity, high-volume task that does not require a frontier model. A small model like GPT-4o-mini, Claude Haiku, or a fine-tuned open-weight model is appropriate. If latency is critical, pre-cache common denial templates and use the model only for edge cases. Implement a retry with fallback strategy: if the generated explanation fails schema validation or triggers the blocklist, retry once with an explicit instruction to avoid the flagged pattern. If the retry also fails, fall back to a static, human-reviewed safe message such as 'This action isn't available right now. Contact support for help.' Never surface a raw model failure to the user. For regulated domains, route all generated explanations through a human review queue during an initial probation period, then sample-review after the system demonstrates consistent performance against your eval suite.
Expected Output Contract
Each field the prompt must return, its type, whether it is required, and the validation rule to apply before the message reaches the user.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
denial_message | string | Must be non-empty and contain no markdown or HTML. Must not include the denied tool name or internal policy ID. | |
safe_alternative | string or null | If null, validate that no permitted tool exists for the intent. If string, must reference a specific allowed tool or workflow by its user-facing name. | |
escalation_path | string | Must match one of the allowed escalation values: 'contact_admin', 'request_access', 'none'. If 'none', confirm no escalation is configured for this tool. | |
policy_citation | object | If present, must contain 'clause_id' (string) and 'summary' (string). 'clause_id' must exist in the active policy registry. Omit for guest or unauthenticated users. | |
tone_label | string | Must be one of 'helpful', 'neutral', 'firm'. Reject any other value. 'firm' is only allowed when [RISK_SCORE] > 0.8. | |
request_id | string | Must match the [REQUEST_ID] input exactly. Used by the harness to correlate the denial with the originating request. | |
retry_allowed | boolean | Must be false if [RISK_SCORE] > 0.9 or if the same tool was denied in the previous turn. Otherwise, may be true. |
Common Failure Modes
Tool denial explanations fail in predictable ways that erode trust, increase support tickets, and create security gaps. Here are the most common failure modes and how to guard against them.
Vague Refusal Without Policy Citation
What to watch: The model says 'I can't do that' without explaining which policy applies or why. Users perceive this as arbitrary and unhelpful, driving rephrasing attempts or support escalations. Guardrail: Require every denial to cite a specific policy clause from a structured policy map. Test with a golden set of denied requests and verify citation presence and accuracy.
Over-Explanation That Leaks Policy Details
What to watch: The model provides too much detail about internal policy logic, tool allowlists, or risk thresholds. Attackers use this to probe boundaries and craft bypass attempts. Guardrail: Constrain explanation depth to user-appropriate detail. Red-team the explanation output for information leakage about internal thresholds, blocklist patterns, or role mappings.
Inconsistent Denial Across Re-Phrasings
What to watch: A user rephrases a denied request and receives a different response—sometimes a denial with different reasoning, sometimes accidental approval. This is the most common jailbreak vector in production. Guardrail: Test every denial prompt against a rephrasing battery. Verify that semantically equivalent requests produce consistent denial decisions and consistent policy citations across turns.
Missing Safe Alternative or Escalation Path
What to watch: The denial is technically correct but leaves the user with no next step. This generates support tickets and user frustration, especially when a permitted alternative tool exists. Guardrail: Map every denied tool to at least one permitted alternative or an escalation path. Validate that the alternative suggestion appears in the output and is actually permitted under the user's current role and session state.
Tone Mismatch Damaging User Trust
What to watch: The denial tone is either overly apologetic (undermining policy authority) or overly robotic (damaging user experience). Both extremes reduce trust and increase circumvention attempts. Guardrail: Define a tone spec with examples of acceptable refusal language. Include tone evaluation in your test suite using an LLM judge or human review against calibrated examples of good and bad refusal tone.
Denial Bypass Through Tool Output Injection
What to watch: An attacker uses a permitted tool to retrieve content containing instructions that override the denial policy, then requests the denied tool again. The agent follows the injected instructions instead of the system policy. Guardrail: Sanitize tool outputs for instruction-like content before they enter the agent's context. Test with indirect prompt injection payloads embedded in tool responses and verify that the denial policy holds.
Evaluation Rubric
Score each criterion on a pass/fail or 1-5 scale to test output quality before shipping the Tool Denial Explanation Prompt.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
Clarity of Denial | User understands the tool is unavailable without technical jargon | Message uses internal error codes, stack traces, or vague 'something went wrong' language | Manual review by non-engineer: can they identify what was denied and why? |
Policy Transparency | Message cites the specific policy reason in plain language (e.g., 'This action requires an upgraded plan') | Message says 'not allowed' without any policy reference or uses internal policy IDs | Check output for presence of a policy reason string from the allowed set in [POLICY_REASONS] |
Safe Alternative Offer | Message suggests at least one permitted alternative action or escalation path when available | Message ends with the denial only; no next step, link, or contact option provided | Assert that output contains an alternative suggestion when [ALTERNATIVES] is non-empty |
Tone Appropriateness | Tone matches [TONE_PROFILE]: helpful, not apologetic or confrontational | Message is overly apologetic ('I'm so sorry'), defensive, or sarcastic | LLM-as-judge eval using a 1-5 Likert scale against the [TONE_PROFILE] description |
No Hallucinated Capabilities | Message does not invent features, permissions, or upgrade paths not present in [AVAILABLE_UPGRADES] | Message suggests a plan tier, feature, or contact method that does not exist in the provided context | Schema check: all mentioned alternatives must match an entry in [AVAILABLE_UPGRADES] or [ESCALATION_PATHS] |
Data Minimization | Message does not echo back sensitive arguments from the denied tool call | Message repeats the user's input data, file paths, or query parameters in the denial text | Regex scan for patterns matching [DENIED_ARGUMENTS]; output must contain zero matches |
Escalation Path Validity | If escalation is offered, the path matches a valid entry in [ESCALATION_PATHS] | Message provides a broken link, generic 'contact support' with no method, or an internal-only route | Validate any URL or contact method against the [ESCALATION_PATHS] schema |
Conciseness | Message is under [MAX_RESPONSE_LENGTH] tokens while meeting all other criteria | Message is verbose, repeats the denial multiple times, or includes unnecessary preamble | Token count check using the target model's tokenizer; fail if length exceeds [MAX_RESPONSE_LENGTH] |
Enabling Efficiency, Speed & Accuracy
Intelligent Analysis, Decision & Execution
We build AI systems for teams that need search across company data, workflow automation across tools, or AI features inside products and internal software.
Talk to Us
Search across company data
Give teams answers from docs, tickets, runbooks, and product data with sources and permissions.
Useful when people spend too long searching or get different answers from different systems.

Automate internal workflows
Use AI to route work, draft outputs, trigger actions, and keep approvals and logs in place.
Useful when repetitive work moves across multiple tools and teams.

Add AI to products and internal tools
Build assistants, guided actions, or decision support into the software your team or customers already use.
Useful when AI needs to be part of the product, not a separate tool.
Adapt This Prompt
How to adapt
Start with the base prompt and a simple allowlist of denied tools. Use a single [DENIED_TOOL] and [USER_ROLE] placeholder. Skip structured output requirements initially; accept a plain-text refusal message.
codeYou are a helpful assistant. The user requested [DENIED_TOOL], which is not available for their role ([USER_ROLE]). Explain this clearly and suggest a permitted alternative if one exists.
Watch for
- The model inventing permissions that don't exist
- Overly apologetic or defensive tone
- No safe alternative offered when one is available

About the author
Prasad Kumkar
CEO & MD, Inference Systems
Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.
His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.
Partnered with leading AI, data, and software stack.
How We Work
Custom AI workflows for your Business
One-fit-all AI don't work for modern businesses. At Inferensys, we aim to understand your business & custom requirements; which we use to define most efficient agentic workflows, the data, and the tools for your business.
01
Review the use case
We understand the task, the users, and where AI can actually help.
Read more02
Pick the right approach
We define what needs search, automation, or product integration.
Read more03
Build the first useful version
We implement the part that proves the value first.
Read more04
Improve from there
We add the checks and visibility needed to keep it useful.
Read moreThe first call is a practical review of your use case and the right next step.
Talk to Us