{"apiVersion":"v1","directorySlug":"cami-mcp-4bfac859d5","title":"cami","description":"cami is the AI assistant for your whole team, inside the LINE group you already use. Ask once: she puts a name and a date on it, reminds the right person, and tells you when it’s done. Nothing goes out without your yes. Free to start, nothing to install.","pageUrl":"https://www.mcpbundles.com/skills/cami-mcp-4bfac859d5","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://cami.work/api/mcp","hostedMcpUrl":null,"toolCount":45,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"work.cami/cami-mcp-4bfac859d5","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"whoami","description":"Who this Member Key acts as, its scopes, and the groups it reaches.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"title":"Who am I","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"whoami","displayName":"Who am I"},{"name":"list_my_groups","description":"The groups on this key, with name / picture / member count.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"title":"My groups","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_my_groups","displayName":"My groups"},{"name":"list_group_members","description":"The group roster with per-member reachability, plus coverage vs LINE's own member count — the roster is emergent, so never claim it is complete when coverage says otherwise. A member carries `alsoCalled` when the group's chat has affirmed other names for them (ป้อง, น้องปอง); use a member's roster name or one of those, never a name you invented.","inputSchema":{"type":"object","required":["groupId"],"properties":{"groupId":{"type":"string","pattern":"^[CV][0-9a-f]{32}$"}},"additionalProperties":false},"title":"Who is in this group","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_group_members","displayName":"Who is in this group"},{"name":"resolve_member","description":"Turn a display name — or a name the chat calls somebody by — into a userId. When more than one member matches, it returns every candidate and resolves NOTHING — ask the member which one. A match by an affirmed alias says so in `via`.","inputSchema":{"type":"object","required":["groupId","query"],"properties":{"query":{"type":"string","minLength":1},"groupId":{"type":"string","pattern":"^[CV][0-9a-f]{32}$"}},"additionalProperties":false},"title":"Find a person by name","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"resolve_member","displayName":"Find a person by name"},{"name":"get_my_plate","description":"Everything on me right now, across every group on the key, ordered as ONE list (the same filters and orderings list_my_activities takes). Each card names its group; a card's queue number stays its own board's, because that is the number the member's phone shows.","inputSchema":{"type":"object","properties":{"sort":{"enum":["checkpoint","due","urgency","importancy","eisenhower","created"],"type":"string"},"limit":{"type":"number","maximum":200,"minimum":1},"scope":{"enum":["mine","group"],"type":"string"},"filter":{"type":"object","properties":{"role":{"type":"array","items":{"enum":["R","A","C","I"],"type":"string"}},"status":{"type":"array","items":{"enum":["drafting","requested","acknowledged","in-progress","done","paused","backlog","rejected"],"type":"string"}},"urgency":{"type":"array","items":{"enum":["extreme","high","medium","low","decide-later"],"type":"string"}},"slipping":{"type":"boolean"},"categoryId":{"type":"array","items":{"type":"string"},"maxItems":40},"importancy":{"type":"array","items":{"enum":["must","should","could","wont","decide-later"],"type":"string"}},"includeDrafts":{"type":"boolean"},"needsDecision":{"type":"boolean"},"checkpointBefore":{"type":"string","pattern":"^(\\d{4}-\\d{2}-\\d{2})?$"}},"additionalProperties":false}},"additionalProperties":false},"title":"Everything on my plate","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_my_plate","displayName":"Everything on my plate"},{"name":"get_board_landscape","description":"START HERE for anything about MANY cards. The whole shape of the board in one small read: how many cards, by quadrant / status / urgency / importancy / my RACI role / category, the PEOPLE on it with how many cards each is Responsible or Accountable for and how many of those are unfinished, how many carry files and links, what owes a decision or is slipping, and the near checkpoint dates. With scope: \"group\" the same read covers the WHOLE team's board — that is the one call that answers \"how much","inputSchema":{"type":"object","properties":{"scope":{"enum":["mine","group"],"type":"string"},"groupId":{"type":"string","pattern":"^[CV][0-9a-f]{32}$"}},"additionalProperties":false},"title":"Board at a glance","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_board_landscape","displayName":"Board at a glance"},{"name":"list_my_activities","description":"Cards in one group, board order, filterable — yours by default, or the whole group's with scope: \"group\". Every card carries its full RACI, so \"who is accountable for this\" needs no second call. For a question about the board's SHAPE rather than particular cards, call get_board_landscape first — it answers most of them outright and tells you which single filter answers the rest.","inputSchema":{"type":"object","required":["groupId"],"properties":{"sort":{"enum":["checkpoint","due","urgency","importancy","eisenhower","created"],"type":"string"},"limit":{"type":"number","maximum":200,"minimum":1},"scope":{"enum":["mine","group"],"type":"string"},"filter":{"type":"object","properties":{"role":{"type":"array","items":{"enum":["R","A","C","I"],"type":"string"}},"status":{"type":"array","items":{"enum":["drafting","requested","acknowledged","in-progress","done","paused","backlog","rejected"],"type":"string"}},"urgency":{"type":"array","items":{"enum":["extreme","high","medium","low","decide-later"],"type":"string"}},"slipping":{"type":"boolean"},"categoryId":{"type":"array","items":{"type":"string"},"maxItems":40},"importancy":{"type":"array","items":{"enum":["must","should","could","wont","decide-later"],"type":"string"}},"includeDrafts":{"type":"boolean"},"needsDecision":{"type":"boolean"},"checkpointBefore":{"type":"string","pattern":"^(\\d{4}-\\d{2}-\\d{2})?$"}},"additionalProperties":false},"groupId":{"type":"string","pattern":"^[CV][0-9a-f]{32}$"}},"additionalProperties":false},"title":"My cards in one group","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_my_activities","displayName":"My cards in one group"},{"name":"list_activity_categories","description":"The group's OWN activity-category catalogue — the ids create_draft and edit_activity file a card under, and the labels cami prefixes onto card titles. The members author it in the app; an agent reads it and never invents one.","inputSchema":{"type":"object","required":["groupId"],"properties":{"groupId":{"type":"string","pattern":"^[CV][0-9a-f]{32}$"}},"additionalProperties":false},"title":"This group's categories","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_activity_categories","displayName":"This group's categories"},{"name":"get_activity","description":"One card through the viewer projection, with ids joined to names and the full RACI. Any card in a group the member belongs to: one they are on reads whole, one they are not reads as the team copy the app itself shows them (no files, no messages), marked visibility: \"team\".","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"Open a card","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_activity","displayName":"Open a card"},{"name":"get_activity_timeline","description":"The dated per-member track record (Requested on · Acknowledged on · Checkpoint #2 on …).","inputSchema":{"type":"object","required":["activityId"],"properties":{"userId":{"type":"string","pattern":"^U[0-9a-f]{32}$"},"activityId":{"type":"string"}},"additionalProperties":false},"title":"A card's history","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_activity_timeline","displayName":"A card's history"},{"name":"list_mentions","description":"The MENTIONED & MESSAGES thread, including done/checkpoint entries.","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"A card's messages","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_mentions","displayName":"A card's messages"},{"name":"list_attachments","description":"The files AND links on one card — the card's own, everything filed on its message thread, and every http(s) address a member typed inside a message or a finish memo (each entry's source says card, message or note). What a member sees as a tappable link on the card is what this lists.","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"Files on a card","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_attachments","displayName":"Files on a card"},{"name":"list_my_files","description":"Every file and link the member can reach, across cards — one card, one group, or every group on the key. THE tool for \"what files do I have?\": a board read carries only counts, so answering that from a list is how an agent concludes there are none. Links include addresses typed inside messages and finish memos, not only the ones attached as structure — each entry's source says which. Each entry names the card it is on; pair it with get_attachment_url to actually fetch a file.","inputSchema":{"type":"object","properties":{"kind":{"enum":["all","file","link"],"type":"string"},"limit":{"type":"number","maximum":500,"minimum":1},"groupId":{"type":"string","pattern":"^[CV][0-9a-f]{32}$"},"withUrls":{"type":"boolean"},"activityId":{"type":"string"}},"additionalProperties":false},"title":"All my files and links","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_my_files","displayName":"All my files and links"},{"name":"get_attachment_url","description":"A short-lived signed URL for one attachment, via the blob proxy.","inputSchema":{"type":"object","required":["activityId","key"],"properties":{"key":{"type":"string"},"download":{"type":"boolean"},"activityId":{"type":"string"}},"additionalProperties":false},"title":"Download link for a file","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_attachment_url","displayName":"Download link for a file"},{"name":"list_related_activities","description":"The relate graph around one card.","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"Related work","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"list_related_activities","displayName":"Related work"},{"name":"explain_status","description":"Why this card reads as it does. Delay is measured against the CHECKPOINT, never the due date — do not reconstruct this rule from memory.","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"Why is it at this status","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"explain_status","displayName":"Why is it at this status"},{"name":"get_available_actions","description":"Domain truth for what the member may do here, flagged availableVia mcp|app-only, with what each action needs and exactly who is mentionable. The mandatory pre-flight for every write.","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"What can I do with this card","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_available_actions","displayName":"What can I do with this card"},{"name":"get_usage_guide","description":"How cami works, in full, generated from the domain itself. Replaces any MD file or skill.","inputSchema":{"type":"object","properties":{"section":{"type":"string"}},"additionalProperties":false},"title":"How cami works","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_usage_guide","displayName":"How cami works"},{"name":"get_vocabulary","description":"The exact enums, orders and limits the domain uses.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"title":"The exact words cami uses","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_vocabulary","displayName":"The exact words cami uses"},{"name":"validate_activity","description":"Dry-validate a create/edit body: EVERY fault at once, nothing written, nothing proposed.","inputSchema":{"type":"object","required":["groupId","name"],"properties":{"tz":{"type":"string"},"due":{"type":"string","pattern":"^(\\d{4}-\\d{2}-\\d{2})?$"},"name":{"type":"string","maxLength":140,"minLength":1},"raci":{"type":"object","propertyNames":{"pattern":"^U[0-9a-f]{32}$"},"additionalProperties":{"enum":["R","A","C","I"],"type":"string"}},"draft":{"type":"boolean"},"links":{"type":"array","items":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"label":{"type":"string"}}},"maxItems":10},"groupId":{"type":"string","pattern":"^[CV][0-9a-f]{32}$"},"urgency":{"enum":["extreme","high","medium","low","decide-later"],"type":"string"},"briefHtml":{"type":"string"},"categoryId":{"type":"string","maxLength":64},"checkpoint":{"type":"string","pattern":"^(\\d{4}-\\d{2}-\\d{2})?$"},"importancy":{"enum":["must","should","could","wont","decide-later"],"type":"string"},"attachments":{"type":"array","items":{"type":"object","required":["key"],"properties":{"key":{"type":"string"},"name":{"type":"string"},"size":{"type":"number","maximum":104857600},"type":{"type":"string"},"uploadToken":{"type":"string"}}},"maxItems":20},"rationaleHtml":{"type":"string"},"relatedActivityIds":{"type":"array","items":{"type":"string"},"maxItems":20}},"additionalProperties":false},"title":"Check a card before sending","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"validate_activity","displayName":"Check a card before sending"},{"name":"line_confirmation_card","description":"A ready-to-send LINE Flex Message asking the member to confirm ONE pending proposal — the activity name, who it goes to with their R/A/C/I roles, the short brief, the checkpoint and due dates, how it will go out, and stacked Confirm/Cancel buttons, in cami's own design. Push the returned `flex` object through YOUR LINE channel as one message; the buttons are postbacks, so the tap arrives at YOUR webhook — read the mcp_action_id off the postback data (\"cami.confirm:<id>\" / \"cami.cancel:<id>\") and","inputSchema":{"type":"object","required":["mcp_action_id"],"properties":{"mcp_action_id":{"type":"string"}},"additionalProperties":false},"title":"LINE confirmation card","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"line_confirmation_card","displayName":"LINE confirmation card"},{"name":"create_draft","description":"Propose a new activity as a private draft — including the full RACI map (mandatory on submit: exactly one Accountable). Nobody is notified.","inputSchema":{"type":"object","required":["groupId","name"],"properties":{"tz":{"type":"string"},"due":{"type":"string","pattern":"^(\\d{4}-\\d{2}-\\d{2})?$"},"name":{"type":"string","maxLength":140,"minLength":1},"raci":{"type":"object","propertyNames":{"pattern":"^U[0-9a-f]{32}$"},"additionalProperties":{"enum":["R","A","C","I"],"type":"string"}},"draft":{"type":"boolean"},"links":{"type":"array","items":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"label":{"type":"string"}}},"maxItems":10},"groupId":{"type":"string","pattern":"^[CV][0-9a-f]{32}$"},"urgency":{"enum":["extreme","high","medium","low","decide-later"],"type":"string"},"briefHtml":{"type":"string"},"categoryId":{"type":"string","maxLength":64},"checkpoint":{"type":"string","pattern":"^(\\d{4}-\\d{2}-\\d{2})?$"},"importancy":{"enum":["must","should","could","wont","decide-later"],"type":"string"},"attachments":{"type":"array","items":{"type":"object","required":["key"],"properties":{"key":{"type":"string"},"name":{"type":"string"},"size":{"type":"number","maximum":104857600},"type":{"type":"string"},"uploadToken":{"type":"string"}}},"maxItems":20},"rationaleHtml":{"type":"string"},"relatedActivityIds":{"type":"array","items":{"type":"string"},"maxItems":20}},"additionalProperties":false},"title":"Draft a new request","logicalName":"create_draft","displayName":"Draft a new request","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"edit_activity","description":"Propose field changes, under canEditActivity (creator at non-complete status; accountable once acknowledged).","inputSchema":{"type":"object","required":["activityId","edit"],"properties":{"edit":{"type":"object","properties":{"tz":{"type":"string"},"due":{"type":"string","pattern":"^(\\d{4}-\\d{2}-\\d{2})?$"},"name":{"type":"string","maxLength":140,"minLength":1},"raci":{"type":"object","propertyNames":{"pattern":"^U[0-9a-f]{32}$"},"additionalProperties":{"enum":["R","A","C","I"],"type":"string"}},"draft":{"type":"boolean"},"links":{"type":"array","items":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"label":{"type":"string"}}},"maxItems":10},"groupId":{"type":"string","pattern":"^[CV][0-9a-f]{32}$"},"urgency":{"enum":["extreme","high","medium","low","decide-later"],"type":"string"},"briefHtml":{"type":"string"},"categoryId":{"type":"string","maxLength":64},"checkpoint":{"type":"string","pattern":"^(\\d{4}-\\d{2}-\\d{2})?$"},"importancy":{"enum":["must","should","could","wont","decide-later"],"type":"string"},"attachments":{"type":"array","items":{"type":"object","required":["key"],"properties":{"key":{"type":"string"},"name":{"type":"string"},"size":{"type":"number","maximum":104857600},"type":{"type":"string"},"uploadToken":{"type":"string"}}},"maxItems":20},"rationaleHtml":{"type":"string"},"relatedActivityIds":{"type":"array","items":{"type":"string"},"maxItems":20}},"additionalProperties":false},"activityId":{"type":"string"}},"additionalProperties":false},"title":"Change a card's details","logicalName":"edit_activity","displayName":"Change a card's details","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_draft","description":"Propose discarding an OWN, UNSUBMITTED draft. A submitted activity refuses.","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"Discard a draft","logicalName":"delete_draft","displayName":"Discard a draft","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"relate_activities","description":"Propose linking/unlinking related cards. Add-targets must be cards the caller can see.","inputSchema":{"type":"object","required":["activityId"],"properties":{"add":{"type":"array","items":{"type":"string"},"maxItems":20},"remove":{"type":"array","items":{"type":"string"},"maxItems":20},"activityId":{"type":"string"}},"additionalProperties":false},"title":"Link two cards","logicalName":"relate_activities","displayName":"Link two cards","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"submit_request","description":"Propose submitting a draft: every R/A member gets a Requested row. `notify` is REQUIRED and is the member's decision — the app makes them pick it every time they press Send, so ask them rather than choosing for them. The proposal names the group chat and everyone the card puts a role on, so they can check both before confirming.","inputSchema":{"type":"object","required":["activityId","notify"],"properties":{"notify":{"enum":["personal","group","silent","hashtag","none"],"type":"string"},"activityId":{"type":"string"},"notifyHashtag":{"type":"string"}},"additionalProperties":false},"title":"Send the request","logicalName":"submit_request","displayName":"Send the request","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"submit_new_request","description":"Propose creating AND sending a new request in ONE confirm. Everything a submit requires is required here — the levels, the RACI map, the checkpoint, the briefs — plus the member's notify choice, and the single proposal reads all of it back: their one yes creates the card and every R/A member gets a Requested row. Use create_draft when they want a private draft or you are still gathering fields; use this when they asked you to SEND it and every answer is theirs (given now, or a standing instructi","inputSchema":{"type":"object","required":["groupId","notify","name","urgency","importancy","raci","checkpoint","rationaleHtml","briefHtml"],"properties":{"tz":{"type":"string"},"due":{"type":"string","pattern":"^(\\d{4}-\\d{2}-\\d{2})?$"},"name":{"type":"string","maxLength":140,"minLength":1},"raci":{"type":"object","propertyNames":{"pattern":"^U[0-9a-f]{32}$"},"additionalProperties":{"enum":["R","A","C","I"],"type":"string"}},"links":{"type":"array","items":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"label":{"type":"string"}}},"maxItems":10},"notify":{"enum":["personal","group","silent","hashtag","none"],"type":"string"},"groupId":{"type":"string","pattern":"^[CV][0-9a-f]{32}$"},"urgency":{"enum":["extreme","high","medium","low","decide-later"],"type":"string"},"briefHtml":{"type":"string"},"categoryId":{"type":"string","maxLength":64},"checkpoint":{"type":"string","pattern":"^(\\d{4}-\\d{2}-\\d{2})?$"},"importancy":{"enum":["must","should","could","wont","decide-later"],"type":"string"},"attachments":{"type":"array","items":{"type":"object","required":["key"],"properties":{"key":{"type":"string"},"name":{"type":"string"},"size":{"type":"number","maximum":104857600},"type":{"type":"string"},"uploadToken":{"type":"string"}}},"maxItems":20},"notifyHashtag":{"type":"string"},"rationaleHtml":{"type":"string"},"relatedActivityIds":{"type":"array","items":{"type":"string"},"maxItems":20}},"additionalProperties":false},"title":"Create and send in one confirm","logicalName":"submit_new_request","displayName":"Create and send in one confirm","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"acknowledge","description":"Propose accepting the work, optionally with a note + mentions. An Accountable acknowledging while others are Responsible skips the app's solely/together dedication — the proposal warns.","inputSchema":{"type":"object","required":["activityId"],"properties":{"note":{"type":"string","maxLength":2000},"files":{"type":"array","items":{"type":"object","required":["key"],"properties":{"key":{"type":"string"},"name":{"type":"string"},"size":{"type":"number","maximum":104857600},"type":{"type":"string"},"uploadToken":{"type":"string"}}},"maxItems":10},"links":{"type":"array","items":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"label":{"type":"string"}}},"maxItems":5},"mentions":{"type":"array","items":{"type":"string","pattern":"^U[0-9a-f]{32}$"},"maxItems":20},"activityId":{"type":"string"}},"additionalProperties":false},"title":"Acknowledge a request","logicalName":"acknowledge","displayName":"Acknowledge a request","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"start_work","description":"Propose moving my row to in-progress.","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"Start work","logicalName":"start_work","displayName":"Start work","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"pause","description":"Propose parking my row at paused.","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"Pause work","logicalName":"pause","displayName":"Pause work","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"resume","description":"Propose returning my paused row to in-progress.","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"Resume work","logicalName":"resume","displayName":"Resume work","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"file_checkpoint","description":"Propose a progress REPORT. Changes no state — it stamps the timeline and flips the badge to 'In progress - Checked'. All fields optional.","inputSchema":{"type":"object","required":["activityId"],"properties":{"note":{"type":"string","maxLength":2000},"files":{"type":"array","items":{"type":"object","required":["key"],"properties":{"key":{"type":"string"},"name":{"type":"string"},"size":{"type":"number","maximum":104857600},"type":{"type":"string"},"uploadToken":{"type":"string"}}},"maxItems":10},"links":{"type":"array","items":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"label":{"type":"string"}}},"maxItems":5},"mentions":{"type":"array","items":{"type":"string","pattern":"^U[0-9a-f]{32}$"},"maxItems":20},"activityId":{"type":"string"}},"additionalProperties":false},"title":"File a checkpoint","logicalName":"file_checkpoint","displayName":"File a checkpoint","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"finish_activity","description":"Propose finishing my part. All fields optional — an empty finish still finishes.","inputSchema":{"type":"object","required":["activityId"],"properties":{"note":{"type":"string","maxLength":2000},"files":{"type":"array","items":{"type":"object","required":["key"],"properties":{"key":{"type":"string"},"name":{"type":"string"},"size":{"type":"number","maximum":104857600},"type":{"type":"string"},"uploadToken":{"type":"string"}}},"maxItems":10},"links":{"type":"array","items":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"label":{"type":"string"}}},"maxItems":5},"mentions":{"type":"array","items":{"type":"string","pattern":"^U[0-9a-f]{32}$"},"maxItems":20},"activityId":{"type":"string"}},"additionalProperties":false},"title":"Mark it done","logicalName":"finish_activity","displayName":"Mark it done","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"reject","description":"Propose declining. TEAM-WIDE when the caller is the Accountable (every R/A row moves; note becomes mandatory; only they can undo) — the proposal states the reach.","inputSchema":{"type":"object","required":["activityId"],"properties":{"note":{"type":"string","maxLength":2000},"files":{"type":"array","items":{"type":"object","required":["key"],"properties":{"key":{"type":"string"},"name":{"type":"string"},"size":{"type":"number","maximum":104857600},"type":{"type":"string"},"uploadToken":{"type":"string"}}},"maxItems":10},"links":{"type":"array","items":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"label":{"type":"string"}}},"maxItems":5},"mentions":{"type":"array","items":{"type":"string","pattern":"^U[0-9a-f]{32}$"},"maxItems":20},"activityId":{"type":"string"}},"additionalProperties":false},"title":"Reject a request","logicalName":"reject","displayName":"Reject a request","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"undo_reject","description":"Propose taking a refusal back — each member returns to their pre-reject state.","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"Take a rejection back","logicalName":"undo_reject","displayName":"Take a rejection back","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"keep_for_backlog","description":"Propose parking the WHOLE activity (Accountable only; every R/A row moves to backlog).","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"Park it in the backlog","logicalName":"keep_for_backlog","displayName":"Park it in the backlog","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"notify_decision","description":"Propose the one notify choice a finished member makes. 'group' is refused in 1.0; the decision is once per cycle.","inputSchema":{"type":"object","required":["activityId","notifyTarget"],"properties":{"activityId":{"type":"string"},"notifyTarget":{"enum":["requester","accountable","group","silent","none"],"type":"string"}},"additionalProperties":false},"title":"Choose how to notify","logicalName":"notify_decision","displayName":"Choose how to notify","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"notify_requester","description":"Propose DMing the requester that a declined card is stuck. No state change.","inputSchema":{"type":"object","required":["activityId"],"properties":{"activityId":{"type":"string"}},"additionalProperties":false},"title":"Nudge the requester","logicalName":"notify_requester","displayName":"Nudge the requester","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"add_mention","description":"Propose a standalone MENTIONED & MESSAGES entry (anyone involved, any status, no state change). A message, a file or a link is required.","inputSchema":{"type":"object","required":["activityId"],"properties":{"note":{"type":"string","maxLength":2000},"files":{"type":"array","items":{"type":"object","required":["key"],"properties":{"key":{"type":"string"},"name":{"type":"string"},"size":{"type":"number","maximum":104857600},"type":{"type":"string"},"uploadToken":{"type":"string"}}},"maxItems":10},"links":{"type":"array","items":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"label":{"type":"string"}}},"maxItems":5},"mentions":{"type":"array","items":{"type":"string","pattern":"^U[0-9a-f]{32}$"},"maxItems":20},"activityId":{"type":"string"}},"additionalProperties":false},"title":"Post a message on a card","logicalName":"add_mention","displayName":"Post a message on a card","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"attach_links","description":"Propose adding or removing links on the CARD itself, without resending the list. Needs edit rights (creator, or accountable once acknowledged) — to put a link on a card you only work on, file it with a message instead (add_mention).","inputSchema":{"type":"object","required":["activityId"],"properties":{"add":{"type":"array","items":{"type":"object","required":["url"],"properties":{"url":{"type":"string"},"label":{"type":"string"}}},"maxItems":10},"remove":{"type":"array","items":{"type":"string"},"maxItems":10},"activityId":{"type":"string"}},"additionalProperties":false},"title":"Add or remove links","logicalName":"attach_links","displayName":"Add or remove links","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"attach_files","description":"Propose adding or removing files on the CARD itself, without resending the list. Needs edit rights. Upload first with request_file_upload, or attach a key you can already see on your own cards in that group.","inputSchema":{"type":"object","required":["activityId"],"properties":{"add":{"type":"array","items":{"type":"object","required":["key"],"properties":{"key":{"type":"string"},"name":{"type":"string"},"size":{"type":"number","maximum":104857600},"type":{"type":"string"},"uploadToken":{"type":"string"}}},"maxItems":20},"remove":{"type":"array","items":{"type":"string"},"maxItems":20},"activityId":{"type":"string"}},"additionalProperties":false},"title":"Add or remove files","logicalName":"attach_files","displayName":"Add or remove files","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"request_file_upload","description":"Get a short-lived URL to upload ONE file straight to cami's storage, plus the token that lets you attach it. Steps: call this, HTTP PUT the bytes to `uploadUrl` (no auth header, send Content-Type), then pass { key, name, size, type, uploadToken } to attach_files or to a message. The grant is yours alone, for that group, and expires.","inputSchema":{"type":"object","required":["groupId","name"],"properties":{"name":{"type":"string","minLength":1},"size":{"type":"number","maximum":104857600,"minimum":0},"type":{"type":"string"},"groupId":{"type":"string","pattern":"^[CV][0-9a-f]{32}$"}},"additionalProperties":false},"title":"Get an upload slot","logicalName":"request_file_upload","displayName":"Get an upload slot","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"confirm_action","description":"The member said yes — actualize the proposal, whatever it was. Idempotent: a second confirm returns the first result. A card that changed since propose refuses with a fresh proposal (MCP_ACTION_STALE).","inputSchema":{"type":"object","required":["mcp_action_id"],"properties":{"mcp_action_id":{"type":"string"}},"additionalProperties":false},"title":"Confirm — do it","logicalName":"confirm_action","displayName":"Confirm — do it","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cancel_action","description":"The member said no — close the proposal; nothing ever happened. The reason lands in the audit.","inputSchema":{"type":"object","required":["mcp_action_id"],"properties":{"reason":{"type":"string","maxLength":500},"mcp_action_id":{"type":"string"}},"additionalProperties":false},"title":"Cancel the proposal","logicalName":"cancel_action","displayName":"Cancel the proposal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_pending_actions","description":"Proposals still waiting for a yes, scoped to this (key, agent) pair — recovery after a crashed conversation.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"title":"What is waiting for a yes","logicalName":"list_pending_actions","displayName":"What is waiting for a yes","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=cami&config=eyJ1cmwiOiAiaHR0cHM6Ly9jYW1pLndvcmsvYXBpL21jcCJ9"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22cami%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fcami.work%2Fapi%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22cami%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fcami.work%2Fapi%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=cami&connectorUrl=https%3A%2F%2Fcami.work%2Fapi%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"cami\" --url \"https://cami.work/api/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/cami-mcp-4bfac859d5","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/cami-mcp-4bfac859d5/tools/{tool}","mcpServerUrl":"https://cami.work/api/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/cami-mcp-4bfac859d5?live=1"}