Skip to main content
Glama

eduframe-mcp

Eduframe MCP server — exposes Eduframe resources as MCP tools.

Usage in VSCode

Add the following configuration to your .vscode/mcp.json file to use this MCP server with GitHub Copilot in agent mode.

Using npx (from GitHub)

{
  "servers": {
    "eduframe": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "github:martijnpieters/eduframe-mcp"],
      "env": {
        "EDUFRAME_API_TOKEN": "${input:eduframe_api_token}"
      }
    }
  },
  "inputs": [
    {
      "id": "eduframe_api_token",
      "type": "promptString",
      "description": "Eduframe API token",
      "password": true
    }
  ]
}

Development (from this repository)

First, build the project:

pnpm install && pnpm build

Then add the following to .vscode/mcp.json in this repository:

{
  "servers": {
    "eduframe": {
      "type": "stdio",
      "command": "node",
      "args": ["${workspaceFolder}/dist/index.js"],
      "env": {
        "EDUFRAME_API_TOKEN": "${input:eduframe_api_token}"
      }
    }
  },
  "inputs": [
    {
      "id": "eduframe_api_token",
      "type": "promptString",
      "description": "Eduframe API token",
      "password": true
    }
  ]
}

Related MCP server: OpenAI Ads MCP Server

Configuration

The server requires one environment variable:

Variable

Description

EDUFRAME_API_TOKEN

Your Eduframe API token (Bearer token)

EDUFRAME_API_ENDPOINT

(Optional) Base URL for the Eduframe API. Defaults to https://api.eduframe.nl/api/v1.

Debugging

When running the server locally, each successful tool call writes the raw API response to .last-response.json in the project root. This file can be inspected to see the complete JSON payload returned by the Eduframe API, independent of the formatted text output sent back to the MCP client.

The file is overwritten on every tool call and contains the tool name, the request parameters, and the full response:

{
  "timestamp": "2024-01-01T00:00:00.000Z",
  "tool": "get_lead",
  "request": { "id": 1 },
  "response": { "id": 1, "email": "lead@example.com", ... }
}

Available Tools

189 tools
activate_teacherA
Idempotent

Mark teacher as active

Inputs: id (required).

add_label_to_orderB
Idempotent

Add label to an order

Inputs: id (required), label_id (required).

add_option_to_custom_fieldB
Idempotent

Add an option to a custom field

Inputs: object_type (required), field_slug (required), value (required), enabled (required).

approve_orderA
Idempotent

Approve an order

Inputs: id (required).

award_certificate_to_program_enrollmentA
Idempotent

Awards a certificate to a program enrollment

Inputs: id (required), certificate_template_id (required).

cancel_enrollmentC
Idempotent

Cancel an enrollment

Inputs: id (required).

cancel_orderC
Idempotent

Cancel an order

Inputs: id (required).

cancel_planned_courseB
Idempotent

Cancel a planned course.

Inputs: id (required).

cancel_program_enrollmentB
Idempotent

Cancel a program enrollment

Inputs: id (required).

create_accountD

Create an account

Inputs: name (required), email, phone, label_ids, +3 more.

create_affiliationC

Create an affiliation affiliations

Inputs: user_id (required), account_id (required), key_contact.

create_authenticationC

Create an authentication.

Inputs: uid (required), user_id (required), authentication_provider_type (required).

create_categoryC

Create a category.

Inputs: name (required), description, is_published, parent_id.

create_commentC

Create a comment.

Inputs: content (required), commentable_id (required), commentable_type (required).

create_courseC

Create a course.

Inputs: category_id (required), name (required), code (required), cost_scheme, +5 more.

create_course_locationC

Create a course location.

Inputs: name (required), address_attributes.

create_course_variantC

Create a course variant

Inputs: name (required).

create_custom_recordC
Idempotent

Create a custom record

Inputs: object_slug (required), display_name (required), properties (required), active.

create_email_message_by_user_idB
Idempotent

Create and send an email message to a user

Inputs: user_id (required), from (required), subject (required), body (required).

create_gradeD

Create a grade

