Version: 0.2.0-prototype
Status: Proof of concept
Date: March 28, 2026
Iris HTTP Mode enables browser-based claude.ai to access Google Drive using the same session cookie authentication pattern as headroom.
Two modes of operation:
- Stdio Mode (v0.1.0) - For Claude Desktop ✅ Production
- HTTP Mode (v0.2.0) - For browser claude.ai 🧪 Prototype
Browser claude.ai
↓
[Bookmarklet/Extension]
↓ HTTP
Iris HTTP Server (localhost:3001)
↓
Google Drive API
Session Cookie Flow:
- User logs into claude.ai in browser
- User extracts session cookie via DevTools
- User runs
iris-setup-browserto store cookie locally - Iris HTTP Server validates cookie on each request
- If valid, executes Drive operation and returns result
cd ~/Devel/UncleTallest/organizations/continuity-bridge/iris-mcp-server
npm install cors @types/cors# Run the setup wizard
npm run setup:browserYou'll need:
-
Organization ID - From DevTools Network tab:
- Open claude.ai
- Press F12 → Network tab
- Look for
/api/organizations/[THIS-IS-YOUR-ORG-ID]/... - Copy the UUID
-
Session Cookie - From DevTools Network tab:
- Click any
/api/request - Headers tab → Request Headers
- Find
cookie:header - Copy the ENTIRE value (very long string)
- Click any
-
Your Email - The Gmail address for Drive access
Saves to: ~/.claude/config/iris-browser-session.json
# Build
npm run build:http
# Start server
npm run httpServer runs at: http://localhost:3001
# Health check
curl http://localhost:3001/health
# List Drive files (requires session cookie)
curl -H "Cookie: sessionKey=sk-ant-sid..." \\
http://localhost:3001/api/drive/list?path=FeannogCreate or update a file.
Request:
{
"path": "test-folder/hello.txt",
"content": "Hello from browser!",
"mimeType": "text/plain",
"mode": "upsert"
}Response:
{
"created": true,
"path": "test-folder/hello.txt",
"fileId": "1abc...",
"webViewLink": "https://drive.google.com/file/d/..."
}Read a file's contents.
Request:
GET /api/drive/read?path=test-folder/hello.txt&asText=true
Response:
{
"path": "test-folder/hello.txt",
"content": "Hello from browser!",
"mimeType": "text/plain"
}List files and folders.
Request:
GET /api/drive/list?path=Feannog&recursive=false&type=both
Response:
{
"path": "Feannog",
"files": [...],
"folders": [...]
}Create a new folder.
Request:
{
"path": "new-folder/sub-folder"
}Move or rename a file/folder.
Request:
{
"sourcePath": "old-name.txt",
"destinationPath": "new-name.txt"
}Delete a file or folder.
Request:
{
"path": "file-to-delete.txt",
"confirm": true,
"permanent": false
}javascript:(function(){
const path = prompt('Google Drive path:');
const content = document.querySelector('.selected-text')?.textContent || '';
fetch('http://localhost:3001/api/drive/write', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Cookie': document.cookie
},
body: JSON.stringify({
path: path,
content: content,
mimeType: 'text/plain'
})
})
.then(r => r.json())
.then(d => alert('Saved: ' + d.webViewLink))
.catch(e => alert('Error: ' + e));
})();To use:
- Create new bookmark in browser
- Name it "Save to Drive"
- Paste above code as URL
- When on claude.ai, click bookmark
- Enter Drive path
- Selected text saves to Drive
Coming in v0.3.0 - Full Chrome/Firefox extension with:
- "Save to Drive" button in chat interface
- Auto-detection of code blocks
- Folder picker UI
- Session cookie auto-extraction
Problem: Markdown files created via Drive API contain invisible link metadata that prevents proper rendering until manually edited.
Symptoms:
.mdfiles appear in Drive- Content is correct
- But links/formatting don't work properly
- Must open each file individually in Drive
- Delete original linkage manually
Workaround:
- Open
.mdfile in Google Drive - Click "Open with" → Google Docs
- Delete any phantom links
- Save
- Now file renders correctly
Potential Solution:
- Tam shared app scripts that might automate this
- Located in: [path to Tam's scripts]
- Needs investigation and adaptation
Root Cause: Google Drive's handling of markdown MIME type includes metadata that conflicts with plain text content.
Stored at: ~/.claude/config/iris-browser-session.json
Permissions: 0600 (read/write owner only)
Contains:
{
"organization_id": "f336d0bc-...",
"cookie_string": "sessionKey=sk-ant-sid...; ...",
"user_email": "[email protected]",
"saved_at": "2026-03-28T21:00:00Z"
}Session cookies expire:
- Typically 24-48 hours after login
- When you log out
- When Anthropic rotates sessions
When cookie expires:
- HTTP server returns 401 Unauthorized
- Re-run
npm run setup:browser - Extract fresh cookie from browser
- Restart HTTP server
✅ DO:
- Use only for personal/local development
- Keep cookie file secure (already 0600)
- Refresh cookie periodically
- Monitor server logs for unauthorized access
❌ DON'T:
- Share your cookie with others
- Commit cookie file to git (already in .gitignore)
- Use for production services
- Expose HTTP server to public internet
| Feature | Stdio Mode | HTTP Mode |
|---|---|---|
| Client | Claude Desktop | Browser claude.ai |
| Transport | stdio | HTTP/REST |
| Auth | OAuth (one-time) | Session cookie (periodic refresh) |
| Setup | OAuth dashboard | Extract cookie manually |
| Stability | High | Medium (cookie expiry) |
| User Experience | Seamless | Requires bookmarklet/extension |
| Security | High (local only) | Medium (network exposed) |
| Status | Production ✅ | Prototype 🧪 |
- HTTP server with session cookie auth
- All 6 Drive endpoints working
- CORS configuration for claude.ai
- Setup wizard (
iris-setup-browser) - Documentation
- Testing with actual browser
- Bookmarklet proof of concept
- Browser extension (Chrome/Firefox)
- Auto cookie extraction
- UI for folder picker
- Error handling improvements
- Rate limiting
- Session refresh mechanism
- Hosted mode (cloud deployment)
- Multi-user support
- Token encryption at rest
- Analytics/usage tracking
- Notion backend integration
Error: No browser session configured
Solution:
npm run setup:browserCause: Cookie expired or invalid
Solution:
- Log into claude.ai in browser
- Extract fresh cookie
- Run
npm run setup:browseragain - Restart HTTP server
Cause: Browser blocking cross-origin requests
Solution:
- Ensure claude.ai is in CORS allowed origins
- Check browser console for specific error
- Try from same domain (localhost:3001)
Cause: OAuth token expired
Solution:
- Check
~/.claude/config/google-oauth-token.json - Re-run OAuth dashboard if needed
- Verify
DEFAULT_USER_EMAILin.env
- SESSION-COOKIE-PATTERN-ANALYSIS.md - Deep dive into why/how this works
- BROWSER-INTEGRATION-STRATEGY.md - Original design document
- headroom project - Inspiration for session cookie approach
Status: Prototype - functional but needs real-world testing
Next Step: Test with actual browser and create bookmarklet POC
Feedback: Report issues to Uncle Tallest