MCP App Store
by KeenEthics
Business & Operations
Workleap AI icon

Workleap AI

by Workleap

Overview

Ask plain-language questions about your team and organization—answered with data from your Workleap account. Instead of navigating dashboards, ask things like "What's our engagement score this month?", "Who is the new hire on my team?", or "Show me my recent recognition" and get a concise, visual answer. What it covers: - Engagement scores, eNPS, and participation trends—for your team or the whole org - Employee profiles, hire dates, and reporting relationships - Recognition cards you've sent and received - Team structures and org context, so references like "my direct reports" resolve automatically Built for managers and HR teams who want faster access to the signals already in Workleap, without switching tools.

Tools

analyze_engagement

ChatGPT
Analyze employee engagement scores and recognition metrics for a team or organization. Retrieves quantitative survey data from Workleap Officevibe — pulse survey metrics (engagement score, eNPS, participation rate) and recognition activity — then produces a written analysis with actionable insights and citations back to the source data. Do NOT use this tool when the user wants to read specific employee comments, suggestions, or verbatim survey text — use analyze_feedback instead. This tool is for numeric scores, ratings, and aggregate trends, not individual written responses. Supports filtering by team name, manager, parent team, or subteams. Defaults to the authenticated user's primary managed team when no filter is specified. Use this tool when the user asks about engagement scores, eNPS, participation rates, or recognition trends. Particularly well-suited for: - Manager check-ins: understanding engagement score and trend for a team - HR or leadership reviews: company-wide or cross-team engagement metrics - Identifying areas for improvement based on low-scoring survey dimensions - Tracking engagement changes over a custom date range Returns: answer: A written analysis of the team's engagement metrics and trends. Present this directly to the user. sources: The data points cited in the analysis (survey results, scores) with title and URL. Render as citations below the answer. On error: Ask the user to verify the team or manager name and retry once. If it fails again, inform the user the engagement data is temporarily unavailable. Do not fabricate scores or engagement numbers.

analyze_feedback

ChatGPT
Analyze employee feedback from Officevibe pulse surveys and suggestion box. Retrieves qualitative text feedback submitted by employees through Officevibe — including survey responses, suggestions, and smart questions — then produces a written analysis that identifies urgent items, recurring themes, sentiment trends, and concrete recommended actions for the manager. Do NOT use this tool for numeric engagement scores, eNPS, or participation metrics — use analyze_engagement instead. This tool is for qualitative content: what employees are writing and saying, not how they rate numerically. Supports filtering by team name, manager, parent team, or subteams. Defaults to the authenticated user's primary managed team when no filter is specified. Individual contributors may not have access to feedback; this tool is primarily useful for managers and executives. Use this tool when the user asks what employees are saying, wants to surface specific feedback, or needs to understand qualitative themes. Particularly well-suited for: - Surfacing unread or unreplied feedback that needs a response - Understanding recurring themes around recognition, wellness, or alignment - Preparing for 1-on-1s or team retrospectives with qualitative context - Comparing feedback themes across teams or time periods - Identifying employee concerns or suggestions at the org level Returns: answer: A written analysis of the feedback themes and key items. Present this directly to the user. sources: The individual feedback items cited in the analysis with title and URL. Render as citations below the answer. On error: Ask the user to verify the team or manager name and retry once. If it fails again, inform the user that feedback data is temporarily unavailable. Do not fabricate feedback or attribute comments to employees.

archive_goal

ChatGPT
Set whether one Workleap Performance goal (or OKR) is archived. Archiving retires a goal the user no longer tracks — an abandoned, superseded, or finished objective — and removes it from the active goals. It is reversible: unarchiving brings the goal back. Set action to "archive" to retire a goal, or "unarchive" to restore one. Get the goal id from search_goals or get_goal; to find a goal to restore, search with publication_states ["Archived"]. Examples: - Archive my old Q1 hiring goal {"goal_id": "<goal-id>", "action": "archive"} - We dropped that OKR, retire it {"goal_id": "<goal-id>", "action": "archive"} - Bring back the goal I archived last week {"goal_id": "<goal-id>", "action": "unarchive"}

create_action_item

ChatGPT
Add an action item (a to-do, task, or follow-up) to each assignee's action items list, and return its id. This is a WRITE operation. Call it only when the user has explicitly asked to track something — "add X to my action items", "remind me to X", or "create a task for Bob to Z". The item lands on each assignee's list right away, with status To do. Set status to Suggestion for work you propose that the user has not accepted yet. Each call creates a new item; to change one that already exists, use update_action_item. Examples: - Add "send the Q3 deck to finance" to my action items {"title": "Send the Q3 deck to finance"} - Remind me to follow up with Alice about the budget on September 22 {"title": "Follow up with Alice about the budget", "due_date": "2026-09-22"} - Create a task for Bob to review the onboarding doc by September 25 {"title": "Review the onboarding doc", "due_date": "2026-09-25", "assignee_ids": ["<bob-id>"]} - In my 1:1 with Ada she said she would post the designer req {"title": "Post the designer req", "assignee_ids": ["<ada-id>"], "status": "Suggestion", "meeting_id": "<meeting-id>"} - For the plan you just saved, give Ada the security training in its first phase {"title": "Complete the security training", "assignee_ids": ["<ada-id>"], "plan_id": "<plan-id>", "phase_id": "<phase-id>"} - Track the reply Ada is waiting for in this Slack message {"title": "Reply to Ada about the offer", "source_url": "https://acme.slack.com/archives/C0123456789/p1700000000000100"}

create_calendar_event

ChatGPT
Create a calendar event on the current user's connected calendar, either for them alone or with colleagues invited. Use this when the user wants to schedule, book, set up, organize, block time, or put something on the calendar — for example "schedule a 1:1 with Alex tomorrow at 2pm", "book a 30-minute sync with Sam and Priya on Thursday", "set up a weekly one-on-one with Jordan", "add a meeting with my manager to my calendar next Monday", "invite Chris to a check-in", "block two hours Friday morning for focus time", or "put a reminder to prepare my review on my calendar". Requires calendar_integration_type, and never guess it. A calendar search tool is offered only for a provider the user has connected, so when you have one it answers the question: - Outlook Calendar search only: use "outlook". - Google Calendar search only: use "google". - Both: ask the user which calendar to schedule on, and remember the answer with update_user_memory if you have it, so later events don't ask again. Having no calendar search tool proves nothing — on some surfaces they are simply not offered. Ask the user which calendar they use rather than assuming none is connected. If they genuinely have none, they must connect one before this tool can succeed: use request_integration_connection if you have it, otherwise tell them to connect a calendar in their Workleap settings. Supports one-time and recurring events (daily, weekly, monthly, yearly, including patterns like "every second Tuesday" or "the third Thursday of each month"), an optional agenda, an optional physical location, and an online meeting link (Teams or Google Meet) which is attached by default. Recurrence anchors are never guessed from the start date — weekly needs its days of the week, and monthly or yearly needs either a day of the month, or a week index plus one weekday. This tool creates events. To look up when an existing one-on-one is scheduled, use the closest one-on-one calendar events tool instead. Attendees are optional, and each one is given as a name or as a member id in the same attendees list; if a name is unknown or matches several people, nothing is created and you are told which names need clarifying. Omit attendees to put the event on the user's own calendar with nobody invited — that is the right shape for focus time, a personal reminder, or preparation time. Only omit it when the user asked for something for themselves: if they named a person, that person must be passed, because an event with no attendees sends no invitation and the colleague would never hear about it. On success you are given a link to the event on the web. Pass it on to the user so they can open it. Examples: - Schedule a 1:1 with Alex tomorrow at 2pm {"calendar_integration_type": "outlook", "attendees": ["Alex"], "subject": "1:1", "start": "2026-07-29T14:00:00", "end": "2026-07-29T14:30:00"} - Set up a weekly one-on-one with Jordan on Tuesdays {"calendar_integration_type": "outlook", "attendees": ["Jordan"], "subject": "Weekly 1:1", "start": "2026-07-28T10:00:00", "end": "2026-07-28T10:30:00", "recurrence": {"frequency": "weekly", "interval": 1, "days_of_week": ["tuesday"]}} - Book a 1h in-person sync with a colleague whose id you already have {"calendar_integration_type": "google", "attendees": ["b6b816ac-4b39-4047-9f22-27463f4fa98b"], "subject": "Sync", "start": "2026-07-30T09:00:00", "end": "2026-07-30T10:00:00", "is_online_event": false, "location": "Room 3"} - Invite Sam, plus a colleague whose id an earlier result returned {"calendar_integration_type": "outlook", "attendees": ["Sam", "b6b816ac-4b39-4047-9f22-27463f4fa98b"], "subject": "Design review", "start": "2026-08-04T13:00:00", "end": "2026-08-04T14:00:00"} - Monthly review on the third Thursday, 6 times {"calendar_integration_type": "outlook", "attendees": ["Sam"], "subject": "Monthly review", "start": "2026-08-20T15:00:00", "end": "2026-08-20T16:00:00", "recurrence": {"frequency": "monthly", "interval": 1, "week_index": "third", "days_of_week": ["thursday"], "number_of_occurrences": 6}} - Block Friday morning for f…

create_goal

ChatGPT
Create a new Workleap Performance goal (or OKR) as an empty draft, and return its id. This is a WRITE operation. Call it only when the user has explicitly asked to create a goal. What this creates is a DRAFT SHELL, not a finished goal. It accepts only an owner and contributors — there is no title, description, date, or measurement parameter here, because the Performance API sets those separately. The returned goal has no title yet and is visible to nobody but its owner and contributors, so do not describe it to the user as ready or live. Before it can be published it needs a title, an owner, a start date, and an end date (plus a measurement if it tracks progress through measurements): collect these from the user and set them with update_goal. Owner and contributor ids are permission-scoped: the user may only assign a goal to a subset of the organization, so an id taken from a general member directory can be rejected on save. Contributors exist only on a Team goal. Each call creates a new draft. Calling again does not replace or retry a previous one; it leaves the earlier draft behind. Examples: - Create a goal for me {"owner_id": "<my-member-id>"} - Create a goal owned by Alice with Bob contributing {"owner_id": "<alice-id>", "contributors": [{"contributor_id": "<bob-id>", "type": "Member"}]} - Create a team goal for the design team {"owner_id": "<owner-id>", "contributors": [{"contributor_id": "<design-team-id>", "type": "Team"}]}

create_plan

ChatGPT
Create a new Workleap Performance plan as a draft, and return its id and its phases' ids. A plan is a structured onboarding, offboarding, performance improvement (PIP), career growth (development plan), or custom plan for one member. This is a WRITE operation. Call it only when the user has explicitly asked to create a plan, and call it once per plan — each call creates a new draft, so never call it again to change a plan you already created. Use update_plan to change it instead. Every field is optional: pass what the user has already said and leave the rest unset, then fill in the rest with update_plan as the user tells you more. The plan is always saved as a DRAFT. This tool cannot activate a plan or submit it for approval; the user does that themselves from the plan page. Examples: - Start an onboarding plan for Alice {"plan_type": "Onboarding", "assignee_id": "<alice-id>"} - Create a career growth plan for me called "Path to senior" {"plan_type": "CareerGrowth", "title": "Path to senior", "assignee_id": "<my-member-id>"} - Draft an onboarding plan for Bob starting 2026-11-02 with a first week and a first month phase {"plan_type": "Onboarding", "assignee_id": "<bob-id>", "start_date": "2026-11-02", "phase_titles": ["First week", "First month"]}

delete_action_item

ChatGPT
Permanently delete an action item for every assignee; this cannot be undone. Confirm the item with the user first if there is any doubt about which one they mean. Deleting a draft is also how to dismiss one the user does not want to keep. Examples: - Delete my "send the deck" to-do (id from search_action_items) {"action_item_id": "<id>"}

delete_calendar_event

