mcp-otobo
Click on "Deploy 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., "@mcp-otobo Search for open high priority tickets in the Support queue."
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.
mcp-otobo
A Model Context Protocol (MCP) server for Otobo — the open-source ITSM and helpdesk system. This server enables AI assistants to search, create, update, and manage tickets in your Otobo instance through the Generic Interface REST API.
Features
Search tickets by queue, state, priority, customer, title, date ranges, and more
Get ticket details including full communication history and dynamic fields
Create tickets with initial articles
Update tickets — change state, queue, priority, owner, add articles
Close tickets with optional closing notes
Add internal notes to tickets
View ticket history — full audit trail of changes
List queues, states, and priorities from your Otobo instance
Related MCP server: tickiti-mcp
Prerequisites
Node.js 18 or later
An Otobo instance with a configured Generic Interface web service (see Otobo Setup)
An agent account with API access permissions
Installation
npm install -g mcp-otoboOr run directly with npx:
npx mcp-otoboOr clone and build from source:
git clone https://github.com/domnussbaum/otobo-mcp.git
cd mcp-otobo
npm install
npm run buildConfiguration
The server is configured via environment variables:
Variable | Required | Default | Description |
| Yes | — | Your Otobo instance URL (e.g. |
| Yes | — | Agent username for API access |
| Yes | — | Agent password |
| No |
| Web service name configured in Otobo |
| No |
| Set to |
Copy .env.example to .env and fill in your values:
cp .env.example .envAvailable Tools
Core Ticket Operations
Tool | Description |
| Search tickets by queue, state, priority, customer, title, ticket number, date ranges |
| Get full ticket details with articles and dynamic fields |
| Create a new ticket with first article |
| Update ticket fields and optionally add an article |
History
Tool | Description |
| Get the full change history of a ticket |
Metadata
Tool | Description |
| List available queues in the system |
| List available ticket states |
| List available ticket priorities |
Convenience
Tool | Description |
| Close a ticket with an optional note |
| Add an internal note to a ticket |
Integration Examples
Claude Desktop
Add to your claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"otobo": {
"command": "npx",
"args": ["-y", "mcp-otobo"],
"env": {
"OTOBO_BASE_URL": "https://otobo.example.com",
"OTOBO_USERNAME": "your-agent-user",
"OTOBO_PASSWORD": "your-agent-password",
"OTOBO_WEBSERVICE": "GenericTicketConnectorREST"
}
}
}
}Or if installed from source:
{
"mcpServers": {
"otobo": {
"command": "node",
"args": ["/absolute/path/to/mcp-otobo/build/index.js"],
"env": {
"OTOBO_BASE_URL": "https://otobo.example.com",
"OTOBO_USERNAME": "your-agent-user",
"OTOBO_PASSWORD": "your-agent-password"
}
}
}
}Claude Code
Add to your project's .mcp.json file:
{
"mcpServers": {
"otobo": {
"command": "npx",
"args": ["-y", "mcp-otobo"],
"env": {
"OTOBO_BASE_URL": "https://otobo.example.com",
"OTOBO_USERNAME": "your-agent-user",
"OTOBO_PASSWORD": "your-agent-password",
"OTOBO_WEBSERVICE": "GenericTicketConnectorREST"
}
}
}
}Or add it via the CLI with environment variables:
claude mcp add otobo \
-e OTOBO_BASE_URL=https://otobo.example.com \
-e OTOBO_USERNAME=your-agent-user \
-e 'OTOBO_PASSWORD=your-agent-password' \
-e OTOBO_WEBSERVICE=GenericTicketConnectorREST \
-- npx -y mcp-otoboCursor
Add to your Cursor MCP settings (.cursor/mcp.json):
{
"mcpServers": {
"otobo": {
"command": "npx",
"args": ["-y", "mcp-otobo"],
"env": {
"OTOBO_BASE_URL": "https://otobo.example.com",
"OTOBO_USERNAME": "your-agent-user",
"OTOBO_PASSWORD": "your-agent-password",
"OTOBO_WEBSERVICE": "GenericTicketConnectorREST"
}
}
}
}Windsurf
Add to your Windsurf MCP configuration (~/.windsurf/mcp.json):
{
"mcpServers": {
"otobo": {
"command": "npx",
"args": ["-y", "mcp-otobo"],
"env": {
"OTOBO_BASE_URL": "https://otobo.example.com",
"OTOBO_USERNAME": "your-agent-user",
"OTOBO_PASSWORD": "your-agent-password",
"OTOBO_WEBSERVICE": "GenericTicketConnectorREST"
}
}
}
}ChatGPT / OpenAI (via MCP Bridge)
ChatGPT does not natively support MCP. However, third-party MCP-to-OpenAI bridge tools exist that can expose any MCP server as an OpenAI-compatible function-calling API. Search for "MCP OpenAI bridge" or "MCP proxy" for current options.
Codex CLI
Set up environment variables and configure MCP in your Codex configuration:
export OTOBO_BASE_URL=https://otobo.example.com
export OTOBO_USERNAME=your-agent-user
export OTOBO_PASSWORD='your-agent-password'
codex --full-auto "Search for open tickets"Or add to your ~/.codex/config.json:
{
"mcpServers": {
"otobo": {
"command": "npx",
"args": ["-y", "mcp-otobo"],
"env": {
"OTOBO_BASE_URL": "https://otobo.example.com",
"OTOBO_USERNAME": "your-agent-user",
"OTOBO_PASSWORD": "your-agent-password",
"OTOBO_WEBSERVICE": "GenericTicketConnectorREST"
}
}
}
}Gemini CLI
Add to your Gemini CLI MCP settings file (~/.gemini/settings.json):
{
"mcpServers": {
"otobo": {
"command": "npx",
"args": ["-y", "mcp-otobo"],
"env": {
"OTOBO_BASE_URL": "https://otobo.example.com",
"OTOBO_USERNAME": "your-agent-user",
"OTOBO_PASSWORD": "your-agent-password",
"OTOBO_WEBSERVICE": "GenericTicketConnectorREST"
}
}
}
}Generic MCP Client
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
const transport = new StdioClientTransport({
command: "npx",
args: ["-y", "mcp-otobo"],
env: {
OTOBO_BASE_URL: "https://otobo.example.com",
OTOBO_USERNAME: "your-agent-user",
OTOBO_PASSWORD: "your-agent-password",
OTOBO_WEBSERVICE: "GenericTicketConnectorREST",
},
});
const client = new Client({ name: "my-app", version: "1.0.0" });
await client.connect(transport);
// List available tools
const tools = await client.listTools();
console.log(tools);
// Search for open tickets
const result = await client.callTool("search_tickets", {
states: ["open", "new"],
limit: 10,
});
console.log(result);Otobo Setup
To use this MCP server, your Otobo instance needs a properly configured Generic Interface web service.
Step 1: Create a Web Service
Log in to Otobo as an admin
Navigate to Admin → Generic Interface → Web Services
Click Add Web Service
Set:
Name:
GenericTicketConnectorREST(or your preferred name — must matchOTOBO_WEBSERVICE)Network Transport:
HTTP::REST
Step 2: Add Operations
Add the following four operations to your web service. For each one:
Click Add Operation
Set the Name (e.g.
TicketCreate)Select the Operation-Backend:
Name | Operation-Backend |
|
|
|
|
|
|
|
|
Leave mapping settings at their defaults
Click Save
Step 3: Configure Transport & Route Mapping
Back on the web service overview, go to Network Transport → Configure
Set Maximum message length:
10000000(or higher for large tickets)Configure the Route mapping for each operation:
Operation | Route | Request Method |
|
|
|
|
|
|
|
|
|
|
|
|
Save
Step 4: Create an API Agent
Security note: Once a REST web service is active, any valid agent account can authenticate against it. There is no way to restrict the web service itself to specific users. Access control is handled entirely through group and queue permissions. It is strongly recommended to create a dedicated API agent with minimal permissions.
Navigate to Admin → Agents
Create a dedicated agent account for API access (e.g.
api-user)Create a dedicated group (e.g.
api-access) under Admin → GroupsUnder Admin → Agents ↔ Groups, assign only the API agent to this group
Under Admin → Queues ↔ Groups, grant access only to the queues the API should reach
Use this agent's credentials for
OTOBO_USERNAMEandOTOBO_PASSWORD
Step 5: Verify
Test your setup with curl:
curl -X POST \
"https://otobo.example.com/otobo/nph-genericinterface.pl/Webservice/GenericTicketConnectorREST/TicketSearch" \
-H "Content-Type: application/json" \
-d '{"UserLogin":"your-agent","Password":"your-password"}'You should get a JSON response with ticket IDs.
Troubleshooting
"Missing required environment variable"
Make sure all required environment variables are set. Check that your MCP client configuration passes the env block correctly.
"Otobo API error (HTTP 403)"
Your agent account may lack the necessary permissions. Check:
The agent exists and is valid in Otobo
The agent has group permissions for the queues you're trying to access
The web service is active (not deactivated)
"Otobo API error (HTTP 404)"
The web service endpoint is not found. Verify:
The web service name matches
OTOBO_WEBSERVICEThe operations are configured with correct route mappings
The Otobo URL is correct and accessible
"Otobo API error (HTTP 500)"
An internal server error in Otobo. Check:
Otobo system logs (
/opt/otobo/var/log/or your log directory)The request payload is valid (required fields like Queue, State, Priority)
Customer user exists in the system when creating tickets
Connection Issues
Ensure your Otobo instance is reachable from the machine running the MCP server
Check for firewalls, VPN requirements, or SSL certificate issues
For self-signed or internal SSL certificates, set
OTOBO_UNSAFE_SSL=truein your environment configuration
"No tickets found" for list_queues/list_states/list_priorities
These metadata tools discover values from existing tickets. If your system has no tickets yet, they return default values. Create a test ticket first, or use the known defaults:
Queues:
Raw,Junk,Misc,Postmaster(depends on your setup)States:
new,open,pending reminder,closed successful,closed unsuccessfulPriorities:
1 very low,2 low,3 normal,4 high,5 very high
License
MIT
Available Tools
10 toolsadd_noteA
Add an internal note to a ticket without changing its state
Inputs: body (required), ticket_id (required), subject, content_type.
close_ticketC
Close a ticket by setting its state to 'closed successful' and optionally adding a closing note
Inputs: ticket_id (required), note, state.
create_ticketB
Create a new Otobo ticket with a first article (message)
Inputs: queue (required), title (required), article_body (required), customer_user (required), +9 more.
get_ticketB
Get full ticket details by TicketID, including articles (communication history) and dynamic fields
Inputs: ticket_id (required), extended, include_articles, include_dynamic_fields.
get_ticket_historyA
Get the full change history of a ticket (who changed what, when)
Inputs: ticket_id (required).
list_prioritiesA
List available Otobo ticket priorities by examining existing tickets. Returns priority names found in the system.
Inputs: no named parameters.
list_queuesA
List available Otobo queues by searching for tickets across all queues. Returns queue names found in the system.
Inputs: no named parameters.
list_statesA
List available Otobo ticket states by examining existing tickets. Returns state names found in the system.
Inputs: no named parameters.
search_ticketsA
Search Otobo tickets by various criteria (Queue, State, Priority, CustomerUser, Title, TicketNumber, date ranges, etc.)
Inputs: limit, locks, title, types, +11 more.
update_ticketB
Update an existing Otobo ticket (change state, queue, priority, owner, etc.) and optionally add a new article
Inputs: ticket_id (required), lock, type, owner, +12 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Each tool targets a distinct operation on OTOBO tickets or metadata (priorities, queues, states), with no overlapping functionality. For example, add_note is clearly for internal notes vs. closing, while get_ticket_history is separate from get_ticket.
All tool names follow a consistent verb_noun pattern in snake_case (e.g., create_ticket, list_priorities, close_ticket). No mixing of styles or ambiguous verbs.
10 tools is a well-scoped number for a ticket system, covering creation, retrieval, update, closing, history, and listing of metadata. Each tool earns its place without redundancy.
The set covers the main ticket lifecycle (create, read, update, close) and essential lookups (queues, states, priorities). Missing delete or archive operations, but those are often omitted in ticket systems for safety.
Maintenance
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server for GLPI: tickets, ITIL, assets, knowledge base. GLPI 10/11. Not affiliated with Teclib'.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
MCP server enabling AI agents to manage Bitrix24 features via standardized protocol
Related MCP Servers
- AlicenseBqualityCmaintenanceMCP server allowing an AI assistant to interact directly with your GLPI instance via its REST API, enabling ticket management, knowledge base operations, and statistics.404-

tickiti-mcpofficial
AlicenseBqualityBmaintenanceAn MCP server that exposes the Tickiti helpdesk API to AI assistants, enabling ticket management and helpdesk operations via natural language.11MIT- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI assistants to interact with Freshservice service desk, supporting ticket search, retrieval, and creation via a configurable, Docker-first deployment.MIT
- FlicenseNot gradedqualityDmaintenanceMCP server that provides IT support tools to search known incidents, check ticket status, and create ticket drafts, enabling an AI assistant to help users with IT support queries.-