Skip to main content
Glama

Study Planner MCP

Offline exam planning for your AI: no account, no login, no internet needed, nothing stored. Free forever, open source.

Give it your exam dates and how many hours you can study, the same on every day or different for each weekday, and get back a day by day plan with spaced repetition review dates, pomodoro blocks with breaks, and dated milestones for a big assignment. Ask for a revision timetable, an exam schedule or the spaced repetition dates for a topic, and it works them out from your dates and your hours. The date math is done by tested code, not guessed by the model.

Why not just use Brightspace tools

Brightspace and Canvas tools read your school site. They tell you what is due, what your grades are and what your teachers announced, and they need an account and a sign in. This server reads no site at all. You give it the exam dates and the hours you can study, and it works out the timetable, the review dates and the breaks. Run it next to an LMS server if you like: one tells you what is assigned, the other tells you how to study it.

Related MCP server: Meeting Scheduler

Copy and paste any of these into your AI app once the server is installed.

  • "Plan 3 weeks of study for my 4 exams"

  • "What should I study today?"

  • "When should I review what I learned today for my exam on Nov 30?"

  • "Plan 3 hours of studying as pomodoro blocks with breaks."

  • "Break my 6 hour essay due Friday into milestones."

Ask it things like:

  • "I have a networking exam on Dec 12 and scripting on Dec 15. I can study 3 hours a day except Sundays. Make me a plan."

  • "I have a networking exam on Dec 12. I study 2 hours on weekdays and 6 hours on weekends. Make me a plan."

  • "My networking exam covers routing, switching and security. Split the study hours over those topics and tell me what to study today."

  • "When should I review what I learned today so I remember it for my exam on Nov 30?"

  • "What should I study today? My networking exam is on Dec 12 and I studied routing last Friday."

  • "Am I on track for my exam on Dec 12 if I can study 2 hours a day?"

  • "Plan 3 hours of studying as pomodoro blocks with breaks."

  • "Break my 6 hour essay due Friday into milestones."

  • "Give me this plan as an .ics file so I can import it into Google Calendar."

This is a free, open source MCP server. It works with Claude, ChatGPT, Cursor, VS Code Copilot and any other app that supports MCP. It runs on your computer, so your study data never leaves it. The install steps below have the exact config for each app.

npm downloads license

Install

The server runs on your computer through npx, so you need Node.js 20 or newer. There is no account, no key and nothing to sign in to.

Every app reads its MCP config from its own file, so pick yours:

All of them start the same server the same way. The only difference is where the JSON goes.

Claude Desktop

Add this to claude_desktop_config.json:

{
  "mcpServers": {
    "study-planner": {
      "command": "npx",
      "args": ["-y", "study-planner-mcp"]
    }
  }
}

Restart Claude Desktop after you save the file.

Claude Code

Run this in a terminal:

claude mcp add study-planner -- npx -y study-planner-mcp

ChatGPT

The ChatGPT desktop app can start a server that runs on your machine. Open Settings, turn on developer mode, add a connector and paste this JSON:

{
  "mcpServers": {
    "study-planner": {
      "command": "npx",
      "args": ["-y", "study-planner-mcp"]
    }
  }
}

The ChatGPT website talks to servers over the web, so use the desktop app for a server that runs on your computer.

Cursor

Cursor reads mcp.json from the project folder at .cursor/mcp.json, or from your home folder at ~/.cursor/mcp.json if you want the server in every project. On Windows the home folder file is %USERPROFILE%\.cursor\mcp.json.

{
  "mcpServers": {
    "study-planner": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "study-planner-mcp"]
    }
  }
}

Restart Cursor after you save the file. The Customize page in the sidebar lists the server once it starts, and you can turn it on or off there.

VS Code Copilot

Put this in .vscode/mcp.json in your project folder, or in the mcp.json file in your user profile:

{
  "servers": {
    "study-planner": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "study-planner-mcp"]
    }
  }
}

VS Code also reads a portable .mcp.json file in the project root. That file uses the name mcpServers instead of servers:

{
  "mcpServers": {
    "study-planner": {
      "command": "npx",
      "args": ["-y", "study-planner-mcp"]
    }
  }
}

Restart VS Code after you save the file.

After any of these, try one of the questions at the top of this page.

Tools

Tool

What it does

build_study_plan

A day by day study plan for one or more exams, sharing the hours of each weekday by urgency, with a warning if there is not enough time, and the topic of each day when an exam has topics

make_spaced_repetition_schedule

Spaced repetition review dates for a topic at expanding intervals, with dates on or after the exam marked to skip

plan_pomodoro_sessions

A work and break schedule for a total amount of study time

list_assignment_milestones

Dated milestones that split a big assignment into research, outline, draft, revise and proofread

next_review_dates

The date of the next review for one topic, so you get a single date instead of the whole schedule

export_study_plan_ics

The same plan as an .ics calendar file, with one all day event per study session and one per exam, ready to open or import into Google Calendar or Apple Calendar

what_to_study_today

What to study on one day: the study sessions from your plan for that day, the topic of each session when the exams have topics, plus the spaced repetition reviews that are due that day or are late

exam_countdown

The days left, the study days left, the hours each exam still needs, the hours to put in on each study day and a plain On track or Behind verdict

reschedule_missed_days

The plan rebuilt after days you missed: give the hours already done for each exam and it takes them off the exam, then spreads the hours left over the days from your new start date

The original names make_study_plan, spaced_repetition_dates, pomodoro_plan and assignment_milestones do the same four jobs with the same parameters, so existing configs and saved prompts keep working.

Every date these tools take can be written in plain words, like Dec 12 or in 3 weeks. See Dates in plain words.

Study Planner MCP compared with Brightspace and Canvas

Brightspace MCP and Canvas MCP read your school site. They tell you what is due, what your grades are and what your teachers announced. They need an account and a sign in.

This server reads no site at all. You give it the exam dates and the hours you can study, and it works out the timetable, the review dates and the breaks. Run it next to an LMS server if you like: one tells you what is assigned, the other tells you how to study it.

Study Planner MCP

Brightspace MCP

Canvas MCP

What it reads

Nothing. You give it the exam dates and the hours

Your Brightspace courses, due dates, grades, files and announcements

Your Canvas courses, due dates, grades and announcements

Needs a school account

No

Yes

Yes

How you sign in

You never sign in

Browser sign in with your school login

An API token you create in Canvas

A day by day study timetable

Yes, build_study_plan

No, it shows the dated events your school posted

No, it shows the dated events your school posted

Different hours for each weekday

Yes, hours_per_weekday on the plan tools

No

No

Which topic to study on each day

Yes, give the exam topics

No

No

Spaced repetition review dates

Yes, make_spaced_repetition_schedule, and next_review_dates for the next one only

No

No

Pomodoro blocks with breaks

Yes, plan_pomodoro_sessions

No

No

Assignment milestones with dates

Yes, list_assignment_milestones

No

No

What to do today

Yes, what_to_study_today, and it adds the reviews that are due

Yes, a to do list of the work your school set

Yes, a to do list of the work your school set

A calendar file

Yes, export_study_plan_ics writes your study sessions and your exams

Yes, of your due dates

No

Works without a network

Yes

No

No

Brightspace also writes your due dates into a calendar file, and both of them show the dated events your school posted. What they do not do is turn your exam dates and your study hours into a day by day timetable with spaced repetition dates and pomodoro breaks.

Keywords

People search for a study planner with words like these, so here they are in one place. Revision timetable, exam schedule and spaced repetition dates are on the list, along with the other names for the same jobs.

  • study planner mcp

  • study planner

  • study planner offline

  • study-planner-mcp

  • study plan mcp

  • revision timetable

  • revision schedule

  • revision plan

  • revision planner

  • reschedule study plan

  • exam schedule

  • exam timetable

  • exam planner

  • exam prep

  • exam countdown

  • exam study plan

  • study schedule

  • study timetable

  • study calendar

  • spaced repetition

  • spaced repetition dates

  • spaced repetition schedule

  • pomodoro

  • pomodoro planner

  • assignment milestones

  • assignment plan

  • student planner

  • student

  • mcp

  • mcp server

  • model context protocol

  • offline

The npm listing uses the same words. If you searched for one of them, install the server and ask for a plan.

How the study plan works

Each day has the hours of that weekday, which is hours_per_day unless you set hours_per_weekday. Those hours are shared across the exams that still need work, weighted by how many hours are left divided by how many days remain, so closer and bigger exams get more time. Study stops the day before each exam. If the hours do not fit, the plan says how many are short instead of pretending. The dates the server works out are plain calendar dates, so time zones never shift a day.

