MCP tools reference

Udemy MCP tools

11 tools for Udemy on the Cotlet MCP server. Your agent picks them from tools/list.

MCP server
https://cotlet.dev/mcp/v1
Connects with
Your own Udemy instructor account (the account that teaches the courses)
Integration page
Udemy
Udemy Endpoints
Endpoint Access Description
udemy_list_courses read Courses you teach, with status, price, students, rating and URL.
udemy_get_course_performance read Revenue, enrollments and rating for one course over a period, from the Performance dashboard.
udemy_get_revenue_report read Monthly earnings with revenue by channel (Udemy Organic, Your Promotions, Udemy Business and more), by course, refunds and tax withheld.
udemy_list_coupons read Coupons of a course with code, type, price, redemptions and expiry, plus how many you can still create this month.
udemy_list_reviews read Course reviews with rating, text, date and your response if any.
udemy_list_questions read Questions from the course Q&A with lecture, text, replies and whether it is answered.
udemy_create_coupon write New coupon for a course, within Udemy's monthly limit per course; Udemy sets each type's duration.
udemy_update_course_landing_page write Change the title, subtitle or description shown on the public course page.
udemy_send_announcement write Email enrolled students: an educational announcement or a promotional email, within the monthly limits Udemy sets per course.
udemy_reply_to_question write Post an instructor answer in the course Q&A.
udemy_respond_to_review write Public instructor response under a student review.

MCP tool udemy_list_courses

Returns every course on your instructor account, published and draft. Use course_id from each item as the parameter of the other endpoints. Students and rating are the numbers Udemy shows for the course.

Parameters

Parameters: list_courses
NameTypeDescription
status enum published, draft or all. Default: all.

tools/call

JSON-RPC

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "udemy_list_courses",
    "arguments": {}
  }
}

Example response

{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "courses": [
      {
        "course_id": "4821736",
        "title": "Python for Beginners",
        "status": "published",
        "price": "$54.99",
        "students": 8421,
        "rating": 4.6,
        "url": "https://www.udemy.com/course/python-for-yourname/"
      },
      {
        "course_id": "5102298",
        "title": "Excel Pivot Tables",
        "status": "draft",
        "price": null,
        "students": 0,
        "rating": null,
        "url": null
      }
    ]
  },
  "isError": false
}

MCP tool udemy_get_course_performance

Returns the figures the Performance dashboard shows for one course: revenue, new enrollments and average rating for the period. Use it for a weekly or monthly check on a single course.

Parameters

Parameters: get_course_performance
NameTypeDescription
course_id required string Course ID from list_courses.
period enum 7d, 30d, 12m or all. Default: 30d.

tools/call

JSON-RPC

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "udemy_get_course_performance",
    "arguments": {
      "course_id": "course_8c41d2"
    }
  }
}

Example response

{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "course_id": "4821736",
    "period": "30d",
    "revenue": {
      "amount": 1284.5,
      "currency": "USD"
    },
    "enrollments": 212,
    "rating": 4.6
  },
  "isError": false
}

MCP tool udemy_get_revenue_report

Returns the monthly Revenue report: total earnings, then the split by channel and by course, with refunds and tax withheld. One month per call; the current month is partial until Udemy closes it.

Parameters

Parameters: get_revenue_report
NameTypeDescription
month required string Month as YYYY-MM.

tools/call

JSON-RPC

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "udemy_get_revenue_report",
    "arguments": {
      "month": "month"
    }
  }
}

Example response

{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "month": "2026-09",
    "currency": "USD",
    "total": 2310.4,
    "by_channel": [
      {
        "channel": "Udemy Organic",
        "amount": 1420.1
      },
      {
        "channel": "Your Promotions",
        "amount": 612.3
      },
      {
        "channel": "Udemy Business",
        "amount": 278
      }
    ],
    "by_course": [
      {
        "course_id": "4821736",
        "title": "Python for Beginners",
        "amount": 1790.2
      },
      {
        "course_id": "5102298",
        "title": "Excel Pivot Tables",
        "amount": 520.2
      }
    ],
    "refunds": 41.5,
    "tax_withheld": 0
  },
  "isError": false
}

MCP tool udemy_list_coupons

Lists the coupons of one course, newest first, with type, price, redemptions and expiry. It also returns how many new coupons you can still create this month, because Udemy limits that number per course.

Parameters

Parameters: list_coupons
NameTypeDescription
course_id required string Course ID from list_courses.
active_only boolean Skip expired coupons. Default: true.

tools/call

JSON-RPC

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "udemy_list_coupons",
    "arguments": {
      "course_id": "course_8c41d2"
    }
  }
}

Example response

{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "coupons": [
      {
        "coupon_id": "9917000",
        "code": "SEPT1499",
        "type": "custom_price",
        "price": "14.99",
        "redemptions": 37,
        "expires_at": "2026-10-05T09:00:00-07:00"
      }
    ],
    "coupons_left_this_month": 2
  },
  "isError": false
}

MCP tool udemy_list_reviews

Lists reviews of one course, newest first, with rating, text, date and your response if you wrote one. Filter by star rating or unresponded_only to find what still needs an answer.

Parameters

Parameters: list_reviews
NameTypeDescription
course_id required string Course ID from list_courses.
rating integer Only this star rating, 1 to 5.
unresponded_only boolean Skip reviews you already responded to.
since date Only reviews from this date on.

tools/call

JSON-RPC

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "udemy_list_reviews",
    "arguments": {
      "course_id": "course_8c41d2"
    }
  }
}