Inputs: grade (required), score (required), gradeable_id (required), gradeable_type (required), +1 more.

create_invoiceC

Create an invoice.

Inputs: account_id (required), feature, footnote, invoice_items_attributes.

create_invoice_payment_by_invoice_idC
Idempotent

Create a payment.

Inputs: invoice_id (required), amount (required), currency, date, +1 more.

create_invoice_vatC

Create an invoice vat.

Inputs: name (required), percentage (required).

create_labelC

Create a label

Inputs: name (required), model_type (required), color.

create_leadC

Create a lead.

Inputs: title, account_id, user_id, value, +14 more.

create_materialC

Create a material.

Inputs: name (required), material_group_id (required), use_type.

create_material_groupC

Create a material group.

Inputs: name (required).

create_meeting_locationC

Create a meeting location.

Inputs: name (required), course_location_id (required), capacity, address_attributes.

create_orderC

Create an order.

Inputs: catalog_variant_id (required), creator_id (required), cost, cost_scheme, +9 more.

create_organization_affiliationC

Create an organization affiliation record

Inputs: organization_id (required), user_id (required), key_contact.

create_planned_courseC

Create a planned course.

Inputs: course_id (required), type (required), cost (required), is_published, +11 more.

create_planning_attendeeB

Assign a teacher to a meeting or planning event.

Inputs: teacher_id (required), attendable_id (required), attendable_type (required), teacher_role_id.

create_planning_required_teacher_group_attendeeB

Assign a teacher to a required teacher group

Inputs: teacher_id (required), required_teacher_group_id (required).

create_programC

Create a program

Inputs: name (required), category_id (required), cost_scheme (required), cost, +5 more.

create_program_editionC

Create a program edition

Inputs: program_id (required), name (required), start_date, end_date, +7 more.

create_program_elementC

Create a program element

Inputs: course_id (required), edition_id (required), planned_course_id.

create_taskC

Create a task.

Inputs: name (required), description, due_date, starred, +4 more.

create_teacherD

Create a new teacher

Inputs: user_id.

create_teacher_enrollmentA

Enroll a teacher to a planned_course.

Inputs: planned_course_id (required), teacher_id (required), teacher_role_id.

create_teacher_enrollment_by_planned_course_idB
Idempotent

Enroll a teacher to the given planned course.

Inputs: planned_course_id (required), teacher_id (required), teacher_role_id.

create_teacher_roleC

Create a teacher role.

Inputs: name (required).

create_userD

Create a user.

Inputs: first_name (required), last_name (required), email (required), middle_name, +7 more.

create_webhookC

Register a webhook.

Inputs: url (required), active, events.

deactivate_teacherA
Idempotent

Mark teacher as inactive

Inputs: id (required).

delete_affiliationB
DestructiveIdempotent

Delete an affiliation

Inputs: id (required).

delete_authentication_from_userC
DestructiveIdempotent

Remove an authentication from a user.

Inputs: user_id (required), id (required).

delete_certificate_from_program_enrollmentA
Idempotent

Deletes a certificate from a program enrollment

Inputs: id (required).

delete_commentC
DestructiveIdempotent

Delete a comment.

Inputs: id (required).

delete_course_locationB
DestructiveIdempotent

Delete a course location.

Inputs: id (required).

delete_custom_recordB
DestructiveIdempotent

Delete a custom record

Inputs: object_slug (required), id (required).

delete_gradeB
DestructiveIdempotent

Delete a grade.

Inputs: id (required).

delete_invoice_payment_by_id_and_invoice_idC
DestructiveIdempotent

Delete a payment.

Inputs: invoice_id (required), id (required).

delete_labelB
DestructiveIdempotent

Delete a label

Inputs: id (required).

delete_leadA
DestructiveIdempotent

Delete a lead.

Inputs: id (required).

delete_materialB
DestructiveIdempotent

Delete a material.

Inputs: id (required).

delete_material_groupB
DestructiveIdempotent

Delete a material group.

Inputs: id (required).

delete_meetingB
DestructiveIdempotent

Delete a meeting.

Inputs: id (required).

delete_meeting_locationC
DestructiveIdempotent

