For AI agents: a documentation index is available at the root level at /llms.txt and /llms-full.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.
Logo
DeveloperAcademyCommunityStatus
ReferenceGuides
ReferenceGuides
  • Agent Studio
    • Overview
    • Quickstart Guides
    • Core Concepts
    • Conversation Process
      • Slots
      • Resolver Strategies
      • Activities
        • Content Activities
        • Activity Responses
        • Response Sizes
        • Returning URLs & Links
      • Control Flow
      • Conversation Process Data Bank
      • Conversation Timeouts
    • Actions
    • Connectors
    • System Triggers
    • Agent Architect
    • Cookbooks
    • Development and Testing
    • AI Agent Marketplace
    • Developer Tools
  • Agentic AI
    • LLM Fundamentals
    • The Agentic Reasoning Engine
    • Memory Constructs
    • Conversational Context
    • Guardrails
    • Grounding and Hallucinations
    • Continuous Learning
    • LLMs & SLMs
    • Steerability Tools
    • Multilingual Support
  • Core Platform
    • User Identity
    • Moveworks Agent (On-Prem)
    • Approvals Engine
    • Entity Catalog
    • Moveworks Data Objects
    • Security Information and Event Management (SIEM) Logs Overview
DeveloperAcademyCommunityStatus
On this page
  • Overview
  • URLs
  • General Guidance
  • Formatting Guidelines
  • Constructing URLs Dynamically
  • Hyperlinks
  • Recommended Formats (in order of preference)
  • Formats to Avoid
Agent StudioConversation ProcessActivities

Returning URLs & Links

||View as Markdown|
Was this page helpful?
Edit this page
Previous

Control Flow

Control Flow blocks that are available in the Conversation Process.
Next
Built with

Overview


When your plugin needs to return URLs or hyperlinks, it’s critical to do so in a structured, consistent, and safe manner. Correctly formatted links improve reliability, readability, and ensure the reasoning engine interprets them correctly.

This document outlines the best practices for returning URLs and hyperlinks from your plugin responses.

URLs

General Guidance

Ideally, URLs should be returned as a string value within a structured payload under a url key. Avoid embedding them inside free-form, mixed-format text that combines instructions and URLs.

For example, when returning a URL such as https://docs.moveworks.com, you can choose one of two presentation styles:

  • Hyperlink format - when you want the link to display as descriptive text:

1url: '"[Click here](https://docs.moveworks.com)"'
  • Raw URL format - when you want the URL to appear directly:

1url: '"Moveworks Docs: https://docs.moveworks.com"'

Both are valid, depending on how you want the client or reasoning engine to interpret the response.


Formatting Guidelines

Follow these rules whenever possible:

  1. Always prepend https:// to URLs.
    1. ✅ Good: https://example.com
    2. ❌ Bad: example.com
  2. URI-encode special characters when used outside their reserved meaning.
    1. Encode spaces as %20 — this is the most critical.
    2. Encode bracket characters ()[] if used outside reserved contexts, especially ().

Why this matters:

Characters like ?, (), and [] have reserved meanings in URLs or in Markdown syntax. Failing to encode them can break the link or cause rendering or hallucination issues in LLM contexts.

CharacterEncoding
Space " "%20
(%28
)%29
[%5B
]%5D

  • ✅ Good: https://docs.moveworks.com%20with%20spaces%20and%20%28parentheses%29
  • ❌ Bad: https://docs.moveworks.com with spaces and (parentheses)

Constructing URLs Dynamically

When building URLs dynamically and deterministically in your plugin, use DSL or Bender/Data Mapper utilities like $CONCAT() or RENDER() to define them as part of your payload. This makes them easier for the reasoning engine to interpret and reduces hallucination risk as opposed to trying to use free form text and have the llm figure it out.

Example using $CONCAT()

If you have:

  • a base URL: https://us2.itsm.com
  • a ticket ID under data.result.ticket_id

You can define:

1ticket_url: $CONCAT(["https://us2.itsm.com/", data.result.ticket_id], "")

This creates a properly structured ticket_url key that represents the final link.

Example using RENDER()

1ticket_url:
2 RENDER():
3 template: >
4 {{base_url}}{{ticket_number}}
5 args:
6 base_url: '"https://us2.itsm.com/"'
7 ticket_number: data.result.ticket_id

Both approaches ensure the URL is generated consistently and readable by downstream systems.


Hyperlinks

When returning **hyperlinks ** in a plugin response, use a consistent, machine-readable format. Proper hyperlink formatting ensures that links are rendered correctly across clients (e.g., chat interfaces, documentation, or dashboards) and parsed reliably by the reasoning engine.

Recommended Formats (in order of preference)

  1. Markdown format - Use standard Markdown link syntax whenever possible:
1[Click here](https://docs.moveworks.com)

✅ Preferred — Markdown is portable, readable, and supported in most rendering contexts.

  1. Slack-style format - Use Slack’s <URL|text> syntax only when using Slack as you only chat interface.
1<https://docs.moveworks.com|Click here>

⚠️ Acceptable, but not preferred — This format is platform-specific.

Formats to Avoid

The following formats should not be used in plugin responses:

  • ❌ <https://example.com> — plain angle-bracketed URL
  • ❌ <a href="https://example.com">link</a> — raw HTML anchor tags
  • ❌ [Click here|https://example.com] — invalid Markdown syntax