ChatGPT
Remove an event from the current user's connected calendar. Use this when the user wants to cancel, delete, remove, call off, drop, scrap, or take off my calendar something already on their calendar — for example "cancel my 1:1 with Alex tomorrow", "delete the Thursday sync", "remove the design review from my calendar", or "call off this week's standup". How far the removal reaches depends on the user's role on the event, and you cannot choose it. On an event the user organizes, the meeting is cancelled for every attendee and they are all notified. On an event the user was only invited to, only their own copy goes and the meeting carries on for everyone else. The result says which of the two happened, so report the outcome from it rather than promising a cancellation you may not be able to deliver. This tool removes the event rather than changing it. To change an event's time, title, agenda, location or invite list while keeping it, use the update calendar event tool instead — rescheduling is not a delete followed by a create, and treating it as one loses the event's agenda and history. Requires the event's id, which comes from a tool that read the event. Never invent or guess an id: a wrong id permanently deletes a different meeting and notifies its attendees. If you don't have one, read the event first. Deleting cannot be undone. Recreating the event afterwards makes a new meeting, and anything the user did not tell you — the agenda, the full invite list, the meeting link — is lost. The id you send sets how many meetings go, independently of the role above. An occurrence id removes that one meeting and leaves the rest of the series in place; a series id removes every occurrence of it. "I can't make Thursday" is one occurrence, not the series, so establish which the user wants before writing. The closest one-on-one calendar events tool tells you which you hold. When it reports a series id alongside the occurrence id, ask the user whether they mean this one meeting or all of them, and send the id matching their answer. When it reports no series id, no id available to you is known to cancel only one meeting — say that the cancellation may take every occurrence with it and get the user's explicit agreement first, rather than promising a single-meeting cancel you cannot guarantee. Examples: - Cancel my 1:1 with Alex tomorrow {"calendar_event_id": "AAMkAD...", "calendar_integration_type": "outlook"} - Delete the Thursday design review {"calendar_event_id": "abc123", "calendar_integration_type": "google"} - The user confirmed they want Monday's standup gone, not moved {"calendar_event_id": "AAMkAD...", "calendar_integration_type": "outlook"} - "I can't make Thursday" — ambiguous. Ask whether to move it or cancel it before calling anything.

get_calendar_busy_periods

ChatGPT
Look up when colleagues are busy on their calendars over a specific time window. Returns every busy period per requested member between start_time and end_time, so you can answer scheduling and availability questions: "when is Alex busy next week?", "is Sam free Thursday afternoon?", "find a time that works for Priya and Jordan", "how booked is my team this week?", "does Chris have any openings Friday?", "when can we book a meeting with Dana?". Reports busy time — it does not compute free slots. Gaps between the returned periods are candidate openings, not confirmed availability. Set include_current_user to true when the user's own calendar matters ("am I free…", "a time for me and…"). Each busy period carries its meeting subject when that person's calendar shares it with the user, so this also answers "what is Alex in right now?" or "what's booking Priya's Thursday?". A period with no subject means the calendar withheld it — report it as not shared rather than guessing. For the timing of a specific recurring one-on-one ("when is my next 1:1 with Alex?", "when was my last one-on-one?"), use the closest one-on-one calendar events tool instead — this tool returns busy blocks and their subjects, not a meeting's attendees or agenda. Pass start_time and end_time whenever the request implies a window ("Thursday afternoon", "next week"), using the user's own UTC offset. Omit both only when the request implies none ("when is Alex busy?"). Either way the result states the window it read and whether it was defaulted, so relay that window in your answer. Identify each member in members, by name or by the member id an earlier result gave you — ids skip the name lookup and cannot match the wrong member, and the two can be mixed in one list. When a name matches several members, the result lists the candidates and which one it used. Relay that assumption or ask the user, then re-run with the right id in members. Examples: - When is Alex busy next week? {"members": ["Alex"], "start_time": "2026-08-03T00:00:00-04:00", "end_time": "2026-08-08T00:00:00-04:00"} - Is Sam free Thursday afternoon? {"members": ["Sam"], "start_time": "2026-07-30T12:00:00-04:00", "end_time": "2026-07-30T18:00:00-04:00"} - Find a time for me, Priya and Jordan this week {"members": ["Priya", "Jordan"], "start_time": "2026-07-28T00:00:00-04:00", "end_time": "2026-08-01T00:00:00-04:00", "include_current_user": true} - Am I free tomorrow morning? {"members": [], "start_time": "2026-07-29T08:00:00-04:00", "end_time": "2026-07-29T12:00:00-04:00", "include_current_user": true} - When is that member busy, after an earlier result returned their id? {"members": ["429c3661-cd70-4d3c-bd6f-b8204bdd1016"], "start_time": "2026-08-03T00:00:00-04:00", "end_time": "2026-08-08T00:00:00-04:00"} - Are Alex and the member whose id you already have free Friday? {"members": ["Alex", "429c3661-cd70-4d3c-bd6f-b8204bdd1016"], "start_time": "2026-08-07T09:00:00-04:00", "end_time": "2026-08-07T17:00:00-04:00"} - When is Alex busy? (no window named) {"members": ["Alex"]}

get_closest_one_on_one_calendar_events

ChatGPT
Find the closest one-on-one calendar event between the current user and one or more colleagues. For each requested person, returns either the next upcoming or the most recent past one-on-one (1:1) calendar event shared with the current user, depending on the requested direction. Use this when the user asks things like "when is my next 1:1 with Alex?", "when was my last one-on-one with my manager?", "do I have a one-on-one coming up with Sam this week?", or "when's my next 1on1". A one-on-one (also written "1:1", "1-on-1", "1on1", "one on one") is a recurring private meeting between two people. This tool answers timing questions about those meetings — not their agenda or notes (use the one-on-one agendas tool for content). Identify each person in attendees, by name or by the member id an earlier result gave you — ids skip the name lookup and cannot match the wrong member, and the two can be mixed in one list. At least one person is required. When a name matches several members, the result lists the candidates and which one it used. Relay that assumption or ask the user, then re-run with the right id in attendees. The result also says whether each event repeats, and usually gives the id of the whole series alongside the id of that single occurrence — so a write can be aimed at one meeting or at every occurrence. Examples: - When is my next 1:1 with Alex? {"attendees": ["Alex"]} - When was my last one-on-one with Jordan? {"attendees": ["Jordan"], "direction": "previous"} - Do I have upcoming 1:1s with Sam and Priya? {"attendees": ["Sam", "Priya"], "direction": "next"} - My most recent 1on1 with my manager in the past month {"attendees": ["Chris"], "direction": "previous", "search_window_in_days": 30} - When is my next 1:1 with that member, after an earlier result returned their id? {"attendees": ["429c3661-cd70-4d3c-bd6f-b8204bdd1016"]} - Do I have 1:1s coming up with Sam and with the member whose id you already have? {"attendees": ["Sam", "429c3661-cd70-4d3c-bd6f-b8204bdd1016"]}

get_contributions

ChatGPT
Retrieve and summarize a Workleap user's contributions over a date range. Searches across workplace tools connected to the user's Workleap account — project trackers, wikis, communication platforms, and calendar systems — then produces a written summary grouped by project or topic, with citations back to the source artifacts. Do NOT use this tool for questions about how someone is feeling, their engagement score, or employee survey responses — use analyze_engagement or analyze_feedback instead. This tool covers work output only. Use this tool when the user asks what someone has worked on, shipped, accomplished, or contributed. Particularly well-suited for: - Performance reviews and self-assessments - Weekly or quarterly status summaries - Onboarding: understanding a new teammate's recent work - Manager check-ins on a direct report's output Returns: answer: A written summary of the person's contributions, grouped by project or topic. Present this directly to the user. sources: The source artifacts cited in the summary (issues, documents, messages) with title and URL. Render as citations below the answer. On error: Ask the user to verify the person's name or email and retry once. If it fails again, inform the user the data is temporarily unavailable. Do not fabricate contributions or guess at the person's work history.

get_engagement_scores

ChatGPT
Retrieve and display engagement scores from Workleap Officevibe as a visual dashboard. Shows pulse survey metrics (engagement score, eNPS, participation rate) and all 10 engagement dimensions for a team or organization. When to use: - Engagement scores, eNPS, or participation rates for a team - Comparing engagement across teams or managers - Identifying strongest and weakest engagement dimensions - Quick visual overview of team health metrics Do NOT use for written analysis with insights (use analyze_engagement). Do NOT use for survey feedback text (use analyze_feedback). Do NOT use for peer recognition / Good Vibes (use get_good_vibes). Output: Returns per-team data: overall engagement score, 10 metric dimension scores, eNPS with promoter/detractor/passive distribution, and participation rate. All scores are on a 0-10 scale. Variations show change from the period start (positive = improvement, negative = decline). Score interpretation: - 8-10: Excellent — team is thriving in this area - 7-8: Very good — healthy, minor room for improvement - 6-7: Good — solid but worth monitoring - 5-6: Okay — emerging area of concern - 3-5: Poor — needs attention and action - 0-3: Critical — urgent intervention recommended eNPS ranges from -100 to +100 (promoters % minus detractors %). Positive eNPS is generally good; above +30 is strong. Response guidance: This tool returns a visual dashboard UI. If you are rendering the UI element, keep your text response to a brief 1-2 sentence commentary highlighting what stands out — do not restate scores the user can already see in the dashboard. If you are not rendering the UI, synthesize the results into a detailed summary. Parameter guidance: - Omit team_search_filters to see all teams managed by the user (up to 25). - Use multiple filter entries to compare teams side-by-side. - Set organization_wide: true for company-wide aggregate scores. - manager_name accepts full names (e.g. "Alice Chen"). On error: ask the user to verify the team/manager name and retry once. Never fabricate engagement scores.

get_engagement_scores_by_audience

ChatGPT
Retrieve and display engagement scores from Workleap Officevibe as a visual dashboard. Scoped to an audience: everything the requesting user can access (default), or a named reporting manager's reports. Shows overall engagement with a company comparison, all metric dimensions (with sub-metrics), eNPS, and participation. Do NOT use for peer recognition / Good Vibes (use get_good_vibes). Response guidance: This tool returns a visual dashboard UI. If you are rendering the UI element, keep your text response to a brief 1-2 sentence commentary highlighting what stands out. If you are not rendering the UI, synthesize the results into a detailed summary. Parameter guidance: - Omit manager_name to see everything the user has access to (the default). - Set manager_name (full name) to scope to that manager's reports. - Set include_reporting_line: true to cover the manager's full reporting line. On error: ask the user to verify the manager name and retry once. Never fabricate scores.

get_goal

ChatGPT
Read one Workleap Performance goal (or OKR) in full detail by its id. Returns the goal in full: the complete contributor roster with member and team ids, every measurement (key result) with its own measurement id, weight and link, every sub-goal id and weight, the parent goal id, the publication state (Draft / Published / Archived), and the recent progress updates with their authors. Use this when the user asks about one specific goal in depth, or when a measurement id or a sub-goal id is needed — those are returned only here. It reads a goal by id and cannot look one up by title. Examples: - Tell me everything about this goal {"goal_id": "<goal-id>"} - What are the key results on this goal? {"goal_id": "<goal-id>"} - Is that goal still a draft? {"goal_id": "<goal-id>"}

get_good_vibes

ChatGPT
Retrieve and display Good Vibes (peer-to-peer recognition cards) from Workleap Officevibe. Shows recognition cards exchanged between employees — kudos, appreciation, and acknowledgements — rendered visually in the Good Vibes UI. When to use: - Recognition or kudos sent/received by a person or team - Who has or hasn't been recognized recently - Peer appreciation trends across a team or time period - Gathering recognition context for a performance review Do NOT use for engagement scores, eNPS, or participation (use analyze_engagement). Do NOT use for survey feedback or suggestion box text (use analyze_feedback). Parameter guidance: - received_by/sent_by accept full names (first + last). Use one at a time, not both. - team_search overrides all other filters — use it alone. - Cards are sorted newest-first. Max 250 per request; if the limit is hit, narrow the date range. - Recognition categories: Leadership, Team Player, Positivity, Excellence, Showing Up. On error: ask the user to verify the name/team and retry once. Never fabricate recognition data.

get_meeting_load_analysis

ChatGPT
Analyze team meeting load and focus time for the current work week (Monday to Friday) by examining calendar data. Calculates the percentage of working hours spent in meetings with multiple participants versus time available for focused work. Automatically retrieves calendar data for the current user and their team members, analyzes multi-participant meetings only, accounts for 15-minute meeting buffers, and presents results in a structured table format with health indicators and actionable recommendations. Returns comprehensive team meeting load metrics with individual member analysis, health indicators, and specific recommendations for optimizing team productivity and meeting culture. Invoke this function when users ask about team productivity, meeting efficiency, focus time availability, work-life balance, team health assessments, or meeting culture analysis. Examples: - "How is my team's meeting load this week?" - "Are we spending too much time in meetings?" - "Show me our team's productivity balance" - "Who might be overloaded with meetings?" - "What's our meeting culture like?" - "How much focus time does my team have?" - "Give me a team meeting load analysis" - "Which team members need meeting load support?"

