learn — full tool reference
Courses, lessons, members, profiles, cohorts, programs, progress.
| Endpoint | https://learn.mcp.devfellowship.com/mcp |
| Package | packages/dfl-mcp-learn |
| Tools | 51 |
| Tool | Description |
|---|---|
list_members | List all members with optional filters. Returns members you have access to based on your permissions. |
get_member | Get a specific member by their ID. |
create_member | Create a new community member. |
update_member | Update an existing community member. |
delete_member | Soft delete a member by setting is_active to false. |
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). |
list_profiles | List user profiles with optional filters. |
get_profile | Get a specific user profile by ID. |
update_profile | Update your own profile. Only the authenticated user can update their profile. |
list_courses | List all courses with optional filters. |
get_course | Get a specific course by ID, including lesson count. |
create_course | Create a new course. Admin only. |
update_course | Update an existing course. Admin only. |
delete_course | Delete a course. Admin only. This will also delete all associated lessons. |
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. |
list_lessons | List lessons for a specific course. |
get_lesson | Get a specific lesson by ID. |
create_lesson | Create a new lesson within a course. Admin only. |
update_lesson | Update an existing lesson. Admin only. |
delete_lesson | Delete a lesson. Admin only. |
get_my_course_progress | Get the authenticated user’s progress for a specific course. |
get_my_lesson_progress | Get the authenticated user’s progress for one or more lessons. |
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. |
mark_lesson_complete | Mark a lesson as completed by the authenticated user. |
list_cohorts | List LMS cohorts (batches, e.g. “Winter 2025”, “Summer 2026”) with optional filters. Reads lms.cohorts (RLS: any authenticated user can read). |
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. |
update_cohort | Update an LMS cohort. Admin only — RLS rejects writes from non-global-admins. |
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. |
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. This is the read that powers the Gantt and verifies an authored template/instance. READ-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. |
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. |
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. |
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). |
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. |
list_stages | List the stages (top-level Gantt nodes) of a program, ordered by position. Each stage includes its milestone count. |
create_stage | Create a stage (top-level Gantt node) under a program. Admin only. Stages inherit template-vs-instance from their program. |
update_stage | Update a stage. Admin only. |
delete_stage | Delete a stage. Admin only. CASCADE removes its milestones. |
list_milestones | List the milestones under a stage, ordered by position. |
create_milestone | Create a milestone under a stage. Admin only. points is the gamification weight (default 0). |
update_milestone | Update a milestone. Admin only. |
delete_milestone | Delete a milestone. Admin only. Associated completion rows cascade. |
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. |
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. |
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). |
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. |
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). |
get_wiki_article | One dfl-wiki article by id or slug, with its markdown body and its content type. |
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. |
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. |
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. |
list_members
Section titled “list_members”List 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
Section titled “get_member”Get Member
Get a specific member by their ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the member |
create_member
Section titled “create_member”Create 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
Section titled “update_member”Update 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
Section titled “delete_member”Delete 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
Section titled “lookup_member”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).
| 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
Section titled “list_profiles”List 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
Section titled “get_profile”Get Profile
Get a specific user profile by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the profile |
update_profile
Section titled “update_profile”Update 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 |
list_courses
Section titled “list_courses”List 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
Section titled “get_course”Get Course
Get a specific course by ID, including lesson count.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the course |
create_course
Section titled “create_course”Create 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
Section titled “update_course”Update 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
Section titled “delete_course”Delete 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
Section titled “set_course_tutor”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.
| 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 |
list_lessons
Section titled “list_lessons”List 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
Section titled “get_lesson”Get Lesson
Get a specific lesson by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the lesson |
create_lesson
Section titled “create_lesson”Create 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
Section titled “update_lesson”Update 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
Section titled “delete_lesson”Delete Lesson
Delete a lesson. Admin only.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the lesson to delete |
get_my_course_progress
Section titled “get_my_course_progress”Get 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
Section titled “get_my_lesson_progress”Get 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
Section titled “mark_lesson_viewed”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.
| Parameter | Type | Required | Description |
|---|---|---|---|
lesson_id | string | yes | The UUID of the lesson |
mark_lesson_complete
Section titled “mark_lesson_complete”Mark Lesson Complete
Mark a lesson as completed by the authenticated user.
| Parameter | Type | Required | Description |
|---|---|---|---|
lesson_id | string | yes | The UUID of the lesson |
list_cohorts
Section titled “list_cohorts”List 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
Section titled “create_cohort”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.
| 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
Section titled “update_cohort”Update 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) |
list_programs
Section titled “list_programs”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.
| 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
Section titled “get_program”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.
| 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
Section titled “create_program”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.
| 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
Section titled “update_program”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.
| 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
Section titled “delete_program”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.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the program to delete |
instantiate_program
Section titled “instantiate_program”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).
| 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
Section titled “get_program_member_progress”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.
| 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) |
list_stages
Section titled “list_stages”List 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
Section titled “create_stage”Create 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
Section titled “update_stage”Update 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
Section titled “delete_stage”Delete Stage
Delete a stage. Admin only. CASCADE removes its milestones.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the stage to delete |
list_milestones
Section titled “list_milestones”List 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
Section titled “create_milestone”Create 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
Section titled “update_milestone”Update 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
Section titled “delete_milestone”Delete Milestone
Delete a milestone. Admin only. Associated completion rows cascade.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The UUID of the milestone to delete |
list_stage_dependencies
Section titled “list_stage_dependencies”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.
| 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
Section titled “add_stage_dependency”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.
| 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
Section titled “remove_stage_dependency”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).
| 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) |
upsert_tutor_profile
Section titled “upsert_tutor_profile”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.
| 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. |
list_wiki_articles
Section titled “list_wiki_articles”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).
| 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
Section titled “get_wiki_article”Get 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
Section titled “create_wiki_article”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.
| 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
Section titled “update_wiki_article”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.
| 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
Section titled “publish_wiki_article”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.
| 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. |