When an exam has topics, the hours the exam gets on a day are split over its topics in proportion to the hours each topic still needs. That way the plan answers which topic to study, not only which exam.

Dates in plain words

Every date the tools take can be written the way you say it. The server reads the date itself, so the day math stays in tested code.

  • 2026-12-12 for a date you know exactly.

  • Dec 12, December 12 or 12 Dec for a month and a day. Without a year it means the next one that has not passed yet, so asked for in October, Dec 12 means 12 December of that year, and asked for in December it means 12 December of the next year.

  • Dec 12 2026 when you want a year of your own.

  • today, tomorrow and yesterday.

  • in 3 days, in 2 weeks, in 3 months and in 1 year, counted from today. Number words work too, like in two weeks.

  • 3 days ago and 2 weeks ago for the days behind you.

  • Friday for the coming Friday, next Friday for the Friday of the week after that, and last Friday for the one before.

This works in every date the tools take: the exam dates, start_date, due_date, first_study_date, exam_date, from_date and the date of what_to_study_today.

Dates with a number for the month, like 12/12/2026, are not read, because the order of the numbers is not clear. Write the month as a name, like Dec 12 2026.

Tool call:

{
  "exams": [{ "name": "Networking", "date": "Dec 12 2026", "hours_needed": 6 }],
  "start_date": "2026-12-07",
  "hours_per_day": 2
}

The answer:

Everything fits: 1 exam, 3 study days, 6h

Exams
- Networking on 2026-12-12 sat, 6h planned

Plan from 2026-12-07
- 2026-12-07 mon  Networking 2h  (2h total)
- 2026-12-08 tue  Networking 2h  (2h total)
- 2026-12-09 wed  Networking 2h  (2h total)

Everything fits.

The date 2026-12-12 gives the same plan.

Different hours each day of the week

Study days are not all the same length. hours_per_weekday sets the hours for each weekday, so the plan can give you 2 hours from Monday to Friday and 6 hours on Saturday and Sunday. Weekdays you leave out of the list fall back to hours_per_day, and a weekday with 0 hours is a day off, the same as a day in days_off. Days listed in days_off are always left out. The same list works in export_study_plan_ics and what_to_study_today, so all three tools build the same plan.

Tool call:

{
  "exams": [{ "name": "Networking", "date": "2026-12-12", "hours_needed": 20 }],
  "hours_per_day": 3,
  "hours_per_weekday": [
    { "day": "mon", "hours": 2 },
    { "day": "tue", "hours": 2 },
    { "day": "wed", "hours": 2 },
    { "day": "thu", "hours": 2 },
    { "day": "fri", "hours": 2 },
    { "day": "sat", "hours": 6 },
    { "day": "sun", "hours": 6 }
  ],
  "start_date": "2026-11-30"
}

The answer:

Everything fits: 1 exam, 7 study days, 20h

Exams
- Networking on 2026-12-12 sat, 20h planned

Plan from 2026-11-30
- 2026-11-30 mon  Networking 2h  (2h total)
- 2026-12-01 tue  Networking 2h  (2h total)
- 2026-12-02 wed  Networking 2h  (2h total)
- 2026-12-03 thu  Networking 2h  (2h total)
- 2026-12-04 fri  Networking 2h  (2h total)
- 2026-12-05 sat  Networking 6h  (6h total)
- 2026-12-06 sun  Networking 4h  (4h total)

Everything fits.

Saturday carries the 6 hours, and Sunday gets the 4 hours that are left over.

Hours per topic

Give an exam topics and the plan says which topic to study on each day, not just which exam. The hours of a day are split over the topics of the exam in proportion to the hours each topic still needs, so the topic that needs the most work gets the most time. Leave hours_needed off a topic and the hours of the exam are split evenly over the topics that have no hours of their own.

Tool call:

{
  "exams": [
    {
      "name": "Networking",
      "date": "2026-12-10",
      "topics": [
        { "name": "Routing", "hours_needed": 6 },
        { "name": "Switching", "hours_needed": 4 },
        { "name": "Security", "hours_needed": 2 }
      ]
    }
  ],
  "hours_per_day": 4,
  "start_date": "2026-12-07"
}

The answer:

Everything fits: 1 exam, 3 study days, 12h

Exams
- Networking on 2026-12-10 thu, 12h planned
  - Routing 6h planned
  - Switching 4h planned
  - Security 2h planned

Plan from 2026-12-07
- 2026-12-07 mon  Networking 4h  (4h total)
  - Networking: Routing 2h, Switching 1.5h, Security 0.5h
- 2026-12-08 tue  Networking 4h  (4h total)
  - Networking: Routing 2h, Switching 1.5h, Security 0.5h
- 2026-12-09 wed  Networking 4h  (4h total)
  - Networking: Routing 2h, Switching 1h, Security 1h

Everything fits.

what_to_study_today gives the same topics for one day, so one call tells you what to study today and which part of the exam it belongs to.

Tool call:

{
  "date": "2026-12-08",
  "exams": [
    {
      "name": "Networking",
      "date": "2026-12-10",
      "topics": [
        { "name": "Routing", "hours_needed": 6 },
        { "name": "Switching", "hours_needed": 4 },
        { "name": "Security", "hours_needed": 2 }
      ]
    }
  ],
  "hours_per_day": 4,
  "start_date": "2026-12-07"
}

The answer:

Today 2026-12-08 tue

Study sessions, 4h total
- Networking 4h
  - Routing 2h, Switching 1.5h, Security 0.5h

Next exam: Networking on 2026-12-10 thu, 2 days left.

Example plan

This is a real answer from build_study_plan, copied from a run of the code in this folder. Networking needs 20 hours by Dec 12 and Scripting needs 16 hours by Dec 15, with 3 hours a day and no study on Sundays. Passing start_date is what makes the dates repeatable.

Tool call:

{
  "exams": [
    { "name": "Networking", "date": "2026-12-12", "hours_needed": 20 },
    { "name": "Scripting", "date": "2026-12-15", "hours_needed": 16 }
  ],
  "hours_per_day": 3,
  "days_off": ["sun"],
  "start_date": "2026-11-30"
}

The answer:

Everything fits: 2 exams, 12 study days, 36h

Exams
- Networking on 2026-12-12 sat, 20h planned
- Scripting on 2026-12-15 tue, 16h planned

Plan from 2026-11-30
- 2026-11-30 mon  Networking 2h, Scripting 1h  (3h total)
- 2026-12-01 tue  Networking 2h, Scripting 1h  (3h total)
- 2026-12-02 wed  Networking 2h, Scripting 1h  (3h total)
- 2026-12-03 thu  Networking 2h, Scripting 1h  (3h total)
- 2026-12-04 fri  Networking 1.5h, Scripting 1.5h  (3h total)
- 2026-12-05 sat  Networking 2h, Scripting 1h  (3h total)
- 2026-12-07 mon  Networking 2h, Scripting 1h  (3h total)
- 2026-12-08 tue  Networking 1.5h, Scripting 1.5h  (3h total)
- 2026-12-09 wed  Networking 2h, Scripting 1h  (3h total)
- 2026-12-10 thu  Networking 1.5h, Scripting 1.5h  (3h total)
- 2026-12-11 fri  Networking 1.5h, Scripting 1.5h  (3h total)
- 2026-12-12 sat  Scripting 3h  (3h total)

Everything fits.

Sundays are skipped, and Networking stops on Dec 11 because studying stops the day before each exam, so Dec 12 is Scripting only.

Calendar file

export_study_plan_ics takes the same arguments as build_study_plan and answers with a complete .ics file instead of plain text. Save the answer as plan.ics and open it, or import it in Google Calendar or Apple Calendar. Every study session becomes an all day event marked free, every exam becomes an all day event marked busy, and include_exams: false gives you the study sessions only. Each event carries a UID built from its date and exam name, and the dates are written as plain calendar dates, so no time zone moves an event to another day.

Tool call:

{
  "exams": [{ "name": "Networking", "date": "2026-12-12", "hours_needed": 6 }],
  "start_date": "2026-12-07",
  "hours_per_day": 2,
  "days_off": ["sun"]
}

These are the first lines of the file, copied from a run. Two more study events and one exam event follow in the same shape, and DTSTAMP is the moment of the export, so yours will differ.

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//AnonymousOnyx22//Study Planner MCP//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:Study plan
BEGIN:VEVENT
UID:2026-12-07-networking-study@study-planner-mcp
DTSTAMP:20261021T022919Z
DTSTART;VALUE=DATE:20261207
DTEND;VALUE=DATE:20261208
SUMMARY:Study: Networking 2h
DESCRIPTION:Networking\, 2h of study. Day total 2h. Exam on 2026-12-12 sat.
TRANSP:TRANSPARENT
END:VEVENT

