MCP App Store
by KeenEthics
Business & Operations
Beeline Workspace icon

Beeline Workspace

by Beeline

Overview

Beeline is a workforce capability platform built for large, multi-site, distributed-frontline operators — retail, franchise, healthcare, and industrial teams training their own frontline workers. This connector gives Claude direct access to your Beeline workspace so you can manage and analyze your training operation without leaving the conversation. Build and edit courses (beelines): create sections, cells, assessments, and surveys, or generate new content from a plain-language instruction. Manage your org structure: create, move, rename, or merge learner groups, and move people between them. Design job roles with competencies and KPIs. Get insights on demand: completion and progression rates, at-risk learners and sites, practical assessment pass rates, learner feedback and sentiment, and competency gap analysis — broken down by any group tag (region, store format, area manager). Requires an existing Beeline workspace and admin-level access.

Tools

add_ai_narration

ChatGPT
Generate a metered voiceover and insert an ai_narration block. Full pipeline: use script if provided, otherwise draft a narration script from the cell (metered LLM) → TTS (metered per character against this workspace) → store audio Asset → insert Scope B ai_narration. Returns asset_id + final_audio_url — never raw audio bytes. Use list_narration_voices to find a voice. The voice must belong to the provider you pass; an unknown pairing is rejected up front rather than billed and synthesised in the wrong narrator's voice. Args: cell_id: SLATE cell to append into. script: Optional finished narration script. If omitted, drafted via AI. instruction: Hint for script drafting when script is omitted. voice: TTS voice (default nova). See list_narration_voices. provider: openai | elevenlabs | botlhale (default openai). speed: Playback speed 0.5–2.0 (default 1.0). language: Narration language label for the block. Defaults to the voice's own language, which is almost always what you want — a block whose language contradicts its voice cannot be edited in Build Mode afterwards. after_id: Optional block id to insert after. expected_version: Optional optimistic-concurrency guard.

add_beeline_to_library

ChatGPT
Publish a beeline into your workspace's internal library. create_beeline already places a new beeline in the workspace's default-internal library. Use this to (re-)publish one that isn't in it — e.g. a beeline created before that was automatic, or one a workspace admin previously removed. Admins may publish any beeline the workspace owns; other roles may publish beelines they keep. Idempotent. Args: beeline_id: The beeline to publish (from create_beeline / get_beeline_metadata).

add_build_file_source

ChatGPT
Copy one file the user attached in the chat into private Beeline storage and attach it as a source for a guest build. Args: guest_handle: from start_guest_build. source_file: the attachment reference the host supplies (download_url, file_id, optional mime_type, and file_name). file_name is required in practice: the file type is decided from its extension alone, and a missing name fails with unsupported_source_file. Extensions accepted: PDF, Office document (docx/pptx/xlsx), CSV, Markdown or plain text, up to 25 MB. Returns source_id, name, status. Errors: unsupported_source_file, source_too_large, source_extraction_failed, source_limit_reached, invalid_guest_handle, build_not_found, build_expired (a preview lasts 7 days by default), build_already_claimed.

add_build_text_source

ChatGPT
Attach pasted source material (policy text, an SOP, notes) to a guest build so its outline and lessons can cite it. Args: guest_handle: from start_guest_build. text: 1-100,000 characters. name: label shown in the preview. Returns source_id (use it in source_reference_ids), name, status. A build holds at most 5 sources. Errors: invalid_source_text, source_limit_reached, invalid_guest_handle, build_not_found, build_expired (a preview lasts 7 days by default), build_already_claimed.

add_build_url_source

ChatGPT
Fetch and attach a public web source. Local/private addresses are blocked.

add_cell

ChatGPT
Add a content cell to a section of a beeline. Args: beeline_id: The beeline to edit. section_id: The section to add the cell into (from get_beeline_structure). cell_type: One of SLATE (rich text), DIRES (digital resource), BEELI (linked beeline), ASSES (assessment), SCORM, FDBK (feedback), PERF (performance review), PRACT (practical assessment), SURV (survey). Use add_section for a section — FRAME is not a valid cell_type here. name: Cell name (optional). index: Zero-indexed position within the section (defaults to the end). expected_version: Optional optimistic-concurrency guard.

add_comparison_block