get_officevibe_feedback_conversations

ChatGPT
Get feedback conversations from Officevibe for the current user and organization. This function retrieves the feedback conversations and their details. It will only return qualitative data and will not return quantitative metrics. If the user specifies a team or a date, you must use those parameters to filter the results correctly. This function can be called if the user is looking for feedback conversations regarding areas such as recognition, feedback, satisfaction, alignment, wellness, personal growth, and the quality of relationships with peers and managers. Managers should be able to find feedback through this function, as they can see their direct reports' feedback. Individual contributors will probably not find any feedback through this function, but they can still try to use it. You may not be able to figure out if someone is a manager from their job title, so you should still try to use this function if asked. For managers, if they say "my" feedback, they mean their direct reports' feedback. You can safely assume that "My feedback" means the feedback that the user has received, not the feedback they have given. Examples: - Summarize my feedbacks: {} - What should I do to address my latest officevibe feedback?: {} - Analyze feedback messages for the Engineering Team: {"team_name": "Engineering Team"} - Give the feedback for marketing: {"team_name": "Marketing"} - Get feedback since January 1st, 2024: {"from_date": "2024-01-01"} - What is the feedback trend for Marketing from March 2024: {"team_name": "Marketing", "from_date": "2024-03-01"} - What unread feedback do I have?: {} - Show me feedback related to vacation: {"search_terms": "vacation time off holiday break"}

get_officevibe_oneonone_agendas

ChatGPT
Get one-on-one meeting agendas from Officevibe for the current user and organization. This function retrieves both managed agendas (where the user is the manager) and team member agendas (where the user is the team member). Each agenda contains meeting details, blocks (sections and talking points), and action items. ALWAYS use this function when users ask about: - One-on-one meetings, 1:1s, or 1-on-1s - Meeting agendas, topics, or discussions with specific people - Action items from meetings - Summarizing meetings or 1:1s with anyone This includes queries mentioning specific people like "my 1:1s with @John Doe". If no date is specified, default to calculating the date from three months ago. This will not find Officevibe feedback, so do not use it for that purpose. Examples: - Show me my recent one-on-one agendas: {"from_date": "2025-01-01"} - Get my 1-on-1 meetings from last month: {"from_date": "2025-11-01"} - What are my action items from the last one-on-one?: {"from_date": "2025-01-01"} - What did we talk about with Joe in our last one on one meeting?: {"from_date": "2025-01-01"} - Can you summarize my 1:1s with @John Doe?: {"from_date": "2025-01-01"}

get_performance_goals

ChatGPT
Get performance goals from Workleap for the current user and organization. This function retrieves performance management goals and their details. Managers should be able to find their goals and their team's goals through this function, as they can see their direct reports' goals. Individual contributors can see their own goals. For managers, if they say "my" goals, they could mean their own goals or goals of their team members You can safely assume that "My goals" means the goals that the user has access to, which could include goals they've written or received. Examples: - Summarize my goals: {} - Product Marketing goals?: {} - Software Engineering goals: {} - How many goals are at risk?: {"status": "AtRisk"} - Show me my Personal performance goals: { "goal_type": "Personal"}

get_performance_reviews

ChatGPT
Get performance reviews from Workleap for the current user and organization. This function retrieves performance management reviews and their details. It will return performance review data including self reviews, peer reviews, and manager reviews. This function can be called if the user is looking for performance reviews regarding areas such as goal setting, performance feedback, development planning, career growth, and performance evaluations. Managers should be able to find reviews through this function, as they can see their direct reports' reviews. Individual contributors can see their own reviews and reviews they've written for others. which could include reviews they've written or received. Examples: - Summarize all my performance reviews {'review_types': None, 'limit': 20} - Summarize my latest self review {'review_types': ['SelfReview'], 'limit': 1, 'review_cycle_sort_type': 'ByDueDate', 'sort_direction': 'Descending'} - Show me performance reviews for my team {'review_types': None, 'limit': 5} - What does my manager think of my performance? {'review_types': ['ManagerReview']} - What feedback do I have from recent reviews? {'review_types': ['PeerReview', 'ManagerReview'], 'review_cycle_sort_type': 'ByDueDate', 'sort_direction': 'Descending'} - Show me Alice's performance reviews {'reviewee': ['Alice'], 'limit': 5} - Get performance reviews for John Smith and Jane Doe {'reviewee': ['John Smith', 'Jane Doe'], 'limit': 5}

get_reporting_line

ChatGPT
Get a full downward reporting line in the Workleap organization: everyone who reports to a person, directly and indirectly, level by level down the org chart. Defaults to the current user. Pass person to read someone else's organization instead. Use this when the question spans more than one level of the hierarchy — somebody's whole organization, their skip-level reports, or how many people sit below them. Direct reports come back as level 1 of the same result, so a single call answers both "who reports to me" and "who is in my org". Only people managers have a line to read. When the person is not one, or their line cannot be read, the result says so rather than coming back empty, so relay what it says instead of concluding that nobody reports to them. The walk is bounded by max_depth and limit, and the result says so when it was cut short. Report a partial line as partial rather than presenting it as somebody's whole organization. Returns each person's name, job title, department, and who they report to. It returns nothing about what these people are working on, and no engagement scores, reviews, or goals. Examples: - Who is in my reporting line? {} - Who reports to me, directly or indirectly? {} - Show me my whole organization {} - How many people are below me in the org chart? {} - Who are my skip-level reports? {"max_depth": 2} - List everyone below me, all the way down {"max_depth": 20, "limit": 500} - Who reports to Marie Tremblay? {"person": "Marie Tremblay", "max_depth": 1} - How big is David's org? {"person": "David"}

get_review_context

ChatGPT
Read the review context snapshot stored for a Workleap Performance review. This is a READ operation. It returns the AI-generated context that backs a specific reviewee + review type within a review cycle: Workleap-sourced sections (role, goals, one-on-ones, good vibes, past reviews, current reviews) and any external context sections. Also known as "review context", "review brief", "context snapshot", or "performance context". Required inputs: - review_cycle_id: the 24-char hex id of the cycle. Get from search_review_cycles or a prior search_reviews response. - reviewee_id: the UUID of the person being reviewed. Get from search_reviews — do not pass a name; the tool does not resolve names. - review_type: SelfReview, ManagerReview, PeerReview, or UpwardReview. Returns the stored sections as markdown — each section includes the detailed context and any associated items. Returns a not-found message if no context has been stored yet for the given review. To write or update the context, use set_review_context.

get_team_members

ChatGPT
Look up teams in the Workleap organization directory: find teams by name, by their manager, or by their parent team, and list each team's direct managers and members. This is the directory of record for team structure — use it instead of searching messages or documents, which only carry announcements about teams. Using team: - Finds teams matching the filters and lists each team's direct members and managers. For anything about a person rather than a team — who someone is, who they report to, who reports to them, who holds a role, who has direct reports, or who was hired in a period — use search_people to find them and get_person_details for one person's full profile. This tool answers team questions only; team is its one parameter that does anything here. To find which teams a person belongs to, pass their id to get_person_details, which lists their team memberships. team searches teams by name, manager, or parent, not by who is in them. Examples: - Get members of the Engineering team: {"team": {"team_name": "Engineering"}} - Find teams managed by Jane Doe: {"team": {"manager_name": "Jane Doe"}} - Get all teams under Marketing: {"team": {"parent_team_name": "Marketing"}} - Find all teams and subteams under Engineering: {"team": {"parent_team_name": "Engineering", "fetch_subteams": true}}

get_user_context

ChatGPT
Return the connected user's profile and team composition. Call this at the start of every conversation to understand who you are working with. Returns a text profile in the following format: Name: <full name> Email: <email address> Role: <job title> Manager: <manager's full name> Direct reports: <comma-separated list, or "none"> Teammates: <comma-separated list, or "none"> Use the exact names from this output when calling get_contributions, analyze_engagement, or analyze_feedback — do not paraphrase or abbreviate. Call this only once per conversation; the result does not change within a session. Use this context to resolve references like 'my team', 'my manager', or 'my direct reports' before calling other tools. If this tool returns 'User context is unavailable for this account.', inform the user that their Workleap profile could not be loaded. Still attempt other tools if the user's request does not require identity resolution.

list_good_vibe_prompts

ChatGPT
List the organization's Good Vibe prompts: the headings of an Officevibe recognition card, such as "Who's this week's MVP?". Returns one line per prompt, most used first, with its prompt id, category and source. It reads the catalog only and sends nothing. Call this before send_good_vibe whenever the user wants to draft, write, or send a Good Vibe, kudos, a shout-out, a thank-you or recognition to a colleague: "send Lina a Good Vibe for launch week", "draft kudos for Marc", "help me write a Good Vibe for the support team", "help me recognize the on-call team", "which Good Vibe prompts can I use". send_good_vibe takes the chosen prompt's id and source from this list. Example: Send Lina a Good Vibe for launch week {"status_title": "Listing Good Vibe prompts"}

publish_goal

ChatGPT
Publish a draft Workleap Performance goal (or OKR), making it visible to others. This is a WRITE operation with an audience: publishing takes a goal that only its owner and contributors could see and makes it live according to its visibility setting, which for AllOrganization goals means everyone in the company. Publishing cannot be undone — a published goal cannot be returned to draft. Because of that, confirm with the user before calling this. Show them the goal's title and what it contains, and publish only once they say yes. Never publish a goal without asking, and never publish as a way of finishing off a goal you just created. A goal must be complete enough to publish: it needs a title, an owner, a start date, an end date on or after the start date, and, for a goal tracking progress through measurements, at least one measurement. A parent goal, if set, must itself be published and not archived. Publishing an incomplete goal is rejected; set what is missing with update_goal first. Examples: - Yes, publish it (after the user confirmed a draft you showed them) {"goal_id": "<goal-id>"} - Make my draft goal live {"goal_id": "<goal-id>"}

reply_to_feedback

ChatGPT
Post the current user's reply on an Officevibe feedback conversation, as the user. Use this when the user wants to reply to, answer, respond to, or acknowledge feedback they received in Officevibe: "reply to the feedback about meeting overload", "answer that anonymous comment and thank them", "respond to Marc's feedback". Read the feedback with get_officevibe_feedback_conversations first; this tool takes the id from its "Feedback id" line. A posted reply reaches the feedback author at once and cannot be withdrawn here. Examples: - Thank an anonymous author {"feedback_id": "64f1c2a9e4b0f6d2c8a1b234", "reply": "Thank you for raising this. I'm moving our Wednesday sync to a written update starting next week."} - Answer a named colleague {"feedback_id": "64f1d9c1e4b0f6d2c8a1b567", "reply": "Marc, you're right that the onboarding docs are stale. I've booked time Friday to refresh them with you."} This sends immediately with no review step. If the user asks for a draft or wants to review the text first, do not call this tool; write the draft as plain text instead.

search_action_items

ChatGPT
List the user's action items (to-dos, tasks, follow-ups), filtered by status, due-date window, who created them, how they were created, or the meeting they came from. Use this for "what's on my plate", "my action items due this week", "what have I finished", "what has the assistant added for me", "the action items from my 1:1 with Alex", or before changing an item whose id you do not have yet. Each item carries its id, which update_action_item and delete_action_item take. Defaults to the user's own open items (status ToDo). There is no text search and no completion-date filter: filter by due date, then read the list. Results are paged; when more exist the result ends with a continuation token to echo back. Examples: - What's on my plate? {} - My action items due the week of September 14 {"due_after": "2026-09-14", "due_before": "2026-09-20"} - What have I already finished? {"statuses": ["Done"], "sort_by": "CreatedDate", "sort_direction": "Descending"} - What has the assistant added for me? {"sources": ["Assistant"]} - Action items from my 1:1 with Alex {"parent_ids": ["<meeting-id>"]} - Everything I assigned to other people {"created_by_ids": ["<my-member-id>"]} - Next page (token echoed from previous response) {"continuation_token": "<opaque-token>"}

search_goal_contributor_candidates

