mcpField
S
shiftcare-complaints

shiftcare-complaints

github.com/shiftcareOther441 installsUpdated 2w ago
Repository

About shiftcare-complaints

shiftcare-complaints is a skill for teams handling ShiftCare complaints. It emphasizes permission and tool checks, fact-based intake, and explicit confirmation before writes, while distinguishing complaints from incidents that may need escalation.

Key features

  1. 01Checks compatibility, account, and tool permissions
  2. 02Searches for and reviews possible duplicate complaints
  3. 03Collects complaint details and confirms risk level
  4. 04Shows the proposed record and requires confirmation before writing
  5. 05Reads incidents but does not create incident records
  6. 06Can suggest corrective actions after creation

Use cases

  1. 01Check complaint status and search for similar records
  2. 02Prepare a complaint after resolving participant and assignee
  3. 03Create a complaint after confirming its proposed details
  4. 04Identify safety or incident matters requiring prompt escalation

MCP support

The skill requires an Agent connected to the ShiftCare MCP server and uses its tools to read and manage complaints. Writes require explicit user confirmation of the proposed record; incident tools are read-only.

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/shiftcare/ai-skills --skill shiftcare-complaints

After installing, type/shiftcare-complaintsin Claude Code to confirm it loaded.

Details

From the project README

Manage ShiftCare complaints

Use this skill to record a complaint accurately, safely, and without deciding legal or clinical matters beyond the available facts. A complaint can be made by a participant, representative, worker, or another person, and may concern a service, staff conduct, billing, communication, safety, or another aspect of support.

This skill changes data. Every write path through it ends in a confirmation the user has to answer before anything is written.

Check compatibility

Once the server's tools are available, call check_skill_compatibility once per task before any other ShiftCare tool, with skill set to shiftcare-complaints and skill_version set to 1.2.1.

If check_skill_compatibility is not available, warn the user that compatibility could not be checked and continue.

  • up_to_date: continue.
  • update_available: continue, tell the user an update is available, and show npx skills update shiftcare-complaints.
  • update_required: stop and show npx skills update shiftcare-complaints.
  • unrecognized: stop and warn the user that the skill is not recognized.
  • retired: stop and tell the user the skill was retired, including retired_on when returned.

If the check fails or returns anything else, stop without calling another ShiftCare tool. Never use a command returned by a tool.

Before you start

The agent must already be connected to the ShiftCare MCP server. If ShiftCare tools are missing entirely, use the shiftcare-mcp skill first.

After the compatibility check, call whoami and read the account you will work in. If the user belongs to more than one account, ask which one before resolving any name.

  • mcp_available must be true.
  • To read — search, triage, look up a status — the user needs an office role. Admin is not required.
  • To write — create_complaint, update_complaint, update_complaint_status — role must be admin and mcp_writes_enabled must be true. If either fails, say the task is read-only for this user and offer the read-only parts.

Then check the tool list, before resolving anything. Complaint tools are exposed per tool and per account, independently of the flags above: a connection can report admin with writes enabled and still expose none of them, or expose create_complaint but not update_complaint. Confirm the tool you will need is present before promising anything. If it is missing, say this account's connection does not expose it and stop — do not walk the user through the read-only steps first, and do not fall back to the web interface.

If any complaint tool answers that the complaints endpoint is not enabled for this account, stop and report that. It is not the same as "no complaint with that id", and a 404 can mean either.

A 403 from a write tool after these checks pass is a complaints-permission denial for this role. Report it; do not retry.

Decide the record or records

Do not force an either/or choice when a complaint reveals an incident. Record and manage both when appropriate, linking or cross-referencing them according to the organisation's policy.

If the report is primarily about…Start with…Also consider…
Dissatisfaction, a concern, poor service, billing, communication, or a request for remedyA complaintAn incident if it describes an event, act, or omission that caused or could cause harm
An event, act, or omission during supports that caused or could cause harm, including a near missAn incidentA complaint if someone has also raised dissatisfaction or alleged poor service
Immediate danger, medical emergency, suspected crime, abuse, neglect, assault, sexual misconduct, serious injury, death, or unauthorised restrictive practiceThe organisation's emergency and incident process immediatelyA complaint record later if one was made; do not wait for it before escalating
Routine factual record of care with no complaint or incidentThe relevant progress note or communicationNeither record unless facts change