ChatGPT
Generate and insert a comparison block (Good/Bad Manager, Do/Don't). Side-by-side paired behaviors — not flip boxes. Defaults labels to 'Bad Manager' / 'Good Manager' when omitted. Prefer this over generate_block for contrast pedagogy. Gated on the org's AI token budget. Args: cell_id: SLATE cell to append into. instruction: Topic for the pairs, e.g. "good vs bad feedback habits". left_label: Left column label (default 'Bad Manager'). right_label: Right column label (default 'Good Manager'). after_id: Optional block id to insert after. source_reference_ids: Optional ContentSource ids to ground generation. expected_version: Optional optimistic-concurrency guard.

add_digital_resource_cell

ChatGPT
Add a digital-resource (DIRES) cell to a beeline section from an already- uploaded file, in one shot: it creates the learner-facing resource AND mints the file's ContentSource fuel (embeddings + competency-ready). Returns the new cell_id and the content_source_id — feed the latter into generate_block to write the surrounding beeline grounded in this file. Args: beeline_id: The beeline to add the resource cell to. section_id: The section it goes in (from get_beeline_structure). file_key: Storage key of the already-uploaded file. name: Optional cell/resource name (defaults to the file name).

add_flip_boxes

ChatGPT
Generate and insert a flip_boxes interactive block (front/back cards). Prefer this over generate_block when the user wants flashcards / reveal cards — it constrains the AI to emit a valid flip_boxes payload (≥2 cards). Gated on the org's AI token budget. Args: cell_id: SLATE cell to append into. instruction: What the cards should cover, e.g. "feedback vocabulary". after_id: Optional block id to insert after. source_reference_ids: Optional ContentSource ids to ground generation. expected_version: Optional optimistic-concurrency guard.

add_question

ChatGPT
Add a question to an assessment cell. The linked assessment is created automatically if the cell doesn't have one yet. Args: cell_id: The assessment (ASSES) cell to add the question to. question_type: The 4-letter code. Assessment-gradable types: MUCQ (multiple choice), SHAN (short answer), DDMQ (drag & drop match), DTWQ (drag the word), ORDQ (ordering). Also valid: TEFE (true/false), ACKN (acknowledgement). json_content: The question body, validated against its type. For MUCQ: {"question_text": "...", "options": [{"text": "...", "is_correct": true}, ...]}. An invalid payload is rejected (invalid_question) and nothing persists. points: Marks for this question (membership points; default 1). repeat: Create spaced-repetition items (default false for assessments). gradable: Whether the question is gradable. required: Whether answering is required to progress. expected_version: Optional optimistic-concurrency guard (vs content_version).

add_section

ChatGPT
Add a new section (a FRAME container) to a beeline. Args: beeline_id: The beeline to edit. name: Section title (defaults to "New Section"). index: Zero-indexed position among sections (defaults to the end). expected_version: Optional — the graph_version you last read; the edit is rejected (stale_version) if the beeline changed since.

add_survey_field

ChatGPT
Add a field to a survey cell. The linked survey is created automatically if the cell doesn't have one yet. An id is assigned to the field for you. Args: cell_id: The survey (SURV) cell. field: The field object, e.g. {"label": "How did it go?", "type": "text", "required": true}. Shape is frontend-defined; an id is added. expected_version: Optional optimistic-concurrency guard.

attach_source

ChatGPT
Ingest an already-uploaded file (by its storage key) as a ContentSource — embedded, queryable, competency-attachable AI fuel — scoped to this org. The bytes are NOT copied; only the extracted text + embeddings are derived. Returns the content_source_id, which you can then pass as a source_reference_ids entry to generate_block / rewrite_block to ground generation in this material. Idempotent: re-ingesting the same file in the same org returns the existing source. Non-text files (video/audio/image) are skipped (no extractable text). Args: file_key: Storage key of an already-uploaded file (from the normal presigned-upload flow). Bytes-over-MCP is intentionally not supported. name: Optional display name (defaults to the file name).

bulk_create_groups

ChatGPT
Create several learner groups at once. Admin-only. Each item is an object with the same fields as create_group: {name, classification, parent_group_id?, location_kind?, latitude?, longitude?, start_date?, end_date?}. parent_group_id must be an ALREADY- EXISTING group (you cannot reference a sibling being created in the same call by id) — to build a nested hierarchy, create the parent groups in one call, then their children in a follow-up call using the returned ids. Invalid rows (unknown classification, cross-org parent, too-deep) do NOT fail the whole batch — they come back as warnings; the valid rows still preview/create. Call without confirm to preview; confirm=True to create. Args: groups: List of group objects (see above). confirm: False (default) previews; True creates the valid rows.

bulk_edit_groups

ChatGPT
Apply the same change to many groups at once. Admin-only. Set one classification on all the given groups and/or add/remove tags (all by NAME). At least one of classification / add_tags / remove_tags is required. All group_ids must be in your workspace — a foreign id fails the whole call (nothing is changed). Call without confirm to preview; confirm= True to apply. Args: group_ids: The groups to edit (must all be in your workspace). classification: Classification NAME to set on every group. add_tags: Tag NAMES to add to every group. remove_tags: Tag NAMES to remove from every group. confirm: False (default) previews; True applies.

compare_groups

ChatGPT
Side-by-side comparison of 2–10 groups — the exec "which of our regions/stores/franchises is winning, and which is dragging" view. Returns per-group completion, assessment score, overdue, active-7d/30d, and role mix, PLUS cross-group ranks/percentiles and best/worst performer per metric, and metric_definitions describing each field it returns. completion_pct here is the SHARE OF PEOPLE fully complete, not average progress — a group where everyone is 90% done scores 0. This payload carries no average-progress figure at all; for completion and progression side by side use get_group_dashboard. Each group's numbers already include its descendant-group members (automatic rollup). ⚠️ So if one compared group CONTAINS another, their shared members are counted on both rows: the response then carries overlapping_groups and an overlap_warning, and those rows should be reported as nested views rather than separate populations. Pairs with the visualize skill for a ranked comparison chart. Admin, or a manager of every group in the list. Args: group_ids: 2–10 group ids to compare (from get_group_dashboard).

confirm_proposal

ChatGPT
Confirm a reviewed proposal and apply it. role_pack: admin-only; enqueues apply_role_pack_proposal. zeno_action (a change Zeno prepared, e.g. a "Fix it" from conductor_preview): an admin, or a manager whose places cover it, may confirm. It runs as YOU, now — status comes back applied, or failed with the reason. Other kinds (e.g. quest_pack) are not supported via MCP yet. Args: proposal_id: UUID of the proposal in proposed/edited status.

create_beeline

ChatGPT
Create a brand-new, empty beeline (one empty section) in your workspace. This is the starting point when there's no existing beeline to edit — the agent's first move when building something from nothing. Use the returned beeline_id / section (the one entry in structure) with add_cell to start filling it in. Args: name: Beeline title (defaults to "New Beeline"). description: Optional beeline description.

create_group

ChatGPT
Create one learner group in your workspace. Admin-only. Call once WITHOUT confirm to preview what would be created (no changes made), then again with confirm=True to actually create it. Args: name: The group's name. classification: The classification NAME (e.g. 'Location', 'Role', or a custom one). Must already exist in your workspace. parent_group_id: Optional parent group to nest this under (max 9 levels). Omitted for a Location group, it goes under the whole-company group. location_kind: Optional — 'CONTAINER' (region/division folder) or 'SITE' (operational store/branch). latitude / longitude: Optional GPS coordinates for a site. start_date / end_date: Optional cohort dates (YYYY-MM-DD). confirm: False (default) returns a preview; True performs the creation.

create_role_pack_proposal

ChatGPT
Create a Role Pack proposal from JDs or a hand-authored plan. Admin-only. Provide at least one of pasted_text, file_keys, or plan. Without `plan, creates status=generating, ingests sources, and enqueues async generation — poll get_proposal until status is proposed. With plan`, skips generation and stores a validated RolePackPlan as status=edited (recovery when generation fails). Args: pasted_text: Free-text job descriptions / role notes. file_keys: Storage keys of already-uploaded JD files in this workspace (from the normal upload flow). Bytes-over-MCP is not supported. framework_name: Optional suggested competency framework name. plan: Optional full RolePackPlan (see patch_proposal_plan). When provided, generation is skipped.

delete_cell_block

ChatGPT
Delete a content block by id. Args: cell_id: The cell to edit. block_id: Id of the block to delete. expected_version: Optional optimistic-concurrency guard.

delete_group

ChatGPT
Permanently delete a group; its sub-groups move up to the deleted group's parent (never orphaned). The whole-company group cannot be deleted. Admin-only. This is DESTRUCTIVE and cannot be undone — to temporarily hide a group instead, use edit_group with active=false. Call without confirm to preview (how many sub-groups and members are affected); confirm=True to delete. Args: group_id: The group to delete. confirm: False (default) previews; True permanently deletes.

delete_question

ChatGPT
Remove a question from an assessment cell. This detaches it (and preserves any learner response history), it does not hard-delete the question. Args: cell_id: The assessment cell. question_id: Id of the question to remove. expected_version: Optional optimistic-concurrency guard.

delete_survey_field

ChatGPT
Remove a field from a survey cell by id. Args: cell_id: The survey cell. field_id: Id of the field to remove. expected_version: Optional optimistic-concurrency guard.

diagnose_gaps

ChatGPT
WHY is this person or team behind? Fused multi-signal gap diagnosis. Runs the platform's gap-detection engine across up to five evidence signals — role requirements (required vs actual level), assessment failures (the EXACT questions they get wrong, with common wrong answers), knowledge decay (overdue spaced-repetition reviews), Capability Studio targets, and the latest completed performance review (learner subjects) — then fuses them per competency. A gap flagged by multiple signals ranks above any single-signal gap. Subjects: pass user_id for one learner, group_id for a group (its descendant groups roll up automatically), role_id for the people who currently hold a job role, or none for org-wide (admin) / across your managed groups (manager). A role's population is its live holders (active or primary assignment, active membership; holders still in onboarding count), scored on THAT role's requirements only — a holder's other roles do not bleed in. A manager sees only holders inside their managed groups. Pass at most one of user_id, group_id, role_id. The signals block reports each detector's status (found_gaps / no_gaps / no_data / not_configured / unsupported_for_subject) so silence is never mistaken for a clean bill. Args: user_id: Diagnose one learner (admin, or their manager). group_id: Diagnose a group's cohort (admin, or its manager). role_id: Diagnose the holders of one job role (UUID; admin, or a manager for the holders in their managed groups). include_descendants: Include descendant groups' members (default true). top_n: How many top-ranked gaps to return in the curated view. full: Return every raw fused gap instead of the curated summary.

dismiss_signal

ChatGPT
Dismiss one signal so it leaves the list. It comes back on its own if the number of people missing it grows by half or more, or if it is still there after 30 days. Args: signal_id: The signal's id, from list_signals. confirm: True (the default) dismisses. False only previews which signal would be dismissed, and changes nothing.

duplicate_beeline

ChatGPT
Clone an existing beeline into a new, independent copy in the same content library — a fast way to start from a known-good template instead of building from scratch. This only clones content. It does NOT reassign the copy to a different group/branch — assignment is a separate workflow this connector doesn't expose yet. Args: beeline_id: The beeline to duplicate.

edit_group

ChatGPT
Edit one learner group's fields. Admin-only. Only fields you pass (non-null) are considered; unchanged ones are left alone. To MOVE a group to a different parent use move_group, not this — reparenting has its own preview (subtree size). Call without confirm to preview the exact field changes; confirm=True to apply. Args: group_id: The group to edit. name: New name. classification: New classification NAME (must exist in your workspace). active: Set active/inactive. location_kind: 'CONTAINER' or 'SITE'. latitude / longitude: GPS coordinates. start_date / end_date: Cohort dates (YYYY-MM-DD). confirm: False (default) previews; True applies.

find_content_using_source

ChatGPT
Find beelines/cells grounded in a given content source. The response keeps the contract-tier vs best-effort split from the impact query, but filters beelines to the ones the caller can actually access. Args: content_source_id: Source to inspect.

find_group_by_name

ChatGPT
Resolve a group NAME to its id, org-scoped. Read-only. Every group tool here takes group_id, but people refer to groups by name — this is the missing step between the two. Returns EVERY match rather than picking one: an exact match and a same-named group in another part of the tree are indistinguishable from a name alone, and choosing between them is the caller's job, not this tool's. Exact (case-insensitive) matches are returned alone when any exist; only when there are none does this fall back to a contains search, so a group called "Sales" is never buried under "Sales - North" and "Sales - South". Args: name: The group name, or part of it. include_inactive: Also return deactivated groups. Default False.

generate_block

ChatGPT
Generate new Slate content block(s) from a plain-language instruction and insert them into a cell — the AI writes the content, the engine validates, versions, and persists it. Gated on the org's AI token budget. Anchor where the new blocks land with exactly one of after_id, before_id, or position ('prepend' | 'append', the default). Args: cell_id: The cell to add generated content to. instruction: What to write, e.g. "a 3-paragraph intro to food hygiene". source_reference_ids: Optional ContentSource ids to ground the generation in (retrieval-augmented); the content is written from those sources. after_id: Insert directly after this block id. before_id: Insert directly before this block id. position: 'prepend' or 'append' (used when no after_id/before_id). title: Optional title/topic hint for the generator. expected_version: Optional optimistic-concurrency guard (vs content_version).

get_activity_report

ChatGPT
Headcount movement and dormancy — who joined recently, who has gone quiet. The questions a completion dashboard can't answer. Returns new_users (joined the WORKSPACE in the last 7/30/90 days — joining or moving group is not being new) and inactive (last active longer than 30/60/90 days ago, INCLUDING people who have never been active at all), over the active member population. Both sets are cumulative thresholds, not disjoint buckets: someone inactive for 90 days is also counted in the 60d and 30d figures. Args: group_id: Optional group to scope to. Omit for org-wide (admin) or your managed groups (manager).

get_assessment_scores

ChatGPT
Theory (quiz) assessment scores across the workspace. Two modes: - by_learner (default) — one row per person: quizzes taken, quizzes passed, average score and pass rate. The "who is struggling on assessments" view, worst average first. - by_attempt — one row per attempt: learner, quiz, score, pass/fail, when. The drill-down for a specific quiz or person. Scores are 0-100 here, unlike practical assessments which are 0-1 — the response declares score_scale. By default only each learner's LATEST attempt per quiz counts, which is the honest "what did they score"; pass latest_only=false for full retry history. ⚠️ Data-quality caveat, please pass it on: these warehouse scores were repaired after a fault that made them read as zero, and they have NOT yet been reconciled against the source assessment records. Treat them as indicative and say so when you report them — do not present them as verified figures in a board pack or a client report until the parity check has been completed. Args: mode: 'by_learner' (default) or 'by_attempt'. group_id: Optional group to scope to. Omit for org-wide (admin) or your managed groups (manager). learner_id: Optional single learner (by_attempt mode). assessment_id: Optional single quiz (by_attempt mode). latest_only: Count only the latest attempt per learner+quiz (default). page / page_size: Pagination (page_size max 200).

get_at_risk

ChatGPT
Who needs attention right now — the groups (or learners) furthest behind, worst first, each with a one-line reason. A ranking over the same warehouse figures get_group_dashboard and list_learners return; no new or invented score. Groups are ranked by users_fully_complete_pct ascending, tie-broken on avg_user_progress_pct; groups with no users are excluded (they read as 0% while representing nobody) and counted in excluded_empty_groups. ⚠️ This ranking is about GROUPS, not a verdict on the people in them. users_fully_complete_pct counts users who are 100% done on ALL content assigned TO THAT GROUP, so a group whose members are trained through their store/role groups appears at "0%" while those same users are fully complete on their own totals. Each row carries assignment_scope saying which denominator it used, and avg_user_progress_pct distinguishes "nobody has finished yet" (real progression, mid-flight) from "nothing is happening" (progression also ~0). Check both before calling a group the worst in the org. In learners mode rows are USER-level: user_fully_complete is the all-or-nothing flag and user_content_completed_pct is that person's partially-credited %, over ALL content assigned to them. Learners are ranked by user_content_completed_pct ascending, tie-broken on user_avg_progress_pct ascending; people with nothing assigned rank last (their 0% is "0 of 0", not falling behind). Args: mode: 'groups' (default — which stores/regions are behind) or 'learners' (which individuals are behind). top_n: How many rows to return (max 25).

get_beeline_metadata

ChatGPT
Get a beeline's settings: name, description, status, structure type, language, delivery method, certificate configuration, and the Instructional Design Canvas learning outcomes. Use this alongside get_beeline_structure (which returns the cell/section tree) when you need full context before editing, and as the read half of the read-modify-write pair with update_beeline_metadata. Args: beeline_id: The beeline to read.

get_beeline_structure

ChatGPT
Read a beeline's structure: its ordered sections, each with the ordered cells it contains (cell_id, name, type, order) plus the current graph_version. Use this first when editing a beeline's shape — the cell_id / section_id values it returns are how you address things in the structure-edit tools, and the graph_version is what you pass as expected_version to guard against conflicts. Args: beeline_id: The beeline to read.

get_build_preview

ChatGPT
Read a guest build's current outline, attached sources, claim state and, once claimed, its Beeline link. Read-only. Args: guest_handle: from start_guest_build. Errors: invalid_guest_handle, build_not_found, build_expired.

get_capability_gaps

ChatGPT
Where are the capability gaps across your org (or a group)? — the exec/CEO view. Aggregates assessment performance up to COMPETENCIES (via the gap-analysis engine) so you see "the org is weak on Regulatory Compliance" rather than "question 123 fails a lot", with an AI thematic narrative and strategic recommendations. Returns summary counts (competencies analysed, critical/high gaps, mapping coverage), the top competency gaps (name, failure rate, learners affected, severity, knowledge-vs-performance split), the thematic insights narrative, and recommendations. Scoped to a group (its whole subtree) when given, else the whole org. Admin, or a manager of the group. PR-FAQ (CAPABILITY surface, per CLAUDE.md): a Tuesday-morning ops director / CEO can ask "what are our biggest capability gaps and what should we do about them?" and get a ranked, competency-level answer with a narrative and next steps — something no existing report or dashboard surfaced; it turns raw assessment failures into a strategic capability readout that targets where to invest training next. Args: group_id: Optional group to scope to (otherwise your groups / whole org). include_descendants: If true (default), a group_id includes its subtree. top_n: How many top competency gaps to return in the curated view. include_insights: Generate the AI thematic narrative (default true). Set false for a faster numbers-only read. full: Return the complete gap report instead of the curated summary.

get_cell_blocks

ChatGPT
Read a cell's content as a list of Slate blocks, each with a stable id. Use this first — the ids it returns are how you address blocks in the edit tools (replace/insert/delete/move/update). Args: cell_id: The cell to read.

get_competency_frameworks

ChatGPT
List competency frameworks for your connected workspace. Returns frameworks with their competencies, dimension weights, XP requirements, and prerequisite chains.

get_content_report

ChatGPT
Per-course completion across the workspace library — which courses are landing and which are dead stock. One row per beeline with assigned, completed, completion_pct, avg_progress and completed_last_30d over the active member set, plus provenance and content type. This is the reporting view of the library; the Build tool list_beelines returns metadata only (no numbers), and get_program_report drills ONE course down by group. completed_last_30d is the freshness signal: a course with a big completed total but zero recent completions is dead stock, not a success. Use it to separate "actively landing" from "finished long ago". Args: group_id: Optional group to scope the population to (its subtree). search: Filter by course name. content_type: 'Practical' (has a practical cell) or 'Theory'. sort: Service sort key; defaults to name.

get_feedback

ChatGPT
Learner feedback on content — star ratings AND free-text comments, enriched with AI sentiment and category analysis. Returns the paginated feedback rows plus a dataset-level analysis block (sentiment and category breakdowns computed over the whole filtered set, not just the page) and top-performing content. A group scope rolls up descendant groups automatically. Use this for "what are people actually saying about our training" — the sentiment/category split answers it faster than reading every comment. Args: group_id: Optional group to scope to (its whole subtree). Omit for org-wide (admin) or your managed groups (manager). page / page_size: Pagination (page_size max 100). rating: Filter to one star rating, 1-5. sentiment: Filter by AI sentiment label. category: Filter by AI category label. beeline_id: Only feedback on this beeline's cells.

get_group_dashboard

ChatGPT
Group completion & progression dashboard for your workspace, from the Insights warehouse. Group metrics roll up descendant-group members automatically. Returns org summary, classification_counts, and a per-group list. Every group carries FOUR distinct, separately-named measures — do not conflate them: - users_fully_complete_pct / users_fully_complete_count — % and count of USERS in scope who are fully complete. Fully complete = 100% of ALL their assigned content, all-or-nothing, no partial credit. - group_fully_complete (bool) — true only when EVERY user in the group is fully complete; null when the group has no users in scope. - avg_user_progress_pct — average PROGRESSION, not completion. A group at 0% users_fully_complete_pct with a healthy avg_user_progress_pct is mid-flight, not failing. - plus user counts, overdue, and practical-review backlog. summary.new_learners_30d (+ _pct) = users in scope who joined the WORKSPACE in the last 30 days. Joining or moving group is not new. Org-wide it equals get_activity_report's new_users['30d']. summary.groups_fully_complete_count rolls the group flag up. Every field's meaning is restated in the response's metric_definitions. ⚠️ Read users_fully_complete_pct as a statement about the GROUPING, not the people: it counts only content assigned to that group, so a group whose members are trained via their store/role groups reads 0% while those same people are 100% complete on their own totals. Say which you are quoting. Managers see only their managed groups. Args: classification_system_type: Optional filter — 'LOC' (locations), 'ROL' (roles), or 'GEN' (general/custom). Omit for all. group_by_tag_category: Optional tag-category slug (from list_group_tags) to ALSO return a by_tag rollup — one bucket per tag value in that category, aggregating every group carrying the tag. This is how you answer "break completion down by area manager / store format / region" when that cut is a tag rather than a group classification. A group carrying two tags in the category counts in both buckets; groups with no tag in the category land in an "Untagged" bucket.

get_group_detail

ChatGPT
Detailed completion & progression for one group (INCLUDING its descendant-group members — rollup is automatic), from the warehouse. summary is GROUP-level: users_fully_complete_pct / users_fully_complete_count (users who are 100% done on ALL their assigned content — all-or-nothing, no partial credit), group_fully_complete (true only when EVERY user in scope is fully complete; null for an empty group), avg_user_progress_pct (progression, NOT completion), active_7d/30d, overdue, avg assessment. learners rows are USER-level and use a different vocabulary on purpose: user_fully_complete (the all-or-nothing flag for that ONE person — this is the field that used to be misnamed is_group_complete) and user_content_completed_pct (their partially-credited %). assignment_scope says which denominator this group's numbers count — assigned_to_this_group_only, or all_content_assigned_to_user when the group resolves to "all content" access — and the assigned/completed field names follow it (beelines_assigned_to_group vs beelines_assigned_to_user). Read it before quoting a percentage: a group-scoped 0% means nothing was assigned THROUGH THIS GROUP, not that the people are behind. metric_definitions restates every field. For the full paginated learner list use list_learners. Args: group_id: The group to drill into (its whole subtree rolls up). learner_sample_size: Max learner rows to include (default 50). include_contact: If true, keep emails/phones. Default omits them (names and user ids stay — enough to say who is behind).

get_group_move_status

ChatGPT
Poll the status of a background group-member move started by move_group_members (returned when a move affects more than 25 people). Admin, or a manager of both groups involved in that move. Args: job_id: The job_id returned by move_group_members.

get_job_role

ChatGPT
Get one job role with dual-mode KPIs, competencies, and standards. KPI payloads include evaluation_mode (metric_only | scale_only | both), metric bands, and review scale config when present. Cross-org ids return role_not_found (no existence leak). Args: role_id: Job role UUID in your connected workspace.

get_learner_competency_snapshot

ChatGPT
Get a learner's competency levels across all competencies in your workspace. Returns per-competency knowledge XP/level, performance XP/level, and overall weighted level. Includes quadrant classification (Master, Theorist, Practitioner, Novice). Args: user_id: The learner's user ID.

get_learner_summary

ChatGPT
A rich single-learner summary, drawn from the profile service — job role & KPIs, performance-review scores, learning completion, streak, recognition/rank, certifications, assessment history, and a rule-based coaching insight. Admin, or a manager of a group the learner is in. The learning block is USER-level and counts ALL content assigned to this person across every group membership and direct assignment — NOT one group's slice, which is why a person can be user_fully_complete: true here while a group they belong to reports 0% (see get_group_detail): beelines_assigned_to_user / beelines_completed_by_user, user_content_completed_pct (partial credit) and user_fully_complete (all-or-nothing: 100% of ALL their assigned content; null when they have nothing assigned). metric_definitions restates each field. For the 2D competency picture (Knowledge×Performance, quadrant, XP), use get_learner_competency_snapshot(user_id) — this summary intentionally doesn't duplicate it. Args: user_id: The learner's user id (e.g. from list_learners). full: If true, return the complete profile payload instead of the curated summary. include_contact: If true, include the learner's email. Default omits contact identifiers — name and user_id are enough to identify them.

get_practical_summary

ChatGPT
Practical-assessment (observed, hands-on) reporting: pass rates, failures, awaiting-review backlog, and average scores. Two modes: - No learner_id → org-wide summary. Admin only — the underlying warehouse aggregate has no group filter, so there is no correct way to narrow it to a manager's stores. - With learner_id → that one learner's full attempt history grouped by practical assessment, including redo chains. Admin, or a manager of a group the learner is in. Scores here are 0-1 (a practical overall_score), NOT the 0-100 scale theory assessments use — don't average the two together. Args: learner_id: Optional learner (e.g. from list_learners) to drill into instead of returning the org summary.

get_program_report

ChatGPT
Completion & progression for one program (beeline) — overall and broken down by group — from the Insights warehouse. With include_learners, also WHO: one row per learner, by name. overall gives the whole scoped cohort's learners_assigned, learners_completed, completion_pct, and avg_progress (progression, 0-100). by_group lists per-group completion. When scoped to a group, descendant-group members are included (default). learners (only when include_learners or learner_status is given) answers "who has / hasn't completed X" — e.g. who has acknowledged a policy. It is {total, page, page_size, status_counts, results}; each row is learner_id, learner_name, status ('completed' / 'in_progress' / 'not_started'), progress_pct (0-100), completed_at (ISO, completed rows only) and assigned. Rows are the learners assigned this beeline plus anyone in scope who completed it without a current assignment (assigned: false) — the same people overall counts. status_counts covers the whole scoped population, before learner_status filtering and paging. Managers see only learners in their managed groups. No emails or phone numbers are returned. Note: this reports at the beeline (program) level. Per-cell reporting is not exposed yet. Args: beeline_id: The beeline (program) to report on. Must be in your workspace. group_id: Optional group to scope to (otherwise your groups / whole org). include_descendants: If true (default), a group_id also includes learners in its descendant groups. include_learners: If true, add the per-learner learners block. learner_status: Only list learners in this state — 'completed', 'in_progress' or 'not_started' (implies include_learners). Unknown values are rejected. page / page_size: Pagination for learners.results (page_size max 100).

get_proposal

ChatGPT
Fetch a proposal's status, plan summary, progress, and applied_refs. Admin-only. Unknown or other-org proposal ids return proposal_not_found (no existence leak). Args: proposal_id: UUID of the proposal.

get_role_competency_gaps

ChatGPT
Analyze competency gaps: required levels vs actual levels in your workspace. Can scope by role (show all learners in that role) or by user (show all role requirements for that user). Returns gap size and whether each competency requirement is met. Args: role_id: Optional job role UUID to analyze. Shows all learners assigned to this role. user_id: Optional user ID to analyze. Shows all role requirements for this user. At least one of role_id or user_id must be provided.

ingest_content_source

ChatGPT
Ingest source material into the workspace's canonical fidelity stack. Provide exactly one input: pasted `text, a safe public url, an existing workspace Asset file_key (discoverable with search_workspace_content), or an MCP attachment file_reference. The attachment shape is {download_url, file_name, mime_type?}`; it is downloaded with redirect-by-redirect SSRF checks and a 25 MB cap, stored once as a private org Asset, then extracted. Documents use the existing structured extractor, embeddings, and feature-gated embedded-image Asset pipeline. Returns stable source/asset ids and provenance, never private URLs. Args: name: Optional display name (maximum 255 characters). text: Pasted source text (maximum 100,000 characters). url: Public HTTP(S) web page or text URL; private/local hosts are blocked. file_key: Existing file key from an Asset in this workspace. file_reference: MCP attachment with download_url, file_name, mime_type?. purpose: beeline, cell, enrich, ref (default), or general. generate_embeddings: Generate retrieval embeddings now (default true). extract_source_assets: Extract embedded PDF/PPT images when the workspace feature is enabled (default true; file inputs only).

insert_cell_block

ChatGPT
Insert new block(s) into a cell. Give AT MOST ONE anchor — after_id, before_id, or position ('prepend' | 'append'). Omit them all to append to the end of the cell, which is the common case. Passing two is rejected as ambiguous. Args: cell_id: The cell to edit. new_blocks: Slate block objects to insert (each {"type": ..., "children": [...]}). A callout's "variant" must be one of note|tip|warning|danger|mistake|think|didyouknow (info/success are rejected) or set an "icon". Common types: p, h2, h3, quote, callout, ul, ol, code, divider, image, flip_boxes, tabs, accordion, timeline, comparison, table, learner_checklist, todo_turbo. Lists nest list-item children; read an existing block with get_cell_blocks and copy its shape for anything beyond plain text. after_id: Insert directly after this block id. before_id: Insert directly before this block id. position: 'prepend' (start) or 'append' (end). expected_version: Optional optimistic-concurrency guard.

list_beelines

ChatGPT
List beelines in your workspace library. Use this to discover beeline IDs before using get_beeline_structure, get_beeline_metadata, or any editing tool. Args: search: Optional name substring to filter by (case-insensitive). status: Optional status filter — BACKLOG, DRAFT, REVIEW, PUBLISHED, ARCHIVED. page: Page number (1-indexed, default 1). page_size: Results per page (max 50, default 20).

list_group_tags

ChatGPT
The workspace's group-tag vocabulary — the labels you can segment reporting by, grouped into categories. Tags are how an org models cuts that aren't its group hierarchy: an area manager's portfolio, store format, region, brand. Returns {tags: [{key, label, values: [{id, name, color, usage_count}]}]} where key is the category slug you pass to get_group_dashboard(group_by_tag_category=...) and name is what you pass to list_learners(tags=[...]). Call this first when a user asks for a breakdown "by <something>" that isn't a group classification — it tells you whether that cut exists and what it's called here, instead of guessing.

list_job_roles

ChatGPT
List job roles in your connected workspace. Returns each role's id, name, description, KPI count, and competency count. Use get_job_role for the full dual-mode KPI + competency payload before proposing changes via create_role_pack_proposal.

list_learners

ChatGPT
List and SEGMENT learners with completion & progression, from the warehouse. The workhorse for people-and-place questions — "how many baristas per store", "who's dormant in the Kiosk sites", "everyone scoring under 50". Returns {total, limit, offset, results, kpis}. Each row is USER-level, over ALL content assigned to that person across every group membership (never one group's slice — the field names say so): user_fully_complete (the all-or-nothing flag: 100% of ALL their assigned content, no partial credit), user_content_completed_pct (their partially-credited % — 90 here means user_fully_complete is false), beelines_assigned_to_user / beelines_completed_by_user, user_avg_progress_pct (progression), overdue count, practical/assessment metrics, and group memberships. kpis is COHORT-level over the SAME filtered population, so a headline number and the rows underneath always agree: users_fully_complete_count / users_fully_complete_pct (people at 100%), avg_user_progress_pct, beelines_assigned_to_users_total (0 means nothing is assigned, so a 0% completion rate there is "0 of 0", not a failure to finish work), and group_fully_complete for the cohort. metric_definitions in the response restates each field. Managers see only their managed groups. Args: group_id: Optional group to scope to (otherwise all your groups / whole org). include_descendants: If true (default), a group_id also includes learners in its descendant groups. page / page_size: Pagination (page_size max 100). search: Text search on name / email / phone. sort: 'name' (A-Z), 'completion' (highest user_content_completed_pct first), 'completion_asc' (lowest first, then lowest progression; people with nothing assigned last — the "who is furthest behind" order), 'progress' / 'assessment' / 'overdue' (highest first), or 'recent_active' (most recent first). Unknown values are rejected. overdue_only: Only learners with overdue items. tags: Group-tag NAMES to filter by, e.g. ['Kiosk'] — matches learners in any group carrying any of these tags. Get the vocabulary from list_group_tags. An unrecognised name is rejected (never silently ignored, which would return the whole org as if filtered). roles: Org roles to include, e.g. ['LEARN'] — multi-select. activity_window: '7d' / '30d' / '90d' for learners active within that window, or 'inactive' for those who have NEVER been active. progress_min / progress_max: Progression band, 0-100. assessment_min / assessment_max: Blended assessment-score band, 0-100. pa_status: Practical-assessment state — 'pending', 'failed', or 'complete'. exclude_managers: Drop managers from the population. membership_status: 'active' (default — current members only), 'revoked' (deactivated/expired only), or 'all'. Use 'all' or 'revoked' only for historical/audit questions; current-state reporting should stay on 'active'. include_contact: If true, keep emails/phones on each row. Default omits them — names and user ids are enough to identify people.

list_narration_voices

ChatGPT
List every voice add_ai_narration can use, with its provider and language. Call this BEFORE add_ai_narration when the author names a voice. A voice is only valid for the provider that serves it — passing an ElevenLabs voice with provider="openai" fails — and the block's language should match the voice, or the narration cannot be edited in Build Mode afterwards.

list_practical_attempts

ChatGPT
Individual practical-assessment RECORDS — one row per attempt: who did it, who assessed them, what they scored, and where it sits in a redo chain. Use this for the audit-trail question ("show me every practical done at Bree Street last month, and who signed each one off"). For rates and backlog totals use get_practical_summary instead — this returns rows, not aggregates. Each row also carries chain_status: the outcome for that learner's whole chain of attempts on that assessment, derived by the platform's own status rules so it matches the Insights screens. Scores are on a 0-1 scale here (a practical overall_score), NOT the 0-100 used by theory assessments — never average the two together. The response declares score_scale so this is unambiguous. Args: group_id: Optional group to scope to. Omit for org-wide (admin) or your managed groups (manager). learner_id: Optional single learner to drill into. beeline_id: Optional course to filter by. status: One attempt state — 'AWAITING', 'IN_PROGRESS', 'COMPLETED', 'FAILED' or 'CANCELLED'. final_attempts_only: Only the last attempt of each redo chain — the learner's actual outcome, excluding superseded tries. page / page_size: Pagination (page_size max 200).

list_proposals

ChatGPT
List this workspace's proposals, newest first. Read-only, admin-only. Every other proposal tool takes a proposal_id UUID — this is how you find one without already knowing it. Each entry carries the id, a human title (the proposed framework name where there is one, else the kind), status, created, and proposed_by, which is enough to tell two proposals apart in conversation. Statuses: generating, proposed, edited, confirmed, applied, rejected, superseded, failed. rejected, superseded and failed are TERMINAL — nothing can be done to them (failed: confirmed, but the change was refused when it ran). proposed/edited can be confirmed or rejected; applied can only be superseded; generating is still being worked on. Args: status: Optional single status to filter by (see the list above). limit: Maximum proposals returned (1-50, default 20).

list_questions

ChatGPT
List the questions of an assessment cell, in order. Each item has question_id, question_type, json_content, required, gradable, points. Use this first when editing an assessment — the question_id values are how you address questions in update/delete/reorder, and content_version is what you pass as expected_version. Returns an empty list for an assessment cell that has no questions yet. Args: cell_id: The assessment (ASSES) cell to read.

list_signals

ChatGPT
The live knowledge-gap signals in your workspace, worst first. Each signal is one skill a place (or the whole workspace) is missing, with the evidence in one sentence and how many people missed it. Admins see every signal; managers see the places they manage. Args: role_id: Optional job role UUID. Role signals are not produced yet, so a role filter currently returns none. place_id: Optional group id to narrow to one place. top_n: How many to return (1-50, default 10).

list_survey_fields

ChatGPT
List a survey cell's fields, in order. Each field is an object carrying a stable id (assigned for you) plus its frontend-defined shape. Args: cell_id: The survey (SURV) cell to read.

list_workspaces

ChatGPT
List the Beeline workspaces you can connect this integration to, and which one you're connected to right now. Only workspaces where you're an admin or manager AND the Beeline connector is enabled are shown. To act in a different one, use switch_workspace.

move_cell

ChatGPT
Move a content cell to a different section and/or position. For a pure reorder within one section, prefer reorder_cells_in_section (clearer semantics — here position is applied after the cell is detached from its current spot). Args: beeline_id: The beeline to edit. cell_id: The content cell to move. target_section_id: The section to move it into (may be its current one). position: Zero-indexed position within the target section (defaults to end). expected_version: Optional optimistic-concurrency guard.

move_cell_block

ChatGPT
Move a content block to a new position. Specify exactly one of after_id or to_index. Args: cell_id: The cell to edit. block_id: Id of the block to move. after_id: Move it directly after this block id. to_index: Move it to this zero-indexed position. expected_version: Optional optimistic-concurrency guard.

move_group

ChatGPT
Move a group (and everything under it) to a different parent. Admin-only. The whole subtree moves with it. Pass new_parent_group_id=null to move the group to the top level (for a Location group, that is directly under the whole-company group). Call without confirm to preview (how many descendant groups and learners move, old vs new parent); confirm=True to apply. Rejected if it would create a cycle or exceed the 9-level maximum, and the whole-company group itself cannot be moved. Args: group_id: The group to move. new_parent_group_id: The new parent group, or null for the top level. confirm: False (default) previews; True applies.

move_group_members

ChatGPT
Move people from one group to another. Admin, or a manager of BOTH groups. Give EITHER an explicit list of user_ids OR all_members=true — never both, never neither. Only people actually in the source group are affected (a user_id not in it is skipped). Call without confirm to preview (how many move, plus a sample of names); confirm=True to move them. Moves larger than 25 people run in the background — confirm=True then returns {job_id, status: 'processing'} instead of {moved_count}; poll it with get_group_move_status. Args: from_group_id: The source group to move people out of. to_group_id: The destination group to move them into. user_ids: Explicit list of user IDs to move. all_members: Move everyone currently in the source group. confirm: False (default) previews; True moves.

patch_proposal_plan

ChatGPT
Replace the proposal plan with a full validated plan dict. Admin-only. Validates via the kind's pipeline schema (RolePackPlan for role_pack — including required KPI evaluation_mode), then records the edit through the proposal state machine. Legal while status is generating, proposed, or edited. Rejected / applied / confirmed / superseded cannot be patched — rejected is terminal; call create_role_pack_proposal(plan=...) to start a new one. Canonical RolePackPlan keys (aliases like framework_name / competency `name+level` / match_strategy=create are accepted and rewritten): - suggested_framework_name (str) - overall_confidence (0-1) - roles[]: name, description, confidence, match_strategy (new|update_existing|skip), competencies[], kpis[] - competencies[]: competency_name, competency_description, required_numeric_level (1-99), confidence - kpis[]: title, description, evaluation_mode (metric_only|scale_only|both), confidence, plus mode fields (target_value for metric; full scale for scale_only/both) Args: proposal_id: UUID of the proposal. plan: Full plan object (not a partial patch).

refine_build

ChatGPT
Apply one canonical outline edit operation to the preview.

refresh_content_source

ChatGPT
Refresh a source doc from a URL, detect drift, and link the refreshed source as superseding the old one. This is deliberately preview-like on the read side: if the freshly-fetched URL content matches the stored source text, no new ContentSource is created. If the URL content has changed, the tool persists a new source version and links it back to the old source via supersedes. Args: content_source_id: Existing source to refresh. url: The current URL for the source document.

refresh_content_source_from_upload

ChatGPT
Refresh a source doc from an already-uploaded file key. This is the upload-side companion to refresh_content_source: the file is uploaded through the normal storage flow first, then MCP receives only the stable file_key reference. The tool compares freshly extracted text against the old source and only mints a successor source when the file actually changed. Args: content_source_id: Existing source to refresh. file_key: Storage key for the uploaded replacement file. name: Optional display name for the refreshed source.

reject_proposal

ChatGPT
Reject a proposal (terminal). Admin-only, except a zeno_action, which its proposer or anyone who could confirm it may reject. Args: proposal_id: UUID of the proposal. reason: Optional note stored on the edit_log transition.

remove_cell

ChatGPT
Remove a content cell from a beeline (soft-delete + unlink learner progress). This is DESTRUCTIVE and cannot be undone. Call without confirm to preview (the cell's block count and how many learners have progress on it, in `preview`; nothing is deleted); confirm=True to delete. Show the user the preview and only confirm after they agree. A cell always previews first, even an empty one. Args: beeline_id: The beeline to edit. cell_id: The content cell to remove. expected_version: Optional optimistic-concurrency guard. confirm: False (default) previews; True permanently deletes.

remove_section

ChatGPT
Remove a section and all the cells it contains (soft-delete + unlink progress). This is DESTRUCTIVE and cannot be undone. Call without confirm to preview (how many cells, how many with content, total blocks, and how many learners have progress on them, in `preview; nothing is deleted); confirm=True to delete. Show the user the preview and only confirm after they agree. A section with NO cells in it is the exception: nothing can be lost, so it is deleted straight away without confirm and preview` is null. A section holding any cell, even an empty one, always previews first. Args: beeline_id: The beeline to edit. section_id: The section to remove. expected_version: Optional optimistic-concurrency guard. confirm: False (default) previews (or deletes an empty section); True permanently deletes.

rename_cell

ChatGPT
Rename a section or any content cell in place. This preserves the cell id, slug/link, content, children, linked-object reference, assets, and learner progress. By default it also applies the new name to the linked assessment, survey, practical assessment, performance review, digital resource, or SCORM course. Set rename_linked_object=False when those names should intentionally differ. Linked beelines are never renamed, and feedback forms have no title to sync. Shared cells or linked objects show the new name everywhere. Args: beeline_id: The beeline containing the section or cell. cell_id: The section or content-cell id from get_beeline_structure. name: The new non-empty name (maximum 250 characters). rename_linked_object: Also rename supported linked content (default true). Disable only when its title should be independent. expected_version: Optional — the graph_version you last read; the edit is rejected (stale_version) if the beeline changed since.

reorder_cells_in_section

ChatGPT
Reorder the cells within one section. ordered_cell_ids must be a permutation of that section's current cell ids. Args: beeline_id: The beeline to edit. section_id: The section whose cells to reorder. ordered_cell_ids: All current cell ids in that section, in the new order. expected_version: Optional optimistic-concurrency guard.

reorder_questions

ChatGPT
Reorder an assessment cell's questions. ordered_question_ids must be a permutation of the assessment's current question ids. Args: cell_id: The assessment cell. ordered_question_ids: All current question ids, in the new desired order. expected_version: Optional optimistic-concurrency guard.

reorder_sections

ChatGPT
Reorder a beeline's sections. ordered_section_ids must be a permutation of the beeline's current section ids (a pure reorder — no adds or drops). Args: beeline_id: The beeline to edit. ordered_section_ids: All current section ids, in the new desired order. expected_version: Optional optimistic-concurrency guard.

reorder_survey_fields

ChatGPT
Reorder a survey cell's fields. ordered_field_ids must be a permutation of the survey's current field ids. Args: cell_id: The survey cell. ordered_field_ids: All current field ids, in the new desired order. expected_version: Optional optimistic-concurrency guard.

replace_cell_block

ChatGPT
Replace one content block with one or more new blocks. Args: cell_id: The cell to edit. block_id: Id of the block to replace (from get_cell_blocks). new_blocks: A list of Slate block objects to put in its place (each {"type": ..., "children": [...]}; ids are assigned for you). A callout's "variant" must be note|tip|warning|danger|mistake|think|didyouknow (info/success are rejected) or set an "icon". Common types: p, h2, h3, quote, callout, ul, ol, code, divider, image, flip_boxes, tabs, accordion, timeline, comparison, table, learner_checklist, todo_turbo. Lists nest list-item children; read an existing block with get_cell_blocks and copy its shape for anything beyond plain text. expected_version: Optional — the content_version you last read; the edit is rejected (stale_version) if the cell changed since.

reset_assessment_attempts

ChatGPT
Unblock ONE learner on ONE assessment by clearing their attempts on it, so the attempt limit no longer stops them. The rest of their course progress is untouched — no full course restart. Admin-only. This DISCARDS that learner's previous attempts on this assessment (their scores no longer count) and cannot be undone from here. Call without confirm to preview (how many attempts the learner has, the attempt limit, whether they are currently blocked, whether they had passed); confirm=True to reset. If they had already passed, resetting re-locks the cells after this assessment until they pass again. Args: beeline_id: The beeline (course) the assessment cell is in. cell_id: The assessment (ASSES) cell. learner_id: The learner's user id (from list_learners). Must be an active member of this workspace. Works on a course another workspace owns, as long as this workspace has it in its library or has assigned it. confirm: False (default) previews; True resets the attempts.

resync_beeline_from_source

ChatGPT
Preview or execute a beeline resync from an updated source document. Preview returns the cells that would be rewritten. Confirm performs every rewrite inside one transaction, so any failure rolls back the whole call. Args: beeline_id: The beeline to resync. old_content_source_id: The stale source that the beeline was grounded in. new_content_source_id: The refreshed source to ground rewrites in. confirm: Set true to apply the rewrites. False returns a preview only.

rewrite_block

ChatGPT
Rewrite an existing content block with the AI (tighten, expand, simplify, reframe …). The block's current text is used to ground the rewrite, and the result replaces it. Gated on the org's AI token budget. Args: cell_id: The cell containing the block. block_id: Id of the block to rewrite (from get_cell_blocks). instruction: How to change it, e.g. "make this half as long and friendlier". source_reference_ids: Optional ContentSource ids to ground the rewrite in. expected_version: Optional optimistic-concurrency guard.

save_build_outline

ChatGPT
Validate and save the proposed course outline as the canonical preview.

search_workspace_content

ChatGPT
Search across workspace Beelines, cells and their body text, content sources, and private Asset metadata without already knowing an id. Results are compact and grouped by `entity_type with exact total and returned counts. Cell results include every visible Beeline placement and click-out URL. Asset results expose stable asset ids and workspace-owned file keys, never raw or signed private URLs. Use the returned content_source_id` directly with generate_block/rewrite_block. Args: query: Case-insensitive text to find (2-200 characters). entity_types: Optional subset of beeline, cell, content_source, asset. Omit to search all four. limit_per_type: Results returned for each selected type (1-25, default 10). page: One-indexed page applied independently to every selected type.

set_blocks

ChatGPT
Replace a cell's ENTIRE content in one write — the whole-cell counterpart to replace/insert/delete_cell_block. Use this to write a cell's full content from scratch (e.g. after generating a whole section's worth of text) instead of building it up block-by-block. Args: cell_id: The cell to edit. new_blocks: The complete new list of Slate block objects — replaces everything currently in the cell (ids are assigned for you). Each block is {"type": ..., "children": [...]}; text lives in leaves {"text": ...} with boolean marks (bold/italic). A callout needs a "variant" of note|tip|warning|danger|mistake|think|didyouknow (info/success are rejected) or an "icon" emoji. Common types: p, h2, h3, quote, callout, ul, ol, code, divider, image, flip_boxes, tabs, accordion, timeline, comparison, table, learner_checklist, todo_turbo. Lists nest list-item children; read an existing block with get_cell_blocks and copy its shape for anything beyond plain text. expected_version: Optional — the content_version you last read; the edit is rejected (stale_version) if the cell changed since.

start_guest_build

ChatGPT
Start a private course-building preview for a prospect who has no Beeline workspace yet. For a user already connected to a workspace through OAuth, use create_beeline instead: that builds in their real workspace. Creates no workspace and cannot read any Beeline customer data. Keep the returned guest_handle private (it is the only credential for this preview) and pass it to every later guest Build tool. Next step: attach any source material, then save_build_outline. Args: topic: what the course teaches, 3-500 characters. audience: who it is for (role, experience), optional. duration_minutes: intended total course length, 5-240 (default 30). Returns guest_handle, build_id, status "drafting". Errors: invalid_topic, invalid_duration.

switch_workspace

ChatGPT
Confirm access to another workspace and how to connect to it. An MCP connection is bound to one workspace for the life of its login, so this does NOT switch in place — it verifies you have admin/manager access to the target and returns reconnect instructions. Each workspace is a separate, isolated connection (by design). Args: org_slug: The slug of the workspace to switch to (from list_workspaces).

update_assessment_settings

ChatGPT
Configure an assessment cell — pass mark, attempts, timing, shuffling. Provide only the settings to change. Read the current values back from list_questions (its settings key) or from this tool's response. To make a pass mark an actual REQUIREMENT you need both halves: pass_mark_percent sets the bar, required_to_pass=True makes clearing it mandatory to progress. On its own a pass mark is advisory — the default is that attempting the assessment is enough. Args: cell_id: The assessment (ASSES) cell. Its assessment is created if it doesn't have one yet. pass_mark_percent: Pass mark as a PERCENT, 0-100. Pass 80 for 80% (not 0.8 — a fraction is rejected rather than read as 0.8%). required_to_pass: True = the learner must reach the pass mark to progress. False = attempting is enough (the platform default). max_attempts: Maximum attempts allowed (>= 1). Omit for unlimited. duration_seconds: Time limit in seconds (>= 1). Omit for untimed. shuffle_questions: Randomise question order per attempt. show_learner_results_report: Show the learner their results report. expected_version: Optional optimistic-concurrency guard.

update_beeline_metadata

ChatGPT
Update a beeline's own settings — the write half of get_beeline_metadata. Every argument is optional and `None` means "leave it alone", so this is safe to call with just the one setting you want to change. Pass at least one. Writes go through the same service the webapp Build canvas uses, so an agent-made change is indistinguishable from one made in the UI. Not covered here (still UI-only): renaming the beeline, cover image, custom certificate PDF selection, and the canvas' design-time fields (persona, target job roles, business outcomes, competencies). Args: beeline_id: The beeline to update (from list_beelines / create_beeline). description: New beeline description shown to learners and admins. enable_certification: Turn the completion certificate on or off. certification_criteria: How a certificate is earned — any of "ALLC" (all cells completed) or "MANU" (manual check by an admin/manager). Only meaningful with certification enabled. learning_outcomes: The COMPLETE list of Instructional Design Canvas learning outcomes ("By the end, the learner can…"). This replaces the existing list — read get_beeline_metadata first and send back the full set, not just your additions.

update_cell_block_text

ChatGPT
Update the text and/or marks of a block's text leaf. Args: cell_id: The cell to edit. block_id: Id of the block whose text to update. text: New text for the leaf. marks: Formatting to apply, e.g. {"bold": true}. child_path: Optional integer path to a nested leaf (e.g. list item). expected_version: Optional optimistic-concurrency guard.

update_question

ChatGPT
Update a question on an assessment cell. Provide only the fields to change. Args: cell_id: The assessment cell. question_id: Id of the question to update (from list_questions). json_content: New body — validated against question_type (the new one if given, else the question's current type). Rejected if invalid. question_type: New question type code (optional). required: New required flag (optional). gradable: New gradable flag (optional). points: New membership points (optional). expected_version: Optional optimistic-concurrency guard.

update_survey_field

ChatGPT
Update a survey field by id. The given keys are merged over the existing field; the id is immutable. Args: cell_id: The survey cell. field_id: Id of the field to update (from list_survey_fields). field: Keys to merge in, e.g. {"label": "New label", "required": false}. expected_version: Optional optimistic-concurrency guard.

add_beeline_to_library

Claude

add_cell

Claude

add_digital_resource_cell

Claude

add_question

Claude

add_section

Claude

add_survey_field

Claude

attach_source

Claude

bulk_create_groups

Claude

bulk_edit_groups

Claude

compare_groups

Claude

confirm_proposal

Claude

create_beeline

Claude

create_group

Claude

create_role_pack_proposal

Claude

delete_cell_block

Claude

delete_group

Claude

delete_question

Claude

delete_survey_field

Claude

diagnose_gaps

Claude

duplicate_beeline

Claude

edit_group

Claude

find_content_using_source

Claude

generate_block

Claude

get_activity_report

Claude

get_assessment_scores

Claude

get_at_risk

Claude

get_beeline_metadata

Claude

get_beeline_structure

Claude

get_capability_gaps

Claude

get_cell_blocks

Claude

get_competency_frameworks

Claude

get_content_report

Claude

get_feedback

Claude

get_group_dashboard

Claude

get_group_detail

Claude

get_group_move_status

Claude

get_job_role

Claude

get_learner_competency_snapshot

Claude

get_learner_summary

Claude

get_practical_summary

Claude

get_program_report

Claude

get_proposal

Claude

get_role_competency_gaps

Claude

ingest_content_source

Claude

insert_cell_block

Claude

list_beelines

Claude

list_group_tags

Claude

list_job_roles

Claude

list_learners

Claude

list_practical_attempts

Claude

list_questions

Claude

list_survey_fields

Claude

list_workspaces

Claude

move_cell

Claude

move_cell_block

Claude

move_group

Claude

move_group_members

Claude

patch_proposal_plan

Claude

refresh_content_source

Claude

refresh_content_source_from_upload

Claude

reject_proposal

Claude

remove_cell

Claude

remove_section

Claude

rename_cell

Claude

reorder_cells_in_section

Claude

reorder_questions

Claude

reorder_sections

Claude

reorder_survey_fields

Claude

replace_cell_block

Claude

resync_beeline_from_source

Claude

rewrite_block

Claude

search_workspace_content

Claude

set_blocks

Claude

switch_workspace

Claude

update_cell_block_text

Claude

update_question

Claude

update_survey_field

Claude

Capabilities

WritesInteractive

Example Prompts

Click any prompt to copy it.

App Stats

175

Tools

3

Prompts

ChatGPT, Claude

Platforms

Works with

ChatGPT
Claude

Data refreshed daily