What to study today

what_to_study_today answers one day in one call. It merges the study sessions your plan gives for that day with the spaced repetition reviews that are due that day or are late. Pass the same exams and hours you use in build_study_plan, and the topics you are reviewing with the day you first studied each one. Leave date out and it uses today's date. Pass start_date if your plan already has a first day, so the sessions match the plan you made earlier.

Tool call:

{
  "date": "2026-11-30",
  "exams": [{ "name": "Networking", "date": "2026-12-12", "hours_needed": 12 }],
  "hours_per_day": 2,
  "reviews": [{ "topic": "Routing", "first_study_date": "2026-11-27" }]
}

The answer:

Today 2026-11-30 mon

Study sessions, 2h total
- Networking 2h

Reviews due today
- Routing, 2nd review

Reviews to catch up
- Routing, 1st review, 2 days late (due 2026-11-28)

Next reviews
- Routing on 2026-12-04 fri, 3rd review

Next exam: Networking on 2026-12-12 sat, 12 days left.

Exam countdown

exam_countdown answers whether you are on track for an exam. It gives the days left, the number of study days left after days off and weekdays with 0 hours, the hours the exam still needs, the hours to put in on each study day and a plain verdict. It uses the same hours_per_day, hours_per_weekday and days_off as the plan tools, so the verdict matches the plan they build. Pass from_date to count from a fixed day.

Tool call:

{
  "exams": [{ "name": "Networking", "date": "2026-12-12", "hours_needed": 20 }],
  "from_date": "2026-11-30",
  "hours_per_day": 2,
  "days_off": ["sun"]
}

The answer:

Exam countdown from 2026-11-30 mon

Networking, exam 2026-12-12 sat
- 12 days left, 11 study days left
- 20h still needed, 1.8h per study day
- On track: 20h fits in 11 study days at your hours.

If the hours do not fit, the last line says Behind by the hours short, so you know how much time to add or how many hours to lower.

Reschedule missed days

reschedule_missed_days is for the week that did not go to plan. Give each exam the hours you have already done with hours_done, say which day you are starting again with start_date, and it takes the done hours off each exam before it spreads the hours left over the days that remain. It uses the same hours_per_day, hours_per_weekday and days_off as build_study_plan, and an exam with topics takes the done hours off its topics in proportion to their hours. Use it when you need to reschedule study plan hours after a break, without counting the same work twice.

Tool call:

{
  "exams": [{ "name": "Networking", "date": "2026-12-12", "hours_needed": 10, "hours_done": 4 }],
  "hours_per_day": 2,
  "start_date": "2026-12-09"
}

The answer:

Exams
- Networking on 2026-12-12 sat, 4h done, 6h left

Rescheduled from 2026-12-09
- 2026-12-09 wed  Networking 2h  (2h total)
- 2026-12-10 thu  Networking 2h  (2h total)
- 2026-12-11 fri  Networking 2h  (2h total)

Everything fits.

The four hours already done come off the ten the exam needs, so the repaired plan starts on Dec 9 with six hours left to study.

Next review date

next_review_dates gives one date, the next review for one topic, instead of the whole schedule. It counts from the day you first studied the topic, and it skips any review that falls on or after the exam. The answer counts the reviews that have already passed. Pass from_date to say which day to count from, so the answer is repeatable. Use make_spaced_repetition_schedule when you want every review date.

Tool call:

{
  "topic": "Routing",
  "first_study_date": "2026-11-27",
  "exam_date": "2026-12-12",
  "from_date": "2026-11-29"
}

The answer:

Next review for "Routing": 2026-11-30 mon, the 2nd review, in 1 day.
1 review has passed.

The routing was first studied on Nov 27, so the first review fell on Nov 28 and has passed. The next one is Nov 30, and the review on Dec 27 is left out because it falls after the exam on Dec 12.

Troubleshooting

When a tool call fails, the server sends back a short message that says what to change. These are the ones people hit most, with the text as it appears and the fix.

A date is not understood

Invalid arguments for tool make_study_plan: exam_date must be a date, got "in a few weeks". "in a few weeks" is not a date I can read. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks. Write the month as a name, like Dec 12 2026, when the day comes first.

Plain text dates like in 3 weeks, next Friday and Dec 12 work, but the count has to be one number or one number word, so in a few weeks does not. Give a number (in 3 weeks) or a full date like 2026-12-12. If a message says a month or weekday could be two names, write it out in full.

The exam is not after the start date

Networking is on 2026-10-01, which is not after the start date 2026-11-01.

The exam date is today or already past, so there is no day left to study. Check the year, because a date written as Oct 1 means the next Oct 1 but 2026-10-01 is taken as written. If you are rebuilding a plan after missing days, use reschedule_missed_days instead.

Hours per day is zero

Invalid arguments for tool make_study_plan: hours_per_day must be greater than 0; try hours_per_day: 3

hours_per_day has to be above 0 and at most 16. To skip a day, leave it out with days_off: ["sun"], or give a weekday 0 hours in hours_per_weekday, like [{day: "sun", hours: 0}].

Topic hours do not match the exam

The exam Networking needs 6h but its topics add up to 5h. Make the exam hours match the topics, or leave hours_needed out of the exam.

When an exam has topics, either give hours to every topic and leave hours_needed off the exam, or give hours_needed on the exam and let the topics share it evenly.

The server does not show up in your app

Run npm run build if you installed from source, then restart the app after editing its config. The Install section above has the exact config for each app.

Development

npm install
npm run build
npm test
npm run demo

npm run demo runs after the build and prints a sample plan for two exams, the what_to_study_today answer for one day and the first lines of the .ics file. It uses fixed dates, so the output is the same each time.

Pass start_date in tools to get repeatable results. The tests call every tool through a real MCP client, so they need no account or network.

More free student MCP servers

All free, open source and read only where they touch your accounts. Browse the full list at brightspacemcp.com/more-mcps.

Server

What it does

Brightspace MCP

D2L Brightspace for AI. Due dates with real submission status, grades, a target grade calculator and course files.

Canvas MCP

Canvas LMS for AI, read only. Due dates, missing work, grades and announcements.

Moodle MCP

Moodle for AI, read only. Due dates, overdue work, grades and announcements.

Google Classroom MCP

Google Classroom for AI, read only. Todos, due dates, missing work and grades.

GPA Calculator MCP

GPA, grade conversion and the grade you need on the final, for AI. Works offline, no account.

Citations MCP

APA, MLA and Chicago citations from a DOI, an ISBN or typed details. No account.

Paper Finder MCP

Search scholarly papers, find open access copies and related work through OpenAlex. No key needed.

BibTeX Reference Manager MCP

Clean, convert, dedupe and lint BibTeX, RIS and CSL JSON reference lists, and make cite keys. Works offline.

Open Textbook Finder MCP

Find free legal copies of textbooks on OpenStax, DOAB and Open Library, look up editions by ISBN and suggest cheaper older ones.

STEM Calculator MCP

Chemistry and physics homework math: molar mass, balancing equations, grams to moles, unit conversion and significant figures. Works offline.

Essay Stats MCP

Offline writing metrics for essays. Word and page counts, readability scores, passive voice, repeated openers, filler words, long sentences and word limit checks, so students can check their work against assignment requirements. No account, no network.

Syllabus to Calendar MCP

Syllabus to calendar MCP server. Extract dates from syllabus text, build an ics calendar, expand recurring classes and merge calendars. Works offline, no account.

Job Application Tracker MCP

Job application tracker MCP server. Track internships, jobs, interviews and deadlines offline, see what is coming up, and export your list as CSV or Markdown. No account and no API keys.

License

MIT

FAQ

How many hours a day before my exam?

You give the hours you can study on each day. The plan spreads work by urgency, so if time is tight it concentrates more near the exam. If there is not enough time, the plan gives a warning.

How do I space out revision?

Use make_spaced_repetition_schedule for a topic to get review dates at expanding intervals. You can also use next_review_dates for just the next one. Dates on or after the exam are marked to skip.

Is there a study planner offline?

Yes. This server runs on your computer with no account, no login and no internet needed. All date math runs locally.

What should I study today?

Use what_to_study_today with your exam dates and hours or with a plan. It lists sessions for today and any spaced repetition reviews due or late.

Can I add the plan to my calendar?

Yes. Use export_study_plan_ics to get an .ics file you can import into Google Calendar or Apple Calendar.

Available Tools

13 tools
assignment_milestonesAssignment milestonesB
Read-onlyIdempotent