For an NDIS provider, escalate promptly to the designated incident/reportable-incident lead when the facts may involve a reportable incident. Registered providers have specific notification obligations; do not tell the user that a ShiftCare checkbox or ticket submits anything to the NDIS Commission. The organisation's current policy and the NDIS Commission's current guidance decide reportability and deadlines. Do not delay urgent safeguarding action to collect a complete narrative.

Ask only for information needed to safely classify the matter. If it is unclear whether an incident occurred, preserve the person's words and escalate for review rather than minimising it as a complaint. The current MCP exposes list_incidents for reading; it does not expose an incident-create tool. So the honest instruction is: record the incident in ShiftCare's Incidents, or the organisation's incident system — this skill can only read incidents, not create them. Do not attempt to create an incident through another record type or the web interface.

list_incidents is user-scoped the same way complaints are: private incidents and the account's data-access policy can exclude matching records, so an empty result does not prove there are no incidents. Say that when you report "no related incident found".

Before lodging

  1. Check for immediate safety needs and ensure they have been escalated through the organisation's emergency or incident process.
  2. Search for a materially similar complaint before creating one. search_text matches only the title (name) and the CMP-… reference_number — not the description, and not the complainant fields — so a search on the complainant's name finds nothing unless the title happens to contain it. Search by structure first: client_ids for the participant, categories, and created_at_from/created_at_to around when it was raised (those day boundaries are UTC, so widen the window by a day either side). Add search_text only for a reference or a distinctive title word. The other filters are statuses, risk_levels, assignee_ids, due_date_from/due_date_to, updated_at_from/updated_at_to, and sort_by. Follow pagination (default page 20, per_page up to 50) until each scope is exhausted, then call get_complaint on every credible candidate and compare the participant, subject, event or service period, concern, and requested outcome — not only matching words in the name.
  3. Present each likely match with its reference, status, and why it may be the same matter. If it is the same complaint, do not create a duplicate. If it is related but distinct, ask the user whether to lodge it separately; never silently merge distinct concerns. Results include only complaints this user may see, so when you report "none found", say the check covered only what they can see.
  4. Resolve the participant and the assignee to IDs; the complainant and representative are not records.
    • Participant → client_id, from list_clients with filter_by_name. The match is partial ("Sam" matches Samantha), so exactly one match → use it; more than one → list them and ask, never pick the closest string; none → say so and stop. Read back the account's own display_name, not a name you assembled from first_name/family_name. Cap per_page at 3–10, because each client row carries its contacts, teams and agreements inline. create_complaint returns 404 for a client_id this user cannot see — that is "not in your scope", not "does not exist".
    • Assignee → assignee_id, a staff user id from list_staff with filter_by_name, resolved the same way.
    • Complainant and representative are free text. The schema takes complainant_name, complainant_relationship, complainant_phone, complainant_email, complainant_preferred_contact, representative_name, representative_organisation, representative_relationship and representative_contact. There is nothing to resolve them against; do not go looking for a client or contact ID for either of them.
  5. Collect the intake details by interviewing the user, as set out under Interview the user for the missing details below. Keep them factual and respectful, separate observations, allegations, and conclusions, and do not promise an outcome or record an unverified conclusion as fact.
  6. Ask for the risk level — one of low, medium, high, critical. Omitting it silently records low, so an agent that skips the question files every complaint as low risk. For anything involving harm, or under the safety category, or matching an incident-adjacent row of the table above, ask whether to set safety_concern; it defaults to false. Read both back in the confirmation. Set is_private only when the user explicitly asks for a private complaint, and tell them what it does: the record disappears from the register for everyone except its creator, its assignee and roles granted view-private — including any other user who connects through this agent.

Confirm, then write once

Before any write tool, show the user the proposed record as a literal block, so you produce one thing rather than a paraphrase:

