mirror of
https://github.com/Shubhamsaboo/awesome-llm-apps.git
synced 2026-03-09 07:25:00 -05:00
Merge pull request #207 from Madhuvod/new-mcp-proj
Added new Demo: 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