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.
|
{ "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 data | lms / public schemas (courses, lessons, members, profiles, programs, progress). |
Members
Section titled “Members”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_membersList Members
List all members with optional filters. Returns members you have access to based on your permissions.
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | number | no | Maximum number of members to return (default: 50, max: 100) |
offset | number | no | Number of members to skip (for pagination) |
phase_id | string | no | Filter by member phase (e.g., waiting_list, active, alumni) |
is_active | boolean | no | Filter by active status. |
search | string | no | Search by name or email. |
get_member
Get a specific member by their ID.
get_memberGet Member
Get a specific member by their ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the member. |
create_member
Create a new community member.
create_memberCreate Member
Create a new community member.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Full name of the member. |
personal_email | string | no | Personal email address. |
corporate_email | string | no | Corporate/work email address. |
phone | string | no | Phone number. |
city | string | no | City. |
state | string | no | State/Province. |
phase_id | string | no | Member phase (e.g., waiting_list, active) |
tags | string[] | no | Tags for the member. |
update_member
Update an existing community member.
update_memberUpdate Member
Update an existing community member.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the member to update. |
name | string | no | Full name of the member. |
personal_email | string | no | Personal email address. |
corporate_email | string | no | Corporate/work email address. |
phone | string | no | Phone number. |
city | string | no | City. |
state | string | no | State/Province. |
phase_id | string | no | Member phase. |
tags | string[] | no | Tags for the member. |
is_active | boolean | no | Whether the member is active. |
delete_member
Soft delete a member by setting is_active to false.
delete_memberDelete Member
Soft delete a member by setting is_active to false.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the member to delete. |
hard_delete | boolean | no | If 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_memberLookup 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Fellow's name (full or partial; case-insensitive) |
limit | number | no | Maximum number of candidates to return (default 10) |
include_inactive | boolean | no | Include members where is_active = false (default false) |
list_profiles
List user profiles with optional filters.
list_profilesList Profiles
List user profiles with optional filters.
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | number | no | Maximum number of profiles to return (default: 50, max: 100) |
offset | number | no | Number of profiles to skip (for pagination) |
search | string | no | Search by name or email. |
get_profile
Get a specific user profile by ID.
get_profileGet Profile
Get a specific user profile by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the profile. |
update_profile
Update your own profile. Only the authenticated user can update their profile.
update_profileUpdate Profile
Update your own profile. Only the authenticated user can update their profile.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | no | Display name. |
avatar_url | string | no | Avatar URL. |
Cohorts
Section titled “Cohorts”The class groups (cohorts) of the learning platform.
list_cohorts
List LMS cohorts (batches, e.g. "Winter 2025", "Summer 2026") with optional filters.
list_cohortsList Cohorts
List LMS cohorts (batches, e.g. "Winter 2025", "Summer 2026") with optional filters. Reads lms.cohorts (RLS: any authenticated user can read).
| Parameter | Type | Required | Description |
|---|---|---|---|
status | enum | no | Filter by cohort lifecycle status. One of: active, graduated, draft, archived. |
batch_type | enum | no | Filter by batch type ('fellow' or 'organization') One of: fellow, organization. |
search | string | no | Search by cohort name or slug. |
limit | number | no | Max cohorts to return (default 50, max 100) |
offset | number | no | Number of cohorts to skip (pagination) |
create_cohort
Create an LMS cohort (batch).
create_cohortCreate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Cohort display name, e.g. "Winter 2025". |
slug | string | no | URL-safe slug (unique). Defaults to a slugified name, e.g. "winter-2025". |
year | number | no | Cohort year (informational) |
status | enum | no | Lifecycle status (default 'active') One of: active, graduated, draft, archived. |
batch_type | enum | no | Batch type, 'fellow' or 'organization' (default 'fellow') One of: fellow, organization. |
organization_id | string | no | Optional org id for organization batches. |
organization_name | string | no | Optional org display name. |
starts_on | string | no | Informational 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_cohortUpdate Cohort
Update an LMS cohort. Admin only — RLS rejects writes from non-global-admins.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the cohort to update. |
name | string | no | Cohort display name. |
slug | string | no | URL-safe unique slug. |
year | number | no | Cohort year. |
status | enum | no | Lifecycle status. One of: active, graduated, draft, archived. |
batch_type | enum | no | Batch type ('fellow' or 'organization') One of: fellow, organization. |
organization_id | string | no | Org id for organization batches. |
organization_name | string | no | Org display name. |
starts_on | string | no | Informational start date (YYYY-MM-DD) |
Courses
Section titled “Courses”Find, create and edit courses, and set who taught a course.
list_courses
List all courses with optional filters.
list_coursesList Courses
List all courses with optional filters.
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | number | no | Maximum number of courses to return (default: 50, max: 100) |
offset | number | no | Number of courses to skip (for pagination) |
search | string | no | Search by title or description. |
get_course
Get a specific course by ID, including lesson count.
get_courseGet Course
Get a specific course by ID, including lesson count.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the course. |
create_course
Create a new course. Admin only.
create_courseCreate Course
Create a new course. Admin only.
| Parameter | Type | Required | Description |
|---|---|---|---|
title | string | yes | Course title. |
description | string | no | Course description. |
about | string | no | Detailed information about the course. |
thumbnail | string | no | Thumbnail URL. |
position | number | no | Display order position. |
update_course
Update an existing course.
update_courseUpdate Course
Update an existing course. Admin only.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the course to update. |
title | string | no | Course title. |
description | string | no | Course description. |
about | string | no | Detailed information about the course. |
thumbnail | string | no | Thumbnail URL. |
position | number | no | Display order position. |
delete_course
Delete a course. Admin only.
delete_courseDelete Course
Delete a course. Admin only. This will also delete all associated lessons.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The 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_tutorSet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
course_id | string | yes | The UUID of the lms.courses row to attribute. |
tutor_member_id | string | yes | The work.members.id of the tutor who taught the course, or null to clear the attribution. |
Lessons
Section titled “Lessons”The lessons of a course: list, read, create and edit them.
list_lessons
List lessons for a specific course.
list_lessonsList Lessons
List lessons for a specific course.
| Parameter | Type | Required | Description |
|---|---|---|---|
course_id | string | yes | The UUID of the course (required) |
limit | number | no | Maximum number of lessons to return (default: 50, max: 100) |
offset | number | no | Number of lessons to skip (for pagination) |
status | enum | no | Filter by lesson status. One of: draft, published. |
get_lesson
Get a specific lesson by ID.
get_lessonGet Lesson
Get a specific lesson by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the lesson. |
create_lesson
Create a new lesson within a course.
create_lessonCreate Lesson
Create a new lesson within a course. Admin only.
| Parameter | Type | Required | Description |
|---|---|---|---|
course_id | string | yes | The UUID of the course this lesson belongs to. |
title | string | yes | Lesson title. |
description | string | no | Lesson description. |
video_url | string | no | Video URL for the lesson. |
duration | number | no | Duration in seconds. |
position | number | no | Display order position within the course. |
status | enum | no | Lesson status (default: draft) One of: draft, published. |
update_lesson
Update an existing lesson.
update_lessonUpdate Lesson
Update an existing lesson. Admin only.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the lesson to update. |
title | string | no | Lesson title. |
description | string | no | Lesson description. |
video_url | string | no | Video URL. |
duration | number | no | Duration in seconds. |
position | number | no | Display order position. |
status | enum | no | Lesson status. One of: draft, published. |
is_searchable | boolean | no | Whether the lesson is searchable. |
transcription | string | no | Lesson transcription text. |
standalone_title | string | no | Standalone title for the lesson. |
delete_lesson
Delete a lesson. Admin only.
delete_lessonDelete Lesson
Delete a lesson. Admin only.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the lesson to delete. |
Programs
Section titled “Programs”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_programsList 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
kind | enum | no | Filter by 'template' (reusable plan) or 'instance' (a cohort's live program) One of: template, instance. |
cohort_id | string | no | Filter to the instance program belonging to this cohort. |
search | string | no | Search by program name or slug. |
limit | number | no | Max programs to return (default 50, max 100) |
offset | number | no | Number 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_programGet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | no | The program UUID (preferred). Provide id OR slug. |
slug | string | no | The program slug (e.g. "winter-2025"). Used if id is omitted. |
create_program
Create an LMS program. Admin only.
create_programCreate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Program name. |
slug | string | no | URL-safe slug; defaults to a slugified name. |
kind | enum | no | 'template' (reusable plan, default) or 'instance' (per-cohort) One of: template, instance. |
status | enum | no | Program status (default 'active') One of: upcoming, locked, active, done. |
cohort_id | string | no | Required for kind='instance' — the cohort this program serves. Must be omitted for templates. |
source_program_id | string | no | For 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_programUpdate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the program to update. |
name | string | no | Program name. |
slug | string | no | URL-safe slug. |
status | enum | no | Program status. One of: upcoming, locked, active, done. |
delete_program
Delete an LMS program. Admin only.
delete_programDelete Program
Delete an LMS program. Admin only. CASCADE removes its stages, milestones, and stage_dependencies. Deleting an instance program detaches it from its cohort.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The 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_programInstantiate 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
template_id | string | yes | The UUID of the TEMPLATE program to copy (kind='template') |
cohort_id | string | yes | The 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_progressGet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
cohort_id | string | no | Filter progress to a single cohort. |
program_id | string | no | Filter by the cohort's instance program id (resolved to its cohort_id under the hood) |
user_id | string | no | Filter to a single member (admin-only view of other members) |
limit | number | no | Max rows to return (default 100, max 500) |
offset | number | no | Number of rows to skip (pagination) |
Program Stages
Section titled “Program Stages”The top-level stages of a program.
list_stages
List the stages (top-level Gantt nodes) of a program, ordered by position.
list_stagesList Stages
List the stages (top-level Gantt nodes) of a program, ordered by position. Each stage includes its milestone count.
| Parameter | Type | Required | Description |
|---|---|---|---|
program_id | string | yes | The UUID of the program whose stages to list. |
create_stage
Create a stage (top-level Gantt node) under a program.
create_stageCreate Stage
Create a stage (top-level Gantt node) under a program. Admin only. Stages inherit template-vs-instance from their program.
| Parameter | Type | Required | Description |
|---|---|---|---|
program_id | string | yes | The UUID of the program this stage belongs to. |
title | string | yes | Stage title. |
subtitle | string | no | Optional subtitle. |
color | string | no | Hex color that tints the Gantt bar, e.g. "#4F46E5". |
position | number | no | Sequence order within the program (default 0) |
status | enum | no | Node status (default 'upcoming') One of: upcoming, locked, active, done. |
update_stage
Update a stage. Admin only.
update_stageUpdate Stage
Update a stage. Admin only.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the stage to update. |
title | string | no | Stage title. |
subtitle | string | no | Subtitle. |
color | string | no | Hex color for the Gantt bar. |
position | number | no | Sequence order within the program. |
status | enum | no | Node status. One of: upcoming, locked, active, done. |
delete_stage
Delete a stage. Admin only.
delete_stageDelete Stage
Delete a stage. Admin only. CASCADE removes its milestones.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the stage to delete. |
Program Milestones
Section titled “Program Milestones”The milestones inside a program stage.
list_milestones
List the milestones under a stage, ordered by position.
list_milestonesList Milestones
List the milestones under a stage, ordered by position.
| Parameter | Type | Required | Description |
|---|---|---|---|
stage_id | string | yes | The UUID of the stage whose milestones to list. |
create_milestone
Create a milestone under a stage.
create_milestoneCreate Milestone
Create a milestone under a stage. Admin only. points is the gamification weight (default 0).
| Parameter | Type | Required | Description |
|---|---|---|---|
stage_id | string | yes | The UUID of the stage this milestone belongs to. |
title | string | yes | Milestone title. |
description | string | no | Milestone description. |
position | number | no | Sequence order within the stage (default 0) |
points | number | no | Gamification weight / value (default 0) |
status | enum | no | Node status (default 'upcoming') One of: upcoming, locked, active, done. |
linked_material_id | string | no | Optional loose link to a lesson/material UUID. |
linked_tool_id | string | no | Optional tool-catalog key. |
update_milestone
Update a milestone. Admin only.
update_milestoneUpdate Milestone
Update a milestone. Admin only.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the milestone to update. |
title | string | no | Milestone title. |
description | string | no | Milestone description. |
position | number | no | Sequence order within the stage. |
points | number | no | Gamification weight / value. |
status | enum | no | Node status. One of: upcoming, locked, active, done. |
linked_material_id | string | no | Loose link to a lesson/material UUID. |
linked_tool_id | string | no | Tool-catalog key. |
delete_milestone
Delete a milestone. Admin only.
delete_milestoneDelete Milestone
Delete a milestone. Admin only. Associated completion rows cascade.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the milestone to delete. |
Program Dependencies
Section titled “Program Dependencies”Which stage must come before which other stage.
list_stage_dependencies
List the sequence/dependency edges (predecessor -> successor) of a program.
list_stage_dependenciesList Stage Dependencies
List the sequence/dependency edges (predecessor -> successor) of a program. These drive the dependency Gantt and the "locked until prerequisite done" gating.
| Parameter | Type | Required | Description |
|---|---|---|---|
program_id | string | yes | The UUID of the program whose dependency edges to list. |
node_kind | enum | no | Filter 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_dependencyAdd 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
program_id | string | yes | The UUID of the program the edge belongs to. |
node_kind | enum | yes | Whether this edge connects 'stage' nodes or 'milestone' nodes (both endpoints must be this kind) One of: stage, milestone. |
predecessor_id | string | yes | UUID of the prerequisite node (stage.id or milestone.id per node_kind) |
successor_id | string | yes | UUID of the dependent node (stage.id or milestone.id per node_kind) |
remove_stage_dependency
Remove a dependency edge.
remove_stage_dependencyRemove 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | no | The UUID of the dependency edge to remove. |
program_id | string | no | Program id (when removing by tuple) |
node_kind | enum | no | Edge kind (when removing by tuple) One of: stage, milestone. |
predecessor_id | string | no | Predecessor node id (when removing by tuple) |
successor_id | string | no | Successor node id (when removing by tuple) |
Member Progress
Section titled “Member Progress”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_progressGet My Course Progress
Get the authenticated user's progress for a specific course.
| Parameter | Type | Required | Description |
|---|---|---|---|
course_id | string | yes | The UUID of the course. |
get_my_lesson_progress
Get the authenticated user's progress for one or more lessons.
get_my_lesson_progressGet My Lesson Progress
Get the authenticated user's progress for one or more lessons.
| Parameter | Type | Required | Description |
|---|---|---|---|
lesson_ids | string[] | yes | Array of lesson UUIDs to get progress for. |
mark_lesson_viewed
Mark a lesson as viewed by the authenticated user.
mark_lesson_viewedMark 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
lesson_id | string | yes | The UUID of the lesson. |
mark_lesson_complete
Mark a lesson as completed by the authenticated user.
mark_lesson_completeMark Lesson Complete
Mark a lesson as completed by the authenticated user.
| Parameter | Type | Required | Description |
|---|---|---|---|
lesson_id | string | yes | The UUID of the lesson. |
Tutor Profiles
Section titled “Tutor Profiles”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_profileUpsert 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
member_id | string | yes | The work.members.id of the tutor this profile belongs to. |
version | string | no | The profile version (default 'v1'). Keys the upsert together with member_id. |
profile_data | object | yes | The full profile JSON payload (e.g. rubric_octagon + signature + typology) produced by the pedagogy-corpus-eval extraction. |
Wiki articles
Section titled “Wiki articles”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_articlesList 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).
| Parameter | Type | Required | Description |
|---|---|---|---|
status | enum | no | Only this status. One of: draft, published, archived. |
tag | string | no | Only articles that carry this tag. |
slug_prefix | string | no | Only slugs that start with this, e.g. "content-visual". |
search | string | no | Case-insensitive match on the title. |
limit | number | no | Max 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_articleGet Wiki Article
One dfl-wiki article by id or slug, with its markdown body and its content type.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | no | Article UUID (pass id OR slug) |
slug | string | no | Article 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_articleCreate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
title | string | yes | Article title. |
slug | string | no | URL slug (unique). Default: generated from the title. |
content | string | no | Markdown body (GFM) |
excerpt | string | no | Short summary shown in lists. |
content_type_id | string | no | wiki.content_types id (wins over content_type_slug) |
content_type_slug | string | no | wiki.content_types slug, e.g. guide, feature, architecture. Default: guide. |
project_id | string | no | work.projects id to group the article under. |
tags | string[] | no | Tags. |
status | enum | no | Default: draft. One of: draft, published, archived. |
metadata | object | no | JSON 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_articleUpdate 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | no | Article UUID (pass id OR slug) |
slug | string | no | Article slug, as in wiki.devfellowship.com/a/<slug> (pass id OR slug) |
title | string | no | — |
new_slug | string | no | Rename the slug (links to the old one break) |
content | string | no | Markdown body (replaces the whole body) |
excerpt | string | no | — |
content_type_id | string | no | — |
project_id | string | no | null removes the project. |
tags | string[] | no | Replaces the tag list. |
metadata | object | no | Metadata 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_metadata | boolean | no | true: 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_articlePublish 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | no | Article UUID (pass id OR slug) |
slug | string | no | Article slug, as in wiki.devfellowship.com/a/<slug> (pass id OR slug) |
status | enum | no | Default: published. One of: draft, published, archived. |
Fellow slugs
Section titled “Fellow slugs”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_slugSet 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.
| Parameter | Type | Required | Description |
|---|---|---|---|
user_id | string | yes | public.profiles id (= auth.users id) of the user. |
fellow_slug | string | yes | The Thumbify fellows/<slug> folder name, e.g. "tainan". null clears it. |
dry_run | boolean | no | Resolve 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_slugsList 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.