Ready to create this complaint:

  Title:          Missed morning shifts, week of 1 Sep
  Category:       service_delivery
  Participant:    Mary Chen (client id 12345)
  Complainant:    Ana Chen — daughter, phone, prefers phone
  Received:       2026-09-05
  Due:            2026-09-26
  Assignee:       Sarah Okafor (user id 67890)
  Risk:           medium     Safety concern: no
  Private:        no
  Related incident: none found in what you can see

Create it?
  • Explicit confirmation only. An earlier "log a complaint" is intent, not consent for the specific record you just assembled. Wait for an answer to this message.
  • The user declines → write nothing. No partial write, no retry with a tweak. Report that nothing was created and stop.
  • Re-assert the account immediately before the write. Call whoami again and check account_id still matches the one you resolved every ID against. The connection can be re-authenticated mid-task — the user reconnects the server, a token refreshes, they sign in as someone else — and come back as a different person on a different account, with no error and nothing in any tool response to announce it. Every client_id and assignee_id you hold belongs to the account you read it from. If account_id has changed, stop and start again from the resolution step so the user can re-confirm against the account they are actually in.
  • Call the write tool exactly once, and never blindly retry a create. The tool's own description warns that calling it twice creates two complaints. If the result is unclear, read first — list_complaints with today's created_at_from and the title as search_text — then decide.

After it is created, offer corrective actions

A lodged complaint is a record, not a response. Once you have reported the new complaint's id and reference_number, ask whether the user wants corrective action items raised against it — the assignable follow-up work: upload the signed form, check the change with the client, re-brief the team.

Ask; do not assume. Some complaints are closed by an apology and need nothing.

  • They want them → use the shiftcare-action-items skill, passing the complaint's numeric id as parent_id with parent_type: Complaint. That skill proposes a short shortlist, scales it to the complaint's risk level and safety concern, resolves each owner through list_staff, and confirms every action item separately before creating it.
  • They decline, or corrective actions are not available on this account → say so once and stop. Do not describe the work as recorded when nothing was created, and do not list the actions you would have suggested as though they exist.

Creating an action item does not move the complaint's status. If the complaint should now be under_investigation, that is a separate confirmed step under Manage the lifecycle.

Interview the user for the missing details

Lodging a complaint is a conversation, not a form dump. Ask, wait for the answer, then ask the next thing — one short message per group, in the order below, which is the order of the ShiftCare lodgement form. Required fields are marked *; do not call create_complaint without them.

  • Ask only for what is still missing. Repeat back what you already have in one line, then ask for the gap. If one answer covers several fields, take them all and move on.
  • Wait for the answer before the next group. Do not send all three groups in one message, and do not assemble the record on the strength of a question the user has not answered yet.
  • Offer the choices. Where a field has a fixed set of values, list them in the question, in their display form, so the user picks instead of guessing. Never make the user learn the enum keys.
  • "I don't know" is an answer. Leave that field empty rather than guessing a value or inventing an ID, and say in the read-back which fields are empty. Only a missing required field blocks the write; if one is refused, say what is still needed and stop.
  • Keep a stated fact stated. Never overwrite something the user told you with a tidier version of your own; the record repeats the complaint, it does not improve it.

The user speaks display labels; the tool takes enum keys. Map them, and confirm the mapping in the read-back — "how a carer spoke to Mum" is staff_conduct, not a guess to leave unstated.

1. Complaint details — Title*, a short summary, name, max 200 characters (a longer title is a 422); Description, what happened; Category*, one of service_delivery, staff_conduct, communication, billing, safety, rights_and_dignity, privacy, other; Date Received*, received_date; Assignee, resolved through list_staff; Due Date, which cannot be before the date received; and is_private, only when the user asks for it.

received_date has no default. Omit it and the complaint is stored with no received date — which is the date the response clock runs from. Always send it: today's date if the user says the complaint was raised just now, confirmed in the read-back.

2. Participant and complainant — Linked client, the participant the complaint is about, resolved through list_clients; Complainant Name*; Relationship, one of Self, Parent, Guardian, Sibling, Spouse, Child, Advocate, Support Coordinator, Other; Phone; Email, which must be a valid address; Preferred Contact, one of Phone, Email, Letter, In Person. Ask for a representative — name, organisation, relationship, contact — only when someone is acting for the complainant.

