wecom-cli is a tool provided by the plugin, not a terminal command: all operations are completed by calling this tool, and parameters should be passed using args , and it is forbidden to use it through command-line methods such as exec / shell / terminal.
⚠️ Prerequisite: Before calling wecom-cli for the first time, you must perform the prerequisite check according to the wecomcli-preflight skill to ensure the tool has been added to the whitelist.
WeCom Schedule SkillScope of Application
Applicable
- Book / create a schedule (including purely offline face-to-face meetings, i.e., arrangements without an online meeting link)
- View / browse schedules (what is on today's agenda, check this week's schedule)
- Search schedules (find a schedule by keyword, by organizer, or by participant)
- Update / modify a schedule (change time, change location, add or remove people, change meeting room; updating recurring schedules is not supported)
- Cancel a schedule (canceling recurring schedules is not supported)
- Check busy/free status / find common free time slots for multiple people
- Book a meeting room, check whether a meeting room is available, check office buildings
Not Applicable
- Creating, updating, or canceling recurring / repeating schedules (weekly / monthly / daily repetition) → none are supported; guide the user to operate manually in the WeCom client
- Replying to / declining schedule invitations (accept / decline / tentative, including "decline this schedule" and "not attending") → not supported; guide the user to operate in the WeCom client or message the organizer privately
Routing for Easily Confused Scenarios
- User wants tocreate a meeting that includes an online meeting link(requires a meeting number / join link / remote or video attendance) → use
wecomcli-meetinginstead (creating a meeting will also generate a schedule, so there is no need to create one again in this skill) - User only says "have a meeting / set up a meeting / arrange a meeting / xx meeting", etc.,without clarifying whether it is a schedule or an online meeting(creation scenario) → you must first ask a clarifying question in text (the fixed question "Do you need to create a schedule or a meeting?", and ask the user to reply "schedule / meeting"); do not assume and create directly
- The meeting the user wantssupports both offline and remote attendance(e.g., "held offline with out-of-town colleagues joining remotely") → it includes an online meeting link, so use
wecomcli-meeting - Only a location / meeting room number is given(e.g., "have a meeting in 1605" or "book a meeting room for a meeting") → this does not constitute "clearly a schedule", and you still need to first ask a clarifying question in text; you cannot skip the follow-up just because a location is included
- Vague expressions in query scenarios("what meetings are coming up / what meetings are there") → asking follow-up questions is strictly prohibited; check both schedules and meetings and display them merged; only when "online meeting / video meeting / join link / meeting number / Tencent Meeting / remote attendance" is explicitly mentioned should you use
wecomcli-meetingto check meetings only
Routing Rules
| User Intent | Reference Document |
|---|---|
| Book a schedule, arrange a purely offline face-to-face meeting (without an online meeting link), create a schedule | calendar-create |
| View schedules, what is on today's agenda, check this week's schedule | calendar-agenda |
| Find when a certain schedule or project review is | calendar-search |
| Check schedule details, view recurrence rules, view meeting links | calendar-agenda |
| Cancel a schedule, it's no longer happening | calendar-cancel |
| Modify a schedule, update a schedule, change the time, add/remove people, switch meeting rooms | calendar-update |
| Check busy/free status, when someone is available, find common free time for multiple people | calendar-freebusy |
| Book a meeting room, check whether a meeting room is free, check office buildings, reserve a meeting room | calendar-meeting-room |
Principles for choosing between browsing vs searching: when the user mentionsschedule subject keywords, use search;when only a time/date is given without schedule subject keywords, you must use list browsing (
list). When details such as recurrence rules or meeting links are needed, then read the single schedule's details to supplement.
Skill boundary: schedule vs meeting [CRITICAL]
This skill (wecomcli-calendar) is only responsible forschedules—that is, non-meeting schedule arrangements, as well as pure offline face-to-face meetings that do not include online meeting links.Any meeting that involves an online meeting link (including remote/video attendance) belongs to the wecomcli-meeting skill, and is not created in this skill.
| User intent | Owning skill |
|---|---|
| Reserve a schedule, arrange a pure offline face-to-face meeting (without an online meeting link), book a meeting room, check/modify/cancel a schedule, check busy/free status | This skill wecomcli-calendar |
| Create a meeting with an online meeting link, a meeting that requires a meeting number or join link, a meeting that requires remote/video attendance | wecomcli-meeting skill |
Disambiguation rules (creation scenarios only): when the user only says "meeting/meet/have a meeting/schedule a meeting/arrange a meeting/xx meeting/xx conference" etc. without clarifying whether it is a schedule or a meeting,you must first ask a follow-up question in text, then route to the corresponding skill; it is forbidden to default directly to creating a schedule. This textual disambiguation is only for "creation"; for query scenarios, follow-up questions are strictly forbidden—when it clearly points to an online meeting, only query meetings; when it is clearly a schedule/arrangement, only query schedules; for ambiguous expressions ("meeting / xx meeting / what meetings are coming up" etc.), query both schedules and meetings (see "Query Disambiguation" below).
Questions and options are fixed [CRITICAL]: during disambiguation confirmation, both the question and the selectable options must be used verbatim, and any modification of the content is strictly forbidden—the question is fixed as
"需要创建日程还是会议?", and the selectable options are fixed as日程/会议; you must not rewrite the question wording, add or remove or rewrite options, translate, or design other expressions yourself (such as "online meeting / online conference / video meeting / offline meeting" etc.).
Ask the user in text:需要创建日程还是会议?(请回复:日程 / 会议)
- Words such as "meeting," "meet," and "have a meeting" do not themselves constitute "clear" [CRITICAL]: these words only indicate that people need to get together to discuss matters; they do not indicate whether it is a schedule or a meeting. It is forbidden to default to creation in this skill (schedule) just because the word "meeting" appears in the query, and it is also forbidden to default in the opposite direction to a meeting—as long as it is not clear, you must first ask a follow-up question in text before routing. Only when pure offline signals such as "meet up / create schedule" appear should you stay directly in this skill.
- If the user answers "schedule" → stay in this skill and create a schedule according to the "Reserve Schedule Workflow."
- If the user answers "meeting" → switch to
读取 wecomcli-meeting 技能to create a meeting (creating a meeting will simultaneously generate a corresponding schedule, so there is no need to create another one in this skill). - When the user has made it clear (e.g., "meet up" or "create a schedule" = schedule; "send a meeting join link", "need the meeting number", or "attend remotely" = meeting), route directly without asking follow-up questions.
- Supports both offline and remote attendance(e.g., "hold it offline with out-of-town colleagues joining remotely"), because it includes an online meeting link, it is assigned to the wecomcli-meeting skill: creating a meeting simultaneously generates a schedule, so there is no need to create a separate schedule in this skill.
- Only has a location/meeting room number(e.g., "meet in 1605", "meet at the meeting room in Building A", "book a meeting room for a meeting") does not constitute "clearly a schedule"—remote attendance may also be needed in a meeting room, and whether it is a schedule or a meeting is still unknown. You must first ask in text to disambiguate; you cannot skip the follow-up question just because a location is included.
Before rescheduling / recreating a schedule, you must first identify meeting association [CRITICAL]
Rescheduling intents such as "reschedule / change the time / move to / postpone / reschedule again" (even if the user says "cancel... and then reschedule to...", including "cancel" still counts as rescheduling) are prohibited from being mechanically split into cancel + create:
- First locate, then determine meeting association:
search/listThe returned results all includemeetingfield; after locating the target schedule,directly checkmeeting.meeting_code—non-empty means "a meeting-form schedule containing an online meeting link", empty means a pure schedule; there is no need to additionally read the schedule details again for this (only whenrepeat_ruleand other fields are still needed should you supplement it). - Pure schedule → Use the update schedule intent in this skill's routing table to change the time; cancel + create is prohibited.
- Contains a meeting link → Switch to
读取 wecomcli-meeting 技能, passmeeting.meeting_idintomeeting updateto change the time (preserving the meeting link and participants), with no need to search again to locate it.
Root cause:
createcan only create pure schedules and cannot recreate a meeting link (it can split but not merge); cancel + create will cause the meeting link to be permanently lost, so rescheduling always goes through update.
Core scenarios
1. Book a schedule
Read calendar-create, and execute according to the "schedule booking workflow" in it (information completion → participant resolution → time negotiation/free-busy check → execute creation → result feedback).
2. View/search schedules
| Scenario | Reference document |
|---|---|
| General query ("what's on today") | calendar-agenda |
| Has keywords ("when is the project review") | calendar-search |
Needs details (only got schedule_id when completing fields) |
calendar-agenda |
Browse vs search: if there is aschedule subject keyword → search (do not ask follow-up questions about time);only time/date given without a subject keyword → list browse (
list), do not treat the date askeywordsand feed it tosearch. List browse already returnsrepeat_rule, so there is no need to additionally read a single detail to determine whether it is a recurring schedule.
Query disambiguation (for fuzzy queries, query both schedules + meetings) [REQUIRED]: In query scenarios, it is strictly prohibited to ask in text whether it is a schedule or a meeting—disambiguation follow-up questions for schedules/meetings are only for creation; during queries, always handle directly according to the following rules without asking follow-up questions.The determination has two independent dimensions; do not conflate them:
Dimension one: which side to query (schedule / meeting / both)
- Clearly an online meeting → When the user explicitly mentions online-meeting-specific features such as "online meeting / video conference / join link / meeting number / Tencent Meeting / remote attendance", switch to
读取 wecomcli-meeting 技能query only meetings.- clearly a schedule / arrangement → When what the user says is clearly schedule-type content (such as "schedule / arrangement / my arrangements / calendar / what's on today", and does not carry online-meeting features), query only the schedule.
- ambiguous wording cannot be determined("meeting / xx meeting / xx conference / have a meeting / what meetings are coming up recently / what meetings are there / find xx meeting", etc., which could be either a schedule or a meeting) → query both schedule and meeting: query both the schedule and
读取 wecomcli-meeting 技能query meetings.Dimension two: for each side use
searchorlist(independent of dimension one, judged separately for each side)
- has a topic/name keyword(such as "find xx meeting" "when is the project review") → for that side use
search(pass the keyword intokeywords)。- only time/date or general browsing with no keyword(such as "what meetings are coming up recently" "what's on today") → for that side use
list, and it is forbidden to treat the date askeywordsand feed it tosearch。- Even if "query both sides", still choose separately for each side according to this dimension: when there is a keyword, use
searchfor both sides; for pure time/general browsing, uselist。merge display: when querying both sides, merge the results and display them uniformly—split into two parts, "(Meeting)" (from the meeting side, or schedules where
meeting.meeting_codeis non-empty) and "(Schedule)" (meeting_codepure schedules that are empty), based on whether they contain an online meeting link; when the same meeting appears on both sides, deduplicate by "topic + time" and keep only one entry, and at the end summarize "N total, of which X meetings and Y schedules".
- This disambiguation applies only to queries; for creation scenarios still follow the above "schedule vs meeting" and ask with text.
3. Cancel schedule
First locate the schedule (withschedule topic keyworduse search; if only time/date is given without a topic keyword, use list browsing list, and it is forbidden to treat the date as keywords and feed it to search), then determine whether it is a recurring schedule (you can directly read the repeat_rulereturned by the list without additionally reading a single detail)—recurring schedules do not support cancellation, inform the user and guide them to operate in the WeCom client (see "Known limitations"). For ordinary schedulesdo not preemptively block cancellation based on "whether it was created by the user", directly execute the cancellation and determine whether it can be canceled according to the tool's return result (success returns {}, if there is no permission an error is returned, in which case inform the user and suggest contacting the creator).If the user's intent is actually "reschedule / move to / postpone" (even if it contains the word "cancel"), follow the above "Before rescheduling / rebuilding a schedule, you must first identify the meeting association" and go through the update process. For the complete process see calendar-cancel。
4. Update schedule
- First locate the schedule (withschedule topic keyworduse search; if only time/date is given without a topic keyword, use list browsing
list, and it is forbidden to treat the date askeywordsand feed it tosearch), determine whether it is a recurring schedule—recurring schedules do not support update,notify the user and guide them to operate in the WeCom client (see "Known Limitations"); do not, schedule by schedule,updatepiece together or switch to cancel-and-recreate. For ordinary schedules, collect the modification details and then perform an update,do not preemptively block modifications based on "whether it was created by the user themselves",and directly perform the update and determine whether modification is possible based on the tool's returned result (on success, return the updateddetail;if there is no permission, return an error, in which case notify the user and suggest contacting the creator). - Changing the time/changing the location/adding or removing attendees/switching meeting rooms all go through update; do not cancel and recreate. When switching meeting rooms, you must first use
rooms searchto confirm that the new meeting roomstatus=bookablethen pass the newmeeting_room_idinto the update (see calendar-meeting-room)。 - For schedules containing an online meeting link (in the location result,
meetingis non-empty), changing the time is not part of this skill's update;you must use读取 wecomcli-meeting 技能(see "Before rescheduling / recreating a schedule, you must first identify the meeting association" above). - For the complete process for updating a schedule, see calendar-update。
5. Query busy/free / common availability
Query the available free time slots of participants in a specified period (the server has already merged intervals, filtered out the past, and recommended according to policy), used to coordinate schedule times. See details in calendar-freebusy。
Core Concepts
- Schedule: A single event in the schedule system, including attributes such as subject, start and end times, and participants.
- All-day schedule (All-day):
is_all_day=true, occupies by date only, and the end date is included in the schedule. - Recurring schedule (Recurring):
repeat_rule.is_repeat=true, appears repeatedly according to a rule. - Attendee: identified by the
userid(woprefix). When the user provides a name, resolve it through读取 wecomcli-contact 技能touserid。 - FreeBusy: Query whether participants have schedule occupancy in a specified period.
- Location: A schedule's location is a piece of free text (the
locationfield). When the location given by the user is acompany meeting room, it must be booked through a meeting room query (rooms search) and occupied asmeeting_room_id(see calendar-meeting-room). Do not merely write the meeting room name intolocation;only when what the user provides isordinary text location that is not a meeting roomshould it be written directly intolocation。 - Meeting Room / Building: A physical space resource (unrelated to online meeting links).
buildings listto query accessible office buildings,rooms searchto query meeting room bookability; when creating a schedule, passmeeting_room_idfor atomic occupation, and when updating a schedule, passmeeting_room_idto change the booking. See details in calendar-meeting-room。 - Timezone: each schedule carries
timezone(timezone_id+timezone_offset). A schedule'sbegin_time/end_timeis thewall-clock timein that timezone, and the backend does not perform conversion — both the time strings passed in and returned are interpreted according to the schedule timezone; do not convert them yourself to UTC+8 or local time.
Core Rules
Rule 1: obtain userid [CRITICAL]
attendees/add_attendees/remove_attendees/userids/has_attendeesand all input parameters such as "member userid list"are uniformly object arrays, in the format[{"userid": "woxxx"}, {"userid": "woyyy"}], and names or flat string arrays are not accepted.organizer(Search by organizer) is a single value; pass a userid string (woprefix), not an array.- When the user provides a name, resolve it to the corresponding userid via
读取 wecomcli-contact 技能; when there are multiple candidates, list them for the user to choose, and do not guess on your own. - Do notconcatenate a name as a userid, anddo notfabricate a userid from memory or guesswork.
- Reason: the calendar API does not support matching participants by name; passing a name will cause a silent failure or invite the wrong person.
Rule 2: Write operations execute directly
- When creating or canceling a calendar event, once the parameters are ready, execute directly without showing the user a summary or asking for confirmation.
- When returning results,do not expose the userid; only show the person's name.
- Reason: the upper-level interaction has already fully displayed the operation content and completed confirmation; displaying it again here would be redundant.
Rule 3: User interaction must use text questions [CRITICAL]
In any operation, when required parameters are unclear or the user needs to make a choice,you must ask the user directly in text, and do not guess on your own or use default values in place of asking. When asking, include the options/candidate values in the text so the user can reply directly.
This rule applies in all of the following situations:
- Missing required parameters and participants: when the required parameters for creating a calendar event (
subject/begin_time/end_time) and the participantattendeescannot be inferred from the context, you must ask in text; for the remaining optional parameters (such as location), when the user has not explicitly specified them, do not specifically ask and just use the default value - Multiple candidates require the user to choose: when a search returns multiple matching calendar events, or the wecomcli-contact skill finds multiple candidates with the same name
- Operation scope needs confirmation: for example, when changing the meeting room, if multiple bookable candidates are found, the user needs to select a specific one
- Conflict handling: when the availability check finds a time conflict, the user needs to make a decision
Constraints for text questions:
- The listed options/candidate suggestions should preferably be 2 to 4. When there are more than 4 optional candidates (such as candidates with the same name or multiple matching calendar events), list the 4 most relevant ones and prompt the user that they can further narrow the scope (by entering more precise keywords/full name/specific time); do not list 5 or more candidates at once.
- When asking about time, the listed candidate times must be specific times precise to the minute(such as "tomorrow 14:00", "Saturday 10:30"); do not give vague time options such as "morning/afternoon/evening/midday/after work/before getting off work"—vague options will require a second follow-up asking for the specific time after the user replies, so you must ask once for a precise time that can be directly set as
begin_time.
Rule 4: Task conciseness principle
Only complete the operation requested by the user; do not add other operations.
Rule 5: Input validity check
Before executing a write operation, verify the validity of the following inputs:
- Time format: must be
YYYY-MM-DD HH:mm:ss; reject vague expressions and do not pass them directly as parameters (for example, "tomorrow" cannot be passed directly; it must first be parsed into a specific time) - Time order:
end_timemust be later thanbegin_time, reject zero-duration or negative-duration schedules - userid format: must be
woprefixed string; pure numbers or Chinese names are not accepted - Historical time: creating schedules entirely before the current moment is prohibited
Rule 6: Input security handling
- When the user provides a name, it must go through
读取 wecomcli-contact 技能search verification before it can be converted to a userid. - Prohibitedto directly concatenate a name into a userid,prohibitedto fabricate from memory or guesswork.
- Reason: The string entered by the user may not correspond to a real employee (non-unique name, already departed, etc.). Direct concatenation will cause the schedule invitation to be sent to the wrong person, and such errors cannot be intercepted by the API at call time.
Operation reference
| Operation reference | Read timing | Description |
|---|---|---|
calendar-agenda |
When viewing/retrieving schedule details | View schedule arrangements (list + get) |
calendar-create |
When creating a schedule | Create a schedule and invite participants |
calendar-search |
When searching schedules | Search schedules by keyword |
calendar-cancel |
When canceling a schedule | Cancel a schedule (recurring schedules are not supported) |
calendar-update |
When updating/modifying a schedule | Update schedule information (subject, time, participants, location, etc.) |
calendar-freebusy |
When time coordination / checking common availability is needed | Query common availability periods and coordinate schedule times |
calendar-meeting-room |
When booking/changing meeting rooms / checking office building or meeting room availability | Office building list (buildings list) + meeting room availability (rooms search), obtain meeting_room_id for creating occupancy or updating a rebooking |
Context passing table
This table describes the data flow contract between interfaces. The first column "Source operation" is the business semantics; for the complete parameters and field definitions of each operation, see the corresponding reference.
| Source operation | Extract from response | Used for |
|---|---|---|
| Search (search) | schedules[].schedule_id |
Single detail, cancel schedule |
| List browsing / single detail (list / get) | schedule_list[].schedule_id |
Single detail, cancel schedule |
| Search (search) | schedules[].attendees[].name |
Directly display participant names, no extra reverse lookup needed (already returned by the search interface) |
| Search (search) | schedules[].creator_name |
Directly display the schedule creator's name |
| Search (search) | next_cursor + has_more |
Pagination control |
| wecomcli-contact skill search | userid(wo prefix) |
For creating/updating a schedule's attendees / add_attendees / remove_attendees, for availability query's userids, for search's has_attendees(all assembled as an object array [{"userid": "woxxx"}]); for search's organizer it is a single-value userid string |
| Search / list browsing / single detail | repeat_rule |
Determine whether it is a recurring schedule (is_repeat=true): when matched, neither cancel nor update is supported; inform the user and guide them to operate in the WeCom client;search/list are all returned directly, no need to supplement get |
| Search / list browsing / single detail | meeting.meeting_code |
Identify whether the schedule contains an online meeting link (non-empty means a "meeting-type schedule", and search/list/get all return it directly, with no additional need to supplement get); when rescheduling / canceling a schedule that contains a meeting link, directly pass meeting.meeting_id into wecomcli-meeting 's meeting update / meeting cancel, with no need to search again in wecomcli-meeting to locate it |
| Search / list browsing + single detail | For search use schedules[].schedule_id; for list/detail use schedule_list[].schedule_id and schedule_list[].repeat_rule |
Locating the schedule for update and determining whether it is a recurring schedule (if it is a recurring schedule, updates are not supported) |
| Availability query | slots[](including available_users、available_count、busy_users) |
Directly display recommended time slots, pick the first few for the user to choose from; when displaying, use only names, and pass back userid only in the schedule creation attendees |
Meeting room availability query (rooms search) |
target[].room.meeting_room_id or recommendations[].meeting_room_id |
the schedule creation meeting_room_id(atomically occupy the meeting room), the schedule update meeting_room_id(rebook the meeting room); IDs flow only through the toolchain and must not be displayed, and only the meeting room name is exposed to users |
Error handling
Principle: tell the userwhat went wrong + what can be done + alternative options. Silent failures are prohibited.
| Scenario | Recovery suggestion |
|---|---|
| Search returns no results | Provide recovery suggestions in text: 1. Change the keywords and retry; 2. Search by organizer (provide the name, resolve the userid, then pass organizer); 3. Search by participant (provide the name, resolve the userid, then pass has_attendees); |
| Multiple contact candidates | List the candidates in text (name + department) for selection |
| wecomcli-contact skill search returns no results | Prompt the user in text to confirm the name and wait for re-entry |
| Canceling/modifying a schedule not created by the current user | Do not block in advance; execute the command directly; if a permission error is returned, explain that the current user is not authorized to operate and suggest contacting the creator |
Common availability query returns empty slots |
Guide the user to expand the time window or reduce participants; do not retry repeatedly within the same window |
Common availability query degraded (available_count < total_count) |
Inform which people have conflicts and how many can attend, and let the user decide whether to schedule according to the degraded time slot or change the time |
Output quality standards
A good output should meet the following conditions:
- Schedule list: sort ascending by start time, and output each schedule as an independent item in order (markdown tables are prohibited); each item contains only the subject, time, and participants; if there are more than 10 items, display only the first 10
- Participant display: use the
attendees[].namefield returned by the interface as-is (keep it completely consistent with the format returned by the interface, e.g. if it returnszhangsan(张三)then displayzhangsan(张三)), and do not display userid - Operation result: clearly inform success/failure and the reason; after a successful operation, display a schedule summary
- Error message: include problem description + recovery suggestion + alternative options, and do not expose technical error codes
Unacceptable output:
- Directly displaying userid instead of name
- Fail silently when an error occurs, without giving the user any prompt
- Display the internal schedule_id
Output format specification
Participant name format [REQUIRED]: In all scenarios where participants are displayed (creation feedback, single summary, list, etc.), names must alwaysuse the attendees[].name field returned by the API as-is, fully consistent with the format returned by the API (e.g., if it returns zhangsan(张三) , display zhangsan(张三)); in the templates below, {人名} all refer to that as-is name.
Time year display [REQUIRED]: The "time" line below omits the year by default and only goes to month and day (in the template, {月日} refers to M月D日); only when the schedule year differs from the current year (cross-year) is the year added before the month and day, in the format {YYYY}年M月D日 {HH:mm}-{HH:mm}。
Relative date label [REQUIRED]: When the schedule date is yesterday / today / tomorrow, the "time" line adds the relative word before the month and day, in the format {昨天|今天|明天} M月D日 {HH:mm}-{HH:mm}(e.g., 时间:明天 6月11日 14:00-15:00); all other dates are displayed as {月日} {HH:mm}-{HH:mm} .
Creation success feedback [REQUIRED]: After successfully creating a schedule, the output content includes only three parts: subject, time, and participants. Outputting any other content and additional statements is prohibited (do not display fields such as location, reminder, schedule_id, etc., and do not append explanations, suggestions, or pleasantries):
主题:{subject}
时间:{月日} {HH:mm}-{HH:mm}
参与人:{人名1}、{人名2}
Single schedule summary(used for viewing/searching a single scenario, not creation feedback):
主题:{subject}
时间:{月日} {HH:mm}-{HH:mm}
参与人:{人名1}、{人名2}
Schedule list display specification [REQUIRED](applicable to both list/search browsing):
- Do not use markdown tables; output each schedule as an independent entry in order, sorted by start time ascending.
- Each entry displays only three items: subject, time, and participants(do not display location, reminder, schedule_id, etc.).
- When there are more than 10, display only the first 10, and state at the end: "There are N more, do you need to view more?".
- Meetings / schedules are displayed in two parts: The criterion is whether the schedule has a meeting link —
meeting.meeting_codeif it has a value (non-empty), classify it as "Meeting"; if empty / absent, classify it as "Schedule" (search/list/getresponses all include themeetingfield, so it can be determined directly).Only when both "Meeting" and "Schedule" categories exist in this result, split the results into two sections, "(Meetings)" and "(Schedules)", and display them separately: list the "(Meetings)" section first, then the "(Schedules)" section; within each section, sort by start time ascending and display only subject/time/participants for each entry; at the end append the summary "Total N, including X meetings and Y schedules".When the result has only a single category(all meetings or all schedules), do not split into sections and do not add "(Meetings)"/"(Schedules)" headings; display it directly as an ordinary list. - Sectioned format:
(会议)
1. {主题}
时间:{月日} {HH:mm}-{HH:mm}
参与人:{人名1}、{人名2}
(日程)
1. {主题}
时间:{月日} {HH:mm}-{HH:mm}
参与人:{人名1}、{人名2}
Time zone annotation [REQUIRED]: When the schedule timezone_offset != 28800(non-UTC+8), the displayed time must include the time zone annotation, in the format {HH:mm}-{HH:mm}({地区中文名} UTC±N), e.g., 14:00-15:00(纽约时间 UTC-5)。
UTC±Nis derived fromtimezone_offset / 3600.- The Chinese region name is derived from
timezone_id(e.g.,America/New_York→ New York time);timezone_idWhen empty, omit the Chinese name and keep only(UTC-5)。 - UTC+8 (
timezone_offset = 28800, includingAsia/Shanghai、Asia/Singapore, etc.) is not labeled; keep the current state. - Applies to the "time" line of a single summary, schedule lists, and creation/update success feedback; freebusy's
slotsdoes not apply (displayed in the user's own time zone).
Known limitations
| Limitation | Alternative |
|---|---|
| schedules list query window ≤ 30 days before and after | begin_time/end_time must fall within the window of "30 days before and after the current moment"; the server does not return results outside this range. When it is out of range, directly tell the user that it exceeds the queryable range and ask them to provide a shorter time range again; call it again only after the user provides a new one |
| Creating/updating/canceling recurring (repeating) schedules is not supported | When the user wants to create a recurring schedule such as "repeat weekly/monthly/daily", or initiates an update or cancellation for a schedule already identified as recurring (repeat_rule.is_repeat=true), directly tell the user that this is currently not supported and guide the user to operate manually in the WeCom client; it is prohibited to work around this by creating multiple one-off schedules, assembling them session by session with update , rebuilding withcancel+create , passing in undisclosed parameters, or other such methods |
| Replying to / declining schedule invitations (RSVP) is not supported | This skill does not support replying to received schedule invitations with accept / decline / tentative, etc. (including "decline this schedule", "not attending", "politely decline the invitation", etc.). When the user has this need, tell them that this skill does not support it, and suggest operating directly on the schedule invitation in the WeCom client, or notifying the schedule organizer via message |
| Common availability query limitations | For recurring schedules, only those modified in the last two months are checked; a single query window ≤ 24h, and anything beyond must be batched;begin_time The part earlier than the server's current moment will be automatically truncated; passing a purely historical window will return empty slots |