SparrowDesk
OfficialSparrowDesk MCP Server
A Model Context Protocol (MCP) server for SparrowDesk. Connect AI assistants like Claude to your SparrowDesk account to read and manage tickets, contacts, companies, Knowledge Base content, tags, and team data.
You sign in with OAuth, so there are no API keys to manage. The first time you connect, your MCP client opens a browser window to log in with your SparrowDesk account.
Install
The server URL is the same for every user — your account comes from the OAuth token, not the URL:
https://mcp.sparrowdesk.com/mcpClaude Code:
claude mcp add --transport http sparrowdesk https://mcp.sparrowdesk.com/mcpClaude Desktop (claude_desktop_config.json) and Cursor (~/.cursor/mcp.json) take the same block:
{
"mcpServers": {
"sparrowdesk": {
"type": "http",
"url": "https://mcp.sparrowdesk.com/mcp"
}
}
}Restart the app after saving. The SparrowDesk tools appear in the tool list, and the client opens a browser window to complete the OAuth login.
Related MCP server: swsd-mcp
Permissions
Tools mirror the SparrowDesk Developer API, and each call runs under the permissions of the account you signed in with.
Knowledge Base tools need the collection and article scopes: VIEW_COLLECTIONS and MANAGE_COLLECTIONS for collections, VIEW_ARTICLES and MANAGE_ARTICLES for articles. All four are included in the MCP default scope list. Other Knowledge Base behavior can depend on further scopes or account features.
Available Tools
Tool | Description |
Account | |
| Current account information (subdomain, company, timezone, language) |
Conversations | |
| Retrieve a conversation by ID |
| List conversations with optional filters |
| Create a new conversation/ticket |
| Update subject, status, priority, assignee, team, custom fields |
| Delete a conversation |
| List conversations with their replies inlined in one call |
| List replies for a conversation |
| Add a reply or internal note |
Conversation fields | |
| List ticket custom field definitions |
| Get one conversation field by ID |
| Create a custom conversation field |
| Update a conversation field |
Contacts & companies | |
| List contacts (search, email, phone, pagination) |
| Retrieve a contact by ID |
| Create a contact |
| Update a contact |
| Delete a contact |
| Bulk create contacts (returns job id) |
| Poll bulk contact job status |
| List companies |
| Retrieve a company by ID |
| Create a company |
| Update a company |
Contact fields | |
| List contact field definitions |
Members & tags | |
| List team members |
| List tags |
Knowledge Base | |
| List help centers |
| List KB collections for a help center |
| Get a collection with subcollections and articles |
| Create a KB collection |
| List articles for a help center |
| Get one article |
| Create an article (draft or publish) |
| Update an article draft / publish |
| Archive an article |
Tool Reference
Conversations
get_conversation
Fetch a single conversation by its numeric ID. Parameters: id (integer, required).
list_conversations
List conversations with optional filters, sorting, and pagination.
starting_after(string, optional) — Pagination cursorper_page(integer, optional) — Items per page, 1–100 (default: 25)status(array, optional) — Filter by status:Open,Pending,Resolved,Closedpriority(array, optional) — Filter by priority:Low,Medium,High,Urgentassigned_to_member_id(array of integers, optional) — Filter by assigned agent IDsassigned_to_team_id(array of integers, optional) — Filter by assigned team IDsbrand_id(array of integers, optional) — Filter by brand IDsrequested_by_id(integer, optional) — Filter by requestor contact IDrequested_by_company(integer, optional) — Filter by requester contact company ID (intersects withrequested_by_idwhen both are set)sort_by(string, optional) —created_atorupdated_at(default:created_at)sort_order(string, optional) —ascordesc(default:desc)
list_conversations_with_replies
List conversations with their replies inlined in a single call. It takes the same filters as list_conversations plus reply controls. Root pages and total_count apply to conversations only; each row carries a replies object shaped like list_conversation_replies.
starting_after(string, optional) — Cursor for conversation list paginationper_page(integer, optional) — Conversations per page, 1–20 (default: 20)replies_per_page(integer, optional) — Replies per conversation, 1–50 (default: 50)replies_sort_order(string, optional) — Reply sort bysent_at:ascordesc(default:desc)type(string, optional) — Filter replies byINTERNAL_NOTEorREPLYstatus,priority,assigned_to_member_id,assigned_to_team_id,brand_id,requested_by_id— Same conversation filters aslist_conversationshandled_by_ai_agent(boolean, optional) — Filter by whether the conversation was handled by the AI agentsort_by(string, optional) —created_atorupdated_at(default:created_at)sort_order(string, optional) —ascordesc(default:desc)
list_conversation_replies
List replies for a conversation, with optional filtering and pagination.
id(integer, required) — The conversation IDstarting_after(string, optional) — Pagination cursorper_page(integer, optional) — Items per page, 1–100 (default: 25)type(string, optional) — Filter byINTERNAL_NOTEorREPLYsort_order(string, optional) —ascordesc(default:desc)
add_conversation_reply
Add a reply or internal note to a conversation.
id(integer, required) — The conversation IDreply_text(string, required) — The content of the reply messagetype(string, required) —REPLY(visible to the customer) orINTERNAL_NOTE(agents only)
create_conversation
Create a new conversation/ticket in SparrowDesk.
subject(string, required) — Conversation subjectdescription(string, required) — Conversation descriptionrequested_by(string, required) — Email or phone number of the requesterpriority(string, optional) —Low,Medium,High, orUrgent(default:Medium)source(string, optional) —MailorCall(default:Call)status(string, optional) —Open,Pending,Resolved, orClosed(default:Open)brand_id(integer, optional) — Brand ID (uses the account default if omitted)assignee(string, optional) — Agent email address to assign the conversation toteam_id(integer, optional) — Team ID to assign the conversation tocustom_fields(array, optional) — Array of{ internal_name, value }objects
update_conversation
Patch an existing conversation.
id(integer, required) — Conversation IDsubject,priority,status,assignee(email),team(string) — Optional updatescustom_fields(array, optional) —{ internal_name, value }(values as strings)
delete_conversation
Delete a conversation. Parameters: id (integer, required).
Conversation fields
list_conversation_fields—starting_after,per_page,is_active,is_defaultget_conversation_field—idcreate_conversation_field—name,type(single_line_text|multi_line_text|dropdown|number|date|email), optionalinternal_name,description,is_mandatory_on_close,field_options(required for dropdowns)update_conversation_field—idplus any ofname,description,is_active,is_mandatory_on_close,field_options
Contacts
list_contacts
List contacts with filters. Requires the view contacts scope where the account enforces it.
Parameters: search, requested_by_email, requested_by_phone, starting_after, per_page.
get_contact
Fetch a single contact by its numeric ID. Parameters: id (integer, required).
create_contact
Create a new contact. Give either email or phone.
first_name(string, required) — Contact's first namelast_name(string, optional) — Contact's last nameemail(string, optional) — Contact's email address (required ifphoneis omitted)phone(string, optional) — Contact's phone number (required ifemailis omitted)company_id(integer, optional) — ID of the company to associate withcustom_fields(object, optional) — Custom field key-value pairs
update_contact
Update an existing contact.
id(integer, required) — The contact ID to updatefirst_name(string, optional) — Contact's first namelast_name(string, optional) — Contact's last nameemail(string, optional) — Contact's email addressphone(string, optional) — Contact's phone numbercompany_id(integer, optional) — ID of the company to associate withblocked(boolean, optional) — Whether the contact is blockedcustom_fields(object, optional) — Custom field key-value pairs
delete_contact
Delete a contact. Parameters: id (integer, required).
bulk_create_contacts and get_bulk_job_status
bulk_create_contacts accepts contacts: an array of objects with optional first_name, last_name, email, phone, company_id, and custom_fields. The response includes a job_id. Poll get_bulk_job_status with that job_id until the job reports completed or failed.
Contact fields
list_contact_fields
Retrieve all contact fields defined in the account.
search(string, optional) — Search contact fields by namepage(integer, optional) — Page number for paginationlimit(integer, optional) — Results per page
Companies
list_companies
Parameters: starting_after, per_page, domain (exact), name (exact).
get_company
Fetch a single company by its numeric ID. Parameters: id (integer, required).
create_company
Create a new company.
name(string, required) — Company namedomain(string, optional) — Lowercase domain likeexample.comaddress(string, optional) — Company addressnotes(string, optional) — Free-form notes
update_company
Update an existing company. Give at least one field besides id.
id(integer, required) — The company ID to updatename,domain,phone,address,notes— Optional updates
Knowledge Base
Call list_helpcenters first to get a helpCenterId. Collections and articles are scoped per help center and brand.
Reads need VIEW_COLLECTIONS / VIEW_ARTICLES; writes need MANAGE_COLLECTIONS / MANAGE_ARTICLES.
list_helpcenters— no parameterslist_collections—helpCenterId(required); optionalpage,limit,collectionId,isRoot— needsVIEW_COLLECTIONSget_collection—id; optionalpage,limitfor articles — needsVIEW_COLLECTIONScreate_collection—name,helpCenterId,brandId; optionaldescription,parentCollectionId— needsMANAGE_COLLECTIONSlist_articles—helpCenterId(required); optionalpublished,draft,archived,page,limit,search,collectionId— needsVIEW_ARTICLESget_article—id— needsVIEW_ARTICLEScreate_article—helpCenterId,brandId; optionaltitle,content(HTML),publish,collectionId,isPublic(publish flow per the API docs) — needsMANAGE_ARTICLESupdate_article—id; optionaltitle,content,collectionId(null to remove from collection),brandId,publish,isPublic,aiAgentEnabled,aiCopilotEnabled— needsMANAGE_ARTICLESarchive_article—id— needsMANAGE_ARTICLES
Account
get_me
Retrieve current SparrowDesk account information: account ID, subdomain, domain, company name, timezone, and language. This is the account, not a user profile. Takes no parameters.
list_members
Retrieve a paginated list of all team members in the account.
starting_after(string, optional) — Pagination cursorper_page(integer, optional) — Items per page, 1–100 (default: 25)
list_tags
Parameters: starting_after, per_page, search.
Privacy Policy
This server proxies requests to the SparrowDesk API on behalf of the signed-in user. It stores no ticket, contact, or Knowledge Base content, only in-memory OAuth session state (access and refresh tokens), which it discards when the process restarts. What the server can read or write is bounded by the permissions of the SparrowDesk account you sign in with, and SparrowDesk records every action against your user.
Data collection, storage, retention, third-party sharing, and contact details are covered in the SparrowDesk Privacy Policy. Use of SparrowDesk is governed by the Terms of Service.
Support
For questions, see developer.sparrowdesk.com/mcp or open an issue on this repository.
Local Development
See SETUP.md for running the server locally, the environment variables it reads, Docker, and how to call the deployed server with curl.
This server cannot be deployed
Maintenance
Related MCP Connectors
Freshdesk MCP Pack — helpdesk ticket and contact management via Freshdesk API v2.
Remote MCP server for managing Muninx tickets, messages, ticket search, and support analytics.
Notes, files, GitHub, and Drive through one MCP connection.
Notes, files, GitHub, and Drive through one MCP connection.
Related MCP Servers
AlicenseAqualityDmaintenanceAn MCP server that lets AI assistants search and read support tickets from Jitbit Helpdesk. Works with both SaaS and on-premise installations.316 npm3MIT- AlicenseAqualityAmaintenanceMCP server for SolarWinds Service Desk (SWSD/Samanage) enabling reading and modifying tickets, comments, knowledge-base articles, and more via each user's own API token.37124 npm4MIT
- AlicenseBqualityCmaintenanceEnables to interact with Re:lation support tickets via MCP. Allows searching, updating, replying to tickets, and managing customers and internal records.116 npmMIT
- AlicenseNot gradedqualityBmaintenanceAI-powered helpdesk management via Model Context Protocol. Connect any MCP-compatible assistant to your support workspace.5 npmMIT