mirror of
https://github.com/Shubhamsaboo/awesome-llm-apps.git
synced 2026-04-30 15:20:47 -05:00
Notion MCP Agent with Agno
This commit is contained in:
112
mcp_ai_agents/notion_mcp_agent/README.md
Normal file
112
mcp_ai_agents/notion_mcp_agent/README.md
Normal file
@@ -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
|
||||||
122
mcp_ai_agents/notion_mcp_agent/notion_mcp_agent.py
Normal file
122
mcp_ai_agents/notion_mcp_agent/notion_mcp_agent.py
Normal file
@@ -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())
|
||||||
4
mcp_ai_agents/notion_mcp_agent/requirements.txt
Normal file
4
mcp_ai_agents/notion_mcp_agent/requirements.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
agno
|
||||||
|
python-dotenv
|
||||||
|
mcp
|
||||||
|
openai
|
||||||
Reference in New Issue
Block a user