Example response

{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "reviews": [
      {
        "review_id": "rv_33801",
        "rating": 2,
        "text": "Pivot tables were skipped.",
        "created_at": "2026-10-02T11:20:00Z",
        "response": null
      }
    ],
    "next_cursor": null
  },
  "isError": false
}

MCP tool udemy_list_questions

Lists questions from the course Q&A, newest first, each with its lecture, text and replies. Set unanswered_only to see questions with no instructor reply.

Parameters

Parameters: list_questions
NameTypeDescription
course_id required string Course ID from list_courses.
unanswered_only boolean Only questions with no instructor reply.
since date Only questions from this date on.

tools/call

JSON-RPC

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "udemy_list_questions",
    "arguments": {
      "course_id": "course_8c41d2"
    }
  }
}

Example response

{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "questions": [
      {
        "question_id": "q_70418",
        "lecture": "Filters in Excel",
        "text": "How do I toggle filters faster?",
        "created_at": "2026-10-06T08:12:00Z",
        "answered": false,
        "replies": []
      }
    ],
    "next_cursor": null
  },
  "isError": false
}

Create coupon

write Confirm

MCP tool udemy_create_coupon

Creates one coupon for a course and returns its code and link. Udemy's rule is three new coupons per course per calendar month, and Udemy does not let you delete a coupon afterwards. A custom price must be inside the range Udemy offers. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: create_coupon
NameTypeDescription
course_id required string Course ID from list_courses.
type required enum best_price, custom_price, free_open or free_targeted.
code string Your own coupon code. Default: generated.
price string For custom_price: an amount inside the range Udemy offers, e.g. 12.99.
starts_at datetime Activation time, ISO 8601 with time zone, inside the current calendar month in U.S. Pacific Time. Default: now.

tools/call

JSON-RPC

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "udemy_create_coupon",
    "arguments": {
      "course_id": "4821736",
      "type": "custom_price",
      "code": "OCTOBER1299",
      "price": "12.99",
      "starts_at": "2026-10-12T09:00:00-07:00"
    }
  }
}

Example response

{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "coupon_id": "9917342",
    "course_id": "4821736",
    "code": "OCTOBER1299",
    "type": "custom_price",
    "price": "12.99",
    "currency": "USD",
    "starts_at": "2026-10-12T09:00:00-07:00",
    "expires_at": "2026-11-12T09:00:00-08:00",
    "url": "https://www.udemy.com/course/python-for-yourname/?couponCode=OCTOBER1299",
    "coupons_left_this_month": 2
  },
  "isError": false
}

MCP tool udemy_update_course_landing_page

Changes the title, subtitle or description of the public course page. Only the fields you pass change. Udemy may review changes to a published course before they show. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: update_course_landing_page
NameTypeDescription
course_id required string Course ID from list_courses.
fields required object Any of title, subtitle, description_markdown.

tools/call

JSON-RPC

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "udemy_update_course_landing_page",
    "arguments": {
      "course_id": "course_8c41d2",
      "fields": "fields"
    }
  }
}

Example response

{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "course_id": "4821736",
    "status": "saved",
    "updated": [
      "subtitle"
    ]
  },
  "isError": false
}

Send announcement

write Confirm

MCP tool udemy_send_announcement

Sends one message to the students enrolled in a course. Udemy's rules allow 4 educational announcements and 2 promotional emails per course per month, and promotional emails may not contain external links. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: send_announcement
NameTypeDescription
course_id required string Course ID from list_courses.
kind required enum educational or promotional.
subject required string Email subject.
body_markdown required string Message body. Udemy's announcement rules apply.

tools/call

JSON-RPC

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "udemy_send_announcement",
    "arguments": {
      "course_id": "4821736",
      "kind": "educational",
      "subject": "New lecture: React Server Components",
      "body_markdown": "Section 6 now has a lecture on Server Components, with a short exercise at the end."
    }
  }
}

Example response

{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "announcement_id": "an_2204",
    "course_id": "4821736",
    "kind": "educational",
    "status": "sent",
    "sent_at": "2026-10-12T10:00:00-04:00"
  },
  "isError": false
}

Reply to Q&A question

write Confirm

MCP tool udemy_reply_to_question

Posts an answer under your instructor name in the course Q&A, visible to every student of the course. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: reply_to_question
NameTypeDescription
question_id required string Question ID from list_questions.
body required string Answer text.

tools/call

JSON-RPC

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "udemy_reply_to_question",
    "arguments": {
      "question_id": "question_8c41d2",
      "body": "body"
    }
  }
}

Example response

{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "question_id": "q_70418",
    "reply_id": "rp_9081",
    "status": "published"
  },
  "isError": false
}

Respond to review

write Confirm

MCP tool udemy_respond_to_review

Posts a public response under one student review, as you. By default you confirm each call; you can switch that off for this tool.

Parameters

Parameters: respond_to_review
NameTypeDescription
review_id required string Review ID from list_reviews.
body required string Response text.

tools/call

JSON-RPC

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "udemy_respond_to_review",
    "arguments": {
      "review_id": "rv_33801",
      "body": "Thanks for pointing this out. Pivot tables now have their own section, starting at lecture 14."
    }
  }
}

Example response

{
  "content": [
    {
      "type": "text",
      "text": "{ ... same JSON as structuredContent ... }"
    }
  ],
  "structuredContent": {
    "review_id": "rv_33801",
    "status": "published"
  },
  "isError": false
}