Muse connector

Ask Muse where your hours went

An assistant can only answer questions about your time if it knows how you spent it. Connect Think in Numbers to Muse by Meta, and Muse can read the hours you have already accounted for, answer questions about them, and add time to your day when you ask.

Last updated

What it does

Think in Numbers is a smart journaling app with time tracking built in. You write or say your day in your own words, and the app counts the hours. The connector lets Muse read those hours and add to them. It never sees your journals.

Things you can ask Muse once you are connected:

  • “How many hours did I sleep last week?”
  • “Compare my work hours this month with last month.”
  • “When did I last go to the gym?”
  • “What time of day do I usually read?”
  • “What's left on my to-do list today?”
  • “Add an hour of reading after dinner to my day.”

Who it is for

  • The connector needs a Think in Numbers Pro subscription. The price is shown in the app before you subscribe, because it differs by store and by country.
  • It is for people 13 and over, as the app is.
  • It is available everywhere the app is.
  • It works in English only for now.

How to connect

  1. Create your account in the Think in Numbers app first, on the App Store or Google Play, and subscribe to Pro.
  2. In Muse, choose to connect Think in Numbers.
  3. Sign in with your Think in Numbers account, the same email you use in the app.
  4. Approve access. Muse can now read your hours and add time to your day. To let it only read, see the next section.

You decide what Muse can do

In the app, Profile has a setting called Connected assistants with three choices:

Off
Muse can do nothing. Every request is refused with a 401, from the moment you choose it.
Read only
Muse can use the ten Read tools. It cannot add time: log_day is not offered to it.
Read and add time
Muse can use all eleven tools. This is the setting until you change it.

Turning it Off ends access at once, for every assistant you have connected. Nothing Muse added is removed, and your days stay as they are.

What Muse can use

Eleven tools. Ten are Read: they look at your data and change nothing. One, log_day, is a Write: it adds time to your day, and only when you ask.

log_day is a write, but not a sensitive one. It moves no money, sends nothing to anyone and publishes nothing, and anything it adds can be changed or removed on the Day page in the app.