Delete a course location.

Inputs: id (required).

delete_option_of_custom_fieldC
DestructiveIdempotent

Delete an option from custom field

Inputs: object_type (required), field_slug (required), id (required).

delete_organization_affiliationB
DestructiveIdempotent

Delete an organization affiliation record

Inputs: id (required).

delete_planning_attendeeA
DestructiveIdempotent

Remove a teacher from a meeting or planning event.

Inputs: id (required).

delete_planning_eventB
DestructiveIdempotent

Delete a planning event.

Inputs: id (required).

delete_programB
DestructiveIdempotent

Delete a program

Inputs: id (required).

delete_program_editionA
DestructiveIdempotent

Delete a program edition

Inputs: id (required).

delete_program_elementC
DestructiveIdempotent

Delete a element

Inputs: id (required).

delete_taskB
DestructiveIdempotent

Delete a task.

Inputs: id (required).

delete_teacher_enrollmentB
DestructiveIdempotent

Delete a teacher enrollment.

Inputs: id (required).

delete_teacher_roleB
DestructiveIdempotent

Delete a teacher role.

Inputs: id (required).

delete_webhookA
DestructiveIdempotent

Delete a webhook.

Inputs: id (required).

deny_orderB
Idempotent

Deny an order

Inputs: id (required).

get_accountB
Read-onlyIdempotent

Get a single account

Inputs: id (required).

get_accountsB
Read-onlyIdempotent

Get all accounts

Inputs: cursor, per_page, search, key_contact_user_id, +2 more.

get_affiliationsB
Read-onlyIdempotent

Get all affiliations

Inputs: cursor, per_page, user_id, account_id.

get_associations_of_objectB
Read-onlyIdempotent

Get all associations of a system object

Inputs: object_type (required), cursor, per_page.

get_attendancesB
Read-onlyIdempotent

Get all attendance records

Inputs: cursor, per_page, meeting_id.

get_authentications_by_user_idB
Read-onlyIdempotent

Get the authentications of an user

Inputs: user_id (required), cursor, per_page, provider.

get_catalog_productA
Read-onlyIdempotent

Get a catalog product record

Inputs: id (required).

get_catalog_productsC
Read-onlyIdempotent

Get all catalog products

Inputs: cursor, per_page, published, category_id, +3 more.

get_catalog_variantB
Read-onlyIdempotent

Get a catalog variant record

Inputs: id (required).

get_catalog_variantsB
Read-onlyIdempotent

Get all catalog variants

Inputs: cursor, per_page, published_public, product_id, +2 more.

get_categoriesC
Read-onlyIdempotent

Get all category records

Inputs: cursor, per_page, published, sort.

get_categoryB
Read-onlyIdempotent

Get a category record

Inputs: id (required).

get_certificateB
Read-onlyIdempotent

Get an awarded certificate

Inputs: id (required).

get_certificatesA
Read-onlyIdempotent

Get all awarded certificates

Inputs: cursor, per_page.

get_courseB
Read-onlyIdempotent

Get a course record

Inputs: id (required).

get_course_locationA
Read-onlyIdempotent

Get a course location record

Inputs: id (required).

get_course_locationsA
Read-onlyIdempotent

Get all course location records

Inputs: cursor, per_page.

get_coursesB
Read-onlyIdempotent

Get all course records

Inputs: cursor, per_page, published.

get_course_tabsB
Read-onlyIdempotent

Get all course tab records

Inputs: cursor, per_page.

get_course_variantB
Read-onlyIdempotent

Get a course variant record

Inputs: id (required).

get_course_variantsA
Read-onlyIdempotent

Get all course variant records

Inputs: cursor, per_page.

get_credit_categoriesB
Read-onlyIdempotent

Get all credit category records

Inputs: cursor, per_page.

get_creditsB
Read-onlyIdempotent

Get all credit records

Inputs: cursor, per_page, student_id.

get_current_educatorC
Read-onlyIdempotent

Get an educator record

Inputs: cursor, per_page.

get_custom_object_by_object_slugC
Read-onlyIdempotent