ChatGPT
Find which members, teams and managers' reports the current user is allowed to add as contributors to a Workleap Performance goal (or OKR), and get their ids. Use this whenever the user names a person or team rather than giving an id. Contribution is permission-scoped: resolving a name against the general member directory produces ids that look right but are rejected on save. This tool returns only eligible candidates. Returns up to four lists: members (with member id, job title, email), teams (with team id and name), managers whose direct reports can be added, and managers whose reporting line can be added. Whichever list an id came from determines the contributor type you must pair it with: Member, Team, DirectReports, or ReportingLine. The two manager lists hold manager member ids, and adding one enrols that manager's reports rather than the manager: DirectReports for the people reporting straight to them, ReportingLine for that manager's whole reporting line. To make the manager themself a contributor, use their id from the members list with Member. Those four are the only types you can add through these tools; a goal can also carry the whole organization as a contributor, but no tool exposes the id that needs, so tell the user that has to be done in Workleap Performance rather than attempting it here. If the search is ambiguous, ask the user which person, team, or manager they meant rather than picking. Examples: - Add Bob as a contributor (call this first to resolve "Bob") {"search_term": "Bob"} - Who can contribute to this goal? {} - Put the whole design team on this goal {"search_term": "design"} - Add Alice's direct reports to this goal {"search_term": "Alice"}

search_goal_owner_candidates

ChatGPT
Find which members the current user is allowed to make the owner of a Workleap Performance goal (or OKR), and get their member ids. Use this whenever the user names a person rather than giving a member id. Goal ownership is permission-scoped: the current user can only assign goals to a subset of the organization, so resolving a name against the general member directory produces ids that look right but are rejected on save. This tool returns only eligible people. Returns each candidate's display name, member id, job title, and email, so you can tell two people with the same name apart. If the search is ambiguous, ask the user which one they meant rather than picking. Examples: - Create a goal owned by Alice (call this first to resolve "Alice") {"search_term": "Alice"} - Who can I assign this goal to? {} - Hand this goal over to someone on the design team {"search_term": "design"}

search_goals

ChatGPT
Search Workleap Performance goals visible to the current user. A goal is a target the user, their team, or the organization is tracking (Personal, Team, or Organization scope). Use this function when the user asks about goal progress, status, owners, sub-goals, or filtering by time period or status. Returns goal metadata, current progress, contributors, and the latest progress update. Pagination is supported via an opaque continuation_token. When more results exist, the response ends with a "More results available" hint containing the next token; pass that token verbatim on the next call with the same filters to get the next page. Examples: - What goals am I tracking? {} - Which of my goals are off track? {"statuses": ["OffTrack", "AtRisk"]} - Show me Alice's goals for Q1 {"owners": ["Alice"], "start_date_after": "2026-01-01", "end_date_before": "2026-03-31"} - Find the website rewrite goal {"search_term": "website rewrite"} - Which goals haven't been updated in a while? {"sort_by": "LastProgressUpdateDate", "sort_direction": "Ascending"} - Show me the team-level goals only {"goal_types": ["Team"]} - Show me top-level goals only {"has_parent_goal": false} - Next page (token echoed from previous response) {"continuation_token": "<opaque-token>"}

search_jira_issues

ChatGPT
Retrieve Jira issues with optional filters for assignee, status, update/resolution dates, projects, and sorting. By default, searches issues assigned to the current user (current_user_assignee=true). Set current_user_assignee=false to search all issues regardless of assignee. When searching all issues, the system automatically filters by the user's most recently viewed project to provide more relevant results, unless you specify explicit projects using the projects parameter. Supports searching for issues assigned to specific team members by name or email address, narrowing results by past or current workflow status, specific date ranges, specific projects, and limiting the number of issues. Sorting can be applied by any supported field (e.g., creation date, due date) in ascending or descending order. The returned data includes comprehensive issue information such as descriptions, status, priority, dates, assignee details, parent issue details (for subtasks), subtasks (for parent issues), issue links, time tracking information, and more. Invoke this function when the user requests information about Jira issues, whether assigned to themselves, other team members, or all issues in general, such as: - Work history (e.g., "what I worked on", "my work", "what did I do") - Active work, completed tasks within a time range - Tickets in specific statuses - Parent-child relationships between issues - Team-oriented queries - Project status queries (e.g., "status of the customer portal project") - Results ordered in a certain way For queries about personal work over time periods, use updated_after parameter with calculated dates. Note: For queries needing multiple data types, call tools in parallel (see system instructions). Use status=["Done"] with sort_by="resolutiondate" and sort_order="DESC" when the user asks about completed, finished, delivered, or accomplished work. Use status=["In Progress"] when the user asks about current work or what they're working on. Use status=["To Do"] when the user asks about pending or upcoming work. Use status=["In Progress", "To Do"] when the user asks about active work (not completed). Use current_user_assignee=false when explicitly asking about all issues regardless of assignee. Use current_user_assignee=false with sort_by="updated" and sort_order="DESC" when explicitly asking about the user's team. Use current_user_assignee=false when asked about a specific issue. Use assignee_email when you have an exact email address (takes priority over current_user_assignee). Use assignee_name when you have a person's name but not their email (takes priority over current_user_assignee). Use higher max_results (100) when asked broad questions about team state or project status to provide comprehensive overview. Examples: Personal Work Queries (Default: current_user_assignee=true) - What am I working on?: {"status": ["In Progress"]} - Show me my current Jira issues: {"status": ["In Progress"]} - What tasks am I supposed to do?: {"status": ["To Do"]} - What am I assigned to in Jira?: {"status": ["To Do", "In Progress"]} - List my active Jira tickets: {"status": ["In Progress", "To Do"]} - What tasks have I finished?: {"status": ["Done"], "sort_by": "resolutiondate" "sort_order": "DESC"} - Show me finished tasks: {"status": ["Done"], "sort_by": "resolutiondate" "sort_order": "DESC"} - What did I work on in the last year?: {"updated_after": "<calculate: 1 year ago>", "sort_by": "updated", "max_results": 100} - Show my work history: {"sort_by": "updated", "sort_order": "DESC", "max_results": 100} - Help me prepare my self review of January-March 2025 by summarizing my contributions in Jira: {"resolved_after": "2025-01-01", "resolved_before": "2025-03-31", "status": ["Done"], "sort_by": "resolutiondate", "max_results": 100} Project Status Queries (current_user_assignee=false, keywords for project name) - What is the current status of the customer portal project?: {"current_user_assignee": false, "keywords": "customer portal project", "max_results": 100} - How is the API integration project going?: {"current_user_assignee": false, "keywords": "API integration project", "max_results": 100} - Show me updates on the database migration project: {"current_user_assignee": false, "keywords": "database migration project", "max_results": 100} - Latest status of the security audit project: {"current_user_assignee": false, "keywords": "security audit project", "max_results": 100} Team & All Issues Queries (current_user_assignee=false, leverages recent projects for team context) - Show all Jira issues: {"current_user_assignee": false, "sort_by": "updated", "max_results": 100} - What is my team working on?: {"current_user_assignee": false, "status": ["In Progress", "To Do"], "sort_by": "updated", "max_results": 100} - What tasks are currently being worked on?: {"status": ["In Progress"], "current_user_assignee": false, "max_results": 100} - What work is pending?: {"status": ["To Do"], "current_user_assignee": false, "max_results": 100} - List all open tasks: {"status": ["To Do", "In Progress"], "current_user_assignee": false, "max_results": 100} - Show me all active work: {"status": ["In Progress", "To Do"], "current_user_assignee": false, "max_results": 100} - What our team has been working on in the past month: {"current_user_assignee": false, "updated_after": "<calculate: 1 month ago>", "sort_by": "updated", "max_results": 100} - What's the status of our team's work?: {"current_user_assignee": false, "sort_by": "updated", "max_results": 100} - How is my team progressing on current tasks?: {"current_user_assignee": false, "status": ["In Progress"], "sort_by": "updated", "max_results": 100} Explicit Project Filtering - Search issues in WLAI and INFRA: {"projects": ["WLAI", "INFRA"], "current_user_assignee": false} - What is Lisa working on in WLAI?: {"projects": ["WLAI"], "status": ["In Progress"], "assignee_name": "Lisa"} Specific Team Member Queries - Show issues assigned to David Smith: {"assignee_name": "David Smith"} - What is Lisa working on?: {"assignee_name": "Lisa"} - Show issues assigned to john.doe@company.com: {"assignee_email": "john.doe@company.com"} - What work has David delivered?: {"assignee_name": "David", "status": ["Done"]} Issue Type & Content Filtering - What stories have I completed?: {"issue_types": ["Story"], "status": ["Done"]} - Find all stories I'm assigned to: {"issue_types": ["Story"], "sort_by": "lastUpdated"} - Show only bug and task issues: {"issue_types": ["Bug", "Task"]} - Show Mike's bugs: {"assignee_name": "Mike", "issue_types": ["Bug"]} - Find issues about Slack marketplace: {"current_user_assignee": false, "keywords": "slack marketplace"} - Search for issues about performance: {"keywords": "performance"} Specific Issue Keys - What are issues WLAI-123 and WLAI-456?: {"current_user_assignee": false, "keys": ["WLAI-123", "WLAI-456"]} - Show details of story PROJ-789: {"current_user_assignee": false, "keys": ["PROJ-789"]} Date-based Filtering - Show issues I've worked on in the last 3 months: {"updated_after": "2024-05-20", "max_results": 50} - Show issues updated in July 2024: {"updated_after": "2024-07-01", "updated_before": "2024-07-31"} - Show all issues resolved on or after last week: {"current_user_assignee": false, "resolved_after": "<calculate: 1 week ago>", "max_results": 15} - Show issues resolved last month (July): {"resolved_after": "2024-07-01", "resolved_before": "2024-07-31"} - Show issues done in Q1 and Q2: {"resolved_after": "2024-01-01", "resolved_before": "2024-06-30"} Sorting & Prioritization Queries - Show my highest priority Jira issues: {"sort_by": "priority", "sort_order": "DESC"} - Show my lowest priority issues first: {"sort_by": "priority", "sort_order": "ASC"} - Display my top 3 tickets: {"sort_by": "priority", "sort_order": "DESC", "max_results": 3} - Show issues by status: {"sort_by": "status", "sort_order": "DESC"} - Show my oldest issues first: {"sort_by": "created", "sort_order": "ASC"} - Show my issues with earliest due dates: {"sort_by": "duedate", "sort_order": "ASC"} Advanced Multi-parameter Queries - What stories is Alice assigned to?: {"assignee_name": "Alice", "issue_types": ["Story"]} - Show me finished bugs by Lisa: {"assignee_name": "Lisa", "issue_types": ["Bug"], "status": ["Done"]} - What stories has Jonathan done in the last 3 months?: {"assignee_name": "Jonathan", "issue_types": ["Story"], "status": ["Done"], "updated_after": "2024-05-20", "max_results": 50} - What has jc accomplished recently?: {"assignee_name": "jc", "status": ["Done"], "updated_after": "2024-07-01"} - What about her contributions in the mobile app project?: {"assignee_name": "her", "keywords": "mobile app project"} - What is @Tom working on?: {"assignee_name": "Tom"}

search_meeting_agendas

ChatGPT
Search meeting agendas in Workleap — the prepared talking points, notes, and topics for meetings the current user organizes. A meeting agenda is the content attached to a meeting the user set up: what will be discussed, notes carried over, and any prepared material. Use this when the user asks what is on the agenda for a meeting, what they planned to discuss, or to look back at the agenda of a meeting they ran. Also answers to "talking points", "meeting notes", "meeting prep", and "what am I covering in". Covers only meetings the user ORGANIZES. Meetings the user merely attends are not returned. For Officevibe one-on-one agendas between a manager and a direct report, use the one-on-one agendas tool instead. Set sort_direction to Ascending for upcoming meetings and Descending for past ones — it also decides which way the default 28-day search window extends from today. For a question about a single meeting ("my next meeting", "my last meeting"), set limit to 1. start_after and start_before are moments, not days. Send them with the user's UTC offset, and end a whole day at 23:59:59 rather than midnight — otherwise the window closes before that day's meetings start. Narrow by who is on the meeting with attendees, by name or by the member id an earlier result gave you — ids skip the name lookup and cannot match the wrong member, and the two can be mixed in one list. Several entries keep a meeting when any one of those people is on it, so add one name at a time when the user means a meeting with everybody. When a name matches several members, the result lists the candidates and which one it used: relay that assumption or ask the user, then re-run with the right id. Meetings in every state come back by default, so a result can hold an agenda the user has not reviewed yet, or a meeting with no agenda at all. Set states to ask for one kind. Narrow by title with search_term, which matches part of the meeting title and never the agenda body. Use it when the user names the meeting ("my retro", "the budget review"); when they describe what was discussed instead, filter by date or attendees and read the agendas that come back. Examples: - What's on the agenda for my next meeting? {"sort_direction": "Ascending", "limit": 1} - What did I cover in my last meeting? {"sort_direction": "Descending", "limit": 1} - What's on the agenda for my upcoming meetings? {"sort_direction": "Ascending"} - What's on the agenda for my next meeting with Alex? {"attendees": ["Alex"], "sort_direction": "Ascending", "limit": 1} - What did we go over in my retro last month? {"search_term": "retro", "start_after": "2026-07-01T00:00:00-04:00", "start_before": "2026-07-31T23:59:59-04:00"} - What am I covering with that member, after an earlier result returned their id? {"attendees": ["429c3661-cd70-4d3c-bd6f-b8204bdd1016"], "sort_direction": "Ascending"} - Show me the agendas from my meetings last week {"start_after": "2026-08-17T00:00:00-04:00", "start_before": "2026-08-23T23:59:59-04:00"} - Which upcoming agendas have I not reviewed yet? {"states": ["Draft"], "sort_direction": "Ascending"}

