brainstorming
Structured design dialogue that validates ideas before implementation begins.
mcp-response-optimization
Prevent massive MCP responses from WordPress, Playwright, Notion, and other MCPs that can kill conversations on first call. Sophisticated token management for all MCP tool usage.
Full skill instructions
REQUEST MINIMAL, DISPLAY NOTHING, SAVE EVERYTHING
Single MCP calls can kill entire conversations. This skill ensures every MCP call is filtered, limited, silent, extracted, and saved for maximum token efficiency.
ALWAYS activate before ANY MCP tool call, especially:
This skill is MANDATORY for all MCP usage in Claude Desktop.
One MCP call = conversation dead:
This skill optimizes these MCPs:
WordPress returns EVERYTHING by default:
// ❌ NEVER:
wordpress.list_posts({ per_page: 100 })
// Returns: 5MB of data, 1,250,000 tokens
// ✅ ALWAYS:
wordpress.list_posts({
per_page: 10,
fields: 'id,title,date,status',
context: 'view'
})
// Returns: 5KB of data, 1,250 tokens
// Default limits:
per_page: 10 // NEVER use 100
page: 1 // Paginate if needed
For Posts:
// Minimal (when listing):
fields: 'id,title,status,date'
// Add only when needed:
fields: 'id,title,status,date,excerpt' // For preview
fields: 'id,title,content' // Only when editing
For Pages:
fields: 'id,title,status,parent'
For Media:
// NEVER load full images
fields: 'id,title,source_url' // URL only, not base64
// ❌ BAD:
wordpress.list_posts({ search: 'conference' })
// ✅ GOOD:
wordpress.list_posts({
search: 'conference',
per_page: 5,
fields: 'id,title,date',
status: 'publish',
orderby: 'date',
order: 'desc'
})
// ❌ DON'T:
console.log(response)
// ✅ DO:
const ids = response.map(post => ({ id: post.id, title: post.title }))
console.log(`Found ${ids.length} posts`)
Pattern: List Posts
const posts = wordpress.list_posts({
per_page: 10,
fields: 'id,title,status,date',
status: 'publish'
})
const post_ids = posts.map(p => p.id)
`Found ${posts.length} posts: ${post_ids.join(', ')}`
Pattern: Get Single Post
const post = wordpress.get_post({
id: 123,
fields: 'id,title,content,status'
})
`Retrieved post: ${post.title} (${post.id})`
// Save full content to file if needed
Pattern: Search and Filter
const results = wordpress.list_posts({
search: 'keyword',
per_page: 5,
fields: 'id,title,date'
})
const filtered = results.filter(/* criteria */)
`Found ${filtered.length} matches: [${filtered.map(p => p.id)}]`
// ❌ NEVER:
playwright.evaluate("document.documentElement.outerHTML")
// Returns: 50,000+ tokens
// ✅ ALWAYS:
playwright.locator('.product-title').textContent()
// Returns: 10 tokens
const data = {
title: await page.locator('h1').textContent(),
price: await page.locator('.price').textContent(),
available: await page.locator('.stock-status').textContent()
}
// DON'T extract full page content
// ❌ NEVER include in response:
const screenshot = await page.screenshot()
// 500KB-2MB base64 = 125,000+ tokens
// ✅ SAVE screenshot:
await page.screenshot({ path: '/outputs/screenshot.png' })
`Screenshot saved: /outputs/screenshot.png`
// 20 tokens vs 125,000 tokens
const products = await page.locator('.product-card').all()
const product_data = []
for (const product of products.slice(0, 10)) {
product_data.push({
name: await product.locator('.name').textContent(),
price: await product.locator('.price').textContent()
})
}
fs.writeFileSync('/outputs/products.json', JSON.stringify(product_data))
`Extracted ${product_data.length} products → /outputs/products.json`
Pattern: Page Scraping
await page.goto(url)
const data = {
title: await page.title(),
h1: await page.locator('h1').first().textContent(),
meta: await page.locator('meta[name="description"]').getAttribute('content')
}
fs.writeFileSync('/outputs/page_data.json', JSON.stringify(data))
`Page data saved: /outputs/page_data.json`
Pattern: Element Analysis
const count = await page.locator('.product-item').count()
`Found ${count} products`
const sample = await page.locator('.product-item').first().textContent()
`Sample product: ${sample}`
Pattern: Screenshots for User
await page.screenshot({
path: '/mnt/user-data/outputs/page.png',
fullPage: false // Viewport only
})
`[View screenshot](computer:///mnt/user-data/outputs/page.png)`
Notion returns full page objects with all blocks - can be massive.
// ❌ DON'T:
notion.search({ query: 'project' }) // 100 full pages
// ✅ DO:
notion.search({
query: 'project',
page_size: 10,
filter: { property: 'Status', select: { equals: 'Active' } }
})
const page_ids = results.map(r => r.id)
`Found ${page_ids.length} pages: ${page_ids}`
Before EVERY MCP call:
If answer to last question is NO → Adjust parameters
// ❌ NEVER:
get_all_items({ limit: 1000 })
// ✅ ALWAYS:
get_items({ limit: 10, page: 1 })
// Any response >5KB → Save to file
// ❌ DON'T:
console.log(large_response)
// ✅ DO:
fs.writeFileSync('/outputs/response.json', JSON.stringify(large_response))
`Response saved: /outputs/response.json`
// Step 1: Get IDs only
const ids = get_minimal_list()
// Step 2: User picks which ID
`Found ${ids.length} items: ${ids}`
// Step 3: Fetch full details for THAT ONE
const full_item = get_item_by_id(selected_id)
// ❌ FATAL:
`Here's what I found: ${JSON.stringify(mcp_response)}`
// ✅ CORRECT:
const summary = {
count: mcp_response.length,
items: mcp_response.map(i => i.id)
}
`Found ${summary.count} items: ${summary.items.join(', ')}`
| Operation | Bad Approach | Good Approach |
|---|---|---|
| List 100 WP posts | 1,000,000 tokens | 2,500 tokens |
| Get WP page content | 50,000 tokens | 200 tokens |
| Playwright full DOM | 100,000 tokens | 500 tokens |
| Playwright screenshot | 125,000 tokens | 50 tokens |
| Notion page search | 80,000 tokens | 1,000 tokens |
Before EVERY MCP tool call:
If all YES → Proceed If any NO → Adjust parameters
// Response came back huge (>50,000 tokens)
// 1. Save full response to file
fs.writeFileSync('/outputs/large_response.json', JSON.stringify(response))
// 2. Extract minimal summary
const summary = {
count: response.length,
first_id: response[0]?.id,
last_id: response[response.length - 1]?.id
}
// 3. Return summary only
`Response saved to /outputs/large_response.json`
`Summary: ${summary.count} items (${summary.first_id} to ${summary.last_id})`
This skill is working correctly when:
Works with:
Deployment: Import .zip to Claude Desktop → Settings → Skills Impact: Prevents 50,000-100,000+ token MCP disasters Result: Full conversation capacity instead of 1-message death
Structured design dialogue that validates ideas before implementation begins.
Comprehensive design intelligence for web and mobile UI/UX across 10 technology stacks.
Comprehensive implementation plans for multi-step tasks, breaking down specs into bite-sized, testable steps.
Introduction to the obra skills system with mandatory skill invocation rules and best practices.
Execute a written implementation plan with critical review and task checkpoints.
Delegate independent tasks to specialized agents working concurrently with isolated context.
Isolated git worktrees with smart directory selection and safety verification.
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
Plan searchable and shareable content that drives traffic, builds authority, and generates leads.
README-first repository scanner that extracts commands and classifies reproduction candidates without executing them.
Brainstorm and prioritize marketing strategies tailored to your SaaS stage, budget, and goals.
Plan and optimize your website's page hierarchy, navigation, URL structure, and internal linking.
The world's fastest calendar for remote work
Capture, organize, and utilize your knowledge effortlessly.
Instant Summaries of Audio & Video Interviews with AnySummary
Transform PDFs into engaging mind maps.
Chat with any PDF instantly
Create an optimal daily plan using your voice
A productivity platform to centralize organizational knowledge and workflows with contextual AI assistance.
AskYourPDF Pricing Plans: Tailored to Your Needs