Get a custom object by the object slug

Inputs: id (required).

get_custom_objectsC
Read-onlyIdempotent

Get all custom objects

Inputs: cursor, per_page.

get_custom_recordC
Read-onlyIdempotent

Get a custom record

Inputs: object_slug (required), id (required).

get_custom_recordsB
Read-onlyIdempotent

Get all custom records

Inputs: object_slug (required), cursor, per_page.

get_discount_codesB
Read-onlyIdempotent

Get all discount codes

Inputs: cursor, per_page.

get_edition_description_sectionsB
Read-onlyIdempotent

Get all edition description section records

Inputs: cursor, per_page.

get_elements_of_program_editionB
Read-onlyIdempotent

Get the elements of a program edition

Inputs: id (required), cursor, per_page.

get_enrollmentA
Read-onlyIdempotent

Get an enrollment record

Inputs: id (required).

get_enrollmentsC
Read-onlyIdempotent

Get all enrollment records

Inputs: cursor, per_page, student_id, planned_course_id, +2 more.

get_gradeB
Read-onlyIdempotent

Get a grade record

Inputs: id (required).

get_invoiceC
Read-onlyIdempotent

Get an invoice record

Inputs: id (required).

get_invoice_payments_by_invoice_idB
Read-onlyIdempotent

Get all payment records of an invoice

Inputs: invoice_id (required), cursor, per_page.

get_invoice_pdfA
Read-onlyIdempotent

Get the base64 encoded version of the invoice PDF

Inputs: id (required), cursor, per_page.

get_invoice_vatsC
Read-onlyIdempotent

Get all invoice vat records

Inputs: cursor, per_page.

get_labelC
Read-onlyIdempotent

Get a label

Inputs: id (required).

get_labelsC
Read-onlyIdempotent

Get all labels

Inputs: cursor, per_page, model_type, search, +1 more.

get_leadA
Read-onlyIdempotent

Get one lead record

Inputs: id (required).

get_leadsB
Read-onlyIdempotent

Get all lead records

Inputs: cursor, per_page, email.

get_material_groupC
Read-onlyIdempotent

Get a material group record

Inputs: id (required).

get_material_groupsA
Read-onlyIdempotent

Get all material group records

Inputs: cursor, per_page.

get_materialsC
Read-onlyIdempotent

Get all material records

Inputs: cursor, per_page.

get_meetingB
Read-onlyIdempotent

Get an meeting record

Inputs: id (required).

get_meeting_locationC
Read-onlyIdempotent

Get an meeting location

Inputs: id (required).

get_meeting_locationsB
Read-onlyIdempotent

Get all meeting location records

Inputs: cursor, per_page.

get_meetings_by_planned_course_idA
Read-onlyIdempotent

Get all meeting records of a planned course

Inputs: planned_course_id (required), cursor, per_page, sort.

get_option_of_custom_fieldB
Read-onlyIdempotent

Get an option of a custom field

Inputs: object_type (required), field_slug (required), id (required).

get_options_of_custom_fieldB
Read-onlyIdempotent

Get all options of a custom field

Inputs: object_type (required), field_slug (required), cursor, per_page.

get_orderB
Read-onlyIdempotent

Get an order record

Inputs: id (required).

get_ordersC
Read-onlyIdempotent

Get all order records

Inputs: cursor, per_page, creator_id, created_at_after, +2 more.

get_organizationC
Read-onlyIdempotent

Get an organization record

Inputs: id (required).

get_organization_affiliationsB
Read-onlyIdempotent

Get all organization affiliation records

Inputs: cursor, per_page, user_id.

get_paymentA
Read-onlyIdempotent

Get one payment record

Inputs: id (required).

get_payment_methodsB
Read-onlyIdempotent

Get all payment method records available for customers

Inputs: cursor, per_page.

get_payment_optionsB
Read-onlyIdempotent

Get all payment option records

Inputs: cursor, per_page.

get_planned_courses_by_course_idB
Read-onlyIdempotent

Get all planned course records of a single course

Inputs: course_id (required), cursor, per_page, search, +8 more.

