This is an AI assistant that runs using MCP.
uv:- install 
uvcheck here  - run 
uv sync 
- install 
 - legacy
- create a python venv and 
pip install -r requirements.txt. 
 - create a python venv and 
 
This application uses 
Set the following enviroment variables in an .env file in the project root:
ANTHROPIC_API_KEY=
ARCADE_API_KEY=
OPENAI_API_KEY=
You only need ONE LLM key. This repo only supports OpenAI and Anthropic models currently.
By default the agent will kick off an OAuth flow with Arcade for any tools that its not authorized to use. This will cause the exectuion to pause until that flow completes. If you want to skip any unauthorized tools without kicking off OAuth so that it doesn't block, set SKIP_CLI_AUTH=true.
This project uses Langfuse for observability and tracing. Its not mandatory but its helpful to see the dozens of LLM calls that occur nicely formatted in a UI. To utilize it, set these environment variables in the .env:
LANGFUSE_SECRET_KEY=
LANGFUSE_PUBLIC_KEY=
LANGFUSE_HOST="https://cloud.langfuse.com"
The MCP Assistant application is heavily customizable. You can do anything email triaging to lead qualification.
The default workflow generates a daily briefing over various tools like email, calendar, whatsapp and Notion that tells you your schedule for the day, gives you background research from the internet about who you're meeting with and tells you what is urgent.
- Create a Notion page called 
Daily Briefings. Ideally this should be at the root of your Notion workspace. - Update the 
user_contextinmaininmain.pywith a description of who you are, how you like to work (like what communication tools you prefer) and any extra information that will make the model's output better. Update thebase_system_promptwith any special instructions you want it to take into account. - The instructions for the LLM on how to generate the daily briefing are in the  
INPUT_ACTIONvariable inmain.pyin themainmethod. Change the step-by-step instructions based on how you want you daily briefing created.
For example, if you want the briefing to also check a specific Notion page that has your tasks, the model can also do this - (Optional) You can alter the 
DEFAULT_TOOLSarray at the top ofplan_exec_agent .pyto have only these values["Gmail", "Google Calendar", "Whatsapp", "Exa", "Notion"]so you don't have to set up every MCP server - run 
python main.pyto create a daily briefing one time. 
Create a file called user_inputs.py in root directory then add the following constant variables that will control how the assistant runs:
INPUT_ACTION- your request for the MCP assistantUSER_CONTEXT- background information on who you are, what your preferences are, how you like to work, etc. Helps the model produce better outputBASE_SYSTEM_PROMPT- any special instructions the model may need to take into account beyond your user preferences. defaults to 'you are a helpful assistant'ENABLED_CLIENTS- an array of strings containing the names of the MCP servers you want the system to have access to. Make sure they are the same names as those used in themcp_clients/implementations. This will allow you to omit, for example, outlook, and still have the system run without issue
Then run python main.py to see the result
This project supports publishing the state during the agent's main execution loop using Redis.
To run Redis locally, use:
docker run -d --name redis-local -p 6379:6379 redis:latest
Please add the following environment variables to your .env file
REDIS_URL=redis://localhost:6379
REDIS_STREAM_NAME=plan_execution
PUBLISH_TO_REDIS=true
If you need to debug redis, use the following REDIS CLI commands:
First run this to start a terminal in the container docker exec -it redis-local redis-cli
Then
KEYS * # check streams
XLEN plan_execution # check this specific stream
XREVRANGE plan_execution + - COUNT 1  # check the last message
docker exec redis-local redis-cli XTRIM plan_execution MAXLEN 0 # DELETE all messages on the stream - only use for cleanup during testing
- More connectors
 - Script to run the briefing automatically at the same time every day as a background process
 - Fix asyncio log pollution
 - Make sure the agent can iterate over every item for a given task (i.e. all 50 emails in an inbox, rather than only the first 10)
 - Save the execution graph after a successful run and load it next time instead of regenerating it
 - Context window reduction mechanism / token limiting to save money
 - Configurability for different models at different steps - planning vs. executing, cheap vs. expensive
 - Support more models
 
