SparrowDesk 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, Knowledge Base content, tags, companies, and team data.
Authentication is handled via OAuth — no API keys to manage. Your MCP client will open a browser window to log in with your SparrowDesk account the first time you connect.
Available Tools
Tools mirror the SparrowDesk Developer API. Knowledge Base collections and related endpoints require VIEW_COLLECTIONS and MANAGE_COLLECTIONS (included in the MCP default OAuth scope list). Other KB behavior may still depend on additional scopes or account features.
| Tool | Description |
|---|---|
| Account | |
get_me |
Current account information (subdomain, company, timezone, language) |
| Conversations | |
get_conversation |
Retrieve a conversation by ID |
list_conversations |
List conversations with optional filters |
create_conversation |
Create a new conversation/ticket |
update_conversation |
Update subject, status, priority, assignee, team, custom fields |
delete_conversation |
Delete a conversation |
list_conversation_replies |
List replies for a conversation |
add_conversation_reply |
Add a reply or internal note |
| Conversation fields | |
list_conversation_fields |
List ticket custom field definitions |
get_conversation_field |
Get one conversation field by ID |
create_conversation_field |
Create a custom conversation field |
update_conversation_field |
Update a conversation field |
| Contacts & companies | |
list_contacts |
List contacts (search, email, phone, pagination) |
get_contact |
Retrieve a contact by ID |
create_contact |
Create a contact |
update_contact |
Update a contact |
delete_contact |
Delete a contact |
bulk_create_contacts |
Bulk create contacts (returns job id) |
get_bulk_job_status |
Poll bulk contact job status |
list_companies |
List companies |
| Contact fields | |
list_contact_fields |
List contact field definitions |
| Members & tags | |
list_members |
List team members |
list_tags |
List tags |
| Knowledge Base | |
list_helpcenters |
List help centers |
list_collections |
List KB collections for a help center |
get_collection |
Get a collection with subcollections and articles |
create_collection |
Create a KB collection |
list_articles |
List articles for a help center |
get_article |
Get one article |
create_article |
Create an article (draft or publish) |
update_article |
Update an article draft / publish |
archive_article |
Archive an article |
Installing in Claude
Add to your claude_desktop_config.json:
{
"mcpServers": {
"sparrowdesk": {
"type": "http",
"url": "https://mcp.sparrowdesk.com/mcp"
}
}
}
Or with Claude Code:
claude mcp add --transport http sparrowdesk https://mcp.sparrowdesk.com/mcp
Installing in Cursor
Edit ~/.cursor/mcp.json:
{
"mcpServers": {
"sparrowdesk": {
"type": "http",
"url": "https://mcp.sparrowdesk.com/mcp"
}
}
}
Restart Cursor after saving. The SparrowDesk tools will appear in the Agent tool list. Cursor will open a browser window to complete the OAuth login with your SparrowDesk account.
Tool Reference
get_conversation
Fetch a single conversation by its numeric ID.
Parameters:
id(integer, required) — The conversation ID
list_conversations
List conversations with optional filters, sorting, and pagination.
Parameters:
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)
update_conversation
Patch an existing conversation.
Parameters:
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 by ID.
Parameters:
id(integer, required)
list_conversation_replies
List replies for a conversation, with optional filtering and pagination.
Parameters:
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.
Parameters:
id(integer, required) — The conversation IDreply_text(string, required) — The content of the reply messagetype(string, required) —REPLY(visible to customer) orINTERNAL_NOTE(agents only)
create_conversation
Create a new conversation/ticket in SparrowDesk.
Parameters:
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 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
Conversation field tools
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
list_contacts
List contacts with filters (requires view contacts scope where enforced).
Parameters: search, requested_by_email, requested_by_phone, starting_after, per_page
delete_contact
Parameters: id (integer, required)
bulk_create_contacts / get_bulk_job_status
Bulk create accepts contacts: array of objects with optional first_name, last_name, email, phone, company_id, custom_fields. Response includes job_id. Poll get_bulk_job_status with job_id until completed or failed.
list_companies
Parameters: starting_after, per_page, domain (exact), name (exact)
create_contact
Create a new contact. Either email or phone must be provided.
Parameters:
first_name(string, required) — Contact's first namelast_name(string, optional) — Contact's last nameemail(string, optional) — Contact's email address (required if phone not provided)phone(string, optional) — Contact's phone number (required if email not provided)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.
Parameters:
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
get_contact
Fetch a single contact by its numeric ID.
Parameters:
id(integer, required) — The contact ID
list_contact_fields
Retrieve all contact fields defined in the account.
Parameters:
search(string, optional) — Search contact fields by namepage(integer, optional) — Page number for paginationlimit(integer, optional) — Results per page
list_members
Retrieve a paginated list of all team members in the account.
Parameters:
starting_after(string, optional) — Pagination cursorper_page(integer, optional) — Items per page, 1–100 (default: 25)
get_me
Retrieve current SparrowDesk account information (not a user profile).
Parameters: None
list_tags
Parameters: starting_after, per_page, search
Knowledge Base tools
Use list_helpcenters first to obtain helpCenterId. Collections and articles are scoped per help center and brand.
list_collections—helpCenterId(required); optionalpage,limit,collectionId,isRootget_collection—id; optionalpage,limitfor articlescreate_collection—name,helpCenterId,brandId; optionaldescription,parentCollectionIdlist_articles—helpCenterId(required); optionalpublished,draft,archived,page,limit,search,collectionIdget_article—idcreate_article—helpCenterId,brandId; optionaltitle,content(HTML),publish,collectionId,isPublic(publish flow per API docs)update_article—id; optionaltitle,content,collectionId(null to remove from collection),brandId,publish,isPublic,aiAgentEnabled,aiCopilotEnabledarchive_article—id
Local Development
See SETUP.md for local development instructions, environment variables, and Docker setup.