? Halyard

Documentation

Connect your AI agents to human experts via the Model Context Protocol (MCP).

Getting Started

Halyard integrates with Claude Code, Claude Desktop, OpenAI Codex, Cursor, Windsurf, and any MCP-compatible AI tool. Once connected, your AI agents can consult human experts in real-time via Slack.

1

Sign up and connect Slack

Create an account at app.usehalyard.ai and connect your Slack workspace. Add team members and assign roles (engineer, designer, pm, architect) and skills.

2

Install the MCP server

Add Halyard to your AI tool of choice. See the Installation section for setup instructions per client.

3

Authenticate

When your AI tool connects, you'll be prompted to log in and authorize access via OAuth. Your agent will then have access to consult experts in your organization.

Prerequisites
  • An Halyard account with a connected Slack workspace
  • At least one expert configured in your team

Installation

Choose your AI client below. The MCP server endpoint is:

https://mcp.usehalyard.ai MCP

Claude Code Recommended

Install via the plugin marketplace:

Claude Code
/plugin marketplace add halyard-labs/claude-plugin-marketplace
/plugin install ask-expert@halyard-labs

When prompted, authorize with your Halyard account. The plugin handles OAuth automatically. Claude will then proactively use ask_expert when it encounters ambiguity or needs human judgment.

Enable for your entire team

Instead of having each teammate install manually, add the plugin to your repo's .claude/settings.json. This enables it automatically for anyone who opens the project in Claude Code:

.claude/settings.json
{
  "enabledPlugins": {
    "ask-expert@halyard-labs": true
  },
  "extraKnownMarketplaces": {
    "halyard-labs": {
      "source": {
        "source": "github",
        "repo": "halyard-labs/claude-plugin-marketplace"
      }
    }
  }
}

Commit this file to your repo. Teammates will get the plugin enabled on their next session without any manual setup.

OpenAI Codex

Add Halyard as a remote MCP server in your project's codex.json:

codex.json
{
  "mcpServers": {
    "halyard": {
      "type": "http",
      "url": "https://mcp.usehalyard.ai"
    }
  }
}

On first use, Codex will redirect you to Halyard for OAuth authorization. Codex discovers the available tools automatically.

Claude Desktop, Cursor & Windsurf

Add the following to your MCP client configuration file:

claude_desktop_config.json / .cursor/mcp.json
{
  "mcpServers": {
    "halyard": {
      "type": "http",
      "url": "https://mcp.usehalyard.ai"
    }
  }
}
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Cursor
.cursor/mcp.json in your project root
Windsurf
~/.codeium/windsurf/mcp_config.json

Any MCP Client

Halyard exposes a standard Model Context Protocol server over HTTP with OAuth 2.0 authentication.

Point your MCP client at https://mcp.usehalyard.ai. Clients that support RFC 9728 (Protected Resource Metadata) will automatically discover the authorization server via the /.well-known/oauth-protected-resource endpoint.

For manual setup, the authorization server is located at https://api.usehalyard.ai.

mcp config
{
  "type": "http",
  "url": "https://mcp.usehalyard.ai"
}

Configuration

After installing the MCP server, configure your team in the Halyard dashboard.

Experts

Add team members as experts and assign them roles and skills. When an AI agent asks a question, Halyard routes it to the most relevant available expert based on these attributes.

Roles
Broad categories like engineer, designer, pm, architect. Use when the question is about a general domain.
Skills
Specific expertise like payments, auth, infra. Use when the question is about a particular system or technology.

Knowledge Base

Halyard builds an organizational knowledge base from summarized conversations. When an agent asks a question that has been answered before, it can retrieve the answer without contacting an expert. Use the summarize_conversation, search_knowledge, and list_knowledge tools to build and query this knowledge base.

Available Tools

Once connected, your agent gains access to these tools. It will use them proactively when it encounters ambiguity or needs human judgment.

list_experts read-only

Discover available human experts you can consult. Call this first to see who is available and their roles/skills. Optionally filter by role or skill.

role string, optional Filter experts by role (e.g. "engineer", "designer")
skill string, optional Filter experts by skill (e.g. "payments", "auth")
available_only boolean, optional Only return experts not set to Do Not Disturb
ask_expert creates conversation

Send a question to a human expert via Slack. Specify a role or skill to route to the right person. Optionally provide response options for quick answers.

prompt string, required The question or request to send to the expert
role string, optional The role of the expert to contact
skill string, optional The skill the expert should have
options array, optional Response options for the expert to choose from
conversation_id string, optional Resume waiting on an existing conversation
check_response read-only

Check if an expert has responded to your question. Can optionally wait up to 55 seconds for a response.

conversation_id string, required The conversation ID from ask_expert
wait boolean, optional If true, wait up to 55 seconds for a response
get_conversation read-only

Retrieve the full conversation history with all messages exchanged between the agent and expert.