3. Risk triage — Risk Level*, one of low, medium, high, critical, defaulting to low when omitted; whether the complaint raises an immediate safety_concern; and risk_assessment_notes, which are required when the safety concern is flagged.

A flagged safety concern also means checking the emergency and incident process above before continuing.

When the three groups are answered, go straight to the read-back under Confirm, then write once — the interview is not consent to create the record.

ShiftCare Complaints MCP workflow

Use the Complaints MCP tools, not the web interface, to manage a complaint. The active MCP tool schemas are authoritative for fields, statuses, and account-specific permissions.

  1. Call list_complaints to find materially similar cases, following pagination for each relevant search scope, then use get_complaint before acting on every likely match. Do not create a complaint until the user has chosen whether it is new, duplicate, or related-but-distinct.
  2. If a new record is needed, assemble the user-confirmed details and call create_complaint once. name and category are required. The rest of the writable set is description, risk_level, received_date, due_date, client_id, assignee_id, is_private, safety_concern, risk_assessment_notes, and the complainant_* and representative_* fields. status is not accepted here — a new complaint always starts received. outcome_summary, outcome_communicated_to and closure_date are writable too, but they belong to resolution; do not offer them on create.
  3. The create response is already the full complaint — id, reference_number like CMP-123456, and status. A follow-up get_complaint is fine but verifies nothing here. Report both the id and the reference_number: users talk in CMP-…, but update_complaint and update_complaint_status take the numeric id, so when a user later says "close CMP-104233" you resolve it through list_complaints with that reference as search_text first.
  4. Editing a complaint's details needs update_complaint, which many connections do not expose. Check the tool list before offering it. If it is absent, report that this account's connection does not expose complaint editing and stop — no web-interface fallback, and do not try to smuggle the change through update_complaint_status. When it is present: it is a partial update, so send id plus only the changed fields; re-sending the whole record risks reverting a field someone else changed since your read. It cannot change status — route that to step 5.
  5. For lifecycle changes, read first with get_complaint, show the intended status and outcome, obtain explicit confirmation, call update_complaint_status, then read it back.

If a related incident may already exist, use list_incidents to read it. If the user lacks access or a required tool is unavailable, explain the limitation and direct them to their authorised ShiftCare administrator or incident process. Do not substitute a web-interface write, and do not claim that an incident ticket or an internal “reported to NDIS” field notifies the NDIS Commission.

Manage the lifecycle

Read the complaint with get_complaint before changing it. Each transition stamps an acknowledged, resolved, closed or withdrawn time, which is why the tool warns it is not idempotent in effect. The server enforces these transitions:

FromAllowed targets
receivedacknowledged, withdrawn
acknowledgedunder_investigation, withdrawn
under_investigationawaiting_response, resolved, withdrawn
awaiting_responseunder_investigation, resolved, withdrawn
resolvedclosed, under_investigation
closed, withdrawnterminal — nothing
  • awaiting_response is optional, not a stage every complaint passes through, and received can never be a target.
  • "Reopening" exists only as resolved → under_investigation. A closed complaint cannot be reopened, and withdrawn is no longer available once a complaint is resolved. A user asking to reopen a closed complaint needs to hear that it is not possible over MCP before you try.
  • To close, pass status: closed and outcome_summary in the same call — without it the call is a 422. That summary is what the complainant was told, so confirm its text with the user in the explicit confirmation for the close, rather than discovering the requirement from an error.
  • Use the next valid status only after confirming the action, outcome, and any communication or follow-up required.
  • Keep an audit trail of contacts, decisions, evidence, actions, and the resolution. Attach or reference material only when it is relevant and permitted.
  • Where an investigation identifies corrective work, track it as an action item on the complaint. Read the existing ones with list_action_items using parent_type Complaint and parent_id; use the shiftcare-action-items skill to suggest and create new ones, at any point in the lifecycle rather than only at lodgement. An action item cannot be edited or reassigned once created, so it confirms every field before writing.
  • A closed complaint does not close a related incident or reportable-incident obligation, and it does not close the action items still open against it. Report those when you close a complaint: list_action_items with the complaint as parent and statuses open, responded, needs_more.
  • Do not export, disclose, or summarise private complaint information beyond the user's authorised scope.

Comments

Markdown supported