Answer your FAQ inside the MCP server, before a ticket exists

Mount a support_ask tool in your MCP server. It matches the user's question against a short list of rules you write from your FAQ, answers in the chat with no model call, and lists the account's recent errors. If no rule matches, it says so and points at support_open_ticket. Most questions end there, and the rest reach your team with the context attached.

Why answer in the chat

A user of your MCP server is inside Claude, ChatGPT or Cursor. They do not open your help centre. When something fails they ask the agent, and the agent can only use the tools your server gives it. If one of those tools answers from your FAQ, the user gets the fix in the same conversation. No ticket is opened and nobody waits.

Step by step

  1. 1. List the questions you already answer

    Take the last 20 support emails or chats. Group them. Keep the 3 to 10 questions that come back most: credits, a missing connection, a rate limit, a permission, a stale tool list.

  2. 2. Write each answer as a rule

    A rule is a few words to match, the answer in one or two plain sentences, and optionally the tool the agent should call next. The answer comes from your docs or FAQ, not from a model.

  3. 3. Match in code, with no model call

    Lower-case the question and look for the words. A rule match is fast, free and the same every time. The user reads exactly what you wrote.

  4. 4. Add the recent errors of the account

    Return the last failed calls of this user next to the answer. The agent can say what went wrong, and a person gets the same list if a ticket follows.

  5. 5. Point unknown questions at the ticket

    If no rule matches, say so and name support_open_ticket as the next tool. Never invent an answer. A wrong answer in the chat costs more than a ticket.

  6. 6. Tell the agent when to call it

    Add one sentence to your server instructions and to every tool error: if this keeps failing, call support_ask. Without that sentence the agent will not know the tool is there.

The tool, in code

A plain version you can write yourself. The rules are examples: replace them with your own answers.

// support_ask: match the question against answers you already give. No model call.
type Rule = { match: string[]; answer: string; nextTool?: string };

const rules: Rule[] = [
  { match: ["credit", "balance", "out of"], answer: "Your balance is empty. Top up in the web app, then try again.", nextTool: "get_balance" },
  { match: ["rate limit", "too many", "429"], answer: "You hit the hourly limit. Wait a few minutes and retry." },
  { match: ["not connected", "connect", "sign in"], answer: "Your account is not linked yet. Open Settings, Connections, and link it." },
];

function supportAsk(question: string, recentErrors: string[]) {
  const q = question.toLowerCase();
  const hit = rules.find((r) => r.match.some((w) => q.includes(w)));
  if (hit) return { answer: hit.answer, nextTool: hit.nextTool, recentErrors };
  // Never guess. Say it is not covered and point at the ticket.
  return {
    answer: "I do not have a ready answer for this.",
    nextTool: "support_open_ticket",
    recentErrors,
  };
}

Or mount it with one call

The @canhelpto/mcp-support package adds support_ask, support_open_ticket and support_ticket_status, records the last calls of each user and adds a support hint to every tool error. You pass the rules.

import { withSupport } from "@canhelpto/mcp-support";

withSupport(server, {
  apiKey: process.env.CANHELPTO_API_KEY!,
  product: "Example Product",            // an example name: use your own
  user: (extra) => ({ id, name, email }), // your existing user lookup
  rules: [
    { match: ["credit", "balance"], answer: "Your balance is empty. Top up in the web app.", nextTool: "get_balance" },
  ],
});

What good rules look like

canhelpto gives you the ticket side: the three tools, an inbox for your team, and the reply sent back by email and through the connector. The calls are in the docs for agents. Plans are on the pricing page. Related: handle MCP tool errors so the user gets help.