Skip to content

Learn

Learning management: courses, lessons, members, cohorts, programs, stages, milestones, and progress. learn is the canonical home for Members — lookup_member lives here.

Endpoint https://learn.mcp.devfellowship.com/mcp
Tools 53 in 12 groups
Package packages/dfl-mcp-learn
Auth Your dfl-auth login token as Authorization: Bearer <token>. Every call runs as you, under RLS. See Auth & security.
.mcp.json
{
"mcpServers": {
"dfl-learn": {
"type": "http",
"url": "https://learn.mcp.devfellowship.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_ACCESS_TOKEN"
}
}
}
}

Other clients (Cursor, VS Code, codex, the Anthropic SDK): see Getting started, step 3.

Backing datalms / public schemas (courses, lessons, members, profiles, programs, progress).

The canonical Members group — member CRUD, profiles, and lookup_member (name → public.members.id, the id other MCPs reference, e.g. work.placements.member_id).

Find a member by name, and read or edit members and profiles.

list_members

List all members with optional filters.

List Members

List all members with optional filters. Returns members you have access to based on your permissions.

ParameterTypeRequiredDescription
limitnumbernoMaximum number of members to return (default: 50, max: 100)
offsetnumbernoNumber of members to skip (for pagination)
phase_idstringnoFilter by member phase (e.g., waiting_list, active, alumni)
is_activebooleannoFilter by active status.
searchstringnoSearch by name or email.

get_member

Get a specific member by their ID.

Get Member

Get a specific member by their ID.

ParameterTypeRequiredDescription
idstringyesThe UUID of the member.

create_member

Create a new community member.

Create Member

Create a new community member.

ParameterTypeRequiredDescription
namestringyesFull name of the member.
personal_emailstringnoPersonal email address.
corporate_emailstringnoCorporate/work email address.
phonestringnoPhone number.
citystringnoCity.
statestringnoState/Province.
phase_idstringnoMember phase (e.g., waiting_list, active)
tagsstring[]noTags for the member.

update_member

Update an existing community member.

Update Member

Update an existing community member.

ParameterTypeRequiredDescription
idstringyesThe UUID of the member to update.
namestringnoFull name of the member.
personal_emailstringnoPersonal email address.
corporate_emailstringnoCorporate/work email address.
phonestringnoPhone number.
citystringnoCity.
statestringnoState/Province.
phase_idstringnoMember phase.
tagsstring[]noTags for the member.
is_activebooleannoWhether the member is active.

delete_member

Soft delete a member by setting is_active to false.

Delete Member

Soft delete a member by setting is_active to false.

ParameterTypeRequiredDescription
idstringyesThe UUID of the member to delete.
hard_deletebooleannoIf true, permanently delete the member (use with caution)

lookup_member

Resolve a fellow's name to their public.members.id (e.g. the id used as work.placements.member_id).

Lookup Member

Resolve a fellow's name to their public.members.id (e.g. the id used as work.placements.member_id). Tries exact case-insensitive match first, then a fuzzy substring (ilike) match. Returns all candidates so the caller can disambiguate before using the id (e.g. creating a placement via the work MCP).

ParameterTypeRequiredDescription
namestringyesFellow's name (full or partial; case-insensitive)
limitnumbernoMaximum number of candidates to return (default 10)
include_inactivebooleannoInclude members where is_active = false (default false)

list_profiles

List user profiles with optional filters.

List Profiles

List user profiles with optional filters.

ParameterTypeRequiredDescription
limitnumbernoMaximum number of profiles to return (default: 50, max: 100)
offsetnumbernoNumber of profiles to skip (for pagination)
searchstringnoSearch by name or email.

get_profile

Get a specific user profile by ID.

Get Profile

Get a specific user profile by ID.

ParameterTypeRequiredDescription
idstringyesThe UUID of the profile.

update_profile

Update your own profile. Only the authenticated user can update their profile.

Update Profile

Update your own profile. Only the authenticated user can update their profile.