search_microsoft_teams_messages

ChatGPT
IMPORTANT Use search_microsoft_teams_messages instead of search for any query that references Microsoft Teams, chats, or messages from colleagues in Microsoft Teams. Search for messages in the user's Microsoft Teams workspace. Microsoft Teams is a key source of workplace communication containing discussions, decisions, project updates, and team collaboration. Supports KQL (Keyword Query Language) search syntax with limited filters for sender, attachments, mentions, and date ranges. Returns formatted search results with message content, sender information, and chat context. Query Expansion for Better Coverage: Query expansion is not optional for most Microsoft Teams message queries. Use the 'extra_queries' parameter to provide multiple alternative search queries that improve result coverage. The system executes queries in order (main query first, then extra queries) until it finds enough results. Because Microsoft Teams searches may miss relevant messages with strict filters, use extra_queries to: - Add single-word and simplified versions of the main query - Include synonyms, abbreviations, and common paraphrases - Try broader and narrower formulations of the same intent - Relax overly strict filters (sender) in some variants Example: - Main query "project status" + Extra queries ["project", "status update", "progress report"] KQL search syntax you may use VERY IMPORTANT: Microsoft Teams Search API has LIMITED KQL support only use the filters listed below. Do NOT invent other filters. CRITICAL: DO NOT ADD DATE FILTERS TO YOUR QUERIES - Date filters (sent>YYYY-MM-DD, sent<YYYY-MM-DD) are AUTOMATICALLY added from the after/before parameters - NEVER manually add date filters to query or extra_queries - they will be injected automatically Supported Filters: Sender - from:email@domain.com (messages from specific sender by email) - from:PartialName (messages from sender by partial name match) Attachments - hasAttachment:true (messages with attachments) - hasAttachment:false (messages without attachments) Mentions - IsMentioned:true (messages where user is mentioned) - IsMentioned:false (messages where user is NOT mentioned) Content Search - keywords (space-separated terms search message body and attachments) Notes: - Multiple filters are combined with implicit AND (space-separated) - Search applies to message body AND file attachments - Only searches messages where the signed-in user is a participant - Results are ranked by relevance Search Syntax Examples (main query, other extra queries for different terms will also be needed): - Find messages from Sarah about project -> from:sarah@company.com project - Show messages with attachments about budget -> hasAttachment:true budget - Find messages where I was mentioned -> IsMentioned:true - Search for approval messages -> approval - Show messages about quarterly review -> "quarterly review" When to Use this function: Use this function for Microsoft Teams message queries: - Chat searches: "Find messages in my Microsoft Teams chats", "Show group chat messages" - Sender-based queries: "What has my manager messaged me in Microsoft Teams?", "Messages from Sarah in chats" - Time-based searches: "Microsoft Teams chat messages from last week", "Recent messages about the project" - Attachment searches: "Microsoft Teams messages with attachments about budget" - Mention searches: "Messages where I was mentioned in Microsoft Teams"

search_notion

ChatGPT
Search for Notion pages and connected data sources in the user's personal workspace using natural language queries. Supports filtering by date range, creator, and limiting the number of results. Always call this alongside the search, search_jira_issues, get_officevibe_oneonone_agendas, and other relevant searching function calls as Notion can hold all sorts of data. Returns page titles and full content for comprehensive information about what the user has in Notion. Also call this function when the user asks about documents, notes, pages, wikis, knowledge bases, policies, guidelines, or written content — even if they do not explicitly mention "Notion". Users store many types of content in Notion including documents, meeting notes, project docs, policies, onboarding guides, strategic planning, 1-1 meeting recaps, technical documentation, task lists, and personal notes. Invoke this function when the user requests information such as: - Finding specific pages or notes (e.g., "find my notes about X", "find my latest documents about Y") - Getting information about tasks (e.g., "what's on my todo list?", "list my blocked tasks") - Finding information about 1-1 notes (e.g. "summarize my 1 on 1 notes") - Searching for content by topic (e.g., "search for project documentation") - Looking for pages from a specific time period (e.g., "show me pages from last week") - Finding pages created by specific users (e.g., "show me John Doe's pages") - General content queries (e.g., "what do I have about Y?", "summarize the marketing document I wrote") - Policy and guideline queries (e.g., "find the tax policy", "show me the onboarding guide") Examples: Basic Search - Summarize my Notion workspace: {"query": ""} - What are my blocked tasks: {"query": "tasks"} - Find my Notion notes about the Q4 planning: {"query": "Q4 planning"} - Search for API documentation: {"query": "API documentation"} - What do I have in Notion about performance reviews?: {"query": "performance reviews"} - Find my latest Notion documents about the tax policy: {"query": "tax policy"} - Summarize the marketing document I wrote last month in Notion: {"query": "marketing"} Date-Filtered Search - Show me Notion pages from last week: {"query": "", "start_date": "<calculate: 7 days ago>"} - Find pages updated in November: {"query": "", "start_date": "2024-11-01", "end_date": "2024-11-30"} - Recent notes about the project: {"query": "project", "start_date": "<calculate: 30 days ago>"} Combined Filters - List my blocked tasks: {"query": "blocked tasks"} - Find the latest meeting notes from our product sync.: {"query": "product sync"} - Look for any documentation about our Q2 goals.: {"query": "Q2 goals"} - Can you show me any documents I wrote about the analytics migration?: {"query": "analytics migration"}

search_organization_members

ChatGPT
Search and view organization member profiles. Use this tool to find people in the organization and view their profile details. Accepts a name, email address, member ID, or team ID. When to use: - Looking up a colleague's profile, email, job title, or manager - Finding members of a specific team - Searching for someone by name or email Do NOT use for the authenticated user's own context (use get_user_context). Do NOT use for work history or contributions (use get_contributions). Output: Returns a members array. Each member has: display_name, email, job_title, state, department, hire_date, reporting_manager_name, city/region/country, bio, and more. Fields the caller's role cannot see are null; list fields (competencies, interests) return [] when hidden. Dates are ISO 8601 strings. Response behavior: - Multiple matches: returns a summary list — ask the user which profile to view. - Single match: returns a detailed profile with all fields visible to your role. - Zero matches: returns a message suggesting the user check spelling. Response guidance: This tool returns a visual UI (profile card or member list). If you are rendering the UI element, keep your text response to a brief 1-2 sentence note — do not restate fields the user can already see in the card. If you are not rendering the UI, synthesize the results into a detailed summary. Parameter guidance: - search_term: accent-insensitive, matches first/last/preferred name and email. - member_id: use for direct lookup when you already have the UUID (bypasses text search). - team_id: combine with search_term to filter within a team, or use alone for full roster. - limit: default 10. Use 1 for single-profile lookup; max 50. On error: ask the user to verify the name or email and retry once. Never fabricate profile data.

search_outlook_calendar

ChatGPT
IMPORTANT: Use search_outlook_calendar instead of search for any query about meetings, calendar events, schedules, appointments, or availability. Search for calendar events in the user's Microsoft 365 Outlook calendar. Calendar events are a key source of workplace scheduling information containing meetings, appointments, team syncs, and availability data. Uses structured queries with filters for attendees, keywords, location, and event attributes. Returns formatted search results with event details, attendees, timing, and location information. Query Expansion for Better Coverage: Query expansion improves result coverage for SEARCHING, but is NOT needed for pure FILTERING. Use 'extra_queries' to provide alternative structured queries that vary keywords, attendee names, location terms, and phrasings. Leave 'extra_queries' empty for pure exact filters (attendee_email, is_all_day, is_cancelled, is_recurring, show_as). Examples: - SEARCHING: keywords=['sprint planning'] + Extra: [keywords=['sprint'], keywords=['iteration', 'planning']] - SEARCHING: location='Building A' + Extra: [location='Bldg A'], location='Office A']] - FILTERING: attendee_email='john@company.com' + Extra: [] (empty) - MIXED: attendee_name='john' + keywords=['standup'] + Extra: [keywords=['standup'], keywords=['sync']] Structured Query Filters: All filters are optional - combine them to narrow results: Keywords - keywords: Text to search in event subject/body (substring match, case-insensitive) Example: keywords='budget review' matches "Q4 Budget Review Meeting" Attendees - attendee_email: Exact email address match (preferred for identifying people) Example: attendee_email='sarah@company.com' - attendee_name: Display name substring match (fallback when email unknown) Example: attendee_name='Sarah' matches "Sarah Johnson" Note: Email matching is more precise - use it when available Location - location: Location text substring match (physical or virtual) Example: location='Building A' or location='Teams' Event Attributes - is_all_day: Filter all-day events (true) or timed events (false) - is_cancelled: Filter cancelled events (true) or active events (false) - is_recurring: Filter recurring events (true) or one-time events (false) - show_as: Availability status (free, busy, tentative, out_of_office, working_elsewhere) Time Range - after/before parameters define the time window (automatically capped to 90 days) - Events are loaded for the entire range, then filtered in-memory - Keep ranges focused for better performance (days/weeks better than months) Important Time Range Behavior: - Calendar searches are capped to 90-day time windows for performance - If you request a range > 90 days, the system automatically adjusts the after date to create a 90-day window ending at your specified before date Search Examples: Find meetings with a specific person: - query: attendee_email='john@company.com', after=<last week>, before=<today> Find sprint planning meetings: - query: keywords='sprint planning', after=<last month>, before=<today> - extra_queries: [keywords=['iteration', 'sprint'], keywords=['planning', 'kickoff']] Find all-day events next week: - query: is_all_day=True, after=<next Monday>, before=<next Friday> Find tentative meetings requiring response: - query: show_as='tentative', after=<today>, before=<next week> Find recurring 1:1 meetings with manager: - query: is_recurring=True, attendee_email='manager@company.com' Find cancelled meetings to understand schedule changes: - query: is_cancelled=True, after=<last week>, before=<today> When to Use this function: Use this function for ANY calendar or scheduling query, including: - Meeting searches: "Find meetings with john@company.com", "Show my sprint planning meetings" - Schedule overview: "What's my week look like?", "Do I have meetings tomorrow?" - Attendee queries: "Meetings with my manager", "Events with the engineering team" - Time-based searches: "Meetings next week", "Recent 1:1s" - Location searches: "Meetings in Building A", "Virtual meetings on Teams" - Event attributes: "All-day events", "Cancelled meetings", "Recurring syncs" - Availability: "Tentative meetings", "When am I busy tomorrow?"

search_outlook_mailbox