conversation_id string, required The conversation ID from ask_expert
reply_to_expert sends message

Send a follow-up message in an existing conversation. Use this for clarifying questions or providing additional context.

conversation_id string, required The conversation ID from ask_expert
message string, required Your message to the expert
summarize_conversation builds knowledge

Save a structured summary of what was learned from an expert. This builds an organizational knowledge base that helps answer similar questions in the future without bothering experts again.

conversation_id string, required The conversation ID to summarize
question string, required The question or context that was asked
answer string, required The answer or guidance provided by the expert
summarize_work builds knowledge

Save a summary of significant agent work to the knowledge base. Use this after completing meaningful work like implementing features, making architectural decisions, or documenting processes.

title string, required A concise title for the work
summary string, required Detailed summary of what was done
tags string[], optional Tags for categorizing the work
entry_type string, optional Type of entry: "WORK_OUTPUT" (default), "DECISION", or "PROCESS"
session_id string, optional Link this work to a specific agent session
search_knowledge read-only

Search the organizational knowledge base using semantic similarity. Returns past decisions, Q&A answers, work summaries, and documentation.

query string, required Natural language search query
limit number, optional Maximum number of results (default: 5)
type string, optional Filter by entry type: "QA", "WORK_OUTPUT", "DECISION", "PROCESS"
author string, optional Filter by author. Use "me" for your own entries, or a user ID.
since string, optional Filter by time: "today", "yesterday", "this week", "7d", "30d", "90d", or ISO date
list_knowledge read-only

List recent knowledge base entries. Use to see what the team or a specific person has been working on.

type string, optional Filter by entry type: "QA", "WORK_OUTPUT", "DECISION", "PROCESS"
author string, optional Filter by author. Use "me" for your own entries, or a user ID.
since string, optional Filter by time: "today", "yesterday", "this week", "7d", "30d", "90d", or ISO date
limit number, optional Maximum number of entries to return (default: 10)
close_conversation modifies state

Close a conversation without adding a summary. Use summarize_conversation instead if you want to capture knowledge.

conversation_id string, required The conversation ID to close

Usage Examples

Architecture Decision

An AI agent needs guidance on authentication strategy while refactoring a login flow.

Step 1 — Find available architects
list_experts(role: "architect")
Step 2 — Ask the question
ask_expert(
  prompt: "Should I use JWT tokens or session-based auth for the new login flow?
           The current codebase uses express-session.",
  role: "architect"
)
Step 3 — Wait for response
check_response(conversation_id: "conv_123", wait: true)
Step 4 — Capture the learning
summarize_conversation(
  conversation_id: "conv_123",
  question: "JWT vs session auth for new login flow",
  answer: "Use JWT for the new auth system. Team decided to migrate away
           from sessions for better horizontal scaling."
)

Design Clarification

An AI agent implementing a feature needs to clarify UI requirements with the design team. Provide response options so the expert can quickly tap to respond.

Ask with response options
ask_expert(
  prompt: "For the error state on the payment form, should I show
           the error inline or as a toast notification?",
  role: "designer",
  options: [
    { label: "Inline error", value: "inline" },
    { label: "Toast notification", value: "toast" },
    { label: "Both", value: "both" }
  ]
)

The expert sees the options in Slack and can quickly tap to respond, or provide a custom answer.

Multi-turn Conversation

Sometimes you need a back-and-forth discussion with an expert.

Initial question
ask_expert(
  prompt: "How should I handle rate limiting from the Stripe API?",
  skill: "payments"
)
// Returns: conversation_id: "conv_456"
Expert responds: "Use exponential backoff with jitter"
reply_to_expert(
  conversation_id: "conv_456",
  message: "Should I also add failed requests to a dead-letter queue?"
)
Expert responds: "Yes, use the DLQ helper in packages/queue"
summarize_conversation(
  conversation_id: "conv_456",
  question: "Handling Stripe rate limits",
  answer: "Use exponential backoff + jitter. After 3 retries,
           push to DLQ. Use packages/queue/retry.ts and DLQ helpers."
)

Best Practices

Always call list_experts first

Before asking a question, check who's available and what roles/skills exist. This helps route questions to the right person and avoids sending messages to unavailable team members.

Use role OR skill, not both

Specifying both role and skill can be overly restrictive. Pick the most relevant dimension for your question. Use role for general domain questions and skill for specific technology questions.

Always summarize good answers

Calling summarize_conversation after receiving a helpful response builds your organization's knowledge base. Future questions may be answered automatically via search_knowledge without bothering experts.

Provide context in your questions

Experts give better answers when they understand the context. Include relevant details about what you're building, what you've already tried, and why you need guidance.

Use response options for simple choices

When your question has a small set of possible answers, pass options to ask_expert. This lets the expert respond with a single tap in Slack, reducing friction and response time.

Support

We're here to help you get the most out of Halyard.