Skip to main content
Glama
HassanYousafzai

ai-support-agent

AI Support Agent — MCP + RAG + Evals + Automation

An end-to-end AI support agent built to demonstrate production-grade AI integration: a FastAPI backend exposed as an MCP (Model Context Protocol) server, backed by semantic search over a real knowledge base, with automated evaluation and observability, and triggered live from Slack via n8n.

This isn't a chatbot demo — it's the architecture behind what companies actually pay AI engineers to build: an agent that can safely look up real business data, answer questions grounded in real documentation, hand off to a human when it can't resolve something, and prove (with logged evals) that it isn't hallucinating.

What it does

A support request comes in — via Claude Desktop, or a real Slack message — and the agent:

  1. Looks up order status from a real backend database (get_order_status)

  2. Searches a knowledge base semantically — not keyword matching — to answer policy questions (search_docs)

  3. Creates a support ticket when it can't resolve something automatically (create_ticket)

Every tool call is traced end-to-end (input, output, tokens, cost, latency), and a small automated eval suite verifies the agent is grounded — it says "I don't know" instead of guessing, and correctly matches paraphrased questions to the right policy.

Related MCP server: Customer Support MCP Server

Architecture

Slack message
     │
     ▼
n8n (Code node filters bot's own messages to prevent loops)
     │
     ▼
FastAPI wrapper endpoint (/agent/support-query)
     │
     ├─▶ Order lookup (SQLite via SQLAlchemy)
     │
     └─▶ Semantic search:
              OpenAI embeddings (text-embedding-3-small)
                     │
                     ▼
              Supabase (pgvector) similarity search
     │
     ▼
Response posted back to Slack

─────────────────────────────────────────

Claude Desktop
     │
     ▼
MCP server (stdio) ── same three tools, same backend
     │
     ▼
Langfuse (traces every call: input, output, tokens, cost)

Stack

Layer

Tech

Backend API

FastAPI, SQLAlchemy, SQLite

Agent protocol

MCP (Model Context Protocol) via mcp Python SDK

Semantic search / RAG

OpenAI embeddings (text-embedding-3-small) + Supabase/pgvector

Observability

Langfuse (traces, token usage, cost tracking)

Automation

n8n (self-hosted via Docker), Slack Events API

Local tunnel

ngrok (with traffic policy to bypass free-tier interstitial)

Tools exposed

get_order_status(order_id: int)

Looks up an order's status and tracking number. Returns a clear "not found" message for invalid IDs rather than guessing.

search_docs(query: str)

Semantic search over a knowledge base (shipping policy, returns, order tracking docs). Matches paraphrased queries — e.g. "can I get my money back" correctly retrieves the Return Policy doc with zero keyword overlap — because it embeds and compares meaning, not text.

create_ticket(customer_name: str, issue: str)

Creates a support ticket for issues the agent can't resolve automatically, so nothing falls through the cracks.

Evals

A small automated eval suite (app/run_evals.py) runs 10 test cases across all three tools, including:

  • Correct order lookups and a graceful "no order found" for invalid IDs

  • Semantic search matching paraphrased queries with no literal keyword overlap to the source doc

  • Correctly saying "no relevant documents found" for off-topic queries, instead of hallucinating an answer

  • Ticket creation

Current pass rate: 10/10 (100%). Every eval run is also traced in Langfuse, so pass/fail results are backed by inspectable, real execution data — not just a claimed number.

Running it locally

1. Backend

python -m venv venv
venv\Scripts\activate          # Windows
pip install -r requirements.txt
uvicorn app.main:app --reload

2. Seed sample data

python -m app.seed

3. Set up RAG

  • Create a Supabase project, enable the pgvector extension

  • Run the SQL in sql/setup.sql to create the doc_embeddings table and match_docs function

  • Add your keys to .env (see .env.example)

  • Embed and upload the seeded docs:

    python -m app.embed_docs

4. Run the MCP server (for Claude Desktop)

python -m app.mcp_server

Add it to claude_desktop_config.json pointing at your venv's Python and this script.

5. Run evals

python -m app.run_evals

6. n8n + Slack automation

  • docker run -d --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n

  • Import the workflow from n8n/support-agent-workflow.json

  • Point a Slack app's Event Subscriptions at your n8n webhook (via ngrok for local dev)

Environment variables

OPENAI_API_KEY=
SUPABASE_URL=
SUPABASE_KEY=
LANGFUSE_PUBLIC_KEY=
LANGFUSE_SECRET_KEY=
LANGFUSE_HOST=

Why this project

This project demonstrates the parts of production AI work that matter most to a client evaluating an AI engineer:

  • Real backend integration via MCP, not just prompt engineering

  • Grounded answers via real semantic search, not keyword matching dressed up as "AI"

  • Proof it's not hallucinating via automated evals and full observability — not just a demo that happened to work once

  • Deployable into existing tools (Slack, and by extension any CRM/helpdesk) via automation, not confined to a chat window

The architecture here — FastAPI backend + MCP + RAG + evals + automation — is directly reusable: swap the orders/tickets/docs tables for a real client's CRM or helpdesk data model, and this becomes a client project rather than a from-scratch build.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/HassanYousafzai/ai-support-agent'

If you have feedback or need assistance with the MCP directory API, please join our Discord server