Skip to main content
Glama

DollhouseMCP

by DollhouseMCP
OAUTH_KNOWN_WORKAROUNDS.md7.07 kB
# OAuth Known Workarounds & Working Solutions **Created**: August 23, 2025 **Purpose**: Document proven solutions that already work to prevent agents from reinventing the wheel ## ✅ Token Storage - WORKING SOLUTION ### From PR #701 and QA Tests (94% pass rate) ```javascript // This approach WORKS - from test/qa/oauth-auth-test.mjs async function storeTokenAfterDeviceFlow(token) { const tokenManager = new TokenManager(); // Store immediately after receiving from GitHub await tokenManager.storeToken(token, 'oauth'); // Verify it's stored const stored = await tokenManager.getStoredToken(); console.log('Token stored successfully:', stored ? 'Yes' : 'No'); return stored; } ``` ### What DOESN'T Work ```javascript // DON'T try to fix the background helper process // It's been problematic - just bypass it backgroundHelper.on('token-received', async (token) => { // This approach fails - helper process dies }); ``` ### The Workaround That Works 1. Poll for device flow completion in MAIN process 2. Store token immediately upon receipt 3. Don't rely on background processes for critical storage 4. Use encrypted storage directly via TokenManager ## ✅ Parameter Parsing - WORKING SOLUTION ### From Working MCP Tools ```javascript // From src/server/tools/AuthTools.ts - THIS WORKS async function handleComplexParams(params) { // Always stringify complex objects at tool boundaries if (typeof params === 'object') { return JSON.stringify(params); } return params; } // When receiving parameters async function parseToolParams(input) { try { // Try parsing first return JSON.parse(input); } catch { // If not JSON, use as-is return input; } } ``` ### The [object Object] Fix ```javascript // BEFORE (broken): tool.execute({ complexData: myObject }); // Results in [object Object] // AFTER (working): tool.execute({ complexData: JSON.stringify(myObject) }); // Works! ``` ## ✅ Unicode Validation - WORKING SOLUTION ### From PersonaElement.ts (Working Code) ```javascript // This pattern WORKS throughout the codebase import { UnicodeValidator } from '../utils/UnicodeValidator.js'; function validateAndNormalize(input) { const result = UnicodeValidator.normalize(input); if (!result.isValid) { // Don't throw - return safe default return 'default-safe-value'; } // ALWAYS use normalizedContent, not original return result.normalizedContent; } ``` ### Common Mistake to Avoid ```javascript // DON'T do this: const validated = UnicodeValidator.validate(input); if (validated) { return input; // WRONG - using original input } // DO this: const result = UnicodeValidator.normalize(input); if (result.isValid) { return result.normalizedContent; // CORRECT - using normalized } ``` ## ✅ Collection Browser - WORKING SOLUTION ### From Existing Code ```javascript // The collection has 44 items but filtering returns 0 // The issue is the filter, not the data // WORKAROUND - Skip filtering for now async function browseCollection(options = {}) { const items = await cache.getAll(); // If filtering returns 0, return unfiltered const filtered = applyFilters(items, options); if (filtered.length === 0 && items.length > 0) { console.warn('Filter returned 0 items, returning all'); return items; // Return unfiltered as workaround } return filtered; } ``` ## ✅ GitHub API Authentication - WORKING SOLUTION ### From Session Notes (Proven to Work) ```javascript // Using environment variable (ALWAYS WORKS) process.env.GITHUB_TOKEN = token; const response = await fetch('https://api.github.com/user', { headers: { 'Authorization': `Bearer ${process.env.GITHUB_TOKEN}`, 'Accept': 'application/vnd.github.v3+json' } }); // Or using GitHub CLI token (ALSO WORKS) const { execSync } = require('child_process'); const ghToken = execSync('gh auth token').toString().trim(); process.env.GITHUB_TOKEN = ghToken; ``` ## ✅ Testing OAuth Flow - WORKING APPROACH ### Mock the Device Flow for Unit Tests ```javascript // Don't try to automate the browser interaction jest.mock('../auth/GitHubAuthManager'); const mockDeviceFlow = { device_code: 'test_device_123', user_code: 'TEST-1234', verification_uri: 'https://github.com/login/device', expires_in: 900, interval: 5 }; // Mock the polling completion const mockAccessToken = 'gho_testtoken123456'; GitHubAuthManager.mockImplementation(() => ({ initiateDeviceFlow: jest.fn().mockResolvedValue(mockDeviceFlow), pollForToken: jest.fn().mockResolvedValue({ access_token: mockAccessToken }) })); ``` ### For Integration Testing ```bash # Use the existing QA test that's proven to work npm run test:qa:oauth # Or test with real GitHub CLI token export GITHUB_TOKEN=$(gh auth token) npm test -- --testNamePattern="github integration" ``` ## ✅ Session Management - WORKING PATTERN ### From AuthManager ```javascript // Simple session storage that works class SimpleSessionManager { constructor() { this.sessions = new Map(); } async storeSession(userId, token) { this.sessions.set(userId, { token, timestamp: Date.now(), expiresAt: Date.now() + (60 * 60 * 1000) // 1 hour }); } async getSession(userId) { const session = this.sessions.get(userId); if (!session) return null; // Check expiration if (Date.now() > session.expiresAt) { this.sessions.delete(userId); return null; } return session; } } // Use a singleton instance const sessionManager = new SimpleSessionManager(); ``` ## 🎯 Quick Decision Tree ### Token Not Persisting? 1. Check if using TokenManager directly ✅ 2. If using background process → Switch to main process 3. If still failing → Use environment variable as fallback ### Parameter Parsing Errors? 1. Check if stringifying objects at boundaries ✅ 2. If seeing [object Object] → Add JSON.stringify 3. If complex nesting → Flatten structure first ### Unicode Validation Failing? 1. Check if using normalizedContent ✅ 2. If validation too strict → Return safe default 3. If blocking search → Temporarily bypass for testing ### Collection Returns 0 Items? 1. Check if items exist in cache ✅ 2. If yes → Skip filtering temporarily 3. Return all items as workaround ### Need Human Interaction? 1. Is it OAuth device flow? → STOP, return to orchestrator 2. Is it browser-based? → STOP, can't automate 3. Is it CLI-based? → Can continue with agent ## 📝 When to Use These Workarounds ### Use Immediately - When you recognize the exact problem described - When you've tried the "proper" fix for >15 minutes - When you need to unblock other work - When testing if rest of flow works ### Document for Later - Note that workaround is in place - Create follow-up issue if needed - Include TODO comment in code - Mention in PR description --- **Remember**: These workarounds are PROVEN TO WORK. Don't spend time trying to "improve" them until the basic functionality is working. Get it working first, optimize later!

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DollhouseMCP/DollhouseMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server