List dated milestones that split a big assignment into steps between a start date and the due date. Dates can be plain text, like Dec 12 or in 3 weeks. Example prompt: "Break my 6 hour essay due 2026-11-20 into milestones."

NameRequiredDescriptionDefault
stepsNoCustom steps with relative sizes. Defaults to research, outline, draft, revise, proofread.
titleYesAssignment name.
due_dateYesDue date. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
start_dateNoDefaults to today. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
estimated_hoursYesEstimated total hours.

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered elsewhere. The description adds genuine context by noting that dates may be plain text ('Dec 12', 'in 3 weeks'), which tells the agent fuzzy input is tolerated. It does not explain what the returned milestones look like (dates plus names?) or how hours are distributed across steps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences: purpose, date-format note, and a worked example. Nothing is padded, and the key idea (splitting an assignment between start and due date) is front-loaded. The only cost is that leading verb 'List', which misdirects slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description should signal the return shape, but it only implies a dated list of steps. For a generation tool with 3 required inputs and a default step set hidden in the schema, readers must go to the schema to learn what output to expect. The missing distinction from 'list_assignment_milestones' is the biggest gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the schema, including the plain-text date formats the description repeats. The description adds no new meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description says it will 'List dated milestones that split a big assignment into steps between a start date and the due date', which conveys the resource and the start-to-due span. But 'List' implies retrieval of existing data, when the required parameters (title, due_date, estimated_hours) show this tool actually generates a milestone breakdown. The sibling tool 'list_assignment_milestones' makes this ambiguity worse, and the description never resolves it.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The example prompt ('Break my 6 hour essay due 2026-11-20 into milestones') gives a concrete use context, which is better than nothing. However, there is no explicit when-not guidance and no mention of the near-identical sibling 'list_assignment_milestones' or how this tool relates to 'build_study_plan'/'make_study_plan'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

build_study_planBuild a study planA
Read-onlyIdempotent

Build a day by day study plan for one or more exams. Give each exam date and the hours you have per day, or set different hours for each weekday with hours_per_weekday, and get dated study sessions split by urgency, with a warning when the hours do not fit. Give an exam topics with their own hours and the plan names the topic of each day. Add reviews with the day you first studied each one to show Review: entries in the plan and in the calendar. Dates can be plain text, like Dec 12 or in 3 weeks. Example prompt: "Plan 3 weeks of study for my 4 exams, 90 minutes a day."

NameRequiredDescriptionDefault
examsYesExams with name, date, optional hours needed and optional topics with their own hours.
reviewsNoTopics you are reviewing, with the day you first studied each one.
days_offNoWeekdays with no studying, like ["sun"].
start_dateNoFirst day to study. Defaults to today. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
hours_per_dayNoStudy hours available on a study day.
intervals_daysNoDays after the first study to review.
hours_per_weekdayNoStudy hours for each weekday, like [{day: "mon", hours: 2}, {day: "sat", hours: 6}]. Weekdays you leave out use hours_per_day, a weekday with 0 hours is a day off, and days in days_off are always left out.

Output Schema

