From 7497849a12c1ce1f5191ed266ef87643aa72c4ad Mon Sep 17 00:00:00 2001 From: Madhu Date: Sun, 18 May 2025 23:13:09 +0530 Subject: [PATCH] Notion MCP Agent with Agno --- mcp_ai_agents/notion_mcp_agent/README.md | 112 ++++++++++++++++ .../notion_mcp_agent/notion_mcp_agent.py | 122 ++++++++++++++++++ .../notion_mcp_agent/requirements.txt | 4 + 3 files changed, 238 insertions(+) create mode 100644 mcp_ai_agents/notion_mcp_agent/README.md create mode 100644 mcp_ai_agents/notion_mcp_agent/notion_mcp_agent.py create mode 100644 mcp_ai_agents/notion_mcp_agent/requirements.txt diff --git a/mcp_ai_agents/notion_mcp_agent/README.md b/mcp_ai_agents/notion_mcp_agent/README.md new file mode 100644 index 0000000..a3af65f --- /dev/null +++ b/mcp_ai_agents/notion_mcp_agent/README.md @@ -0,0 +1,112 @@ +# Notion MCP Agent with Agno + +A terminal-based Notion Agent for interacting with your Notion pages using natural language through the Notion MCP (Model Context Protocol) server. + +## Features + +- Interact with Notion pages via a command-line interface +- Perform update, insert, retrieve operations on your Notion pages +- Create and edit blocks, lists, tables, and other Notion structures +- Add comments to blocks +- Search for specific information +- Remembers conversation context for multi-turn interactions +- Session management for persistent conversations + +## Prerequisites + +- Python 3.9+ +- A Notion account with admin permissions +- A Notion Integration token +- An OpenAI API key + +## Installation + +1. Clone the repository +2. Install the required Python packages: + +```bash +pip install -r requirements.txt +``` + +3. Install the Notion MCP server (will be done automatically when you run the app) + +## Setting Up Notion Integration + +### Creating a Notion Integration + +1. Go to [Notion Integrations](https://www.notion.so/my-integrations) +2. Click "New integration" +3. Name your integration (e.g., "Notion Assistant") +4. Select the capabilities needed (Read & Write content) +5. Submit and copy your "Internal Integration Token" + +### Sharing Your Notion Page with the Integration + +1. Open your Notion page +2. Click the three dots (⋮) in the top-right corner of the page +3. Select "Add connections" from the dropdown menu +4. Search for your integration name in the search box +5. Click on your integration to add it to the page +6. Confirm by clicking "Confirm" in the dialog that appears + +Alternatively, you can also share via the "Share" button: +1. Click "Share" in the top right +2. In the sharing dialog, search for your integration name (preceded by "@") +3. Click on your integration to add it +4. Click "Invite" to grant it access to your page + +Both methods will grant your integration full access to the page and its content. + +### Finding Your Notion Page ID + +1. Open your Notion page in a browser +2. Copy the URL, which looks like: + `https://www.notion.so/workspace/Your-Page-1f5b8a8ba283...` +3. The ID is the part after the last dash and before any query parameters + Example: `1f5b8a8bad058a7e39a6` + +## Configuration + +You can configure the agent using environment variables: + +- `NOTION_API_KEY`: Your Notion Integration token +- `OPENAI_API_KEY`: Your OpenAI API key +- `NOTION_PAGE_ID`: The ID of your Notion page + +Alternatively, you can set these values directly in the script. + +## Usage + +Run the agent from the command line: + +```bash +python notion_mcp_agent.py +``` + +When you start the agent, it will prompt you to enter your Notion page ID. You can: +1. Enter your page ID at the prompt +2. Press Enter without typing anything to use the default page ID (if set) +3. Provide the page ID directly as a command-line argument (bypassing the prompt): + +```bash +python notion_mcp_agent.py your-page-id-here +``` + +### Conversation Flow + +Each time you start the agent, it creates a unique user ID and session ID to maintain conversation context. This allows the agent to remember previous interactions and continue coherent conversations even after you close and restart the application. + +You can exit the conversation at any time by typing `exit`, `quit`, `bye`, or `goodbye`. + +## Example Queries + +- "What's on my Notion page?" +- "Add a new paragraph saying 'Meeting notes for today'" +- "Create a bullet list with three items: Apple, Banana, Orange" +- "Add a comment to the first paragraph saying 'This looks good!'" +- "Search for any mentions of meetings" +- "Summarize our conversation so far" + +## License + +MIT \ No newline at end of file diff --git a/mcp_ai_agents/notion_mcp_agent/notion_mcp_agent.py b/mcp_ai_agents/notion_mcp_agent/notion_mcp_agent.py new file mode 100644 index 0000000..a2ee2c3 --- /dev/null +++ b/mcp_ai_agents/notion_mcp_agent/notion_mcp_agent.py @@ -0,0 +1,122 @@ +import asyncio +import json +import os +import sys +import uuid +from textwrap import dedent +from agno.agent import Agent +from agno.models.openai import OpenAIChat +from agno.tools.mcp import MCPTools +from agno.memory.v2 import Memory +from mcp import StdioServerParameters +from dotenv import load_dotenv + +# Load environment variables +load_dotenv() + +NOTION_TOKEN = os.getenv("NOTION_API_KEY") +OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") + +async def main(): + print("\n========================================") + print(" Notion MCP Terminal Agent") + print("========================================\n") + + # Get configuration from environment or use defaults + notion_token = NOTION_TOKEN + openai_api_key = OPENAI_API_KEY + + # Prompt for page ID first + if len(sys.argv) > 1: + # Use command-line argument if provided + page_id = sys.argv[1] + print(f"Using provided page ID from command line: {page_id}") + else: + # Ask the user for the page ID + print("Please enter your Notion page ID:") + print("(You can find this in your page URL, e.g., https://www.notion.so/workspace/Your-Page-1f5b8a8ba283...)") + print("The ID is the part after the last dash and before any query parameters") + + user_input = input("> ") + + # If user input is empty, use default + if user_input.strip(): + page_id = user_input.strip() + print(f"Using provided page ID: {page_id}") + else: + print(f"Using default page ID: {page_id}") + + # Generate unique user and session IDs for this terminal session + user_id = f"user_{uuid.uuid4().hex[:8]}" + session_id = f"session_{uuid.uuid4().hex[:8]}" + print(f"User ID: {user_id}") + print(f"Session ID: {session_id}") + + print("\nConnecting to Notion MCP server...\n") + + # Configure the MCP Tools + server_params = StdioServerParameters( + command="npx", + args=["-y", "@notionhq/notion-mcp-server"], + env={ + "OPENAPI_MCP_HEADERS": json.dumps( + {"Authorization": f"Bearer {notion_token}", "Notion-Version": "2022-06-28"} + ) + } + ) + + # Start the MCP Tools session + async with MCPTools(server_params=server_params) as mcp_tools: + print("Connected to Notion MCP server successfully!") + + # Create the agent + agent = Agent( + name="NotionDocsAgent", + model=OpenAIChat(id="gpt-4o", api_key=openai_api_key), + tools=[mcp_tools], + description="Agent to query and modify Notion docs via MCP", + instructions=dedent(f""" + You are an expert Notion assistant that helps users interact with their Notion pages. + + IMPORTANT INSTRUCTIONS: + 1. You have direct access to Notion documents through MCP tools - make full use of them. + 2. ALWAYS use the page ID: {page_id} for all operations unless the user explicitly provides another ID. + 3. When asked to update, read, or search pages, ALWAYS use the appropriate MCP tool calls. + 4. Be proactive in suggesting actions users can take with their Notion documents. + 5. When making changes, explain what you did and confirm the changes were made. + 6. If a tool call fails, explain the issue and suggest alternatives. + + Example tasks you can help with: + - Reading page content + - Searching for specific information + - Adding new content or updating existing content + - Creating lists, tables, and other Notion blocks + - Explaining page structure + - Adding comments to specific blocks + + The user's current page ID is: {page_id} + """), + markdown=True, + show_tool_calls=True, + retries=3, + memory=Memory(), # Use Memory v2 for better multi-session support + add_history_to_messages=True, # Include conversation history + num_history_runs=5, # Keep track of the last 5 interactions + ) + + print("\n\nNotion MCP Agent is ready! Start chatting with your Notion pages.\n") + print("Type 'exit' or 'quit' to end the conversation.\n") + + # Start interactive CLI session with memory and proper session management + await agent.acli_app( + user_id=user_id, + session_id=session_id, + user="You", + emoji="🤖", + stream=True, + markdown=True, + exit_on=["exit", "quit", "bye", "goodbye"] + ) + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git a/mcp_ai_agents/notion_mcp_agent/requirements.txt b/mcp_ai_agents/notion_mcp_agent/requirements.txt new file mode 100644 index 0000000..791b9d8 --- /dev/null +++ b/mcp_ai_agents/notion_mcp_agent/requirements.txt @@ -0,0 +1,4 @@ +agno +python-dotenv +mcp +openai