Each answer comes back as a short summary in words and the numbers behind it. When a tool cannot do what was asked, it says why in words, and nothing is changed.

  • get_dayRead

    One day: each activity with its hours and clock times, the hours accounted and unaccounted, and anything you did at the same time as something else.

    Inputs: day (today or yesterday) or date (a past date, YYYY-MM-DD); today if left out

    Returns: the date and weekday; whether the day holds any time; hours accounted and unaccounted; whether the day looks complete; whether phone time is logged; the activities, biggest first, each with its name, category, subcategory, hours and clock times (HH:MM-HH:MM, or none); and the time done during something else, with what it was during.

    When it cannot:
    • “<date> is not a date. Use YYYY-MM-DD.”
    • “<date> hasn't happened yet. Today is <today>.”
  • get_daysRead

    Each logged day in a range, with its accounted and unaccounted hours and its activities.

    Inputs: from, to

    Returns: the range, how many days it has and how many are logged, and for each logged day its date, weekday, hours accounted and unaccounted, and activities, each with its name, category, subcategory, hours and clock times (HH:MM-HH:MM, or none).

    When it cannot:
    • “<date> is not a date. Use YYYY-MM-DD.”
    • “<date> hasn't happened yet. Today is <today>.”
    • “The range starts on <from>, after it ends on <to>.”
    • “That is <n> days. Ask for at most 366 at a time.”
  • summarize_rangeRead

    Totals for a range: days logged, hours accounted, phone hours, the hours and share of each category, and the best day.

    Inputs: period (this_week, last_week, this_month, last_month, last_7_days, last_30_days or this_year), or from and to

    Returns: the range, days in it and days logged, hours accounted, phone hours, each category's hours and whole-percent share, biggest first, and the best day with its hours.

    When it cannot:
    • “Give a period, or from and to, not both.”
    • “Give a period, or both from and to.”
    • “<date> is not a date. Use YYYY-MM-DD.”
    • “<date> hasn't happened yet. Today is <today>.”
    • “The range starts on <from>, after it ends on <to>.”
    • “That is <n> days. Ask for at most 366 at a time.”
  • compare_rangesRead

    Two ranges side by side: hours accounted, days logged and the categories that moved most. A period still running is compared like for like, so three days into this week are set against the first three days of last week.

    Inputs: period, compared with the one before it; or from and to, with against_from and against_to (optional, the same number of days just before if left out)

    Returns: both ranges' totals, as summarize_range gives them, and the change: hours accounted, days logged and the four categories that moved most. No change is given when either range has no logged day.

    When it cannot:
    • “Give a period, or from and to, not both.”
    • “Give a period, or both from and to.”
    • “<date> is not a date. Use YYYY-MM-DD.”
    • “<date> hasn't happened yet. Today is <today>.”
    • “The range starts on <from>, after it ends on <to>.”
    • “That is <n> days. Ask for at most 366 at a time.”
    • “Give both against_from and against_to, or neither.”
  • find_activityRead

    The days an activity took time, newest first, with the hours each day and in all. Say the activity in your own words and it is matched to one of your categories.

    Inputs: activity; from and to (optional, the last 30 days if left out)

    Returns: the category it was matched to, the range, each day with its weekday and hours, the number of days, the hours in all, and how many days ago it last took time.

    When it cannot:
    • “Give both from and to, or neither.”
    • “<date> is not a date. Use YYYY-MM-DD.”
    • “<date> hasn't happened yet. Today is <today>.”
    • “The range starts on <from>, after it ends on <to>.”
    • “That is <n> days. Ask for at most 366 at a time.”
    • “Matching that activity is busy right now. Try again in a moment.”
    • “"<activity>" does not match any of their categories. list_categories gives the names.”
  • time_of_dayRead

    When in the day you do things: for each category, the usual time its first stretch starts and its last one ends, and the hours in each hour of the day. Only time with clock times counts.

    Inputs: from, to; category (optional, every category if left out)

    Returns: the range and days logged, and for each category the days with time, the days with clock times, the usual first start and last end (HH:MM), and the hours in each of the day's 24 hours.

    When it cannot:
    • “<date> is not a date. Use YYYY-MM-DD.”
    • “<date> hasn't happened yet. Today is <today>.”
    • “The range starts on <from>, after it ends on <to>.”
    • “That is <n> days. Ask for at most 366 at a time.”
    • “"<category>" is not one of their categories. list_categories gives the names.”
  • get_sleep_hoursRead

    Hours of sleep for each logged day in a range, with the average, the shortest and the longest night.

    Inputs: from, to

    Returns: the range, days logged, days with sleep, the average and total hours, the shortest and longest night with their dates, and each night's date, weekday and hours.

    When it cannot:
    • “<date> is not a date. Use YYYY-MM-DD.”
    • “<date> hasn't happened yet. Today is <today>.”
    • “The range starts on <from>, after it ends on <to>.”
    • “That is <n> days. Ask for at most 366 at a time.”
  • get_todosRead

    Your open to-dos as of a day: how often each is due, whether it is due and done that day, its current and best streak, and how much of this week it has kept.

    Inputs: day (today or yesterday) or date (a past date, YYYY-MM-DD); today if left out

    Returns: the date, how many open to-dos there are, and for each its name, how often it is due in words, its kind, whether it is due and done that day, its current and best streak, this week's days kept, the last day it was kept and its target minutes.

    When it cannot:
    • “<date> is not a date. Use YYYY-MM-DD.”
    • “<date> hasn't happened yet. Today is <today>.”
  • get_week_planRead

    The hours you planned for a week, each line next to the hours logged toward it so far. Weeks start on Sunday.

    Inputs: week (this_week, last_week or next_week; this week if left out)

    Returns: the week and its first day, the days counted, whether there is a plan, the hours planned and logged so far, and each line's name, category, subcategory, hours planned and hours so far. A week with no plan says so; it is not an error.

  • list_categoriesRead

    Your categories and their subcategories.

    Inputs: none

    Returns: each category's name and its subcategories' names.

  • log_dayWrite (not sensitive)

    Adds time to your day from your own words, the way the app does. It only adds: anything that would change or remove saved time, or words that are unclear, it asks you about instead of saving. Nothing is saved in part. The same words sent twice for the same day within ten minutes are added once.

    Inputs: text (your words, up to 10,000 characters); day (today, or yesterday until 00:15)

    Returns: the date and time zone; what this call added, each with its name, category, subcategory, hours and clock times (HH:MM-HH:MM, or none); the day's hours accounted after it; whether it was a repeat of the same words; any time in your words that was left out, and why; and where the time can be changed.

    When it cannot:
    • “Yesterday can only be added to until 00:15. Nothing was saved.”
    • “That reads as a request, not time spent. log_day only adds time, such as "worked 9 to 5". Nothing was saved.”
    • A question about unclear words, then “Nothing was saved.”
    • “That is already on <weekday>: nothing new to add. Nothing was saved.”
    • “<new time> lands on time already saved: <saved time>. Nothing was saved. Ask whether to log only the time that is new.”
    • “<time> hasn't happened yet. It is <HH:MM> now. Nothing was saved.” or “That is more time than has passed today. It is <HH:MM> now. Nothing was saved.”
    • “That would put <hours> on a <length>-hour day. Nothing was saved.”
    • “That would change time already saved: <time>. Nothing was saved.”
    • “The day changed while this was saving. Nothing was saved. Try again.”
    • If the day changed in the moment before saving: “That lands on time saved since it was read.”, “That would take the day past its hours.”, “That time hasn't happened yet.” or “That doesn't fit the day as it is saved.”, each followed by “Nothing was saved.”
    • “Think in Numbers is busy right now. Try again in a moment.”

