Tools reference
Once connected, your assistant has the tools below. They map directly to
the REST API, so the responses and the permission rules are
identical. Everything is read-only except the tools under “Changing
announcements”, which need a connection granted the announcement:write scope,
the tools that add documents and YouTube videos, which need content:write,
the tools under “Assigning training”, which need training:assign, the tools
under “Authoring lessons”, which need lesson:write, the tools under
“Managing content”, which need content:manage, the tools under “Deleting
content”, which need content:delete, create_issue, which needs
issue:write, the tools under “Deciding a
content review”, which need content-review:write, the tools under “Public links”, which need
public-link:write, the tools under “Deciding issues”, which need issue:manage, the tools under “Managing people”, which need
member:manage, the tools under “Managing teams”, which need team:manage,
and the tools under “Managing company roles”, which need company-role:manage,
and the tools under “Managing duties”, which need duty:manage,
and the tools under “Managing a role’s curriculum”, which need curriculum:manage,
and the tools under “What an external role can read”, which need content-grant:manage,
and the tools under “Retiring a topic”, which need topic:retire,
and the tools under “Retiring an item”, which need item:retire,
and the tools under “Proposing a plan”, which need plan:propose,
and get_client_terms and create_client, which need client:create.
search_mereon
Section titled “search_mereon”Search the organization’s business knowledge base (processes, policies, facts, and source documents and transcripts). This is usually the first tool to call: it returns type-tagged results with snippets, relevance scores, and web links.
| Input | Type | Notes |
|---|---|---|
query |
string | Natural-language search query. Required. |
types |
string[] | Restrict to topic and/or chapter. Defaults to all. |
limit |
number | Max results, 1–50. Default 10. |
list_topics
Section titled “list_topics”List the knowledge graph’s topics, in alphabetical order by name, optionally restricted to one
category. Use it to browse or enumerate topics. search_mereon finds a topic by
what it is about, and list_spaces shows how topics are grouped. Each topic gives
its name, category and link. Read one in full with get_topic, find who owns it
with get_duties, and list its items with get_topic_items.
| Input | Type | Notes |
|---|---|---|
categorySlug |
string | Restrict to one category, e.g. operations, hr, finance. An unrecognized slug is an error rather than a silent match-everything. |
filter |
string | A stewardship worklist instead of every topic: no-owner (no one is Responsible for the topic itself), no-verification-interval (no review cadence set), or verification-overdue (the next review date has passed). An unknown value is an error. |
cursor |
string | Pagination cursor from a previous response. It is the id of the last topic returned. |
limit |
number | Max topics, 1–100. Default 50. |
get_topic
Section titled “get_topic”Fetch a knowledge topic by id: its description, category, the items under it
(processes, policies, facts), and related topics. Use after search_mereon to
read a topic in full.
| Input | Type | Notes |
|---|---|---|
topicId |
string | Topic id from search results or related topics. Required. |
get_topic_items
Section titled “get_topic_items”List the items (processes, policies, facts) under a topic, as a nested tree. Use it
after get_topic or list_topics surfaces a topic id when you need every item
rather than the summaries get_topic carries. Read one in full, with its
evidence, using get_item.
| Input | Type | Notes |
|---|---|---|
topicId |
string | Topic id from list_topics or search results. Required. |
get_item
Section titled “get_item”Fetch a single item (process, policy, or fact) by id, including its child items and the source evidence backing it: quotes, video timestamps, document ranges, and confidence, with links to the original content.
| Input | Type | Notes |
|---|---|---|
itemId |
string | Item id from a topic’s items list. Required. |
get_content
Section titled “get_content”Fetch a single content resource by id: its title, type (document, video, audio,
or guide), summary, duration (for video), and link. Use to look up a resource’s
metadata once you have its id. For the full wording use get_content_text; to
find a resource by title use list_content.
| Input | Type | Notes |
|---|---|---|
contentId |
string | Content id from search results, list_content, or item evidence. Required. |
get_content_text
Section titled “get_content_text”Fetch the full text of a source document, or the transcript of a video, split into chapters. Use when search snippets are not enough and you need the original wording.
| Input | Type | Notes |
|---|---|---|
contentId |
string | Content id from search results or item evidence. Required. |
get_content_transcript
Section titled “get_content_transcript”Get the timed transcript of a video or an audio recording: each spoken segment
with its start and end in milliseconds, in order. Use it to cite where in a
recording something is said, or to read an earlier version of it. A document or a
guide has no timing, so read it with get_content_text.
It is the current version unless versionId names another, which has to belong to
this resource. A version learners have not had (a completed one above the current version, a
draft, or a processing or failed one) is an editor’s working copy and is shown only to someone
who may edit the resource.
| Input | Type | Notes |
|---|---|---|
contentId |
string | Content id of a video or an audio recording. Required. |
versionId |
string | A version id from list_content_versions. Defaults to the current version. |
list_content_versions
Section titled “list_content_versions”List a resource’s versions, newest first: which one learners see now, which it
replaced, who published each, and what the publisher said should happen to
learners already enrolled (retrainingIntent: none, full_retake or
changed_material). Use it to answer “when did this change” and “did that update
retrain people”.
Anyone who can read the resource sees its released versions: the current one and the completed ones it replaced. A completed version above the current one (a publish not yet live, or one a rollback moved away from), a draft, or a processing or failed version is an editor’s working copy and is shown only to someone who may edit the resource. Not paginated.
| Input | Type | Notes |
|---|---|---|
contentId |
string | Content id, from list_content or search results. Required. |
get_duties
Section titled “get_duties”Find who is Responsible, Accountable, Consulted, or Informed for a topic, item,
space, or category, including duties inherited from parent entities. Answers
“who owns this process” and “who should I ask about this”. Each duty says
whether a person set it or the system suggested it (source, confidence).
| Input | Type | Notes |
|---|---|---|
entityType |
string | One of TOPIC, ITEM, SPACE, CATEGORY. Required. |
entityId |
string | The entity id. Required. |
Managing duties
Section titled “Managing duties”create_duty, change_duty and delete_duty assign, change, or remove who
is Responsible, Accountable, Consulted, or Informed for a topic, item, space,
or category. They need a connection granted the duty:manage scope, and the
person behind it must be allowed to assign, change, or remove that duty, which
owners and admins are, checked on every call. See Duties for
the full rules.
Call one only when the person has agreed. A duty assigned here is recorded as
set by a person. For a person, actorId is their login from find_people, or
the organization’s record of them from a duty you already read. Leave
actorId out for an organization-wide duty. Copying duties down to child
topics, and handing one role’s duties to another role, stay in the app.
Each call is limited to 10 a minute and 60 an hour, and each is recorded in the audit log.
create_duty
Section titled “create_duty”Assign who is Responsible, Accountable, Consulted, or Informed for a topic, item, space, or category. The duty is recorded as set by a person. Returns the duty. Needs permission to assign duties.
| Input | Type | Notes |
|---|---|---|
actorType |
string | ROLE, TEAM, INDIVIDUAL, THIRD_PARTY, ORGANIZATION, or ROLE_KIND. Required. |
actorId |
string | Who holds the duty. Leave it out for ORGANIZATION. INTERNAL or EXTERNAL for ROLE_KIND. |
entityType |
string | TOPIC, ITEM, SPACE, or CATEGORY. Required. |
entityId |
string | The topic, item, space, or category. Required. |
role |
string | RESPONSIBLE, ACCOUNTABLE, CONSULTED, or INFORMED. Required. |
tierQualifier |
string | ALL, MIN, MAX, or EXACT. Only a company role may set this. |
advancementTierId |
string | null | The tier a MIN, MAX, or EXACT duty is bound to. Omit it for ALL. |
change_duty
Section titled “change_duty”Change a duty’s level, its learning priority, or how far a company role’s duty reaches on its advancement path. Send at least one of role, learningPriorityOverride, tierQualifier, and advancementTierId. The actor and the entity stay as they are. Returns the duty. Needs permission to change that duty.
| Input | Type | Notes |
|---|---|---|
dutyId |
string | From create_duty, or assignmentId on get_duties. Required. |
role |
string | RESPONSIBLE, ACCOUNTABLE, CONSULTED, or INFORMED. Optional. |
learningPriorityOverride |
string | null | CRITICAL, HIGH, MEDIUM, or LOW. null clears it so the topic’s priority applies. |
tierQualifier |
string | ALL, MIN, MAX, or EXACT. Only a duty held by a company role may set this. |
advancementTierId |
string | null | The tier a MIN, MAX, or EXACT duty is bound to. Omit it for ALL. |
delete_duty
Section titled “delete_duty”Remove a duty. Returns the duty that was removed. Needs permission to remove that duty.
| Input | Type | Notes |
|---|---|---|
dutyId |
string | From create_duty, or assignmentId on get_duties. Required. |
list_issues
Section titled “list_issues”List the organization’s data-quality issues (conflicts, duplicates, content and structure gaps, stale or misclassified knowledge), most recent first.
| Input | Type | Notes |
|---|---|---|
status |
string | OPEN, IN_PROGRESS, RESOLVED, or DISMISSED. |
type |
string | CONFLICT, DUPLICATE, MISCLASSIFICATION, STALE, CONTENT_GAP, STRUCTURE_GAP, OTHER, UPDATE_HELD (an update to a resource held because it would remove too much), or RETIRED_ITEM_REAPPEARED (an item someone retired that a new version of its source says again). |
severity |
string | CRITICAL, HIGH, MEDIUM, or LOW. |
assignedToMe |
boolean | Only issues assigned to the connected user, either directly or through a role they currently hold. |
targetType |
string | TOPIC, ITEM, SPACE, or CATEGORY. Use it with targetId. |
targetId |
string | Only issues that concern the topic, item, space, or category with this id. |
search |
string | Text to find in the title, the description, or a target’s title. The whole text has to appear, in that order, and case does not matter. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Max issues, 1–100. Default 50. |
The response is { issues, nextCursor }, the same shape as the other paged
lists. Each issue says what raised it (trigger), and you pass nextCursor back
as cursor to read the next page. Earlier versions returned the issues as a
bare list with no way to reach a second page, so a client that read that list
directly needs to read issues instead.
get_content_knowledge
Section titled “get_content_knowledge”List the topics a resource contributed knowledge to, with how many items came from it. Use to answer “what did we learn from this document” without reading the whole text.
Latest-only: archived and superseded records are excluded, so this is what the resource currently supports.
| Input | Type | Notes |
|---|---|---|
contentId |
string | Content id, from search results or list_content. |
get_content_usage
Section titled “get_content_usage”List what depends on a resource: the lessons that teach it, and the topics it is the only evidence for. Use before suggesting a change to a document — the sole-evidence topics are the ones that would lose their basis without it.
Lessons are limited to the ones you can see, and only lessons still teaching are counted: a withdrawn one is not. An external account is refused. Each list carries a true count plus a preview of at most 20 entries.
| Input | Type | Notes |
|---|---|---|
contentId |
string | Content id, from search results or list_content. |
list_third_parties
Section titled “list_third_parties”List the external organizations that hold duties in this knowledge base — vendors, contractors, regulators. They own areas of the work alongside internal roles.
Takes no inputs.
get_third_party
Section titled “get_third_party”Read one third party. For what it answers for, use list_third_party_duties.
| Input | Type | Notes |
|---|---|---|
thirdPartyId |
string | Third party id, from list_third_parties. |
list_third_party_duties
Section titled “list_third_party_duties”List everything a third party answers for: each topic, item, space, or category
it holds a duty on, the level, and whether the duty is inherited from an
ancestor rather than assigned directly. Each duty also says whether a person set
it or the system suggested it (source, with a confidence for a suggestion).
This is the holder’s side of get_duties, which instead names who owns a given
topic. Limited to entities you can read, and needs raci-assignment.read as
get_duties does.
| Input | Type | Notes |
|---|---|---|
thirdPartyId |
string | Third party id, from list_third_parties. |
entityType |
string | Restrict to TOPIC, ITEM, SPACE or CATEGORY. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Rows per page, 1–100. Default 50. |
list_role_duties
Section titled “list_role_duties”List everything a role answers for, in the same shape as
list_third_party_duties, and with the same raci-assignment.read requirement. Each row also carries how far the duty reaches across
the role’s advancement path, so a duty covering only senior levels is
distinguishable from one covering the whole role.
A duty on a topic inherits down to every item on that topic, so an unfiltered
list is mostly item rows. Pass entityType: "TOPIC" for the summary a person
would recognize.
| Input | Type | Notes |
|---|---|---|
companyRoleId |
string | Company role id, from list_company_roles. |
entityType |
string | Restrict to TOPIC, ITEM, SPACE or CATEGORY. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Rows per page, 1–100. Default 50. |
list_categories
Section titled “list_categories”List the organization’s categories, with the titles and descriptions it uses itself. Categories are the top of the structure — a category holds spaces, a space holds topics, a topic holds items — so start here when you do not know where a subject lives.
Takes no inputs.
get_issue
Section titled “get_issue”Read one data-quality issue in full. Each target carries the affected content itself (an item target’s block type and text), so you can explain what conflicts, duplicates, or is stale rather than only naming it. Closed issues carry the resolution strategy.
| Input | Type | Notes |
|---|---|---|
issueId |
string | Issue id, from list_issues. |
Each target carries its own id.
get_issue_research_log
Section titled “get_issue_research_log”Read what the AI knowledge review has already looked at for an issue: each pass with its status, the searches it ran, whether it decided the knowledge base already covers the topic, and its summary. Use it before looking into an issue yourself, so you do not repeat what has been checked. Newest first.
Visible to whoever can read the issue.
| Input | Type | Notes |
|---|---|---|
issueId |
string | Issue id, from list_issues. Required. |
list_spaces
Section titled “list_spaces”List the spaces the organization’s knowledge is grouped into. A category holds spaces, a space holds topics, so this is how to see the shape of the graph before drilling into it.
| Input | Type | Notes |
|---|---|---|
categorySlug |
string | Restrict to one category, e.g. operations, hr, finance. An unrecognized slug is an error rather than a silent match-everything. |
get_space
Section titled “get_space”Read one space and the topics it groups. Topics are limited to those you can see, and to the current graph (nothing archived or superseded).
| Input | Type | Notes |
|---|---|---|
spaceId |
string | Space id, from list_spaces. |
list_content
Section titled “list_content”List viewable content resources (documents, videos, audio, and guides), most recent
first. Use to find a specific resource by name or browse a type. For questions
about what the content says, use search_mereon instead.
| Input | Type | Notes |
|---|---|---|
query |
string | Title keywords. Every word must appear in the title, any order, case-insensitive. |
type |
string | Restrict to one of document, video, audio, guide. |
tags |
string[] | Tag names from list_tags. A resource must carry every one. An invalid name is an error, and an external account may not filter by tag. |
teamId |
string | Content everyone can read, or that is shared to this team, an id from list_teams. |
readyOnly |
boolean | Only resources that are processed and indexed. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Max resources, 1–100. Default 50. |
Each resource says who can read it (visibility, teams), its tags, who uploaded
it, and whether it is ready to teach from. A contribution still waiting in the review
queue is not listed, whoever is asking.
list_tags
Section titled “list_tags”List the organization’s tags by name. They are the vocabulary list_content
filters by and each resource’s tags are drawn from, so call this to learn which
tags exist before filtering. An external account is refused. No inputs.
list_lessons
Section titled “list_lessons”List lessons in the catalog (authored training units), most recent first. For
the raw source videos and documents use list_content; for what the material
says use search_mereon.
| Input | Type | Notes |
|---|---|---|
query |
string | Text to find in the lesson title, case-insensitively. |
tags |
string[] | Tag names from list_tags. A lesson must carry every one. An invalid name is an error. |
teamId |
string | Lessons shared to this team, an id from list_teams. It has to be your team unless you can read the whole organization. |
includeClosed |
boolean | true to include closed lessons, for finding one to reopen. Leave it out when choosing a lesson to assign or share. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Max lessons, 1–100. Default 50. |
Each lesson says how thorough the teaching is, who it is shared with and its tags.
Someone who manages lessons across the organization also sees how many people are
enrolled (stats). It needs access to lessons, which an external account does not
have.
get_lesson
Section titled “get_lesson”Fetch one lesson in detail: its metadata, who it is shared with, its tags and the
source content pieces it teaches, in order, limited to the ones you can read.
stats (how many people are enrolled, in progress and finished) is shown only to
someone who may manage the lesson. A withdrawn lesson reports status CLOSED,
and closedByRetirement when it closed because its topic was retired. A lesson
made for one learner or from a review is not in the catalog and is not found.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | The lesson id. Required. |
get_lesson_topics
Section titled “get_lesson_topics”List the topics a lesson covers, in the order it teaches them, each with whether
the author picked it (EXPLICIT) or it follows from the resources they picked
(DERIVED). Only live topics you can read are listed, so a lesson closed because
its topic was retired covers nothing. Each is a name and a link; read its items
with get_topic_items. Not paginated.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | The lesson id, from list_lessons. Required. |
get_lesson_retraining_policy
Section titled “get_lesson_retraining_policy”Get how often people who finished a lesson are asked to take it again: none or
recurring with an interval in days, and whether that means the whole lesson
(full_retake) or what changed (changed_material). policy is null when none
was set, which is not the same as no retraining: the organization’s default
applies, and a company role’s curriculum can override either, which
get_company_role reports as the item’s retrainingOverride. Needs access to
enrollments, and the lesson has to be one you can see.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | The lesson id, from list_lessons. Required. |
list_company_roles
Section titled “list_company_roles”List the organization’s company roles (named org-chart positions), sorted alphabetically by name. Each result carries how many people hold the role and the role it reports to. Available only when the connected user can read the org chart.
| Input | Type | Notes |
|---|---|---|
query |
string | Case-insensitive match on the role name. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Max roles, 1–100. Default 50. |
get_company_role
Section titled “get_company_role”Fetch one company role in detail: its reporting parent and member count, its training curriculum (the lessons and topics everyone in the role must complete), and its current members.
| Input | Type | Notes |
|---|---|---|
companyRoleId |
string | The company role id. Required. |
list_content_review_requests
Section titled “list_content_review_requests”List content-review requests — proposed content and issue-resolutions awaiting
(or past) review. A reviewer sees the whole organization’s queue; everyone else
sees only their own submissions (pass mine=true to force that). Requires
content-review read access.
| Input | Type | Notes |
|---|---|---|
status |
string | PENDING, APPROVED, REJECTED, CHANGES_REQUESTED, CANCELED, or SUPERSEDED. |
resourceType |
string | document, video, audio, or guide. |
kind |
string | content, content-resolves-issue, or issue-only. |
submitterId |
string | Reviewers only: restrict to one submitter. |
mine |
boolean | Only the connected user’s own submissions. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Max requests, default 50 (max 100). |
get_content_review_ontology_plan
Section titled “get_content_review_ontology_plan”Get what approving a content-review request would do to the knowledge base before
anyone decides: the topics and claims it would add, change or retire. state says
whether there is a plan to read: not-requested, working (waiting will help),
failed (waiting will not), or ready, and only ready carries a plan, which
may still propose no changes. Use it to judge a proposal by its effect and not only
its wording.
A reviewer can read any request in the org; everyone else only their own. Requires content-review read access.
| Input | Type | Notes |
|---|---|---|
requestId |
string | The content-review request id, from list_content_review_requests. Required. |
get_content_review_request
Section titled “get_content_review_request”Fetch one content-review request by id: its workflow state, the content or issue it concerns, the submitter and reviewer, and any notes. A reviewer can read any request in the org; everyone else only their own.
| Input | Type | Notes |
|---|---|---|
requestId |
string | The content-review request id. Required. |
get_maturity
Section titled “get_maturity”Get the organization’s knowledge-base maturity: its level (UNDOCUMENTED →
OPTIMIZED), the signals behind it (topic ownership, structured content,
verification cadence, category coverage, open issues), and ranked
recommendations for what to improve next. Readable by any member who can read
the organization.
| Input | Type | Notes |
|---|---|---|
categorySlug |
string | Scope to one category (e.g. operations, hr). Omit for org-wide maturity. |
list_category_health
Section titled “list_category_health”List every category (always 14) with its maturity level, or null when the
category has too few topics to score. The “which areas are weakest” overview.
Readable by any member who can read the organization. No inputs.
find_people
Section titled “find_people”Find members of the organization by name or email, and get the id a write needs. The person to tell in add_announcement_audience (actorType INDIVIDUAL) is named by the id this returns. Each match is an id, a name and an email. It includes members who hold no role and are on no team, which the org chart and team rosters leave out. An admin sees everyone, and a team-scoped user sees their teams.
| Input | Type | Notes |
|---|---|---|
query |
string | Matches anywhere in the name or email, case-insensitively. |
limit |
integer | At most this many people, 1 to 50. Defaults to 25. There is no cursor, so narrow with query. |
list_teams
Section titled “list_teams”List the organization’s teams and their current members, and get the id a write
needs. The team to tell in add_announcement_audience (actorType TEAM) is
named by the id this returns. Each member is an id, a name and an email. An
organization admin sees every team, a team admin sees their own, and anyone else
sees none. Not paginated. No inputs.
list_members
Section titled “list_members”List the organization’s people, as the members page does: each person’s role,
whether they are active or have left, their teams and company roles and, for an
organization admin, who they report to. Active people unless status says
otherwise, ordered by name, with a total. Use it to answer “who is on the team”,
“who holds this company role”, or “who has left”, or to find the id get_member
and get_user_progress take. To find one person by name, find_people is cheaper.
An owner, admin or billing admin reads everyone. Anyone else is shown only
themself, and an external account is refused. noManager and the
organization-only fields are for an organization admin. Limited to 30 calls a
minute.
| Input | Type | Notes |
|---|---|---|
query |
string | Text to find in the name or email. The whole text has to appear in one of them, and case does not matter. |
status |
string | active (the default), deactivated, or all. |
teamId |
string | Only members of this team, an id from list_teams. |
noManager |
boolean | Only people with no manager. Organization admins only. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Max members, 1–100. Default 50. |
get_member
Section titled “get_member”Get one person in the organization, at any status: their role, teams, company roles and, for an organization admin, their manager, phone and when they left. An owner, admin or billing admin may open anyone with a record here. A manager may open someone who reports to them, without those organization-admin fields. Anyone else may open only themself and is told anyone else was not found, which is also the answer for an id from another organization. An external account is refused.
| Input | Type | Notes |
|---|---|---|
memberId |
string | The person’s user id, from list_members or find_people. Required. |
list_pending_invitations
Section titled “list_pending_invitations”List the invitations that have been sent and not yet accepted, newest first, with the role each person will have when they accept. Expired invitations are included and marked. Use it to answer “who have we invited but not heard from”. An invitation has no id here, because the id is what its public accept page is addressed by. Organization admins only. No inputs.
list_member_progress
Section titled “list_member_progress”List each person with how much training they have: their lesson enrollments, pop
quizzes and last review, as the progress page does. People who have left are
included, because this is a record of who was trained, and someone loaded in bulk who
has never signed in is not listed until they do. For how one person is doing, with
completion and overdue counts, use get_user_progress.
An organization admin sees every row. Anyone else sees their own, and an external account is refused. Limited to 30 calls a minute.
| Input | Type | Notes |
|---|---|---|
query |
string | Text to find in the name or email. The whole text has to appear in one of them, and case does not matter. |
teamId |
string | Only members of this team, an id from list_teams. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Max people, 1–100. Default 50. |
list_reporting_lines
Section titled “list_reporting_lines”List each person and the manager they have been given. This is the reporting line,
not the role tree: two people who share a title are not each other’s managers.
reportsTo is null for someone with no manager, a manager who has left is still
named with their status, and a manager the organization records without an account
has a null id and name. Use noManager for “who has no manager”, and
get_org_chart for the chart of roles.
Organization admins only. Limited to 30 calls a minute.
| Input | Type | Notes |
|---|---|---|
status |
string | active (the default), deactivated, or all. |
noManager |
boolean | Only people with no manager. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Max people, 1–100. Default 50. |
get_me
Section titled “get_me”Describe this connection: the person it acts as, their organization with its time
zone, the token behind it and when it expires, the product features the
organization has, and what the person may do. Use it to learn what you can and
cannot do before trying, and the organization’s time zone to read a date it means
as local. The time zone is null when the organization has not set one. No inputs.
list_findings
Section titled “list_findings”List what the organization has told Mereon to treat as true about itself, newest first: facts an admin wrote and ones the system recorded from the organization’s website or a research conversation. The AI features read them as established fact, so this is where to look when an answer assumes something about the organization. Each says whether a person or the system wrote it; who wrote it is not returned.
Needs the access an organization admin has (owners, admins and billing admins); anyone else is refused.
| Input | Type | Notes |
|---|---|---|
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Max findings, 1–100. Default 50. |
get_org_chart_verification
Section titled “get_org_chart_verification”Get whether an admin has confirmed the org chart recently: never_verified,
current, or reverification_due, when it was last confirmed and when the next
confirmation is due. Confirmations are every 90 days. Use it for “is our org chart
up to date”. Who confirmed it is not returned. Needs access to the org chart. No
inputs.
get_directory_sync
Section titled “get_directory_sync”Get the organization’s connection to its identity directory (SCIM): its status,
when the directory last authenticated and last changed something, whether it
paused itself and why, and how many people it has provisioned, updated,
deactivated and skipped. eligible says whether the plan includes it; a lapsed
organization can still read what the directory did. The token is not returned, not
even its display prefix. Needs the access an organization admin has; anyone else is
refused. No inputs.
list_directory_sync_events
Section titled “list_directory_sync_events”List what the identity directory has done to the organization’s people, newest first: each operation, whether it was applied, skipped, rejected or failed, and why, with the address the directory’s request named. Use it to answer “why was she not provisioned” or “what failed overnight”. The sentence the app prints, the directory’s own id for the person and the employee record are left out. Pass the cursor from the last response to read the next page. Needs the access an organization admin has; anyone else is refused.
| Input | Type | Notes |
|---|---|---|
outcome |
string | Only events with this outcome: APPLIED, SKIPPED, REJECTED, or FAILED. |
cursor |
string | The cursor from the previous response. |
limit |
number | Max events, 1–100. Default 50. |
get_org_chart
Section titled “get_org_chart”Get the organization chart: every position with the role it reports to, the people
who currently hold it, and whether it is vacant. Someone who has left does not count
as holding a role, so a seat only they held reads as vacant. Rebuild the tree from each role’s
reportsToRoleId. Use it for “who holds this role?” and “which roles are
unfilled?”. This is the chart of roles, and who answers to whom is a different
question, which get_my_reporting_line answers for the connected user. Needs
access to the org chart (company-role.read). Not paginated. No inputs.
get_my_reporting_line
Section titled “get_my_reporting_line”Get the connected user’s place in the organization: the roles they hold, who they
report to (at most one person), and who reports directly to them. People come from
the manager each person has been given and not from the role tree, so two people
who share a title are not each other’s managers. Only people who are currently
employed are listed. Needs access to the org chart (company-role.read). No
inputs.
get_user_progress
Section titled “get_user_progress”Get another person’s training progress: the lessons they are enrolled in, each with completion and score, the obligations they have been assigned, each with a due date and whether it is overdue, and a roll-up count. Use it for “how is Maria doing on her training?”.
The rule is whatever the app applies to those two lists. You can read your own, an
organization admin can read anyone’s, and a manager can read someone who reports
to them.
Anyone you may not read is reported as not found, as is a person from another
organization. A person who has left is found, because the app keeps their record
and an audit asks for it. For your own training, use list_my_enrollments and
list_my_obligations.
| Input | Type | Notes |
|---|---|---|
userId |
string | The person’s id, from find_people, list_teams or get_org_chart. Required. |
get_user_learning_queue
Section titled “get_user_learning_queue”Get the ranked list of topics a person should study next: why each is queued
(NEW, PARTIAL, RETRAINING or DEEPEN), its
priority, any due date and whether it is overdue, whether an unfinished
prerequisite blocks it, and a lesson to start from. Use it for “what is Maria
behind on?” or “who has overdue training?”. The result also names the person.
The rule is the one the app applies to a person’s learning queue. You can read your
own, an organization admin can read anyone’s, and anyone else can read the people
who report to them, directly or further down the org chart. The reporting line is
the manager each person has been given, not the role tree. Anyone you may not read
is reported as not found, as is a person from another organization. A person who
has left has an empty queue. Topics are limited to what you can read, but lessons
assigned to the person are listed by title either way. For your own queue, use
get_my_learning_queue. It is worked out from scratch on every call, so it is
limited to 20 calls a minute, and so is get_my_learning_queue.
| Input | Type | Notes |
|---|---|---|
userId |
string | The person’s id, from find_people, list_teams or get_org_chart. Required. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Max entries, 1–100. Default 50. |
Your own training
Section titled “Your own training”The tools below read the connected user’s own training. None of them takes a
person as an input, so there is no way to use them to read a colleague’s record.
They need only the read scope.
list_my_obligations
Section titled “list_my_obligations”List the training the connected user has been assigned: lessons, topics and items, each with its due date, whether it is required, whether it is overdue, and whether it is still active or completed. Cancelled and waived obligations are administrative states and are not returned. Not paginated. No inputs.
list_my_enrollments
Section titled “list_my_enrollments”List the lessons the connected user is enrolled in, newest first, each with whether
it is completed or in progress, the score where one is recorded, and any due date.
The id of an enrollment is what get_quiz_results takes. Not paginated. No
inputs.
list_my_pop_quizzes
Section titled “list_my_pop_quizzes”List the pop quizzes assigned to the connected user, each with its prompt, due
date, and the connected user’s own status and score. It never shows how anyone else
did. A pop quiz’s id is what get_pop_quiz takes. Not paginated. No inputs.
list_pop_quizzes
Section titled “list_pop_quizzes”List the organization’s pop quizzes, newest first, each with who sent it, how many
people it went to and how many have finished. Use it to find the id get_pop_quiz
takes, which is how you read how each recipient did. It needs organization-wide
access to pop quizzes, which owners, admins and billing admins have. Anyone else is
refused, and list_my_pop_quizzes lists the ones sent to them. A pop quiz that
certifies an announcement carries its announcementId.
| Input | Type | Notes |
|---|---|---|
sentByMe |
boolean | Only the pop quizzes the connected user sent. |
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Max pop quizzes, 1–100. Default 50. |
get_my_learning_queue
Section titled “get_my_learning_queue”Get the ranked list of topics the connected user should study next, the same queue
as their dashboard. Each entry says why it is queued (NEW, PARTIAL,
RETRAINING or DEEPEN), its priority, any due date and whether it is overdue,
whether an unfinished prerequisite blocks it, and a lesson to start from when one
exists. total counts the whole queue. The queue is recomputed on every call, so
entries can shift between pages.
| Input | Type | Notes |
|---|---|---|
cursor |
string | Pagination cursor from a previous response. |
limit |
number | Max entries, 1–100. Default 50. |
get_quiz_results
Section titled “get_quiz_results”Get the per-question results of the quizzes on one lesson enrollment: for each question, whether the learner got it right, the answer they gave, the correct answer and the explanation, plus the overall score and summary. A learner reads their own. Anyone else needs the review access the app asks for before it shows an enrollment’s answers, which only owners, admins and billing admins have, and a manager does not. Anyone else is told it was not found. The correct answer and explanation are withheld for a question that has not been answered yet, for a reviewer as well as the learner.
| Input | Type | Notes |
|---|---|---|
lessonEnrollmentId |
string | The id of an entry from list_my_enrollments. Required. |
get_pop_quiz
Section titled “get_pop_quiz”Get one pop quiz with its recipients and how each did: who it went to, whether
they finished, and their score, plus how many finished. An owner, admin or billing
admin sees every recipient. A recipient sees the pop quiz they were sent with only
their own row. Anyone else is told it was not found. Ids come from
list_pop_quizzes, which is for admins, and from list_my_pop_quizzes, which lists
the ones sent to the connected user.
| Input | Type | Notes |
|---|---|---|
popQuizId |
string | The id of an entry from list_pop_quizzes or list_my_pop_quizzes. Required. |
Announcements
Section titled “Announcements”An announcement tells people something has changed and makes the knowledge base agree with what was said. See Announcements for the model: who may read one is separate from who is told, and sending is not a single call.
The author’s tools below need announcement access, which admins, owners and billing admins have.
list_announcements
Section titled “list_announcements”List the organization’s announcements, in every state from draft to retracted. Each one gives its title, status, who it is for, what it says, and whether it asks recipients to take a pop quiz. This is the author’s view. To read one you were sent, use read_announcement.
| Input | Type | Notes |
|---|---|---|
status |
string | Only announcements in this state: DRAFT, PLANNING, PLANNED, IN_REVIEW, READY, SENDING, SENT, FAILED or RETRACTED. |
get_announcement
Section titled “get_announcement”Fetch one announcement as its author sees it: what it says (resolved from the topics, items and resources it draws on), the selections and audience it was built from, whether it asks for a pop quiz, and where it is in its life. Selection and audience entry ids come from here.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
get_announcement_plan
Section titled “get_announcement_plan”The changes to the knowledge base that sending an announcement would make (items added, superseded or retired, topics added or superseded), and which of them the author has excluded. plan is null until planning has been started.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
get_announcement_delivery
Section titled “get_announcement_delivery”How far a send got: how many people were addressed, how many could not be told, how many are still outstanding, and how many failed. delivery is null until it has been sent.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
get_announcement_pop_quiz
Section titled “get_announcement_pop_quiz”For an announcement that asked recipients to take a pop quiz on what it says: who has taken it, whether they finished, and their score. popQuiz is null when it did not ask.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
get_announcement_retraction_preview
Section titled “get_announcement_retraction_preview”What retracting a sent announcement would undo, which of those changes cannot be undone (an issue is filed for each instead), and how many people would be told it was withdrawn. canRetract is false once the 48-hour window has closed.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
read_announcement
Section titled “read_announcement”Read a sent announcement as its audience does: the title, who wrote it, when it was sent and what it says. Works for anyone the announcement was visible to, with no announcement access needed, unlike get_announcement, which is the author’s view of one in any state. A draft, or one you cannot see, is not found.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
Changing announcements
Section titled “Changing announcements”These need a connection granted the announcement:write scope, and the person behind
it must hold the matching permission, checked on every call. Each one is recorded in
the audit log against the announcement. A tool that loses something or sends it is
marked so an assistant can ask before running it.
create_announcement
Section titled “create_announcement”Start a draft announcement. Nothing is required up front. Then say what it says, choose who may read it and who is told, plan it, and send it. Nothing reaches anyone until send_announcement. Needs announcement.create.
| Input | Type | Notes |
|---|---|---|
title |
string | The title recipients see. Can be empty while drafting; sending needs one. |
everyone |
boolean | True if everyone in the organization may read it, false for admins only. This is who can see it, not who is told. |
update_announcement
Section titled “update_announcement”Change a draft: its title, who may read it, and whether recipients are asked to take a pop quiz confirming they understood it. Sending needs everyone and requiresPopQuiz each chosen, true or false. The title and everyone can only change while it is a draft, so call reopen_announcement first if it has been planned.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
title |
string | The new title. |
everyone |
boolean | True if everyone may read it, false for admins only. |
requiresPopQuiz |
boolean | True to ask recipients to take a short pop quiz confirming they understood it. |
popQuizDueDate |
string | null | ISO 8601 date-time the pop quiz is due, with any UTC offset, in the future. null returns to the default window. |
delete_announcement
Section titled “delete_announcement”Permanently delete a draft. Anything past draft is refused: reopen a planned one first, and withdraw a sent one with retract_announcement. Needs announcement.delete.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
set_announcement_text
Section titled “set_announcement_text”Set the text the author wrote for a draft, as opposed to what is drawn from the library. Calling it again replaces the earlier text, and an empty body clears it.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
body |
string | The announcement text. Required. |
title |
string | A name for the text. Defaults to the announcement’s title. |
add_announcement_content
Section titled “add_announcement_content”Draw on something already in the knowledge base so the announcement says what the knowledge base says: a whole resource, a topic, or a single item.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
kind |
string | RESOURCE, TOPIC or ITEM. Required. |
targetId |
string | The content id, topic id or item id, matching kind. Required. |
remove_announcement_content
Section titled “remove_announcement_content”Take something out of a draft. With only selectionId it removes that whole selection. With itemId as well it keeps the selection and leaves just that item out.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
selectionId |
string | The selection id, from get_announcement. Required. |
itemId |
string | Leave just this item out instead of removing the whole selection. |
add_announcement_audience
Section titled “add_announcement_audience”Choose who a draft is told to. An audience wider than who may read the announcement is refused, and third parties cannot be added.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
actorType |
string | INDIVIDUAL, TEAM, ROLE, ROLE_KIND or ORGANIZATION. Required. |
actorId |
string | For INDIVIDUAL a user id (an active member), for TEAM or ROLE the team or company role id, for ORGANIZATION the organization id, for ROLE_KIND INTERNAL or EXTERNAL. Required. |
remove_announcement_audience
Section titled “remove_announcement_audience”Take an entry out of a draft’s audience.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
audienceId |
string | The audience entry id, from get_announcement. Required. |
plan_announcement
Section titled “plan_announcement”Start working out which knowledge-base items and topics sending would add, supersede or retire. The announcement needs its own words first, because every change the plan proposes cites them. It runs in the background and returns at once with the announcement in PLANNING; poll get_announcement_plan until the plan appears. send_announcement is refused until this has been done.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
set_announcement_change_excluded
Section titled “set_announcement_change_excluded”Decide whether one planned change is left out of what sending does. State the outcome rather than toggling, so repeating the call is safe.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
sequence |
number | The change’s sequence, from get_announcement_plan. Required. |
excluded |
boolean | True to leave the change out, false to put it back. Required. |
preview_announcement_notification
Section titled “preview_announcement_notification”Show what the email and text will say and how many people they would go to, without sending anything. willBeTold is the number of people a send would tell right now: pass it as expectedRecipientCount to send_announcement. It writes the opening line if there is not one yet, so the sentence previewed is the sentence delivered.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
send_announcement
Section titled “send_announcement”Tell the audience by email and text, publish what the plan changes, and make the announcement readable. This reaches real people, and can be withdrawn for 48 hours, which tells everyone. Send only when the person has explicitly asked, after they have seen the plan and the notification. Refused until the announcement has been planned, has a title, has had everyone and requiresPopQuiz chosen, and has an audience. Having a plan does not mean anyone has read it, so pass expectedRecipientCount: a send that would now tell a different number of people is refused and nothing goes out. Returns at once with the announcement in SENDING; follow it with get_announcement_delivery. Calling it again on a FAILED send finishes it. Limited to five calls a minute and thirty an hour.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
expectedRecipientCount |
integer | The number of people you expect it to tell: willBeTold from preview_announcement_notification. If it would now tell a different number, nothing is sent. It is checked when the call is accepted, so it guards against a stale preview and not against a change in the seconds before delivery starts. |
retract_announcement
Section titled “retract_announcement”Within 48 hours of sending, undo what the announcement changed in the knowledge base and tell everyone the send attempted that it was withdrawn. Changes that cannot be undone are left, with an issue filed for each. Call get_announcement_retraction_preview first and show the person what it would do.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
reopen_announcement
Section titled “reopen_announcement”Take a planned announcement that has not been sent back to editing, so its words, title or content can change. The plan is kept until you change what the announcement says or draws on, and a plan that survived can be sent as it is. After such a change, plan it again.
| Input | Type | Notes |
|---|---|---|
announcementId |
string | The announcement id. Required. |
Adding documents and videos
Section titled “Adding documents and videos”These add content to the organization’s library. They need a connection granted
the content:write scope, and the person behind it must be allowed to add that
kind of content, checked on every call. They create and never edit: none of them
changes something that already exists. See
Creating documents and YouTube videos for the full rules.
Every one takes a visibility, which is the person’s choice: an assistant should
ask rather than assume everyone. For a document it also decides whether it
publishes or goes to an administrator for review, and the result says which in
mode. Each one is recorded in the audit log, and each is limited to 10 calls a
minute and 100 an hour. Sending for review is held lower, because every
proposal emails the administrators: 3 a minute and 20 an hour for one person,
across every connection and the REST API together.
create_document_from_scratch
Section titled “create_document_from_scratch”Write a new document into the library from a title and a markdown body. If the person may publish to the visibility named, it is published (or kept as a draft with asDraft); otherwise it goes to review. Returns mode, draft, contentId, reviewRequestId, title and url. draft: true means the document exists and is not live: do not create it again. Needs document.create, or content-review.create to submit for review.
| Input | Type | Notes |
|---|---|---|
title |
string | Required. Up to 255 characters, on one line. |
content |
string | The whole document, in markdown, up to 500,000 characters. Required. |
visibility |
string | everyone, teams or admins. Required. |
teamIds |
string[] | Team ids from list_teams, with teams only. |
asDraft |
boolean | Leave it unpublished, for someone to look over and publish in Mereon. Ignored when it goes to review. |
create_document_from_url
Section titled “create_document_from_url”Fetch a public page or file, such as a PDF, and add it to the library as a document. Publishes or goes to review on the same rule, and returns the same fields. Addresses on a private network and video sites are refused. Needs document.create, or content-review.create to submit for review.
| Input | Type | Notes |
|---|---|---|
url |
string | An http or https address. Required. |
visibility |
string | everyone, teams or admins. Required. |
teamIds |
string[] | Team ids from list_teams, with teams only. |
add_youtube_video
Section titled “add_youtube_video”Add a YouTube video to the library by its link. There is no review lane, as in the app: it needs video.create, and the visibility has to be one the person may publish to. Returns contentId, alreadyInLibrary, title and url. For a video already in the library, alreadyInLibrary is true, nothing is created, and its visibility is left as it was; if the person cannot see that video, its contentId, title and url are null. title is also null for a new import until processing reads it from YouTube.
| Input | Type | Notes |
|---|---|---|
url |
string | A YouTube watch, share or shorts link. Required. |
visibility |
string | everyone, teams or admins. Required. |
teamIds |
string[] | Team ids from list_teams, with teams only. |
Assigning training
Section titled “Assigning training”These decide what people owe. They need a connection granted the
training:assign scope, and the person behind it must be allowed to do the act,
checked on every call. An organization admin reaches anyone, a team admin the
people on teams they administer, and only an organization admin may excuse someone or move
a due date. See Assigning training for the full
rules.
Several reach real people by email and text. An assistant should only call them
when the person asked, and confirm who they go to first. Each is recorded in the
audit log. assign_training and unassign_training are limited to 10 calls a
minute and 60 an hour, create_pop_quiz to 5 and 30, and the rest to 30 and
300.
Obligation ids come from get_user_progress (another person’s) or
list_my_obligations (your own). The obligation tools return the obligation as
it stands after the change: id, userId, itemType, itemId, status,
required, dueDate, dueDateOverridden and needsReview.
assign_training
Section titled “assign_training”Require a lesson of everyone, of the people on some teams, or of named people, optionally with a deadline. Each person it newly reaches gets the lesson, a quiz prepared for them, and an email and text. Returns lessonId, title and assigned, one { userId, enrollmentId } per person newly reached; people who already had it are not listed. Needs lesson-enrollment.create.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | From list_lessons. Required. |
audience |
string | everyone, teams or users. Required. |
teamIds |
string[] | Team ids from list_teams, with teams only. |
userIds |
string[] | Person ids from find_people, with users only. Up to 500. |
dueDate |
string | Due at this moment, ISO 8601 with a UTC offset. |
dueInDays |
integer | Due this many days after it is assigned, 1 to 3,650. Give at most one of dueDate and dueInDays. |
unassign_training
Section titled “unassign_training”Take a lesson back from named people. Their enrollment in progress is removed with their progress in it, and the requirement is cancelled; a completed enrollment is kept. Only an organization admin may take back a lesson that is required of someone. Returns lessonId, title and removedCount. Needs lesson-enrollment.delete.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | Required. |
userIds |
string[] | Person ids from find_people. Required. |
set_retraining_policy
Section titled “set_retraining_policy”Set how often people who completed a lesson must take it again, or turn that off. Needs permission to edit that lesson. Returns the policy as get_lesson_retraining_policy does.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | Required. |
retrainingType |
string | recurring, or none. Required. |
intervalDays |
integer | Days between retakes, 1 to 3,650. With recurring only. |
completionMode |
string | full_retake or changed_material. With recurring only. |
assign_knowledge_obligation
Section titled “assign_knowledge_obligation”Require one person to learn a topic or a knowledge item. They must hold a duty on it, directly or through a role or team; the level they must reach follows from that duty. Returns the obligation. Needs lesson-enrollment.create.
| Input | Type | Notes |
|---|---|---|
userId |
string | From find_people. Required. |
itemType |
string | topic or item. Required. |
itemId |
string | Required. |
dueDays |
integer | Days from now until it is due, 1 to 3,650. |
reason |
string | Up to 2,000 characters. |
assign_manual_retraining
Section titled “assign_manual_retraining”Require one person to take a lesson again within a number of days, and tell them. Returns the obligation. Needs lesson-enrollment.create.
| Input | Type | Notes |
|---|---|---|
userId |
string | Required. |
lessonId |
string | Required. |
dueDays |
integer | 1 to 3,650. Required. |
retrainingResetsClock |
boolean | Whether completing it counts as their next scheduled retake. Required. |
reason |
string | Up to 2,000 characters. |
waive_obligation
Section titled “waive_obligation”Excuse a person from something they owe, as a deliberate exception. For a lesson they are told. It cannot be undone. Returns the obligation, now waived. Needs lesson-enrollment.update, at organization scope in practice.
| Input | Type | Notes |
|---|---|---|
obligationId |
string | Required. |
reason |
string | Why, kept on the record. Required. |
cancel_obligation
Section titled “cancel_obligation”End a requirement that was assigned by mistake or no longer applies. For a lesson the person is told, and their enrollment is left as it is. Returns the obligation, now cancelled. Needs lesson-enrollment.update, at organization scope in practice.
| Input | Type | Notes |
|---|---|---|
obligationId |
string | Required. |
reason |
string | Why, kept on the record. Required. |
override_obligation
Section titled “override_obligation”Set the due date a person sees on something they owe, by hand, or pass null to take that override off. For a lesson, setting a date tells the person. Returns the obligation. Needs lesson-enrollment.update, at organization scope in practice.
| Input | Type | Notes |
|---|---|---|
obligationId |
string | Required. |
dueDate |
string | null | ISO 8601 with a UTC offset, or null. Required. |
confirm_obligation_review
Section titled “confirm_obligation_review”Settle an obligation flagged needsReview at the date given, or with none, and clear the flag. Returns the obligation. Needs lesson-enrollment.update, at organization scope in practice.
| Input | Type | Notes |
|---|---|---|
obligationId |
string | Required. |
resolvedDueDate |
string | null | ISO 8601 with a UTC offset. Leave out or null for none. |
create_pop_quiz
Section titled “create_pop_quiz”Send a short quiz on a video, document or guide to everyone, to some teams, or to named people. Questions are written for each person after this returns, and each is told by email and text once theirs are ready; follow it with get_pop_quiz. Every recipient must be able to see the content. If its questions cannot be started, nothing is created and it is safe to try again. Returns id, title, dueDate and url. Needs pop-quiz.create at organization scope.
| Input | Type | Notes |
|---|---|---|
contentId |
string | A video, document or guide. Required. |
audience |
string | everyone, teams or users. Required. |
teamIds |
string[] | With teams only. |
userIds |
string[] | With users only. |
dueDate |
string | ISO 8601 with a UTC offset, in the future. Required. |
difficulty |
string | SIMPLE, MODERATE, CHALLENGING or ADVANCED. |
Authoring lessons
Section titled “Authoring lessons”These create and change lessons. They need a connection granted the
lesson:write scope, and the person behind it must be allowed to do the act on
the lesson named, checked on every call: an organization admin can change any
lesson, a team admin the lessons shared with teams they administer. See
Authoring lessons for the full rules.
An assistant should only call them when the person asked. Creating a lesson,
changing what it teaches or its settings, writing its material again and
splitting it have a model write material, and are limited to 5 calls a minute
and 30 an hour; sharing, choosing or clearing its picture, closing, reopening
and deleting to 30 and 300. Each is recorded in the audit log. The tools that
leave a lesson in place return it as get_lesson does. Uploading a picture is
an API call, under Authoring lessons.
create_lesson
Section titled “create_lesson”Create a lesson from resources, topics or both, and start writing its material, which takes a few minutes. Only pass a title the person gave: without one the lesson is named from its material. Creating a lesson assigns it to nobody: use assign_training for that. Returns the lesson. Needs lesson.create.
| Input | Type | Notes |
|---|---|---|
visibility |
string | Who can take it: everyone, teams or admins. Required. Only an organization admin may use everyone or admins. |
teamIds |
string[] | Team ids from list_teams, with teams only. |
contentIds |
string[] | Resource ids from list_content or search_mereon, in teaching order. Up to 50. |
topicIds |
string[] | Topic ids from list_topics or search_mereon, taught after the resources. Up to 50. Give at least one resource or topic. |
title |
string | Kept as given. |
format |
string | GUIDED (default) or CURATED. Fixed once created. |
difficulty |
string | SIMPLE (default), MODERATE, CHALLENGING or ADVANCED. |
thoroughness |
string | MINIMAL, STANDARD (default), THOROUGH or INTENSIVE. |
requiredContentIds |
string[] | CURATED only: the resources a learner has to finish before moving on. |
update_lesson
Section titled “update_lesson”Change a lesson’s title, description, difficulty, thoroughness or whether simulations are on; only what is given changes. A new difficulty writes the quiz plan and material again. Returns the lesson. Needs lesson.update on that lesson.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | From list_lessons or get_lesson. Required. |
title |
string | One line. |
description |
string | Up to 5,000 characters. |
difficulty |
string | SIMPLE, MODERATE, CHALLENGING or ADVANCED. |
thoroughness |
string | MINIMAL, STANDARD, THOROUGH or INTENSIVE. |
simulationsEnabled |
boolean | Whether role-play and other simulations are on. |
update_lesson_content
Section titled “update_lesson_content”Replace the resources a lesson teaches from, in order, and its topics when given (left out, they are kept). It replaces rather than adds, so read the lesson with get_lesson first and send the whole list. When what it teaches from changed, its quiz plan and material are written again. Returns lesson and retainedTeamAccess, the teams that keep access to a resource taken out. Needs lesson.update on that lesson.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | Required. |
contentIds |
string[] | The resources from now on, in order. Required. |
topicIds |
string[] | The topics from now on. |
requiredContentIds |
string[] | CURATED lessons only. |
share_lesson
Section titled “share_lesson”Set who can take a lesson, replacing who could before. It decides who can take it, not who has to. Returns the lesson. Needs lesson.update on that lesson.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | Required. |
visibility |
string | everyone, teams or admins. Required. |
teamIds |
string[] | With teams only. |
generate_lesson_content
Section titled “generate_lesson_content”Start writing a lesson’s material again from what it teaches from. Returns lessonId and started, which is false when it was already being written. Needs lesson.update on that lesson.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | Required. |
close_lesson
Section titled “close_lesson”Withdraw a lesson: it leaves the catalog and cannot be assigned, and everyone’s history is kept. If people are part-way through, an assistant should ask whether they may finish (keep) or stop now (revoke) and never choose revoke itself. Returns lesson and stoppedCount. Refused when it is already closed. Needs lesson.update on that lesson.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | Required. |
reason |
string | Kept in the lesson’s history. |
inFlightAccess |
string | keep (default) or revoke. |
reopen_lesson
Section titled “reopen_lesson”Put a closed lesson back in the catalog. Find it with list_lessons and includeClosed. People stopped when it closed stay stopped. Returns the lesson. Refused when it is already open. Needs lesson.update on that lesson.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | Required. |
delete_lesson
Section titled “delete_lesson”Delete a lesson nobody has been enrolled in. A lesson anyone has been enrolled in is refused with the counts, because deleting it would erase their records: close it instead. A team admin’s delete stops sharing the lesson with the teams they administer and leaves it for everyone else. Returns lessonId, outcome (deleted or unshared) and, when unshared, teamIds. A deletion also returns requiredCount, the people still required to take the lesson whose requirement it cancelled, and roleCount, the roles whose training it was removed from. Needs lesson.delete on that lesson.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | Required. |
split_lesson
Section titled “split_lesson”Ask a model how to split a lesson whose topics fall into groups with nothing between them. Changes nothing. Returns summary and lessons, each part with its tempId, title, description, rationale, topics and contents. Show the plan to the person and apply it only once they agree. Needs lesson.update on that lesson and access to everything it teaches from.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | Required. |
apply_lesson_split
Section titled “apply_lesson_split”Apply a plan from split_lesson, edited or not. The part with the most topics is written into the lesson being split, which keeps its id, enrollments and sharing; every other part becomes a new lesson. Returns lessons, one { tempId, lessonId, title, url, kept } per part. Needs lesson.create, and lesson.update on the lesson being split.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | The lesson being split. Required. |
lessons |
object[] | The parts, 2 to 10: each { tempId, title, description, topicIds, contentIds }. Required. |
visibility |
string | Who the new lessons are shared with: everyone, teams or admins. Required. |
teamIds |
string[] | With teams only. |
set_lesson_tags
Section titled “set_lesson_tags”Set the tags a lesson carries, by name, replacing the ones it had: read them with get_lesson first and send the whole list. An empty list clears them. Each has to be one of the organization’s tags from list_tags. Returns the lesson. Needs lesson.update on that lesson.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | Required. |
tags |
string[] | Tag names. Up to 50. Required. |
set_lesson_poster
Section titled “set_lesson_poster”Choose the resource a lesson shows as its picture. It has to be a resource the lesson already teaches from (contents on get_lesson). Pass null to clear that choice. When the lesson has an uploaded image, that image is what people see until delete_lesson_poster_image removes it. Uploading an image is an API call. Returns the lesson. Needs lesson.update on that lesson.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | Required. |
posterContentId |
string | null | A resource the lesson already teaches from, or null to clear that choice. Required. |
delete_lesson_poster_image
Section titled “delete_lesson_poster_image”Remove the uploaded picture from a lesson. The resource chosen as its picture, if any, is what people see again. Returns the lesson. Needs lesson.update on that lesson.
| Input | Type | Notes |
|---|---|---|
lessonId |
string | Required. |
Managing content
Section titled “Managing content”These change what is already in the library. They need a connection granted
the content:manage scope, and the person behind it must be allowed to do the
act on the resource named, checked on every call: an organization admin can
change any resource, a team admin the resources shared with teams they
administer. Renaming and deleting tags and changing what a team holds need an
organization admin. They do not delete a resource or share one outside the
organization. Deleting is its own scope, under
Deleting content. See
Managing content for the full rules.
An assistant should only call them when the person asked. Publishing a draft
has the resource read again by a model and is limited to 5 calls a minute and 30
an hour; the rest to 30 and 300. Each is recorded in the audit log. The tools
that leave a resource in place return it as get_content does.
update_content
Section titled “update_content”Change a video’s, audio’s or guide’s title or summary; only what is given changes. A guide shows the change at once and is left with a draft for publish_draft. A document’s title is changed with edit_document. Returns the resource. Needs content.update on that resource.
| Input | Type | Notes |
|---|---|---|
contentId |
string | From list_content, search_mereon or get_content. Required. |
title |
string | One line, up to 255 characters. |
summary |
string or null | Up to 5,000 characters. null clears a video’s or audio’s summary; a guide’s cannot be cleared. |
get_document_draft
Section titled “get_document_draft”Read the title and text edit_document replaces: the document’s draft when it has one, and otherwise what a new draft starts from, its title and published text. Returns contentId, hasDraft, title and body. Build a new body from this one: get_content_text is the published text and leaves out what a draft already changed. Needs content.update on that document.
| Input | Type | Notes |
|---|---|---|
contentId |
string | A document. Required. |
edit_document
Section titled “edit_document”Save a new title, new text or both to a document’s draft. The text replaces the whole draft, so read what it replaces with get_document_draft first and send everything that should stay. Learners keep reading the published document until publish_draft. Returns content and draft, whose retrainingIntentRequired says whether publishing it needs a retraining choice. Needs content.update on that document.
| Input | Type | Notes |
|---|---|---|
contentId |
string | A document. Required. |
title |
string | One line, up to 255 characters. |
body |
string | The whole text, in markdown. |
update_transcript
Section titled “update_transcript”Save a video’s or audio recording’s transcript as a draft. segments replaces the whole transcript, so read it with get_content_transcript first (pass the draft’s version id from list_content_versions when one exists) and send every segment that should stay. At least one segment. startMs and endMs are whole milliseconds from the start of the recording, zero or greater, and endMs is not before startMs. Learners keep the published recording until publish_draft. Returns content and draft, whose retrainingIntentRequired says whether publishing it needs a retraining choice. Needs content.update on that resource.
| Input | Type | Notes |
|---|---|---|
contentId |
string | A video or an audio recording. Required. |
title |
string | One line, up to 255 characters. The title the recording takes when the draft is published. |
segments |
object[] | The whole transcript, at least one segment. Each is { text, startMs, endMs }. Whole milliseconds, zero or greater, and endMs is not before startMs. Required. |
publish_draft
Section titled “publish_draft”Make a document’s, guide’s, video’s or audio recording’s draft the version learners read. Once it has been published before, a guide, a video, an audio recording, and a document whose text changed are indexed again and can retrain the people already trained on it, so it needs retrainingIntent, which is the person’s decision: an assistant should ask, never choose. A document whose draft only renames it, or a first publish, needs none. A recording whose transcript has no words is refused before its status changes. Returns the resource. Needs content.update on that resource.
| Input | Type | Notes |
|---|---|---|
contentId |
string | A document, guide, video or audio recording. Required. |
retrainingIntent |
string | none, full_retake (take the lesson again) or changed_material (a short lesson on what changed). |
discard_draft
Section titled “discard_draft”Throw away a document’s, guide’s, video’s or audio recording’s draft, leaving the published version as it is. For a video or an audio recording, the transcript goes back to the published chapters. Refused, before anything changes, when there is no draft or the resource has never been published. Returns the resource. Needs content.update on that resource.
| Input | Type | Notes |
|---|---|---|
contentId |
string | A document, guide, video or audio recording. Required. |
rollback_content
Section titled “rollback_content”Make an earlier published version of a video or an audio recording the one learners read, and throw away its draft. versionId is a published version of this resource from list_content_versions. The transcript saved on the recording stays as it is; call update_transcript afterwards when it should match the version learners now read. Returns the resource. Needs content.update on that resource.
| Input | Type | Notes |
|---|---|---|
contentId |
string | A video or an audio recording. Required. |
versionId |
string | A published version id from list_content_versions. Required. |
share_content
Section titled “share_content”Set who in the organization can read a resource, replacing who could before. Only an organization admin may use everyone or admins; a team admin names teams they administer and changes only those. Returns the resource. Needs content.update on that resource.
| Input | Type | Notes |
|---|---|---|
contentId |
string | Required. |
visibility |
string | everyone, teams or admins. Required. |
teamIds |
string[] | Team ids from list_teams, with teams only. |
set_content_tags
Section titled “set_content_tags”Set the tags a resource carries, by name, replacing the ones it had: read them with get_content first and send the whole list. An empty list clears them. Each has to be one of the organization’s tags from list_tags. Returns the resource. Needs content.update on that resource.
| Input | Type | Notes |
|---|---|---|
contentId |
string | Required. |
tags |
string[] | Tag names. Up to 50. Required. |
create_tag
Section titled “create_tag”Add a tag to the organization’s vocabulary. The name is stored lowercase, with spaces and punctuation turned into hyphens and anything other than the letters a to z, digits, hyphens and underscores dropped, accents included; a name the organization already has is refused. Returns the tag. Needs content.update.
| Input | Type | Notes |
|---|---|---|
name |
string | Up to 40 characters. Required. |
rename_tag
Section titled “rename_tag”Rename one of the organization’s tags everywhere it is used. A new name that is already a tag is refused. Returns the tag under its new name. Needs organization.update.
| Input | Type | Notes |
|---|---|---|
tagName |
string | The tag to rename, as list_tags names it. Required. |
name |
string | Its new name. Required. |
delete_tag
Section titled “delete_tag”Delete one of the organization’s tags, which takes it off every resource and lesson that carries it. Returns the tag that was deleted. Needs organization.update.
| Input | Type | Notes |
|---|---|---|
tagName |
string | As list_tags names it. Required. |
add_team_content
Section titled “add_team_content”Add resources to what a team holds, alongside what it already has, so everyone on the team can read them. Each has to be a video, document, guide or audio the person can open. Returns teamId and the contentIds named, all of which the team now holds; it may have held some already. Needs team.update on that team.
| Input | Type | Notes |
|---|---|---|
teamId |
string | From list_teams. Required. |
contentIds |
string[] | 1 to 50 resource ids. Required. |
remove_team_content
Section titled “remove_team_content”Take a resource off what a team holds. People on the team can still read it if it is shared with everyone or another team they are on. Refused when the team does not hold it. Needs team.update on that team.
| Input | Type | Notes |
|---|---|---|
teamId |
string | Required. |
contentId |
string | Required. |
Deleting content
Section titled “Deleting content”These remove resources from the library. They need a connection granted the
content:delete scope, and the person behind it must be allowed to delete
resources, checked on every call. An organization admin deletes them. A team
admin mostly removes them from the teams they administer, and a guide is
deleted for the whole organization. See
Deleting content for the full rules.
Call preview_content_deletion first and show the person what it says. Call
delete_content only after they agree. dismissIssues and
retireOrphanedTopics stay unset unless they said so. When people are
part-way through a lesson this would close, ask whether to keep them going or
stop them. Both tools are limited to 30 calls a minute and 300 an hour, counted
per tool. Each resource removed or taken off a team is recorded in the audit
log.
preview_content_deletion
Section titled “preview_content_deletion”See what deleting these resources would do, before anything changes. Returns which would be deleted, which a team admin would only remove from their teams, which lessons would close, who is part-way through those, which topics would be left with no evidence, which lessons retiring those topics would close, and which open issues stand in the way. Needs content.delete. Changes nothing.
| Input | Type | Notes |
|---|---|---|
contentIds |
string[] | Resource ids from list_content, search_mereon or get_content, 1 to 25. Required. |
delete_content
Section titled “delete_content”Delete the resources the person agreed to, after preview_content_deletion. dismissIssues and retireOrphanedTopics are their answers and stay unset unless they said so. When the preview says people are part-way through a lesson this would close, send inFlightAccess as they decided: keep leaves them going and revoke stops them. A resource the answers leave blocked is refused, and nothing is deleted, until every such reason is answered. Returns what happened to each one: deleted, unshared or kept. Needs content.delete.
| Input | Type | Notes |
|---|---|---|
contentIds |
string[] | Resource ids from list_content, search_mereon or get_content, 1 to 25. Required. |
inFlightAccess |
string | keep or revoke. The person decides. Required when people are part-way through a lesson the delete would close, and also when retireOrphanedTopics is true and people are part-way through a lesson retiring those topics would close. |
dismissIssues |
boolean | True only when the person agreed to dismiss the open issues that block these resources. |
retireOrphanedTopics |
boolean | True only when the person agreed to retire topics this would leave with no evidence. When there are such topics, this also needs permission to retire topics. |
Deciding a content review
Section titled “Deciding a content review”approve_content_review, reject_content_review and
request_content_review_changes decide a submission waiting in the queue. They
need a connection granted the content-review:write scope, and the person
behind it must be allowed to review submissions, which owners and admins are,
checked on every call. See Decide a review
for the full rules.
Call one only when the person has agreed. Approving publishes the submission or
applies the issue fix. Ask what should happen to people already trained: leaving
retrainingIntent out stores none and retrains nobody. Leave visibility out
unless they named who can read a new submission. Leave onStalePreview out
unless they chose. rebuild refuses and prepares a new preview, and
extract-afresh approves and works the changes out again.
Each decision is limited to 5 calls a minute and 30 an hour, and each is recorded in the audit log. The note sent to the submitter stays on the request.
approve_content_review
Section titled “approve_content_review”Approve a pending content review, which publishes the submission or applies the issue fix. Returns the request. Needs permission to review submissions.
| Input | Type | Notes |
|---|---|---|
requestId |
string | From list_content_review_requests. Required. |
reviewNote |
string | A note stored with the decision, up to 4,000 characters. Only when the person wrote one. |
retrainingIntent |
string | none, full_retake, or changed_material. Ask when anyone is already trained. Leave it out and nobody is retrained. |
visibility |
string | everyone, teams, or admins. Leave it out unless the person said who can read a new submission. A held demo keeps the audience chosen when it was uploaded. |
teamIds |
string[] | The teams, from list_teams, when visibility is teams. |
forceIfBaseVersionChanged |
boolean | Approve when the submission was edited again after this review was opened. Only when the person said to go ahead. |
onStalePreview |
string | rebuild refuses and prepares a new preview. extract-afresh approves and works the changes out again. Leave it out unless the person chose, which uses rebuild. |
reject_content_review
Section titled “reject_content_review”Reject a pending content review and send reviewNote to the person who submitted it. A first submission that is rejected releases its source, so it can be submitted again as something new. Returns the request. Needs permission to review submissions.
| Input | Type | Notes |
|---|---|---|
requestId |
string | Required. |
reviewNote |
string | What the submitter is told, in their words. Required. Up to 4,000 characters. |
request_content_review_changes
Section titled “request_content_review_changes”Ask the person who submitted a pending content review to change it, and send reviewNote to them. The submission stays out of the library. Returns the request. Needs permission to review submissions.
| Input | Type | Notes |
|---|---|---|
requestId |
string | Required. |
reviewNote |
string | What the submitter should change, in their words. Required. Up to 4,000 characters. |
Managing teams
Section titled “Managing teams”create_team, update_team, delete_team, add_team_members,
remove_team_members and set_team_member_role create a team, rename it,
delete it, and change who is on it. They need a connection granted the
team:manage scope, and the person behind it must be allowed to create,
change or delete that team, which owners and admins are, checked on every
call. See Teams for the full rules.
Call one only when the person has agreed. People added with add_team_members
join as team-viewer. Someone already on the team keeps their current role.
set_team_member_role changes it. A batch applies one person at a time, so a
later refusal leaves the earlier changes in place. Removing someone is refused
when it would take away training their job still requires. Someone who is not
on the team is refused.
Each call is limited to 10 a minute and 60 an hour, and each is recorded in the audit log. What a team holds in the library stays under “Managing content”.
create_team
Section titled “create_team”Create a team. The new team has no members. Returns the team. Needs permission to create teams.
| Input | Type | Notes |
|---|---|---|
name |
string | The team name, on one line, up to 255 characters. Required. |
update_team
Section titled “update_team”Rename a team. Returns the team and how many people are on it. Needs permission to change that team.
| Input | Type | Notes |
|---|---|---|
teamId |
string | From list_teams. Required. |
name |
string | The new name, on one line, up to 255 characters. Required. |
delete_team
Section titled “delete_team”Delete a team. Returns the team and how many people were on it. Needs permission to delete that team.
| Input | Type | Notes |
|---|---|---|
teamId |
string | From list_teams. Required. |
add_team_members
Section titled “add_team_members”Add people who already belong to the organization. Each joins as team-viewer. Someone already on the team keeps their current role. Returns the team and each membership. Needs permission to change that team.
| Input | Type | Notes |
|---|---|---|
teamId |
string | From list_teams. Required. |
userIds |
string[] | From find_people, 1 to 100. Repeated ids are asked once. Required. |
remove_team_members
Section titled “remove_team_members”Remove people from a team. Refused when the removal would take away training their job still requires. Someone who is not on the team is refused. Returns the team and each membership that was removed. Needs permission to change that team.
| Input | Type | Notes |
|---|---|---|
teamId |
string | From list_teams. Required. |
userIds |
string[] | From find_people, 1 to 100. Repeated ids are asked once. Required. |
set_team_member_role
Section titled “set_team_member_role”Set whether someone administers a team or belongs to it. They must already be on the team. Returns that membership. Needs permission to change that team.
| Input | Type | Notes |
|---|---|---|
teamId |
string | From list_teams. Required. |
userId |
string | From find_people. Required. |
role |
string | team-admin or team-viewer. Required. |
Managing company roles
Section titled “Managing company roles”create_company_role, update_company_role, publish_company_role,
discard_company_role_draft, move_company_role, delete_company_role,
merge_company_role, assign_company_role_members,
unassign_company_role_members, set_company_role_advancement_path and
set_company_role_member_standing create a company role, change its name or
description, move it, merge it, delete it, and choose who holds it. They need
a connection granted the company-role:manage scope, and the person behind it
must be allowed to create, change or delete that role, which owners and admins
are, checked on every call. See Company roles for the
full rules.
Call one only when the person has agreed. A name or description change is a
draft until publish_company_role. Readers keep seeing the live name until
then. A batch applies one person at a time, so a later refusal leaves the
earlier changes in place. Someone who cannot open the role’s training is
refused. Someone who does not hold the role is refused on a removal.
Each call is limited to 10 a minute and 60 an hour, and each is recorded in
the audit log. A role’s curriculum is add_curriculum_item and
remove_curriculum_item. What an external role can read is add_content_grant and remove_content_grant.
Duties are create_duty, change_duty, and delete_duty.
create_company_role
Section titled “create_company_role”Create a company role. Leave parentRoleId out and it sits at the top of the chart. kind defaults to INTERNAL. Returns the role. Needs permission to create company roles.
| Input | Type | Notes |
|---|---|---|
name |
string | The role name, on one line, up to 255 characters. Required. |
kind |
string | INTERNAL or EXTERNAL. Optional. |
parentRoleId |
string | null | The role it reports to, from list_company_roles. Leave it out, or send null, to place it at the top. |
update_company_role
Section titled “update_company_role”Save a new name or description as a draft. Readers keep seeing the live name until publish_company_role. Send at least one of name and description. Returns the draft and the live name. Needs permission to change that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | From list_company_roles. Required. |
name |
string | The new name, on one line. Optional. |
description |
string | The new description, up to 20,000 characters. Optional. |
publish_company_role
Section titled “publish_company_role”Make a draft name and description the ones readers see. Refused when the role has no draft. Returns the role. Needs permission to change that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | From list_company_roles. Required. |
discard_company_role_draft
Section titled “discard_company_role_draft”Throw away a draft name or description. The live role is unchanged. Refused when the role has no draft. Returns the live role. Needs permission to change that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | From list_company_roles. Required. |
move_company_role
Section titled “move_company_role”Set the role this one reports to. parentRoleId null places it at the top of the chart. A move that would put a role under itself, or an internal role under an external role, is refused. Returns the role. Needs permission to change that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | From list_company_roles. Required. |
parentRoleId |
string | null | The role it should report to, or null. Required. |
delete_company_role
Section titled “delete_company_role”Delete a company role. Returns the role and how many people held it. Needs permission to delete that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | From list_company_roles. Required. |
merge_company_role
Section titled “merge_company_role”Move this role’s people, curriculum, duties and child roles onto the target role, then delete this role. The two roles have to be the same kind. Returns the role that remains. Needs permission to delete this role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | The role being merged away, from list_company_roles. Required. |
targetRoleId |
string | The role that remains, from list_company_roles. Required. |
assign_company_role_members
Section titled “assign_company_role_members”Assign people who already belong to the organization. An internal person on an external role, or an external person on an internal role, is refused. Someone who cannot open the role’s training is refused. Assigning someone who already holds the role refreshes that assignment. Returns the role and each membership. Needs permission to change that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | From list_company_roles. Required. |
userIds |
string[] | From find_people, 1 to 100. Repeated ids are asked once. Required. |
unassign_company_role_members
Section titled “unassign_company_role_members”Remove people from a company role and cancel the training that role assigned them. Someone who does not hold the role is refused. Returns the role and each membership that was removed. Needs permission to change that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | From list_company_roles. Required. |
userIds |
string[] | From find_people, 1 to 100. Repeated ids are asked once. Required. |
set_company_role_advancement_path
Section titled “set_company_role_advancement_path”Replace a company role’s advancement path. The first tier is the most junior. An empty list removes the path. Send a tier’s id to keep that step when its label changes. Returns the path. Needs permission to change that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | From list_company_roles. Required. |
tiers |
object[] | Most junior first, at most 100. Each has label and an optional id. Required. |
set_company_role_member_standing
Section titled “set_company_role_member_standing”Set or clear where someone stands on a company role’s advancement path. standingTierId null clears an explicit standing so the lowest tier applies. The tier has to be on this role’s path. They must already hold the role. Returns that standing. Needs permission to change that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | From list_company_roles. Required. |
userId |
string | From find_people. Required. |
standingTierId |
string | null | A tier on this role’s path, or null. Required. |
Managing a role’s curriculum
Section titled “Managing a role’s curriculum”add_curriculum_item and remove_curriculum_item add or remove a lesson or a
topic on a company role’s training curriculum. They need a connection granted
the curriculum:manage scope, and the person behind it must be allowed to
change that role, which owners and admins are, checked on every call. See
Add a curriculum item for the full
rules.
Call one only when the person has agreed. People who already hold the role are
not given a new item unless applyToExisting is true. A topic can be added
only when the role already has a duty on it. Send only the fields for the due
date you chose. Changing an item after it is added stays in the app. What an
external role can read is content-grant:manage.
Each call is limited to 10 a minute and 60 an hour, and each is recorded in the audit log on the company role.
add_curriculum_item
Section titled “add_curriculum_item”Add a lesson or a topic to a company role’s curriculum. People who already hold the role are not given it unless applyToExisting is true. A topic can be added only when the role already has a duty on it. Returns the curriculum item. id is the lesson or topic id. Needs permission to change that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | From list_company_roles. Required. |
itemType |
string | lesson or topic. Required. |
itemId |
string | The lesson id from list_lessons, or the topic id from list_topics. Required. |
applyToExisting |
boolean | When true, people who already hold the role are given this item. Defaults to false. |
dueDateType |
string | none, fixed, or relative. Required. Send only the fields that type uses. |
dueDateFixed |
string | ISO date-time. Required when dueDateType is fixed. |
dueDateRelativeDays |
number | At least 1. Required when dueDateType is relative. |
dueDateRelativeAnchor |
string | employment_start, role_assignment_date, or first_login. Required when dueDateType is relative. |
retraining |
object | null | Omit, or null, to keep the item’s own rule. retrainingType none turns retraining off for this role. recurring also names intervalDays and completionMode (full_retake or changed_material). |
tierQualifier |
string | ALL, MIN, MAX, or EXACT. Defaults to ALL. |
advancementTierId |
string | null | A tier on this role’s path. Required for MIN, MAX, or EXACT. Omit it for ALL. |
remove_curriculum_item
Section titled “remove_curriculum_item”Remove a lesson or a topic from a company role’s curriculum. itemType and itemId are what get_company_role returns for that item. Returns the item that was removed. Needs permission to change that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | From list_company_roles. Required. |
itemType |
string | lesson or topic. Required. |
itemId |
string | The lesson or topic id, from get_company_role. Required. |
What an external role can read
Section titled “What an external role can read”add_content_grant and remove_content_grant grant or remove a video, an
audio file, a document, or a guide that an external company role can read.
They need a connection granted the content-grant:manage scope, and the
person behind it must be allowed to change that role, which owners and admins
are, checked on every call. See
Add a content grant for the full
rules.
Call one only when the person has agreed. Granting a resource that is already granted leaves it in place. An internal role is refused. A lesson stays on the curriculum.
Each call is limited to 10 a minute and 60 an hour, and each is recorded in the audit log on the company role.
add_content_grant
Section titled “add_content_grant”Give an external company role access to one video, audio file, document, or guide. Granting a resource that is already granted leaves it in place. An internal role is refused. Returns the grant. Needs permission to change that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | The external company role, from list_company_roles. Required. |
contentId |
string | The video, audio, document, or guide id, from list_content. Required. |
remove_content_grant
Section titled “remove_content_grant”Remove one resource from an external company role. contentId is what get_company_role returns in contentGrants. A grant that is not on the role is refused. Returns the grant that was removed. Needs permission to change that role.
| Input | Type | Notes |
|---|---|---|
roleId |
string | The external company role, from list_company_roles. Required. |
contentId |
string | From contentGrants on get_company_role. Required. |
Retiring a topic
Section titled “Retiring a topic”preview_topic_retirement, withdraw_topic and reinstate_topic withdraw a
topic the organization no longer follows, and bring one back. They need a
connection granted the topic:retire scope, and the person behind it must be
allowed to retire topics, which owners and admins are, checked on every call.
See Retire a topic for the full rules.
Call withdraw_topic and reinstate_topic only when the person has agreed.
Look at preview_topic_retirement first. When learnersInProgressCount is
above zero, ask whether those people finish or stop, and pass that choice.
Never choose it. Leaving it out lets them finish. The videos and documents
stay in the library. Retiring one item, while the topic continues, is
item:retire.
Each call is limited to 10 a minute and 60 an hour, and a retirement is recorded in the audit log on the topic.
preview_topic_retirement
Section titled “preview_topic_retirement”What retiring this topic would withdraw. Writes nothing. learnersInProgressCount is how many people are part-way through a lesson this would close. Needs permission to retire topics.
| Input | Type | Notes |
|---|---|---|
topicId |
string | From list_topics or get_topic. Required. |
withdraw_topic
Section titled “withdraw_topic”Withdraw a topic the organization no longer follows. Call it only when the user has agreed. Look at preview_topic_retirement first. When people are part-way through, ask whether they finish or stop, and pass that as inFlightAccess. Never choose it. Leaving it out lets them finish. The videos and documents stay in the library. A topic that is already retired is refused. Returns the retirement. Needs permission to retire topics.
| Input | Type | Notes |
|---|---|---|
topicId |
string | From list_topics or get_topic. Required. |
reason |
string | Why the organization no longer follows this topic, up to 2,000 characters. Optional. |
inFlightAccess |
string | keep or revoke. Leave it out to let people finish. |
reinstate_topic
Section titled “reinstate_topic”Bring a retired topic back. Call it only when the user has agreed. Required training the retirement cancelled is not put back. A topic that is not retired is refused. A topic whose evidence was deleted is refused. Returns the retirement that was restored. Needs permission to retire topics.
| Input | Type | Notes |
|---|---|---|
topicId |
string | From list_topics or get_topic. Required. |
Retiring an item
Section titled “Retiring an item”preview_item_retirement, withdraw_item and reinstate_item withdraw one
item the organization no longer follows, and bring one back. They need a
connection granted the item:retire scope, and the person behind it must be
allowed to retire items, which owners and admins are, checked on every call.
See Retire an item for the full rules.
Call withdraw_item and reinstate_item only when the person has agreed.
Look at preview_item_retirement first. The topic continues, and lessons
that teach it stay open. There is no choice about people part-way through,
because no lesson closes. Child items go with the item. The videos and
documents stay in the library.
Each call is limited to 10 a minute and 60 an hour, and a retirement is recorded in the audit log on the item.
preview_item_retirement
Section titled “preview_item_retirement”What retiring this item would withdraw. Writes nothing. The topic continues, so no lesson closes. childItemCount is how many child items go with it. Needs permission to retire items.
| Input | Type | Notes |
|---|---|---|
itemId |
string | From get_item or get_topic_items. Required. |
withdraw_item
Section titled “withdraw_item”Withdraw one item the organization no longer follows. Call it only when the user has agreed. Look at preview_item_retirement first. The topic continues, and lessons that teach it stay open. Child items go with it. The videos and documents stay in the library. An item that is already retired is refused. An item whose topic is retired is refused. Returns the retirement. Needs permission to retire items.
| Input | Type | Notes |
|---|---|---|
itemId |
string | From get_item or get_topic_items. Required. |
reason |
string | Why the organization no longer follows this item, up to 2,000 characters. Optional. |
reinstate_item
Section titled “reinstate_item”Bring a retired item back. Call it only when the user has agreed. Child items this retirement archived come back with it. Required training the retirement cancelled is not put back. An item that is not retired is refused. An item whose topic is still retired is refused. Returns the retirement that was restored. Needs permission to retire items.
| Input | Type | Notes |
|---|---|---|
itemId |
string | From get_item or get_topic_items. Required. |
A partner’s clients
Section titled “A partner’s clients”For a solutions partner: list_clients and get_client_adoption read the
partner’s clients and need only read, and get_client_terms and
create_client create a new one and need a connection granted the
client:create scope. The person behind the connection must have the access an
organization admin has (owners, admins and billing admins), checked on every
call. An organization that is not a solutions partner is refused. See
Clients for the full rules.
Call create_client only when the person has agreed, after showing them
get_client_terms’s summary for the billing they chose. Never choose the
billing for them: it decides who pays. The connection stays pinned to the
partner, so it cannot act inside the new client. To set the client up, the
person connects again and chooses the client on the consent screen.
create_client is limited to 5 calls a minute and 30 an hour, and
get_client_terms to 10 a minute and 60 an hour. A new client is recorded in
the partner’s audit log and in the client’s own.
list_clients
Section titled “list_clients”List the partner’s active clients, by name: how each is billed, who pays, the partner’s discount or commission on it as a fraction, its member count and its subscription. Archived clients are left out. Needs the access an organization admin has.
| Input | Type | Notes |
|---|---|---|
cursor |
string | nextCursor from the previous page. |
limit |
number | Max clients, 1–100. Default 50. |
get_client_adoption
Section titled “get_client_adoption”How well one client is using Mereon: a health tier, members who signed in within 7 and 30 days, content, training owed, and this week’s activity, questions asked and lessons completed against the week before. All counts: no person is named. A client that is not one of this partner’s active clients is refused.
| Input | Type | Notes |
|---|---|---|
clientId |
string | From list_clients. Required. |
get_client_terms
Section titled “get_client_terms”What creating a client with this billing would mean for this partner: who pays, the discount or commission copied onto the client, and the Pro trial it starts on, with summary, a sentence to show the person. Writes nothing. Runs the checks create_client runs, so a referral partner who has not finished payout setup, or a reseller partner with no payment method, is refused here too. Needs permission to create clients.
| Input | Type | Notes |
|---|---|---|
billing |
string | reseller (the partner pays, at its reseller discount) or referral (the client pays, and the partner earns its referral commission). Required. |
create_client
Section titled “create_client”Create a client of the partner: the organization, its Pro trial (billed to the partner for a reseller client), and an invitation to its owner when one is named. Send the same requestKey when retrying: a retry returns the client the first call made with created: false, and tries an owner invitation the first could not send. A retry while the first call is still running is refused and changes nothing; send it again in a minute. The same key with a different request is refused. A retry days later is still safe. A failed invitation does not fail the call: owner.status is failed and owner.message says why. Returns the client, the terms, the owner invitation and connect, which says how to set the client up. Needs permission to create clients.
| Input | Type | Notes |
|---|---|---|
name |
string | One line, up to 200 characters. Required. |
domain |
string | The client’s website or domain. Optional. |
billing |
string | reseller or referral. Required, with no default. |
owner |
object | { name, email }. Invited by email to own the client. Optional. |
requestKey |
string | A key you choose, 8 to 100 letters, digits, ., _, : or -. The same on every retry of this request, and new for the next client. Required. |
Proposing a plan
Section titled “Proposing a plan”These tools let an assistant propose a set of changes as one plan, which the
person approves in Mereon before anything runs. A plan’s steps are the
assistant’s write actions, the same ones Mereon’s own chat assistant can
offer, limited to what the person may do. They need a connection granted the
plan:propose scope, and the person behind it must be allowed to use the
assistant, which every organization role is. A personal access token does not
have this scope unless it was given it.
There is no tool to approve a plan. Give the person the plan’s approveUrl
and ask them to check it and approve it there, signed in as themselves. Each
step is held to their own permissions when it is proposed, when it is approved
and when it runs. A plan can be read and changed only by the connection that
proposed it. Any other connection is told it was not found.
In an app that shows MCP Apps, such as Claude or ChatGPT, propose_plan and
get_plan also draw the plan as a card in the conversation: the same card
Mereon shows, with each step’s settings. The person can change a setting there,
which the card does through update_plan, and open the plan in Mereon to
approve it. The card’s data travels in the result’s _meta under
mereon.ai/plan, so the text the model reads stays the same. An app that does
not show MCP Apps shows the text alone.
propose_plan and update_plan are each limited to 20 calls a minute and 300
an hour. Each call is recorded in the audit log, and a proposal’s entry lists
its steps by id and action, not their arguments.
Every tool here except list_plan_tools returns the plan:
| Field | Notes |
|---|---|
planId |
Name it on get_plan and update_plan. |
status |
proposed, incomplete, running, finished or cancelled. An incomplete plan cannot be approved until what is missing is filled in. |
revision |
Name it on update_plan. |
approveUrl |
Where the person approves the plan. |
remaining |
What the request still needs beyond this plan, when you said. |
steps |
Each step’s id, tool, description, its fields (each with value, whether it is required and editable, any error and any choices), and needsInput when something on it is missing or was refused. |
results |
Once the plan has run, what each step did, with the ids of what it created. |
remainderPlanId |
After a run that stopped part-way, the plan offered for the rest. |
next |
What to do next, in a sentence. |
list_plan_tools
Section titled “list_plan_tools”The write actions you can put in a plan, limited to what the user may do. Without tools, each action’s name, description, what a later step can take from it (creates), and which of its arguments can take what an earlier step creates (takesFromSteps). Name actions in tools to get their args as well, which is the shape a step’s args must match. Writes nothing.
| Input | Type | Notes |
|---|---|---|
tools |
string[] | Action names to return with their arguments, up to 25. Leave it out to list every action without arguments. |
propose_plan
Section titled “propose_plan”Propose changes as a plan the user approves in the app. Nothing runs until they do. Each step names an action from list_plan_tools and its arguments. Resolve ids with the read tools first. A step that uses what an earlier step creates passes { "$step": "<that step's id>", "field": "<a name from its creates>" } where the id belongs, as the whole argument or as one element of a list, and only in an argument listed under takesFromSteps. Each step is checked as the app checks it, and a plan with a mistake is refused with what to fix. A value only the user may choose, or one that is missing, is asked for on the plan (needsInput), which they or update_plan can fill. Returns the plan.
| Input | Type | Notes |
|---|---|---|
steps |
object[] | The steps, in the order they run, from 1 to 25. Each is { id, tool, description, args }. tool and args are required. id defaults to s1, s2 and so on by position. description is up to 300 characters and shows only where the action cannot name the step itself. |
remaining |
string | What the request still needs beyond this plan, up to 1,000 characters, when it does only part of it. Optional. |
request |
string | The user’s request in their own words, up to 4,000 characters. Some checks read it, such as which content a quiz should be about. Optional. |
get_plan
Section titled “get_plan”A plan this connection proposed: whether it is waiting, running, finished or cancelled, each step and its settings, and once it has run, what each step did with the ids of what it created. A plan that stopped part-way names the plan offered for the rest (remainderPlanId). Writes nothing.
| Input | Type | Notes |
|---|---|---|
planId |
string | From propose_plan. Required. |
update_plan
Section titled “update_plan”Meant for the plan card, which marks it for the app’s use only (_meta.ui.visibility: ["app"]). An app that does not show MCP Apps lists it like any other tool, and calling it can do no more than change settings on a waiting plan.
Change settings on a plan that is waiting for approval, as the user can on the plan itself: one step, or every step of a group of repeated steps at once. Only a field marked editable can be set, and null clears one. A plan changed since the revision you name is refused, so read it again with get_plan. Each change is checked again, and a problem comes back on its field. Runs nothing. Returns the plan.
| Input | Type | Notes |
|---|---|---|
planId |
string | From propose_plan. Required. |
revision |
number | The revision propose_plan or get_plan last returned. Required. |
stepIds |
string[] | The step to change, or the steps of one group to change together. Required. |
set |
object | The fields to set, by name, to a value or to one of the field’s choices. null clears a field. Required. |
Filing issues
Section titled “Filing issues”create_issue files an issue about the knowledge base for the organization’s
reviewers. It needs a connection granted the issue:write scope, and the person
behind it must be allowed to file issues, which owners, admins and team admins
are, checked on every call. See File an issue for
the full rules.
An assistant should file an issue only when the person has agreed to it: show them what it will file and call the tool after they say yes. Filing is limited to 10 calls a minute and 60 an hour, and each is recorded in the audit log.
create_issue
Section titled “create_issue”File an issue: something wrong, missing, out of date, duplicated, conflicting or in the wrong place. Check list_issues for one already open about the same thing first. Every topic or item named by id has to be one the person can read, or the call is refused as not found. To report something missing, name it by title alone, or name the space or category it belongs in. An issue the person filed stays visible to them. Assigning it to a person or a company role notifies them. Recorded as raised by the person, with trigger MANUAL. Returns the issue as get_issue does. Needs issue.create.
| Input | Type | Notes |
|---|---|---|
type |
string | CONFLICT, DUPLICATE, MISCLASSIFICATION, STALE, CONTENT_GAP, STRUCTURE_GAP, or OTHER. Required. UPDATE_HELD and RETIRED_ITEM_REAPPEARED are raised by Mereon and cannot be filed. |
severity |
string | CRITICAL, HIGH, MEDIUM, or LOW. Required. |
title |
string | A short statement of the problem, up to 500 characters. Required. |
description |
string or null | What is wrong and what would fix it, up to 10,000 characters. |
targets |
object[] | 1 to 20, all of one targetType (TOPIC, ITEM, SPACE or CATEGORY), each { targetType, targetId, targetTitle }. targetId is a topic id from search_mereon or get_topic, an item id from get_item, a space id from list_spaces, or a category slug. Leave targetId off a topic or item to name it by title alone. The person who filed the issue can still read it. Other callers who cannot read the whole organization, and did not file it, cannot. CONFLICT and DUPLICATE need two or more. Required. |
assignedToRoleId |
string or null | A company role from list_company_roles. |
assignedToId |
string or null | A person from list_members. |
Public links
Section titled “Public links”These tools share a library resource with someone who has no account. They
need a connection granted the public-link:write scope. The person behind it
must also be allowed to do the act, checked on every call. An external
account cannot share or send. See Public links for the
full rules.
A link’s address is the secret that opens the resource, so the tools that
only read a link are on this scope too. Call create_public_link and
share_public_link only when the person has agreed, and state when the link
stops working before you create it. Never invent a password. Most of these
are limited to 30 calls a minute and 300 an hour. Sending is limited to 6 a
minute and 60 an hour.
create_public_link
Section titled “create_public_link”Share a library resource with someone who has no account, by a link they can open. Call this only when the user has agreed to share the material outside the organization. Tell them when the link stops working before you call it. Leave expiryKind off for 30 days. Send expiryDays only with days, and expiryAt only with at. A mismatch is refused. Never invent a password. When the user wants a password and did not supply one, set useSuggestedPassword and show them the password this returns. A password they supply is not retrievable. Needs permission to read the resource.
| Input | Type | Notes |
|---|---|---|
contentId |
string | The resource id, from list_content, search_mereon or get_content. Required. |
expiryKind |
string | never, days, or at. Leave it out for 30 days. days needs expiryDays. at needs expiryAt. never is refused when the organization caps how long a link may last. A number or instant sent with the wrong kind is refused. |
expiryDays |
number | How many days the link lasts, from 1 to 365. Send this only when expiryKind is days. |
expiryAt |
string | The ISO instant the link stops working. Send this only when expiryKind is at. |
password |
string | A password the user chose, 8 to 200 printable ASCII characters. Do not invent one. |
useSuggestedPassword |
boolean | Ask the server to generate a password. |
list_public_links
Section titled “list_public_links”Every link pointing at one resource, including ones that no longer open. Each row carries its address. A resource the user cannot read is not found. Needs permission to read the resource.
| Input | Type | Notes |
|---|---|---|
contentId |
string | The resource id. Required. |
list_organization_public_links
Section titled “list_organization_public_links”Every link in the organization, including ones that no longer open. Each row carries its address. Needs permission to update the organization, which owners and admins have. No inputs.
get_public_link_eligibility
Section titled “get_public_link_eligibility”Whether the user could share this resource, and the longest a link may last. A resource they cannot read is not found. Needs permission to read the resource.
| Input | Type | Notes |
|---|---|---|
contentId |
string | The resource id. Required. |
revoke_public_link
Section titled “revoke_public_link”Turn off one or more links, by id. An address that was already off counts as unchanged, and the count is how many changed. The record stays. Only the person who created a link, or an admin, can turn it off.
| Input | Type | Notes |
|---|---|---|
ids |
string[] | Link ids, from list_public_links or list_organization_public_links. 1 to 200. Required. |
rotate_public_link
Section titled “rotate_public_link”Replace a link’s address. The old address stops working and the new one is returned. History, password and expiry stay. Each call mints a new address. Only the person who created the link, or an admin, can replace it.
| Input | Type | Notes |
|---|---|---|
linkId |
string | The link id, from list_public_links or create_public_link. Required. |
share_public_link
Section titled “share_public_link”Send a link by email or text to people who have no account. Only call it when the user has agreed to send it, and only to the addresses they named. There is no message of your own. The text is the organization template. Partial delivery is success: the result names the addresses that did not go out. At most 20 recipients. An external account cannot send. Limited to 6 sends a minute and 60 an hour.
| Input | Type | Notes |
|---|---|---|
linkId |
string | The link id. Required. |
emails |
string[] | Email addresses the user named. |
phones |
string[] | Phone numbers the user named. |
list_public_link_recipients
Section titled “list_public_link_recipients”The addresses a link was sent to. Needs permission to read the resource. An external account cannot read them.
| Input | Type | Notes |
|---|---|---|
linkId |
string | The link id. Required. |
reveal_public_link_password
Section titled “reveal_public_link_password”The password the server generated for a link. Null when the creator supplied their own. Show it to the user. Do not invent a replacement. Needs permission to read the resource.
| Input | Type | Notes |
|---|---|---|
linkId |
string | The link id. Required. |
set_resource_public_sharing
Section titled “set_resource_public_sharing”Bar one resource from new public links, or lift the bar. Existing links stay, and whether they open is decided when someone opens them. Needs permission to update the resource. Someone who can read it and cannot update it is refused. Someone who cannot read it is told it was not found.
| Input | Type | Notes |
|---|---|---|
contentId |
string | The resource id. Required. |
blocked |
boolean | True stops new links to this resource. False lifts that bar. Required. |
get_public_link_settings
Section titled “get_public_link_settings”Whether links are on, whether a team-restricted resource can be shared, the longest a link may last, and whether a password is required. Needs permission to update the organization. No inputs.
update_public_link_settings
Section titled “update_public_link_settings”Change whether links are on, whether a team-restricted resource can be shared, the longest a link may last, and whether a password is required. Turning links off suspends every existing link. Null for publicLinkMaxDurationDays clears the cap. Leave a field out to keep it. Needs permission to update the organization.
| Input | Type | Notes |
|---|---|---|
publicLinksEnabled |
boolean | Whether anyone can share a resource this way. |
publicLinksAllowTeamRestricted |
boolean | Whether a resource shared with only some teams can have a public link. |
publicLinkMaxDurationDays |
number or null | The longest a link may last, in days, from 1 to 365. Null clears the cap. |
publicLinkPasswordRequired |
boolean | Whether a new link must have a password. |
Deciding issues
Section titled “Deciding issues”These tools dismiss an issue, reopen one, change who it is assigned to, merge
a duplicate, choose the correct version of a conflict, or fill a content gap.
Each needs a connection granted the issue:manage scope, and the person
behind it must be allowed to update issues, which owners, admins and team
admins are, checked on every call. See Decide an issue
for the full rules.
Call one only when the person asked. When a decision can retrain people who
were trained on the material it replaces, ask them. Leaving retrainingIntent
out stores none, and nobody is retrained. Each tool is limited to 10 calls a
minute and 40 an hour, and each is recorded in the audit log. The reason, a
note’s title and a note’s body stay off that row.
dismiss_issue
Section titled “dismiss_issue”Dismiss an open issue with the person’s reason. Show them the reason first. Returns the issue as get_issue does. Needs issue.update. An update held because it would remove too much (UPDATE_HELD) cannot be dismissed while it is held: it is answered in the app.
| Input | Type | Notes |
|---|---|---|
issueId |
string | From list_issues or get_issue. Required. |
reason |
string | Why it is being dismissed, in the person’s words, up to 10,000 characters. Required. |
reopen_issue
Section titled “reopen_issue”Reopen an issue that was resolved or dismissed. Returns the issue as get_issue does. Needs issue.update. An UPDATE_HELD issue cannot be reopened.
| Input | Type | Notes |
|---|---|---|
issueId |
string | Required. |
assign_issue
Section titled “assign_issue”Set who an issue is assigned to. Both fields are required. An id sets that side, and null clears it. Both null clears the assignment. Newly added recipients are notified. Returns the issue as get_issue does. Needs issue.update.
| Input | Type | Notes |
|---|---|---|
issueId |
string | Required. |
assignedToId |
string or null | A person from list_members, or null. Required. |
assignedToRoleId |
string or null | A company role from list_company_roles, or null. Required. |
merge_issue
Section titled “merge_issue”Merge the two topics a duplicate issue flags. winnerId remains and loserId is superseded. They have to be the two topics this issue flags. A duplicate that flags more than two topics is resolved from the issues page. Ask about retraining when people were trained on the material being replaced. Returns the issue as get_issue does. Needs issue.update.
| Input | Type | Notes |
|---|---|---|
issueId |
string | Required. |
winnerId |
string | The topic that remains. Required. |
loserId |
string | The topic that is superseded. Required. |
retrainingIntent |
string | none, full_retake, or changed_material. Leave it out to store none. |
retrainingDueDate |
string or null | YYYY-MM-DD. Send it only with full_retake or changed_material. |
select_issue
Section titled “select_issue”Choose the correct version of a conflict. selectedTargetId is the id of the issue’s target that is correct, from get_issue, rather than the topic or item behind it. Ask about retraining when people were trained on the material being replaced. Returns the issue as get_issue does. Needs issue.update.
| Input | Type | Notes |
|---|---|---|
issueId |
string | Required. |
selectedTargetId |
string | The issue target’s id, from get_issue. Required. |
retrainingIntent |
string | none, full_retake, or changed_material. Leave it out to store none. |
retrainingDueDate |
string or null | YYYY-MM-DD. Send it only with full_retake or changed_material. |
resolve_content_gap
Section titled “resolve_content_gap”Fill a content gap. strategy says how: contentGapUpload or contentGapCategoryUpload names a contentId already in the library (from list_content or an upload), contentGapLink names linkedType TOPIC and linkedId, and contentGapNote sends title and body. Send only that strategy’s fields. There is no file upload here. A category gap takes an upload. A contentGapUpload that has finished processing with no knowledge items is refused, so the issue is not left waiting. Ask about retraining when people were trained on the material being replaced. A category upload has no retraining fields. Leave override out unless the person asked to record the resolution after the coverage check declined. Returns the issue as get_issue does. Needs issue.update.
| Input | Type | Notes |
|---|---|---|
issueId |
string | Required. |
strategy |
string | contentGapUpload, contentGapCategoryUpload, contentGapLink, or contentGapNote. Required. |
contentId |
string | A resource already in the library. Required for an upload. |
via |
string | CONTENT_GAP_UPLOAD or CONTENT_GAP_RECORD. Leave it out for a file. Send it only with an upload. |
linkedType |
string | TOPIC. Required for a link. |
linkedId |
string | The topic that covers the gap, from get_topic. Required for a link. |
title |
string | The note title, up to 255 characters. Required for a note. |
body |
string | The note. Required for a note. |
override |
boolean | Record the resolution after the coverage check declined. Leave it out unless the person asked. |
retrainingIntent |
string | Leave it out to store none. A category upload has no retraining fields. |
retrainingDueDate |
string or null | YYYY-MM-DD. Send it only with full_retake or changed_material. |
Managing people
Section titled “Managing people”These tools invite people, change their organization role, deactivate or
reactivate them, remove them, and set who they report to. Each needs a
connection granted the member:manage scope, and the person behind it must be
allowed to do that act, which owners and admins are, checked on every call. See
Members for the full rules.
An assistant should call one only when the person asked for that change. Inviting someone sends them an email or a text. Deactivating or removing someone ends their access. Each tool is limited to 10 calls a minute and 60 an hour, and each is recorded in the audit log.
invite_member
Section titled “invite_member”Invite a person by email or phone. They are a member once they accept. Leave role out and acceptance chooses it: owner when the organization has none yet, otherwise viewer. An owner is given that role after they join. An external invitation needs companyRoleIds. Returns the invitation as list_pending_invitations shows one. The accept link stays on the invitation. Needs user.create.
| Input | Type | Notes |
|---|---|---|
name |
string | The name the organization will have on file. Required. |
email |
string or null | Required when the organization signs people in by email. |
phone |
string or null | Required when the organization signs people in by text. |
role |
string or null | admin, billing-admin, viewer or external. |
companyRoleIds |
string[] | Company roles they join when they accept, from list_company_roles. Required, and external, when role is external. |
teamIds |
string[] | Teams they join when they accept, from list_teams. |
set_member_role
Section titled “set_member_role”Change a member’s organization role to owner, admin, billing-admin, viewer or external. An external person’s role is set when they are invited, and changing it in either direction is refused. Demoting the last active owner is refused. Returns the member as get_member does. Needs user.update.
| Input | Type | Notes |
|---|---|---|
memberId |
string | The person’s user id, from list_members or find_people. Required. |
role |
string | Their new organization role. Required. |
deactivate_member
Section titled “deactivate_member”End a person’s access and free their seat. Their training history, teams and company roles stay. Deactivating the last active owner, or the connected user, is refused. Doing it again is safe. Returns the member as get_member does. Needs user.delete.
| Input | Type | Notes |
|---|---|---|
memberId |
string | Required. |
reactivate_member
Section titled “reactivate_member”Bring a deactivated person back, with their training history continuous. A comped organization at its seat cap is refused before anything changes. Doing it again for someone who is already active is safe. Returns the member as get_member does. Needs user.delete.
| Input | Type | Notes |
|---|---|---|
memberId |
string | Required. |
remove_member
Section titled “remove_member”Remove a person from the organization. Their training history and organization role stay, and they show as deactivated. Removal takes them off their teams, closes their company roles, and deletes their duties in this organization. Reactivating them later starts from that empty position. Deactivate them when their teams, company roles, and duties should stay. Removing the last active owner, or the connected user, is refused. Needs user.delete.
| Input | Type | Notes |
|---|---|---|
memberId |
string | Required. |
set_member_manager
Section titled “set_member_manager”Set or clear who a person reports to, by the manager’s user id from list_members. Pass null to clear it. A manager recorded without an account has no user id, so this tool has nothing to name them by. Needs organization-wide permission to update people, which owners and admins have, because the edge lets that manager see the person’s reviews and learning progress. Returns the member as get_member does. Needs user.update.
| Input | Type | Notes |
|---|---|---|
memberId |
string | Required. |
reportsToUserId |
string or null | The manager’s user id, or null to clear the reporting line. Required. |