ChatGPT
IMPORTANT Use search_outlook_mailbox instead of search for any query that references emails, inbox, Outlook, messages from people, or email-related requests. Search for email messages in the user's Microsoft 365 Outlook mailbox. Outlook email is a key source of workplace communication containing discussions, approvals, company updates, and team information. Supports KQL's rich search syntax with filters for sender, recipient, subject, attachments, importance, and dates. Returns formatted search results with message content, sender information, and pagination details. Query Expansion for Better Coverage: Query expansion improves result coverage for SEARCHING, but is NOT needed for pure FILTERING. Use 'extra_queries' to provide alternative search queries that vary keywords, synonyms, and phrasings. Leave 'extra_queries' empty for pure attribute filters (isread, importance, hasattachments, from, to, subject). Examples: - SEARCHING: 'vacation policy' + Extra: ['vacation', 'time off', 'PTO', 'leave policy'] - FILTERING: 'isread:false' + Extra: [] (empty) - MIXED: 'from:jane budget' + Extra: ['from:jane financial', 'from:jane spending'] KQL search syntax you may use VERY IMPORTANT: this is the only types of filters you should use. You can use different keywords and query terms, but for filters with ":", do not invent anything else. CRITICAL: DO NOT ADD DATE FILTERS TO YOUR QUERIES - Date filters (received:>=YYYY-MM-DD, sent:>=YYYY-MM-DD, etc.) are AUTOMATICALLY added from the after/before parameters - NEVER manually add date filters to query or extra_queries - they will be injected automatically Filters for query and extra_query: People / Recipients - from:email@domain.com (messages from a specific sender) - from:'Display Name' (messages from sender by name - use single quotes) - to:email@domain.com (messages sent to a specific recipient) Subject / Content - subject:'keyword' (subject contains keyword or phrase - use single quotes) - 'exact phrase' (single quotes for exact phrase matching in body or subject) - keywords (space-separated terms search body and subject) Message Attributes - hasattachments:true|false (message has/lacks attachments) - importance:high|low|normal (message importance level) - isread:false (unread status) Boolean Operators - AND (both conditions must match) - OR (either condition matches) - NOT (exclude matches) Wildcards - (suffix wildcards only: subject:meet works, but meeting or meet do NOT work) - to: or from: (shortcuts for any messages sent to anyone or received from anyone) Notes - Combine filters by space-separating them with AND/OR operators. - Prefer quoting proper nouns / project names (e.g., 'Project Moonlight') - especially if the user put quotes themselves. Examples: FILTERING (no extra_queries needed): - Show unread messages -> isread:false - High priority emails with attachments -> importance:high AND hasattachments:true SEARCHING (provide extra_queries): - Find vacation policy emails -> vacation policy + Extra: ['vacation', 'PTO', 'time off'] - Emails from jane about budget -> from:jane@company.com budget + Extra: ['from:jane@company.com financial'] MIXED (preserve filters in extra_queries): - Unread messages about project launch -> isread:false project launch + Extra: ['isread:false project', 'isread:false kickoff'] When to Use this function:* Use this function for ANY email-related or message query, including: - Email searches: "Find emails from john@company.com", "Show my messages about benefits" - Sender-based queries: "What has my manager emailed me?", "Messages from HR" - Sent email queries: "Summarize last email I sent to John", "Show emails I sent about the project" - Time-based searches: "Emails from last week", "Recent messages about the project" - Attachment searches: "Emails with attachments about budget", "Messages with files" - Company info: Any question about company communications that would be in email

search_parent_goal_candidates

ChatGPT
Find which Workleap Performance goals (or OKRs) a given goal is allowed to be nested under, and get their ids. Use this whenever the user wants to make one goal a sub-goal of another. Eligibility is computed relative to the child goal: the list already excludes the goal itself, everything already beneath it (which would make a cycle), and goals outside the user's reach. A goal outside this list is rejected on save. goal_id is the CHILD — the goal being nested. The results are the possible parents. The child goal must already exist before its possible parents can be computed. Examples: - Make this goal part of the company revenue goal {"goal_id": "<child-goal-id>", "search_term": "revenue"} - What can I nest this goal under? {"goal_id": "<child-goal-id>"}

search_review_cycles

ChatGPT
Search Workleap Performance review cycles available to the current user. A review cycle is the container for a round of performance reviews (e.g. "Q1 2026 Reviews"). Use this function when the user asks which review cycles they participate in, the status of a cycle, due dates, or which review types a cycle includes. Returns the cycle metadata, not the individual reviews — use a reviews-search tool if the user wants the review content itself. Examples: - Which review cycles am I part of? {} - Which review cycles are underway? {"statuses": ["Launched"]} - Show our latest launched cycles, locked or not {"statuses": ["Launched", "Locked"], "limit": 5} - What review cycles are coming up this quarter? {"sort_by": "ByLaunchDate", "sort_direction": "Ascending"} - Find the Q1 review cycle {"search_term": "Q1"} - Show me self-review cycles from 2026 {"review_types": ["SelfReview"], "evaluation_period_start": "2026-01-01", "evaluation_period_end": "2026-12-31"} - Which cycles is Alice in as a reviewee? {"reviewees": ["Alice"]} - Show me the full questionnaire for the Q1 cycle {"search_term": "Q1", "include_questions": true} - Who is in the Q1 cycle? {"search_term": "Q1", "include_cycle_settings": true}, then search_people with the member ids and member_states Active, Created, Pending and Deactivated - Read the cycle from the page context {"review_cycle_ids": ["665f1c2e9b1e8a0012345678"], "include_questions": true, "include_cycle_settings": true}

search_reviews

ChatGPT
Search Workleap Performance reviews within a specific review cycle, returning the full review payload including all answer content. A review is one participant's assessment in a cycle (e.g. Alice's self-review in "Q1 2026 Reviews"). This endpoint is scoped to a single cycle, so you must pass review_cycle_id. Use search_review_cycles first to obtain the cycle id when the user does not already provide one. By default the response returns review metadata only. Set include_answers=true to additionally embed every answer (questionId, sectionId, answer text, type, edited metadata) — the payload grows substantially, so only enable it when the caller wants to read the actual review content. To map sectionId/questionId back to the question wording or rating scale, call search_review_cycles with include_questions=true on the same cycle. Pagination is supported via an opaque continuation_token. When more results exist, the response ends with a "More results available" hint containing the next token; pass that token verbatim on the next call with the same filters to get the next page. Examples: - Show me all reviews in the Q1 2026 cycle {"review_cycle_id": "abc...", "limit": 20} - My in-progress reviews in this cycle {"review_cycle_id": "abc...", "statuses": ["InProgress"]} - Read the answers on Alice's submitted manager reviews {"review_cycle_id": "abc...", "review_types": ["ManagerReview"], "reviewees": ["Alice"], "statuses": ["Submitted"], "include_answers": true} - Overdue self-reviews still in progress {"review_cycle_id": "abc...", "review_types": ["SelfReview"], "statuses": ["NotStarted", "InProgress"]} - Next page (token echoed from previous response) {"review_cycle_id": "abc...", "continuation_token": "<opaque-token>"}

search_segments

ChatGPT
Find Workleap segments (saved groups of people, also called member groups) by name, and get their ids. Returns the segments the user can see, starred ones first, with each segment's name, id, and member count. Use this for "which segments do we have" and as the first step whenever you only have a segment name and need its id for another tool. Examples: - Find the Sales EMEA segment {"search_term": "Sales EMEA"} - Which segments can I see? {}

search_slack

ChatGPT
IMPORTANT search_slack instead of search for any query that references Slack, channels, DMs, messages, threads, reactions, pinned items, or Slack users. Search for messages and files in ALL Slack channels and DMs that user has access to. Slack is a primary knowledge base containing team discussions, decisions, company infos, and internal knowledge. Supports Slack's rich search syntax with modifiers for filtering by channel, user, date, content type, and more. Returns formatted search results with message content, context, and pagination information. Query Expansion for Better Coverage: Query expansion is not optional for most informational or company-related questions. Use the 'extra_queries' parameter to provide multiple alternative search queries that improve result coverage. The system executes queries in order (main query first, then extra queries) until it finds enough results. Because Slack treats multi-word searches as AND queries, the main query will often miss relevant messages if you do not add variations. Use extra_queries to: - Add single-word and simplified versions of the main query - Include synonyms, abbreviations, and common paraphrases - Try broader and narrower formulations of the same intent - Relax overly strict filters (channels, users, or dates) in some variants Example: - Main query "vacation policy" + Extra queries ["vacation", "time off", "PTO", "leave"] OR Operator - Use for Synonym Expansion: The OR operator is powerful for pure keyword searches to catch messages using different terminology. Use it to search multiple synonyms, related terms, or variations in a single query. Examples of effective OR usage: - bug OR issue OR defect OR problem - catches any bug-related discussion - PTO OR vacation OR leave OR time off - comprehensive leave policy search - onboard OR onboarding OR new hire OR welcome - new employee topics Important limitation: OR works ONLY for pure keyword searches (no filters). When filters are present, use extra_queries instead: - Main: from:<@Jane> proposal → Extra: [from:<@Jane> RFC, from:<@Jane> design doc] - Main: in:#engineering error → Extra: [in:#engineering exception, in:#engineering failure] Rule: Pure keywords → use OR. With filters → use extra_queries. User Search Strategy (from:<@...> syntax): All user reference formats are auto-resolved to Slack IDs. Use the best identifier you have in the main query, then provide alternatives in extra_queries for better coverage: Priority order for main query: 1. Slack ID (from:<@U123456>) - most reliable, used directly 2. Email (from:<@user@email.com>) - very reliable, auto-resolved 3. Full display name (from:<@John Doe>) - reliable, auto-resolved 4. Partial name (from:<@Jon>) - works but may match multiple users Use extra_queries for alternative identifier formats: - If main query uses email → add display name in extra_queries (and vice versa) - If user mentions nickname/abbreviation → add full name in extra_queries Examples: - Main query: "from:<@john.doe@workleap.com>" Extra queries: ["from:<@John Doe>"] - Main query: "from:<@John Doe>" Extra queries: ["from:<@john.doe@workleap.com>"] IMPORTANT : always use <@...>, with from: to: with: filters Slack search syntax you may use VERY IMPORTANT : this is the only types of filters you should use. You can use different key words and query terms, but for filters with ":", do not invent anything else. Dates (those filters will be separate parameters) - after:YYYY-MM-DD (used if asked for, or if user ask for recently = default to last month) - before:YYYY-MM-DD (used only if the user explicitly ask for a date range/before date) Filters for query and extra_query: People / conversation - from:<@DisplayName> (messages authored by a person) - from:<@U0123456789> (messages authored by a user ID - user id can always replace @DisplayName ) - with:<@DisplayName> (DMs / 1:1 or group DMs including that person) - in:#channel-name (search within a channel by channel name) - in:<#C0123456789> (search within a channel by channel ID) - to:<@DisplayName> (search messages that the user sent to someone else in dm) "Has" / attribute filters - has:file (message contains an attached file, any type) - has:action (message contains an action item / action) - has:link (message contains a link) - has:pin (message is pinned) - hasmy::+1: (messages the user reacted to with :+1:, a thumbs up. Other emojis might be used if provided) File-type filters (do not invent any other type. If a user mention a type not in the list, just use the generic has:file instead) - type:lists - type:canvases - type:documents - type:emails - type:images - type:pdfs - type:presentations - type:snippets - type:spreadsheets - type:audio - type:videos State / context filters - is:saved (saved items ; use this when user asked for anything they saved) - is:thread (thread messages / within threads) - is:dm (direct messages) Text matching - keywords (space-separated = AND logic; OR for synonym expansion in pure keyword searches only) - "exact phrase" (quotes for exact phrase matching) Notes - Combine filters by space-separating them (implicit AND). - Prefer quoting proper nouns / project names (e.g., "Project Moonlight") - especially if the user put quotes themselves. Search Syntax Examples (main query, other extra queries for different terms will also be needed): - Find benefits update in the people-ops channel -> in:#people-ops benefits update - What has jane doe said in slack about vacation policy -> from:@jane.doe@company.com vacation policy - Surface me salary discussion I had in my dms -> is:dm salary - Summarize my saved slack messages with links -> has:link is:saved - What videos were posted in slack in january 2024? -> type:videos after:2024-01-01 before:2024-12-31 When to Use this function: Use this function for ANY company-related or informational query, including: - Vague company queries: "What is our parental leave policy?", "Tell me about benefits enrollment" - Company terminology: "What does PTO mean?", "Explain our performance review process" - Team/project information: "Who is on the HR team?", "What's the status of benefits renewal?" - Company policies: "How do I request time off?", "What's our remote work policy?" - General information: Any question that might be discussed in team communications

search_teams

ChatGPT
Search teams visible to the current user in their Workleap organization. When to use: - User asks about their teams, team structure, or team membership - User wants to know who manages a team or how many people are on it - User needs a team_id to pass to another tool (e.g., fetching team members) Do NOT use for: - Looking up a specific person's profile — use search_organization_members instead - Engagement scores or feedback for a team — use analyze_engagement or analyze_feedback - Finding who someone's reporting manager is — use search_organization_members Parameter guidance: - Omit search_term to see all visible teams - Use search_term when the user names a specific team (e.g., "Engineering", "QA Montreal") - Results capped at 50 teams. Use search_term to narrow if you hit the limit. On results: - Starred teams appear first. Synthesize results into readable prose — do NOT blindly list every team's full details. Highlight what the user asked about. - When the user asks a broad question ("what are my teams?"), give a concise overview (names, types, sizes) and offer to drill into any specific team. - Use team_id from the response to chain into other tools when the user wants more detail (e.g., team members, engagement data for that team). On error: Tell the user the team data could not be loaded and suggest retrying.