get_planned_courses_by_id_and_course_idA
Read-onlyIdempotent

Get a planned course record of a single course

Inputs: course_id (required), id (required).

get_planning_conflictsC
Read-onlyIdempotent

Get all conflicts

Inputs: cursor, per_page.

get_planning_eventB
Read-onlyIdempotent

Get an planning event record

Inputs: id (required).

get_planning_eventsA
Read-onlyIdempotent

Get all planning event records

Inputs: cursor, per_page.

get_planning_locationsB
Read-onlyIdempotent

Get all locations that are available

Inputs: cursor, per_page.

get_planning_materials_of_planing_eventB
Read-onlyIdempotent

Get all planning materials of a planning event

Inputs: id (required), cursor, per_page.

get_planning_teachersC
Read-onlyIdempotent

Get all teachers that are available

Inputs: cursor, per_page.

get_programB
Read-onlyIdempotent

Get a program

Inputs: id (required).

get_program_editionB
Read-onlyIdempotent

Get a program edition

Inputs: id (required).

get_program_edition_of_elements_batchC
Idempotent

Adds a set of elements to a program edition.

Inputs: id (required), elements (required).

get_program_elementC
Read-onlyIdempotent

Get an element

Inputs: id (required).

get_program_elementsC
Read-onlyIdempotent

Get all elements

Inputs: cursor, per_page, edition_id.

get_program_enrollmentB
Read-onlyIdempotent

Get a program enrollment record

Inputs: id (required).

get_program_enrollmentsB
Read-onlyIdempotent

Get all program enrollments

Inputs: cursor, per_page, student_id, edition_id.

get_program_personal_program_elementsC
Read-onlyIdempotent

Get all program personal program elements

Inputs: cursor, per_page.

get_programsC
Read-onlyIdempotent

Get all programs

Inputs: cursor, per_page.

get_referralsB
Read-onlyIdempotent

Get all referral records

Inputs: cursor, per_page.

get_signup_questionsB
Read-onlyIdempotent

Get all signup_question records

Inputs: cursor, per_page, for_user, for_account, +3 more.

get_taskB
Read-onlyIdempotent

Get a task record

Inputs: id (required).

get_tasksC
Read-onlyIdempotent

Get all task records

Inputs: cursor, per_page.

get_teacherC
Read-onlyIdempotent

Get a teacher record

Inputs: id (required).

get_teacher_enrollments_by_planned_course_idB
Read-onlyIdempotent

Get all teacher enrollments for given planned course.

Inputs: planned_course_id (required), cursor, per_page.

get_teacher_roleB
Read-onlyIdempotent

Get a teacher role

Inputs: id (required).

get_teacher_rolesC
Read-onlyIdempotent

Get all teacher roles

Inputs: cursor, per_page.

get_teachersC
Read-onlyIdempotent

Get all teacher records

Inputs: cursor, per_page, search, label_id, +1 more.

get_thesesB
Read-onlyIdempotent

Get all thesis records

Inputs: cursor, per_page.

get_userB
Read-onlyIdempotent

Get an user record

Inputs: id (required).

get_usersB
Read-onlyIdempotent

Get all user records

Inputs: cursor, per_page, role, email, +2 more.

get_webhookB
Read-onlyIdempotent

Get a registered webhook

Inputs: id (required).

get_webhook_notifications_failedB
Read-onlyIdempotent

Get the failed webhook notifications

Inputs: webhook_id (required), cursor, per_page, start, +1 more.

get_webhooksA
Read-onlyIdempotent

Get all registered webhooks

Inputs: cursor, per_page.

open_invoiceA
Idempotent

Changes the state from concept to open. This will assign the actual invoice number so it's ready for sending. If the current state is not concept, this endpoint does nothing.

Inputs: id (required).

set_attendanceC

Set an attendance.

Inputs: meeting_id (required), enrollment_id (required), state, comment.

update_accountC
Idempotent

Update an account

Inputs: id (required), name (required), email, phone, +3 more.

update_affiliationC
Idempotent

Update an affiliation.

Inputs: id (required), key_contact, user_id, account_id.

