Customer Support MCP Server
Provides tools for managing customer support tickets in a SQLite database, including creating, retrieving, searching, and updating tickets.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Customer Support MCP ServerCreate a new support ticket for Alice about email not syncing"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
π« Customer Support MCP Server
π€ AI-Powered Customer Support MCP Server
Connect Cursor AI to a real SQLite database through Model Context Protocol (MCP).
Related MCP server: @lubo3395/mcp-sqlite-server
π Project Overview
The Customer Support MCP Server is a Python-based MCP server that allows an AI application such as Cursor to interact with a real SQLite database.
Instead of allowing the AI to directly execute SQL queries, the server exposes safe and well-defined business tools for customer support operations.
π― Main Goal
Demonstrate how an AI application can use MCP (Model Context Protocol) to:
π« Create customer support tickets
π Retrieve existing tickets
π Search tickets
βοΈ Update ticket information
πΎ Store ticket data in SQLite
π€ Allow Cursor AI to perform operations using natural language
ποΈ Architecture
π€ USER
β
β Natural Language
βΌ
βββββββββββββββββ
β Cursor β
β AI Agent β
βββββββββ¬ββββββββ
β
β MCP
βΌ
ββββββββββββββββββββββββββ
β Customer Support MCP β
β Server β
ββββββββββββββββββββββββββ€
β π« create_ticket β
β π get_ticket β
β π search_tickets β
β βοΈ update_ticket β
ββββββββββββββ¬ββββββββββββ
β
β SQL
βΌ
βββββββββββββββββββ
β SQLite β
β support.db β
βββββββββββββββββββ
===================
π Features
Feature Description
π« Create Ticket Create a new customer support ticket
π Get Ticket Retrieve a ticket using its ID
π Search Tickets Search using keyword, email, status, or priority
βοΈ Update Ticket Update status, priority, or description
πΎ SQLite Persistent local database
π€ Cursor AI client for interacting with MCP
π§ͺ MCP Inspector Test and debug MCP tools
β‘ uv Fast Python package/environment management
=======================
π§° Technology Stack
Technology Purpose
π Python 3.12 Application development
π MCP AI β Tool communication
ποΈ SQLite Database
π€ Cursor AI/MCP client
β‘ uv Python environment & dependency management
π§ͺ MCP Inspector MCP server testing
=====================
π Project Structure
customer_support_mcp/
β
βββ π .cursor/
β βββ π mcp.json
β
βββ π data/
β βββ ποΈ support.db
β
βββ π .venv/
β
βββ π database.py
βββ π server.py
βββ π pyproject.toml
βββ π uv.lock
βββ π README.md
βββ π .gitignore
==================
ποΈ Database Schema
The SQLite database contains a tickets table.
βββββββββββββββββββββββββββββββββββββββββββ
β tickets β
βββββββββββββββββββββββββββββββββββββββββββ€
β id INTEGER PRIMARY KEY β
β customer_name TEXT β
β customer_email TEXT β
β subject TEXT β
β description TEXT β
β status TEXT β
β priority TEXT β
β created_at TIMESTAMP β
β updated_at TIMESTAMP β
βββββββββββββββββββββββββββββββββββββββββββ
============
π§ͺ Test Using MCP Inspector
The MCP Inspector allows you to test the tools before connecting Cursor.
Run:
uv run mcp dev server.py
Open the Inspector URL displayed in the terminal.
You should see:
Customer Support MCP Server
Tools
β create_ticket
β get_ticket
β search_tickets
β update_ticket
=======================
π§βπ» Connect MCP Server to Cursor
Create:
.cursor/mcp.json
=======================
π Restart Cursor
After saving .cursor/mcp.json:
Cursor
β
Restart Cursor
β
Open customer_support_mcp
β
Settings
β
Tools & MCP
-------------
You should see:
π’ customer-support
Tools:
β create_ticket
β get_ticket
β search_tickets
β update_ticket
===============
π€ Using Cursor AI
Once the MCP server is connected, you can use natural language.
π« Create Ticket
Ask Cursor:
Create a ticket for John Smith.
Email:
john@example.com
Issue:
Customer cannot login.
Priority:
high
Cursor can call:
create_ticket()
π Retrieve Ticket
Ask:
Show me ticket number 1.
Cursor can call:
get_ticket(ticket_id=1)
π Search Tickets
Ask:
Find all open urgent tickets.
Cursor can call:
search_tickets(
status="open",
priority="urgent"
)
βοΈ Update Ticket
Ask:
Change ticket 1 to resolved.
Cursor can call:
update_ticket(
ticket_id=1,
status="resolved"
)
===================
π₯ Example Workflow
π€ User
β
β "Create a ticket for John"
βΌ
π€ Cursor AI
β
β MCP Tool Call
βΌ
π create_ticket()
β
β SQL INSERT
βΌ
ποΈ SQLite
β
β Ticket #1
βΌ
π MCP Server
β
βΌ
π€ Cursor
β
βΌ
π€ User
==================
π Example or Sample database of Tickets Output
After creating tickets, the database might contain:
ββββββ¬βββββββββββββββ¬ββββββββββββββββββββββ¬βββββββββββββββ¬βββββββββββ
β ID β Customer β Subject β Status β Priority β
ββββββΌβββββββββββββββΌββββββββββββββββββββββΌβββββββββββββββΌβββββββββββ€
β 1 β John Smith β Unable to login β open β high β
β 2 β Sarah Jones β Payment failed β open β urgent β
β 3 β Mike Brown β Password reset β resolved β medium β
ββββββ΄βββββββββββββββ΄ββββββββββββββββββββββ΄βββββββββββββββ΄βββββββββββ
=================
π§ MCP Concept
The most important concept in this project is:
AI APPLICATION
β
βΌ
βββββββββββββ
β MCP β
βββββββ¬ββββββ
β
βΌ
BUSINESS TOOLS
β
ββββββββββΌβββββββββ
βΌ βΌ βΌ
CREATE SEARCH UPDATE
β β β
ββββββββββΌβββββββββ
βΌ
DATABASE
The AI does not directly manipulate the SQLite database.
---------
Instead:
AI
β
MCP Tool
β
Python Function
β
SQLite
β
Result
β
AI
===============
β
MCP Business Tools
AI
β
MCP Tool
β
Validated Python Function
β
SQLite
===============
π Verify SQLite Database
The database will be created here:
data/support.db
You can verify the database using Python:
sqlite3 "C:\Users\your name\path\folder name\data\support.db"
============
π Learning Outcomes
After completing this project, you will understand:
π MCP
Model Context Protocol
β
MCP Server
β
MCP Tools
β
MCP Client
---
ποΈ Database Integration
Python
β
sqlite3
β
SQLite
---
π€ AI Integration
Cursor AI
β
MCP
β
Python Tools
β
SQLite
---
πΌ Business Operations
CREATE
β
READ
β
SEARCH
β
UPDATE
============
π Project Summary
Component Technology
π€ AI Client Cursor
π Protocol MCP
π Backend Python
ποΈ Database SQLite
β‘ Environment uv
π§ͺ Testing MCP Inspector
π« Business Domain Customer Support
=============
π Final Architecture
ββββββββββββββββββββββ
β CURSOR β
β π€ AI AGENT β
βββββββββββ€βββββββββββ
β
β MCP
βΌ
ββββββββββββββββββββββββ
β CUSTOMER SUPPORT MCP β
β SERVER β
β βββββββββββββββββββββββ£
β π« create_ticket β
β π get_ticket β
β π search_tickets β
β βοΈ update_ticket β
ββββββββββββ€ββββββββββββ
β
β SQL
βΌ
ββββββββββββββββββββββββ
β SQLite β
β support.db β
ββββββββββββββββββββββββ
==============
π Complete Command Flow
# 1. Go to project
cd C:\Users\path
# 2. Create environment
uv venv --python 3.12
# 3. Activate environment
.venv\Scripts\Activate.ps1
# 4. Install MCP
uv add "mcp[cli]"
# 5. Verify SQLite
uv run python -c "import sqlite3; print('SQLite OK')"
# 6. Verify MCP
uv run python -c "from mcp.server.fastmcp import FastMCP; print('MCP OK')"
# 7. Run MCP Inspector
uv run mcp dev server.py
# 8. Run MCP server directly
uv run python server.py
==============
β€οΈ Final Message
<div align="center">
π« Customer Support MCP Server
Python π + MCP π + SQLite ποΈ + Cursor π€
AI + MCP + Database = Intelligent Business OperationsAvailable Tools
4 toolscreate_ticketA
Create a new customer support ticket.
Args:
customer_name: Customer's full name.
customer_email: Customer's email address.
subject: Short description of the issue.
description: Detailed description of the problem.
priority: Ticket priority: low, medium, high, or urgent.
| Name | Required | Description | Default |
|---|---|---|---|
| subject | Yes | ||
| priority | No | medium | |
| description | Yes | ||
| customer_name | Yes | ||
| customer_email | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description carries full burden. It only states the action without disclosing side effects, required permissions, return behavior, or validation rules. This is a significant gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief, front-loaded with the purpose, and includes a structured Args list. Every part earns its place without unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the purpose and parameters adequately, but without an output schema, it does not mention what the tool returns (e.g., ticket ID) or any post-creation behavior. This leaves a completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates with an Args block that explains every parameter, including priority values. This adds clear meaning beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a new customer support ticket' with a specific verb and resource. It distinguishes from sibling tools (get_ticket, search_tickets, update_ticket) by focusing on creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates its purpose, implying when to use it (creating tickets) versus alternatives (getting, searching, updating). It lacks explicit exclusions or when-not guidance, but the context is clear from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ticketA
Retrieve a customer support ticket by ticket ID.
Args:
ticket_id: Numeric ID of the support ticket.
| Name | Required | Description | Default |
|---|---|---|---|
| ticket_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries full responsibility for behavioral disclosure. 'Retrieve' implies a read-only operation and no side effects, but it does not mention output format, error behavior, or permissions. Minimal behavioral context is provided beyond the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, using two short sentences and a simple Args section. Every word adds value, and there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema, no annotations), the description is nearly complete. However, it lacks guidance on when to use this tool versus search_tickets and does not describe the return value, leaving minor gaps for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description only restates the parameter as 'Numeric ID of the support ticket,' which essentially repeats the schema's integer type and title. It adds little meaning beyond what the schema already provides and does not clarify constraints or format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Retrieve') and the resource ('a customer support ticket') with a specific identifier (ticket ID). It is distinct from sibling tools that create, search, or update tickets, making the purpose immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by ticket ID' implies this tool is used when a specific ticket ID is known, but it does not explicitly mention alternatives like search_tickets for finding tickets without an ID. No exclusions or comparisons are provided, so usage guidance remains implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_ticketsA
Search customer support tickets.
You can search using a keyword, customer email,
ticket status, or ticket priority.
Args:
keyword: Search subject, description, or customer name.
customer_email: Filter by exact customer email.
status: Filter by status: open, in_progress, resolved, closed.
priority: Filter by priority: low, medium, high, urgent.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| keyword | No | ||
| priority | No | ||
| customer_email | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must fully disclose behavior. It only states 'Search' and lists filter options; it does not mention whether filters combine with AND/OR, what the default behavior is when no filters are given, whether results are paginated or ordered, or what the response structure looks like. The read-only nature is implied but not explicitly confirmed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line purpose statement followed by a clean parameter list. Every sentence is informative, with no filler or redundant elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema and no annotations, so the description needs to explain return behavior and edge cases. It covers the core search functionality and all parameters, but omits details such as whether an empty filter list returns all tickets, how filters combine, response format (list vs objects), and any pagination/limits. These are notable gaps for autonomous execution.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description compensates by fully documenting all four parameters in the Args section. It explains that keyword searches subject/description/customer name, customer_email matches exactly, and provides the accepted value sets for status and priority, adding significant meaning beyond the schema's bare type definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Search customer support tickets.', which clearly states the action (search) and resource (tickets). The subsequent list of search dimensions (keyword, customer_email, status, priority) further clarifies its scope and differentiates it from the sibling create/get/update tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'You can search using a keyword, customer email, ticket status, or ticket priority.', giving clear context for when this tool is appropriate. It does not, however, explicitly contrast with get_ticket for single-ticket retrieval or mention exclusions, but the intended use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ticketA
Update an existing customer support ticket.
Args:
ticket_id: ID of the ticket to update.
status: New status: open, in_progress, resolved, or closed.
priority: New priority: low, medium, high, or urgent.
description: New ticket description.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| priority | No | ||
| ticket_id | Yes | ||
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses updatable fields and valid values for status and priority, but does not specify whether omitted fields remain unchanged (partial update), the return value, or required permissions. These are notable gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: a one-sentence purpose followed by an Args list. Each line provides necessary information without redundancy or fluff, and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation tool with no annotations and no output schema, the description is functional but incomplete. It lacks explicit statement about partial update behavior, error handling, or response contents. Sibling tools are not referenced. Overall adequate with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It documents all four parameters with meaningful semantics: ticket_id as the ID, status and priority with enumerated valid values, and description as the new text. This significantly exceeds the schema's simple string definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Update an existing customer support ticket' with a clear verb and resource, and the scope is specific to updating, making it distinct from sibling tools like create_ticket, get_ticket, and search_tickets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the toolβwhen an existing ticket needs modificationβbut doesn't explicitly mention when not to use it or name alternatives. The context is clear enough for a simple update tool, but it lacks explicit exclusions or alternative references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a distinct purpose: create, retrieve by ID, search with filters, and update. No overlapping functionality, making it easy for an agent to select the correct tool.
All tool names follow a consistent verb_noun pattern: create_ticket, get_ticket, search_tickets, update_ticket. Minor pluralization in search_tickets is acceptable and consistent with typical search APIs.
Four tools cover the essential ticket operations without bloat. The count is well-scoped for a customer support server, fitting the ideal range of 3-15 tools.
The server provides full CRUD-like coverage (create, read, search, update) for tickets. Closing a ticket is achievable via update_ticket's status parameter, so no critical lifecycle gaps exist.
Maintenance
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
Run your website's AI support agent from Claude, Cursor or any MCP client. Manage the knowledge base, edit agent instructions, read conversations and leads, reply live to visitors, and check plan usage. 54 tools, OAuth sign-in, no API key. Free with every Asyntai account: https://asyntai.com/documentation/mcp/
Let AI agents query data and act across all your business apps via MCP.
- mcpOAuthcom.gibsonai
GibsonAI MCP server: manage your databases with natural language
Build and manage AI-native customer support agents from Claude or any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage and query SQLite databases through MCP tools, supporting CRUD operations, schema management, and saved views.3MIT
- AlicenseNot gradedqualityCmaintenanceProvides a set of MCP tools to let AI assistants like Claude, Cursor, and VS Code Copilot interact with SQLite databases, supporting querying, schema management, and data import/export.21MIT
- AlicenseNot gradedqualityDmaintenanceMCP tool server providing SQLite database access for AI agents.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to manage CRM data including companies, contacts, prospects, pipelines, forecasts, and tasks via typed MCP tools, with local SQLite storage and a JSON CLI.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/JonnadulaNagaSambaSivaRao/customer_support_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server