Are you the author? Sign in to claim
sparrowdesk-mcp
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.
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_conversations_with_replies | List conversations with their replies inlined in one call |
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 |
get_company | Retrieve a company by ID |
create_company | Create a company |
update_company | Update a company |
| 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 |
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
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.
get_conversationFetch a single conversation by its numeric ID.
Parameters:
id (integer, required) — The conversation IDlist_conversationsList 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 with requested_by_id when both are set)sort_by (string, optional) — created_at or updated_at (default: created_at)sort_order (string, optional) — asc or desc (default: desc)list_conversations_with_repliesList conversations with their replies inlined in a single call — the same filters as list_conversations, plus reply controls. Root pages / total_count apply to conversations only; each row carries a replies object shaped like list_conversation_replies.
Parameters:
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 by sent_at: asc or desc (default: desc)type (string, optional) — Filter replies by INTERNAL_NOTE or REPLYstatus, priority, assigned_to_member_id, assigned_to_team_id, brand_id, requested_by_id — Same conversation filters as list_conversationshandled_by_ai_agent (boolean, optional) — Filter by whether the conversation was handled by the AI agentsort_by (string, optional) — created_at or updated_at (default: created_at)sort_order (string, optional) — asc or desc (default: desc)update_conversationPatch 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_conversationDelete a conversation by ID.
Parameters:
id (integer, required)list_conversation_repliesList 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 by INTERNAL_NOTE or REPLYsort_order (string, optional) — asc or desc (default: desc)add_conversation_replyAdd 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) or INTERNAL_NOTE (agents only)create_conversationCreate 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, or Urgent (default: Medium)source (string, optional) — Mail or Call (default: Call)status (string, optional) — Open, Pending, Resolved, or Closed (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 } objectslist_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), optional internal_name, description, is_mandatory_on_close, field_options (required for dropdowns)update_conversation_field — id plus any of name, description, is_active, is_mandatory_on_close, field_optionslist_contactsList contacts with filters (requires view contacts scope where enforced).
Parameters: search, requested_by_email, requested_by_phone, starting_after, per_page
delete_contactParameters: id (integer, required)
bulk_create_contacts / get_bulk_job_statusBulk 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_companiesParameters: starting_after, per_page, domain (exact), name (exact)
get_companyParameters: id (integer, required)
create_companyCreate a new company.
Parameters:
name (string, required) — Company namedomain (string, optional) — Lowercase domain like example.comaddress (string, optional) — Company addressnotes (string, optional) — Free-form notesupdate_companyUpdate an existing company. At least one field must be provided.
Parameters:
id (integer, required) — The company ID to updatename, domain, phone, address, notes — Optional updatescreate_contactCreate 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 pairsupdate_contactUpdate 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 pairsget_contactFetch a single contact by its numeric ID.
Parameters:
id (integer, required) — The contact IDlist_contact_fieldsRetrieve 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 pagelist_membersRetrieve 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_meRetrieve current SparrowDesk account information (not a user profile).
Parameters: None
list_tagsParameters: starting_after, per_page, search
Use list_helpcenters first to obtain helpCenterId. Collections and articles are scoped per help center and brand.
list_collections — helpCenterId (required); optional page, limit, collectionId, isRootget_collection — id; optional page, limit for articlescreate_collection — name, helpCenterId, brandId; optional description, parentCollectionIdlist_articles — helpCenterId (required); optional published, draft, archived, page, limit, search, collectionIdget_article — idcreate_article — helpCenterId, brandId; optional title, content (HTML), publish, collectionId, isPublic (publish flow per API docs)update_article — id; optional title, content, collectionId (null to remove from collection), brandId, publish, isPublic, aiAgentEnabled, aiCopilotEnabledarchive_article — idSee SETUP.md for local development instructions, environment variables, and Docker setup.
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases
Official GitHub integration for repos, issues, PRs, and CI/CD workflows