NameRequiredDescription
daysYes
fitsYesTrue when every exam gets all its hours.
examsYes
shortYes
start_dateYesFirst day of the plan, as YYYY-MM-DD.
total_hoursYesHours planned over all study days.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly=true, idempotent=true, destructive=false and closed-world, and the description adds genuinely new behavior: sessions are split by urgency, the plan emits a warning when available hours do not fit, and reviews appear as 'Review:' entries in the plan and calendar. Remaining gaps (format of the returned plan, what the warning looks like) are covered by the output schema, so the bar is met without exceeding it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose and main inputs are front-loaded, and the example prompt earns its place, but the middle sentences are dense and grammatically rough ('Give an exam topics with their own hours and the plan names the topic of each day'), and the free-text date capability is restated three times across the description. The content is relevant but the phrasing costs comprehension.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter planning tool with a full schema, an output schema, and rich annotations, the description covers the main input modes, the fallback/precedence rules for hours, date flexibility, and the two notable behaviors (urgency splitting and the hours-don't-fit warning). What is missing is only routing against the near-duplicate sibling make_study_plan, which is an adjacent concern rather than a call-correctness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the description does add real semantics beyond the schema: weekday hours you leave out fall back to hours_per_day, a weekday with 0 is a day off, days in days_off are always excluded, and dates accept free text like Dec 12 or in 3 weeks. It never mentions start_date, intervals_days, or the default hours_per_day of 3 explicitly, so it adds meaning without fully compensating beyond the already-complete schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: 'Build a day by day study plan for one or more exams', and the rest of the description clarifies the outputs (dated sessions split by urgency, topic labels, Review: entries). It never names or distinguishes itself from the very similar sibling make_study_plan, so the agent gets a clear purpose but no sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is shown rather than explained: it tells you which inputs to supply for each mode (hours_per_weekday for per-weekday hours, topics with hours for topic labeling, reviews with first_study_date for review entries) and closes with an example prompt. There is no explicit when-to-use/when-not guidance and no routing to alternatives such as make_study_plan, reschedule_missed_days, or spaced_repetition_dates, so the agent must infer which tool applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

exam_countdownExam countdownA
Read-onlyIdempotent

Check whether you are on track for each exam. For every exam it gives the days left, the study days left, the hours still to study, the hours to put in on each study day and a plain On track or Behind verdict, using the same hours per day, hours per weekday and days off as the plan tools. Give from_date to count from a fixed day. Dates can be plain text, like Dec 12 or in 3 weeks. Example prompt: "Am I on track for my exam on 2026-12-12 if I can study 2 hours a day?"

NameRequiredDescriptionDefault
examsYesExams with name, date, optional hours needed and optional topics with their own hours.
days_offNoWeekdays with no studying, like ["sun"].
from_dateNoThe day to count from. Defaults to today. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
hours_per_dayNoStudy hours available on a study day.
hours_per_weekdayNoStudy hours for each weekday, like [{day: "mon", hours: 2}, {day: "sat", hours: 6}]. Weekdays you leave out use hours_per_day, a weekday with 0 hours is a day off, and days in days_off are always left out.

Output Schema

NameRequiredDescription
examsYes
from_dateYesThe day counted from, as YYYY-MM-DD.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: it explains the computation basis (shared assumptions with the plan tools) and lists exactly what each per-exam result contains, including the plain On track/Behind verdict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, followed by the output inventory and then the parameter tip. The trailing example prompt is somewhat redundant with the schema's date-format notes but useful for illustrating the intended query, and overall there is little wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return shapes in detail, and annotations cover safety. Combined with 100% parameter coverage, the definition is complete enough to invoke correctly; the only soft spot is the absence of explicit routing to sibling tools for plan creation or rescheduling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are already documented in the schema, including date formats, defaults, hours_per_weekday fallback logic and the days_off interaction. The description adds the from_date default-to-today nuance and reinforces flexible date parsing, but does not explain the returned-hours default of 10 or other semantics beyond what the schema states, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'check whether you are on track for each exam' – and enumerates the verdict metrics (days left, study days left, hours still to study, hours per study day, On track/Behind). It also distinguishes itself from the planning siblings by saying it reuses the 'same hours per day, hours per weekday and days off as the plan tools', though it never names a specific sibling such as make_study_plan.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: it is the status-checking companion to the plan tools, and it tells the agent to supply from_date when counting from a fixed day rather than today. The example prompt demonstrates the intended question shape. It stops short of explicit when-not guidance or naming which alternative to use for creating or rescheduling a plan.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_study_plan_icsExport study plan as ICSA
Read-onlyIdempotent

Turn a study plan into an .ics calendar file to import into Google Calendar or Apple Calendar. It builds the same plan as build_study_plan, with the same hours_per_weekday if you set one, and answers with the whole file, so save the answer as plan.ics and open it. Every study session becomes an all day event that shows as free, with the topics of the session in its description when the exam has topics, and every exam becomes an all day event that shows as busy unless include_exams is false. Add reviews with the day you first studied each one to add Review: all day events to the calendar. Dates can be plain text, like Dec 12 or in 3 weeks. Example prompt: "Export my plan for a networking exam on 2026-12-12, 6 hours, starting 2026-12-07, as an ICS file."

NameRequiredDescriptionDefault
examsYesExams with name, date, optional hours needed and optional topics with their own hours.
reviewsNoTopics you are reviewing, with the day you first studied each one.
days_offNoWeekdays with no studying, like ["sun"].
start_dateNoFirst day to study. Defaults to today. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
hours_per_dayNoStudy hours available on a study day.
include_examsNoAlso add an all day event on each exam day. Set false for study sessions only.
intervals_daysNoDays after the first study to review.
hours_per_weekdayNoStudy hours for each weekday, like [{day: "mon", hours: 2}, {day: "sat", hours: 6}]. Weekdays you leave out use hours_per_day, a weekday with 0 hours is a day off, and days in days_off are always left out.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already covering read-only, idempotent and non-destructive, the description nonetheless adds substantial new behavior: the whole file is returned and should be saved as plan.ics, sessions become free all-day events with topic names in the description, exams become busy all-day events unless include_exams is false, and reviews generate 'Review:' events. That is exactly the complementary context annotations cannot provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The content is front-loaded with purpose and output handling, and each sentence carries information about event semantics or invocation. It is somewhat dense and long, with a little overlap against the schema, but nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description compensates by explaining what comes back (the whole file), what to do with it, and how the calendar entries are shaped. For an 8-parameter export tool, an agent has everything needed to call it and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter, including plain-text date formats and hours_per_weekday fallback rules. The description adds only the parity note ('same hours_per_weekday') and the include_exams event semantics, which the schema mostly covers too. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb and resource: 'Turn a study plan into an .ics calendar file', and names the concrete consumer (Google Calendar or Apple Calendar). It also distinguishes itself from build_study_plan by output form (same plan, but returned as a file), so an agent can pick it out of a crowded sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is clear: it is the export path when the user wants a calendar file, and it explicitly mirrors build_study_plan's planning behavior. A closing example prompt reinforces the when. It stops short of an explicit exclusion ('use build_study_plan if you only want the schedule text'), which keeps it from a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_assignment_milestonesList assignment milestonesA
Read-onlyIdempotent

List dated milestones that split a big assignment from a start date to the due date, with default steps for research, outline, draft, revise and proofread. Dates can be plain text, like Dec 12 or in 3 weeks. Example prompt: "Break my 6 hour essay due 2026-11-20 into milestones."

NameRequiredDescriptionDefault
stepsNoCustom steps with relative sizes. Defaults to research, outline, draft, revise, proofread.
titleYesAssignment name.
due_dateYesDue date. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
start_dateNoDefaults to today. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
estimated_hoursYesEstimated total hours.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and closed-world, and the description is consistent with them. Beyond that, it usefully discloses two behavioral traits: that steps default to a fixed five-stage set, and that dates accept lenient plain-text input ('Dec 12', 'in 3 weeks'). It does not say what the returned milestones look like or how shares map to durations, but with annotations and schema covering much ground this is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core operation before the softer date-format and example details. The quoted example prompt earns its place by illustrating input shape. Slight redundancy with the schema's date-format text keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Five parameters with three required, no output schema, and read-only annotations — the burden on the description is modest and it is met. Purpose, defaults, and date flexibility are all covered, and no safety or permission information is needed for a pure computation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including the nested step 'share' is already documented with format examples and defaults. The description restates the default step list and the date leniency without adding syntax or constraints the schema lacks. Baseline 3 applies where the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: list dated milestones that split an assignment between a start date and due date, with a named default step set. An agent understands the operation immediately. It stops short of distinguishing itself from the near-identical sibling 'assignment_milestones', leaving ambiguity about which to pick.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The example prompt ('Break my 6 hour essay due 2026-11-20 into milestones') implicitly conveys a valid use case and triggers. But there is no explicit when-to-use / when-not-to-use statement, no prerequisite conditions, and no routing to alternatives such as assignment_milestones or make_study_plan, which are the obvious competing choices.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

make_spaced_repetition_scheduleMake a spaced repetition scheduleA
Read-onlyIdempotent

Make a spaced repetition schedule for a topic: every review date at expanding intervals from the day you first studied it, with any date on or after the exam marked to skip. Use next_review_dates when you want the next review date only. Dates can be plain text, like Dec 12 or in 3 weeks. Example prompt: "When should I review what I learned today for my exam on 2026-11-30?"

NameRequiredDescriptionDefault
topicYesTopic you studied.
exam_dateNoExam date, if any. Reviews on or after it are skipped. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
intervals_daysNoDays after the first study to review.
first_study_dateNoThe day you first studied it. Defaults to today. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only, non-destructive annotations, it explains that reviews are calculated from the first study date and that entries on or after the exam are marked to skip rather than silently omitted. It does not describe the returned schedule's structure or how relative dates are resolved, so it is informative but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description front-loads the function and cutoff behavior, then presents the alternative, input flexibility, and a short example in a logical order. Its four compact sentences each contribute selection or invocation guidance without substantial repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Together with the fully described schema and safety annotations, this is enough for an agent to construct a normal call and understand skip behavior. Because there is no output schema, the absence of a return-shape description is a small gap, and the near-duplicate sibling spaced_repetition_dates is not differentiated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3 and the schema already documents defaults, interval customization, and accepted date formats. The description reinforces date flexibility and first-study/exam semantics with an example, but adds little parameter information beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence identifies the action and resource—making a full review schedule for a topic—and explains the interval origin and exam cutoff. Naming next_review_dates as the next-date-only alternative also distinguishes it from a close sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit routing rule: use next_review_dates when only the next review date is wanted, making this tool appropriate for the full schedule. The example prompt supplies a concrete use case involving first study date and exam date.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

make_study_planMake a study planA
Read-onlyIdempotent

Build a day by day study plan for one or more exams. Daily hours are shared across exams by urgency, study stops the day before each exam, and the answer warns when there is not enough time. Set hours_per_weekday when your weekdays and your weekend differ, and give an exam topics with their own hours to get the topic of each day as well. Add reviews with the day you first studied each one to show Review: entries in the plan and in the calendar. Dates can be plain text, like Dec 12 or in 3 weeks. Example prompt: "Plan 3 weeks of study for my 4 exams, 90 minutes a day."

NameRequiredDescriptionDefault
examsYesExams with name, date, optional hours needed and optional topics with their own hours.
reviewsNoTopics you are reviewing, with the day you first studied each one.
days_offNoWeekdays with no studying, like ["sun"].
start_dateNoFirst day to study. Defaults to today. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
hours_per_dayNoStudy hours available on a study day.
intervals_daysNoDays after the first study to review.
hours_per_weekdayNoStudy hours for each weekday, like [{day: "mon", hours: 2}, {day: "sat", hours: 6}]. Weekdays you leave out use hours_per_day, a weekday with 0 hours is a day off, and days in days_off are always left out.

Output Schema

NameRequiredDescription
daysYes
fitsYesTrue when every exam gets all its hours.
examsYes
shortYes
start_dateYesFirst day of the plan, as YYYY-MM-DD.
total_hoursYesHours planned over all study days.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a safe, idempotent, non-destructive read, so the description is not burdened with safety disclosure. It does add real behavioral context: daily hours are shared across exams by urgency, study stops the day before each exam, and the result warns when time is insufficient. That is exactly the kind of non-obvious scheduling rule an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded, but the rest is one long run-on chain of clauses joined by commas and 'and', which makes conditional rules harder to parse than they need to be. Dense rather than wasteful, but structure could be improved with clearer separation of the conditional hints.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. Combined with annotations, the description covers the scheduling rules, the warning behavior, the flexible date format, and the topic/review augmentation, leaving few gaps. The only missing piece is disambiguation from build_study_plan.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining the relationship between parameters: hours_per_weekday overrides hours_per_day for the given weekdays, and topics with their own hours produce a per-day topic assignment. It also restates that dates accept plain text such as 'Dec 12' or 'in 3 weeks', reinforcing a flexible-format contract.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Build a day by day study plan for one or more exams.' That is unambiguous. However, a sibling named build_study_plan exists and the description never says how this tool differs from it, so an agent cannot route between the two from the text alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives conditional guidance for optional features ('Set hours_per_weekday when your weekdays and your weekend differ', 'give an exam topics with their own hours'), which is useful. But it never states when to call this versus build_study_plan or the other scheduling siblings, which is the main routing risk here.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

next_review_datesNext review dateA
Read-onlyIdempotent

Give the date of the next review for one topic, so you get a single date instead of the whole schedule. It is the first review that is not on or after the exam and has not passed yet, counting from the day you first studied it. The answer counts the reviews that already passed. Use make_spaced_repetition_schedule when you want every review date. Dates can be plain text, like Dec 12 or in 3 weeks. Example prompt: "When should I review the routing I studied on 2026-11-01 for my exam on 2026-11-30?"

NameRequiredDescriptionDefault
topicYesTopic you studied.
exam_dateNoExam date, if any. Reviews on or after it are skipped. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
from_dateNoThe day to count from. Defaults to today. Reviews before it have passed. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
intervals_daysNoDays after the first study to review.
first_study_dateNoThe day you first studied it. Defaults to today. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and a closed-world scope, so the safety profile is covered. The description contributes behaviour beyond that: that a single date is returned rather than a schedule, and that already-passed reviews are factored in. That counting note is useful but phrased in a way that sits awkwardly against the 'has not passed yet' clause.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The intent is front-loaded in the first clause, but the body repeats itself: the 'single date instead of the whole schedule' framing is restated by the make_spaced_repetition_schedule sentence, and the passed-reviews note partially conflicts with the earlier rule. A tighter, unambiguous one-line definition of the selection rule would be better.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly states what comes back (a single date) and the accepted date formats. For a read-only, closed-world calculation tool with a single required parameter, that covers what an agent needs to invoke it correctly; only the precise selection rule remains fuzzier than ideal.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so each parameter is already documented individually. The description still earns credit by explaining how the parameters interact (exam boundary, counting origin from first_study_date, and the interval sequence), which no single schema field expresses. It repeats the accepted date formats that the schema already states, which is minor redundancy rather than added meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific operation (return the next review date for one topic) and explicitly contrasts it with the whole-schedule tool, so a reader can distinguish it from siblings. However, the defining sentence ('the first review that is not on or after the exam and has not passed yet') is a convoluted double negative that obscures the exact rule being applied.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit alternative routing rule: 'Use make_spaced_repetition_schedule when you want every review date,' which tells the agent when to pick the sibling instead. It also supplies a concrete example prompt anchoring the typical use case. It does not address other plausible siblings (e.g., what_to_study_today), but the main fork is covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_pomodoro_sessionsPlan pomodoro sessionsA
Read-onlyIdempotent

Plan pomodoro sessions for a total amount of study time: work blocks separated by short breaks, with a long break after a set number of sessions. Give start_time, like 09:00, to get clock times for each block. Example prompt: "Plan 3 hours of studying as pomodoro blocks with breaks."

NameRequiredDescriptionDefault
start_timeNoClock time the first block starts, like 09:00. Leave it out to list the blocks as minutes from the start.
work_minutesNoWork block length in minutes.
total_minutesYesTotal study time in minutes.
long_break_minutesNoLong break length in minutes.
short_break_minutesNoShort break length in minutes.
sessions_before_long_breakNoWork sessions before a long break.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a read-only, idempotent, closed-world computation, so safety is covered. The description adds useful behavioral detail about the shape of the generated plan (short breaks between blocks, a long break after a set number of sessions) and how start_time changes the output format, but says nothing about edge cases such as requesting fewer minutes than one work block.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the purpose, then the output shape, then the start_time modifier and an example. Very little waste; the example sentence earns its place as a selection cue, though it partly duplicates the first sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a pure computation with no output schema, fully documented parameters, and read-only annotations, the description covers what the tool produces and how start_time affects it. The main missing element is disambiguation from the near-identical sibling 'pomodoro_plan'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including start_time's two modes, so the schema already does the semantic work and baseline 3 applies. The description reinforces start_time's format and effect but adds nothing about work_minutes, short_break_minutes, long_break_minutes, or sessions_before_long_break beyond the defaults and cadence the schema documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (plan pomodoro sessions for a total amount of study time) and outlines the resulting structure: work blocks separated by short breaks with a long break every N sessions. However, it never distinguishes itself from the sibling 'pomodoro_plan', which appears to be the same capability, so an agent cannot confidently pick between them from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete usage example ('Plan 3 hours of studying as pomodoro blocks with breaks') and an implied condition for supplying start_time (to get clock times). It offers no when-not guidance and no routing versus pomodoro_plan or the other study-planning siblings, so the selection criteria remain inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pomodoro_planPomodoro planA
Read-onlyIdempotent

Plan pomodoro sessions: a work and break schedule for a total amount of study time, with a long break after a set number of sessions. Give start_time, like 09:00, to get clock times for each block. Example prompt: "Plan 3 hours of studying as pomodoro blocks with breaks."

NameRequiredDescriptionDefault
start_timeNoClock time the first block starts, like 09:00. Leave it out to list the blocks as minutes from the start.
work_minutesNoWork block length in minutes.
total_minutesYesTotal study time in minutes.
long_break_minutesNoLong break length in minutes.
short_break_minutesNoShort break length in minutes.
sessions_before_long_breakNoWork sessions before a long break.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as a read-only, idempotent, closed-world computation, so safety disclosure is largely covered. The description adds one genuinely useful behavioral fact about output shape: with start_time you get clock times, without it the blocks are listed as minute offsets. It says nothing about defaults being applied, rounding or truncation of total_minutes into whole sessions, or what happens when parameters conflict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the core capability front-loaded, followed by the one non-obvious input hint and an example prompt. No filler, though the example prompt adds little beyond the preceding sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter, fully documented, read-only planning tool with no output schema, the definition covers purpose, the key optional input, and rough output form. It is nearly complete; the missing pieces are default behavior and result granularity when total_minutes does not divide evenly, plus disambiguation from the duplicate-looking sibling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all six parameters are already documented with types, defaults, and bounds; that sets the baseline at 3. The description only restates start_time and the long-break-after-N-sessions concept in prose, adding no constraint or interaction semantics (e.g. how work_minutes and total_minutes interact, or that only total_minutes is required).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Plan pomodoro sessions') and enumerates the core mechanics: work blocks, breaks, total study time, and a long break after N sessions. It is clear what the tool produces, but it never distinguishes itself from the near-identical sibling 'plan_pomodoro_sessions', leaving the agent to guess which one to call.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives one concrete usage cue ('Give start_time ... to get clock times for each block') plus a sample prompt, which implies when the tool is appropriate. There is no guidance about when not to use it, no prerequisites, and no routing to alternatives such as plan_pomodoro_sessions, build_study_plan, or make_study_plan.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reschedule_missed_daysReschedule missed daysA
Read-onlyIdempotent

Rebuild a study plan after missed study days. Give each exam the hours you have already done and it takes those off the exam, then spreads the hours that are left over the days from start_date, using the same hours_per_day, hours_per_weekday and days_off as the plan tools. When an exam has topics, the hours done come off the topics in proportion to their hours. The answer shows the hours done and the hours left for each exam, and the repaired plan from start_date. Dates can be plain text, like Dec 12 or in 3 weeks. Example prompt: "I missed three days and did 4 hours of networking. Reschedule the rest of my study."

NameRequiredDescriptionDefault
examsYesExams with name, date, optional hours needed, optional topics, and hours_done for the hours you already studied.
days_offNoWeekdays with no studying, like ["sun"].
start_dateNoFirst day of the repaired plan. Defaults to today. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
hours_per_dayNoStudy hours available on a study day.
hours_per_weekdayNoStudy hours for each weekday, like [{day: "mon", hours: 2}, {day: "sat", hours: 6}]. Weekdays you leave out use hours_per_day, a weekday with 0 hours is a day off, and days in days_off are always left out.

Output Schema

NameRequiredDescription
daysYes
fitsYesTrue when every exam gets all its hours left.
examsYes
shortYes
hours_doneYesHours already done over all exams.
hours_leftYesHours still to study over all exams.
start_dateYesFirst day of the repaired plan, as YYYY-MM-DD.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only and idempotent annotations, the description explains the core transformation: hours_done are deducted from exams, topic hours are reduced proportionally, and remaining hours are spread from start_date. It also describes the returned hours done, hours left, and repaired plan.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose and algorithm, and most sentences add relevant behavior. Some date-format explanation duplicates the schema, but the example prompt usefully illustrates the intended input.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with rich schema coverage, annotations, and an output schema, the description covers the scenario, the redistribution logic, topic handling, and the shape of the result. An agent has enough information to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents the parameters. The description still adds meaning by clarifying how hours_done affects exams and topics and by stating that planning parameters behave like the plan tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: rebuild a study plan after missed study days. It clearly distinguishes this from initial planning by explaining that completed hours are removed and remaining hours are redistributed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The missed-days scenario and example prompt make the intended use clear. It references the same hours parameters as the plan tools but does not explicitly name which sibling to use for non-missed-day planning.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

spaced_repetition_datesSpaced repetition datesA
Read-onlyIdempotent

List spaced repetition review dates for a topic at expanding intervals, so you revisit it just before you would forget it. Dates on or after the exam are marked to skip. Dates can be plain text, like Dec 12 or in 3 weeks. Example prompt: "When should I review what I learned today for my exam on 2026-11-30?"

NameRequiredDescriptionDefault
topicYesTopic you studied.
exam_dateNoExam date, if any. Reviews on or after it are skipped. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
intervals_daysNoDays after the first study to review.
first_study_dateNoThe day you first studied it. Defaults to today. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered; the description still adds real behavioral context beyond them — that the review sequence expands and that dates on or after the exam are flagged to skip. What remains undisclosed is the concrete shape of the result (whether skipped dates are omitted or annotated, and the output format), which matters since no output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and the exam cutoff rule are front-loaded in the first two sentences, with the date-format note and example prompt appended as supporting detail. Slight redundancy with the schema's own prose on plain-text dates keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter, read-only, closed-world calculation tool with full schema coverage and no output schema, the description supplies the purpose, the interval concept, the exam cutoff, and the accepted date formats. Nothing essential for a correct call appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3 — the schema already documents topic, exam_date, intervals_days, and first_study_date, including the plain-text date forms. The description repeats the flexible-date parsing and semi-restates the exam cutoff rather than adding new semantics, though the phrase "expanding intervals" does hint at how intervals_days is interpreted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description pairs a specific verb ("List") with a specific resource ("spaced repetition review dates for a topic") and explains the expanding-interval logic, so an agent knows exactly what comes back. It does not, however, distinguish itself from the sibling next_review_dates, which reads like an overlapping capability.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the embedded example prompt ("When should I review what I learned today for my exam on 2026-11-30?") shows the intended scenario without stating when to prefer this over next_review_dates, make_spaced_repetition_schedule, or reschedule_missed_days. No exclusions or prerequisites are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

what_to_study_todayWhat to study todayA
Read-onlyIdempotent

Answer what to study on one day in a single call: the study sessions your plan gives for that day, with the topic of each session when the exams have topics, plus the spaced repetition reviews that are due that day or are late. Give the same exams and hours you use in build_study_plan, including hours_per_weekday, and the topics you are reviewing with the day you first studied each one. Leave date out and it uses today's date. Dates can be plain text, like Dec 12 or in 3 weeks. Example prompt: "What should I study today? I have a networking exam on 2026-12-12 and I studied routing on 2026-11-27."

NameRequiredDescriptionDefault
dateNoThe day to show. Defaults to today. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
examsNoExams with name, date and optional hours needed. Leave it out to show reviews only.
reviewsNoTopics you are reviewing, with the day you first studied each one.
days_offNoWeekdays with no studying, like ["sun"].
start_dateNoFirst day of the plan. Defaults to the day you are asking about. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.
hours_per_dayNoStudy hours available on a study day.
intervals_daysNoDays after the first study to review.
hours_per_weekdayNoStudy hours for each weekday, like [{day: "mon", hours: 2}, {day: "sat", hours: 6}]. Weekdays you leave out use hours_per_day, a weekday with 0 hours is a day off, and days in days_off are always left out.

Output Schema

NameRequiredDescription
dateYesThe day asked about, as YYYY-MM-DD.
shortYes
sessionsYes
next_examYesThe nearest exam on or after the day asked about, or null.
reviews_dueYes
next_reviewsYes
reviews_catch_upYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already disclose that this is a read-only, idempotent, non-destructive, closed-world call, so the safety profile needs no further work. The description adds the useful detail that one call returns both sessions and due-or-late reviews, and that omitted dates default to today. It does not describe anything beyond what the output schema can convey, so a middle score is right.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The key behavior is front-loaded in the first sentence, which is good. The closing quoted example prompt is long and restates date formats and defaults that already appear in the schema, so the description is longer than it needs to be. Some trimming would sharpen it without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Eight parameters carry no required arguments, the annotations are rich, and an output schema exists, so most of the burden is already lifted. The description still covers the defaults, the flexibility for plain-text dates, and how the inputs should match build_study_plan. That is enough for an agent to call it correctly on a first try.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3 even without parameter prose. The description adds real meaning on top of that: exams and hours_per_weekday should mirror the values used in build_study_plan, and each review should be paired with the day the topic was first studied. Those relationships between parameters are not encoded anywhere in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it returns the study sessions planned for one day, each with its topic, plus spaced-repetition reviews that are due or late. That is enough for an agent to tell it apart from make_study_plan or next_review_dates. It stops short of a 5 because the boundary with build_study_plan, which it names as a related tool, is implied rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is clear: call this to answer 'what do I study today' for a single day, and pass the same exams and hours you would give build_study_plan so the two tools agree. The 'leave date out and it uses today' rule and the example prompt make the intended invocation obvious. No explicit exclusions are given, such as when to use spaced_repetition_dates or next_review_dates instead, which keeps it below 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 5 tool updatesv0.1.9
    • Changedbuild_study_plan1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "days": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "date": {
        +            "description": "Study day, as YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "items": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "hours": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "topics": {
        +                  "items": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "hours": {
        +                        "type": "number"
        +                      },
        +                      "name": {
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "name",
        +                      "hours"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "type": "array"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "hours"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "total_hours": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "date",
        +          "total_hours",
        +          "items"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "exams": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "date": {
        +            "description": "Exam date, as YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "hours_planned": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "topics": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "hours_planned": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "hours_planned"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "date",
        +          "hours_planned"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "fits": {
        +      "description": "True when every exam gets all its hours.",
        +      "type": "boolean"
        +    },
        +    "short": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "hours_short": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "topics": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "hours": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "hours"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "hours_short"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "start_date": {
        +      "description": "First day of the plan, as YYYY-MM-DD.",
        +      "type": "string"
        +    },
        +    "total_hours": {
        +      "description": "Hours planned over all study days.",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "start_date",
        +    "fits",
        +    "total_hours",
        +    "exams",
        +    "days",
        +    "short"
        +  ],
        +  "type": "object"
        +}
    • Changedexam_countdown1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "exams": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "date": {
        +            "description": "Exam date, as YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "days_left": {
        +            "type": "number"
        +          },
        +          "hours_needed": {
        +            "type": "number"
        +          },
        +          "hours_per_study_day": {
        +            "type": "number"
        +          },
        +          "hours_short": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "on_track": {
        +            "type": "boolean"
        +          },
        +          "passed": {
        +            "type": "boolean"
        +          },
        +          "study_days_left": {
        +            "type": "number"
        +          },
        +          "topics": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "hours_short": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "need": {
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "need",
        +                "hours_short"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "date",
        +          "days_left",
        +          "study_days_left",
        +          "hours_needed",
        +          "hours_per_study_day",
        +          "hours_short",
        +          "on_track",
        +          "passed"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "from_date": {
        +      "description": "The day counted from, as YYYY-MM-DD.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from_date",
        +    "exams"
        +  ],
        +  "type": "object"
        +}
    • Changedmake_study_plan1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "days": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "date": {
        +            "description": "Study day, as YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "items": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "hours": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "topics": {
        +                  "items": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "hours": {
        +                        "type": "number"
        +                      },
        +                      "name": {
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "name",
        +                      "hours"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "type": "array"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "hours"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "total_hours": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "date",
        +          "total_hours",
        +          "items"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "exams": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "date": {
        +            "description": "Exam date, as YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "hours_planned": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "topics": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "hours_planned": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "hours_planned"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "date",
        +          "hours_planned"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "fits": {
        +      "description": "True when every exam gets all its hours.",
        +      "type": "boolean"
        +    },
        +    "short": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "hours_short": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "topics": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "hours": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "hours"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "hours_short"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "start_date": {
        +      "description": "First day of the plan, as YYYY-MM-DD.",
        +      "type": "string"
        +    },
        +    "total_hours": {
        +      "description": "Hours planned over all study days.",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "start_date",
        +    "fits",
        +    "total_hours",
        +    "exams",
        +    "days",
        +    "short"
        +  ],
        +  "type": "object"
        +}
    • Changedreschedule_missed_days1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "days": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "date": {
        +            "description": "Study day, as YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "items": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "hours": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                },
        +                "topics": {
        +                  "items": {
        +                    "additionalProperties": false,
        +                    "properties": {
        +                      "hours": {
        +                        "type": "number"
        +                      },
        +                      "name": {
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "name",
        +                      "hours"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  "type": "array"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "hours"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "total_hours": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "date",
        +          "total_hours",
        +          "items"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "exams": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "date": {
        +            "description": "Exam date, as YYYY-MM-DD.",
        +            "type": "string"
        +          },
        +          "hours_done": {
        +            "type": "number"
        +          },
        +          "hours_left": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "topics": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "hours_done": {
        +                  "type": "number"
        +                },
        +                "hours_left": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "hours_done",
        +                "hours_left"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "date",
        +          "hours_done",
        +          "hours_left"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "fits": {
        +      "description": "True when every exam gets all its hours left.",
        +      "type": "boolean"
        +    },
        +    "hours_done": {
        +      "description": "Hours already done over all exams.",
        +      "type": "number"
        +    },
        +    "hours_left": {
        +      "description": "Hours still to study over all exams.",
        +      "type": "number"
        +    },
        +    "short": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "hours_short": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "topics": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "hours": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "hours"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "hours_short"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "start_date": {
        +      "description": "First day of the repaired plan, as YYYY-MM-DD.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "start_date",
        +    "fits",
        +    "hours_done",
        +    "hours_left",
        +    "exams",
        +    "days",
        +    "short"
        +  ],
        +  "type": "object"
        +}
    • Changedwhat_to_study_today1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "date": {
        +      "description": "The day asked about, as YYYY-MM-DD.",
        +      "type": "string"
        +    },
        +    "next_exam": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "date": {
        +              "type": "string"
        +            },
        +            "days_left": {
        +              "type": "number"
        +            },
        +            "name": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "name",
        +            "date",
        +            "days_left"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The nearest exam on or after the day asked about, or null."
        +    },
        +    "next_reviews": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "date": {
        +            "type": "string"
        +          },
        +          "number": {
        +            "type": "number"
        +          },
        +          "topic": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "topic",
        +          "number",
        +          "date"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "reviews_catch_up": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "days_late": {
        +            "type": "number"
        +          },
        +          "due_date": {
        +            "type": "string"
        +          },
        +          "number": {
        +            "type": "number"
        +          },
        +          "topic": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "topic",
        +          "number",
        +          "due_date",
        +          "days_late"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "reviews_due": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "due_date": {
        +            "type": "string"
        +          },
        +          "number": {
        +            "type": "number"
        +          },
        +          "topic": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "topic",
        +          "number",
        +          "due_date"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "sessions": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "date": {
        +          "description": "The study day shown, as YYYY-MM-DD, or null when there is none.",
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "is_today": {
        +          "description": "True when the sessions are for the day asked about, false when they are the next study day.",
        +          "type": "boolean"
        +        },
        +        "items": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "hours": {
        +                "type": "number"
        +              },
        +              "name": {
        +                "type": "string"
        +              },
        +              "topics": {
        +                "items": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "hours": {
        +                      "type": "number"
        +                    },
        +                    "name": {
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "name",
        +                    "hours"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              }
        +            },
        +            "required": [
        +              "name",
        +              "hours"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "total_hours": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "date",
        +        "is_today",
        +        "total_hours",
        +        "items"
        +      ],
        +      "type": "object"
        +    },
        +    "short": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "hours_short": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "topics": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "hours": {
        +                  "type": "number"
        +                },
        +                "name": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "name",
        +                "hours"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "hours_short"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "date",
        +    "sessions",
        +    "short",
        +    "reviews_due",
        +    "reviews_catch_up",
        +    "next_reviews",
        +    "next_exam"
        +  ],
        +  "type": "object"
        +}
  2. 7 tool updatesv0.1.7
    • Changedbuild_study_plan2 fields changed
      • addedInput schema / properties / intervals_days
        Added value: +{
        +  "default": [
        +    1,
        +    3,
        +    7,
        +    14,
        +    30
        +  ],
        +  "description": "Days after the first study to review.",
        +  "items": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / reviews
        Added value: +{
        +  "description": "Topics you are reviewing, with the day you first studied each one.",
        +  "items": {
        +    "properties": {
        +      "exam_date": {
        +        "description": "Exam date, if any. Reviews on or after it are skipped. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.",
        +        "type": "string"
        +      },
        +      "first_study_date": {
        +        "description": "The day you first studied it. Defaults to the plan start date. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.",
        +        "type": "string"
        +      },
        +      "topic": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "topic"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Addedexam_countdown
    • Changedexport_study_plan_ics2 fields changed
      • addedInput schema / properties / intervals_days
        Added value: +{
        +  "default": [
        +    1,
        +    3,
        +    7,
        +    14,
        +    30
        +  ],
        +  "description": "Days after the first study to review.",
        +  "items": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / reviews
        Added value: +{
        +  "description": "Topics you are reviewing, with the day you first studied each one.",
        +  "items": {
        +    "properties": {
        +      "exam_date": {
        +        "description": "Exam date, if any. Reviews on or after it are skipped. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.",
        +        "type": "string"
        +      },
        +      "first_study_date": {
        +        "description": "The day you first studied it. Defaults to the plan start date. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.",
        +        "type": "string"
        +      },
        +      "topic": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "topic"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedmake_study_plan2 fields changed
      • addedInput schema / properties / intervals_days
        Added value: +{
        +  "default": [
        +    1,
        +    3,
        +    7,
        +    14,
        +    30
        +  ],
        +  "description": "Days after the first study to review.",
        +  "items": {
        +    "exclusiveMinimum": 0,
        +    "maximum": 9007199254740991,
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / reviews
        Added value: +{
        +  "description": "Topics you are reviewing, with the day you first studied each one.",
        +  "items": {
        +    "properties": {
        +      "exam_date": {
        +        "description": "Exam date, if any. Reviews on or after it are skipped. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.",
        +        "type": "string"
        +      },
        +      "first_study_date": {
        +        "description": "The day you first studied it. Defaults to the plan start date. Use 2026-12-12, or plain text like Dec 12, next Friday or in 3 weeks.",
        +        "type": "string"
        +      },
        +      "topic": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "topic"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedplan_pomodoro_sessions1 field changed
      • addedInput schema / properties / start_time
        Added value: +{
        +  "description": "Clock time the first block starts, like 09:00. Leave it out to list the blocks as minutes from the start.",
        +  "type": "string"
        +}
    • Changedpomodoro_plan1 field changed
      • addedInput schema / properties / start_time
        Added value: +{
        +  "description": "Clock time the first block starts, like 09:00. Leave it out to list the blocks as minutes from the start.",
        +  "type": "string"
        +}
    • Addedreschedule_missed_days
  3. 11 tool updatesv0.1.3
    • First observedassignment_milestones
    • First observedbuild_study_plan
    • First observedexport_study_plan_ics
    • First observedlist_assignment_milestones
    • First observedmake_spaced_repetition_schedule
    • First observedmake_study_plan
    • First observednext_review_dates
    • First observedplan_pomodoro_sessions
    • First observedpomodoro_plan
    • First observedspaced_repetition_dates
    • First observedwhat_to_study_today

TDQS

B3.3/5.0

Scored across 13 tools

Disambiguation2/5

Four pairs of tools are near-duplicates: make_study_plan/build_study_plan, spaced_repetition_dates/make_spaced_repetition_schedule, plan_pomodoro_sessions/pomodoro_plan, and list_assignment_milestones/assignment_milestones. An agent has no reliable basis to pick one of each pair since the descriptions are essentially identical. The remaining tools (reschedule, next_review_dates, what_to_study_today, exam_countdown) are distinct.

Naming Consistency2/5

All names are snake_case, but verb conventions are mixed: make_/build_/plan_/list_ prefixes coexist with bare noun phrases (spaced_repetition_dates, pomodoro_plan, exam_countdown). Worse, the same operation is named with different verb patterns in different tools (make_study_plan vs build_study_plan, plan_pomodoro_sessions vs pomodoro_plan).

Tool Count3/5

13 tools is a reasonable nominal count for the domain, but roughly 4 of them are redundant duplicates, so the effective surface is closer to 9 unique operations. The wasted slots make the set feel padded rather than well-scoped.

Completeness4/5

The domain of study planning is well covered: plan creation, rescheduling after missed days, spaced repetition scheduling, pomodoro blocks, assignment milestones, calendar export, a daily 'what to study' query, and an on-track countdown. Minor gaps exist around persisting/tracking completed sessions beyond the coarse reschedule tool.

Maintenance

ActivityNo data
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    F
    maintenance
    Provides comprehensive date, time, timezone, and calendar operations powered by Luxon, enabling AI agents to perform time calculations, timezone conversions, and temporal data handling across 400+ IANA timezones.
    2
    15 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Automates meeting logistics with tools for scheduling, availability checking, slot finding, timezone conversion, and recurring date generation. Eliminates the need for custom calendar logic by providing validated time operations and formatted invitations for applications and AI assistants.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables users to perform date arithmetic, compute differences, add durations, and retrieve calendar facts via natural language or direct tool calls.
    207 npm
    MIT
  • F
    license
    A
    quality
    A
    maintenance
    Enables AI agents to perform deterministic date, time, timezone, holiday, and business-day arithmetic through MCP, including elapsed-time and calendar-aware operations that skip weekends and supported official holidays.
    1
    -