ParameterTypeRequiredDescription
namestringnoDisplay name.
avatar_urlstringnoAvatar URL.

The class groups (cohorts) of the learning platform.

list_cohorts

List LMS cohorts (batches, e.g. "Winter 2025", "Summer 2026") with optional filters.

List Cohorts

List LMS cohorts (batches, e.g. "Winter 2025", "Summer 2026") with optional filters. Reads lms.cohorts (RLS: any authenticated user can read).

ParameterTypeRequiredDescription
statusenumnoFilter by cohort lifecycle status. One of: active, graduated, draft, archived.
batch_typeenumnoFilter by batch type ('fellow' or 'organization') One of: fellow, organization.
searchstringnoSearch by cohort name or slug.
limitnumbernoMax cohorts to return (default 50, max 100)
offsetnumbernoNumber of cohorts to skip (pagination)

create_cohort

Create an LMS cohort (batch).

Create Cohort

Create an LMS cohort (batch). Admin only — RLS rejects writes from non-global-admins. If slug is omitted it is derived from the name.

ParameterTypeRequiredDescription
namestringyesCohort display name, e.g. "Winter 2025".
slugstringnoURL-safe slug (unique). Defaults to a slugified name, e.g. "winter-2025".
yearnumbernoCohort year (informational)
statusenumnoLifecycle status (default 'active') One of: active, graduated, draft, archived.
batch_typeenumnoBatch type, 'fellow' or 'organization' (default 'fellow') One of: fellow, organization.
organization_idstringnoOptional org id for organization batches.
organization_namestringnoOptional org display name.
starts_onstringnoInformational start date (YYYY-MM-DD). NOT used to drive the Gantt sequence.

update_cohort

Update an LMS cohort. Admin only — RLS rejects writes from non-global-admins.

Update Cohort

Update an LMS cohort. Admin only — RLS rejects writes from non-global-admins.

ParameterTypeRequiredDescription
idstringyesThe UUID of the cohort to update.
namestringnoCohort display name.
slugstringnoURL-safe unique slug.
yearnumbernoCohort year.
statusenumnoLifecycle status. One of: active, graduated, draft, archived.
batch_typeenumnoBatch type ('fellow' or 'organization') One of: fellow, organization.
organization_idstringnoOrg id for organization batches.
organization_namestringnoOrg display name.
starts_onstringnoInformational start date (YYYY-MM-DD)

Find, create and edit courses, and set who taught a course.

list_courses

List all courses with optional filters.

List Courses

List all courses with optional filters.

ParameterTypeRequiredDescription
limitnumbernoMaximum number of courses to return (default: 50, max: 100)
offsetnumbernoNumber of courses to skip (for pagination)
searchstringnoSearch by title or description.

get_course

Get a specific course by ID, including lesson count.

Get Course

Get a specific course by ID, including lesson count.

ParameterTypeRequiredDescription
idstringyesThe UUID of the course.

create_course

Create a new course. Admin only.

Create Course

Create a new course. Admin only.

ParameterTypeRequiredDescription
titlestringyesCourse title.
descriptionstringnoCourse description.
aboutstringnoDetailed information about the course.
thumbnailstringnoThumbnail URL.
positionnumbernoDisplay order position.

update_course

Update an existing course.

Update Course

Update an existing course. Admin only.

ParameterTypeRequiredDescription
idstringyesThe UUID of the course to update.
titlestringnoCourse title.
descriptionstringnoCourse description.
aboutstringnoDetailed information about the course.
thumbnailstringnoThumbnail URL.
positionnumbernoDisplay order position.

delete_course

Delete a course. Admin only.

Delete Course

Delete a course. Admin only. This will also delete all associated lessons.

ParameterTypeRequiredDescription
idstringyesThe UUID of the course to delete.

set_course_tutor

Set the tutor (the person who taught the course, on camera) for a course by writing lms.courses.tutor_id (FK -> work.members.id).

Set Course Tutor