send_good_vibe

ChatGPT
Send a Good Vibe — an Officevibe recognition card — to one or more colleagues, as the current user. Use this when the user wants to send a Good Vibe, kudos, a shout-out, a thank-you, or recognition to someone: "send Lina a Good Vibe for launch week", "give kudos to the on-call team", "recognize Marc for the migration". Call list_good_vibe_prompts first and pass the chosen prompt's id and source; use "FromScratch" with your own prompt_text only when no catalog prompt fits. Look up each recipient's member id first; this tool does not resolve names. A sent Good Vibe reaches the recipients at once (and the whole organization when is_public is true); the user can edit or delete it later in Officevibe. Examples: - Public Good Vibe with a catalog prompt {"recipient_member_ids": ["<lina-member-id>"], "prompt_source": "Officevibe", "prompt_id": "<prompt-id>", "prompt_text": null, "message": "Lina, launch week only landed because you held the release together. Thank you.", "is_public": true} - Private Good Vibe to two people, prompt written from scratch {"recipient_member_ids": ["<marc-member-id>", "<ana-member-id>"], "prompt_source": "FromScratch", "prompt_id": null, "prompt_text": "Who kept the migration on the rails?", "message": "Marc, Ana, the cutover was flawless because you rehearsed it twice. Great work.", "is_public": false} This sends immediately with no review step. If the user asks for a draft or wants to review the text first, do not call this tool; write the draft as plain text instead.

set_review_answer

ChatGPT
Set or overwrite the answer to a single question on a Workleap Performance review. This is a WRITE operation. Use it only when the user has explicitly asked to record, update, or change an answer on a review they are authoring. Do not call this proactively as part of exploration. Required inputs: - review_cycle_id: the 24-char hex id of the cycle. Get from search_review_cycles or a prior search_reviews response. - reviewee_id: the UUID of the person being reviewed. Get from search_reviews — do not pass a name; the tool does not resolve names. - review_type: SelfReview, ManagerReview, PeerReview, or UpwardReview. - question_id: from search_reviews with include_answers=true on the same review. Without this, you cannot know which question the answer applies to. - answer: the text to save. An empty string is valid and clears the previously saved answer for that question. For Rating or single-select MultipleChoice questions, pass the choice id as a string. For multi-select MultipleChoice questions (allowMultiple=true), pass a comma-separated list of choice ids (e.g. "1,2,3"). Behavior: PUT semantics — calling again with the same (questionId, reviewType) overwrites the previous answer; passing an empty answer clears it. Examples: - Save my answer to question Q123 on my self-review {"review_cycle_id": "abc...", "reviewee_id": "<my-uuid>", "review_type": "SelfReview", "question_id": "Q123", "answer": "I delivered ..."}

set_review_context

ChatGPT
Update the review context snapshot for a Workleap Performance review. This is a WRITE operation. It stores one context section that supports a performance review (also known as "review context", "context snapshot", or "performance context"). Required inputs: - review_cycle_id: the 24-char hex id of the cycle. Get from search_review_cycles or a prior search_reviews response. - reviewee_id: the UUID of the person being reviewed. Get from search_reviews — do not pass a name; the tool does not resolve names. - review_type: SelfReview, ManagerReview, PeerReview, or UpwardReview. The section to write (one per call): - section.kind selects what it is: role, goals, one_on_ones, good_vibes, past_reviews, current_reviews, engagement, feedback, meetings, or external. - section.summary and section.detailed_context hold the content. - section.source is REQUIRED only when kind is "external" — a short, lowercase source name (e.g. jira, confluence, notion). - section.items are optional supporting items (only for goals, one_on_ones, good_vibes, past_reviews, meetings, and external); set highlighted=true on the key ones. For Workleap items set section.items[].id to the source record id (for past_reviews this is the review cycle id, with the cycle title as the item title) so the stored item links back to its record. Behavior depends on the overwrite flag: - overwrite=false (default): partial update (PUT semantics). Only the provided section is written; every other section is left unchanged. Calling again with the same kind overwrites it. - overwrite=true: full replacement (POST semantics). The snapshot is replaced with ONLY this section — everything else is wiped. Omit section entirely with overwrite=true to clear the whole snapshot. Use only when intentionally resetting. global_summary can be included alongside a section to provide an overall summary. Writing guidance: write one section per call. Partial updates (overwrite=false) accumulate, so this is safe and avoids exceeding the output budget and truncating the write.

share_review

ChatGPT
Share a submitted Workleap Performance review with its reviewee, making the content visible to them. This is a WRITE operation. Use it only when the user has explicitly asked to share or release a review they have authored. A review typically must be submitted (via submit_review) before it can be shared. Required inputs: - review_cycle_id: the 24-char hex id of the cycle. - reviewee_id: the UUID of the person whose review is being shared. Examples: - Share Alice's review with her {"review_cycle_id": "abc...", "reviewee_id": "<alice-uuid>"}

submit_review

ChatGPT
Submit a Workleap Performance review, transitioning it from in-progress to submitted. This is a WRITE operation with a state transition. Use it only when the user has explicitly asked to submit, finalize, or complete a review they are authoring. Submission typically requires all required questions to have been answered first via set_review_answer. Submitting an already-submitted review will fail; the tool surfaces the API error so the caller can decide whether to retry or notify the user. Required inputs: - review_cycle_id: the 24-char hex id of the cycle. - reviewee_id: the UUID of the person being reviewed. - review_type: SelfReview, ManagerReview, PeerReview, or UpwardReview. Examples: - Submit my self-review for the Q1 cycle {"review_cycle_id": "abc...", "reviewee_id": "<my-uuid>", "review_type": "SelfReview"} - Submit Alice's manager review {"review_cycle_id": "abc...", "reviewee_id": "<alice-uuid>", "review_type": "ManagerReview"}

update_action_item

ChatGPT
Save an edit to one of the user's action items as a single write; actions lists the field changes to make. This is a WRITE operation. Call it only when the user has explicitly asked to change an item — "mark X as done", "push the deadline on Y to Friday", "rename Z", "drop the due date on X". Needs the item's id. Each entry in actions picks one change through its action field and carries only that change's fields: a title, a description, a due date, a status, or the plan it belongs to. Only the item's creator can change its title, description, or due date; an assignee can change only its status. Editing a draft's title, description, or due date keeps it a draft; setting its status confirms it and puts it on each assignee's list. Deleting an item is delete_action_item. Linking an item to a plan, optionally under one of its phases, shows it on that plan. An item belongs to one place at a time, so linking replaces its current link: an item from a meeting leaves that meeting. Link only items the user means for the plan, such as ones you just created for it. Examples: - Mark it done {"action_item_id": "<id>", "actions": [{"action": "UpdateActionItemStatusAction", "status": "Done"}]} - Rename it and move the deadline to September 25 {"action_item_id": "<id>", "actions": [{"action": "UpdateActionItemTitleAction", "title": "Call the vendor"}, {"action": "UpdateActionItemDueDateAction", "due_date": "2026-09-25"}]} - Clear the due date {"action_item_id": "<id>", "actions": [{"action": "UpdateActionItemDueDateAction", "due_date": null}]} - Put it under the plan's first phase {"action_item_id": "<id>", "actions": [{"action": "SetActionItemReferenceAction", "plan_id": "<plan-id>", "phase_id": "<phase-id>"}]} - Take it off the plan {"action_item_id": "<id>", "actions": [{"action": "RemoveActionItemReferenceAction", "plan_id": "<plan-id>"}]}

update_calendar_event

ChatGPT
Change an existing calendar event on the current user's connected calendar — its time, title, agenda, location, how it repeats, or who is invited. Use this when the user wants to reschedule, move, push back, bring forward, change, rename, shorten, extend, edit, update, invite, or uninvite someone on something already on their calendar — for example "move my 1:1 with Alex to 3pm", "push Thursday's sync back an hour", "rename the weekly meeting to 'Team standup'", "add an agenda to tomorrow's review", "make my one-on-one with Jordan repeat every two weeks", or "invite Priya to the design review". This tool changes an event that already exists. To put something new on the calendar, use the create calendar event tool instead. To remove a meeting entirely, use the delete calendar event tool. Requires the event's id, which comes from a tool that read the event. Never invent or guess an id: a wrong id silently edits a different meeting and notifies its attendees. If you don't have one, read the event first. Only the event's organizer can change it. An edit to a meeting someone else organizes is refused outright, changing nothing and notifying nobody — so when you hold the id, call and report the refusal rather than guessing who organizes the meeting. Only the fields you supply change; everything else is left exactly as it was. An empty string blanks an agenda or a location — it is forwarded, not dropped. The calendar service may still refuse a blank, so offer it as something to try rather than a certainty, and report the rejection if one comes back. A title cannot be emptied, and a recurrence has no blank form: it can only be replaced with a different pattern. Changing who is invited works only by replacing the whole invite list. attendees must name everyone who should be on the event afterwards — by name or by member id, mixed freely; anyone left out is uninvited and told so. That makes "also invite Priya" dangerous, not simple. A calendar search may show an attendee list, but as a capped sample of email addresses, which cannot be turned into the member ids or names this tool takes — so you cannot reconstruct the resulting list from it, and a list holding only Priya uninvites everyone else. Ask the user who should be on the invitation and send exactly that, or leave attendees out and change nothing else. What changes depends on which id you send. An occurrence id moves that one meeting and leaves the rest of the series as it was; a series id changes every occurrence of it. "Move it to 3pm" almost never means every future occurrence, so establish which the user wants before writing. The closest one-on-one calendar events tool tells you which you hold. When it reports a series id alongside the occurrence id, ask the user whether they mean this one meeting or all of them, and send the id matching their answer. When it reports no series id, no id available to you is known to change only one meeting — say that the change may hit every occurrence and get the user's explicit agreement first, rather than promising a single-meeting edit you cannot guarantee. Examples: - Move my 1:1 with Alex to 3pm tomorrow {"calendar_event_id": "AAMkAD...", "calendar_integration_type": "outlook", "start": "2026-08-01T15:00:00", "end": "2026-08-01T15:30:00"} - Rename the weekly sync {"calendar_event_id": "AAMkAD...", "calendar_integration_type": "outlook", "subject": "Team standup"} - Add an agenda to the review {"calendar_event_id": "abc123", "calendar_integration_type": "google", "description": "1. Goals recap\n2. Feedback\n3. Next quarter"} - Make the one-on-one repeat every two weeks on Tuesdays {"calendar_event_id": "AAMkAD...", "calendar_integration_type": "outlook", "recurrence": {"frequency": "weekly", "interval": 2, "days_of_week": ["tuesday"]}} - The user confirmed the review should now be Alex and Priya only {"calendar_event_id": "abc123", "calendar_integration_type": "google", "attendees": ["Alex Chen", "Priya Nair"]} - The user confirmed the invite list, and an earlier result gave you one of their ids {"cale…

update_goal

ChatGPT
Save an edit to one existing Workleap Performance goal (or OKR) as a single write; actions lists the field changes to make. This is a WRITE operation. Call it only when the user has explicitly asked to change a goal. Each entry in actions picks one change through its action field, and then carries only the fields that change uses — the schema lists them per action, so there is nothing to guess. Three rules the schema cannot express: - ReviseGoalMeasurementAction replaces the whole measurement. Any field you leave out is cleared, including weight and link, so resend the measurement's current values for everything you are not deliberately changing. - Contributors exist only on a Team goal. On a Personal or Organization goal, AddGoalContributorsAction and RemoveGoalContributorsAction are accepted and then discarded, so set the goal's type to Team in the same call or tell the user those people cannot be added. - Sub-goal weights are fractions that must add up to exactly 1 (0.5 and 0.5 for two, not 1 and 1). Measurement weights are relative and need not add up to anything. A measurement_id or sub_goal_id must belong to this goal — an id from another goal is rejected. All actions are applied together. If any one is rejected, none of them take effect, so put every change the user asked for into a single call rather than calling this tool repeatedly. Editing a draft does not publish it. Examples: - Rename this goal to "Ship the new onboarding" {"goal_id": "<id>", "actions": [{"action": "UpdateGoalTitleAction", "title": "Ship the new onboarding"}]} - Set the goal to run from January to March and make it a team goal {"goal_id": "<id>", "actions": [{"action": "UpdateGoalStartDateAction", "start_date": "2026-01-01"}, {"action": "UpdateGoalEndDateAction", "end_date": "2026-03-31"}, {"action": "UpdateGoalTypeAction", "goal_type": "Team"}]} - Add a key result to reach 500 signups {"goal_id": "<id>", "actions": [{"action": "AddGoalMeasurementAction", "title": "Signups", "unit": "Numeric", "start_state": 0, "target_state": 500}]} - Hide this goal from everyone but its owner and contributors {"goal_id": "<id>", "actions": [{"action": "UpdateGoalVisibilityAction", "visibility": "OwnerAndContributorsOnly"}]} - Add Bob as a contributor {"goal_id": "<id>", "actions": [{"action": "UpdateGoalTypeAction", "goal_type": "Team"}, {"action": "AddGoalContributorsAction", "contributors": [{"contributor_id": "<bob-id>", "type": "Member"}]}]} - Drop a key result {"goal_id": "<id>", "actions": [{"action": "RemoveGoalMeasurementAction", "measurement_id": "<measurement-id>"}]}