Any tool can also answer with one of these:

  • “Create your account in the Think in Numbers app first.”
  • “The Muse connector needs a Pro subscription.”
  • “This Think in Numbers account is set to be deleted. Cancel the deletion in the app to use it here again.”
  • “Too many requests. Try again in <n> seconds.”
  • “Something went wrong. Try again.”

The lines that end on “Nothing was saved” may also point to the Day page in Think in Numbers, where saved time can be changed.

How adding time works

  • It writes only to today, or to yesterday until 00:15 in your time zone, as the app does. Never to a day in the future, and never a time that hasn't happened yet.
  • It never puts more on a day than the day holds.
  • It never changes or removes time that is already saved. When your words make a saved stretch with clock times run longer, it adds the extra beside it.
  • Time before midnight that belongs to the day before, such as the start of last night's sleep, is left out, and the answer says so.
  • Saving also updates whether that day's to-dos are done, as saving in the app does.
  • To check what is saved, ask Muse to read the day (get_day).

What it can never see or do

Muse never sees these, whatever you ask:

  • Your journals and journal pages
  • Your mood and energy check-ins
  • Your photos and voice notes
  • The words you wrote or said to describe your day, and the notes on your time

It cannot delete anything, and it cannot change or remove time that is already saved. It can only add new time, to today, or to yesterday until 00:15. To change anything else, use the Day page in the app.

Limits

  • Up to 120 reads a minute.
  • Up to 30 requests an hour for adding time (log_day) and finding an activity (find_activity).
  • A range covers up to 366 days, and never a date in the future.
  • Time can be added to today. Yesterday stays open until 00:15, as it does in the app.
  • Dates are days in your own time zone, the one the app uses.

Past a limit, Muse is told how long to wait before it tries again.

One thing to know

If you use an older version of the Think in Numbers app, it can save an out-of-date copy of a day over time Muse added to that day, and that time goes missing. Updating the app to the latest version stops this. If it happens, email us and we can bring the lost time back.

How to disconnect

Turn Connected assistants to Off in Profile in the app: access ends at once. You can also remove Think in Numbers in Muse’s settings, or email contact@thinkinnumbers.co and we will turn off Muse’s access to your account. What Muse already received is held by Meta under its own privacy policy. Ours is on the Privacy Policy page, and the Terms of Use cover what an assistant does for you.

For developers and reviewers

Endpoint
https://api.thinkinnumbers.co/mcp
Protocol
Model Context Protocol (MCP) over Streamable HTTP. POST only, stateless: no session, no event stream, every answer is JSON.
Discovery
https://api.thinkinnumbers.co/.well-known/oauth-protected-resource/mcp (also served without /mcp), and https://api.thinkinnumbers.co/.well-known/oauth-authorization-server, the sign-in server’s own document passed through.
Sign-in
OAuth 2.1, authorization code with PKCE (S256). Clients can register by dynamic client registration or by a client ID metadata document.
Scopes
profile offline_access. profile is required; offline_access gets a refresh token.
Tokens
Opaque access tokens that last 24 hours, sent in the Authorization header as a Bearer token. A refresh token is issued with them.
Access
A Think in Numbers account with a Pro subscription. Connecting and listing tools work for any signed-in account; the account checks run when a tool is called and answer in words. With Connected assistants Off every request is refused, and with Read only the tool list leaves out log_day.
Annotations
readOnlyHint is true on the ten Read tools and false on log_day. destructiveHint and openWorldHint are false on all eleven. Every tool has an output schema.
Rate limits
300 requests a minute per person of any kind, answered with 429 and Retry-After. Inside that, 120 reads a minute and 30 an hour for log_day and find_activity, answered as a tool error that says how many seconds to wait.

Every HTTP status the endpoint answers with:

200
A JSON-RPC answer. A tool that cannot do the thing answers here too, with isError set and the reason in words.
202
A notification or response from the client, accepted with no body.
400
The body is not valid JSON or not a valid JSON-RPC message, or the protocol version header names a version the server does not speak.
401
No access token, or one that is not valid or has expired, or the account has Connected assistants set to Off. The WWW-Authenticate header gives the resource metadata URL and the scope.
403
The token lacks the profile scope: error="insufficient_scope" in WWW-Authenticate.
405
Any method other than POST, such as GET or DELETE (Allow: POST). There is no stream and no session.
406
The Accept header does not list both application/json and text/event-stream.
413
The body is over 2 MB.
415
The Content-Type is not application/json.
429
Over 300 requests a minute for one person, with Retry-After in seconds.
500
An unexpected failure, as JSON-RPC error -32603.

The authorization server document answers 502 when the sign-in server’s own copy cannot be fetched. The discovery documents can be read from any origin.

Support

For help with the connector, or anything else, email contact@thinkinnumbers.co.