Set the tutor (the person who taught the course, on camera) for a course by writing lms.courses.tutor_id (FK -> work.members.id). Distinct from author_id (LMS owner/uploader). Pass tutor_member_id = null to clear the attribution. Admin only.

ParameterTypeRequiredDescription
course_idstringyesThe UUID of the lms.courses row to attribute.
tutor_member_idstringyesThe work.members.id of the tutor who taught the course, or null to clear the attribution.

The lessons of a course: list, read, create and edit them.

list_lessons

List lessons for a specific course.

List Lessons

List lessons for a specific course.

ParameterTypeRequiredDescription
course_idstringyesThe UUID of the course (required)
limitnumbernoMaximum number of lessons to return (default: 50, max: 100)
offsetnumbernoNumber of lessons to skip (for pagination)
statusenumnoFilter by lesson status. One of: draft, published.

get_lesson

Get a specific lesson by ID.

Get Lesson

Get a specific lesson by ID.

ParameterTypeRequiredDescription
idstringyesThe UUID of the lesson.

create_lesson

Create a new lesson within a course.

Create Lesson

Create a new lesson within a course. Admin only.

ParameterTypeRequiredDescription
course_idstringyesThe UUID of the course this lesson belongs to.
titlestringyesLesson title.
descriptionstringnoLesson description.
video_urlstringnoVideo URL for the lesson.
durationnumbernoDuration in seconds.
positionnumbernoDisplay order position within the course.
statusenumnoLesson status (default: draft) One of: draft, published.

update_lesson

Update an existing lesson.

Update Lesson

Update an existing lesson. Admin only.

ParameterTypeRequiredDescription
idstringyesThe UUID of the lesson to update.
titlestringnoLesson title.
descriptionstringnoLesson description.
video_urlstringnoVideo URL.
durationnumbernoDuration in seconds.
positionnumbernoDisplay order position.
statusenumnoLesson status. One of: draft, published.
is_searchablebooleannoWhether the lesson is searchable.
transcriptionstringnoLesson transcription text.
standalone_titlestringnoStandalone title for the lesson.

delete_lesson

Delete a lesson. Admin only.

Delete Lesson

Delete a lesson. Admin only.

ParameterTypeRequiredDescription
idstringyesThe UUID of the lesson to delete.

Curriculum programs (the Gantt view): create one from a template for a cohort, and see how far each member got.

list_programs

List LMS programs (curriculum trees rendered by the Gantt).

List Programs

List LMS programs (curriculum trees rendered by the Gantt). A program is either a reusable TEMPLATE or a per-cohort INSTANCE. Filter by kind and/or cohort_id.