update_meeting_additional_context

ChatGPT
Write the additional context of a Workleap meeting — what the organizer gives the agenda generator to work from, so a subject is waiting for them when the meeting comes around. Call it whenever the user parks something for a meeting that has not happened yet, in whatever words: - Asking to raise it: "bring this up at our next 1:1", "let's talk about the hiring plan on Monday", "add this to my next meeting with Ada", "remind me to discuss the budget", "note this for our sync", "put this on the agenda for Thursday". - Carrying it over from a meeting that ran out of room: "we never got to the roadmap", "I forgot to mention the deadline", "we ran out of time on this", "let's pick this up next time", "didn't get a chance to raise the promotion". This is a WRITE operation. Call it only when the user has asked to save, add to, or rewrite what a meeting should cover. Rules the schema cannot express: - additional_context is the field in full, not a patch. Always read the current context with search_meeting_agendas first — it comes back under ### Additional context — and send it back with the user's new point added after it. A meeting carries context from the moment it is scheduled, so assuming the field is empty is how a user loses what they parked last week. - Send only the new text when the user asked to replace what is there — "clear this and note that instead", "rewrite it as", "scrap what I put". Every other phrasing adds to the context and keeps what it already held. - The field is one markdown document, so everything the user raised in a turn goes in the same call. Give each subject its own bullet, or its own ## heading when it runs past a line. - Write in the user's own words and keep the detail they gave. "Discuss hiring" is useless to them in a week; "the designer backfill has been open 60 days and is blocking the team goal" is what they meant. - This is not the agenda body. Use update_meeting_agenda to write the talking points, sections, and notes that attendees read. Use this one to park what the agenda has not been written around yet. - Check the meeting's state first — search_meeting_agendas returns it as State. This tool is the right one while the meeting is Scheduled, which means no agenda exists yet and this context is what one will be generated from. - From Draft on, the meeting already has an agenda, and writing this field does not change it. The context feeds agenda generation, so a point added here reaches the user only if the agenda is generated again. Put the point on the agenda itself with update_meeting_agenda instead, and say that is what you did. - Only a meeting the user ORGANIZES can be written. When a write fails on a meeting someone else set up, tell the user that rather than retrying. Examples: - Bring up the designer backfill at our next 1:1 {"meeting_id": "<id>", "additional_context": "<everything the meeting already holds>\n- The designer backfill has been open 60 days and is holding the design team goal behind."} - We ran out of time on the roadmap, carry it to next week {"meeting_id": "<id>", "additional_context": "<everything the meeting already holds>\n- We did not get to the Q3 roadmap. Pick it up from where the priorities were left."} - Three things for Monday: the budget, Ada's promotion, and my time off {"meeting_id": "<id>", "additional_context": "<everything the meeting already holds>\n- Q3 budget: the numbers came in under, decide where the rest goes.\n- Ada's promotion: she has been acting in the role since June.\n- I am off the week of the 12th."} - Clear what I put on Monday's meeting and note this instead {"meeting_id": "<id>", "additional_context": "- Only the budget review."}

update_meeting_agenda

ChatGPT
Save the prepared content of one Workleap meeting as a single write: its agenda body, the records the agenda cites, its context themes, and the template it follows. Use it to save a drafted agenda, update one that exists, or write up prep for an upcoming meeting. This is a WRITE operation. Call it only when the user has asked to write, update, or save a meeting agenda. Each entry in actions picks one part of the meeting through its action field, and then carries only the fields that part uses — the schema lists them per action, so there is nothing to guess. A part with no action in the list is left as it stands. Rules the schema cannot express: - UpdateMeetingContentAction carries the agenda body in full, not a patch. Read the current agenda with search_meeting_agendas first, send every block it holds back with the id and the type it came back with, and change only what the user asked to change. Sending one new block on its own drops the rest, including notes the user typed by hand. - A <private_note> goes back as {"type": "private_note", ...}. Sent as a plain block instead, preparation the user wrote for themselves is published to every attendee. - An <action_item> goes back at its place as {"type": "action_item", "id": "<its id>", "content": "<its title>"}. The row is the action item itself, so it stays exactly as it is whatever text you send. Change an item's title, due date, or status with the action-item tools. Leaving a row out takes it off the agenda and keeps the item. This tool cannot place a new item in the agenda; create one with the action-item tools instead. - A block that came back marked is_creator="false" was written by someone else. Send it back unchanged. Asked to reword one, tell the user it is not theirs to edit rather than rewriting it for them. - Only a meeting the user ORGANIZES can be written. Performance refuses a meeting they merely attend, so when a write fails on a meeting someone else set up, tell the user that instead of retrying. - A point that rests on a record carries a [cit:N] marker at the end of the line, where N is that record's position in the citations of the UpdateMeetingCitationsAction you send in the same call — the first entry is [cit:1], the fourth is [cit:4]. The number counts the list, not the lines: it never restarts per block and never follows the order the points came out in. Two points resting on the same record carry the same marker, so send that record once and point at it twice. Before sending, check both directions — no marker reaches past the end of citations, and every entry has at least one marker pointing at it. - Each kind of record is cited by the keys it is actually addressed by, so use the shape that matches: {"type": "goal", "goal_id": "..."}, {"type": "recognition", "recognition_id": "..."}, {"type": "feedback", "feedback_id": "..."}, {"type": "meeting", "meeting_id": "..."}. The reader looks each of these up, so send the key alone and let it stay current. - A review is cited as {"type": "review", "review_cycle_id": "...", "reviewee_id": "..."}. A review has no id of its own — the cycle and the person reviewed are together what identify it. search_reviews returns both, as Review cycle ID and the id beside Reviewee. - Everything else is cited as {"type": "external", "source": "...", ...} with the title, author, and preview that let the user recognize it. Anything you can search is citable this way: a file, a Slack message, a Jira issue, a Confluence or Notion page, an email, or a web page. - The agenda body and the context themes answer different questions. The body is what will be discussed; the themes are where the person stands. Write the themes from what the records say about the person, not from the agenda you just drafted. A theme with no talking point behind it is expected — three weeks of leave explains a quiet dashboard and is never a topic of conversation. Themes that mirror the agenda one for one are the failure they exist to avoid. - Send three or four themes, two or three sentences each. Each one synthesize…

update_plan

ChatGPT
Edit an existing Workleap Performance plan (onboarding, offboarding, performance improvement, career growth, or custom plan) by applying a list of changes to it. This is a WRITE operation. Call it only when the user has explicitly asked to change a plan. Each entry in actions picks one change through its action field, and then carries only the fields that change uses — the schema lists them per action, so there is nothing to guess. Rules the schema cannot express: - Only a draft plan can change type. - A plan has one assignee. UpdatePlanAssigneeAction replaces the current one. - An archived plan cannot be edited. - This tool never creates, edits, or deletes action items, including those in a phase being removed. Use the action item tools for those. - A phase_id must belong to this plan — an id from another plan is rejected. Use the phase ids that create_plan or a previous update_plan call returned. The result lists the plan's phases with their ids after the change, including any phase just added. All actions are applied together. If any one is rejected, none of them take effect, so put every change the user asked for into a single call rather than calling this tool repeatedly. Editing a plan does not activate it or submit it for approval. Examples: - Rename this plan to "Engineering onboarding" {"plan_id": "<id>", "actions": [{"action": "UpdatePlanTitleAction", "title": "Engineering onboarding"}]} - Run the plan from November to January {"plan_id": "<id>", "actions": [{"action": "UpdatePlanStartDateAction", "start_date": "2026-11-01"}, {"action": "UpdatePlanTargetDateAction", "target_date": "2027-01-31"}]} - Make this a career growth plan for Bob {"plan_id": "<id>", "actions": [{"action": "UpdatePlanTypeAction", "plan_type": "CareerGrowth"}, {"action": "UpdatePlanAssigneeAction", "assignee_id": "<bob-id>"}]} - Add a "First 90 days" phase {"plan_id": "<id>", "actions": [{"action": "AddPlanPhaseAction", "title": "First 90 days"}]} - Drop the second phase {"plan_id": "<id>", "actions": [{"action": "RemovePlanPhaseAction", "phase_id": "<phase-id>"}]} - Rename the first phase to "Week one" {"plan_id": "<id>", "actions": [{"action": "UpdatePlanPhaseTitleAction", "phase_id": "<phase-id>", "title": "Week one"}]}

write_meeting_recap

ChatGPT
Write the recap of a Workleap meeting — one account of the conversation that happened, merged from the transcripts the user's notetakers recorded — together with the transcripts it read. This is a WRITE operation, and everyone who was in the meeting reads what it saves. Call it only when the user has asked for a meeting's recap to be written or rewritten. Rules the schema cannot express: - The recap replaces what the meeting holds, in full. Each run rewrites it from every transcript held, so this is never a create-once call, and the recap already on the meeting does not constrain the one being written. - Every source needs a recap; a recap needs no source. Sources describe a recap, so sources sent with no content are refused — there is nothing for them to attach to. Send a recap merged from transcripts together with those transcripts, in one call. sources names which transcripts were read, not which sentences of the recap survived from them, so a correction the user makes to a transcript-backed recap does not drop a transcript that was read; that a person shaped the result is recorded separately on the meeting. A recap written with the user, about a meeting nothing recorded, correctly carries no sources at all. - A notetaker that was reached and gave nothing goes in failed_providers with its reason, never into the recap's text. Unreachable is a call that errored, timed out or came back refused; NoMatch is a call that answered and held no transcript of this meeting. One whose tools are simply absent was never reached and belongs nowhere: absent tools mean there was nothing to read, which is not an outcome to report. - Keep notetaker names and transcript ids out of content. They travel as sources, where the meeting page can render them; an id written into the recap reaches an attendee who is not allowed to see one. - Only a meeting the user ORGANIZES can be written. Performance refuses a meeting they merely attend, so when a write fails on a meeting someone else set up, tell the user that instead of retrying. Examples: - Recap my 1:1 with Ada from this morning {"meeting_id": "<id>", "content": "They walked through the onboarding rollout, which ships Thursday. Hiring is the open question — the designer backfill is still unposted, and Ada is writing the req this week.", "sources": [{"provider": "Granola", "transcript_id": "<transcript-id>", "collected_at": "2026-09-15T14:00:00Z"}]} - Two notetakers recorded the same call {"meeting_id": "<id>", "content": "Budget took most of the hour: Q3 came in under, and the surplus moves to tooling. They left the headcount question for next week.", "sources": [{"provider": "Granola", "transcript_id": "<first-transcript-id>", "collected_at": "2026-09-15T14:00:00Z"}, {"provider": "Loom", "transcript_id": "<loom-video-ari>", "collected_at": "2026-09-15T14:02:00Z"}]} - The one notetaker held errored on the call {"meeting_id": "<id>", "failed_providers": [{"provider": "Granola", "reason": "Unreachable"}]} - The notetaker answered, and none of the records it returned was this meeting {"meeting_id": "<id>", "failed_providers": [{"provider": "Granola", "reason": "NoMatch"}]} - Write the recap the user dictated, from a meeting nothing recorded {"meeting_id": "<id>", "content": "They agreed to move the review to the following week and to keep the current goal set unchanged."}

Capabilities

InteractiveWrites

Example Prompts

Click any prompt to copy it.

App Stats

57

Tools

3

Prompts

ChatGPT

Platforms

Works with

ChatGPT

Data refreshed daily