You must install MCP servers in order to use this application. You do not need to install them all, the code will run without them all installed but their tools will not be accessible. The instructions for all of them are below:
- create a python venv then 
pip install -r requirements.txt - You need to 
git clonethe following repos and runnpm installin all the project roots - Follow the instructions at https://github.com/nspady/google-calendar-mcp to set up OAuth for google
- enable Gmail and Google Calendar APIs on Google Cloud
 - create an OAuth app for desktop
 - download the JSON credentials and change the name to 
gcp-oauth.keys.json, then copy it to the root of both the gmail and gcal projects from above - run 
npm run authfrom the root ofgoogle-calendar-mcpto set up OAuth access 
 - For the Gmail MCP Server follow the instructions in the README under "2. Run Authentication"
TLDR: Place thegcp-oauth.keys.jsonfile into the root of Gmail MCP Server project OR runmkdir -p ~/.gmail-mcp && mv gcp-oauth.keys.json ~/.gmail-mcp/. Runnpm run authfrom the root of Gmail-MCP-Server to enable OAuth - Follow the instructions at https://github.com/makenotion/notion-mcp-server to set up Notion access
 - Get an 
Exa API key here.  - WhatsApp support - Follow the instructions at https://github.com/lharries/whatsapp-mcp to clone and install. This will require you to authenticate to Whatsapp at least once via QR code in the terminal
- This requires a specific version of 
golang. If you have already installed go (i.e. with homebrew) and don't want to override it for fear of breaking some system dependcies, downloadgvmthen use it to download the required version. You may need to configure your$PATHto account for different go versions via gvm - This repo only has instructions to run via Claude Desktop but you can use the 
uvpackage manager to create a.venvinside thewhatsapp-mcp-serverdirectory and install the dependencies. These are different than the dependencies for this project. Thehostin this project will automatically activate the venv for you when you run this project - You will need to regularly run the 
main.goscript to sync the latest messages into the sqlite DB. 
 - This requires a specific version of 
 - Outlook - you need to follow the instructions in the README to set up the Azure app with the correct scopes. This is our fork of an open source MCP server, which we altered to prevent having the same tool names as the gmail MCP server and to make sure that the Azure token is refreshed automatically
Once that is done, do the following
- run 
npm startin a terminal - open another terminal and run 
npm run auth-server - visit 
http://localhost:3333/auth to authenticate. This will create a .outlook-mcp-tokens.jsonfile in your$HOMEdirectory. Do NOT go tohttp://localhost:3333/auth/callback, it will error Note you may have to reauthenticate  
 - run 
 - Get the Slack User Token, follow the instructions at https://github.com/AIAtrium/slack-mcp-server to configure the scope correctly. Then you must manually add the bot to each public, private and DM channel you want it to have access to using 
/invite @your-bot-name - (Optional) You may want to comment out code in the above repos that expose tools such as ones that enable delete of emails or notion pages. You may also want to grant less privileges (scopes) in Google Cloud and Azure
 - Set the following enviroment variables in an 
.envfile in the project root: 
ANTHROPIC_API_KEY=
GCAL_MCP_SERVER_PATH=/path/to/google-calendar-mcp/build/index.js
GMAIL_MCP_SERVER_PATH=/path/to/Gmail-MCP-Server/dist/index.js
OPENAPI_MCP_HEADERS={"Authorization": "Bearer ntn_YOUR_TOKEN_HERE", "Notion-Version": "2022-06-28"}
NOTION_MCP_SERVER_PATH=/path/to/notion-mcp-server/bin/cli.mjs
WHATSAPP_MCP_SERVER_PATH=/path/to/whatsapp-mcp/whatsapp-mcp-server/main.py
WHATSAPP_MCP_SERVER_VENV_PATH=/path/to/whatsapp-mcp/whatsapp-mcp-server/.venv
EXA_API_KEY=
EXA_MCP_SERVER_PATH=/path/to/exa-mcp-server/build/index.js
OUTLOOK_MCP_SERVER_PATH=/path/to/outlook-mcp/index.js
MS_CLIENT_ID=
MS_CLIENT_SECRET=
SLACK_MCP_SERVER_PATH=/path/to/slack-mcp-server/dist/index.js
SLACK_USER_TOKEN=
Note the unusual setup for the Notion Token under OPENAPI_MCP_HEADERS