Skip to main content
Glama
purpleslurple

onenote-mcp-server

README.md
# OneNote MCP Server

A complete, robust Model Context Protocol (MCP) server for Microsoft OneNote integration with Claude Desktop. Access your entire OneNote knowledge base through natural language queries.

## šŸŽÆ What This Does

Transform your OneNote notebooks into an AI-accessible knowledge base:
- **List all your notebooks, sections, and pages**
- **Read page content** for analysis and search
- **Natural language queries** like "Show me my DevOps notes" or "Find pages about project planning"
- **Secure OAuth authentication** with Microsoft Graph API
- **Bulletproof error handling** with detailed debugging

## ✨ Why This Implementation

Unlike other OneNote MCP servers, this one:
- āœ… **Actually works** - tested extensively with real OneNote data
- āœ… **Complete functionality** - all core OneNote operations implemented
- āœ… **Robust authentication** - two-step device flow that handles edge cases
- āœ… **Production ready** - proper error handling and logging
- āœ… **Easy setup** - detailed instructions for non-technical users

## šŸš€ Quick Start

### Prerequisites
- Python 3.10+ 
- [uv package manager](https://docs.astral.sh/uv/getting-started/installation/) (recommended) or pip
- Claude Desktop
- Microsoft Azure account (free)

### 1. Install uv (if you don't have it)
```bash
# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# or with Homebrew
brew install uv
```

### 2. Clone and Setup
```bash
git clone https://github.com/yourusername/onenote-mcp-server.git
cd onenote-mcp-server

# Create virtual environment and install dependencies
uv sync
```

### 3. Azure App Registration
You need to create an Azure app to access OneNote. **Don't worry, it's free and takes 5 minutes:**

1. Go to [Azure Portal](https://portal.azure.com) (sign in with your Microsoft account)
2. Navigate to **Azure Active Directory** → **App registrations** → **New registration**
3. Fill out the form:
   - **Name**: "OneNote MCP Server" (or whatever you like)
   - **Supported account types**: "Accounts in any organizational directory and personal Microsoft accounts"
   - **Redirect URI**: Select "Public client/native" and enter: `https://login.microsoftonline.com/common/oauth2/nativeclient`
4. Click **Register**
5. Copy the **Application (client) ID** - you'll need this!

### 4. Add Permissions
Still in your Azure app:
1. Go to **API permissions** → **Add a permission**
2. Select **Microsoft Graph** → **Delegated permissions**
3. Add these permissions:
   - `Notes.Read` - Read OneNote notebooks
   - `Notes.ReadWrite` - Create/modify OneNote content (optional but recommended)
   - `User.Read` - Read user profile
4. Click **Grant admin consent** (the button at the top)

### 5. Configure Claude Desktop
Edit your Claude Desktop config file:

**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
**Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`

Add this configuration (replace `/ABSOLUTE/PATH/TO/PARENT/FOLDER/weather` with your actual path):

**Basic configuration:**
```json
{
  "mcpServers": {
    "onenote": {
      "command": "uv",
      "args": [
        "--directory", "/FULL/PATH/TO/onenote-mcp-server",
        "run", "python", "onenote_mcp_server.py"
      ],
      "env": {
        "AZURE_CLIENT_ID": "your-azure-client-id-here"
      }
    }
  }
}
```

**With explicit token caching control:**
```json
{
  "mcpServers": {
    "onenote": {
      "command": "uv",
      "args": [
        "--directory", "/FULL/PATH/TO/onenote-mcp-server",
        "run", "python", "onenote_mcp_server.py"
      ],
      "env": {
        "AZURE_CLIENT_ID": "your-azure-client-id-here",
        "ONENOTE_CACHE_TOKENS": "true"
      }
    }
  }
}
```

Replace `/FULL/PATH/TO/onenote-mcp-server` with the actual path to this project.

### 6. Restart Claude Desktop
Completely quit and restart Claude Desktop. You should see OneNote tools in the šŸ”Ø menu.

## šŸ” First Time Authentication

1. In Claude Desktop, say: **"Start OneNote authentication"**
2. Claude will give you a URL and code
3. Visit the URL in your browser, enter the code, and sign in
4. **Browser compatibility**: 
   - āœ… **Firefox** (tested with 139.0.4) - works perfectly
   - āŒ **Safari** - may have issues with Microsoft OAuth redirect
   - āœ… **Chrome/Edge** - should work (Microsoft's browsers)
5. Come back to Claude and say: **"Complete OneNote authentication"**
6. You're ready to go!

### Token Persistence

By default, authentication tokens are cached securely on your local machine so you only need to authenticate once every few weeks/months. 

**To disable token caching** (for security-sensitive environments):
```json
{
  "mcpServers": {
    "onenote": {
      "command": "uv",
      "args": [
        "--directory", "/FULL/PATH/TO/onenote-mcp-server",
        "run", "python", "onenote_mcp_server.py"
      ],
      "env": {
        "AZURE_CLIENT_ID": "YOUR_CLIENT_ID_HERE",
        "ONENOTE_CACHE_TOKENS": "false"
      }
    }
  }
}
```

**Token caching options:**
- `ONENOTE_CACHE_TOKENS=true` (default) - Tokens persist across sessions
- `ONENOTE_CACHE_TOKENS=false` - Authenticate every session (more secure)

## šŸ“– Usage Examples

Once authenticated, try these commands in Claude Desktop:

```
List my OneNote notebooks
Show me sections in my Work notebook  
What pages are in my Ideas section?
Read the content of my "Project Plan" page
```

## šŸ›  Troubleshooting

### "No tools available" in Claude Desktop
- Make sure you restarted Claude Desktop after config changes
- Check that the path in your config is correct (use full absolute path)
- Verify uv is installed: `uv --version`

### Authentication issues
- **Safari OAuth problems**: Safari may not handle Microsoft's OAuth redirect properly - use Firefox or Chrome instead
- **"nativeclient" prompts**: Normal Microsoft OAuth behavior, but if it blocks authentication, try a different browser
- **Authentication expired**: Use "Check OneNote authentication status" to see token expiry
- **Clear cached tokens**: Use "Clear OneNote token cache" if you need to reset authentication
- **Recommended browsers**: Firefox (confirmed working), Chrome, or Edge for best compatibility

### "Command not found" errors
- Make sure uv is in your PATH
- Alternative: replace `"uv"` with `"python"` in the config and use the full path to your Python interpreter

### Permission denied errors
- Check the file permissions in your project directory
- Make sure Claude Desktop can read the files

## šŸ— Development

### Project Structure
```
onenote-mcp-server/
ā”œā”€ā”€ onenote_mcp_server.py      # Main server implementation
ā”œā”€ā”€ pyproject.toml             # Dependencies and metadata  
ā”œā”€ā”€ README.md                  # This file
ā”œā”€ā”€ LICENSE                    # MIT License
└── .gitignore                 # Git ignore rules
```

### Key Features
- **Two-step authentication**: Handles device code flow properly
- **Complete Graph API integration**: All OneNote operations supported
- **Robust error handling**: Detailed logging and graceful failures
- **FastMCP framework**: Clean, maintainable code structure
- **Environment variable configuration**: Secure credential handling

### Adding New Features
The server is built with FastMCP, making it easy to add new tools:

```python
@mcp.tool()
async def your_new_tool(param: str) -> str:
    """Description of what your tool does."""
    # Your implementation here
    return result
```

## šŸ¤ Contributing

Contributions welcome! Please:
1. Fork the repo
2. Create a feature branch
3. Add tests for new functionality  
4. Submit a pull request

## šŸ“„ License

MIT License - see LICENSE file for details.

## šŸ™ Acknowledgments

- Built with [FastMCP](https://github.com/jlowin/fastmcp) framework
- Uses Microsoft Graph API for OneNote access
- Inspired by the amazing potential of AI + personal knowledge bases

## āš ļø Important Notes

- This server only reads/writes data you already have access to
- Your Azure app credentials stay on your machine
- All authentication happens directly between you and Microsoft
- No data is sent to third parties

---

**Built with ā¤ļø for the Claude + OneNote community**

*Turn your OneNote into an AI-accessible knowledge base!*