update_catalog_productC
Idempotent

Update a catalog product

Inputs: id (required), category_id, is_published, custom, +1 more.

update_catalog_variantC
Idempotent

Update a catalog variant

Inputs: id (required), is_published, edition_description_section_contents_attributes.

update_categoryB
Idempotent

Update a category.

Inputs: id (required), name, slug, description, +2 more.

update_commentC
Idempotent

Update a comment.

Inputs: id (required), content.

update_courseC
Idempotent

Update a course.

Inputs: id (required), category_id, name, code, +10 more.

update_course_locationC
Idempotent

Update a course location.

Inputs: id (required), name, address_attributes.

update_custom_recordC
Idempotent

Update a custom record

Inputs: object_slug (required), id (required), active, display_name, +1 more.

update_enrollmentC
Idempotent

Update an enrollment

Inputs: id (required), end_date.

update_gradeC
Idempotent

Update a grade

Inputs: id (required), grade, score, gradeable_id, +3 more.

update_labelB
Idempotent

Update a label

Inputs: id (required), name, color, model_type.

update_leadC
Idempotent

Update a lead

Inputs: id (required), status (required).

update_materialC
Idempotent

Update a material.

Inputs: id (required), name, material_group_id.

update_material_groupC
Idempotent

Update a material group.

Inputs: id (required), name.

update_meeting_locationC
Idempotent

Update a meeting location.

Inputs: id (required), name, course_location_id, capacity, +1 more.

update_option_of_custom_fieldB
Idempotent

Update an option of a custom field

Inputs: object_type (required), field_slug (required), id (required), value, +1 more.

update_organization_affiliationC
Idempotent

Update an organization affiliation record

Inputs: id (required), key_contact.

update_planned_courseC
Idempotent

Update a planned course.

Inputs: id (required), is_published, course_id, start_date, +11 more.

update_programC
Idempotent

Update a program

Inputs: id (required), name, cost, cost_scheme, +7 more.

update_program_editionB
Idempotent

Update a program edition

Inputs: id (required), name, start_date, end_date, +7 more.

update_program_elementC
Idempotent

Update an element

Inputs: id (required), edition_id, planned_course_id.

update_taskC
Idempotent

Update a task.

Inputs: id (required), name, description, due_date, +5 more.

update_teacher_enrollmentB
Idempotent

Update a teacher enrollment.

Inputs: id (required), planned_course_id, teacher_id, teacher_role_id.

update_teacher_roleA
Idempotent

Update a teacher role.

Inputs: id (required), name (required).

update_userC
Idempotent

Update a user.

Inputs: id (required), first_name, middle_name, last_name, +8 more.

update_webhookC
Idempotent

Update a webhook.

Inputs: id (required), url, active, events.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.8/5.0

    Scored across 189 tools

    Disambiguation4/5

    Most tools have distinct names combining verb and entity, but some could be confused, e.g., 'create_planning_attendee' vs 'create_planning_required_teacher_group_attendee'. Overall, the set is fairly clear.

    Naming Consistency5/5

    The naming convention is consistently verb_noun in snake_case, with standard verbs like create, get, update, delete. Minor exceptions like 'add_label_to_order' still fit the pattern. Very consistent.

    Tool Count2/5

    189 tools is excessive for an MCP server. Typical scopes are 3-15 tools. This set likely mirrors a full API, which overwhelms agents and reduces coherence.

    Completeness3/5

    CRUD is available for many entities, but gaps exist: no delete for orders, invoices, or updates for some objects. Tools like 'get_payment_methods' are read-only. Medium coverage.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      MCP server that enables AI agents to discover and qualify B2B leads from Leadbay's knowledge base, with tools for lead research, enrichment, and outreach logging.
      MIT
    • A
      license
      Not graded
      quality
      F
      maintenance
      MCP server that exposes Redtail CRM's TWAPI as tools, enabling CRM operations like contacts, activities, and onboarding via natural language.
      1
      MIT
    • F
      license
      C
      quality
      D
      maintenance
      An MCP server that exposes Discord bot actions as tools for LLM clients.
      29
      1
      -