{"id":13830534,"url":"https://github.com/saiedmethal/MMM-AssistantMk2","last_synced_at":"2025-07-09T11:33:29.505Z","repository":{"id":97719481,"uuid":"153455002","full_name":"saiedmethal/MMM-AssistantMk2","owner":"saiedmethal","description":"MagicMirror module - New Google Assistant embeding with screen output","archived":false,"fork":false,"pushed_at":"2018-10-16T14:52:28.000Z","size":159,"stargazers_count":7,"open_issues_count":0,"forks_count":51,"subscribers_count":0,"default_branch":"master","last_synced_at":"2024-08-04T10:03:20.393Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/saiedmethal.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-10-17T12:42:02.000Z","updated_at":"2024-05-14T07:26:08.000Z","dependencies_parsed_at":"2023-07-10T16:32:26.388Z","dependency_job_id":null,"html_url":"https://github.com/saiedmethal/MMM-AssistantMk2","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saiedmethal%2FMMM-AssistantMk2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saiedmethal%2FMMM-AssistantMk2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saiedmethal%2FMMM-AssistantMk2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/saiedmethal%2FMMM-AssistantMk2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/saiedmethal","download_url":"https://codeload.github.com/saiedmethal/MMM-AssistantMk2/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225539432,"owners_count":17485327,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-04T10:01:01.644Z","updated_at":"2024-11-20T11:30:55.868Z","avatar_url":"https://github.com/saiedmethal.png","language":"JavaScript","funding_links":[],"categories":["Assistants"],"sub_categories":[],"readme":"## MMM-AssistantMk2\n`MMM-AssistantMk2` is an embedded google assistant on MagicMirror. This is more improved than my last [MMM-Assistant](https://github.com/eouia/MMM-Assistant).\n\n### What is different?\nI made `MMM-Assistant` last year, But it was notorious with it's difficulty of installation and configuration. And it was based on the old APIs and dependencies. I was so disappointed with it's limitation, so I have half forgotten this module. Sorry about that to everyone.\nNow, the environments are improved. Google has also released new tools and 'Assistant for device'. It means, there is no need of 'Commander' any more. Custom commands(actions) could be integrated in Assistant itself.\n\nSo, I'd made this module newly.\n\n#### Improvements\n- pure javascript, no other python program or daemon needed.\n- Hotword([MMM-Hotword](https://github.com/eouia/MMM-Hotword)) and Assistant([MMM-AssistantMk2]()) are separated. Now you can wake up your Assistant with other modules. (e.g; H/W buttons or other module notifications or anything)\n- Command mode is deprecated. Now Google Assistant itself has ability to react with custom action. And possible to use IFTTT or transcriptionHooking.)\n  - See [MMM-NotificationTrigger](https://github.com/eouia/MMM-NotificationTrigger) for transcriptionHooking or using IFTTT.\n  - See [MMM-GAction](https://github.com/eouia/MMM-GAction) for custom google action.\n- Visual response!!! (like Google Home with screen or Google Assistant on your phone, but some functions are limited or missed.)\n- Multi user supported.\n- Auto find Youtube clip and playing.\n\n### Screenshot\n[[PlaceHolder]]\n\n### Updates\n#### [1.1.0] - 2018.10.04\n- MP3 Output is supported. Now you can get more unchunky sound result.(Set `audio.encodingOut` to `MP3` // `OGG` is not yet supported.)\n- `ding.wav` will be played when Assistant is ready to hear your voice.\n- For update from prior version\n```\nsudo apt-get install mpg321\ncd ~/MagicMirror/modules/MMM-AssistantMk2\ngit pull\nnpm install --save wav\n```\n\n\n#### [1.0.1] - 2018.07.25.\n- Youtube playlist can be playable\n- Some uncaught youtube videos are caught now\n- On youtube player error, error code is shown\n- notifyPlaying option is added.\n\n### Installation\n1. Install pre-dependencies\n```sh\nsudo apt-get install libasound2-dev sox libsox-fmt-all mpg321\n```\n- `mpg321` is mp3 player when you select `MP3` as sound output, so you can change to others or unuse.\n\n1. Install Module\n```sh\ngit clone https://github.com/eouia/MMM-AssistantMk2.git\ncd MMM-AssistantMk2\nnpm install\n```\nThere could be some warnings, but it gives no harm for using.\n\nIf your mirror is running as `SERVERONLY` mode, no other installation step is needed. But if you want to run your mirror as `KIOSK` mode, you should rebuild binaries to match with electron. You will meet this or something similar erros.\n```\nNODE_MODULE_VERSION 59. This version of Node.js requires\nNODE_MODULE_VERSION 57. Please try re-compiling or re-installing\n```\nAnd as you know, there could be many problems or not. Wish you good luck.\n(I recommend to execute this after making profiles.)\n\n```sh\ncd ~/MagicMirror/modules/MMM-AssistantMk2\nnpm install --save-dev electron-rebuild\n./node_modules/.bin/electron-rebuild   # It could takes 10~30 minutes.\n```\n\nWhen you meet this kinds of errors;\n```\ngyp ERR! stack Error: make failed with exit code: 2\n```\nSee this page;\nhttps://github.com/nodejs/node-gyp/issues/809\n\n### Get Auth and credentials to make profile.\n1. Create or open a project in the [Actions Console](https://console.actions.google.com/)\n2. After creation, Enable `Google Assistant API` for your project in the [Cloud Platform Console](https://console.cloud.google.com/)\n3. Return to Actions Console and Follow the instructions to [register a device model](https://developers.google.com/assistant/sdk/guides/service/python/embed/register-device)\u003cbr\u003e\n(If you cannot find `Device registration` menu, you can use this URL https://console.actions.google.com/u/[0]/project/[yourprojectId]/deviceregistration/) (change [] to your project) or [Manual registration](https://developers.google.com/assistant/sdk/reference/device-registration/register-device-manual))\n\n4. In register steps(step 2), you can download your `credentials.json` for OAuth. Carefully store it in `MMM-AssistantMk2` directory.\n - Or you can find your credentials from [Cloud Platform Console](https://console.cloud.google.com/) (Your Project \u003e APIs \u0026 Services \u003e Credentials)\n5. In your SBC, you can run auth-tool for authentification. (not via SSH)\n```sh\ncd ~/MagicMirror/modules/MMM-AssistantMk2\nnode auth_and_test.js\n```\n   a. If you meet some errors related with node version, execute `npm rebuild` and try again.\n\n   b. At first execution, this script will try opening a browser and getting permission of a specific user for using this Assistant. (So you'd better to execute this script in your RPI shell, not via SSH)\n\n   c. After confirmation, Some code (`4/ABCD1234XXXXX....`) will appear in the browser. Copy that code and paste in your console's request (`Paste your code:`)\n\n   d. On success, Prompt `Type your request` will be displayed. Type anything for testing assistant. (e.g; `Hello`, `How is the weather today?`)\n\n   e. Now you can find `token.json` in your `MMM-AssistantMk2` directory. Move it under `profiles` directory with rename `default.json`. This will be used in module as `default` profile.\n\n ```sh\n mv token.json ./profiles/default.json\n ```\n  f. If you want to make more profiles(for your family??), do the step 5 again. and move the `token.json` generated to profiles directory with another profile name, and don't forget setting your configuration.\n```sh\nmv token.json ./profiles/mom.json\n```\n\n### Get `deviceModelId` and `deviceInstanceId`\n\u003e If you are not an expereienced developer or don't need `gactions` implements, pass this section.\n\nIf you want not only pure Assistant embeding but also customized gactions for device, you should get `deviceModelId` and `deviceInstanceId`. To help understanding, 'deviceModel' is something like `Volkswagen Golf` or `MagicMirror` and 'deviceInstance' is something like `mom's car` or `mirror in living room`.\n\n#### For `deviceModelId`\nYou can get `deviceModelId` as a result of previous [register a device model](https://developers.google.com/assistant/sdk/guides/service/python/embed/register-device) step. In `Device registration` menu in `Actions Console`, you can find it.\n\n#### For `deviceInstanceId`\nYou need additional `google-assistant-sdk` library. See [\nManually Register a Device with the REST API](https://developers.google.com/assistant/sdk/reference/device-registration/register-device-manual#get-access-token) page.\n\n### Configuration (DON'T PANIC!!)\nBelow values are pre-set as default values. It means, you can put even nothing in config field. (Most of belows are not needed for you.)\n```javascript\n  config: {\n\t\tdeviceModelId: \"\", // (OPTIONAL for gaction)It should be described in your config.json\n\t\tdeviceInstanceId: \"\", // (OPTIONAL for gaction)It should be described in your config.json\n\t\tdeviceLocation: { // (OPTIONAL)\n\t\t\tcoordinates: { // set the latitude and longitude of the device (rf. mygeoposition.com)\n\t\t\t\tlatitude: 51.5033640, // -90.0 - +90.0\n\t\t\t\tlongitude: -0.1276250, // -180.0 - +180.0\n\t\t\t},\n\t\t},\n\t\tuseScreen: true,  // set this to true if you want to output results to a screen\n\t\t//showed contents will be hidden when new conversation starts or ASSISTANT_STOP_CONTENT is comming.\n\n    \t\tscreenZoom: \"80%\",\n\t\ttranscriptionHook: { //if you set hooking phrase here, this module will catch these words in your speech and emit ASSISTANT_HOOK notification.\n\t\t\t/*\n\t\t\t\"SCREEN_OFF\" : \"screen off\",\n\t\t\t\"SCREEN_ON\" : \"screen on\",\n\t\t\t\"REBOOT\" : \"reboot\",\n\t\t\t\"SHUTDOWN\" : \"shut down\",\n\t\t\t\"TEST\" : \"test\"\n\t\t\t*/\n\t\t},\n\t\tyoutube: {\n\t\t\tuse:true, //if you want to autoplay of youtube clip in responses of Assistance.\n\t\t\theight: \"480\", //This is not real player size. It's for ideal player size for loading video. (related to video quality somehow.)\n\t\t\twidth: \"854\",\n      notifyPlaying: false, // tell other modules whether youtube is playing or not.\n\t\t},\n\t\tauth: {\n\t\t\tkeyFilePath: \"./credentials.json\"\n\t\t},\n\t\taudio: {\n\t\t\tencodingIn: \"LINEAR16\", // supported are LINEAR16 / FLAC (defaults to LINEAR16)\n\t\t\tsampleRateIn: 16000, // supported rates are between 16000-24000 (defaults to 16000)\n\t\t\tencodingOut: \"LINEAR16\", // supported are LINEAR16 / MP3 / (defaults to LINEAR16) When you select MP3, you need mp3Player option. \n\t\t\tsampleRateOut: 24000, // supported are 16000 / 24000 (defaults to 24000)\n\t\t\tmp3Player: \"mpg321\" // If needed, use with options.\n\t\t},\n\t\tdefaultProfile: \"default\", // This default profile should be in `profiles` field.\n\t\tprofiles: {\n\t\t\t\"default\" : {\n\t\t\t\tprofileFile: \"default.json\", //this path will be `~/MagicMirror/modules/MMM-AssistantMk2/profiles/default.json\"\n\t\t\t\tlang: \"en-US\"\n\t\t\t\t//currently available (estimation, not all tested):\n\t\t\t\t//  de-DE, en-AU, en-CA, en-GB, en-US, en-IN\n\t\t\t\t// fr-CA, fr-FR, it-IT, ja-JP, es-ES, es-MX, ko-KR, pt-BR\n\t\t\t\t// https://developers.google.com/assistant/sdk/reference/rpc/languages\n\t\t\t},\n\t\t\t/* You can use multi-profile for your family.\n\t\t\t\"kids\" : {\n\t\t\t\tprofileFile: \"jarvis.json\",\n\t\t\t\tlang: \"de-DE\"\n\t\t\t},\n\t\t\t\"myself_korean\" : {\n\t\t\t\tprofileFile: \"default.json\",\n\t\t\t\tlang: \"ko-KR\"\n\t\t\t}\n\t\t\t*/\n\t\t},\n\t\trecord: {\n\t\t\tsampleRate    : 16000,      // audio sample rate\n\t\t\tthreshold     : 0.5,        // silence threshold (rec only)\n\t\t\tthresholdStart: null,       // silence threshold to start recording, overrides threshold (rec only)\n\t\t\tthresholdEnd  : null,       // silence threshold to end recording, overrides threshold (rec only)\n\t\t\tsilence       : 1.0,        // seconds of silence before ending\n\t\t\tverbose       : false,      // log info to the console\n\t\t\trecordProgram : \"arecord\",  // Defaults to \"arecord\" - also supports \"rec\" and \"sox\"\n\t\t\tdevice        : null        // recording device (e.g.: \"plughw:1\")\n\t\t},\n\t},\n\n```\n\n\nIf you want to use default configuration, just use like this.\n```javascript\n{\n  module: \"MMM-AssistantMk2\",\n  position: \"top_left\",\n  config: {}\n},\n```\n\nIn case of multi-users, use like this.\n```javascript\n{\n  module: \"MMM-AssistantMk2\",\n  position: \"top_left\",\n  config: {\n    defaultProfile: \"dad\"\n    profiles: {\n      \"dad\": {\n        profileFile: \"dad.json\"\n        lang: \"de-DE\"\n      },\n      \"mom\": {\n        profileFile: \"mom.json\"\n        lang: \"en-US\"\n      },\n      \"tommy\": {\n        profileFile: \"tommy.json\"\n        lang: \"en-US\"\n      }\n    },\n  }\n},\n```\nIn case of using custom action(traits), you should describe `deviceModelId` (additionally `deviceInstanceId`) in configuration file also.\n\n\n### Notification\n#### Incoming Notifications as ASSISTANT request.\n|Notification|Payload|Description|\n|---|---|---|\n|ASSISTANT_ACTIVATE|{profile:`String`}|Assistant will start with this profile name.\n|ASSISTANT_CLEAR|null|Current playing video or content will be disappeared. And Assistant turns to sleep mode for waiting invocation.\n\n#### Outgoing Notifications as ASSISTANT response.\n|Notification|Payload|Description|\n|---|---|---|\n|ASSISTANT_ACTIVATED|null|Assistant is started now.\n|ASSISTANT_DEACTIVATED|null|Assistant is stopped now.\n|ASSISTANT_HOOK|{hook:\"`HOOKED_STRING`\"}|Your defined hooking phrase is caught in your speech.\n|ASSISTANT_ACTION|`FOUND_ACTION_OBJECT`|When the response is defined or customized action of Assistant.\n\n\n### Recommended Usage\nIt's good to use this module with [`MMM-Hotword`](https://github.com/eouia/MMM-Hotword) (for waking Assistant and give a profile) and [`MMM-NotificationTrigger`](https://github.com/eouia/MMM-NotificationTrigger) (for relaying from MMM-Hotword to MMM-AssistantMk2 and also for relaying from MMM-AssistantMk2 to other module.)\nHere is configuration sample.\n```javascript\n//MMM-NotificationTrigger\n{\n      module: \"MMM-NotificationTrigger\",\n      config: {\n        useWebhook:true,\n        triggers:[\n          { //If there is ASSISTANT_ACTION, you can control other module here. In this sample, ALERT module will show message.\n            trigger: \"ASSISTANT_ACTION\",\n            triggerSenderFilter: function(sender) {\n              if (sender.name == \"MMM-AssistantMk2\") {\n                return true;\n              } else {\n                return false;\n              }\n            },\n            triggerPayloadFilter: function(payload) {\n              return true;\n            },\n            fires: [\n              {\n                fire:\"SHOW_ALERT\",\n                payload: function(payload) {\n                  return {\n                    type: \"notification\",\n                    title: payload[0].execution[0].type,\n                    message: payload[0].execution[0].command\n                  };\n                },\n              },\n            ],\n          },\n          { //If you use IFTTT for your voice command, this sample will help you.\n            trigger: \"IFTTT_COMMAND\",\n            fires: [\n              {\n                fire:\"SHOW_ALERT\",\n                payload: function(payload) {\n                  return payload\n                },\n              },\n            ],\n          },\n          { //If you use transcriptionHook for your voice command, this sample will help you.\n            trigger: \"ASSISTANT_HOOK\",\n            fires: [\n              {\n                fire:\"SHOW_ALERT\",\n                payload: function(payload) {\n                  return {\n                    title: \"HOOK\",\n                    message: \"Are you saying \" + payload.hook +\"?\",\n                    timer: 5000\n                  }\n                },\n              },\n            ],\n          },\n          { //This make your Assistant to activate with MMM-Hotword\n            trigger: \"HOTWORD_DETECTED\",\n            fires: [\n\t      {\n                fire:\"HOTWORD_PAUSE\",\n              },\n              {\n                fire:\"ASSISTANT_ACTIVATE\",\n\t\tdelay: 200,\n                payload: function(payload) {\n                  return {\n                    \"profile\": payload.hotword\n                  }\n                }\n              },\n            ]\n          },\n          { //This make your MMM-Hotword to listen your invocation.\n            trigger: \"ASSISTANT_DEACTIVATED\",\n            fires: [\n              {\n                fire:\"HOTWORD_RESUME\"\n              }\n            ]\n          },\n        ]\n      }\n    }\n},\n//MMM-Hotword\n{ //Using MMM-Hotword for Assistant wakeup.\n      module: \"MMM-Hotword\",\n      config: {} //using default configuration.\n},\n///MMM-GAction\n{ //Using custom action for Assistant command\n      module: \"MMM-GAction\",\n      config: {}\n},\n//MMM-Assistant\n{\n      module: \"MMM-AssistantMk2\",\n      position: \"top_center\",\n      config: {\n        useScreen: true,\n        deviceModelId: \"MY_MAGIC_MIRROR_MODEL_ID\",\n        deviceInstanceId: \"MY_MAGIC_MIRROR_IN_LIVINGROOM\",\n        deviceLocation: { // (optional)\n          coordinates: { // set the latitude and longitude of the device (rf. mygeoposition.com)\n            latitude: 50.0851200, // -90.0 - +90.0\n            longitude: 8.4763300, // -180.0 - +180.0\n          },\n        },\n        transcriptionHook: {\n          \"UNICORN\": \"unicorn\" // this is just sample.\n        },\n        profiles: {\n          \"default\" : {\n\t    profileFile: \"default.json\",\n            lang: \"en-US\"\n          },\n        }\n      }\n},\n```\n\nAnd for who doesn't want any commands (using just pure Assistant for test). You can start from this.\n```javascript\n{\n      module: \"MMM-NotificationTrigger\",\n      config: {\n        triggers:[\n          {\n            trigger: \"HOTWORD_DETECTED\",\n            fires: [\n              {\n                fire:\"HOTWORD_PAUSE\",\n\n              },\n              {\n                fire:\"ASSISTANT_ACTIVATE\",\n\t\tdelay: 200,\n                payload: function(payload) {\n                  return {\n                    \"profile\": payload.hotword\n                  }\n                }\n              },\n            ]\n          },\n          {\n            trigger: \"ASSISTANT_DEACTIVATED\",\n            fires: [\n              {\n                fire:\"HOTWORD_RESUME\"\n              }\n            ]\n          },\n        ]\n      }\n},\n{\n      module: \"MMM-Hotword\",\n      config: {}\n},\n{\n      module: \"MMM-AssistantMk2\",\n      position: \"top_center\",\n      config: {}\n},\n```\n\n### If you have touchscreen and don't want to use snowboy to wakeup\nJust click the Mic icon to activate.\n(I'll provide more touchscreen-friendly functions in some days.)\n\n\n### use `youtube.notifyPlaying`\nIf you want your player would not be interrupted by it's sound itself awakening hotword,\nset `youtube.notifyPlaying` to `true`. and add this code to `notificationTrigger` section of `config.js`\n```js\n... other triggers ...\n{\n  trigger: \"ASSISTANT_VIDEO_PLAYING\",\n  fires:[\n    {fire: \"HOTWORD_PAUSE\"}\n  ]\n},\n{\n  trigger: \"ASSISTANT_VIDEO_STOP\",\n  fires:[\n    {fire: \"HOTWORD_RESUME\"}\n  ]\n},\n... other triggers ...\n```\nBut with this setting, you cannot stop the video paying because it will not be interrupted by even your voice also.\nIf you want to stop the Video, you should emit `ASSISTANT_CLEAR`.\n\n### Tested\n- MagicMirror : 2.4.1\n- nodeJS : 8.11.3 \u0026 10.0.x\n- SBC : Asus TinkerBoard \u0026 Raspberry Pi 3 / Kiosk mode and Serveronly mode both work.\n- on Pi Zero (or ARMv6 Architecture), You might need to rebuild modules from source. That is out of my ability, so I cannot help about that.\n\n\n### Known Issues\n- Invalid Parameters when youtube playing : Most of those cases, owner of video doesn't allow playing video out of youtube. try another.\n- Sometimes response without voice. : Yes, Google Tech team also knows that.\n- Some functions are not supported : Originally, screen output is made for REAL SMART TV (e.g. LG TV) with Google Assistant, thus REAL TV can interact the screen output with remotecontroller or something automatic processed. but we aren't.\n- Result of Image search? web search? : I'm considering how it could be used. it is not easy as my expectation.\n#### Some Troubleshootings\n- Error: /urs/lib/arm-linux-gnueabihf/libstdc++.so.6: version 'GLIBCXX_3.4.21' not found\n```\nsudo apt-get update\nsudo apt-get upgrade\nsudo apt-get install build-essentials\nsudo apt-get install gcc-5\n```\n- grpc Electron-rebuild issues. (until proper binaries provided)\n`grpc` was updated recently, but their team havn't dispatched proper binaries for new version. So it could make problem when you try electron-rebuild.\nHere are some experimental trials;\n1) use `grpc-js` instead `grpc`\n```\ncd ~/MagicMirror/modules\nrm -rf MMM-AssistantMk2/\ngit clone https://github.com/eouia/MMM-AssistantMk2\ncd MMM-AssistantMk2\nnpm install\ncd node_modules\nrm -rf grpc\ncd ..\nnpm install @grpc/grpc-js\nnpm install --save-dev electron-rebuild\n./node_modules/.bin/electron-rebuild\n```\n2) downgrade grpc to v1.13\n```\ncd ~/MagicMirror/modules\nrm -rf MMM-AssistantMk2/\ngit clone https://github.com/eouia/MMM-AssistantMk2\ncd MMM-AssistantMk2\nnpm install\ncd node_modules\nrm -rf grpc\ncd ..\nnpm install grpc@1.13\nnpm install --save-dev electron-rebuild\n./node_modules/.bin/electron-rebuild\n```\n\n\n### TODO\n- debugging??\n- Touchscreen friendly\n- If response has additional info with external web page, showing full website. (But... how to control? eg. scrolling???)\n- map or carousel displaying... (screenOut for Assistant was developed for TV device, so not perfectly matched with UX on Mirror.)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaiedmethal%2FMMM-AssistantMk2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsaiedmethal%2FMMM-AssistantMk2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsaiedmethal%2FMMM-AssistantMk2/lists"}