ParameterTypeRequiredDescription
kindenumnoFilter by 'template' (reusable plan) or 'instance' (a cohort's live program) One of: template, instance.
cohort_idstringnoFilter to the instance program belonging to this cohort.
searchstringnoSearch by program name or slug.
limitnumbernoMax programs to return (default 50, max 100)
offsetnumbernoNumber of programs to skip (pagination)

get_program

Read ONE LMS program by id (or slug) together with its full tree: stages (ordered by position) each with their milestones (ordered by position), plus the program's stage_dependencies edges.

Get Program (deep)

Read ONE LMS program by id (or slug) together with its full tree: stages (ordered by position) each with their milestones (ordered by position), plus the program's stage_dependencies edges. This is the read that powers the Gantt and verifies an authored template/instance. READ-ONLY.

ParameterTypeRequiredDescription
idstringnoThe program UUID (preferred). Provide id OR slug.
slugstringnoThe program slug (e.g. "winter-2025"). Used if id is omitted.

create_program

Create an LMS program. Admin only.

Create Program

Create an LMS program. Admin only. For kind='instance' (a cohort's live program), STRONGLY prefer the instantiate_program tool, which deep-copies a template into a cohort. Use create_program directly to author a new TEMPLATE, or to author an instance from scratch. Invariants: a template must NOT have cohort_id/source_program_id; an instance MUST have cohort_id.

ParameterTypeRequiredDescription
namestringyesProgram name.
slugstringnoURL-safe slug; defaults to a slugified name.
kindenumno'template' (reusable plan, default) or 'instance' (per-cohort) One of: template, instance.
statusenumnoProgram status (default 'active') One of: upcoming, locked, active, done.
cohort_idstringnoRequired for kind='instance' — the cohort this program serves. Must be omitted for templates.
source_program_idstringnoFor an instance authored from a template: the template id it was copied from. Omit for templates.

update_program

Update an LMS program's name, slug, or status.

Update Program

Update an LMS program's name, slug, or status. Admin only. Note: kind / cohort_id / source_program_id are immutable here — to put a template into a cohort use instantiate_program.

ParameterTypeRequiredDescription
idstringyesThe UUID of the program to update.
namestringnoProgram name.
slugstringnoURL-safe slug.
statusenumnoProgram status. One of: upcoming, locked, active, done.

delete_program

Delete an LMS program. Admin only.

Delete Program

Delete an LMS program. Admin only. CASCADE removes its stages, milestones, and stage_dependencies. Deleting an instance program detaches it from its cohort.

ParameterTypeRequiredDescription
idstringyesThe UUID of the program to delete.

instantiate_program

Deep-copy a TEMPLATE program tree (program -> stages -> milestones -> stage_dependencies) into a new per-cohort INSTANCE program, and return the new instance program id.

Instantiate Program

Deep-copy a TEMPLATE program tree (program -> stages -> milestones -> stage_dependencies) into a new per-cohort INSTANCE program, and return the new instance program id. This is the preferred way to give a cohort its curriculum. Admin only — the SQL function self-checks global-admin. Idempotent per cohort: if the cohort already has an instance program, that existing program id is returned (no duplicate tree).

ParameterTypeRequiredDescription
template_idstringyesThe UUID of the TEMPLATE program to copy (kind='template')
cohort_idstringyesThe UUID of the cohort to instantiate the program for.

get_program_member_progress

Read the lms.program_member_progress VIEW — computed per-(member, cohort) progress through the cohort's instance program (total milestones, done milestones, percentage, last completion).

Get Program Member Progress

Read the lms.program_member_progress VIEW — computed per-(member, cohort) progress through the cohort's instance program (total milestones, done milestones, percentage, last completion). READ-ONLY. RLS is security_invoker: a non-admin caller only sees their own progress rows; a global admin sees everyone. Provide cohort_id (recommended) and/or a specific user_id to filter.

ParameterTypeRequiredDescription
cohort_idstringnoFilter progress to a single cohort.
program_idstringnoFilter by the cohort's instance program id (resolved to its cohort_id under the hood)
user_idstringnoFilter to a single member (admin-only view of other members)
limitnumbernoMax rows to return (default 100, max 500)
offsetnumbernoNumber of rows to skip (pagination)

The top-level stages of a program.

list_stages

List the stages (top-level Gantt nodes) of a program, ordered by position.

List Stages

List the stages (top-level Gantt nodes) of a program, ordered by position. Each stage includes its milestone count.

ParameterTypeRequiredDescription
program_idstringyesThe UUID of the program whose stages to list.

create_stage

Create a stage (top-level Gantt node) under a program.

Create Stage

Create a stage (top-level Gantt node) under a program. Admin only. Stages inherit template-vs-instance from their program.

ParameterTypeRequiredDescription
program_idstringyesThe UUID of the program this stage belongs to.
titlestringyesStage title.
subtitlestringnoOptional subtitle.
colorstringnoHex color that tints the Gantt bar, e.g. "#4F46E5".
positionnumbernoSequence order within the program (default 0)
statusenumnoNode status (default 'upcoming') One of: upcoming, locked, active, done.

update_stage

Update a stage. Admin only.

Update Stage

Update a stage. Admin only.

ParameterTypeRequiredDescription
idstringyesThe UUID of the stage to update.
titlestringnoStage title.
subtitlestringnoSubtitle.
colorstringnoHex color for the Gantt bar.
positionnumbernoSequence order within the program.
statusenumnoNode status. One of: upcoming, locked, active, done.

delete_stage

Delete a stage. Admin only.

Delete Stage

Delete a stage. Admin only. CASCADE removes its milestones.

ParameterTypeRequiredDescription
idstringyesThe UUID of the stage to delete.

The milestones inside a program stage.

list_milestones

List the milestones under a stage, ordered by position.

List Milestones

List the milestones under a stage, ordered by position.

ParameterTypeRequiredDescription
stage_idstringyesThe UUID of the stage whose milestones to list.

create_milestone

Create a milestone under a stage.

Create Milestone

Create a milestone under a stage. Admin only. points is the gamification weight (default 0).

ParameterTypeRequiredDescription
stage_idstringyesThe UUID of the stage this milestone belongs to.
titlestringyesMilestone title.
descriptionstringnoMilestone description.
positionnumbernoSequence order within the stage (default 0)
pointsnumbernoGamification weight / value (default 0)
statusenumnoNode status (default 'upcoming') One of: upcoming, locked, active, done.
linked_material_idstringnoOptional loose link to a lesson/material UUID.
linked_tool_idstringnoOptional tool-catalog key.

update_milestone

Update a milestone. Admin only.

Update Milestone

Update a milestone. Admin only.

ParameterTypeRequiredDescription
idstringyesThe UUID of the milestone to update.
titlestringnoMilestone title.
descriptionstringnoMilestone description.
positionnumbernoSequence order within the stage.
pointsnumbernoGamification weight / value.
statusenumnoNode status. One of: upcoming, locked, active, done.
linked_material_idstringnoLoose link to a lesson/material UUID.
linked_tool_idstringnoTool-catalog key.

delete_milestone

Delete a milestone. Admin only.

Delete Milestone

Delete a milestone. Admin only. Associated completion rows cascade.

ParameterTypeRequiredDescription
idstringyesThe UUID of the milestone to delete.

Which stage must come before which other stage.

list_stage_dependencies

List the sequence/dependency edges (predecessor -> successor) of a program.

List Stage Dependencies

List the sequence/dependency edges (predecessor -> successor) of a program. These drive the dependency Gantt and the "locked until prerequisite done" gating.

ParameterTypeRequiredDescription
program_idstringyesThe UUID of the program whose dependency edges to list.
node_kindenumnoFilter to edges between 'stage' nodes or 'milestone' nodes. One of: stage, milestone.

add_stage_dependency

Add a sequence/dependency edge (predecessor -> successor) within a program.

Add Stage Dependency

Add a sequence/dependency edge (predecessor -> successor) within a program. node_kind must match the type of both endpoint ids (stage.id or milestone.id). Admin only. The successor is gated until the predecessor is done.

ParameterTypeRequiredDescription
program_idstringyesThe UUID of the program the edge belongs to.
node_kindenumyesWhether this edge connects 'stage' nodes or 'milestone' nodes (both endpoints must be this kind) One of: stage, milestone.
predecessor_idstringyesUUID of the prerequisite node (stage.id or milestone.id per node_kind)
successor_idstringyesUUID of the dependent node (stage.id or milestone.id per node_kind)

remove_stage_dependency

Remove a dependency edge.

Remove Stage Dependency

Remove a dependency edge. Admin only. Provide either the edge id, OR the full tuple (program_id + node_kind + predecessor_id + successor_id).

ParameterTypeRequiredDescription
idstringnoThe UUID of the dependency edge to remove.
program_idstringnoProgram id (when removing by tuple)
node_kindenumnoEdge kind (when removing by tuple) One of: stage, milestone.
predecessor_idstringnoPredecessor node id (when removing by tuple)
successor_idstringnoSuccessor node id (when removing by tuple)

Your own progress: which lessons you viewed or completed.

get_my_course_progress

Get the authenticated user's progress for a specific course.

Get My Course Progress

Get the authenticated user's progress for a specific course.

ParameterTypeRequiredDescription
course_idstringyesThe UUID of the course.

get_my_lesson_progress

Get the authenticated user's progress for one or more lessons.

Get My Lesson Progress

Get the authenticated user's progress for one or more lessons.

ParameterTypeRequiredDescription
lesson_idsstring[]yesArray of lesson UUIDs to get progress for.

mark_lesson_viewed

Mark a lesson as viewed by the authenticated user.

Mark Lesson Viewed

Mark a lesson as viewed by the authenticated user. Sets last_viewed_at to now, and first_viewed_at if not already set.

ParameterTypeRequiredDescription
lesson_idstringyesThe UUID of the lesson.

mark_lesson_complete

Mark a lesson as completed by the authenticated user.

Mark Lesson Complete

Mark a lesson as completed by the authenticated user.

ParameterTypeRequiredDescription
lesson_idstringyesThe UUID of the lesson.

Save the teaching style profile of a tutor.

upsert_tutor_profile

Upsert a tutor's pedagogical pattern profile (the extracted signature/rubric/typology JSON) into lms.tutor_profiles, keyed on (member_id, version).

Upsert Tutor Profile

Upsert a tutor's pedagogical pattern profile (the extracted signature/rubric/typology JSON) into lms.tutor_profiles, keyed on (member_id, version). ON CONFLICT (member_id, version) updates profile_data. RLS-scoped (user-JWT); writes require global-admin per lms RLS. Used by plan 20260624-tutor-pedagogy-pattern-extraction to persist a profile produced offline by the pedagogy-corpus-eval skill.

ParameterTypeRequiredDescription
member_idstringyesThe work.members.id of the tutor this profile belongs to.
versionstringnoThe profile version (default 'v1'). Keys the upsert together with member_id.
profile_dataobjectyesThe full profile JSON payload (e.g. rubric_octagon + signature + typology) produced by the pedagogy-corpus-eval extraction.

The dfl-wiki articles (wiki.articles, wiki.devfellowship.com). Every call runs on the caller’s JWT, and the wiki’s own RLS decides: a signed-in caller reads drafts too; only the author or a global admin writes an article. No service role.

Write, edit and publish articles on the DFL wiki.

list_wiki_articles

List dfl-wiki articles (wiki.devfellowship.com), newest update first, without the body.

List Wiki Articles

List dfl-wiki articles (wiki.devfellowship.com), newest update first, without the body. Filters: status, a tag, a slug prefix, a title search. A signed-in caller also sees drafts (wiki RLS).

ParameterTypeRequiredDescription
statusenumnoOnly this status. One of: draft, published, archived.
tagstringnoOnly articles that carry this tag.
slug_prefixstringnoOnly slugs that start with this, e.g. "content-visual".
searchstringnoCase-insensitive match on the title.
limitnumbernoMax rows (default 50, max 200)

get_wiki_article

One dfl-wiki article by id or slug, with its markdown body and its content type.

Get Wiki Article

One dfl-wiki article by id or slug, with its markdown body and its content type.

ParameterTypeRequiredDescription
idstringnoArticle UUID (pass id OR slug)
slugstringnoArticle slug, as in wiki.devfellowship.com/a/<slug> (pass id OR slug)

create_wiki_article

Create a dfl-wiki article AS THE CALLER (author_id = you), as a DRAFT by default.

Create Wiki Article

Create a dfl-wiki article AS THE CALLER (author_id = you), as a DRAFT by default. Same fields as the wiki create form. The slug defaults to the form's rule applied to the title. The content type defaults to "guide". Publish later with publish_wiki_article.

ParameterTypeRequiredDescription
titlestringyesArticle title.
slugstringnoURL slug (unique). Default: generated from the title.
contentstringnoMarkdown body (GFM)
excerptstringnoShort summary shown in lists.
content_type_idstringnowiki.content_types id (wins over content_type_slug)
content_type_slugstringnowiki.content_types slug, e.g. guide, feature, architecture. Default: guide.
project_idstringnowork.projects id to group the article under.
tagsstring[]noTags.
statusenumnoDefault: draft. One of: draft, published, archived.
metadataobjectnoJSON object stored in wiki.articles.metadata. Known key: parent_slug (slug of the parent article in the tree; validated: it must exist and must not make a cycle).

update_wiki_article

Change fields of a dfl-wiki article, by id or slug.

Update Wiki Article

Change fields of a dfl-wiki article, by id or slug. Only the fields you pass change. The wiki lets only the author or a global admin write. The status changes with publish_wiki_article. metadata merges by default (see replace_metadata); renaming a slug does not rewrite children's parent_slug.

ParameterTypeRequiredDescription
idstringnoArticle UUID (pass id OR slug)
slugstringnoArticle slug, as in wiki.devfellowship.com/a/<slug> (pass id OR slug)
titlestringno—
new_slugstringnoRename the slug (links to the old one break)
contentstringnoMarkdown body (replaces the whole body)
excerptstringno—
content_type_idstringno—
project_idstringnonull removes the project.
tagsstring[]noReplaces the tag list.
metadataobjectnoMetadata patch. By default a shallow MERGE into the existing metadata: keys you pass win, keys you omit stay, a null value removes that key. parent_slug is validated (must exist, no cycle). Set replace_metadata to replace the whole object.
replace_metadatabooleannotrue: metadata REPLACES the existing object (keys you omit are dropped). Default false: merge.

publish_wiki_article

Set the status of a dfl-wiki article: published (default — anonymous readers can see it), draft (signed-in users only) or archived.

Publish Wiki Article

Set the status of a dfl-wiki article: published (default — anonymous readers can see it), draft (signed-in users only) or archived. By id or slug; the author or a global admin only.

ParameterTypeRequiredDescription
idstringnoArticle UUID (pass id OR slug)
slugstringnoArticle slug, as in wiki.devfellowship.com/a/<slug> (pass id OR slug)
statusenumnoDefault: published. One of: draft, published, archived.

public.profiles.fellow_slug links a Thumbify fellows/<slug> folder to a DFL user. Both tools are admin only (global level >= 80): the tool refuses a lower caller before it reads or writes, and the RLS policy profiles_admin_update (iam.is_global_admin()) enforces the same rule in the database. Caller user-JWT, never service_role. These tools moved here from Platform (ops) (plan task T2.5).

Which Thumbify fellow folder belongs to which user.

set_profile_fellow_slug

Set or clear public.profiles.fellow_slug of ONE user: the Thumbify fellows/<slug> folder that belongs to that user.

Set Profile Fellow Slug

Set or clear public.profiles.fellow_slug of ONE user: the Thumbify fellows/<slug> folder that belongs to that user. Admin only (global IAM level >= 80): the tool refuses a lower caller before it touches anything, and RLS policy profiles_admin_update enforces the same rule in the database. Runs on YOUR JWT, never service_role. The slug is lowercase a-z, 0-9 and "-" (the DB CHECK). A slug maps to at most one user (partial unique index): if another user holds it, the tool returns outcome=slug_taken with that user id and writes nothing. null clears the slug. Use dry_run to see the change first. Read the current mapping with list_profile_fellow_slugs.

ParameterTypeRequiredDescription
user_idstringyespublic.profiles id (= auth.users id) of the user.
fellow_slugstringyesThe Thumbify fellows/<slug> folder name, e.g. "tainan". null clears it.
dry_runbooleannoResolve and report what would change, and write nothing. Default false.

list_profile_fellow_slugs

List every user that has a public.profiles.fellow_slug (the Thumbify fellows/<slug> folder mapping): user_id, name, fellow_slug, ordered by slug.

List Profile Fellow Slugs

List every user that has a public.profiles.fellow_slug (the Thumbify fellows/<slug> folder mapping): user_id, name, fellow_slug, ordered by slug. Admin only (global IAM level >= 80), the same gate as set_profile_fellow_slug. Runs on YOUR JWT.

Takes no parameters.