[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"doc-self-host-ai-ollama-guide-en":3,"doc-all-en":1140},{"id":4,"title":5,"answer":6,"answerZh":6,"author":7,"body":8,"category":1106,"description":1107,"descriptionZh":1108,"extension":1109,"faqs":1110,"faqsZh":6,"image":6,"meta":1126,"navigation":245,"path":1127,"publishedAt":1128,"readTime":1129,"seo":1130,"stem":1131,"tags":1132,"titleZh":1137,"tldr":1138,"tldrZh":6,"updatedAt":1128,"__hash__":1139},"docs_en\u002Fen\u002Fguide\u002Fself-host-ai-ollama-guide.md","How to Self-Host AI Locally: Ollama, Open WebUI & Beyond (2026 Guide)",null,"William Wang",{"type":9,"value":10,"toc":1077},"minimark",[11,15,18,34,39,42,49,55,61,67,76,80,83,115,125,129,137,142,176,180,189,193,213,217,220,292,295,330,333,337,345,349,415,419,427,443,450,459,463,471,474,478,492,495,499,502,535,539,546,549,560,567,571,580,584,651,668,672,679,687,691,694,719,727,751,756,760,768,794,801,805,808,904,907,911,914,919,930,935,946,951,967,971,988,998,1004,1017,1021,1024,1063,1066,1073],[12,13,14],"p",{},"Self-hosting AI in 2026 has become dramatically easier. What used to require Python dependencies, CUDA setup, and manual model conversion now takes a single command. This guide walks through the complete self-hosted AI stack: from installing Ollama in 60 seconds to building a production-ready private AI system with RAG, code completion, and monitoring.",[12,16,17],{},"By the end of this guide, you'll have:",[19,20,21,25,28,31],"ul",{},[22,23,24],"li",{},"A local LLM running on your hardware",[22,26,27],{},"A ChatGPT-like web interface",[22,29,30],{},"Optional extensions for document Q&A, code completion, and observability",[22,32,33],{},"Zero ongoing API costs and complete data privacy",[35,36,38],"h2",{"id":37},"why-self-host-ai-in-2026","Why Self-Host AI in 2026?",[12,40,41],{},"Cloud AI APIs dominate the market, but self-hosting has compelling advantages:",[12,43,44,48],{},[45,46,47],"strong",{},"Privacy & Compliance"," — Your data never leaves your infrastructure. Critical for healthcare (HIPAA), legal (attorney-client privilege), finance (sensitive financial data), and any enterprise handling proprietary information. Many regulated industries now mandate self-hosted AI for specific use cases.",[12,50,51,54],{},[45,52,53],{},"Cost Predictability"," — Cloud API costs scale with usage. A busy team can easily spend $5,000+\u002Fmonth on Claude or GPT-4 API calls. Self-hosted AI has a fixed hardware cost upfront and zero marginal cost per query.",[12,56,57,60],{},[45,58,59],{},"Model Freedom"," — Run any open-source model: Llama 3.1, Qwen 2.5, Mistral, Gemma, DeepSeek Coder, and dozens of specialized variants. Switch models based on task without rewriting code. Fine-tune models on your own data without exposing it to third parties.",[12,62,63,66],{},[45,64,65],{},"Offline Capability"," — Your AI works without internet. Essential for air-gapped environments, remote locations, or compliance-sensitive deployments where external connections are prohibited.",[12,68,69,70,75],{},"For the full list of ",[71,72,74],"a",{"href":73},"\u002Fen\u002Fai-tools-for\u002Fself-hosted","self-hosted AI tools"," available in 2026, including alternative model runtimes and chat interfaces, browse the TokRepo directory.",[35,77,79],{"id":78},"prerequisites","Prerequisites",[12,81,82],{},"Before starting, make sure you have:",[19,84,85,91,97,103],{},[22,86,87,90],{},[45,88,89],{},"Hardware",": 16GB+ RAM, 50GB+ free disk space, and ideally a GPU with 8GB+ VRAM (not strictly required but 10x faster)",[22,92,93,96],{},[45,94,95],{},"Operating System",": macOS 12+, Linux (Ubuntu 22.04+, Fedora 38+), or Windows 10\u002F11 with WSL2",[22,98,99,102],{},[45,100,101],{},"Terminal Access",": Basic command-line familiarity",[22,104,105,108,109],{},[45,106,107],{},"Docker"," (optional but recommended for Open WebUI): ",[71,110,114],{"href":111,"rel":112},"https:\u002F\u002Fdocs.docker.com\u002Fget-docker\u002F",[113],"nofollow","Install Docker",[116,117,119],"info-box",{"type":118},"tip",[12,120,121,124],{},[45,122,123],{},"Apple Silicon users",": You have a huge advantage. Apple's unified memory architecture lets M1\u002FM2\u002FM3 Macs run large models without a discrete GPU. A 32GB M2 Mac can run 70B models smoothly.",[35,126,128],{"id":127},"step-1-install-ollama-5-minutes","Step 1: Install Ollama (5 minutes)",[12,130,131,136],{},[71,132,135],{"href":133,"rel":134},"https:\u002F\u002Follama.com",[113],"Ollama"," is the foundation of your self-hosted AI stack. It handles model downloading, quantization, and inference with a single binary.",[138,139,141],"h3",{"id":140},"macos-linux","macOS \u002F Linux",[143,144,149],"pre",{"className":145,"code":146,"language":147,"meta":148,"style":148},"language-bash shiki shiki-themes github-light github-dark","curl -fsSL https:\u002F\u002Follama.com\u002Finstall.sh | sh\n","bash","",[150,151,152],"code",{"__ignoreMap":148},[153,154,157,161,165,169,173],"span",{"class":155,"line":156},"line",1,[153,158,160],{"class":159},"sScJk","curl",[153,162,164],{"class":163},"sj4cs"," -fsSL",[153,166,168],{"class":167},"sZZnC"," https:\u002F\u002Follama.com\u002Finstall.sh",[153,170,172],{"class":171},"szBVR"," |",[153,174,175],{"class":159}," sh\n",[138,177,179],{"id":178},"windows","Windows",[12,181,182,183,188],{},"Download the installer from ",[71,184,187],{"href":185,"rel":186},"https:\u002F\u002Follama.com\u002Fdownload",[113],"ollama.com\u002Fdownload"," and run it. Ollama installs as a background service.",[138,190,192],{"id":191},"verify-installation","Verify Installation",[143,194,196],{"className":145,"code":195,"language":147,"meta":148,"style":148},"ollama --version\n# ollama version is 0.5.x\n",[150,197,198,206],{"__ignoreMap":148},[153,199,200,203],{"class":155,"line":156},[153,201,202],{"class":159},"ollama",[153,204,205],{"class":163}," --version\n",[153,207,209],{"class":155,"line":208},2,[153,210,212],{"class":211},"sJ8bj","# ollama version is 0.5.x\n",[35,214,216],{"id":215},"step-2-download-your-first-model-2-minutes","Step 2: Download Your First Model (2 minutes)",[12,218,219],{},"Ollama manages models like Docker manages images. Pull a model with one command:",[143,221,223],{"className":145,"code":222,"language":147,"meta":148,"style":148},"# Start with Llama 3.1 8B — a great balance of quality and speed\nollama pull llama3.1:8b\n\n# Or go bigger if you have the hardware\nollama pull llama3.1:70b    # Needs 64GB+ RAM\nollama pull qwen2.5:32b     # Excellent for coding, 32B size\nollama pull mistral:7b      # Fast, good all-rounder\n",[150,224,225,230,240,247,253,266,279],{"__ignoreMap":148},[153,226,227],{"class":155,"line":156},[153,228,229],{"class":211},"# Start with Llama 3.1 8B — a great balance of quality and speed\n",[153,231,232,234,237],{"class":155,"line":208},[153,233,202],{"class":159},[153,235,236],{"class":167}," pull",[153,238,239],{"class":167}," llama3.1:8b\n",[153,241,243],{"class":155,"line":242},3,[153,244,246],{"emptyLinePlaceholder":245},true,"\n",[153,248,250],{"class":155,"line":249},4,[153,251,252],{"class":211},"# Or go bigger if you have the hardware\n",[153,254,256,258,260,263],{"class":155,"line":255},5,[153,257,202],{"class":159},[153,259,236],{"class":167},[153,261,262],{"class":167}," llama3.1:70b",[153,264,265],{"class":211},"    # Needs 64GB+ RAM\n",[153,267,269,271,273,276],{"class":155,"line":268},6,[153,270,202],{"class":159},[153,272,236],{"class":167},[153,274,275],{"class":167}," qwen2.5:32b",[153,277,278],{"class":211},"     # Excellent for coding, 32B size\n",[153,280,282,284,286,289],{"class":155,"line":281},7,[153,283,202],{"class":159},[153,285,236],{"class":167},[153,287,288],{"class":167}," mistral:7b",[153,290,291],{"class":211},"      # Fast, good all-rounder\n",[12,293,294],{},"Test the model directly in your terminal:",[143,296,298],{"className":145,"code":297,"language":147,"meta":148,"style":148},"ollama run llama3.1:8b\n>>> Why should I self-host AI?\n",[150,299,300,309],{"__ignoreMap":148},[153,301,302,304,307],{"class":155,"line":156},[153,303,202],{"class":159},[153,305,306],{"class":167}," run",[153,308,239],{"class":167},[153,310,311,315,318,321,324,327],{"class":155,"line":208},[153,312,314],{"class":313},"sVt8B",">>> ",[153,316,317],{"class":159},"Why",[153,319,320],{"class":167}," should",[153,322,323],{"class":167}," I",[153,325,326],{"class":167}," self-host",[153,328,329],{"class":167}," AI?\n",[12,331,332],{},"You now have a working local LLM. But the terminal interface isn't ideal for daily use — let's add a proper web UI.",[35,334,336],{"id":335},"step-3-install-open-webui-10-minutes","Step 3: Install Open WebUI (10 minutes)",[12,338,339,344],{},[71,340,343],{"href":341,"rel":342},"https:\u002F\u002Fopenwebui.com",[113],"Open WebUI"," provides a ChatGPT-like interface for your self-hosted models. It supports multi-model switching, file uploads, RAG, and multiple users.",[138,346,348],{"id":347},"docker-installation-recommended","Docker Installation (Recommended)",[143,350,352],{"className":145,"code":351,"language":147,"meta":148,"style":148},"docker run -d -p 3000:8080 \\\n  --add-host=host.docker.internal:host-gateway \\\n  -v open-webui:\u002Fapp\u002Fbackend\u002Fdata \\\n  --name open-webui \\\n  --restart always \\\n  ghcr.io\u002Fopen-webui\u002Fopen-webui:main\n",[150,353,354,373,380,390,400,410],{"__ignoreMap":148},[153,355,356,359,361,364,367,370],{"class":155,"line":156},[153,357,358],{"class":159},"docker",[153,360,306],{"class":167},[153,362,363],{"class":163}," -d",[153,365,366],{"class":163}," -p",[153,368,369],{"class":167}," 3000:8080",[153,371,372],{"class":163}," \\\n",[153,374,375,378],{"class":155,"line":208},[153,376,377],{"class":163},"  --add-host=host.docker.internal:host-gateway",[153,379,372],{"class":163},[153,381,382,385,388],{"class":155,"line":242},[153,383,384],{"class":163},"  -v",[153,386,387],{"class":167}," open-webui:\u002Fapp\u002Fbackend\u002Fdata",[153,389,372],{"class":163},[153,391,392,395,398],{"class":155,"line":249},[153,393,394],{"class":163},"  --name",[153,396,397],{"class":167}," open-webui",[153,399,372],{"class":163},[153,401,402,405,408],{"class":155,"line":255},[153,403,404],{"class":163},"  --restart",[153,406,407],{"class":167}," always",[153,409,372],{"class":163},[153,411,412],{"class":155,"line":268},[153,413,414],{"class":167},"  ghcr.io\u002Fopen-webui\u002Fopen-webui:main\n",[138,416,418],{"id":417},"access-the-interface","Access the Interface",[12,420,421,422,426],{},"Open ",[71,423,424],{"href":424,"rel":425},"http:\u002F\u002Flocalhost:3000",[113]," in your browser. Create an admin account (stored locally), then:",[428,429,430,433,440],"ol",{},[22,431,432],{},"Click the model selector (top left)",[22,434,435,436,439],{},"Choose your Ollama model (e.g., ",[150,437,438],{},"llama3.1:8b",")",[22,441,442],{},"Start chatting",[12,444,445,446,449],{},"Open WebUI automatically detects models installed in Ollama. To add more models, just run ",[150,447,448],{},"ollama pull \u003Cmodel-name>"," and they'll appear in the dropdown.",[116,451,453],{"type":452},"warning",[12,454,455,458],{},[45,456,457],{},"Security note",": Open WebUI runs on all interfaces by default. If you're on a shared network, add a reverse proxy with HTTPS (Caddy or Nginx) and authentication.",[35,460,462],{"id":461},"step-4-add-rag-for-document-qa-15-minutes","Step 4: Add RAG for Document Q&A (15 minutes)",[12,464,465,466,470],{},"Now let's make your AI actually useful for your work. ",[71,467,469],{"href":468},"\u002Fen\u002Fai-tools-for\u002Frag","Retrieval-Augmented Generation (RAG)"," lets your AI answer questions based on your documents — contracts, manuals, codebases, or knowledge bases.",[12,472,473],{},"Open WebUI has built-in RAG support. Enable it in three steps:",[138,475,477],{"id":476},"_1-install-an-embedding-model","1. Install an Embedding Model",[143,479,481],{"className":145,"code":480,"language":147,"meta":148,"style":148},"ollama pull nomic-embed-text\n",[150,482,483],{"__ignoreMap":148},[153,484,485,487,489],{"class":155,"line":156},[153,486,202],{"class":159},[153,488,236],{"class":167},[153,490,491],{"class":167}," nomic-embed-text\n",[12,493,494],{},"Nomic Embed is a small, fast embedding model optimized for retrieval tasks.",[138,496,498],{"id":497},"_2-configure-open-webui","2. Configure Open WebUI",[12,500,501],{},"In Open WebUI:",[428,503,504,510,520],{},[22,505,506,507],{},"Go to ",[45,508,509],{},"Settings → Documents",[22,511,512,513,516,517],{},"Set ",[45,514,515],{},"Embedding Model"," to ",[150,518,519],{},"nomic-embed-text",[22,521,512,522,516,525,528,529,516,532],{},[45,523,524],{},"Chunk Size",[150,526,527],{},"1000",", ",[45,530,531],{},"Chunk Overlap",[150,533,534],{},"200",[138,536,538],{"id":537},"_3-upload-documents","3. Upload Documents",[12,540,541,542,545],{},"Click the ",[45,543,544],{},"#"," icon in the chat input to upload PDFs, Word docs, Markdown files, or entire folders. Open WebUI automatically chunks, embeds, and indexes them.",[12,547,548],{},"Now you can ask questions like:",[19,550,551,554,557],{},[22,552,553],{},"\"Summarize section 3 of the contract I just uploaded\"",[22,555,556],{},"\"What does the API documentation say about rate limiting?\"",[22,558,559],{},"\"Find contradictions between these two policy documents\"",[12,561,562,563,566],{},"For production RAG pipelines with more control (hybrid search, re-ranking, custom chunking), explore dedicated frameworks like ",[71,564,565],{"href":468},"RAGFlow, Haystack, and Kotaemon"," on TokRepo.",[35,568,570],{"id":569},"step-5-add-code-completion-with-tabby-optional-10-minutes","Step 5: Add Code Completion with Tabby (Optional, 10 minutes)",[12,572,573,574,579],{},"If you're a developer, ",[71,575,578],{"href":576,"rel":577},"https:\u002F\u002Ftabby.tabbyml.com",[113],"Tabby"," is a self-hosted GitHub Copilot alternative that integrates with your IDE and runs entirely on your hardware.",[138,581,583],{"id":582},"install-tabby","Install Tabby",[143,585,587],{"className":145,"code":586,"language":147,"meta":148,"style":148},"docker run -it \\\n  --gpus all -p 8080:8080 \\\n  -v $HOME\u002F.tabby:\u002Fdata \\\n  tabbyml\u002Ftabby \\\n  serve --model StarCoder2-3B --device cuda\n",[150,588,589,600,615,627,634],{"__ignoreMap":148},[153,590,591,593,595,598],{"class":155,"line":156},[153,592,358],{"class":159},[153,594,306],{"class":167},[153,596,597],{"class":163}," -it",[153,599,372],{"class":163},[153,601,602,605,608,610,613],{"class":155,"line":208},[153,603,604],{"class":163},"  --gpus",[153,606,607],{"class":167}," all",[153,609,366],{"class":163},[153,611,612],{"class":167}," 8080:8080",[153,614,372],{"class":163},[153,616,617,619,622,625],{"class":155,"line":242},[153,618,384],{"class":163},[153,620,621],{"class":313}," $HOME",[153,623,624],{"class":167},"\u002F.tabby:\u002Fdata",[153,626,372],{"class":163},[153,628,629,632],{"class":155,"line":249},[153,630,631],{"class":167},"  tabbyml\u002Ftabby",[153,633,372],{"class":163},[153,635,636,639,642,645,648],{"class":155,"line":255},[153,637,638],{"class":167},"  serve",[153,640,641],{"class":163}," --model",[153,643,644],{"class":167}," StarCoder2-3B",[153,646,647],{"class":163}," --device",[153,649,650],{"class":167}," cuda\n",[12,652,653,654,657,658,661,662,667],{},"For CPU-only: replace ",[150,655,656],{},"--device cuda"," with ",[150,659,660],{},"--device cpu",". For Apple Silicon: use the native binary from ",[71,663,666],{"href":664,"rel":665},"https:\u002F\u002Fgithub.com\u002FTabbyML\u002Ftabby\u002Freleases",[113],"GitHub releases",".",[138,669,671],{"id":670},"connect-your-editor","Connect Your Editor",[12,673,674,675,678],{},"Install the Tabby extension in VS Code, JetBrains, Neovim, or Emacs. Point it at ",[150,676,677],{},"http:\u002F\u002Flocalhost:8080"," and you get inline code completions — without any code leaving your machine.",[12,680,681,682,686],{},"This is game-changing for teams with proprietary code where GitHub Copilot isn't allowed. For more ",[71,683,685],{"href":684},"\u002Fen\u002Fai-tools-for\u002Fcoding","AI coding tools"," including alternatives, browse the TokRepo directory.",[35,688,690],{"id":689},"step-6-monitor-your-local-ai-optional","Step 6: Monitor Your Local AI (Optional)",[12,692,693],{},"Once your self-hosted AI is handling real workloads, you'll want to know how it's performing. Key metrics to track:",[19,695,696,702,708,714],{},[22,697,698,701],{},[45,699,700],{},"Latency"," — How long does each query take?",[22,703,704,707],{},[45,705,706],{},"Throughput"," — Queries per second at peak load",[22,709,710,713],{},[45,711,712],{},"Quality"," — Are responses accurate? Are users satisfied?",[22,715,716,718],{},[45,717,89],{}," — GPU\u002FCPU utilization, memory usage, disk I\u002FO",[12,720,721,722,726],{},"For comprehensive ",[71,723,725],{"href":724},"\u002Fen\u002Fai-tools-for\u002Fmonitoring","AI monitoring and observability",":",[19,728,729,739,745],{},[22,730,731,734,735,738],{},[45,732,733],{},"Langfuse"," \u002F ",[45,736,737],{},"Opik"," — LLM-specific observability with prompt logging and evaluation",[22,740,741,744],{},[45,742,743],{},"Uptime Kuma"," — Simple uptime monitoring for your Ollama and Open WebUI endpoints",[22,746,747,750],{},[45,748,749],{},"Grafana + Prometheus"," — Hardware metrics and custom dashboards",[116,752,753],{"type":118},[12,754,755],{},"Start with Uptime Kuma — it's a 5-minute install and catches the most common failure mode: the service being down.",[35,757,759],{"id":758},"step-7-secure-your-self-hosted-ai","Step 7: Secure Your Self-Hosted AI",[12,761,762,763,767],{},"Running AI on your own infrastructure means you're responsible for ",[71,764,766],{"href":765},"\u002Fen\u002Fai-tools-for\u002Fsecurity","security",". Essential steps:",[428,769,770,776,782,788],{},[22,771,772,775],{},[45,773,774],{},"Firewall rules"," — Don't expose Ollama (port 11434) or Open WebUI (port 3000) directly to the internet",[22,777,778,781],{},[45,779,780],{},"Reverse proxy with HTTPS"," — Use Caddy or Nginx with automatic Let's Encrypt certificates",[22,783,784,787],{},[45,785,786],{},"Authentication"," — Open WebUI has built-in user management; enable it for multi-user deployments",[22,789,790,793],{},[45,791,792],{},"Network isolation"," — Run everything on a private VLAN or Tailscale network for team access",[12,795,796,797,800],{},"For enterprise deployments, consider ",[71,798,799],{"href":765},"AI security tools"," that audit your configuration and detect vulnerabilities before they're exploited.",[35,802,804],{"id":803},"complete-self-hosted-ai-stack","Complete Self-Hosted AI Stack",[12,806,807],{},"Here's what a full self-hosted AI setup looks like in 2026:",[809,810,811,827],"table",{},[812,813,814],"thead",{},[815,816,817,821,824],"tr",{},[818,819,820],"th",{},"Layer",[818,822,823],{},"Tool",[818,825,826],{},"Purpose",[828,829,830,841,851,861,872,882,893],"tbody",{},[815,831,832,836,838],{},[833,834,835],"td",{},"Model Runtime",[833,837,135],{},[833,839,840],{},"Download, quantize, serve LLMs",[815,842,843,846,848],{},[833,844,845],{},"Chat Interface",[833,847,343],{},[833,849,850],{},"ChatGPT-like UI with multi-model support",[815,852,853,856,858],{},[833,854,855],{},"Embeddings",[833,857,519],{},[833,859,860],{},"Convert text to vectors for RAG",[815,862,863,866,869],{},[833,864,865],{},"RAG",[833,867,868],{},"Open WebUI built-in or RAGFlow",[833,870,871],{},"Document Q&A",[815,873,874,877,879],{},[833,875,876],{},"Code Completion",[833,878,578],{},[833,880,881],{},"Self-hosted Copilot alternative",[815,883,884,887,890],{},[833,885,886],{},"Search",[833,888,889],{},"SearXNG",[833,891,892],{},"Private search engine",[815,894,895,898,901],{},[833,896,897],{},"Monitoring",[833,899,900],{},"Langfuse + Uptime Kuma",[833,902,903],{},"Observability and health checks",[12,905,906],{},"This stack runs on a single server with proper hardware, handles dozens of concurrent users, and costs nothing per query. You own your AI infrastructure end-to-end.",[35,908,910],{"id":909},"recommended-hardware-configurations","Recommended Hardware Configurations",[12,912,913],{},"Based on your use case:",[12,915,916],{},[45,917,918],{},"Solo Developer \u002F Small Team (up to 5 users)",[19,920,921,924,927],{},[22,922,923],{},"Apple M2 Pro Mac Mini with 32GB RAM ($1,500)",[22,925,926],{},"Or: Desktop with RTX 4060 Ti 16GB + 32GB RAM ($1,200)",[22,928,929],{},"Runs 7B-13B models smoothly",[12,931,932],{},[45,933,934],{},"Startup \u002F Mid-Size Team (10-50 users)",[19,936,937,940,943],{},[22,938,939],{},"Server with RTX A6000 48GB + 128GB RAM ($6,000)",[22,941,942],{},"Runs 70B models with concurrent users",[22,944,945],{},"Handles production RAG workloads",[12,947,948],{},[45,949,950],{},"Enterprise (100+ users)",[19,952,953,956,959],{},[22,954,955],{},"Dedicated GPU cluster with 4-8x A100 or H100",[22,957,958],{},"Kubernetes deployment with model sharding",[22,960,961,962,966],{},"Requires professional DevOps setup — explore ",[71,963,965],{"href":964},"\u002Fen\u002Fai-tools-for\u002Fdevops","DevOps AI tools"," for orchestration",[35,968,970],{"id":969},"troubleshooting-common-issues","Troubleshooting Common Issues",[12,972,973,976,977,979,980,983,984,987],{},[45,974,975],{},"\"CUDA out of memory\""," — Model too big for your GPU. Try a smaller variant (e.g., ",[150,978,438],{}," instead of ",[150,981,982],{},"70b",") or use a quantized version (",[150,985,986],{},"llama3.1:70b-q4_0",").",[12,989,990,993,994,997],{},[45,991,992],{},"Slow responses"," — Check GPU utilization with ",[150,995,996],{},"nvidia-smi",". If GPU isn't being used, Ollama is falling back to CPU. Reinstall with CUDA support or use smaller models.",[12,999,1000,1003],{},[45,1001,1002],{},"Model returns gibberish"," — Wrong context length or prompt format. Each model has specific formatting requirements — use Ollama's default templates.",[12,1005,1006,1009,1010,1013,1014,667],{},[45,1007,1008],{},"Out of disk space"," — Models are large (7B ≈ 4GB, 70B ≈ 40GB). Clean up with ",[150,1011,1012],{},"ollama rm \u003Cmodel-name>"," and monitor with ",[150,1015,1016],{},"df -h",[35,1018,1020],{"id":1019},"next-steps","Next Steps",[12,1022,1023],{},"You now have a working self-hosted AI stack. From here:",[428,1025,1026,1036,1046,1057],{},[22,1027,1028,1031,1032],{},[45,1029,1030],{},"Build AI agents"," that use your self-hosted models — see ",[71,1033,1035],{"href":1034},"\u002Fen\u002Fguide\u002Fhow-to-build-ai-agent","How to Build an AI Agent",[22,1037,1038,1041,1042],{},[45,1039,1040],{},"Add knowledge graphs"," for complex reasoning — see ",[71,1043,1045],{"href":1044},"\u002Fen\u002Fai-tools-for\u002Fknowledge-graph","AI knowledge graph tools",[22,1047,1048,1051,1052,1056],{},[45,1049,1050],{},"Integrate with your database"," — see ",[71,1053,1055],{"href":1054},"\u002Fen\u002Fai-tools-for\u002Fdatabase","AI database tools"," including MCP servers for PostgreSQL, MySQL, and MongoDB",[22,1058,1059,1062],{},[45,1060,1061],{},"Browse the full self-hosted directory"," — discover alternative tools for every layer of the stack",[12,1064,1065],{},"Self-hosting AI in 2026 isn't just for privacy enthusiasts anymore. With tools like Ollama and Open WebUI, it's become a practical choice for anyone who wants control over their AI infrastructure, predictable costs, and complete data sovereignty.",[12,1067,1068,1069,1072],{},"The ecosystem keeps improving every month. Bookmark the ",[71,1070,1071],{"href":73},"TokRepo self-hosted AI directory"," and check back regularly for new tools, models, and deployment patterns.",[1074,1075,1076],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":148,"searchDepth":208,"depth":208,"links":1078},[1079,1080,1081,1086,1087,1091,1096,1100,1101,1102,1103,1104,1105],{"id":37,"depth":208,"text":38},{"id":78,"depth":208,"text":79},{"id":127,"depth":208,"text":128,"children":1082},[1083,1084,1085],{"id":140,"depth":242,"text":141},{"id":178,"depth":242,"text":179},{"id":191,"depth":242,"text":192},{"id":215,"depth":208,"text":216},{"id":335,"depth":208,"text":336,"children":1088},[1089,1090],{"id":347,"depth":242,"text":348},{"id":417,"depth":242,"text":418},{"id":461,"depth":208,"text":462,"children":1092},[1093,1094,1095],{"id":476,"depth":242,"text":477},{"id":497,"depth":242,"text":498},{"id":537,"depth":242,"text":538},{"id":569,"depth":208,"text":570,"children":1097},[1098,1099],{"id":582,"depth":242,"text":583},{"id":670,"depth":242,"text":671},{"id":689,"depth":208,"text":690},{"id":758,"depth":208,"text":759},{"id":803,"depth":208,"text":804},{"id":909,"depth":208,"text":910},{"id":969,"depth":208,"text":970},{"id":1019,"depth":208,"text":1020},"tutorial","Complete guide to self-hosting AI in 2026. Install Ollama, Open WebUI, and build a private AI stack with RAG, code completion, and knowledge bases — all running on your own hardware.","2026 年自托管 AI 完全指南。安装 Ollama、Open WebUI，搭建私有 AI 技术栈，包含 RAG、代码补全、知识库——全部运行在你自己的硬件上。","md",[1111,1114,1117,1120,1123],{"q":1112,"a":1113},"Why self-host AI instead of using cloud APIs?","Three reasons: privacy (data never leaves your infrastructure — critical for medical, legal, and enterprise use cases), cost (zero ongoing API fees for unlimited usage), and control (choose any model, run offline, no vendor lock-in). The trade-off: you manage hardware and updates.",{"q":1115,"a":1116},"What hardware do I need to self-host AI?","For 7B parameter models (handles most tasks): 16GB RAM + GPU with 8GB VRAM (RTX 3060, RTX 4060, or Apple M2). For 70B models (GPT-4 class): 64GB RAM + GPU with 48GB VRAM (A6000, or dual RTX 3090\u002F4090). Apple Silicon Macs with 32GB+ unified memory are excellent — they can run 70B models without a discrete GPU.",{"q":1118,"a":1119},"Is Ollama free for commercial use?","Yes. Ollama is MIT licensed and free for any use including commercial. The models you run on Ollama have their own licenses — Llama 3.1 and Qwen 2.5 are free for commercial use under certain thresholds; Mistral and Gemma have varying terms. Always check the specific model license for your use case.",{"q":1121,"a":1122},"How does self-hosted AI compare to GPT-4 or Claude?","Open-source models like Llama 3.1 70B and Qwen 2.5 72B match GPT-4 on most benchmarks — coding, reasoning, analysis, and general Q&A. They fall behind on the most complex multi-step reasoning and creative writing where Claude Opus and GPT-4o still lead. For 90% of business use cases, self-hosted models are 'good enough' with dramatically better privacy and cost.",{"q":1124,"a":1125},"Can I use self-hosted AI for code completion like GitHub Copilot?","Yes. Tabby is a self-hosted Copilot alternative that runs entirely on your infrastructure. Install it alongside Ollama, point it at your IDE (VS Code, JetBrains, Neovim), and you get inline code suggestions without sending code to external servers. Perfect for proprietary codebases where GitHub Copilot isn't allowed.",{},"\u002Fen\u002Fguide\u002Fself-host-ai-ollama-guide","2026-04-11",18,{"title":5,"description":1107},"en\u002Fguide\u002Fself-host-ai-ollama-guide",[1133,202,1134,1135,1136],"self-hosted","privacy","open-source","local-ai","如何在本地自托管 AI：Ollama、Open WebUI 完全指南（2026）","Self-host AI in 2026 with Ollama (model runtime), Open WebUI (ChatGPT-like interface), and optional extensions for RAG, code completion, and monitoring. Minimum hardware: 16GB RAM + any GPU with 8GB VRAM for 7B models; 64GB RAM + 48GB VRAM for 70B models. Total setup time: under 30 minutes. Zero ongoing API costs, full data privacy, and models that match GPT-4 on most tasks.","oGZXF2lWapjs-HRHa-sMCQBD9fJ5am-9ema1aoI2hto",[1141,2775,3730,5535,6653,8637,9688,10880,11736,12480,13280,14165,14955,16691,18127,19621,22713,24603,25560,26624],{"id":1142,"title":1143,"answer":6,"answerZh":6,"author":7,"body":1144,"category":2744,"description":2745,"descriptionZh":2746,"extension":1109,"faqs":2747,"faqsZh":6,"image":2761,"meta":2762,"navigation":245,"path":2763,"publishedAt":2764,"readTime":1356,"seo":2765,"stem":2766,"tags":2767,"titleZh":2772,"tldr":2773,"tldrZh":6,"updatedAt":2764,"__hash__":2774},"docs_en\u002Fen\u002Fguide\u002Fagent-skills-for-teams.md","How to Set Up Shared Agent Skills for Your Development Team",{"type":9,"value":1145,"toc":2707},[1146,1149,1151,1172,1176,1179,1185,1207,1213,1247,1253,1264,1268,1271,1275,1283,1287,1298,1427,1431,1489,1495,1501,1509,1513,1521,1525,1538,1542,1694,1698,1733,1738,1743,1747,1750,1754,1760,1764,1911,2019,2024,2029,2033,2036,2040,2043,2057,2064,2068,2071,2085,2091,2095,2098,2112,2118,2122,2125,2139,2145,2149,2152,2166,2172,2176,2179,2183,2255,2259,2262,2398,2402,2429,2433,2508,2511,2515,2519,2525,2529,2536,2669,2673,2676,2678,2704],[12,1147,1148],{},"Learn how to standardize your team's AI coding workflow with shared agent skills. Whether you have 3 developers or 30, this guide covers three proven methods to distribute, version, and maintain skills across your entire organization — so every team member gets the same Claude Code superpowers from day one.",[35,1150,79],{"id":78},[19,1152,1153,1161,1164],{},[22,1154,1155,1160],{},[71,1156,1159],{"href":1157,"rel":1158},"https:\u002F\u002Fclaude.ai\u002Fcode",[113],"Claude Code"," installed (v2.1+)",[22,1162,1163],{},"A team Git repository",[22,1165,1166,1167,1171],{},"Basic familiarity with ",[71,1168,1170],{"href":1169},"\u002Fguide\u002Fcreate-skill","agent skills"," and the terminal",[35,1173,1175],{"id":1174},"why-teams-need-shared-skills","Why Teams Need Shared Skills",[12,1177,1178],{},"When every developer writes their own prompts, you get inconsistency. One person's \"refactor this\" produces entirely different results from another's. Shared skills solve three problems:",[12,1180,1181,1184],{},[45,1182,1183],{},"Consistency."," Every team member gets the same code review standards, the same debugging methodology, and the same commit message format. The skill file is the single source of truth.",[143,1186,1190],{"className":1187,"code":1188,"language":1189,"meta":148,"style":148},"language-yaml shiki shiki-themes github-light github-dark","# .claude\u002Fcommands\u002Fcode-review.md\n# Every developer on your team runs the same review checklist\n# — no more \"I forgot to check for SQL injection\"\n","yaml",[150,1191,1192,1197,1202],{"__ignoreMap":148},[153,1193,1194],{"class":155,"line":156},[153,1195,1196],{"class":211},"# .claude\u002Fcommands\u002Fcode-review.md\n",[153,1198,1199],{"class":155,"line":208},[153,1200,1201],{"class":211},"# Every developer on your team runs the same review checklist\n",[153,1203,1204],{"class":155,"line":242},[153,1205,1206],{"class":211},"# — no more \"I forgot to check for SQL injection\"\n",[12,1208,1209,1212],{},[45,1210,1211],{},"Onboarding."," A new hire clones the repo, and they instantly have every skill the team has built over the past year. No tribal knowledge lost.",[143,1214,1216],{"className":145,"code":1215,"language":147,"meta":148,"style":148},"git clone git@github.com:your-org\u002Fyour-app.git\ncd your-app\n# Skills are already in .claude\u002Fcommands\u002F — ready to use\nclaude\n",[150,1217,1218,1229,1237,1242],{"__ignoreMap":148},[153,1219,1220,1223,1226],{"class":155,"line":156},[153,1221,1222],{"class":159},"git",[153,1224,1225],{"class":167}," clone",[153,1227,1228],{"class":167}," git@github.com:your-org\u002Fyour-app.git\n",[153,1230,1231,1234],{"class":155,"line":208},[153,1232,1233],{"class":163},"cd",[153,1235,1236],{"class":167}," your-app\n",[153,1238,1239],{"class":155,"line":242},[153,1240,1241],{"class":211},"# Skills are already in .claude\u002Fcommands\u002F — ready to use\n",[153,1243,1244],{"class":155,"line":249},[153,1245,1246],{"class":159},"claude\n",[12,1248,1249,1252],{},[45,1250,1251],{},"Code review standards."," When the skill defines what \"good code\" looks like, PR reviews become objective. The AI applies the same standards to every diff.",[12,1254,1255,1256,1259,1260,667],{},"If you're new to skills altogether, start with ",[71,1257,1258],{"href":1169},"How to Create Your First Agent Skill"," before continuing here. For understanding how skills compare to MCP servers, see ",[71,1261,1263],{"href":1262},"\u002Fguide\u002Fskills-vs-mcp","Skills vs MCP vs Rules",[35,1265,1267],{"id":1266},"method-1-git-repository","Method 1: Git Repository",[12,1269,1270],{},"The simplest approach — commit skill files directly to your project repo.",[138,1272,1274],{"id":1273},"directory-structure","Directory Structure",[143,1276,1281],{"className":1277,"code":1279,"language":1280},[1278],"language-text","your-project\u002F\n├── .claude\u002F\n│   └── commands\u002F\n│       ├── code-review.md\n│       ├── pr-description.md\n│       ├── debug-production.md\n│       ├── deploy-checklist.md\n│       └── write-tests.md\n├── src\u002F\n└── package.json\n","text",[150,1282,1279],{"__ignoreMap":148},[138,1284,1286],{"id":1285},"how-it-works","How It Works",[12,1288,1289,1290,1293,1294,1297],{},"Claude Code automatically discovers all ",[150,1291,1292],{},".md"," files in ",[150,1295,1296],{},".claude\u002Fcommands\u002F",". When a team member clones the repo, the skills come with it.",[143,1299,1301],{"className":145,"code":1300,"language":147,"meta":148,"style":148},"# Create the skills directory\nmkdir -p .claude\u002Fcommands\n\n# Create a team code review skill\ncat > .claude\u002Fcommands\u002Fcode-review.md \u003C\u003C 'EOF'\n---\nname: Team Code Review\ndescription: Run our team's standard code review checklist\n---\n\nReview the staged changes against our team standards:\n\n1. **Security**: No hardcoded secrets, SQL injection, XSS vectors\n2. **Performance**: No N+1 queries, unnecessary re-renders, or unbounded loops\n3. **Testing**: Every new function has at least one test\n4. **Naming**: Variables and functions follow our conventions (camelCase for JS, snake_case for Python)\n5. **Documentation**: Public APIs have JSDoc\u002Fdocstrings\n\nOutput a markdown checklist with pass\u002Ffail for each item.\nEOF\n",[150,1302,1303,1308,1318,1322,1327,1344,1349,1354,1360,1365,1370,1376,1381,1387,1393,1399,1405,1411,1415,1421],{"__ignoreMap":148},[153,1304,1305],{"class":155,"line":156},[153,1306,1307],{"class":211},"# Create the skills directory\n",[153,1309,1310,1313,1315],{"class":155,"line":208},[153,1311,1312],{"class":159},"mkdir",[153,1314,366],{"class":163},[153,1316,1317],{"class":167}," .claude\u002Fcommands\n",[153,1319,1320],{"class":155,"line":242},[153,1321,246],{"emptyLinePlaceholder":245},[153,1323,1324],{"class":155,"line":249},[153,1325,1326],{"class":211},"# Create a team code review skill\n",[153,1328,1329,1332,1335,1338,1341],{"class":155,"line":255},[153,1330,1331],{"class":159},"cat",[153,1333,1334],{"class":171}," >",[153,1336,1337],{"class":167}," .claude\u002Fcommands\u002Fcode-review.md",[153,1339,1340],{"class":171}," \u003C\u003C",[153,1342,1343],{"class":167}," 'EOF'\n",[153,1345,1346],{"class":155,"line":268},[153,1347,1348],{"class":167},"---\n",[153,1350,1351],{"class":155,"line":281},[153,1352,1353],{"class":167},"name: Team Code Review\n",[153,1355,1357],{"class":155,"line":1356},8,[153,1358,1359],{"class":167},"description: Run our team's standard code review checklist\n",[153,1361,1363],{"class":155,"line":1362},9,[153,1364,1348],{"class":167},[153,1366,1368],{"class":155,"line":1367},10,[153,1369,246],{"emptyLinePlaceholder":245},[153,1371,1373],{"class":155,"line":1372},11,[153,1374,1375],{"class":167},"Review the staged changes against our team standards:\n",[153,1377,1379],{"class":155,"line":1378},12,[153,1380,246],{"emptyLinePlaceholder":245},[153,1382,1384],{"class":155,"line":1383},13,[153,1385,1386],{"class":167},"1. **Security**: No hardcoded secrets, SQL injection, XSS vectors\n",[153,1388,1390],{"class":155,"line":1389},14,[153,1391,1392],{"class":167},"2. **Performance**: No N+1 queries, unnecessary re-renders, or unbounded loops\n",[153,1394,1396],{"class":155,"line":1395},15,[153,1397,1398],{"class":167},"3. **Testing**: Every new function has at least one test\n",[153,1400,1402],{"class":155,"line":1401},16,[153,1403,1404],{"class":167},"4. **Naming**: Variables and functions follow our conventions (camelCase for JS, snake_case for Python)\n",[153,1406,1408],{"class":155,"line":1407},17,[153,1409,1410],{"class":167},"5. **Documentation**: Public APIs have JSDoc\u002Fdocstrings\n",[153,1412,1413],{"class":155,"line":1129},[153,1414,246],{"emptyLinePlaceholder":245},[153,1416,1418],{"class":155,"line":1417},19,[153,1419,1420],{"class":167},"Output a markdown checklist with pass\u002Ffail for each item.\n",[153,1422,1424],{"class":155,"line":1423},20,[153,1425,1426],{"class":167},"EOF\n",[138,1428,1430],{"id":1429},"version-control-benefits","Version Control Benefits",[143,1432,1434],{"className":145,"code":1433,"language":147,"meta":148,"style":148},"# Track skill changes in your regular git workflow\ngit add .claude\u002Fcommands\u002Fcode-review.md\ngit commit -m \"feat: add team code review skill with security checklist\"\n\n# Review skill changes in PRs just like code changes\ngit diff main -- .claude\u002Fcommands\u002F\n",[150,1435,1436,1441,1451,1464,1468,1473],{"__ignoreMap":148},[153,1437,1438],{"class":155,"line":156},[153,1439,1440],{"class":211},"# Track skill changes in your regular git workflow\n",[153,1442,1443,1445,1448],{"class":155,"line":208},[153,1444,1222],{"class":159},[153,1446,1447],{"class":167}," add",[153,1449,1450],{"class":167}," .claude\u002Fcommands\u002Fcode-review.md\n",[153,1452,1453,1455,1458,1461],{"class":155,"line":242},[153,1454,1222],{"class":159},[153,1456,1457],{"class":167}," commit",[153,1459,1460],{"class":163}," -m",[153,1462,1463],{"class":167}," \"feat: add team code review skill with security checklist\"\n",[153,1465,1466],{"class":155,"line":249},[153,1467,246],{"emptyLinePlaceholder":245},[153,1469,1470],{"class":155,"line":255},[153,1471,1472],{"class":211},"# Review skill changes in PRs just like code changes\n",[153,1474,1475,1477,1480,1483,1486],{"class":155,"line":268},[153,1476,1222],{"class":159},[153,1478,1479],{"class":167}," diff",[153,1481,1482],{"class":167}," main",[153,1484,1485],{"class":163}," --",[153,1487,1488],{"class":167}," .claude\u002Fcommands\u002F\n",[12,1490,1491,1494],{},[45,1492,1493],{},"Pros:"," Zero setup, version controlled, works offline, team reviews skill changes in PRs.",[12,1496,1497,1500],{},[45,1498,1499],{},"Cons:"," Skills are per-project. If your org has 20 repos, you need to sync skills across all of them.",[116,1502,1503],{"type":118},[12,1504,1505,1506,1508],{},"Use a Git submodule or symlink to share a single ",[150,1507,1296],{}," directory across multiple repos. This keeps skills in sync without manual copying.",[35,1510,1512],{"id":1511},"method-2-tokrepo-collections","Method 2: TokRepo Collections",[12,1514,1515,1520],{},[71,1516,1519],{"href":1517,"rel":1518},"https:\u002F\u002Ftokrepo.com",[113],"TokRepo"," lets you create a collection of skills that your entire team can install with a single command. This is ideal for organizations with multiple repositories.",[138,1522,1524],{"id":1523},"step-1-curate-your-team-collection","Step 1: Curate Your Team Collection",[12,1526,1527,1528,1533,1534,1537],{},"Browse ",[71,1529,1532],{"href":1530,"rel":1531},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fcollections\u002Fskills",[113],"TokRepo's skill library"," and pick the skills your team needs. You can also ",[71,1535,1536],{"href":1169},"create custom skills"," and publish them.",[138,1539,1541],{"id":1540},"step-2-create-an-install-script","Step 2: Create an Install Script",[143,1543,1545],{"className":145,"code":1544,"language":147,"meta":148,"style":148},"#!\u002Fbin\u002Fbash\n# team-skills-install.sh\n# Run this in any project to set up team skills\n\necho \"Installing team skills from TokRepo...\"\n\n# Project management\ntokrepo install e108cf5c-c34e-4d27-a694-66a693301e87  # GSD\n\n# Debugging\ntokrepo install 78ed006e-b022-4e92-bf65-df8b53afd2f4  # Systematic Debugging\n\n# SEO (for frontend projects)\ntokrepo install cb068086-1c7d-408e-90a1-c39cfc6ffe87  # Claude SEO\n\n# Skill creation (for senior devs)\ntokrepo install 0b7c0a41-97e1-4187-9cc5-4dc32d91a9cd  # Skill Creator\n\n# Planning\ntokrepo install 034be597-c361-45a2-b143-41cce0ec8ad8  # Planning\n\necho \"Done. Run 'claude' to start using skills.\"\n",[150,1546,1547,1552,1557,1562,1566,1574,1578,1583,1597,1601,1606,1618,1622,1627,1639,1643,1648,1660,1664,1669,1681,1686],{"__ignoreMap":148},[153,1548,1549],{"class":155,"line":156},[153,1550,1551],{"class":211},"#!\u002Fbin\u002Fbash\n",[153,1553,1554],{"class":155,"line":208},[153,1555,1556],{"class":211},"# team-skills-install.sh\n",[153,1558,1559],{"class":155,"line":242},[153,1560,1561],{"class":211},"# Run this in any project to set up team skills\n",[153,1563,1564],{"class":155,"line":249},[153,1565,246],{"emptyLinePlaceholder":245},[153,1567,1568,1571],{"class":155,"line":255},[153,1569,1570],{"class":163},"echo",[153,1572,1573],{"class":167}," \"Installing team skills from TokRepo...\"\n",[153,1575,1576],{"class":155,"line":268},[153,1577,246],{"emptyLinePlaceholder":245},[153,1579,1580],{"class":155,"line":281},[153,1581,1582],{"class":211},"# Project management\n",[153,1584,1585,1588,1591,1594],{"class":155,"line":1356},[153,1586,1587],{"class":159},"tokrepo",[153,1589,1590],{"class":167}," install",[153,1592,1593],{"class":167}," e108cf5c-c34e-4d27-a694-66a693301e87",[153,1595,1596],{"class":211},"  # GSD\n",[153,1598,1599],{"class":155,"line":1362},[153,1600,246],{"emptyLinePlaceholder":245},[153,1602,1603],{"class":155,"line":1367},[153,1604,1605],{"class":211},"# Debugging\n",[153,1607,1608,1610,1612,1615],{"class":155,"line":1372},[153,1609,1587],{"class":159},[153,1611,1590],{"class":167},[153,1613,1614],{"class":167}," 78ed006e-b022-4e92-bf65-df8b53afd2f4",[153,1616,1617],{"class":211},"  # Systematic Debugging\n",[153,1619,1620],{"class":155,"line":1378},[153,1621,246],{"emptyLinePlaceholder":245},[153,1623,1624],{"class":155,"line":1383},[153,1625,1626],{"class":211},"# SEO (for frontend projects)\n",[153,1628,1629,1631,1633,1636],{"class":155,"line":1389},[153,1630,1587],{"class":159},[153,1632,1590],{"class":167},[153,1634,1635],{"class":167}," cb068086-1c7d-408e-90a1-c39cfc6ffe87",[153,1637,1638],{"class":211},"  # Claude SEO\n",[153,1640,1641],{"class":155,"line":1395},[153,1642,246],{"emptyLinePlaceholder":245},[153,1644,1645],{"class":155,"line":1401},[153,1646,1647],{"class":211},"# Skill creation (for senior devs)\n",[153,1649,1650,1652,1654,1657],{"class":155,"line":1407},[153,1651,1587],{"class":159},[153,1653,1590],{"class":167},[153,1655,1656],{"class":167}," 0b7c0a41-97e1-4187-9cc5-4dc32d91a9cd",[153,1658,1659],{"class":211},"  # Skill Creator\n",[153,1661,1662],{"class":155,"line":1129},[153,1663,246],{"emptyLinePlaceholder":245},[153,1665,1666],{"class":155,"line":1417},[153,1667,1668],{"class":211},"# Planning\n",[153,1670,1671,1673,1675,1678],{"class":155,"line":1423},[153,1672,1587],{"class":159},[153,1674,1590],{"class":167},[153,1676,1677],{"class":167}," 034be597-c361-45a2-b143-41cce0ec8ad8",[153,1679,1680],{"class":211},"  # Planning\n",[153,1682,1684],{"class":155,"line":1683},21,[153,1685,246],{"emptyLinePlaceholder":245},[153,1687,1689,1691],{"class":155,"line":1688},22,[153,1690,1570],{"class":163},[153,1692,1693],{"class":167}," \"Done. Run 'claude' to start using skills.\"\n",[138,1695,1697],{"id":1696},"step-3-share-with-your-team","Step 3: Share With Your Team",[143,1699,1701],{"className":145,"code":1700,"language":147,"meta":148,"style":148},"# Add the install script to your org's shared repo\nchmod +x team-skills-install.sh\n\n# New team members run one command\n.\u002Fteam-skills-install.sh\n",[150,1702,1703,1708,1719,1723,1728],{"__ignoreMap":148},[153,1704,1705],{"class":155,"line":156},[153,1706,1707],{"class":211},"# Add the install script to your org's shared repo\n",[153,1709,1710,1713,1716],{"class":155,"line":208},[153,1711,1712],{"class":159},"chmod",[153,1714,1715],{"class":167}," +x",[153,1717,1718],{"class":167}," team-skills-install.sh\n",[153,1720,1721],{"class":155,"line":242},[153,1722,246],{"emptyLinePlaceholder":245},[153,1724,1725],{"class":155,"line":249},[153,1726,1727],{"class":211},"# New team members run one command\n",[153,1729,1730],{"class":155,"line":255},[153,1731,1732],{"class":159},".\u002Fteam-skills-install.sh\n",[12,1734,1735,1737],{},[45,1736,1493],{}," Centralized management, one-command install, skills auto-update, works across repos.",[12,1739,1740,1742],{},[45,1741,1499],{}," Requires internet access for initial install, team members need TokRepo CLI.",[35,1744,1746],{"id":1745},"method-3-custom-skill-registry","Method 3: Custom Skill Registry",[12,1748,1749],{},"For larger organizations that need full control, self-host a skill registry on your internal infrastructure.",[138,1751,1753],{"id":1752},"architecture","Architecture",[143,1755,1758],{"className":1756,"code":1757,"language":1280},[1278],"┌─────────────────┐     ┌──────────────────┐     ┌─────────────┐\n│  Skill Authors   │────▶│  Internal Git     │────▶│  Developer   │\n│  (Senior Devs)   │     │  Registry Repo    │     │  Machines    │\n└─────────────────┘     └──────────────────┘     └─────────────┘\n                              │\n                              ▼\n                        ┌──────────────────┐\n                        │  CI\u002FCD Pipeline   │\n                        │  (validate &      │\n                        │   distribute)     │\n                        └──────────────────┘\n",[150,1759,1757],{"__ignoreMap":148},[138,1761,1763],{"id":1762},"implementation","Implementation",[143,1765,1767],{"className":145,"code":1766,"language":147,"meta":148,"style":148},"# internal-skill-registry\u002F\n# ├── skills\u002F\n# │   ├── code-review.md\n# │   ├── deploy-checklist.md\n# │   └── incident-response.md\n# ├── validate.sh          # Lint skill frontmatter\n# ├── distribute.sh        # Push to all project repos\n# └── README.md\n\n# validate.sh — ensure every skill has required frontmatter\n#!\u002Fbin\u002Fbash\nfor skill in skills\u002F*.md; do\n  if ! grep -q \"^name:\" \"$skill\"; then\n    echo \"ERROR: $skill missing 'name' field\"\n    exit 1\n  fi\ndone\necho \"All skills valid.\"\n",[150,1768,1769,1774,1779,1784,1789,1794,1799,1804,1809,1813,1818,1822,1842,1873,1886,1894,1899,1904],{"__ignoreMap":148},[153,1770,1771],{"class":155,"line":156},[153,1772,1773],{"class":211},"# internal-skill-registry\u002F\n",[153,1775,1776],{"class":155,"line":208},[153,1777,1778],{"class":211},"# ├── skills\u002F\n",[153,1780,1781],{"class":155,"line":242},[153,1782,1783],{"class":211},"# │   ├── code-review.md\n",[153,1785,1786],{"class":155,"line":249},[153,1787,1788],{"class":211},"# │   ├── deploy-checklist.md\n",[153,1790,1791],{"class":155,"line":255},[153,1792,1793],{"class":211},"# │   └── incident-response.md\n",[153,1795,1796],{"class":155,"line":268},[153,1797,1798],{"class":211},"# ├── validate.sh          # Lint skill frontmatter\n",[153,1800,1801],{"class":155,"line":281},[153,1802,1803],{"class":211},"# ├── distribute.sh        # Push to all project repos\n",[153,1805,1806],{"class":155,"line":1356},[153,1807,1808],{"class":211},"# └── README.md\n",[153,1810,1811],{"class":155,"line":1362},[153,1812,246],{"emptyLinePlaceholder":245},[153,1814,1815],{"class":155,"line":1367},[153,1816,1817],{"class":211},"# validate.sh — ensure every skill has required frontmatter\n",[153,1819,1820],{"class":155,"line":1372},[153,1821,1551],{"class":211},[153,1823,1824,1827,1830,1833,1836,1839],{"class":155,"line":1378},[153,1825,1826],{"class":171},"for",[153,1828,1829],{"class":313}," skill ",[153,1831,1832],{"class":171},"in",[153,1834,1835],{"class":167}," skills\u002F*.md",[153,1837,1838],{"class":313},"; ",[153,1840,1841],{"class":171},"do\n",[153,1843,1844,1847,1850,1853,1856,1859,1862,1865,1868,1870],{"class":155,"line":1383},[153,1845,1846],{"class":171},"  if",[153,1848,1849],{"class":171}," !",[153,1851,1852],{"class":159}," grep",[153,1854,1855],{"class":163}," -q",[153,1857,1858],{"class":167}," \"^name:\"",[153,1860,1861],{"class":167}," \"",[153,1863,1864],{"class":313},"$skill",[153,1866,1867],{"class":167},"\"",[153,1869,1838],{"class":313},[153,1871,1872],{"class":171},"then\n",[153,1874,1875,1878,1881,1883],{"class":155,"line":1389},[153,1876,1877],{"class":163},"    echo",[153,1879,1880],{"class":167}," \"ERROR: ",[153,1882,1864],{"class":313},[153,1884,1885],{"class":167}," missing 'name' field\"\n",[153,1887,1888,1891],{"class":155,"line":1395},[153,1889,1890],{"class":163},"    exit",[153,1892,1893],{"class":163}," 1\n",[153,1895,1896],{"class":155,"line":1401},[153,1897,1898],{"class":171},"  fi\n",[153,1900,1901],{"class":155,"line":1407},[153,1902,1903],{"class":171},"done\n",[153,1905,1906,1908],{"class":155,"line":1129},[153,1907,1570],{"class":163},[153,1909,1910],{"class":167}," \"All skills valid.\"\n",[143,1912,1914],{"className":145,"code":1913,"language":147,"meta":148,"style":148},"# distribute.sh — sync skills to all team repos\n#!\u002Fbin\u002Fbash\nREPOS=(\"app-frontend\" \"app-backend\" \"app-mobile\" \"shared-lib\")\n\nfor repo in \"${REPOS[@]}\"; do\n  echo \"Syncing skills to $repo...\"\n  cp -r skills\u002F \"..\u002F$repo\u002F.claude\u002Fcommands\u002F\"\ndone\n",[150,1915,1916,1921,1925,1951,1955,1982,1996,2015],{"__ignoreMap":148},[153,1917,1918],{"class":155,"line":156},[153,1919,1920],{"class":211},"# distribute.sh — sync skills to all team repos\n",[153,1922,1923],{"class":155,"line":208},[153,1924,1551],{"class":211},[153,1926,1927,1930,1933,1936,1939,1942,1945,1948],{"class":155,"line":242},[153,1928,1929],{"class":313},"REPOS",[153,1931,1932],{"class":171},"=",[153,1934,1935],{"class":313},"(",[153,1937,1938],{"class":167},"\"app-frontend\"",[153,1940,1941],{"class":167}," \"app-backend\"",[153,1943,1944],{"class":167}," \"app-mobile\"",[153,1946,1947],{"class":167}," \"shared-lib\"",[153,1949,1950],{"class":313},")\n",[153,1952,1953],{"class":155,"line":249},[153,1954,246],{"emptyLinePlaceholder":245},[153,1956,1957,1959,1962,1964,1967,1969,1972,1975,1978,1980],{"class":155,"line":255},[153,1958,1826],{"class":171},[153,1960,1961],{"class":313}," repo ",[153,1963,1832],{"class":171},[153,1965,1966],{"class":167}," \"${",[153,1968,1929],{"class":313},[153,1970,1971],{"class":167},"[",[153,1973,1974],{"class":171},"@",[153,1976,1977],{"class":167},"]}\"",[153,1979,1838],{"class":313},[153,1981,1841],{"class":171},[153,1983,1984,1987,1990,1993],{"class":155,"line":268},[153,1985,1986],{"class":163},"  echo",[153,1988,1989],{"class":167}," \"Syncing skills to ",[153,1991,1992],{"class":313},"$repo",[153,1994,1995],{"class":167},"...\"\n",[153,1997,1998,2001,2004,2007,2010,2012],{"class":155,"line":281},[153,1999,2000],{"class":159},"  cp",[153,2002,2003],{"class":163}," -r",[153,2005,2006],{"class":167}," skills\u002F",[153,2008,2009],{"class":167}," \"..\u002F",[153,2011,1992],{"class":313},[153,2013,2014],{"class":167},"\u002F.claude\u002Fcommands\u002F\"\n",[153,2016,2017],{"class":155,"line":1356},[153,2018,1903],{"class":171},[12,2020,2021,2023],{},[45,2022,1493],{}," Full control, works behind firewalls, custom validation, audit trail.",[12,2025,2026,2028],{},[45,2027,1499],{}," Maintenance overhead, need to build tooling, no community skills.",[35,2030,2032],{"id":2031},"recommended-team-skill-stack","Recommended Team Skill Stack",[12,2034,2035],{},"Based on real team deployments, here are five skills every development team should install:",[138,2037,2039],{"id":2038},"_1-get-shit-done-gsd","1. Get Shit Done (GSD)",[12,2041,2042],{},"The project management backbone. Breaks work into milestones and phases with persistent tracking.",[143,2044,2046],{"className":145,"code":2045,"language":147,"meta":148,"style":148},"tokrepo install e108cf5c-c34e-4d27-a694-66a693301e87\n",[150,2047,2048],{"__ignoreMap":148},[153,2049,2050,2052,2054],{"class":155,"line":156},[153,2051,1587],{"class":159},[153,2053,1590],{"class":167},[153,2055,2056],{"class":167}," e108cf5c-c34e-4d27-a694-66a693301e87\n",[12,2058,2059],{},[71,2060,2063],{"href":2061,"rel":2062},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002Fe108cf5c-c34e-4d27-a694-66a693301e87",[113],"View on TokRepo →",[138,2065,2067],{"id":2066},"_2-systematic-debugging","2. Systematic Debugging",[12,2069,2070],{},"Structured 4-phase debugging: reproduce, isolate, diagnose, fix. Prevents random trial-and-error.",[143,2072,2074],{"className":145,"code":2073,"language":147,"meta":148,"style":148},"tokrepo install 78ed006e-b022-4e92-bf65-df8b53afd2f4\n",[150,2075,2076],{"__ignoreMap":148},[153,2077,2078,2080,2082],{"class":155,"line":156},[153,2079,1587],{"class":159},[153,2081,1590],{"class":167},[153,2083,2084],{"class":167}," 78ed006e-b022-4e92-bf65-df8b53afd2f4\n",[12,2086,2087],{},[71,2088,2063],{"href":2089,"rel":2090},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F78ed006e-b022-4e92-bf65-df8b53afd2f4",[113],[138,2092,2094],{"id":2093},"_3-claude-seo","3. Claude SEO",[12,2096,2097],{},"Comprehensive SEO audits — keyword research, on-page analysis, technical checks.",[143,2099,2101],{"className":145,"code":2100,"language":147,"meta":148,"style":148},"tokrepo install cb068086-1c7d-408e-90a1-c39cfc6ffe87\n",[150,2102,2103],{"__ignoreMap":148},[153,2104,2105,2107,2109],{"class":155,"line":156},[153,2106,1587],{"class":159},[153,2108,1590],{"class":167},[153,2110,2111],{"class":167}," cb068086-1c7d-408e-90a1-c39cfc6ffe87\n",[12,2113,2114],{},[71,2115,2063],{"href":2116,"rel":2117},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002Fcb068086-1c7d-408e-90a1-c39cfc6ffe87",[113],[138,2119,2121],{"id":2120},"_4-skill-creator","4. Skill Creator",[12,2123,2124],{},"Meta-skill for building team-specific skills. Senior devs use this to package tribal knowledge.",[143,2126,2128],{"className":145,"code":2127,"language":147,"meta":148,"style":148},"tokrepo install 0b7c0a41-97e1-4187-9cc5-4dc32d91a9cd\n",[150,2129,2130],{"__ignoreMap":148},[153,2131,2132,2134,2136],{"class":155,"line":156},[153,2133,1587],{"class":159},[153,2135,1590],{"class":167},[153,2137,2138],{"class":167}," 0b7c0a41-97e1-4187-9cc5-4dc32d91a9cd\n",[12,2140,2141],{},[71,2142,2063],{"href":2143,"rel":2144},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F0b7c0a41-97e1-4187-9cc5-4dc32d91a9cd",[113],[138,2146,2148],{"id":2147},"_5-planning-with-files","5. Planning with Files",[12,2150,2151],{},"Persistent planning that survives across Claude Code sessions. Essential for multi-day tasks.",[143,2153,2155],{"className":145,"code":2154,"language":147,"meta":148,"style":148},"tokrepo install 034be597-c361-45a2-b143-41cce0ec8ad8\n",[150,2156,2157],{"__ignoreMap":148},[153,2158,2159,2161,2163],{"class":155,"line":156},[153,2160,1587],{"class":159},[153,2162,1590],{"class":167},[153,2164,2165],{"class":167}," 034be597-c361-45a2-b143-41cce0ec8ad8\n",[12,2167,2168],{},[71,2169,2063],{"href":2170,"rel":2171},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F034be597-c361-45a2-b143-41cce0ec8ad8",[113],[35,2173,2175],{"id":2174},"case-study-5-person-team-setup","Case Study: 5-Person Team Setup",[12,2177,2178],{},"Here's how a real 5-person startup team standardized their Claude Code workflow in one afternoon.",[138,2180,2182],{"id":2181},"the-team","The Team",[809,2184,2185,2198],{},[812,2186,2187],{},[815,2188,2189,2192,2195],{},[818,2190,2191],{},"Role",[818,2193,2194],{},"Name",[818,2196,2197],{},"Focus",[828,2199,2200,2211,2222,2233,2244],{},[815,2201,2202,2205,2208],{},[833,2203,2204],{},"Tech Lead",[833,2206,2207],{},"Sarah",[833,2209,2210],{},"Architecture, code review",[815,2212,2213,2216,2219],{},[833,2214,2215],{},"Frontend",[833,2217,2218],{},"Jake",[833,2220,2221],{},"React, Next.js",[815,2223,2224,2227,2230],{},[833,2225,2226],{},"Backend",[833,2228,2229],{},"Mira",[833,2231,2232],{},"Go, PostgreSQL",[815,2234,2235,2238,2241],{},[833,2236,2237],{},"Full-Stack",[833,2239,2240],{},"Alex",[833,2242,2243],{},"Features, integrations",[815,2245,2246,2249,2252],{},[833,2247,2248],{},"Junior Dev",[833,2250,2251],{},"Tom",[833,2253,2254],{},"Bug fixes, tests",[138,2256,2258],{"id":2257},"step-1-tech-lead-creates-the-skill-set-30-min","Step 1: Tech Lead Creates the Skill Set (30 min)",[12,2260,2261],{},"Sarah identified the team's top 5 pain points and mapped each to a skill:",[143,2263,2265],{"className":145,"code":2264,"language":147,"meta":148,"style":148},"# Sarah's laptop\nmkdir -p .claude\u002Fcommands\n\n# 1. Install community skills\ntokrepo install e108cf5c-c34e-4d27-a694-66a693301e87  # GSD\ntokrepo install 78ed006e-b022-4e92-bf65-df8b53afd2f4  # Systematic Debugging\ntokrepo install 034be597-c361-45a2-b143-41cce0ec8ad8  # Planning\n\n# 2. Create team-specific skills\ncat > .claude\u002Fcommands\u002Four-pr-review.md \u003C\u003C 'EOF'\n---\nname: PR Review (Team Standard)\ndescription: Review code against our team's 12-point checklist\n---\nReview the current diff. Check for:\n1. No console.log in production code\n2. All API endpoints have rate limiting\n3. Database queries use parameterized statements\n4. React components have error boundaries\n5. Go functions return errors (no panic)\n...\nEOF\n",[150,2266,2267,2272,2280,2284,2289,2299,2309,2319,2323,2328,2341,2345,2350,2355,2359,2364,2369,2374,2379,2384,2389,2394],{"__ignoreMap":148},[153,2268,2269],{"class":155,"line":156},[153,2270,2271],{"class":211},"# Sarah's laptop\n",[153,2273,2274,2276,2278],{"class":155,"line":208},[153,2275,1312],{"class":159},[153,2277,366],{"class":163},[153,2279,1317],{"class":167},[153,2281,2282],{"class":155,"line":242},[153,2283,246],{"emptyLinePlaceholder":245},[153,2285,2286],{"class":155,"line":249},[153,2287,2288],{"class":211},"# 1. Install community skills\n",[153,2290,2291,2293,2295,2297],{"class":155,"line":255},[153,2292,1587],{"class":159},[153,2294,1590],{"class":167},[153,2296,1593],{"class":167},[153,2298,1596],{"class":211},[153,2300,2301,2303,2305,2307],{"class":155,"line":268},[153,2302,1587],{"class":159},[153,2304,1590],{"class":167},[153,2306,1614],{"class":167},[153,2308,1617],{"class":211},[153,2310,2311,2313,2315,2317],{"class":155,"line":281},[153,2312,1587],{"class":159},[153,2314,1590],{"class":167},[153,2316,1677],{"class":167},[153,2318,1680],{"class":211},[153,2320,2321],{"class":155,"line":1356},[153,2322,246],{"emptyLinePlaceholder":245},[153,2324,2325],{"class":155,"line":1362},[153,2326,2327],{"class":211},"# 2. Create team-specific skills\n",[153,2329,2330,2332,2334,2337,2339],{"class":155,"line":1367},[153,2331,1331],{"class":159},[153,2333,1334],{"class":171},[153,2335,2336],{"class":167}," .claude\u002Fcommands\u002Four-pr-review.md",[153,2338,1340],{"class":171},[153,2340,1343],{"class":167},[153,2342,2343],{"class":155,"line":1372},[153,2344,1348],{"class":167},[153,2346,2347],{"class":155,"line":1378},[153,2348,2349],{"class":167},"name: PR Review (Team Standard)\n",[153,2351,2352],{"class":155,"line":1383},[153,2353,2354],{"class":167},"description: Review code against our team's 12-point checklist\n",[153,2356,2357],{"class":155,"line":1389},[153,2358,1348],{"class":167},[153,2360,2361],{"class":155,"line":1395},[153,2362,2363],{"class":167},"Review the current diff. Check for:\n",[153,2365,2366],{"class":155,"line":1401},[153,2367,2368],{"class":167},"1. No console.log in production code\n",[153,2370,2371],{"class":155,"line":1407},[153,2372,2373],{"class":167},"2. All API endpoints have rate limiting\n",[153,2375,2376],{"class":155,"line":1129},[153,2377,2378],{"class":167},"3. Database queries use parameterized statements\n",[153,2380,2381],{"class":155,"line":1417},[153,2382,2383],{"class":167},"4. React components have error boundaries\n",[153,2385,2386],{"class":155,"line":1423},[153,2387,2388],{"class":167},"5. Go functions return errors (no panic)\n",[153,2390,2391],{"class":155,"line":1683},[153,2392,2393],{"class":167},"...\n",[153,2395,2396],{"class":155,"line":1688},[153,2397,1426],{"class":167},[138,2399,2401],{"id":2400},"step-2-team-installs-skills-5-min-each","Step 2: Team Installs Skills (5 min each)",[143,2403,2405],{"className":145,"code":2404,"language":147,"meta":148,"style":148},"# Each team member runs:\ngit pull origin main\n# Skills are already in .claude\u002Fcommands\u002F — done.\n",[150,2406,2407,2412,2424],{"__ignoreMap":148},[153,2408,2409],{"class":155,"line":156},[153,2410,2411],{"class":211},"# Each team member runs:\n",[153,2413,2414,2416,2418,2421],{"class":155,"line":208},[153,2415,1222],{"class":159},[153,2417,236],{"class":167},[153,2419,2420],{"class":167}," origin",[153,2422,2423],{"class":167}," main\n",[153,2425,2426],{"class":155,"line":242},[153,2427,2428],{"class":211},"# Skills are already in .claude\u002Fcommands\u002F — done.\n",[138,2430,2432],{"id":2431},"step-3-measure-the-impact-2-weeks-later","Step 3: Measure the Impact (2 weeks later)",[809,2434,2435,2451],{},[812,2436,2437],{},[815,2438,2439,2442,2445,2448],{},[818,2440,2441],{},"Metric",[818,2443,2444],{},"Before Skills",[818,2446,2447],{},"After Skills",[818,2449,2450],{},"Change",[828,2452,2453,2467,2480,2494],{},[815,2454,2455,2458,2461,2464],{},[833,2456,2457],{},"PR review time",[833,2459,2460],{},"45 min",[833,2462,2463],{},"15 min",[833,2465,2466],{},"-67%",[815,2468,2469,2472,2475,2478],{},[833,2470,2471],{},"Bug escape rate",[833,2473,2474],{},"3\u002Fweek",[833,2476,2477],{},"1\u002Fweek",[833,2479,2466],{},[815,2481,2482,2485,2488,2491],{},[833,2483,2484],{},"Onboarding time",[833,2486,2487],{},"2 weeks",[833,2489,2490],{},"3 days",[833,2492,2493],{},"-79%",[815,2495,2496,2499,2502,2505],{},[833,2497,2498],{},"Code style violations",[833,2500,2501],{},"12\u002FPR",[833,2503,2504],{},"2\u002FPR",[833,2506,2507],{},"-83%",[12,2509,2510],{},"The junior developer (Tom) benefited the most — the debugging skill taught him a systematic approach he hadn't learned yet, and the PR review skill caught issues before senior devs had to review.",[35,2512,2514],{"id":2513},"faq","FAQ",[138,2516,2518],{"id":2517},"how-do-i-handle-skill-conflicts-between-team-members","How do I handle skill conflicts between team members?",[12,2520,2521,2522,2524],{},"Use Git's normal merge workflow. If two people edit the same skill, resolve the conflict in a PR review. For community skills installed via TokRepo, pin to a specific version by keeping a copy in ",[150,2523,1296],{}," rather than relying on auto-updates.",[138,2526,2528],{"id":2527},"can-i-restrict-which-skills-team-members-can-install","Can I restrict which skills team members can install?",[12,2530,2531,2532,1293,2534,726],{},"Not natively. However, with Method 3 (custom registry), you can implement an allowlist. For Method 1 (Git repo), use a pre-commit hook that rejects unknown ",[150,2533,1292],{},[150,2535,1296],{},[143,2537,2539],{"className":145,"code":2538,"language":147,"meta":148,"style":148},"# .husky\u002Fpre-commit\nALLOWED_SKILLS=\"code-review.md pr-description.md debug-production.md\"\nfor file in $(git diff --cached --name-only -- .claude\u002Fcommands\u002F); do\n  basename=$(basename \"$file\")\n  if ! echo \"$ALLOWED_SKILLS\" | grep -q \"$basename\"; then\n    echo \"ERROR: Unapproved skill: $basename\"\n    exit 1\n  fi\ndone\n",[150,2540,2541,2546,2556,2588,2610,2643,2655,2661,2665],{"__ignoreMap":148},[153,2542,2543],{"class":155,"line":156},[153,2544,2545],{"class":211},"# .husky\u002Fpre-commit\n",[153,2547,2548,2551,2553],{"class":155,"line":208},[153,2549,2550],{"class":313},"ALLOWED_SKILLS",[153,2552,1932],{"class":171},[153,2554,2555],{"class":167},"\"code-review.md pr-description.md debug-production.md\"\n",[153,2557,2558,2560,2563,2565,2568,2570,2572,2575,2578,2580,2583,2586],{"class":155,"line":242},[153,2559,1826],{"class":171},[153,2561,2562],{"class":313}," file ",[153,2564,1832],{"class":171},[153,2566,2567],{"class":313}," $(",[153,2569,1222],{"class":159},[153,2571,1479],{"class":167},[153,2573,2574],{"class":163}," --cached",[153,2576,2577],{"class":163}," --name-only",[153,2579,1485],{"class":163},[153,2581,2582],{"class":167}," .claude\u002Fcommands\u002F",[153,2584,2585],{"class":313},"); ",[153,2587,1841],{"class":171},[153,2589,2590,2593,2595,2598,2601,2603,2606,2608],{"class":155,"line":249},[153,2591,2592],{"class":313},"  basename",[153,2594,1932],{"class":171},[153,2596,2597],{"class":313},"$(",[153,2599,2600],{"class":159},"basename",[153,2602,1861],{"class":167},[153,2604,2605],{"class":313},"$file",[153,2607,1867],{"class":167},[153,2609,1950],{"class":313},[153,2611,2612,2614,2616,2619,2621,2624,2626,2628,2630,2632,2634,2637,2639,2641],{"class":155,"line":255},[153,2613,1846],{"class":171},[153,2615,1849],{"class":171},[153,2617,2618],{"class":163}," echo",[153,2620,1861],{"class":167},[153,2622,2623],{"class":313},"$ALLOWED_SKILLS",[153,2625,1867],{"class":167},[153,2627,172],{"class":171},[153,2629,1852],{"class":159},[153,2631,1855],{"class":163},[153,2633,1861],{"class":167},[153,2635,2636],{"class":313},"$basename",[153,2638,1867],{"class":167},[153,2640,1838],{"class":313},[153,2642,1872],{"class":171},[153,2644,2645,2647,2650,2652],{"class":155,"line":268},[153,2646,1877],{"class":163},[153,2648,2649],{"class":167}," \"ERROR: Unapproved skill: ",[153,2651,2636],{"class":313},[153,2653,2654],{"class":167},"\"\n",[153,2656,2657,2659],{"class":155,"line":281},[153,2658,1890],{"class":163},[153,2660,1893],{"class":163},[153,2662,2663],{"class":155,"line":1356},[153,2664,1898],{"class":171},[153,2666,2667],{"class":155,"line":1362},[153,2668,1903],{"class":171},[138,2670,2672],{"id":2671},"do-skills-work-the-same-for-every-team-member","Do skills work the same for every team member?",[12,2674,2675],{},"Yes, given the same skill file and the same Claude Code version. The skill defines the behavior; the model follows it deterministically. Minor variation can occur based on Claude model version, but the structure and checklist items remain consistent.",[35,2677,1020],{"id":1019},[19,2679,2680,2685,2692,2697],{},[22,2681,2682,2684],{},[71,2683,1258],{"href":1169}," — build custom skills for your team",[22,2686,2687,2691],{},[71,2688,2690],{"href":2689},"\u002Fguide\u002Fbest-claude-code-skills","15 Best Claude Code Skills"," — browse our curated top picks",[22,2693,2694,2696],{},[71,2695,1263],{"href":1262}," — understand which extension type fits team workflows",[22,2698,2699,2703],{},[71,2700,2702],{"href":1530,"rel":2701},[113],"Browse TokRepo Collections"," — discover 500+ ready-to-install skills",[1074,2705,2706],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":148,"searchDepth":208,"depth":208,"links":2708},[2709,2710,2711,2716,2721,2725,2732,2738,2743],{"id":78,"depth":208,"text":79},{"id":1174,"depth":208,"text":1175},{"id":1266,"depth":208,"text":1267,"children":2712},[2713,2714,2715],{"id":1273,"depth":242,"text":1274},{"id":1285,"depth":242,"text":1286},{"id":1429,"depth":242,"text":1430},{"id":1511,"depth":208,"text":1512,"children":2717},[2718,2719,2720],{"id":1523,"depth":242,"text":1524},{"id":1540,"depth":242,"text":1541},{"id":1696,"depth":242,"text":1697},{"id":1745,"depth":208,"text":1746,"children":2722},[2723,2724],{"id":1752,"depth":242,"text":1753},{"id":1762,"depth":242,"text":1763},{"id":2031,"depth":208,"text":2032,"children":2726},[2727,2728,2729,2730,2731],{"id":2038,"depth":242,"text":2039},{"id":2066,"depth":242,"text":2067},{"id":2093,"depth":242,"text":2094},{"id":2120,"depth":242,"text":2121},{"id":2147,"depth":242,"text":2148},{"id":2174,"depth":208,"text":2175,"children":2733},[2734,2735,2736,2737],{"id":2181,"depth":242,"text":2182},{"id":2257,"depth":242,"text":2258},{"id":2400,"depth":242,"text":2401},{"id":2431,"depth":242,"text":2432},{"id":2513,"depth":208,"text":2514,"children":2739},[2740,2741,2742],{"id":2517,"depth":242,"text":2518},{"id":2527,"depth":242,"text":2528},{"id":2671,"depth":242,"text":2672},{"id":1019,"depth":208,"text":1020},"use-case","Learn three methods to standardize your team's AI coding workflow with shared agent skills — Git repos, TokRepo collections, and self-hosted registries.","三种方式为开发团队标准化 AI 编程工作流——Git 仓库、TokRepo 集合和自建注册中心。",[2748,2750,2752,2755,2758],{"q":2518,"a":2749},"Use Git's normal merge workflow — if two people edit the same skill, resolve the conflict in a PR review like any other file. For community skills installed via TokRepo, pin to a specific version by keeping a copy in .claude\u002Fcommands\u002F instead of relying on auto-updates.",{"q":2528,"a":2751},"Not natively in Claude Code, but with Method 3 (custom registry) you can implement an allowlist. For Method 1 (Git repo), add a pre-commit hook (e.g., .husky\u002Fpre-commit) that rejects unknown .md files in .claude\u002Fcommands\u002F based on an ALLOWED_SKILLS list.",{"q":2753,"a":2754},"What's the fastest way to onboard a new developer to our team skills?","With Method 1, new hires just run git clone and skills in .claude\u002Fcommands\u002F are immediately available when they start Claude Code. Teams report onboarding dropped from 2 weeks to 3 days after standardizing on shared skills like GSD, Systematic Debugging, and Planning with Files.",{"q":2756,"a":2757},"Do shared skills work the same for every team member?","Yes, given the same skill file and Claude Code version — the skill defines deterministic behavior and the model follows its checklist items. Minor variation can occur across Claude model versions, but structure and checks remain consistent across the entire team.",{"q":2759,"a":2760},"Which skills should every dev team install first?","Install GSD (project management), Systematic Debugging (4-phase root cause), Planning with Files (cross-session memory), Skill Creator (for building team-specific skills), and Claude SEO. These five cover planning, debugging, persistence, customization, and launch quality.","\u002Fguide\u002Fimages\u002Fagent-skills-for-teams-hero.svg",{},"\u002Fen\u002Fguide\u002Fagent-skills-for-teams","2026-04-12",{"title":1143,"description":2745},"en\u002Fguide\u002Fagent-skills-for-teams",[2768,2769,2770,2771],"team","claude-code","skill","workflow","如何为开发团队配置共享 Agent Skills","Set up shared agent skills for your development team by committing skill Markdown files to your project's .claude\u002Fcommands\u002F directory (Method 1: Git), using TokRepo install scripts for cross-repo distribution (Method 2), or self-hosting an internal skill registry with validation and CI\u002FCD sync (Method 3) — standardizing code review, debugging, and onboarding across every team member.","Hoi3Wsua8jXdKxlQgtVAhPM4-fVM1PYVcZ-aqAKYvEc",{"id":2776,"title":2777,"answer":6,"answerZh":6,"author":7,"body":2778,"category":3701,"description":3702,"descriptionZh":3703,"extension":1109,"faqs":3704,"faqsZh":6,"image":3719,"meta":3720,"navigation":245,"path":3721,"publishedAt":2764,"readTime":1378,"seo":3722,"stem":3723,"tags":3724,"titleZh":3727,"tldr":3728,"tldrZh":6,"updatedAt":2764,"__hash__":3729},"docs_en\u002Fen\u002Fguide\u002Fbest-claude-code-skills.md","15 Best Claude Code Skills in 2026 — Tested & Ranked",{"type":9,"value":2779,"toc":3670},[2780,2783,2785,2798,2802,2815,2823,2827,2829,2835,2841,2846,2858,2868,2873,2876,2880,2885,2890,2894,2908,2914,2920,2922,2926,2931,2936,2940,2952,2957,2962,2964,2968,2973,2978,2982,2994,2999,3004,3006,3010,3015,3020,3024,3036,3041,3046,3048,3052,3060,3065,3069,3081,3086,3091,3093,3097,3102,3111,3115,3129,3134,3140,3142,3146,3151,3156,3160,3174,3179,3185,3187,3191,3196,3201,3205,3219,3224,3230,3232,3236,3241,3246,3250,3264,3270,3272,3276,3281,3286,3290,3304,3312,3318,3320,3324,3329,3334,3338,3352,3358,3360,3364,3369,3374,3378,3392,3398,3400,3404,3409,3414,3418,3432,3438,3440,3444,3449,3454,3458,3472,3478,3480,3484,3489,3493,3496,3501,3521,3526,3546,3551,3575,3577,3581,3592,3596,3602,3606,3609,3613,3625,3629,3639,3641,3667],[12,2781,2782],{},"Learn how to supercharge Claude Code with 15 tested agent skills that automate code review, debugging, SEO, video production, and team workflows. Each skill below was installed and tested on real projects — we show you exactly what it does, when to use it, and how to install it in under 10 seconds.",[35,2784,79],{"id":78},[19,2786,2787,2792,2795],{},[22,2788,2789,1160],{},[71,2790,1159],{"href":1157,"rel":2791},[113],[22,2793,2794],{},"A project directory where you want skills active",[22,2796,2797],{},"Basic familiarity with the terminal",[35,2799,2801],{"id":2800},"what-are-agent-skills","What Are Agent Skills?",[12,2803,2804,2805,2807,2808,2810,2811,2814],{},"Agent skills are Markdown files that teach Claude Code how to perform specific tasks. Drop a ",[150,2806,1292],{}," file into ",[150,2809,1296],{}," or install one from ",[71,2812,1519],{"href":1530,"rel":2813},[113],", and Claude gains a new capability — no code, no MCP server, no configuration beyond the file itself.",[12,2816,2817,2818,2820,2821,667],{},"If you're new to skills, read ",[71,2819,1258],{"href":1169}," first. For a comparison with MCP servers and rules, see ",[71,2822,1263],{"href":1262},[35,2824,2826],{"id":2825},"the-15-best-claude-code-skills","The 15 Best Claude Code Skills",[138,2828,2039],{"id":2038},[12,2830,2831,2834],{},[45,2832,2833],{},"What it does:"," A complete project management framework inside Claude Code. Breaks large projects into milestones, phases, and tasks — then executes them with atomic commits and verification at each step.",[12,2836,2837,2840],{},[45,2838,2839],{},"Best for:"," Solo developers managing complex multi-day projects without losing context across sessions.",[12,2842,2843],{},[45,2844,2845],{},"Install:",[143,2847,2848],{"className":145,"code":2045,"language":147,"meta":148,"style":148},[150,2849,2850],{"__ignoreMap":148},[153,2851,2852,2854,2856],{"class":155,"line":156},[153,2853,1587],{"class":159},[153,2855,1590],{"class":167},[153,2857,2056],{"class":167},[12,2859,2860,2863,2864,2867],{},[45,2861,2862],{},"Why it ranks #1:"," GSD solves the biggest Claude Code pain point — losing context on large projects. It creates persistent ",[150,2865,2866],{},".planning\u002F"," directories with roadmaps, phase plans, and progress tracking that survive across sessions. 48,600+ GitHub stars speak for themselves.",[12,2869,2870],{},[71,2871,2063],{"href":2061,"rel":2872},[113],[2874,2875],"hr",{},[138,2877,2879],{"id":2878},"_2-vercel-skills-agent-skill-ecosystem","2. Vercel Skills — Agent Skill Ecosystem",[12,2881,2882,2884],{},[45,2883,2833],{}," A curated collection of 13,000+ community-contributed skills covering Next.js, React, deployment, and full-stack development patterns.",[12,2886,2887,2889],{},[45,2888,2839],{}," Frontend and full-stack developers working with the Vercel ecosystem.",[12,2891,2892],{},[45,2893,2845],{},[143,2895,2897],{"className":145,"code":2896,"language":147,"meta":148,"style":148},"tokrepo install d1eba6f1-5166-4762-bbbd-cf00f14892b7\n",[150,2898,2899],{"__ignoreMap":148},[153,2900,2901,2903,2905],{"class":155,"line":156},[153,2902,1587],{"class":159},[153,2904,1590],{"class":167},[153,2906,2907],{"class":167}," d1eba6f1-5166-4762-bbbd-cf00f14892b7\n",[12,2909,2910,2913],{},[45,2911,2912],{},"Why it ranks high:"," The sheer breadth — over 13,000 skills from the community means there's likely one for your exact use case. Think of it as an npm for Claude Code skills.",[12,2915,2916],{},[71,2917,2063],{"href":2918,"rel":2919},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002Fd1eba6f1-5166-4762-bbbd-cf00f14892b7",[113],[2874,2921],{},[138,2923,2925],{"id":2924},"_3-agent-skill-creator","3. Agent Skill Creator",[12,2927,2928,2930],{},[45,2929,2833],{}," A meta-skill that helps you create new skills. Guides you through writing the frontmatter, triggers, instructions, and testing — then optionally publishes to TokRepo.",[12,2932,2933,2935],{},[45,2934,2839],{}," Anyone who wants to package their prompts into reusable, shareable skills.",[12,2937,2938],{},[45,2939,2845],{},[143,2941,2942],{"className":145,"code":2127,"language":147,"meta":148,"style":148},[150,2943,2944],{"__ignoreMap":148},[153,2945,2946,2948,2950],{"class":155,"line":156},[153,2947,1587],{"class":159},[153,2949,1590],{"class":167},[153,2951,2138],{"class":167},[12,2953,2954,2956],{},[45,2955,2912],{}," Once you've used 5-10 skills, you'll want to create your own. This skill makes the process structured and repeatable, with 660+ stars on GitHub.",[12,2958,2959],{},[71,2960,2063],{"href":2143,"rel":2961},[113],[2874,2963],{},[138,2965,2967],{"id":2966},"_4-claude-seo-complete-seo-skill","4. Claude SEO — Complete SEO Skill",[12,2969,2970,2972],{},[45,2971,2833],{}," Runs comprehensive SEO audits on your website — keyword research, on-page analysis, content gap detection, technical checks, and competitor comparison.",[12,2974,2975,2977],{},[45,2976,2839],{}," Developers and marketers who want SEO analysis without leaving the terminal.",[12,2979,2980],{},[45,2981,2845],{},[143,2983,2984],{"className":145,"code":2100,"language":147,"meta":148,"style":148},[150,2985,2986],{"__ignoreMap":148},[153,2987,2988,2990,2992],{"class":155,"line":156},[153,2989,1587],{"class":159},[153,2991,1590],{"class":167},[153,2993,2111],{"class":167},[12,2995,2996,2998],{},[45,2997,2912],{}," SEO is one of those things most developers know they should do but never get around to. This skill makes it a single command — 4,000+ GitHub stars confirm the demand.",[12,3000,3001],{},[71,3002,2063],{"href":2116,"rel":3003},[113],[2874,3005],{},[138,3007,3009],{"id":3008},"_5-systematic-debugging-4-phase-root-cause-analysis","5. Systematic Debugging — 4-Phase Root Cause Analysis",[12,3011,3012,3014],{},[45,3013,2833],{}," Applies a structured debugging methodology: reproduce → isolate → diagnose → fix. Manages debug sessions with persistent state, checkpoints, and hypothesis tracking.",[12,3016,3017,3019],{},[45,3018,2839],{}," Debugging complex bugs that span multiple files or involve race conditions.",[12,3021,3022],{},[45,3023,2845],{},[143,3025,3026],{"className":145,"code":2073,"language":147,"meta":148,"style":148},[150,3027,3028],{"__ignoreMap":148},[153,3029,3030,3032,3034],{"class":155,"line":156},[153,3031,1587],{"class":159},[153,3033,1590],{"class":167},[153,3035,2084],{"class":167},[12,3037,3038,3040],{},[45,3039,2912],{}," Instead of Claude randomly trying fixes, this skill forces a scientific approach. Each hypothesis is logged, tested, and either confirmed or rejected. Saves hours on hard-to-reproduce bugs.",[12,3042,3043],{},[71,3044,2063],{"href":2089,"rel":3045},[113],[2874,3047],{},[138,3049,3051],{"id":3050},"_6-planning-with-files-persistent-planning-skill","6. Planning with Files — Persistent Planning Skill",[12,3053,3054,3056,3057,3059],{},[45,3055,2833],{}," Creates and maintains planning files (",[150,3058,2866],{},") for complex tasks. Tracks goals, progress, blockers, and decisions across multiple Claude Code sessions.",[12,3061,3062,3064],{},[45,3063,2839],{}," Multi-session projects where you need Claude to \"remember\" what was planned and decided.",[12,3066,3067],{},[45,3068,2845],{},[143,3070,3071],{"className":145,"code":2154,"language":147,"meta":148,"style":148},[150,3072,3073],{"__ignoreMap":148},[153,3074,3075,3077,3079],{"class":155,"line":156},[153,3076,1587],{"class":159},[153,3078,1590],{"class":167},[153,3080,2165],{"class":167},[12,3082,3083,3085],{},[45,3084,2912],{}," Context loss is Claude Code's biggest limitation. This skill fights it by writing plans to disk, so the next session picks up exactly where you left off.",[12,3087,3088],{},[71,3089,2063],{"href":2170,"rel":3090},[113],[2874,3092],{},[138,3094,3096],{"id":3095},"_7-infisical-secrets-management-skill","7. Infisical — Secrets Management Skill",[12,3098,3099,3101],{},[45,3100,2833],{}," Integrates Infisical secrets management into Claude Code. Pull, push, and manage environment variables and secrets without leaving your terminal.",[12,3103,3104,3106,3107,3110],{},[45,3105,2839],{}," Teams that use Infisical for secrets and want Claude to handle ",[150,3108,3109],{},".env"," files safely.",[12,3112,3113],{},[45,3114,2845],{},[143,3116,3118],{"className":145,"code":3117,"language":147,"meta":148,"style":148},"tokrepo install 41fbcc5c-aac8-4f3e-8305-cf2462809684\n",[150,3119,3120],{"__ignoreMap":148},[153,3121,3122,3124,3126],{"class":155,"line":156},[153,3123,1587],{"class":159},[153,3125,1590],{"class":167},[153,3127,3128],{"class":167}," 41fbcc5c-aac8-4f3e-8305-cf2462809684\n",[12,3130,3131,3133],{},[45,3132,2912],{}," 25,000+ GitHub stars. Security-critical — this skill ensures Claude never hardcodes secrets and always pulls from the vault.",[12,3135,3136],{},[71,3137,2063],{"href":3138,"rel":3139},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F41fbcc5c-aac8-4f3e-8305-cf2462809684",[113],[2874,3141],{},[138,3143,3145],{"id":3144},"_8-v0-by-vercel","8. v0 by Vercel",[12,3147,3148,3150],{},[45,3149,2833],{}," Generates UI components using Vercel's v0 AI. Describe what you want, get production-ready React\u002FTailwind components back.",[12,3152,3153,3155],{},[45,3154,2839],{}," Rapid prototyping of frontend components without opening a browser.",[12,3157,3158],{},[45,3159,2845],{},[143,3161,3163],{"className":145,"code":3162,"language":147,"meta":148,"style":148},"tokrepo install 4acf5c24-7eb6-44c9-b4e5-ccd1b5baf460\n",[150,3164,3165],{"__ignoreMap":148},[153,3166,3167,3169,3171],{"class":155,"line":156},[153,3168,1587],{"class":159},[153,3170,1590],{"class":167},[153,3172,3173],{"class":167}," 4acf5c24-7eb6-44c9-b4e5-ccd1b5baf460\n",[12,3175,3176,3178],{},[45,3177,2912],{}," Combines Claude Code's coding ability with v0's design sense. 8,000+ stars. Great for quickly scaffolding landing pages, dashboards, and forms.",[12,3180,3181],{},[71,3182,2063],{"href":3183,"rel":3184},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F4acf5c24-7eb6-44c9-b4e5-ccd1b5baf460",[113],[2874,3186],{},[138,3188,3190],{"id":3189},"_9-lark-cli-skill-skill-maker","9. Lark CLI Skill: Skill Maker",[12,3192,3193,3195],{},[45,3194,2833],{}," Generates new Lark\u002FFeishu CLI skills by analyzing Lark's OpenAPI spec. Point it at an API endpoint and it creates a complete, working skill.",[12,3197,3198,3200],{},[45,3199,2839],{}," Teams using Lark\u002FFeishu who want to automate any Lark API operation from Claude Code.",[12,3202,3203],{},[45,3204,2845],{},[143,3206,3208],{"className":145,"code":3207,"language":147,"meta":148,"style":148},"tokrepo install 065a3ce6-0c95-4a75-a009-ae5c90ce5ffa\n",[150,3209,3210],{"__ignoreMap":148},[153,3211,3212,3214,3216],{"class":155,"line":156},[153,3213,1587],{"class":159},[153,3215,1590],{"class":167},[153,3217,3218],{"class":167}," 065a3ce6-0c95-4a75-a009-ae5c90ce5ffa\n",[12,3220,3221,3223],{},[45,3222,2912],{}," The most viewed skill on TokRepo (64 views). If your team uses Lark, this is the skill that generates all other Lark skills — it's a skill factory.",[12,3225,3226],{},[71,3227,2063],{"href":3228,"rel":3229},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F065a3ce6-0c95-4a75-a009-ae5c90ce5ffa",[113],[2874,3231],{},[138,3233,3235],{"id":3234},"_10-lark-cli-skill-wiki","10. Lark CLI Skill: Wiki",[12,3237,3238,3240],{},[45,3239,2833],{}," Read, create, and manage Lark Wiki pages directly from Claude Code. Search wiki content, update pages, and organize knowledge bases.",[12,3242,3243,3245],{},[45,3244,2839],{}," Teams using Lark Wiki as their knowledge base who want to update docs without switching apps.",[12,3247,3248],{},[45,3249,2845],{},[143,3251,3253],{"className":145,"code":3252,"language":147,"meta":148,"style":148},"tokrepo install a5eb9344-208c-4032-9cca-2a17f53fc271\n",[150,3254,3255],{"__ignoreMap":148},[153,3256,3257,3259,3261],{"class":155,"line":156},[153,3258,1587],{"class":159},[153,3260,1590],{"class":167},[153,3262,3263],{"class":167}," a5eb9344-208c-4032-9cca-2a17f53fc271\n",[12,3265,3266],{},[71,3267,2063],{"href":3268,"rel":3269},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002Fa5eb9344-208c-4032-9cca-2a17f53fc271",[113],[2874,3271],{},[138,3273,3275],{"id":3274},"_11-remotion-ai-skill","11. Remotion AI Skill",[12,3277,3278,3280],{},[45,3279,2833],{}," Creates programmatic videos using the Remotion framework. Write video compositions, manage timelines, add animations, captions, and voiceovers — all from Claude Code.",[12,3282,3283,3285],{},[45,3284,2839],{}," Developers who need to generate videos programmatically (marketing clips, product demos, explainers).",[12,3287,3288],{},[45,3289,2845],{},[143,3291,3293],{"className":145,"code":3292,"language":147,"meta":148,"style":148},"tokrepo install 57997ead-c8fa-409c-916f-28bbc0adc8d9\n",[150,3294,3295],{"__ignoreMap":148},[153,3296,3297,3299,3301],{"class":155,"line":156},[153,3298,1587],{"class":159},[153,3300,1590],{"class":167},[153,3302,3303],{"class":167}," 57997ead-c8fa-409c-916f-28bbc0adc8d9\n",[12,3305,3306,3308,3309,667],{},[45,3307,2912],{}," Video is usually a non-code workflow. This skill brings it into the terminal — describe what you want, get a rendered ",[150,3310,3311],{},".mp4",[12,3313,3314],{},[71,3315,2063],{"href":3316,"rel":3317},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F57997ead-c8fa-409c-916f-28bbc0adc8d9",[113],[2874,3319],{},[138,3321,3323],{"id":3322},"_12-web-access-skill","12. Web Access Skill",[12,3325,3326,3328],{},[45,3327,2833],{}," Gives Claude Code the ability to fetch and analyze web pages, APIs, and online documentation. Reads URLs, extracts content, and uses it in your current task.",[12,3330,3331,3333],{},[45,3332,2839],{}," Research-heavy tasks where you need Claude to check documentation, compare APIs, or analyze competitor pages.",[12,3335,3336],{},[45,3337,2845],{},[143,3339,3341],{"className":145,"code":3340,"language":147,"meta":148,"style":148},"tokrepo install 5766b7f4-f62e-4c74-80b4-c2763353b0fd\n",[150,3342,3343],{"__ignoreMap":148},[153,3344,3345,3347,3349],{"class":155,"line":156},[153,3346,1587],{"class":159},[153,3348,1590],{"class":167},[153,3350,3351],{"class":167}," 5766b7f4-f62e-4c74-80b4-c2763353b0fd\n",[12,3353,3354],{},[71,3355,2063],{"href":3356,"rel":3357},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F5766b7f4-f62e-4c74-80b4-c2763353b0fd",[113],[2874,3359],{},[138,3361,3363],{"id":3362},"_13-lark-cli-skill-events","13. Lark CLI Skill: Events",[12,3365,3366,3368],{},[45,3367,2833],{}," Manage Lark calendar events — create, update, list, and delete events programmatically. Useful for scheduling standup meetings or syncing project milestones.",[12,3370,3371,3373],{},[45,3372,2839],{}," Teams automating meeting schedules and calendar management through Claude Code.",[12,3375,3376],{},[45,3377,2845],{},[143,3379,3381],{"className":145,"code":3380,"language":147,"meta":148,"style":148},"tokrepo install d74aa20d-6376-47bd-8e48-8e9af76504e9\n",[150,3382,3383],{"__ignoreMap":148},[153,3384,3385,3387,3389],{"class":155,"line":156},[153,3386,1587],{"class":159},[153,3388,1590],{"class":167},[153,3390,3391],{"class":167}," d74aa20d-6376-47bd-8e48-8e9af76504e9\n",[12,3393,3394],{},[71,3395,2063],{"href":3396,"rel":3397},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002Fd74aa20d-6376-47bd-8e48-8e9af76504e9",[113],[2874,3399],{},[138,3401,3403],{"id":3402},"_14-last30days-ai-trend-research","14. Last30Days — AI Trend Research",[12,3405,3406,3408],{},[45,3407,2833],{}," Researches what happened in AI over the last 30 days. Aggregates news, releases, and trends from major AI labs and communities.",[12,3410,3411,3413],{},[45,3412,2839],{}," Staying current on AI developments without manually reading dozens of newsletters.",[12,3415,3416],{},[45,3417,2845],{},[143,3419,3421],{"className":145,"code":3420,"language":147,"meta":148,"style":148},"tokrepo install 6a80876b-83ef-4e61-a402-63624435cdda\n",[150,3422,3423],{"__ignoreMap":148},[153,3424,3425,3427,3429],{"class":155,"line":156},[153,3426,1587],{"class":159},[153,3428,1590],{"class":167},[153,3430,3431],{"class":167}," 6a80876b-83ef-4e61-a402-63624435cdda\n",[12,3433,3434],{},[71,3435,2063],{"href":3436,"rel":3437},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F6a80876b-83ef-4e61-a402-63624435cdda",[113],[2874,3439],{},[138,3441,3443],{"id":3442},"_15-agent-skills-standard","15. Agent Skills Standard",[12,3445,3446,3448],{},[45,3447,2833],{}," Defines the universal SKILL.md format — frontmatter fields, trigger patterns, instruction structure, and testing conventions. A reference spec for building interoperable skills.",[12,3450,3451,3453],{},[45,3452,2839],{}," Skill authors who want their skills to work across Claude Code, Codex CLI, and Gemini CLI.",[12,3455,3456],{},[45,3457,2845],{},[143,3459,3461],{"className":145,"code":3460,"language":147,"meta":148,"style":148},"tokrepo install 1a1292f5-c88b-4eb5-b7dd-a3bf7bb29ee8\n",[150,3462,3463],{"__ignoreMap":148},[153,3464,3465,3467,3469],{"class":155,"line":156},[153,3466,1587],{"class":159},[153,3468,1590],{"class":167},[153,3470,3471],{"class":167}," 1a1292f5-c88b-4eb5-b7dd-a3bf7bb29ee8\n",[12,3473,3474],{},[71,3475,2063],{"href":3476,"rel":3477},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F1a1292f5-c88b-4eb5-b7dd-a3bf7bb29ee8",[113],[2874,3479],{},[35,3481,3483],{"id":3482},"quick-comparison-table","Quick Comparison Table",[3485,3486],"comparison-table",{":headers":3487,":rows":3488},"[\"Skill\",\"Best For\",\"Complexity\",\"GitHub Stars\"]","[[\"GSD\",\"Project management\",\"Medium\",\"48,600+\"],[\"Vercel Skills\",\"Frontend ecosystem\",\"Low\",\"13,000+\"],[\"Skill Creator\",\"Building new skills\",\"Low\",\"660+\"],[\"Claude SEO\",\"SEO audits\",\"Low\",\"4,000+\"],[\"Systematic Debugging\",\"Hard bugs\",\"Medium\",\"—\"],[\"Planning with Files\",\"Multi-session work\",\"Low\",\"—\"],[\"Infisical\",\"Secrets management\",\"Medium\",\"25,000+\"],[\"v0 by Vercel\",\"UI prototyping\",\"Low\",\"8,000+\"],[\"Lark Skill Maker\",\"Lark API automation\",\"Medium\",\"—\"],[\"Lark Wiki\",\"Knowledge base\",\"Low\",\"—\"],[\"Remotion AI\",\"Video production\",\"High\",\"—\"],[\"Web Access\",\"Web research\",\"Low\",\"—\"],[\"Lark Events\",\"Calendar automation\",\"Low\",\"—\"],[\"Last30Days\",\"AI trend tracking\",\"Low\",\"—\"],[\"Skills Standard\",\"Skill authoring spec\",\"Low\",\"—\"]]",[35,3490,3492],{"id":3491},"how-to-combine-skills","How to Combine Skills",[12,3494,3495],{},"The real power comes from stacking skills together. Here are three proven combos:",[12,3497,3498],{},[45,3499,3500],{},"The Solo Dev Stack:",[428,3502,3503,3509,3515],{},[22,3504,3505,3508],{},[45,3506,3507],{},"GSD"," for project planning and tracking",[22,3510,3511,3514],{},[45,3512,3513],{},"Systematic Debugging"," for when things break",[22,3516,3517,3520],{},[45,3518,3519],{},"Planning with Files"," for cross-session memory",[12,3522,3523],{},[45,3524,3525],{},"The Frontend Stack:",[428,3527,3528,3534,3540],{},[22,3529,3530,3533],{},[45,3531,3532],{},"Vercel Skills"," for framework patterns",[22,3535,3536,3539],{},[45,3537,3538],{},"v0 by Vercel"," for UI component generation",[22,3541,3542,3545],{},[45,3543,3544],{},"Claude SEO"," for launch optimization",[12,3547,3548],{},[45,3549,3550],{},"The Team Stack:",[428,3552,3553,3559,3569],{},[22,3554,3555,3558],{},[45,3556,3557],{},"Infisical"," for secrets management",[22,3560,3561,3564,3565,3568],{},[45,3562,3563],{},"Lark Skill Maker"," + ",[45,3566,3567],{},"Lark Wiki"," for team communication",[22,3570,3571,3574],{},[45,3572,3573],{},"Agent Skill Creator"," for building team-specific skills",[35,3576,2514],{"id":2513},[138,3578,3580],{"id":3579},"how-do-i-install-a-claude-code-skill","How do I install a Claude Code skill?",[12,3582,3583,3584,3587,3588,3591],{},"Run ",[150,3585,3586],{},"tokrepo install \u003Cuuid>"," in your terminal, or manually copy the skill's Markdown content into ",[150,3589,3590],{},".claude\u002Fcommands\u002Fyour-skill-name.md",". Claude Code auto-discovers skills in that directory.",[138,3593,3595],{"id":3594},"can-i-use-multiple-skills-at-once","Can I use multiple skills at once?",[12,3597,3598,3599,3601],{},"Yes. Claude Code loads all skills from ",[150,3600,1296],{}," at startup. You can have 10, 20, or even 50 skills active — they only consume context when invoked via their triggers.",[138,3603,3605],{"id":3604},"are-these-skills-free","Are these skills free?",[12,3607,3608],{},"All 15 skills listed here are free and open source. TokRepo is a free registry — you can search, install, and publish skills at no cost.",[138,3610,3612],{"id":3611},"do-skills-work-with-codex-cli-or-gemini-cli","Do skills work with Codex CLI or Gemini CLI?",[12,3614,3615,3616,3620,3621,3624],{},"Most skills work across agents with minor adaptations. The ",[71,3617,3619],{"href":3476,"rel":3618},[113],"Agent Skills Standard"," defines a universal format. See our ",[71,3622,3623],{"href":1262},"Skills vs MCP vs Rules guide"," for cross-agent compatibility details.",[138,3626,3628],{"id":3627},"how-do-i-create-my-own-skill","How do I create my own skill?",[12,3630,3631,3632,3634,3635,3638],{},"Follow our step-by-step tutorial: ",[71,3633,1258],{"href":1169},". Or install the ",[71,3636,3573],{"href":2143,"rel":3637},[113]," and let Claude guide you through the process.",[35,3640,1020],{"id":1019},[19,3642,3643,3648,3655,3660],{},[22,3644,3645,3647],{},[71,3646,1258],{"href":1169}," — build your own custom skill",[22,3649,3650,3654],{},[71,3651,3653],{"href":1530,"rel":3652},[113],"Browse 500+ skills on TokRepo"," — find skills for your specific stack",[22,3656,3657,3659],{},[71,3658,1263],{"href":1262}," — understand which extension type fits your needs",[22,3661,3662,3666],{},[71,3663,3665],{"href":3664},"\u002Fguide\u002Fbest-mcp-servers","Best MCP Servers for AI Coding"," — complement skills with MCP integrations",[1074,3668,3669],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":148,"searchDepth":208,"depth":208,"links":3671},[3672,3673,3674,3691,3692,3693,3700],{"id":78,"depth":208,"text":79},{"id":2800,"depth":208,"text":2801},{"id":2825,"depth":208,"text":2826,"children":3675},[3676,3677,3678,3679,3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690],{"id":2038,"depth":242,"text":2039},{"id":2878,"depth":242,"text":2879},{"id":2924,"depth":242,"text":2925},{"id":2966,"depth":242,"text":2967},{"id":3008,"depth":242,"text":3009},{"id":3050,"depth":242,"text":3051},{"id":3095,"depth":242,"text":3096},{"id":3144,"depth":242,"text":3145},{"id":3189,"depth":242,"text":3190},{"id":3234,"depth":242,"text":3235},{"id":3274,"depth":242,"text":3275},{"id":3322,"depth":242,"text":3323},{"id":3362,"depth":242,"text":3363},{"id":3402,"depth":242,"text":3403},{"id":3442,"depth":242,"text":3443},{"id":3482,"depth":208,"text":3483},{"id":3491,"depth":208,"text":3492},{"id":2513,"depth":208,"text":2514,"children":3694},[3695,3696,3697,3698,3699],{"id":3579,"depth":242,"text":3580},{"id":3594,"depth":242,"text":3595},{"id":3604,"depth":242,"text":3605},{"id":3611,"depth":242,"text":3612},{"id":3627,"depth":242,"text":3628},{"id":1019,"depth":208,"text":1020},"comparison","Curated list of the 15 best agent skills for Claude Code. Each skill tested on real projects with install commands and usage examples.","精选 15 个最佳 Claude Code Agent Skill，每个都经过真实项目测试，附安装命令和使用示例。",[3705,3707,3710,3713,3716],{"q":3580,"a":3706},"Run tokrepo install \u003Cuuid> in your terminal, or manually copy the skill's Markdown content into .claude\u002Fcommands\u002Fyour-skill-name.md. Claude Code auto-discovers every .md file in that directory at startup — no restart or configuration needed beyond the file itself.",{"q":3708,"a":3709},"Can I use multiple Claude Code skills at once?","Yes. Claude Code loads all skills from .claude\u002Fcommands\u002F at startup. You can have 10, 20, or even 50 skills active — they only consume context tokens when invoked via their triggers, so there's no penalty for installing many skills at once.",{"q":3711,"a":3712},"Are the best Claude Code skills free?","Yes — all 15 skills in this guide (GSD, Vercel Skills, Skill Creator, Claude SEO, Systematic Debugging, Planning with Files, Infisical, v0, Lark skills, Remotion AI, Web Access, Last30Days, Skills Standard) are free and open source. TokRepo is a free registry for search, install, and publish.",{"q":3714,"a":3715},"Do Claude Code skills work with Codex CLI or Gemini CLI?","Most skills work across agents with minor adaptations. The Agent Skills Standard (skill #15) defines a universal SKILL.md format with frontmatter, triggers, and instructions. Cross-compatibility depends on whether the agent supports the standard's convention.",{"q":3717,"a":3718},"Which Claude Code skills should solo developers install first?","The Solo Dev Stack: GSD for project planning, Systematic Debugging for hard bugs, and Planning with Files for cross-session memory. These three solve Claude Code's biggest pain point — context loss — by persisting plans, hypotheses, and progress to disk.","\u002Fguide\u002Fimages\u002Fbest-claude-code-skills-hero.svg",{},"\u002Fen\u002Fguide\u002Fbest-claude-code-skills",{"title":2777,"description":3702},"en\u002Fguide\u002Fbest-claude-code-skills",[2769,2770,3725,3726],"best-of","productivity","2026 年 15 个最佳 Claude Code Skill 实测推荐","The 15 best Claude Code skills in 2026 include GSD (48K stars, project management), Vercel Skills (13K+ community skills), Claude SEO (4K stars, full SEO audits), Systematic Debugging (4-phase root cause analysis), Planning with Files (cross-session memory), and Infisical (25K stars, secrets management). Install any with tokrepo install \u003Cuuid> or drop the Markdown file into .claude\u002Fcommands\u002F.","j_adyob6GZMQk2CiuzkyyQXx5o89hSCXc5LQhxS8vW8",{"id":3731,"title":3732,"answer":6,"answerZh":6,"author":7,"body":3733,"category":3701,"description":5511,"descriptionZh":5512,"extension":1109,"faqs":5513,"faqsZh":6,"image":5525,"meta":5526,"navigation":245,"path":5527,"publishedAt":2764,"readTime":1367,"seo":5528,"stem":5529,"tags":5530,"titleZh":5532,"tldr":5533,"tldrZh":6,"updatedAt":2764,"__hash__":5534},"docs_en\u002Fen\u002Fguide\u002Fbest-mcp-servers.md","12 Best MCP Servers for AI Coding Agents (2026 Guide)",{"type":9,"value":3734,"toc":5484},[3735,3738,3740,3762,3766,3772,3783,3787,3791,3796,3801,3805,3902,3907,3913,3915,3919,3924,3929,3933,4012,4017,4023,4025,4029,4034,4039,4043,4123,4126,4131,4137,4139,4143,4156,4161,4165,4244,4252,4258,4260,4264,4269,4274,4278,4369,4386,4391,4397,4399,4403,4408,4413,4417,4496,4504,4510,4512,4516,4521,4526,4530,4621,4626,4632,4634,4638,4643,4648,4652,4731,4741,4746,4752,4754,4758,4763,4768,4772,4863,4868,4874,4876,4880,4885,4890,4894,4985,4990,4996,4998,5002,5007,5012,5016,5082,5087,5093,5095,5099,5104,5109,5113,5178,5181,5200,5208,5214,5216,5218,5222,5226,5233,5399,5402,5404,5408,5413,5417,5426,5430,5433,5437,5454,5456,5481],[12,3736,3737],{},"Learn how to extend Claude Code with 12 tested MCP servers that give your AI agent direct access to GitHub repos, databases, file systems, payment APIs, and browser automation — each one installed and verified on real projects.",[35,3739,79],{"id":78},[19,3741,3742,3748,3759],{},[22,3743,3744,3747],{},[71,3745,1159],{"href":1157,"rel":3746},[113]," installed (v2.1+) with MCP support enabled",[22,3749,3750,3751,3754,3755,3758],{},"A ",[150,3752,3753],{},"~\u002F.claude\u002Fsettings.json"," or project-level ",[150,3756,3757],{},".claude\u002Fsettings.json"," file for MCP configuration",[22,3760,3761],{},"The runtime each server requires (Node.js 20+, Python 3.11+, or Docker — noted per server below)",[35,3763,3765],{"id":3764},"what-are-mcp-servers","What Are MCP Servers?",[12,3767,3768,3769,3771],{},"MCP (Model Context Protocol) servers are lightweight processes that expose tools, resources, and prompts to AI coding agents over a standardized JSON-RPC protocol. Unlike ",[71,3770,1170],{"href":1262}," — which are pure Markdown instructions — MCP servers run actual code and can interact with external services: databases, APIs, browsers, and file systems.",[12,3773,3774,3775,3780,3781,667],{},"Anthropic publishes the ",[71,3776,3779],{"href":3777,"rel":3778},"https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fspecification",[113],"MCP specification on GitHub",", and a growing ecosystem of open-source servers already covers the most common developer workflows. For a deeper comparison of when to use skills, MCP servers, or rules, read our ",[71,3782,3623],{"href":1262},[35,3784,3786],{"id":3785},"the-12-best-mcp-servers","The 12 Best MCP Servers",[138,3788,3790],{"id":3789},"_1-github-mcp-server","1. GitHub MCP Server",[12,3792,3793,3795],{},[45,3794,2833],{}," Full GitHub integration — create issues, open PRs, review code, search repos, manage branches, and read file contents directly from Claude Code.",[12,3797,3798,3800],{},[45,3799,2839],{}," Teams that live in GitHub and want their AI agent to participate in the pull request workflow without copy-pasting URLs.",[12,3802,3803],{},[45,3804,2845],{},[143,3806,3810],{"className":3807,"code":3808,"language":3809,"meta":148,"style":148},"language-json shiki shiki-themes github-light github-dark","{\n  \"mcpServers\": {\n    \"github\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-github\"],\n      \"env\": {\n        \"GITHUB_PERSONAL_ACCESS_TOKEN\": \"\u003Cyour-token>\"\n      }\n    }\n  }\n}\n","json",[150,3811,3812,3817,3825,3832,3846,3865,3872,3882,3887,3892,3897],{"__ignoreMap":148},[153,3813,3814],{"class":155,"line":156},[153,3815,3816],{"class":313},"{\n",[153,3818,3819,3822],{"class":155,"line":208},[153,3820,3821],{"class":163},"  \"mcpServers\"",[153,3823,3824],{"class":313},": {\n",[153,3826,3827,3830],{"class":155,"line":242},[153,3828,3829],{"class":163},"    \"github\"",[153,3831,3824],{"class":313},[153,3833,3834,3837,3840,3843],{"class":155,"line":249},[153,3835,3836],{"class":163},"      \"command\"",[153,3838,3839],{"class":313},": ",[153,3841,3842],{"class":167},"\"npx\"",[153,3844,3845],{"class":313},",\n",[153,3847,3848,3851,3854,3857,3859,3862],{"class":155,"line":255},[153,3849,3850],{"class":163},"      \"args\"",[153,3852,3853],{"class":313},": [",[153,3855,3856],{"class":167},"\"-y\"",[153,3858,528],{"class":313},[153,3860,3861],{"class":167},"\"@modelcontextprotocol\u002Fserver-github\"",[153,3863,3864],{"class":313},"],\n",[153,3866,3867,3870],{"class":155,"line":268},[153,3868,3869],{"class":163},"      \"env\"",[153,3871,3824],{"class":313},[153,3873,3874,3877,3879],{"class":155,"line":281},[153,3875,3876],{"class":163},"        \"GITHUB_PERSONAL_ACCESS_TOKEN\"",[153,3878,3839],{"class":313},[153,3880,3881],{"class":167},"\"\u003Cyour-token>\"\n",[153,3883,3884],{"class":155,"line":1356},[153,3885,3886],{"class":313},"      }\n",[153,3888,3889],{"class":155,"line":1362},[153,3890,3891],{"class":313},"    }\n",[153,3893,3894],{"class":155,"line":1367},[153,3895,3896],{"class":313},"  }\n",[153,3898,3899],{"class":155,"line":1372},[153,3900,3901],{"class":313},"}\n",[12,3903,3904,3906],{},[45,3905,2862],{}," GitHub is the center of most development workflows. This server lets Claude create branches, push commits, open PRs, and respond to review comments — turning it into a true team member. It supports 30+ tools covering repos, issues, PRs, and search.",[12,3908,3909],{},[71,3910,2063],{"href":3911,"rel":3912},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fmcp-servers\u002Fd6e7f6a5",[113],[2874,3914],{},[138,3916,3918],{"id":3917},"_2-postgresql-mcp-server","2. PostgreSQL MCP Server",[12,3920,3921,3923],{},[45,3922,2833],{}," Connects Claude Code directly to your PostgreSQL database. Run read-only queries, inspect schemas, list tables, and analyze data — all through natural language.",[12,3925,3926,3928],{},[45,3927,2839],{}," Backend developers who need to explore database schemas, write queries, or debug data issues without switching to a SQL client.",[12,3930,3931],{},[45,3932,2845],{},[143,3934,3936],{"className":3807,"code":3935,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"postgres\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-postgres\"],\n      \"env\": {\n        \"POSTGRES_CONNECTION_STRING\": \"postgresql:\u002F\u002Fuser:pass@localhost:5432\u002Fmydb\"\n      }\n    }\n  }\n}\n",[150,3937,3938,3942,3948,3955,3965,3980,3986,3996,4000,4004,4008],{"__ignoreMap":148},[153,3939,3940],{"class":155,"line":156},[153,3941,3816],{"class":313},[153,3943,3944,3946],{"class":155,"line":208},[153,3945,3821],{"class":163},[153,3947,3824],{"class":313},[153,3949,3950,3953],{"class":155,"line":242},[153,3951,3952],{"class":163},"    \"postgres\"",[153,3954,3824],{"class":313},[153,3956,3957,3959,3961,3963],{"class":155,"line":249},[153,3958,3836],{"class":163},[153,3960,3839],{"class":313},[153,3962,3842],{"class":167},[153,3964,3845],{"class":313},[153,3966,3967,3969,3971,3973,3975,3978],{"class":155,"line":255},[153,3968,3850],{"class":163},[153,3970,3853],{"class":313},[153,3972,3856],{"class":167},[153,3974,528],{"class":313},[153,3976,3977],{"class":167},"\"@modelcontextprotocol\u002Fserver-postgres\"",[153,3979,3864],{"class":313},[153,3981,3982,3984],{"class":155,"line":268},[153,3983,3869],{"class":163},[153,3985,3824],{"class":313},[153,3987,3988,3991,3993],{"class":155,"line":281},[153,3989,3990],{"class":163},"        \"POSTGRES_CONNECTION_STRING\"",[153,3992,3839],{"class":313},[153,3994,3995],{"class":167},"\"postgresql:\u002F\u002Fuser:pass@localhost:5432\u002Fmydb\"\n",[153,3997,3998],{"class":155,"line":1356},[153,3999,3886],{"class":313},[153,4001,4002],{"class":155,"line":1362},[153,4003,3891],{"class":313},[153,4005,4006],{"class":155,"line":1367},[153,4007,3896],{"class":313},[153,4009,4010],{"class":155,"line":1372},[153,4011,3901],{"class":313},[12,4013,4014,4016],{},[45,4015,2912],{}," Database work is one of the most common developer tasks. Having Claude query your schema, suggest indexes, and write optimized SQL inline saves constant context-switching between terminal and database GUI.",[12,4018,4019],{},[71,4020,2063],{"href":4021,"rel":4022},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fmcp-servers\u002Ffaa28c56",[113],[2874,4024],{},[138,4026,4028],{"id":4027},"_3-filesystem-mcp-server","3. Filesystem MCP Server",[12,4030,4031,4033],{},[45,4032,2833],{}," Gives Claude Code controlled access to read, write, search, and manage files on your local filesystem. Supports directory listing, file creation, moving, and searching with glob patterns.",[12,4035,4036,4038],{},[45,4037,2839],{}," Projects where Claude needs to operate on files outside the current working directory — config files, logs, multi-repo setups.",[12,4040,4041],{},[45,4042,2845],{},[143,4044,4046],{"className":3807,"code":4045,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"filesystem\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\", \"@modelcontextprotocol\u002Fserver-filesystem\",\n        \"\u002FUsers\u002Fyou\u002Fprojects\",\n        \"\u002FUsers\u002Fyou\u002Fconfigs\"\n      ]\n    }\n  }\n}\n",[150,4047,4048,4052,4058,4065,4075,4082,4094,4101,4106,4111,4115,4119],{"__ignoreMap":148},[153,4049,4050],{"class":155,"line":156},[153,4051,3816],{"class":313},[153,4053,4054,4056],{"class":155,"line":208},[153,4055,3821],{"class":163},[153,4057,3824],{"class":313},[153,4059,4060,4063],{"class":155,"line":242},[153,4061,4062],{"class":163},"    \"filesystem\"",[153,4064,3824],{"class":313},[153,4066,4067,4069,4071,4073],{"class":155,"line":249},[153,4068,3836],{"class":163},[153,4070,3839],{"class":313},[153,4072,3842],{"class":167},[153,4074,3845],{"class":313},[153,4076,4077,4079],{"class":155,"line":255},[153,4078,3850],{"class":163},[153,4080,4081],{"class":313},": [\n",[153,4083,4084,4087,4089,4092],{"class":155,"line":268},[153,4085,4086],{"class":167},"        \"-y\"",[153,4088,528],{"class":313},[153,4090,4091],{"class":167},"\"@modelcontextprotocol\u002Fserver-filesystem\"",[153,4093,3845],{"class":313},[153,4095,4096,4099],{"class":155,"line":281},[153,4097,4098],{"class":167},"        \"\u002FUsers\u002Fyou\u002Fprojects\"",[153,4100,3845],{"class":313},[153,4102,4103],{"class":155,"line":1356},[153,4104,4105],{"class":167},"        \"\u002FUsers\u002Fyou\u002Fconfigs\"\n",[153,4107,4108],{"class":155,"line":1362},[153,4109,4110],{"class":313},"      ]\n",[153,4112,4113],{"class":155,"line":1367},[153,4114,3891],{"class":313},[153,4116,4117],{"class":155,"line":1372},[153,4118,3896],{"class":313},[153,4120,4121],{"class":155,"line":1378},[153,4122,3901],{"class":313},[12,4124,4125],{},"You specify which directories the server can access as positional arguments. Claude cannot read files outside these paths.",[12,4127,4128,4130],{},[45,4129,2912],{}," It is the simplest MCP server to set up and solves a real pain point — Claude Code's built-in file access is limited to the project root. This server extends reach to any directory you allow.",[12,4132,4133],{},[71,4134,2063],{"href":4135,"rel":4136},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fmcp-servers\u002F92b8baf2",[113],[2874,4138],{},[138,4140,4142],{"id":4141},"_4-sqlite-mcp-server","4. SQLite MCP Server",[12,4144,4145,4147,4148,4151,4152,4155],{},[45,4146,2833],{}," Connects Claude to a local SQLite database file. Run queries, create tables, inspect schemas, and analyze data stored in ",[150,4149,4150],{},".sqlite"," or ",[150,4153,4154],{},".db"," files.",[12,4157,4158,4160],{},[45,4159,2839],{}," Local development, prototyping, and working with embedded databases — especially mobile app backends and Electron apps.",[12,4162,4163],{},[45,4164,2845],{},[143,4166,4168],{"className":3807,"code":4167,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"sqlite\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-sqlite\"],\n      \"env\": {\n        \"SQLITE_DB_PATH\": \"\u002Fpath\u002Fto\u002Fyour\u002Fdatabase.sqlite\"\n      }\n    }\n  }\n}\n",[150,4169,4170,4174,4180,4187,4197,4212,4218,4228,4232,4236,4240],{"__ignoreMap":148},[153,4171,4172],{"class":155,"line":156},[153,4173,3816],{"class":313},[153,4175,4176,4178],{"class":155,"line":208},[153,4177,3821],{"class":163},[153,4179,3824],{"class":313},[153,4181,4182,4185],{"class":155,"line":242},[153,4183,4184],{"class":163},"    \"sqlite\"",[153,4186,3824],{"class":313},[153,4188,4189,4191,4193,4195],{"class":155,"line":249},[153,4190,3836],{"class":163},[153,4192,3839],{"class":313},[153,4194,3842],{"class":167},[153,4196,3845],{"class":313},[153,4198,4199,4201,4203,4205,4207,4210],{"class":155,"line":255},[153,4200,3850],{"class":163},[153,4202,3853],{"class":313},[153,4204,3856],{"class":167},[153,4206,528],{"class":313},[153,4208,4209],{"class":167},"\"@modelcontextprotocol\u002Fserver-sqlite\"",[153,4211,3864],{"class":313},[153,4213,4214,4216],{"class":155,"line":268},[153,4215,3869],{"class":163},[153,4217,3824],{"class":313},[153,4219,4220,4223,4225],{"class":155,"line":281},[153,4221,4222],{"class":163},"        \"SQLITE_DB_PATH\"",[153,4224,3839],{"class":313},[153,4226,4227],{"class":167},"\"\u002Fpath\u002Fto\u002Fyour\u002Fdatabase.sqlite\"\n",[153,4229,4230],{"class":155,"line":1356},[153,4231,3886],{"class":313},[153,4233,4234],{"class":155,"line":1362},[153,4235,3891],{"class":313},[153,4237,4238],{"class":155,"line":1367},[153,4239,3896],{"class":313},[153,4241,4242],{"class":155,"line":1372},[153,4243,3901],{"class":313},[12,4245,4246,4248,4249,4251],{},[45,4247,2912],{}," SQLite is everywhere — mobile apps, desktop tools, browser extensions, IoT devices. This server lets Claude inspect and query any ",[150,4250,4154],{}," file without installing a separate tool. Perfect for rapid prototyping with zero infrastructure.",[12,4253,4254],{},[71,4255,2063],{"href":4256,"rel":4257},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fmcp-servers\u002Ff67139b3",[113],[2874,4259],{},[138,4261,4263],{"id":4262},"_5-slack-mcp-server","5. Slack MCP Server",[12,4265,4266,4268],{},[45,4267,2833],{}," Read messages, post to channels, search conversation history, list channels, and manage threads — all from Claude Code.",[12,4270,4271,4273],{},[45,4272,2839],{}," DevOps and on-call workflows where you need Claude to search Slack for context about an incident, or post deploy notifications automatically.",[12,4275,4276],{},[45,4277,2845],{},[143,4279,4281],{"className":3807,"code":4280,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"slack\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-slack\"],\n      \"env\": {\n        \"SLACK_BOT_TOKEN\": \"xoxb-your-bot-token\",\n        \"SLACK_TEAM_ID\": \"T0123456789\"\n      }\n    }\n  }\n}\n",[150,4282,4283,4287,4293,4300,4310,4325,4331,4343,4353,4357,4361,4365],{"__ignoreMap":148},[153,4284,4285],{"class":155,"line":156},[153,4286,3816],{"class":313},[153,4288,4289,4291],{"class":155,"line":208},[153,4290,3821],{"class":163},[153,4292,3824],{"class":313},[153,4294,4295,4298],{"class":155,"line":242},[153,4296,4297],{"class":163},"    \"slack\"",[153,4299,3824],{"class":313},[153,4301,4302,4304,4306,4308],{"class":155,"line":249},[153,4303,3836],{"class":163},[153,4305,3839],{"class":313},[153,4307,3842],{"class":167},[153,4309,3845],{"class":313},[153,4311,4312,4314,4316,4318,4320,4323],{"class":155,"line":255},[153,4313,3850],{"class":163},[153,4315,3853],{"class":313},[153,4317,3856],{"class":167},[153,4319,528],{"class":313},[153,4321,4322],{"class":167},"\"@modelcontextprotocol\u002Fserver-slack\"",[153,4324,3864],{"class":313},[153,4326,4327,4329],{"class":155,"line":268},[153,4328,3869],{"class":163},[153,4330,3824],{"class":313},[153,4332,4333,4336,4338,4341],{"class":155,"line":281},[153,4334,4335],{"class":163},"        \"SLACK_BOT_TOKEN\"",[153,4337,3839],{"class":313},[153,4339,4340],{"class":167},"\"xoxb-your-bot-token\"",[153,4342,3845],{"class":313},[153,4344,4345,4348,4350],{"class":155,"line":1356},[153,4346,4347],{"class":163},"        \"SLACK_TEAM_ID\"",[153,4349,3839],{"class":313},[153,4351,4352],{"class":167},"\"T0123456789\"\n",[153,4354,4355],{"class":155,"line":1362},[153,4356,3886],{"class":313},[153,4358,4359],{"class":155,"line":1367},[153,4360,3891],{"class":313},[153,4362,4363],{"class":155,"line":1372},[153,4364,3896],{"class":313},[153,4366,4367],{"class":155,"line":1378},[153,4368,3901],{"class":313},[12,4370,4371,4372,528,4375,528,4378,4381,4382,4385],{},"You need a Slack app with ",[150,4373,4374],{},"channels:history",[150,4376,4377],{},"channels:read",[150,4379,4380],{},"chat:write",", and ",[150,4383,4384],{},"users:read"," scopes.",[12,4387,4388,4390],{},[45,4389,2912],{}," Slack is where context lives in most teams. Instead of manually searching for \"what did the backend team say about that migration?\", Claude searches for you and incorporates the answer into its response.",[12,4392,4393],{},[71,4394,2063],{"href":4395,"rel":4396},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fmcp-servers\u002Fd5a6ae87",[113],[2874,4398],{},[138,4400,4402],{"id":4401},"_6-puppeteer-mcp-server","6. Puppeteer MCP Server",[12,4404,4405,4407],{},[45,4406,2833],{}," Controls a headless Chrome browser. Navigate to pages, click elements, fill forms, take screenshots, extract DOM content, and run JavaScript in the browser context.",[12,4409,4410,4412],{},[45,4411,2839],{}," E2E testing, web scraping, screenshot comparison, and debugging frontend issues that only reproduce in a real browser.",[12,4414,4415],{},[45,4416,2845],{},[143,4418,4420],{"className":3807,"code":4419,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"puppeteer\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-puppeteer\"],\n      \"env\": {\n        \"PUPPETEER_HEADLESS\": \"true\"\n      }\n    }\n  }\n}\n",[150,4421,4422,4426,4432,4439,4449,4464,4470,4480,4484,4488,4492],{"__ignoreMap":148},[153,4423,4424],{"class":155,"line":156},[153,4425,3816],{"class":313},[153,4427,4428,4430],{"class":155,"line":208},[153,4429,3821],{"class":163},[153,4431,3824],{"class":313},[153,4433,4434,4437],{"class":155,"line":242},[153,4435,4436],{"class":163},"    \"puppeteer\"",[153,4438,3824],{"class":313},[153,4440,4441,4443,4445,4447],{"class":155,"line":249},[153,4442,3836],{"class":163},[153,4444,3839],{"class":313},[153,4446,3842],{"class":167},[153,4448,3845],{"class":313},[153,4450,4451,4453,4455,4457,4459,4462],{"class":155,"line":255},[153,4452,3850],{"class":163},[153,4454,3853],{"class":313},[153,4456,3856],{"class":167},[153,4458,528],{"class":313},[153,4460,4461],{"class":167},"\"@modelcontextprotocol\u002Fserver-puppeteer\"",[153,4463,3864],{"class":313},[153,4465,4466,4468],{"class":155,"line":268},[153,4467,3869],{"class":163},[153,4469,3824],{"class":313},[153,4471,4472,4475,4477],{"class":155,"line":281},[153,4473,4474],{"class":163},"        \"PUPPETEER_HEADLESS\"",[153,4476,3839],{"class":313},[153,4478,4479],{"class":167},"\"true\"\n",[153,4481,4482],{"class":155,"line":1356},[153,4483,3886],{"class":313},[153,4485,4486],{"class":155,"line":1362},[153,4487,3891],{"class":313},[153,4489,4490],{"class":155,"line":1367},[153,4491,3896],{"class":313},[153,4493,4494],{"class":155,"line":1372},[153,4495,3901],{"class":313},[12,4497,4498,4500,4501,4503],{},[45,4499,2912],{}," This is the server that gives Claude \"eyes.\" It can navigate to your staging site, take a screenshot, compare it to the design, and tell you what is off — all without you opening a browser. Combined with ",[71,4502,1170],{"href":2689}," for test writing, it creates a powerful QA loop.",[12,4505,4506],{},[71,4507,2063],{"href":4508,"rel":4509},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fmcp-servers\u002Fefa97531",[113],[2874,4511],{},[138,4513,4515],{"id":4514},"_7-sentry-mcp-server","7. Sentry MCP Server",[12,4517,4518,4520],{},[45,4519,2833],{}," Pulls error data from Sentry — list recent issues, get stack traces, view event details, search by error message, and check release health.",[12,4522,4523,4525],{},[45,4524,2839],{}," On-call developers who want Claude to analyze production errors, correlate stack traces with code, and suggest fixes automatically.",[12,4527,4528],{},[45,4529,2845],{},[143,4531,4533],{"className":3807,"code":4532,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"sentry\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-sentry\"],\n      \"env\": {\n        \"SENTRY_AUTH_TOKEN\": \"\u003Cyour-sentry-auth-token>\",\n        \"SENTRY_ORG\": \"your-org-slug\"\n      }\n    }\n  }\n}\n",[150,4534,4535,4539,4545,4552,4562,4577,4583,4595,4605,4609,4613,4617],{"__ignoreMap":148},[153,4536,4537],{"class":155,"line":156},[153,4538,3816],{"class":313},[153,4540,4541,4543],{"class":155,"line":208},[153,4542,3821],{"class":163},[153,4544,3824],{"class":313},[153,4546,4547,4550],{"class":155,"line":242},[153,4548,4549],{"class":163},"    \"sentry\"",[153,4551,3824],{"class":313},[153,4553,4554,4556,4558,4560],{"class":155,"line":249},[153,4555,3836],{"class":163},[153,4557,3839],{"class":313},[153,4559,3842],{"class":167},[153,4561,3845],{"class":313},[153,4563,4564,4566,4568,4570,4572,4575],{"class":155,"line":255},[153,4565,3850],{"class":163},[153,4567,3853],{"class":313},[153,4569,3856],{"class":167},[153,4571,528],{"class":313},[153,4573,4574],{"class":167},"\"@modelcontextprotocol\u002Fserver-sentry\"",[153,4576,3864],{"class":313},[153,4578,4579,4581],{"class":155,"line":268},[153,4580,3869],{"class":163},[153,4582,3824],{"class":313},[153,4584,4585,4588,4590,4593],{"class":155,"line":281},[153,4586,4587],{"class":163},"        \"SENTRY_AUTH_TOKEN\"",[153,4589,3839],{"class":313},[153,4591,4592],{"class":167},"\"\u003Cyour-sentry-auth-token>\"",[153,4594,3845],{"class":313},[153,4596,4597,4600,4602],{"class":155,"line":1356},[153,4598,4599],{"class":163},"        \"SENTRY_ORG\"",[153,4601,3839],{"class":313},[153,4603,4604],{"class":167},"\"your-org-slug\"\n",[153,4606,4607],{"class":155,"line":1362},[153,4608,3886],{"class":313},[153,4610,4611],{"class":155,"line":1367},[153,4612,3891],{"class":313},[153,4614,4615],{"class":155,"line":1372},[153,4616,3896],{"class":313},[153,4618,4619],{"class":155,"line":1378},[153,4620,3901],{"class":313},[12,4622,4623,4625],{},[45,4624,2912],{}," The debugging loop — \"see error in Sentry, find the code, understand the cause, write a fix\" — is one of the highest-value workflows to automate. This server handles steps 1 and 2, then Claude handles 3 and 4.",[12,4627,4628],{},[71,4629,2063],{"href":4630,"rel":4631},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fmcp-servers\u002Fa739e813",[113],[2874,4633],{},[138,4635,4637],{"id":4636},"_8-stripe-mcp-server","8. Stripe MCP Server",[12,4639,4640,4642],{},[45,4641,2833],{}," Interacts with the Stripe API — list customers, retrieve payment intents, check subscription status, search invoices, and inspect webhook events.",[12,4644,4645,4647],{},[45,4646,2839],{}," SaaS developers who need Claude to debug payment issues, verify subscription states, or generate Stripe API integration code with real schema context.",[12,4649,4650],{},[45,4651,2845],{},[143,4653,4655],{"className":3807,"code":4654,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"stripe\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-stripe\"],\n      \"env\": {\n        \"STRIPE_SECRET_KEY\": \"sk_test_...\"\n      }\n    }\n  }\n}\n",[150,4656,4657,4661,4667,4674,4684,4699,4705,4715,4719,4723,4727],{"__ignoreMap":148},[153,4658,4659],{"class":155,"line":156},[153,4660,3816],{"class":313},[153,4662,4663,4665],{"class":155,"line":208},[153,4664,3821],{"class":163},[153,4666,3824],{"class":313},[153,4668,4669,4672],{"class":155,"line":242},[153,4670,4671],{"class":163},"    \"stripe\"",[153,4673,3824],{"class":313},[153,4675,4676,4678,4680,4682],{"class":155,"line":249},[153,4677,3836],{"class":163},[153,4679,3839],{"class":313},[153,4681,3842],{"class":167},[153,4683,3845],{"class":313},[153,4685,4686,4688,4690,4692,4694,4697],{"class":155,"line":255},[153,4687,3850],{"class":163},[153,4689,3853],{"class":313},[153,4691,3856],{"class":167},[153,4693,528],{"class":313},[153,4695,4696],{"class":167},"\"@modelcontextprotocol\u002Fserver-stripe\"",[153,4698,3864],{"class":313},[153,4700,4701,4703],{"class":155,"line":268},[153,4702,3869],{"class":163},[153,4704,3824],{"class":313},[153,4706,4707,4710,4712],{"class":155,"line":281},[153,4708,4709],{"class":163},"        \"STRIPE_SECRET_KEY\"",[153,4711,3839],{"class":313},[153,4713,4714],{"class":167},"\"sk_test_...\"\n",[153,4716,4717],{"class":155,"line":1356},[153,4718,3886],{"class":313},[153,4720,4721],{"class":155,"line":1362},[153,4722,3891],{"class":313},[153,4724,4725],{"class":155,"line":1367},[153,4726,3896],{"class":313},[153,4728,4729],{"class":155,"line":1372},[153,4730,3901],{"class":313},[4732,4733,4734],"blockquote",{},[12,4735,4736,4737,4740],{},"Use a ",[45,4738,4739],{},"test mode"," key during development. Never expose production Stripe keys in shared configs.",[12,4742,4743,4745],{},[45,4744,2912],{}," Payment bugs are high-stakes. Having Claude pull the actual Stripe event, compare it to your webhook handler, and spot the mismatch saves hours of manual Stripe dashboard spelunking.",[12,4747,4748],{},[71,4749,2063],{"href":4750,"rel":4751},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fmcp-servers\u002F9fa25556",[113],[2874,4753],{},[138,4755,4757],{"id":4756},"_9-supabase-mcp-server","9. Supabase MCP Server",[12,4759,4760,4762],{},[45,4761,2833],{}," Full Supabase integration — query Postgres tables, manage auth users, interact with storage buckets, and call Edge Functions. Combines database, auth, and storage in one server.",[12,4764,4765,4767],{},[45,4766,2839],{}," Indie hackers and startups building on Supabase who want Claude to manage the entire backend without leaving the terminal.",[12,4769,4770],{},[45,4771,2845],{},[143,4773,4775],{"className":3807,"code":4774,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"supabase\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@supabase\u002Fmcp-server\"],\n      \"env\": {\n        \"SUPABASE_URL\": \"https:\u002F\u002Fyour-project.supabase.co\",\n        \"SUPABASE_SERVICE_ROLE_KEY\": \"eyJ...\"\n      }\n    }\n  }\n}\n",[150,4776,4777,4781,4787,4794,4804,4819,4825,4837,4847,4851,4855,4859],{"__ignoreMap":148},[153,4778,4779],{"class":155,"line":156},[153,4780,3816],{"class":313},[153,4782,4783,4785],{"class":155,"line":208},[153,4784,3821],{"class":163},[153,4786,3824],{"class":313},[153,4788,4789,4792],{"class":155,"line":242},[153,4790,4791],{"class":163},"    \"supabase\"",[153,4793,3824],{"class":313},[153,4795,4796,4798,4800,4802],{"class":155,"line":249},[153,4797,3836],{"class":163},[153,4799,3839],{"class":313},[153,4801,3842],{"class":167},[153,4803,3845],{"class":313},[153,4805,4806,4808,4810,4812,4814,4817],{"class":155,"line":255},[153,4807,3850],{"class":163},[153,4809,3853],{"class":313},[153,4811,3856],{"class":167},[153,4813,528],{"class":313},[153,4815,4816],{"class":167},"\"@supabase\u002Fmcp-server\"",[153,4818,3864],{"class":313},[153,4820,4821,4823],{"class":155,"line":268},[153,4822,3869],{"class":163},[153,4824,3824],{"class":313},[153,4826,4827,4830,4832,4835],{"class":155,"line":281},[153,4828,4829],{"class":163},"        \"SUPABASE_URL\"",[153,4831,3839],{"class":313},[153,4833,4834],{"class":167},"\"https:\u002F\u002Fyour-project.supabase.co\"",[153,4836,3845],{"class":313},[153,4838,4839,4842,4844],{"class":155,"line":1356},[153,4840,4841],{"class":163},"        \"SUPABASE_SERVICE_ROLE_KEY\"",[153,4843,3839],{"class":313},[153,4845,4846],{"class":167},"\"eyJ...\"\n",[153,4848,4849],{"class":155,"line":1362},[153,4850,3886],{"class":313},[153,4852,4853],{"class":155,"line":1367},[153,4854,3891],{"class":313},[153,4856,4857],{"class":155,"line":1372},[153,4858,3896],{"class":313},[153,4860,4861],{"class":155,"line":1378},[153,4862,3901],{"class":313},[12,4864,4865,4867],{},[45,4866,2912],{}," Supabase is the most popular open-source Firebase alternative. This server covers Postgres queries, Row Level Security policies, auth user management, and storage — all through one MCP connection. If your stack is Supabase, this is non-negotiable.",[12,4869,4870],{},[71,4871,2063],{"href":4872,"rel":4873},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fmcp-servers\u002Fb141b1a9",[113],[2874,4875],{},[138,4877,4879],{"id":4878},"_10-elasticsearch-mcp-server","10. Elasticsearch MCP Server",[12,4881,4882,4884],{},[45,4883,2833],{}," Query Elasticsearch indices, inspect mappings, run aggregations, and manage index lifecycles. Supports both Elasticsearch 7.x and 8.x.",[12,4886,4887,4889],{},[45,4888,2839],{}," Backend teams with Elasticsearch-powered search who want Claude to write queries, debug relevance issues, or optimize index mappings.",[12,4891,4892],{},[45,4893,2845],{},[143,4895,4897],{"className":3807,"code":4896,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"elasticsearch\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-elasticsearch\"],\n      \"env\": {\n        \"ELASTICSEARCH_URL\": \"http:\u002F\u002Flocalhost:9200\",\n        \"ELASTICSEARCH_API_KEY\": \"\u003Cyour-api-key>\"\n      }\n    }\n  }\n}\n",[150,4898,4899,4903,4909,4916,4926,4941,4947,4959,4969,4973,4977,4981],{"__ignoreMap":148},[153,4900,4901],{"class":155,"line":156},[153,4902,3816],{"class":313},[153,4904,4905,4907],{"class":155,"line":208},[153,4906,3821],{"class":163},[153,4908,3824],{"class":313},[153,4910,4911,4914],{"class":155,"line":242},[153,4912,4913],{"class":163},"    \"elasticsearch\"",[153,4915,3824],{"class":313},[153,4917,4918,4920,4922,4924],{"class":155,"line":249},[153,4919,3836],{"class":163},[153,4921,3839],{"class":313},[153,4923,3842],{"class":167},[153,4925,3845],{"class":313},[153,4927,4928,4930,4932,4934,4936,4939],{"class":155,"line":255},[153,4929,3850],{"class":163},[153,4931,3853],{"class":313},[153,4933,3856],{"class":167},[153,4935,528],{"class":313},[153,4937,4938],{"class":167},"\"@modelcontextprotocol\u002Fserver-elasticsearch\"",[153,4940,3864],{"class":313},[153,4942,4943,4945],{"class":155,"line":268},[153,4944,3869],{"class":163},[153,4946,3824],{"class":313},[153,4948,4949,4952,4954,4957],{"class":155,"line":281},[153,4950,4951],{"class":163},"        \"ELASTICSEARCH_URL\"",[153,4953,3839],{"class":313},[153,4955,4956],{"class":167},"\"http:\u002F\u002Flocalhost:9200\"",[153,4958,3845],{"class":313},[153,4960,4961,4964,4966],{"class":155,"line":1356},[153,4962,4963],{"class":163},"        \"ELASTICSEARCH_API_KEY\"",[153,4965,3839],{"class":313},[153,4967,4968],{"class":167},"\"\u003Cyour-api-key>\"\n",[153,4970,4971],{"class":155,"line":1362},[153,4972,3886],{"class":313},[153,4974,4975],{"class":155,"line":1367},[153,4976,3891],{"class":313},[153,4978,4979],{"class":155,"line":1372},[153,4980,3896],{"class":313},[153,4982,4983],{"class":155,"line":1378},[153,4984,3901],{"class":313},[12,4986,4987,4989],{},[45,4988,2912],{}," Elasticsearch query DSL is notoriously complex. Having Claude write and test queries against your actual index — with real mappings and data — produces dramatically better results than asking it to write queries from memory.",[12,4991,4992],{},[71,4993,2063],{"href":4994,"rel":4995},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fmcp-servers\u002Fcba686ed",[113],[2874,4997],{},[138,4999,5001],{"id":5000},"_11-glama-mcp-server","11. Glama MCP Server",[12,5003,5004,5006],{},[45,5005,2833],{}," A meta-server for MCP discovery. Search the Glama registry for MCP servers, get installation instructions, and compare capabilities — all from within Claude Code.",[12,5008,5009,5011],{},[45,5010,2839],{}," Developers exploring the MCP ecosystem who want to find, evaluate, and install new servers without leaving the terminal.",[12,5013,5014],{},[45,5015,2845],{},[143,5017,5019],{"className":3807,"code":5018,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"glama\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@anthropic-ai\u002Fmcp-glama\"],\n      \"env\": {}\n    }\n  }\n}\n",[150,5020,5021,5025,5031,5038,5048,5063,5070,5074,5078],{"__ignoreMap":148},[153,5022,5023],{"class":155,"line":156},[153,5024,3816],{"class":313},[153,5026,5027,5029],{"class":155,"line":208},[153,5028,3821],{"class":163},[153,5030,3824],{"class":313},[153,5032,5033,5036],{"class":155,"line":242},[153,5034,5035],{"class":163},"    \"glama\"",[153,5037,3824],{"class":313},[153,5039,5040,5042,5044,5046],{"class":155,"line":249},[153,5041,3836],{"class":163},[153,5043,3839],{"class":313},[153,5045,3842],{"class":167},[153,5047,3845],{"class":313},[153,5049,5050,5052,5054,5056,5058,5061],{"class":155,"line":255},[153,5051,3850],{"class":163},[153,5053,3853],{"class":313},[153,5055,3856],{"class":167},[153,5057,528],{"class":313},[153,5059,5060],{"class":167},"\"@anthropic-ai\u002Fmcp-glama\"",[153,5062,3864],{"class":313},[153,5064,5065,5067],{"class":155,"line":268},[153,5066,3869],{"class":163},[153,5068,5069],{"class":313},": {}\n",[153,5071,5072],{"class":155,"line":281},[153,5073,3891],{"class":313},[153,5075,5076],{"class":155,"line":1356},[153,5077,3896],{"class":313},[153,5079,5080],{"class":155,"line":1362},[153,5081,3901],{"class":313},[12,5083,5084,5086],{},[45,5085,2912],{}," The MCP ecosystem is growing fast. Instead of browsing GitHub or Google, ask Claude \"find me an MCP server for Jira\" and Glama returns matching results with install configs. It is the package manager for MCP servers.",[12,5088,5089],{},[71,5090,2063],{"href":5091,"rel":5092},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fmcp-servers\u002Fef4bec91",[113],[2874,5094],{},[138,5096,5098],{"id":5097},"_12-mcp-inspector","12. MCP Inspector",[12,5100,5101,5103],{},[45,5102,2833],{}," A debugging and testing tool for MCP servers. Validates server responses, checks protocol compliance, inspects tool schemas, and helps you diagnose why a server is not working.",[12,5105,5106,5108],{},[45,5107,2839],{}," MCP server developers and anyone troubleshooting a server that is not connecting or returning unexpected results.",[12,5110,5111],{},[45,5112,2845],{},[143,5114,5116],{"className":3807,"code":5115,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"mcp-inspector\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@anthropic-ai\u002Fmcp-inspector\"],\n      \"env\": {}\n    }\n  }\n}\n",[150,5117,5118,5122,5128,5135,5145,5160,5166,5170,5174],{"__ignoreMap":148},[153,5119,5120],{"class":155,"line":156},[153,5121,3816],{"class":313},[153,5123,5124,5126],{"class":155,"line":208},[153,5125,3821],{"class":163},[153,5127,3824],{"class":313},[153,5129,5130,5133],{"class":155,"line":242},[153,5131,5132],{"class":163},"    \"mcp-inspector\"",[153,5134,3824],{"class":313},[153,5136,5137,5139,5141,5143],{"class":155,"line":249},[153,5138,3836],{"class":163},[153,5140,3839],{"class":313},[153,5142,3842],{"class":167},[153,5144,3845],{"class":313},[153,5146,5147,5149,5151,5153,5155,5158],{"class":155,"line":255},[153,5148,3850],{"class":163},[153,5150,3853],{"class":313},[153,5152,3856],{"class":167},[153,5154,528],{"class":313},[153,5156,5157],{"class":167},"\"@anthropic-ai\u002Fmcp-inspector\"",[153,5159,3864],{"class":313},[153,5161,5162,5164],{"class":155,"line":268},[153,5163,3869],{"class":163},[153,5165,5069],{"class":313},[153,5167,5168],{"class":155,"line":281},[153,5169,3891],{"class":313},[153,5171,5172],{"class":155,"line":1356},[153,5173,3896],{"class":313},[153,5175,5176],{"class":155,"line":1362},[153,5177,3901],{"class":313},[12,5179,5180],{},"You can also run it standalone to test any MCP server:",[143,5182,5184],{"className":145,"code":5183,"language":147,"meta":148,"style":148},"npx @anthropic-ai\u002Fmcp-inspector --server \"npx @modelcontextprotocol\u002Fserver-github\"\n",[150,5185,5186],{"__ignoreMap":148},[153,5187,5188,5191,5194,5197],{"class":155,"line":156},[153,5189,5190],{"class":159},"npx",[153,5192,5193],{"class":167}," @anthropic-ai\u002Fmcp-inspector",[153,5195,5196],{"class":163}," --server",[153,5198,5199],{"class":167}," \"npx @modelcontextprotocol\u002Fserver-github\"\n",[12,5201,5202,5204,5205,667],{},[45,5203,2912],{}," When an MCP server silently fails, you need a debugger. MCP Inspector shows you the raw JSON-RPC messages, validates tool schemas, and pinpoints exactly where the handshake breaks. Essential for anyone ",[71,5206,5207],{"href":1169},"building custom MCP servers",[12,5209,5210],{},[71,5211,2063],{"href":5212,"rel":5213},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fmcp-servers\u002F302d7709",[113],[2874,5215],{},[35,5217,3483],{"id":3482},[3485,5219],{":headers":5220,":rows":5221},"[\"MCP Server\",\"Category\",\"Best For\",\"Runtime\",\"Auth Required\"]","[[\"GitHub\",\"Source Control\",\"PR workflows\",\"Node.js\",\"Yes (PAT)\"],[\"PostgreSQL\",\"Database\",\"Schema exploration\",\"Node.js\",\"Yes (conn string)\"],[\"Filesystem\",\"Files\",\"Multi-dir access\",\"Node.js\",\"No\"],[\"SQLite\",\"Database\",\"Local prototyping\",\"Node.js\",\"No\"],[\"Slack\",\"Communication\",\"Incident context\",\"Node.js\",\"Yes (Bot token)\"],[\"Puppeteer\",\"Browser\",\"E2E testing\",\"Node.js\",\"No\"],[\"Sentry\",\"Monitoring\",\"Error triage\",\"Node.js\",\"Yes (Auth token)\"],[\"Stripe\",\"Payments\",\"Payment debugging\",\"Node.js\",\"Yes (API key)\"],[\"Supabase\",\"Backend-as-a-Service\",\"Full-stack BaaS\",\"Node.js\",\"Yes (Service key)\"],[\"Elasticsearch\",\"Search\",\"Query building\",\"Node.js\",\"Optional\"],[\"Glama\",\"Discovery\",\"Finding MCP servers\",\"Node.js\",\"No\"],[\"MCP Inspector\",\"Debugging\",\"Server troubleshooting\",\"Node.js\",\"No\"]]",[35,5223,5225],{"id":5224},"how-to-configure-multiple-mcp-servers","How to Configure Multiple MCP Servers",[12,5227,5228,5229,5232],{},"You can run multiple MCP servers simultaneously. Add them all to one ",[150,5230,5231],{},"mcpServers"," object in your Claude Code settings:",[143,5234,5236],{"className":3807,"code":5235,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"github\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-github\"],\n      \"env\": { \"GITHUB_PERSONAL_ACCESS_TOKEN\": \"ghp_...\" }\n    },\n    \"postgres\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-postgres\"],\n      \"env\": { \"POSTGRES_CONNECTION_STRING\": \"postgresql:\u002F\u002F...\" }\n    },\n    \"filesystem\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-filesystem\", \"\u002Fhome\u002Fyou\u002Fprojects\"]\n    }\n  }\n}\n",[150,5237,5238,5242,5248,5254,5264,5278,5296,5301,5307,5317,5331,5347,5351,5357,5367,5387,5391,5395],{"__ignoreMap":148},[153,5239,5240],{"class":155,"line":156},[153,5241,3816],{"class":313},[153,5243,5244,5246],{"class":155,"line":208},[153,5245,3821],{"class":163},[153,5247,3824],{"class":313},[153,5249,5250,5252],{"class":155,"line":242},[153,5251,3829],{"class":163},[153,5253,3824],{"class":313},[153,5255,5256,5258,5260,5262],{"class":155,"line":249},[153,5257,3836],{"class":163},[153,5259,3839],{"class":313},[153,5261,3842],{"class":167},[153,5263,3845],{"class":313},[153,5265,5266,5268,5270,5272,5274,5276],{"class":155,"line":255},[153,5267,3850],{"class":163},[153,5269,3853],{"class":313},[153,5271,3856],{"class":167},[153,5273,528],{"class":313},[153,5275,3861],{"class":167},[153,5277,3864],{"class":313},[153,5279,5280,5282,5285,5288,5290,5293],{"class":155,"line":268},[153,5281,3869],{"class":163},[153,5283,5284],{"class":313},": { ",[153,5286,5287],{"class":163},"\"GITHUB_PERSONAL_ACCESS_TOKEN\"",[153,5289,3839],{"class":313},[153,5291,5292],{"class":167},"\"ghp_...\"",[153,5294,5295],{"class":313}," }\n",[153,5297,5298],{"class":155,"line":281},[153,5299,5300],{"class":313},"    },\n",[153,5302,5303,5305],{"class":155,"line":1356},[153,5304,3952],{"class":163},[153,5306,3824],{"class":313},[153,5308,5309,5311,5313,5315],{"class":155,"line":1362},[153,5310,3836],{"class":163},[153,5312,3839],{"class":313},[153,5314,3842],{"class":167},[153,5316,3845],{"class":313},[153,5318,5319,5321,5323,5325,5327,5329],{"class":155,"line":1367},[153,5320,3850],{"class":163},[153,5322,3853],{"class":313},[153,5324,3856],{"class":167},[153,5326,528],{"class":313},[153,5328,3977],{"class":167},[153,5330,3864],{"class":313},[153,5332,5333,5335,5337,5340,5342,5345],{"class":155,"line":1372},[153,5334,3869],{"class":163},[153,5336,5284],{"class":313},[153,5338,5339],{"class":163},"\"POSTGRES_CONNECTION_STRING\"",[153,5341,3839],{"class":313},[153,5343,5344],{"class":167},"\"postgresql:\u002F\u002F...\"",[153,5346,5295],{"class":313},[153,5348,5349],{"class":155,"line":1378},[153,5350,5300],{"class":313},[153,5352,5353,5355],{"class":155,"line":1383},[153,5354,4062],{"class":163},[153,5356,3824],{"class":313},[153,5358,5359,5361,5363,5365],{"class":155,"line":1389},[153,5360,3836],{"class":163},[153,5362,3839],{"class":313},[153,5364,3842],{"class":167},[153,5366,3845],{"class":313},[153,5368,5369,5371,5373,5375,5377,5379,5381,5384],{"class":155,"line":1395},[153,5370,3850],{"class":163},[153,5372,3853],{"class":313},[153,5374,3856],{"class":167},[153,5376,528],{"class":313},[153,5378,4091],{"class":167},[153,5380,528],{"class":313},[153,5382,5383],{"class":167},"\"\u002Fhome\u002Fyou\u002Fprojects\"",[153,5385,5386],{"class":313},"]\n",[153,5388,5389],{"class":155,"line":1401},[153,5390,3891],{"class":313},[153,5392,5393],{"class":155,"line":1407},[153,5394,3896],{"class":313},[153,5396,5397],{"class":155,"line":1129},[153,5398,3901],{"class":313},[12,5400,5401],{},"Claude Code starts each server as a subprocess and routes tool calls to the correct one based on the tool name. There is no performance penalty for having multiple servers configured — they only consume resources when invoked.",[35,5403,2514],{"id":2513},[138,5405,5407],{"id":5406},"what-is-the-difference-between-mcp-servers-and-agent-skills","What is the difference between MCP servers and agent skills?",[12,5409,5410,5411,667],{},"MCP servers are running processes that expose tools over JSON-RPC — they can call APIs, query databases, and control browsers. Agent skills are Markdown instructions that teach Claude how to perform tasks using its built-in capabilities. Skills are simpler to create; MCP servers are more powerful for external integrations. See our full comparison in ",[71,5412,1263],{"href":1262},[138,5414,5416],{"id":5415},"do-mcp-servers-work-with-other-ai-agents-besides-claude-code","Do MCP servers work with other AI agents besides Claude Code?",[12,5418,5419,5420,5425],{},"Yes. MCP is an open protocol — any agent that implements the MCP client specification can use these servers. ",[71,5421,5424],{"href":5422,"rel":5423},"https:\u002F\u002Fgithub.com\u002Fopenai\u002Fcodex",[113],"Codex CLI",", Cursor, and several other tools are adding MCP support. The servers listed here work with any compliant client.",[138,5427,5429],{"id":5428},"are-mcp-servers-safe-to-use-with-production-data","Are MCP servers safe to use with production data?",[12,5431,5432],{},"It depends on the server. PostgreSQL and Elasticsearch servers default to read-only mode. GitHub and Slack servers require explicit token scopes. Always use test\u002Fstaging credentials during development. Review each server's permission model before connecting to production systems.",[138,5434,5436],{"id":5435},"how-do-i-build-my-own-mcp-server","How do I build my own MCP server?",[12,5438,5439,5440,5445,5446,5448,5449,5453],{},"Start with the official ",[71,5441,5444],{"href":5442,"rel":5443},"https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fsdk",[113],"MCP SDK on GitHub"," and follow our ",[71,5447,1258],{"href":1169}," guide for general patterns. Use the ",[71,5450,5452],{"href":5212,"rel":5451},[113],"MCP Inspector"," to validate your implementation.",[35,5455,1020],{"id":1019},[19,5457,5458,5463,5468,5473],{},[22,5459,5460,5462],{},[71,5461,1258],{"href":1169}," — build custom commands for Claude Code",[22,5464,5465,5467],{},[71,5466,1263],{"href":1262}," — understand which extension type fits your workflow",[22,5469,5470,5472],{},[71,5471,2690],{"href":2689}," — complement MCP servers with agent skills",[22,5474,5475,5480],{},[71,5476,5479],{"href":5477,"rel":5478},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fcollections\u002Fmcp-servers",[113],"Browse MCP Servers on TokRepo"," — discover more servers for your stack",[1074,5482,5483],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":148,"searchDepth":208,"depth":208,"links":5485},[5486,5487,5488,5502,5503,5504,5510],{"id":78,"depth":208,"text":79},{"id":3764,"depth":208,"text":3765},{"id":3785,"depth":208,"text":3786,"children":5489},[5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501],{"id":3789,"depth":242,"text":3790},{"id":3917,"depth":242,"text":3918},{"id":4027,"depth":242,"text":4028},{"id":4141,"depth":242,"text":4142},{"id":4262,"depth":242,"text":4263},{"id":4401,"depth":242,"text":4402},{"id":4514,"depth":242,"text":4515},{"id":4636,"depth":242,"text":4637},{"id":4756,"depth":242,"text":4757},{"id":4878,"depth":242,"text":4879},{"id":5000,"depth":242,"text":5001},{"id":5097,"depth":242,"text":5098},{"id":3482,"depth":208,"text":3483},{"id":5224,"depth":208,"text":5225},{"id":2513,"depth":208,"text":2514,"children":5505},[5506,5507,5508,5509],{"id":5406,"depth":242,"text":5407},{"id":5415,"depth":242,"text":5416},{"id":5428,"depth":242,"text":5429},{"id":5435,"depth":242,"text":5436},{"id":1019,"depth":208,"text":1020},"Curated list of the 12 best MCP servers for Claude Code and AI coding agents. Each server tested with real projects, complete with JSON config and usage examples.","精选 12 个最佳 MCP Server，每个都经过真实项目测试，附完整 JSON 配置和使用示例。",[5514,5516,5518,5520,5523],{"q":5407,"a":5515},"MCP servers are running processes that expose tools over JSON-RPC — they can call APIs, query databases, and control browsers. Agent skills are Markdown instructions that teach Claude how to perform tasks using its built-in capabilities. Skills are simpler; MCP servers are more powerful for external integrations.",{"q":5416,"a":5517},"Yes. MCP is an open protocol — any agent that implements the MCP client specification can use these servers. Codex CLI, Cursor, and several other tools are adding MCP support. The 12 servers listed here work with any compliant client without modification.",{"q":5429,"a":5519},"It depends on the server. PostgreSQL and Elasticsearch servers default to read-only mode. GitHub and Slack servers require explicit token scopes. Always use test\u002Fstaging credentials during development — never expose production Stripe keys or service-role Supabase keys in shared configs.",{"q":5521,"a":5522},"How do I configure multiple MCP servers at once?","Add them all to one mcpServers object in ~\u002F.claude\u002Fsettings.json, each with its own command, args, and env. Claude Code starts each server as a subprocess and routes tool calls by name. There is no performance penalty — servers only consume resources when invoked.",{"q":5436,"a":5524},"Start with the official MCP SDK on GitHub, define tools and resources using the FastMCP decorators in Python or the MCP TypeScript SDK, then use MCP Inspector to validate JSON-RPC responses, check protocol compliance, and debug handshake failures before connecting it to Claude Code.","\u002Fguide\u002Fimages\u002Fbest-mcp-servers-hero.svg",{},"\u002Fen\u002Fguide\u002Fbest-mcp-servers",{"title":3732,"description":5511},"en\u002Fguide\u002Fbest-mcp-servers",[5531,2769,3701,3726],"mcp","2026 年 12 个最佳 MCP Server 推荐（AI 编程助手必备）","The 12 best MCP servers for Claude Code in 2026 are GitHub (PR workflows), PostgreSQL (database queries), Filesystem (multi-directory access), SQLite, Slack, Puppeteer (headless browser), Sentry, Stripe, Supabase, Elasticsearch, Glama (MCP discovery), and MCP Inspector (debugging). Configure each one in ~\u002F.claude\u002Fsettings.json under mcpServers with command, args, and env — Claude Code starts them as subprocesses and routes tool calls by name.","65BdQ0clg7hhxChPU8LFyafswsABUGdBsDW38DOpgpc",{"id":5536,"title":5537,"answer":6,"answerZh":6,"author":7,"body":5538,"category":1106,"description":6625,"descriptionZh":6626,"extension":1109,"faqs":6627,"faqsZh":6,"image":6643,"meta":6644,"navigation":245,"path":6645,"publishedAt":2764,"readTime":1356,"seo":6646,"stem":6647,"tags":6648,"titleZh":6650,"tldr":6651,"tldrZh":6,"updatedAt":2764,"__hash__":6652},"docs_en\u002Fen\u002Fguide\u002Fcodex-cli-skills.md","How Do You Install and Use OpenAI Codex CLI Skills?",{"type":9,"value":5539,"toc":6585},[5540,5543,5547,5553,5559,5562,5601,5612,5616,5618,5626,5630,5648,5652,5670,5680,5705,5709,5721,5725,5728,5740,5743,5747,5750,5770,5788,5792,5801,5805,5811,5914,5918,5924,5948,5958,5962,5968,6000,6003,6007,6013,6017,6020,6046,6052,6056,6076,6082,6130,6134,6137,6168,6172,6177,6179,6187,6193,6208,6214,6216,6218,6223,6228,6243,6248,6250,6254,6259,6264,6280,6286,6288,6292,6297,6305,6321,6327,6329,6331,6336,6341,6357,6363,6365,6369,6374,6379,6395,6401,6403,6407,6412,6417,6432,6437,6439,6443,6448,6453,6468,6473,6475,6479,6482,6486,6490,6496,6501,6503,6507,6520,6524,6533,6537,6546,6548,6551,6575,6582],[12,5541,5542],{},"Learn how to install and use agent skills with OpenAI's Codex CLI — from initial setup to discovering the best community-built skills that make your terminal-based coding agent dramatically more productive.",[35,5544,5546],{"id":5545},"what-is-codex-cli","What Is Codex CLI?",[12,5548,5549,5552],{},[71,5550,5424],{"href":5422,"rel":5551},[113]," is OpenAI's open-source command-line coding agent. It connects to OpenAI models (GPT-4.1 and o3 by default) and operates directly in your terminal — reading your codebase, writing code, running commands, and iterating on changes with your approval.",[12,5554,5555,5556,667],{},"Unlike browser-based coding assistants, Codex CLI works where developers already live: the terminal. It understands your project structure by scanning files, and you can teach it project-specific workflows through a file called ",[150,5557,5558],{},"AGENTS.md",[12,5560,5561],{},"Key characteristics:",[19,5563,5564,5574,5580,5586,5592],{},[22,5565,5566,5569,5570],{},[45,5567,5568],{},"Open source"," — MIT licensed, fully inspectable on ",[71,5571,5573],{"href":5422,"rel":5572},[113],"GitHub",[22,5575,5576,5579],{},[45,5577,5578],{},"Terminal native"," — runs as a CLI tool, no browser or IDE plugin needed",[22,5581,5582,5585],{},[45,5583,5584],{},"Multi-model"," — supports GPT-4.1, o3, o4-mini, and other OpenAI models",[22,5587,5588,5591],{},[45,5589,5590],{},"Sandboxed execution"," — runs commands in an isolated environment for safety",[22,5593,5594,5597,5598,5600],{},[45,5595,5596],{},"Skill-aware"," — reads ",[150,5599,5558],{}," files to learn project-specific instructions",[12,5602,5603,5604,5606,5607,5611],{},"If you have used ",[71,5605,1159],{"href":2689}," or plan to try ",[71,5608,5610],{"href":5609},"\u002Fguide\u002Fgemini-cli-skills","Gemini CLI",", Codex CLI is the OpenAI equivalent — and skills work across all three with minor format adjustments.",[35,5613,5615],{"id":5614},"install-codex-cli","Install Codex CLI",[138,5617,79],{"id":78},[19,5619,5620,5623],{},[22,5621,5622],{},"Node.js 22 or later",[22,5624,5625],{},"An OpenAI API key with access to GPT-4.1 or o3",[138,5627,5629],{"id":5628},"step-1-install-via-npm","Step 1: Install via npm",[143,5631,5633],{"className":145,"code":5632,"language":147,"meta":148,"style":148},"npm install -g @openai\u002Fcodex\n",[150,5634,5635],{"__ignoreMap":148},[153,5636,5637,5640,5642,5645],{"class":155,"line":156},[153,5638,5639],{"class":159},"npm",[153,5641,1590],{"class":167},[153,5643,5644],{"class":163}," -g",[153,5646,5647],{"class":167}," @openai\u002Fcodex\n",[138,5649,5651],{"id":5650},"step-2-set-your-api-key","Step 2: Set your API key",[143,5653,5655],{"className":145,"code":5654,"language":147,"meta":148,"style":148},"export OPENAI_API_KEY=\"sk-...\"\n",[150,5656,5657],{"__ignoreMap":148},[153,5658,5659,5662,5665,5667],{"class":155,"line":156},[153,5660,5661],{"class":171},"export",[153,5663,5664],{"class":313}," OPENAI_API_KEY",[153,5666,1932],{"class":171},[153,5668,5669],{"class":167},"\"sk-...\"\n",[12,5671,5672,5673,4151,5676,5679],{},"Add this to your shell profile (",[150,5674,5675],{},"~\u002F.zshrc",[150,5677,5678],{},"~\u002F.bashrc",") so it persists across sessions:",[143,5681,5683],{"className":145,"code":5682,"language":147,"meta":148,"style":148},"echo 'export OPENAI_API_KEY=\"sk-...\"' >> ~\u002F.zshrc\nsource ~\u002F.zshrc\n",[150,5684,5685,5698],{"__ignoreMap":148},[153,5686,5687,5689,5692,5695],{"class":155,"line":156},[153,5688,1570],{"class":163},[153,5690,5691],{"class":167}," 'export OPENAI_API_KEY=\"sk-...\"'",[153,5693,5694],{"class":171}," >>",[153,5696,5697],{"class":167}," ~\u002F.zshrc\n",[153,5699,5700,5703],{"class":155,"line":208},[153,5701,5702],{"class":163},"source",[153,5704,5697],{"class":167},[138,5706,5708],{"id":5707},"step-3-verify-the-installation","Step 3: Verify the installation",[143,5710,5712],{"className":145,"code":5711,"language":147,"meta":148,"style":148},"codex --version\n",[150,5713,5714],{"__ignoreMap":148},[153,5715,5716,5719],{"class":155,"line":156},[153,5717,5718],{"class":159},"codex",[153,5720,205],{"class":163},[138,5722,5724],{"id":5723},"step-4-run-your-first-command","Step 4: Run your first command",[12,5726,5727],{},"Navigate to any project directory and run:",[143,5729,5731],{"className":145,"code":5730,"language":147,"meta":148,"style":148},"codex \"explain the structure of this project\"\n",[150,5732,5733],{"__ignoreMap":148},[153,5734,5735,5737],{"class":155,"line":156},[153,5736,5718],{"class":159},[153,5738,5739],{"class":167}," \"explain the structure of this project\"\n",[12,5741,5742],{},"Codex will scan your files and provide a detailed overview. From here, you can ask it to write code, fix bugs, refactor, or run any workflow you describe.",[138,5744,5746],{"id":5745},"approval-modes","Approval Modes",[12,5748,5749],{},"Codex CLI offers three modes that control how much autonomy the agent has:",[19,5751,5752,5758,5764],{},[22,5753,5754,5757],{},[45,5755,5756],{},"suggest"," (default) — Codex reads files and suggests changes, but you approve every edit and command",[22,5759,5760,5763],{},[45,5761,5762],{},"auto-edit"," — Codex can edit files automatically, but still asks before running commands",[22,5765,5766,5769],{},[45,5767,5768],{},"full-auto"," — Codex reads, writes, and executes commands without asking (use with caution in sandboxed environments)",[143,5771,5773],{"className":145,"code":5772,"language":147,"meta":148,"style":148},"codex --approval-mode full-auto \"add unit tests for the auth module\"\n",[150,5774,5775],{"__ignoreMap":148},[153,5776,5777,5779,5782,5785],{"class":155,"line":156},[153,5778,5718],{"class":159},[153,5780,5781],{"class":163}," --approval-mode",[153,5783,5784],{"class":167}," full-auto",[153,5786,5787],{"class":167}," \"add unit tests for the auth module\"\n",[35,5789,5791],{"id":5790},"how-codex-cli-reads-skills","How Codex CLI Reads Skills",[12,5793,5794,5795,5797,5798,5800],{},"Codex CLI uses a file called ",[150,5796,5558],{}," to discover project-specific instructions. This is its equivalent of Claude Code's ",[150,5799,1296],{}," directory or custom instructions files.",[138,5802,5804],{"id":5803},"the-agentsmd-format","The AGENTS.md Format",[12,5806,5807,5808,5810],{},"Place an ",[150,5809,5558],{}," file in your project root (or any subdirectory — Codex discovers them recursively). The file uses standard Markdown:",[143,5812,5816],{"className":5813,"code":5814,"language":5815,"meta":148,"style":148},"language-markdown shiki shiki-themes github-light github-dark","# AGENTS.md\n\n## Project Overview\nThis is a Nuxt 3 + Go-Zero full-stack application.\nThe frontend is in \u002Ffrontend-nuxt and the backend is in \u002Fbackend-go.\n\n## Code Style\n- Use TypeScript strict mode\n- Prefer composition API over options API\n- All API responses follow the {code, data, message} format\n\n## Testing\n- Run `npm test` before committing\n- Use Vitest for unit tests\n- E2E tests live in \u002Ftests\u002Fe2e\u002F\n\n## Deployment\n- Never modify production configs directly\n- Use `bash deploy.sh frontend` for frontend deploys\n- Backend deploys require a PR review first\n","markdown",[150,5817,5818,5823,5827,5832,5837,5842,5846,5851,5856,5861,5866,5870,5875,5880,5885,5890,5894,5899,5904,5909],{"__ignoreMap":148},[153,5819,5820],{"class":155,"line":156},[153,5821,5822],{},"# AGENTS.md\n",[153,5824,5825],{"class":155,"line":208},[153,5826,246],{"emptyLinePlaceholder":245},[153,5828,5829],{"class":155,"line":242},[153,5830,5831],{},"## Project Overview\n",[153,5833,5834],{"class":155,"line":249},[153,5835,5836],{},"This is a Nuxt 3 + Go-Zero full-stack application.\n",[153,5838,5839],{"class":155,"line":255},[153,5840,5841],{},"The frontend is in \u002Ffrontend-nuxt and the backend is in \u002Fbackend-go.\n",[153,5843,5844],{"class":155,"line":268},[153,5845,246],{"emptyLinePlaceholder":245},[153,5847,5848],{"class":155,"line":281},[153,5849,5850],{},"## Code Style\n",[153,5852,5853],{"class":155,"line":1356},[153,5854,5855],{},"- Use TypeScript strict mode\n",[153,5857,5858],{"class":155,"line":1362},[153,5859,5860],{},"- Prefer composition API over options API\n",[153,5862,5863],{"class":155,"line":1367},[153,5864,5865],{},"- All API responses follow the {code, data, message} format\n",[153,5867,5868],{"class":155,"line":1372},[153,5869,246],{"emptyLinePlaceholder":245},[153,5871,5872],{"class":155,"line":1378},[153,5873,5874],{},"## Testing\n",[153,5876,5877],{"class":155,"line":1383},[153,5878,5879],{},"- Run `npm test` before committing\n",[153,5881,5882],{"class":155,"line":1389},[153,5883,5884],{},"- Use Vitest for unit tests\n",[153,5886,5887],{"class":155,"line":1395},[153,5888,5889],{},"- E2E tests live in \u002Ftests\u002Fe2e\u002F\n",[153,5891,5892],{"class":155,"line":1401},[153,5893,246],{"emptyLinePlaceholder":245},[153,5895,5896],{"class":155,"line":1407},[153,5897,5898],{},"## Deployment\n",[153,5900,5901],{"class":155,"line":1129},[153,5902,5903],{},"- Never modify production configs directly\n",[153,5905,5906],{"class":155,"line":1417},[153,5907,5908],{},"- Use `bash deploy.sh frontend` for frontend deploys\n",[153,5910,5911],{"class":155,"line":1423},[153,5912,5913],{},"- Backend deploys require a PR review first\n",[138,5915,5917],{"id":5916},"auto-discovery-rules","Auto-Discovery Rules",[12,5919,5920,5921,5923],{},"Codex CLI automatically discovers ",[150,5922,5558],{}," files through a hierarchy:",[428,5925,5926,5934,5942],{},[22,5927,5928,5933],{},[45,5929,5930,5931],{},"Root ",[150,5932,5558],{}," — applies to the entire project",[22,5935,5936,5941],{},[45,5937,5938,5939],{},"Subdirectory ",[150,5940,5558],{}," — applies only within that directory and its children",[22,5943,5944,5947],{},[45,5945,5946],{},"Multiple files merge"," — if both exist, Codex combines them (subdirectory instructions take priority for conflicts)",[12,5949,5950,5951,5953,5954,5957],{},"This means you can have a top-level ",[150,5952,5558],{}," for global conventions and a ",[150,5955,5956],{},"frontend\u002FAGENTS.md"," with frontend-specific rules.",[138,5959,5961],{"id":5960},"what-to-put-in-agentsmd","What to Put in AGENTS.md",[12,5963,5964,5965,5967],{},"The best ",[150,5966,5558],{}," files cover:",[19,5969,5970,5976,5982,5988,5994],{},[22,5971,5972,5975],{},[45,5973,5974],{},"Project architecture"," — what lives where, key directories",[22,5977,5978,5981],{},[45,5979,5980],{},"Code conventions"," — naming, formatting, patterns to follow",[22,5983,5984,5987],{},[45,5985,5986],{},"Common commands"," — how to build, test, deploy, lint",[22,5989,5990,5993],{},[45,5991,5992],{},"Gotchas"," — things the agent should never do, edge cases to watch for",[22,5995,5996,5999],{},[45,5997,5998],{},"Workflow instructions"," — step-by-step playbooks for recurring tasks",[12,6001,6002],{},"Think of it as onboarding documentation for an AI teammate. The more specific you are, the better Codex performs.",[35,6004,6006],{"id":6005},"install-skills-from-tokrepo","Install Skills from TokRepo",[12,6008,6009,6012],{},[71,6010,1519],{"href":1517,"rel":6011},[113]," is a community registry for agent skills. Skills published on TokRepo work with Claude Code, Codex CLI, and Gemini CLI — you just need to place them in the right location.",[138,6014,6016],{"id":6015},"method-1-tokrepo-cli-recommended","Method 1: TokRepo CLI (Recommended)",[12,6018,6019],{},"The fastest way to install a skill:",[143,6021,6023],{"className":145,"code":6022,"language":147,"meta":148,"style":148},"npx tokrepo install \u003Casset-uuid>\n",[150,6024,6025],{"__ignoreMap":148},[153,6026,6027,6029,6032,6034,6037,6040,6043],{"class":155,"line":156},[153,6028,5190],{"class":159},[153,6030,6031],{"class":167}," tokrepo",[153,6033,1590],{"class":167},[153,6035,6036],{"class":171}," \u003C",[153,6038,6039],{"class":167},"asset-uui",[153,6041,6042],{"class":313},"d",[153,6044,6045],{"class":171},">\n",[12,6047,6048,6049,6051],{},"This downloads the skill file and places it in your project's skill directory. For Codex CLI, you may want to consolidate instructions into your ",[150,6050,5558],{}," or place skill files where Codex can reference them.",[138,6053,6055],{"id":6054},"method-2-manual-copy","Method 2: Manual Copy",[428,6057,6058,6064,6067],{},[22,6059,6060,6061],{},"Visit the skill page on ",[71,6062,1519],{"href":1530,"rel":6063},[113],[22,6065,6066],{},"Copy the Markdown content",[22,6068,6069,6070,6072,6073,6075],{},"Paste it into your project's ",[150,6071,5558],{}," file, or save it as a separate ",[150,6074,1292],{}," file in your project",[12,6077,6078,6079,6081],{},"For Codex CLI specifically, the cleanest approach is to merge skill instructions into your ",[150,6080,5558],{}," under clearly labeled sections:",[143,6083,6085],{"className":5813,"code":6084,"language":5815,"meta":148,"style":148},"# AGENTS.md\n\n## Debugging Workflow\n\u003C!-- Pasted from Systematic Debugging skill -->\nWhen debugging, follow these steps:\n1. Reproduce the issue with a minimal test case\n2. Add strategic logging at key decision points\n3. Form a hypothesis before changing code\n4. Verify the fix doesn't introduce regressions\n",[150,6086,6087,6091,6095,6100,6105,6110,6115,6120,6125],{"__ignoreMap":148},[153,6088,6089],{"class":155,"line":156},[153,6090,5822],{},[153,6092,6093],{"class":155,"line":208},[153,6094,246],{"emptyLinePlaceholder":245},[153,6096,6097],{"class":155,"line":242},[153,6098,6099],{},"## Debugging Workflow\n",[153,6101,6102],{"class":155,"line":249},[153,6103,6104],{},"\u003C!-- Pasted from Systematic Debugging skill -->\n",[153,6106,6107],{"class":155,"line":255},[153,6108,6109],{},"When debugging, follow these steps:\n",[153,6111,6112],{"class":155,"line":268},[153,6113,6114],{},"1. Reproduce the issue with a minimal test case\n",[153,6116,6117],{"class":155,"line":281},[153,6118,6119],{},"2. Add strategic logging at key decision points\n",[153,6121,6122],{"class":155,"line":1356},[153,6123,6124],{},"3. Form a hypothesis before changing code\n",[153,6126,6127],{"class":155,"line":1362},[153,6128,6129],{},"4. Verify the fix doesn't introduce regressions\n",[138,6131,6133],{"id":6132},"method-3-symlink-for-multi-agent-projects","Method 3: Symlink for Multi-Agent Projects",[12,6135,6136],{},"If you use both Claude Code and Codex CLI on the same project, you can maintain a single source of truth:",[143,6138,6140],{"className":145,"code":6139,"language":147,"meta":148,"style":148},"# Skills live in .claude\u002Fcommands\u002F for Claude Code\n# Symlink key content into AGENTS.md for Codex CLI\ncat .claude\u002Fcommands\u002F*.md >> AGENTS.md\n",[150,6141,6142,6147,6152],{"__ignoreMap":148},[153,6143,6144],{"class":155,"line":156},[153,6145,6146],{"class":211},"# Skills live in .claude\u002Fcommands\u002F for Claude Code\n",[153,6148,6149],{"class":155,"line":208},[153,6150,6151],{"class":211},"# Symlink key content into AGENTS.md for Codex CLI\n",[153,6153,6154,6156,6158,6161,6163,6165],{"class":155,"line":242},[153,6155,1331],{"class":159},[153,6157,2582],{"class":167},[153,6159,6160],{"class":163},"*",[153,6162,1292],{"class":167},[153,6164,5694],{"class":171},[153,6166,6167],{"class":167}," AGENTS.md\n",[35,6169,6171],{"id":6170},"_8-recommended-skills-for-codex-cli","8 Recommended Skills for Codex CLI",[12,6173,6174,6175,667],{},"These skills have been tested with Codex CLI and provide immediate productivity gains. Each one is available on TokRepo and can be installed or copied into your ",[150,6176,5558],{},[138,6178,2039],{"id":2038},[12,6180,6181,6183,6184,6186],{},[45,6182,2833],{}," A comprehensive project management framework that breaks large projects into milestones, phases, and tasks. Tracks progress across sessions with persistent ",[150,6185,2866],{}," directories.",[12,6188,6189,6192],{},[45,6190,6191],{},"Why it matters for Codex:"," Codex CLI excels at focused tasks but can lose track of multi-step projects. GSD provides the scaffolding to keep complex work on track.",[143,6194,6196],{"className":145,"code":6195,"language":147,"meta":148,"style":148},"npx tokrepo install e108cf5c-c34e-4d27-a694-66a693301e87\n",[150,6197,6198],{"__ignoreMap":148},[153,6199,6200,6202,6204,6206],{"class":155,"line":156},[153,6201,5190],{"class":159},[153,6203,6031],{"class":167},[153,6205,1590],{"class":167},[153,6207,2056],{"class":167},[12,6209,6210],{},[71,6211,6213],{"href":2061,"rel":6212},[113],"View on TokRepo",[2874,6215],{},[138,6217,2879],{"id":2878},[12,6219,6220,6222],{},[45,6221,2833],{}," A curated collection of 13,000+ community-contributed skills covering Next.js, React, deployment patterns, and full-stack development workflows.",[12,6224,6225,6227],{},[45,6226,6191],{}," If you work with Vercel, Next.js, or React, this collection gives Codex domain-specific knowledge that dramatically improves code quality.",[143,6229,6231],{"className":145,"code":6230,"language":147,"meta":148,"style":148},"npx tokrepo install d1eba6f1-5166-4762-bbbd-cf00f14892b7\n",[150,6232,6233],{"__ignoreMap":148},[153,6234,6235,6237,6239,6241],{"class":155,"line":156},[153,6236,5190],{"class":159},[153,6238,6031],{"class":167},[153,6240,1590],{"class":167},[153,6242,2907],{"class":167},[12,6244,6245],{},[71,6246,6213],{"href":2918,"rel":6247},[113],[2874,6249],{},[138,6251,6253],{"id":6252},"_3-claude-seo-complete-seo-skill","3. Claude SEO — Complete SEO Skill",[12,6255,6256,6258],{},[45,6257,2833],{}," Runs comprehensive SEO audits — keyword research, on-page analysis, content gap identification, technical checks, and competitor comparison.",[12,6260,6261,6263],{},[45,6262,6191],{}," SEO requires following a structured checklist. This skill ensures Codex covers all the bases instead of improvising an incomplete audit.",[143,6265,6267],{"className":145,"code":6266,"language":147,"meta":148,"style":148},"npx tokrepo install cb068086-48bc-4dc2-b53e-9a16eba5b51f\n",[150,6268,6269],{"__ignoreMap":148},[153,6270,6271,6273,6275,6277],{"class":155,"line":156},[153,6272,5190],{"class":159},[153,6274,6031],{"class":167},[153,6276,1590],{"class":167},[153,6278,6279],{"class":167}," cb068086-48bc-4dc2-b53e-9a16eba5b51f\n",[12,6281,6282],{},[71,6283,6213],{"href":6284,"rel":6285},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002Fcb068086-48bc-4dc2-b53e-9a16eba5b51f",[113],[2874,6287],{},[138,6289,6291],{"id":6290},"_4-systematic-debugging","4. Systematic Debugging",[12,6293,6294,6296],{},[45,6295,2833],{}," A structured debugging methodology — reproduce, isolate, hypothesize, fix, verify. Prevents the common trap of changing code randomly until something works.",[12,6298,6299,6301,6302,6304],{},[45,6300,6191],{}," When Codex runs in ",[150,6303,5768],{}," mode, a debugging skill prevents it from spiraling into trial-and-error loops. It forces methodical investigation.",[143,6306,6308],{"className":145,"code":6307,"language":147,"meta":148,"style":148},"npx tokrepo install 78ed006e-0c05-4bab-91de-c0c72c3e4cc4\n",[150,6309,6310],{"__ignoreMap":148},[153,6311,6312,6314,6316,6318],{"class":155,"line":156},[153,6313,5190],{"class":159},[153,6315,6031],{"class":167},[153,6317,1590],{"class":167},[153,6319,6320],{"class":167}," 78ed006e-0c05-4bab-91de-c0c72c3e4cc4\n",[12,6322,6323],{},[71,6324,6213],{"href":6325,"rel":6326},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F78ed006e-0c05-4bab-91de-c0c72c3e4cc4",[113],[2874,6328],{},[138,6330,2148],{"id":2147},[12,6332,6333,6335],{},[45,6334,2833],{}," Creates structured plan files before executing complex tasks. Writes the plan to disk so it persists across context windows and sessions.",[12,6337,6338,6340],{},[45,6339,6191],{}," Codex CLI sessions can be long-running. Planning skills ensure the agent thinks before acting and maintains a written record of its approach.",[143,6342,6344],{"className":145,"code":6343,"language":147,"meta":148,"style":148},"npx tokrepo install 034be597-dbb5-4649-ad6e-98f9ff6332b8\n",[150,6345,6346],{"__ignoreMap":148},[153,6347,6348,6350,6352,6354],{"class":155,"line":156},[153,6349,5190],{"class":159},[153,6351,6031],{"class":167},[153,6353,1590],{"class":167},[153,6355,6356],{"class":167}," 034be597-dbb5-4649-ad6e-98f9ff6332b8\n",[12,6358,6359],{},[71,6360,6213],{"href":6361,"rel":6362},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F034be597-dbb5-4649-ad6e-98f9ff6332b8",[113],[2874,6364],{},[138,6366,6368],{"id":6367},"_6-web-access","6. Web Access",[12,6370,6371,6373],{},[45,6372,2833],{}," Gives the agent structured methods for fetching and parsing web content — documentation pages, API references, and live data.",[12,6375,6376,6378],{},[45,6377,6191],{}," By default, Codex CLI cannot browse the web. This skill provides patterns for incorporating external information when the agent needs to reference docs or check live endpoints.",[143,6380,6382],{"className":145,"code":6381,"language":147,"meta":148,"style":148},"npx tokrepo install 5766b7f4-bfdb-4048-87e7-50af1e5f6f88\n",[150,6383,6384],{"__ignoreMap":148},[153,6385,6386,6388,6390,6392],{"class":155,"line":156},[153,6387,5190],{"class":159},[153,6389,6031],{"class":167},[153,6391,1590],{"class":167},[153,6393,6394],{"class":167}," 5766b7f4-bfdb-4048-87e7-50af1e5f6f88\n",[12,6396,6397],{},[71,6398,6213],{"href":6399,"rel":6400},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F5766b7f4-bfdb-4048-87e7-50af1e5f6f88",[113],[2874,6402],{},[138,6404,6406],{"id":6405},"_7-skill-creator","7. Skill Creator",[12,6408,6409,6411],{},[45,6410,2833],{}," A meta-skill that guides you through creating new agent skills — writing the frontmatter, triggers, instructions, and testing steps.",[12,6413,6414,6416],{},[45,6415,6191],{}," Once you have used a few skills, you will want to create your own. This skill makes the process repeatable and ensures your custom skills follow best practices.",[143,6418,6420],{"className":145,"code":6419,"language":147,"meta":148,"style":148},"npx tokrepo install 0b7c0a41-97e1-4187-9cc5-4dc32d91a9cd\n",[150,6421,6422],{"__ignoreMap":148},[153,6423,6424,6426,6428,6430],{"class":155,"line":156},[153,6425,5190],{"class":159},[153,6427,6031],{"class":167},[153,6429,1590],{"class":167},[153,6431,2138],{"class":167},[12,6433,6434],{},[71,6435,6213],{"href":2143,"rel":6436},[113],[2874,6438],{},[138,6440,6442],{"id":6441},"_8-agent-skills-standard","8. Agent Skills Standard",[12,6444,6445,6447],{},[45,6446,2833],{}," Defines the universal standard for agent skill files — metadata fields, instruction format, trigger conventions, and compatibility rules across different AI agents.",[12,6449,6450,6452],{},[45,6451,6191],{}," If you want your skills to work across Codex CLI, Claude Code, and Gemini CLI, this standard tells you exactly what fields to include and how to structure them.",[143,6454,6456],{"className":145,"code":6455,"language":147,"meta":148,"style":148},"npx tokrepo install 1a1292f5-c88b-4eb5-b7dd-a3bf7bb29ee8\n",[150,6457,6458],{"__ignoreMap":148},[153,6459,6460,6462,6464,6466],{"class":155,"line":156},[153,6461,5190],{"class":159},[153,6463,6031],{"class":167},[153,6465,1590],{"class":167},[153,6467,3471],{"class":167},[12,6469,6470],{},[71,6471,6213],{"href":3476,"rel":6472},[113],[2874,6474],{},[35,6476,6478],{"id":6477},"codex-cli-vs-claude-code-skill-compatibility","Codex CLI vs Claude Code: Skill Compatibility",[12,6480,6481],{},"Both Codex CLI and Claude Code support agent skills, but they read them differently. Understanding the differences helps you write skills that work with both.",[3485,6483],{":headers":6484,":rows":6485},"[\"Feature\",\"Codex CLI\",\"Claude Code\"]","[[\"Skill file format\",\"AGENTS.md (Markdown)\",\".md files in .claude\u002Fcommands\u002F\"],[\"Discovery method\",\"Auto-scan from project root\",\"Fixed directory lookup\"],[\"Activation\",\"Always active (merged into context)\",\"On-demand (slash commands \u002F NL)\"],[\"Frontmatter\",\"Not required\",\"Optional (name, description, triggers)\"],[\"Subdirectory scoping\",\"Yes (directory-level AGENTS.md)\",\"No (global only)\"],[\"Multiple skills\",\"Single file with sections\",\"One file per skill\"],[\"Skill registry\",\"TokRepo \u002F manual copy\",\"TokRepo \u002F tokrepo install\"],[\"Model provider\",\"OpenAI (GPT-4.1, o3, o4-mini)\",\"Anthropic (Claude Sonnet\u002FOpus)\"]]",[138,6487,6489],{"id":6488},"key-takeaway","Key Takeaway",[12,6491,6492,6493,6495],{},"Skills written for Claude Code can be adapted for Codex CLI by copying the instruction content into ",[150,6494,5558],{},". The core logic — the steps, rules, and workflows — transfers directly. Only the packaging differs.",[12,6497,6498,6499,667],{},"For a deeper comparison of skill formats across all major AI coding agents, see ",[71,6500,1263],{"href":1262},[35,6502,2514],{"id":2513},[138,6504,6506],{"id":6505},"can-i-use-claude-code-skills-directly-with-codex-cli","Can I use Claude Code skills directly with Codex CLI?",[12,6508,6509,6510,6512,6513,6515,6516,6519],{},"Yes, with minor adaptation. Claude Code skills are Markdown files with instructions — the same format Codex CLI reads from ",[150,6511,5558],{},". Copy the instruction content (everything below the frontmatter) into your ",[150,6514,5558],{}," file. The frontmatter fields like ",[150,6517,6518],{},"triggers"," are Claude Code-specific and can be removed for Codex.",[138,6521,6523],{"id":6522},"does-codex-cli-support-slash-commands-like-claude-code","Does Codex CLI support slash commands like Claude Code?",[12,6525,6526,6527,6529,6530,667],{},"No. Codex CLI does not have a slash command system. Instead, all instructions from ",[150,6528,5558],{}," are loaded into context automatically. You activate specific workflows by describing what you want in natural language — for example, \"debug this issue using the systematic debugging approach\" instead of typing ",[150,6531,6532],{},"\u002Fdebug",[138,6534,6536],{"id":6535},"is-codex-cli-free-to-use","Is Codex CLI free to use?",[12,6538,6539,6540,6545],{},"Codex CLI itself is free and open source. However, it calls OpenAI's API, which requires a paid API key. Costs depend on the model you use — GPT-4.1 is more affordable for routine tasks, while o3 provides stronger reasoning for complex problems. Check ",[71,6541,6544],{"href":6542,"rel":6543},"https:\u002F\u002Fopenai.com\u002Fapi\u002Fpricing\u002F",[113],"OpenAI's pricing page"," for current rates.",[35,6547,1020],{"id":1019},[12,6549,6550],{},"Now that you have Codex CLI installed and configured with skills, explore these related guides:",[19,6552,6553,6558,6564,6569],{},[22,6554,6555,6557],{},[71,6556,1258],{"href":1169}," — build a custom skill from scratch",[22,6559,6560,6563],{},[71,6561,6562],{"href":1262},"Skills vs MCP vs Rules — Complete Guide"," — understand when to use each approach",[22,6565,6566,6568],{},[71,6567,2690],{"href":2689}," — more skill recommendations (most work with Codex too)",[22,6570,6571,6574],{},[71,6572,6573],{"href":5609},"Gemini CLI Skills Guide"," — set up skills for Google's CLI agent",[12,6576,6577,6578,6581],{},"Browse the full skill catalog on ",[71,6579,1519],{"href":1530,"rel":6580},[113]," to find skills for your specific tech stack and workflow.",[1074,6583,6584],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":148,"searchDepth":208,"depth":208,"links":6586},[6587,6588,6596,6601,6606,6616,6619,6624],{"id":5545,"depth":208,"text":5546},{"id":5614,"depth":208,"text":5615,"children":6589},[6590,6591,6592,6593,6594,6595],{"id":78,"depth":242,"text":79},{"id":5628,"depth":242,"text":5629},{"id":5650,"depth":242,"text":5651},{"id":5707,"depth":242,"text":5708},{"id":5723,"depth":242,"text":5724},{"id":5745,"depth":242,"text":5746},{"id":5790,"depth":208,"text":5791,"children":6597},[6598,6599,6600],{"id":5803,"depth":242,"text":5804},{"id":5916,"depth":242,"text":5917},{"id":5960,"depth":242,"text":5961},{"id":6005,"depth":208,"text":6006,"children":6602},[6603,6604,6605],{"id":6015,"depth":242,"text":6016},{"id":6054,"depth":242,"text":6055},{"id":6132,"depth":242,"text":6133},{"id":6170,"depth":208,"text":6171,"children":6607},[6608,6609,6610,6611,6612,6613,6614,6615],{"id":2038,"depth":242,"text":2039},{"id":2878,"depth":242,"text":2879},{"id":6252,"depth":242,"text":6253},{"id":6290,"depth":242,"text":6291},{"id":2147,"depth":242,"text":2148},{"id":6367,"depth":242,"text":6368},{"id":6405,"depth":242,"text":6406},{"id":6441,"depth":242,"text":6442},{"id":6477,"depth":208,"text":6478,"children":6617},[6618],{"id":6488,"depth":242,"text":6489},{"id":2513,"depth":208,"text":2514,"children":6620},[6621,6622,6623],{"id":6505,"depth":242,"text":6506},{"id":6522,"depth":242,"text":6523},{"id":6535,"depth":242,"text":6536},{"id":1019,"depth":208,"text":1020},"Step-by-step guide to installing OpenAI Codex CLI, configuring AGENTS.md skills, and the 8 best skills to supercharge your coding workflow.","手把手教你安装 OpenAI Codex CLI、配置 AGENTS.md 技能文件，以及 8 个最值得安装的精选 Skill 推荐。",[6628,6631,6634,6637,6640],{"q":6629,"a":6630},"How do I install OpenAI Codex CLI?","Run npm install -g @openai\u002Fcodex (requires Node.js 22+), then set export OPENAI_API_KEY=\"sk-...\" in your shell profile. Verify with codex --version, then run codex \"explain this project\" in any directory to start. It supports GPT-4.1, o3, o4-mini models.",{"q":6632,"a":6633},"What is AGENTS.md and how does Codex CLI use it?","AGENTS.md is a Markdown file in your project root (or any subdirectory) that tells Codex CLI your project conventions, commands, and workflows. Codex auto-discovers AGENTS.md files recursively — a root file applies globally, subdirectory files override for that subtree and are merged with priority on the more specific path.",{"q":6635,"a":6636},"Can I use Claude Code skills with Codex CLI?","Yes, with minor adaptation. Copy the instruction content (everything below the Claude Code frontmatter) into your AGENTS.md file. Claude-specific fields like triggers can be removed — Codex always loads AGENTS.md into context rather than using slash commands, so you invoke workflows in natural language.",{"q":6638,"a":6639},"Does Codex CLI support slash commands like \u002Fdebug?","No. Codex CLI has no slash command system. All instructions from AGENTS.md are loaded into context automatically. Activate specific workflows by describing them in natural language — e.g., \"debug this issue using the systematic debugging approach\" instead of typing \u002Fdebug.",{"q":6641,"a":6642},"What are Codex CLI's approval modes?","Three modes control agent autonomy: suggest (default, approve every edit\u002Fcommand), auto-edit (edits files automatically but asks before running commands), and full-auto (reads, writes, executes without asking — use only in sandboxed environments). Set via codex --approval-mode full-auto \"task description\".","\u002Fguide\u002Fimages\u002Fcodex-cli-skills-hero.svg",{},"\u002Fen\u002Fguide\u002Fcodex-cli-skills",{"title":5537,"description":6625},"en\u002Fguide\u002Fcodex-cli-skills",[5718,6649,2770,1106],"openai","如何安装和使用 OpenAI Codex CLI Skills？","Install OpenAI Codex CLI with npm install -g @openai\u002Fcodex, set OPENAI_API_KEY, then configure skills via an AGENTS.md file in your project root — Codex auto-discovers AGENTS.md files recursively and merges them into context. Install community skills from TokRepo with npx tokrepo install \u003Cuuid> or paste Markdown content directly into AGENTS.md. Top picks: GSD, Vercel Skills, Systematic Debugging, Planning with Files.","X-XeGhnGldYjvcMSgXnJEYf7Mv2Qo9MispbS1SH41g4",{"id":6654,"title":6655,"answer":6,"answerZh":6,"author":7,"body":6656,"category":3701,"description":8609,"descriptionZh":8610,"extension":1109,"faqs":8611,"faqsZh":6,"image":8626,"meta":8627,"navigation":245,"path":8628,"publishedAt":2764,"readTime":1378,"seo":8629,"stem":8630,"tags":8631,"titleZh":8634,"tldr":8635,"tldrZh":6,"updatedAt":2764,"__hash__":8636},"docs_en\u002Fen\u002Fguide\u002Fcursor-rules-guide.md","Best Cursor Rules in 2026 — 20 Rules to Supercharge Your AI Coding",{"type":9,"value":6657,"toc":8562},[6658,6665,6667,6683,6687,6693,6754,6764,6768,6774,6777,6781,6785,6788,6882,6887,6891,6898,6988,6993,6997,7004,7080,7085,7089,7096,7148,7156,7160,7163,7207,7212,7216,7220,7223,7308,7313,7317,7320,7411,7416,7420,7423,7523,7528,7532,7535,7635,7639,7646,7741,7745,7749,7791,7795,7842,7846,7893,7897,7944,7948,8000,8004,8008,8056,8060,8109,8113,8162,8166,8210,8214,8258,8262,8266,8269,8299,8303,8371,8375,8416,8420,8449,8454,8458,8465,8469,8485,8492,8494,8498,8504,8508,8511,8515,8532,8534,8559],[12,6659,6660,6661,6664],{},"Learn how to configure Cursor AI with 20 tested ",[150,6662,6663],{},".cursorrules"," files that cover frontend, backend, full-stack, and general development workflows. Each rule has been tested on real projects — we show you the format, the content, and how to combine multiple rules for maximum impact.",[35,6666,79],{"id":78},[19,6668,6669,6677,6680],{},[22,6670,6671,6676],{},[71,6672,6675],{"href":6673,"rel":6674},"https:\u002F\u002Fcursor.sh",[113],"Cursor"," installed (v0.45+)",[22,6678,6679],{},"A project directory where you want rules active",[22,6681,6682],{},"Basic understanding of how AI code assistants work",[35,6684,6686],{"id":6685},"what-are-cursor-rules","What Are Cursor Rules?",[12,6688,6689,6690,6692],{},"Cursor Rules are instruction files that tell Cursor AI how to behave in your project. Drop a ",[150,6691,6663],{}," file in your project root, and Cursor reads it every time you interact with its AI features — autocomplete, chat, Composer, and inline edits.",[143,6694,6696],{"className":5813,"code":6695,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert React developer.\n\n## Code Style\n- Use functional components with hooks\n- Prefer named exports over default exports\n- Use TypeScript strict mode\n\n## Architecture\n- Follow the feature-based folder structure\n- Keep components under 200 lines\n- Extract shared logic into custom hooks\n",[150,6697,6698,6703,6708,6712,6716,6721,6726,6730,6734,6739,6744,6749],{"__ignoreMap":148},[153,6699,6700],{"class":155,"line":156},[153,6701,6702],{},"\u003C!-- .cursorrules -->\n",[153,6704,6705],{"class":155,"line":208},[153,6706,6707],{},"You are an expert React developer.\n",[153,6709,6710],{"class":155,"line":242},[153,6711,246],{"emptyLinePlaceholder":245},[153,6713,6714],{"class":155,"line":249},[153,6715,5850],{},[153,6717,6718],{"class":155,"line":255},[153,6719,6720],{},"- Use functional components with hooks\n",[153,6722,6723],{"class":155,"line":268},[153,6724,6725],{},"- Prefer named exports over default exports\n",[153,6727,6728],{"class":155,"line":281},[153,6729,5855],{},[153,6731,6732],{"class":155,"line":1356},[153,6733,246],{"emptyLinePlaceholder":245},[153,6735,6736],{"class":155,"line":1362},[153,6737,6738],{},"## Architecture\n",[153,6740,6741],{"class":155,"line":1367},[153,6742,6743],{},"- Follow the feature-based folder structure\n",[153,6745,6746],{"class":155,"line":1372},[153,6747,6748],{},"- Keep components under 200 lines\n",[153,6750,6751],{"class":155,"line":1378},[153,6752,6753],{},"- Extract shared logic into custom hooks\n",[12,6755,6756,6757,4151,6760,6763],{},"The file sits at your project root alongside ",[150,6758,6759],{},"package.json",[150,6761,6762],{},"go.mod",". Cursor loads it automatically — no configuration needed.",[138,6765,6767],{"id":6766},"how-rules-get-applied","How Rules Get Applied",[143,6769,6772],{"className":6770,"code":6771,"language":1280},[1278],"┌──────────────┐     ┌──────────────┐     ┌──────────────┐\n│  .cursorrules │────▶│  Cursor AI   │────▶│  Generated   │\n│  (your rules) │     │  (context)   │     │  Code Output │\n└──────────────┘     └──────────────┘     └──────────────┘\n                           ▲\n                           │\n                     ┌──────────────┐\n                     │  Your Prompt │\n                     └──────────────┘\n",[150,6773,6771],{"__ignoreMap":148},[12,6775,6776],{},"Rules are prepended to every AI interaction. They act as a system prompt for your project, ensuring consistent behavior regardless of who's prompting.",[35,6778,6780],{"id":6779},"frontend-rules","Frontend Rules",[138,6782,6784],{"id":6783},"_1-react-typescript","1. React + TypeScript",[12,6786,6787],{},"The most popular Cursor rule. Enforces functional components, strict TypeScript, and modern React patterns.",[143,6789,6791],{"className":5813,"code":6790,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert React and TypeScript developer.\n\n## Rules\n- Use functional components exclusively — no class components\n- TypeScript strict mode: no `any`, no implicit returns\n- Use React.FC sparingly; prefer explicit prop types\n- State management: Zustand for global, useState for local\n- Styling: Tailwind CSS utility classes, no inline styles\n\n## Component Structure\ninterface Props {\n  title: string;\n  onAction: () => void;\n}\n\nexport function MyComponent({ title, onAction }: Props) {\n  return \u003Cbutton onClick={onAction}>{title}\u003C\u002Fbutton>;\n}\n",[150,6792,6793,6797,6802,6806,6811,6816,6821,6826,6831,6836,6840,6845,6850,6855,6860,6864,6868,6873,6878],{"__ignoreMap":148},[153,6794,6795],{"class":155,"line":156},[153,6796,6702],{},[153,6798,6799],{"class":155,"line":208},[153,6800,6801],{},"You are an expert React and TypeScript developer.\n",[153,6803,6804],{"class":155,"line":242},[153,6805,246],{"emptyLinePlaceholder":245},[153,6807,6808],{"class":155,"line":249},[153,6809,6810],{},"## Rules\n",[153,6812,6813],{"class":155,"line":255},[153,6814,6815],{},"- Use functional components exclusively — no class components\n",[153,6817,6818],{"class":155,"line":268},[153,6819,6820],{},"- TypeScript strict mode: no `any`, no implicit returns\n",[153,6822,6823],{"class":155,"line":281},[153,6824,6825],{},"- Use React.FC sparingly; prefer explicit prop types\n",[153,6827,6828],{"class":155,"line":1356},[153,6829,6830],{},"- State management: Zustand for global, useState for local\n",[153,6832,6833],{"class":155,"line":1362},[153,6834,6835],{},"- Styling: Tailwind CSS utility classes, no inline styles\n",[153,6837,6838],{"class":155,"line":1367},[153,6839,246],{"emptyLinePlaceholder":245},[153,6841,6842],{"class":155,"line":1372},[153,6843,6844],{},"## Component Structure\n",[153,6846,6847],{"class":155,"line":1378},[153,6848,6849],{},"interface Props {\n",[153,6851,6852],{"class":155,"line":1383},[153,6853,6854],{},"  title: string;\n",[153,6856,6857],{"class":155,"line":1389},[153,6858,6859],{},"  onAction: () => void;\n",[153,6861,6862],{"class":155,"line":1395},[153,6863,3901],{},[153,6865,6866],{"class":155,"line":1401},[153,6867,246],{"emptyLinePlaceholder":245},[153,6869,6870],{"class":155,"line":1407},[153,6871,6872],{},"export function MyComponent({ title, onAction }: Props) {\n",[153,6874,6875],{"class":155,"line":1129},[153,6876,6877],{},"  return \u003Cbutton onClick={onAction}>{title}\u003C\u002Fbutton>;\n",[153,6879,6880],{"class":155,"line":1417},[153,6881,3901],{},[12,6883,6884,6886],{},[45,6885,2839],{}," Teams using Create React App, Vite, or any React project with TypeScript.",[138,6888,6890],{"id":6889},"_2-vue-3-composition-api","2. Vue 3 + Composition API",[12,6892,6893,6894,6897],{},"Enforces ",[150,6895,6896],{},"\u003Cscript setup>",", composables, and Pinia state management.",[143,6899,6901],{"className":5813,"code":6900,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert Vue 3 developer using the Composition API.\n\n## Rules\n- Always use \u003Cscript setup lang=\"ts\">\n- Prefer composables (use*) for shared logic\n- State management: Pinia stores only\n- No Options API — ever\n- Use defineProps and defineEmits with TypeScript generics\n\n## File Structure\n\u003Cscript setup lang=\"ts\">\nimport { ref, computed } from 'vue'\n\nconst props = defineProps\u003C{ title: string }>()\nconst count = ref(0)\nconst doubled = computed(() => count.value * 2)\n\u003C\u002Fscript>\n",[150,6902,6903,6907,6912,6916,6920,6925,6930,6935,6940,6945,6949,6954,6959,6964,6968,6973,6978,6983],{"__ignoreMap":148},[153,6904,6905],{"class":155,"line":156},[153,6906,6702],{},[153,6908,6909],{"class":155,"line":208},[153,6910,6911],{},"You are an expert Vue 3 developer using the Composition API.\n",[153,6913,6914],{"class":155,"line":242},[153,6915,246],{"emptyLinePlaceholder":245},[153,6917,6918],{"class":155,"line":249},[153,6919,6810],{},[153,6921,6922],{"class":155,"line":255},[153,6923,6924],{},"- Always use \u003Cscript setup lang=\"ts\">\n",[153,6926,6927],{"class":155,"line":268},[153,6928,6929],{},"- Prefer composables (use*) for shared logic\n",[153,6931,6932],{"class":155,"line":281},[153,6933,6934],{},"- State management: Pinia stores only\n",[153,6936,6937],{"class":155,"line":1356},[153,6938,6939],{},"- No Options API — ever\n",[153,6941,6942],{"class":155,"line":1362},[153,6943,6944],{},"- Use defineProps and defineEmits with TypeScript generics\n",[153,6946,6947],{"class":155,"line":1367},[153,6948,246],{"emptyLinePlaceholder":245},[153,6950,6951],{"class":155,"line":1372},[153,6952,6953],{},"## File Structure\n",[153,6955,6956],{"class":155,"line":1378},[153,6957,6958],{},"\u003Cscript setup lang=\"ts\">\n",[153,6960,6961],{"class":155,"line":1383},[153,6962,6963],{},"import { ref, computed } from 'vue'\n",[153,6965,6966],{"class":155,"line":1389},[153,6967,246],{"emptyLinePlaceholder":245},[153,6969,6970],{"class":155,"line":1395},[153,6971,6972],{},"const props = defineProps\u003C{ title: string }>()\n",[153,6974,6975],{"class":155,"line":1401},[153,6976,6977],{},"const count = ref(0)\n",[153,6979,6980],{"class":155,"line":1407},[153,6981,6982],{},"const doubled = computed(() => count.value * 2)\n",[153,6984,6985],{"class":155,"line":1129},[153,6986,6987],{},"\u003C\u002Fscript>\n",[12,6989,6990,6992],{},[45,6991,2839],{}," Vue 3 projects, especially those migrating from Options API.",[138,6994,6996],{"id":6995},"_3-nextjs-app-router","3. Next.js App Router",[12,6998,6999,7000,7003],{},"Focuses on the App Router paradigm — Server Components, Server Actions, and the ",[150,7001,7002],{},"app\u002F"," directory structure.",[143,7005,7007],{"className":5813,"code":7006,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert Next.js developer using the App Router (v14+).\n\n## Rules\n- Default to Server Components; add 'use client' only when needed\n- Use Server Actions for form handling and mutations\n- Route handlers in app\u002Fapi\u002F for external API endpoints\n- Metadata API for SEO (generateMetadata, not Head)\n- Image optimization: always use next\u002Fimage\n- Loading states: loading.tsx and Suspense boundaries\n\n## Data Fetching\n- Server Components: fetch() with revalidate options\n- Client Components: useSWR or React Query\n- Never use getServerSideProps or getStaticProps (Pages Router patterns)\n",[150,7008,7009,7013,7018,7022,7026,7031,7036,7041,7046,7051,7056,7060,7065,7070,7075],{"__ignoreMap":148},[153,7010,7011],{"class":155,"line":156},[153,7012,6702],{},[153,7014,7015],{"class":155,"line":208},[153,7016,7017],{},"You are an expert Next.js developer using the App Router (v14+).\n",[153,7019,7020],{"class":155,"line":242},[153,7021,246],{"emptyLinePlaceholder":245},[153,7023,7024],{"class":155,"line":249},[153,7025,6810],{},[153,7027,7028],{"class":155,"line":255},[153,7029,7030],{},"- Default to Server Components; add 'use client' only when needed\n",[153,7032,7033],{"class":155,"line":268},[153,7034,7035],{},"- Use Server Actions for form handling and mutations\n",[153,7037,7038],{"class":155,"line":281},[153,7039,7040],{},"- Route handlers in app\u002Fapi\u002F for external API endpoints\n",[153,7042,7043],{"class":155,"line":1356},[153,7044,7045],{},"- Metadata API for SEO (generateMetadata, not Head)\n",[153,7047,7048],{"class":155,"line":1362},[153,7049,7050],{},"- Image optimization: always use next\u002Fimage\n",[153,7052,7053],{"class":155,"line":1367},[153,7054,7055],{},"- Loading states: loading.tsx and Suspense boundaries\n",[153,7057,7058],{"class":155,"line":1372},[153,7059,246],{"emptyLinePlaceholder":245},[153,7061,7062],{"class":155,"line":1378},[153,7063,7064],{},"## Data Fetching\n",[153,7066,7067],{"class":155,"line":1383},[153,7068,7069],{},"- Server Components: fetch() with revalidate options\n",[153,7071,7072],{"class":155,"line":1389},[153,7073,7074],{},"- Client Components: useSWR or React Query\n",[153,7076,7077],{"class":155,"line":1395},[153,7078,7079],{},"- Never use getServerSideProps or getStaticProps (Pages Router patterns)\n",[12,7081,7082,7084],{},[45,7083,2839],{}," Next.js 14+ projects using the App Router. If you're on Pages Router, use a different rule.",[138,7086,7088],{"id":7087},"_4-nuxt-3","4. Nuxt 3",[12,7090,7091,7092,7095],{},"Covers Nuxt 3 conventions — auto-imports, server routes, and the ",[150,7093,7094],{},"composables\u002F"," directory.",[143,7097,7099],{"className":5813,"code":7098,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert Nuxt 3 developer.\n\n## Rules\n- Use auto-imported composables (useState, useRoute, useFetch)\n- Server routes in server\u002Fapi\u002F with defineEventHandler\n- Components auto-imported from components\u002F directory\n- Layouts in layouts\u002F, middleware in middleware\u002F\n- Use definePageMeta for page-level configuration\n- SSR by default; use \u003CClientOnly> for browser-only components\n",[150,7100,7101,7105,7110,7114,7118,7123,7128,7133,7138,7143],{"__ignoreMap":148},[153,7102,7103],{"class":155,"line":156},[153,7104,6702],{},[153,7106,7107],{"class":155,"line":208},[153,7108,7109],{},"You are an expert Nuxt 3 developer.\n",[153,7111,7112],{"class":155,"line":242},[153,7113,246],{"emptyLinePlaceholder":245},[153,7115,7116],{"class":155,"line":249},[153,7117,6810],{},[153,7119,7120],{"class":155,"line":255},[153,7121,7122],{},"- Use auto-imported composables (useState, useRoute, useFetch)\n",[153,7124,7125],{"class":155,"line":268},[153,7126,7127],{},"- Server routes in server\u002Fapi\u002F with defineEventHandler\n",[153,7129,7130],{"class":155,"line":281},[153,7131,7132],{},"- Components auto-imported from components\u002F directory\n",[153,7134,7135],{"class":155,"line":1356},[153,7136,7137],{},"- Layouts in layouts\u002F, middleware in middleware\u002F\n",[153,7139,7140],{"class":155,"line":1362},[153,7141,7142],{},"- Use definePageMeta for page-level configuration\n",[153,7144,7145],{"class":155,"line":1367},[153,7146,7147],{},"- SSR by default; use \u003CClientOnly> for browser-only components\n",[12,7149,7150,7152,7153,7155],{},[45,7151,2839],{}," Nuxt 3 projects. See our ",[71,7154,2690],{"href":2689}," for complementary Nuxt tooling.",[138,7157,7159],{"id":7158},"_5-tailwind-css","5. Tailwind CSS",[12,7161,7162],{},"Ensures consistent utility class usage and prevents common Tailwind anti-patterns.",[143,7164,7166],{"className":5813,"code":7165,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\n## Tailwind CSS Rules\n- Never use @apply in components — use utility classes directly\n- Responsive: mobile-first (sm:, md:, lg:, xl:)\n- Dark mode: use dark: prefix, assume class-based dark mode\n- Custom values: extend theme in tailwind.config.ts, don't use arbitrary values\n- Spacing: stick to the default scale (4, 8, 12, 16...), avoid arbitrary px values\n- Colors: use project theme colors, never hardcode hex values\n",[150,7167,7168,7172,7177,7182,7187,7192,7197,7202],{"__ignoreMap":148},[153,7169,7170],{"class":155,"line":156},[153,7171,6702],{},[153,7173,7174],{"class":155,"line":208},[153,7175,7176],{},"## Tailwind CSS Rules\n",[153,7178,7179],{"class":155,"line":242},[153,7180,7181],{},"- Never use @apply in components — use utility classes directly\n",[153,7183,7184],{"class":155,"line":249},[153,7185,7186],{},"- Responsive: mobile-first (sm:, md:, lg:, xl:)\n",[153,7188,7189],{"class":155,"line":255},[153,7190,7191],{},"- Dark mode: use dark: prefix, assume class-based dark mode\n",[153,7193,7194],{"class":155,"line":268},[153,7195,7196],{},"- Custom values: extend theme in tailwind.config.ts, don't use arbitrary values\n",[153,7198,7199],{"class":155,"line":281},[153,7200,7201],{},"- Spacing: stick to the default scale (4, 8, 12, 16...), avoid arbitrary px values\n",[153,7203,7204],{"class":155,"line":1356},[153,7205,7206],{},"- Colors: use project theme colors, never hardcode hex values\n",[12,7208,7209,7211],{},[45,7210,2839],{}," Any project using Tailwind CSS, regardless of framework.",[35,7213,7215],{"id":7214},"backend-rules","Backend Rules",[138,7217,7219],{"id":7218},"_6-go-golang","6. Go (Golang)",[12,7221,7222],{},"Enforces idiomatic Go — error handling, naming conventions, and package structure.",[143,7224,7226],{"className":5813,"code":7225,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert Go developer following Go idioms.\n\n## Rules\n- Always handle errors explicitly — never use _ for error returns\n- Use short variable names in small scopes (i, j, n), descriptive names in larger scopes\n- Prefer returning errors over panicking\n- Package names: short, lowercase, no underscores\n- Interfaces: accept interfaces, return structs\n- Concurrency: always use context.Context as first parameter\n- Testing: table-driven tests with subtests\n\n## Error Handling Pattern\nresult, err := doSomething()\nif err != nil {\n    return fmt.Errorf(\"doSomething failed: %w\", err)\n}\n",[150,7227,7228,7232,7237,7241,7245,7250,7255,7260,7265,7270,7275,7280,7284,7289,7294,7299,7304],{"__ignoreMap":148},[153,7229,7230],{"class":155,"line":156},[153,7231,6702],{},[153,7233,7234],{"class":155,"line":208},[153,7235,7236],{},"You are an expert Go developer following Go idioms.\n",[153,7238,7239],{"class":155,"line":242},[153,7240,246],{"emptyLinePlaceholder":245},[153,7242,7243],{"class":155,"line":249},[153,7244,6810],{},[153,7246,7247],{"class":155,"line":255},[153,7248,7249],{},"- Always handle errors explicitly — never use _ for error returns\n",[153,7251,7252],{"class":155,"line":268},[153,7253,7254],{},"- Use short variable names in small scopes (i, j, n), descriptive names in larger scopes\n",[153,7256,7257],{"class":155,"line":281},[153,7258,7259],{},"- Prefer returning errors over panicking\n",[153,7261,7262],{"class":155,"line":1356},[153,7263,7264],{},"- Package names: short, lowercase, no underscores\n",[153,7266,7267],{"class":155,"line":1362},[153,7268,7269],{},"- Interfaces: accept interfaces, return structs\n",[153,7271,7272],{"class":155,"line":1367},[153,7273,7274],{},"- Concurrency: always use context.Context as first parameter\n",[153,7276,7277],{"class":155,"line":1372},[153,7278,7279],{},"- Testing: table-driven tests with subtests\n",[153,7281,7282],{"class":155,"line":1378},[153,7283,246],{"emptyLinePlaceholder":245},[153,7285,7286],{"class":155,"line":1383},[153,7287,7288],{},"## Error Handling Pattern\n",[153,7290,7291],{"class":155,"line":1389},[153,7292,7293],{},"result, err := doSomething()\n",[153,7295,7296],{"class":155,"line":1395},[153,7297,7298],{},"if err != nil {\n",[153,7300,7301],{"class":155,"line":1401},[153,7302,7303],{},"    return fmt.Errorf(\"doSomething failed: %w\", err)\n",[153,7305,7306],{"class":155,"line":1407},[153,7307,3901],{},[12,7309,7310,7312],{},[45,7311,2839],{}," Go microservices, CLI tools, and backend APIs.",[138,7314,7316],{"id":7315},"_7-python-fastapi","7. Python (FastAPI)",[12,7318,7319],{},"Covers type hints, Pydantic models, and async patterns.",[143,7321,7323],{"className":5813,"code":7322,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert Python developer using FastAPI.\n\n## Rules\n- Type hints on all function signatures — no untyped code\n- Pydantic v2 models for request\u002Fresponse schemas\n- Async by default: use async def for route handlers\n- Dependency injection via Depends()\n- Error handling: raise HTTPException with proper status codes\n- Database: SQLAlchemy 2.0 async with typed queries\n\n## Route Pattern\n@router.get(\"\u002Fusers\u002F{user_id}\", response_model=UserResponse)\nasync def get_user(user_id: int, db: AsyncSession = Depends(get_db)):\n    user = await db.get(User, user_id)\n    if not user:\n        raise HTTPException(status_code=404, detail=\"User not found\")\n    return user\n",[150,7324,7325,7329,7334,7338,7342,7347,7352,7357,7362,7367,7372,7376,7381,7386,7391,7396,7401,7406],{"__ignoreMap":148},[153,7326,7327],{"class":155,"line":156},[153,7328,6702],{},[153,7330,7331],{"class":155,"line":208},[153,7332,7333],{},"You are an expert Python developer using FastAPI.\n",[153,7335,7336],{"class":155,"line":242},[153,7337,246],{"emptyLinePlaceholder":245},[153,7339,7340],{"class":155,"line":249},[153,7341,6810],{},[153,7343,7344],{"class":155,"line":255},[153,7345,7346],{},"- Type hints on all function signatures — no untyped code\n",[153,7348,7349],{"class":155,"line":268},[153,7350,7351],{},"- Pydantic v2 models for request\u002Fresponse schemas\n",[153,7353,7354],{"class":155,"line":281},[153,7355,7356],{},"- Async by default: use async def for route handlers\n",[153,7358,7359],{"class":155,"line":1356},[153,7360,7361],{},"- Dependency injection via Depends()\n",[153,7363,7364],{"class":155,"line":1362},[153,7365,7366],{},"- Error handling: raise HTTPException with proper status codes\n",[153,7368,7369],{"class":155,"line":1367},[153,7370,7371],{},"- Database: SQLAlchemy 2.0 async with typed queries\n",[153,7373,7374],{"class":155,"line":1372},[153,7375,246],{"emptyLinePlaceholder":245},[153,7377,7378],{"class":155,"line":1378},[153,7379,7380],{},"## Route Pattern\n",[153,7382,7383],{"class":155,"line":1383},[153,7384,7385],{},"@router.get(\"\u002Fusers\u002F{user_id}\", response_model=UserResponse)\n",[153,7387,7388],{"class":155,"line":1389},[153,7389,7390],{},"async def get_user(user_id: int, db: AsyncSession = Depends(get_db)):\n",[153,7392,7393],{"class":155,"line":1395},[153,7394,7395],{},"    user = await db.get(User, user_id)\n",[153,7397,7398],{"class":155,"line":1401},[153,7399,7400],{},"    if not user:\n",[153,7402,7403],{"class":155,"line":1407},[153,7404,7405],{},"        raise HTTPException(status_code=404, detail=\"User not found\")\n",[153,7407,7408],{"class":155,"line":1129},[153,7409,7410],{},"    return user\n",[12,7412,7413,7415],{},[45,7414,2839],{}," Python backends using FastAPI, SQLAlchemy, and Pydantic.",[138,7417,7419],{"id":7418},"_8-nodejs-expresshono","8. Node.js (Express\u002FHono)",[12,7421,7422],{},"Covers modern Node patterns — ESM imports, middleware composition, and error handling.",[143,7424,7426],{"className":5813,"code":7425,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert Node.js backend developer.\n\n## Rules\n- ESM imports (import\u002Fexport), never CommonJS (require)\n- Use Hono or Express with TypeScript\n- Middleware: compose small, focused middleware functions\n- Validation: use Zod for request body validation\n- Error handling: centralized error handler middleware\n- Environment: use dotenv, never hardcode config values\n- Logging: structured JSON logs with pino\n\n## Middleware Pattern\nconst validateBody = (schema: ZodSchema) => async (c: Context, next: Next) => {\n  const body = await c.req.json()\n  const result = schema.safeParse(body)\n  if (!result.success) return c.json({ error: result.error }, 400)\n  c.set('body', result.data)\n  await next()\n}\n",[150,7427,7428,7432,7437,7441,7445,7450,7455,7460,7465,7470,7475,7480,7484,7489,7494,7499,7504,7509,7514,7519],{"__ignoreMap":148},[153,7429,7430],{"class":155,"line":156},[153,7431,6702],{},[153,7433,7434],{"class":155,"line":208},[153,7435,7436],{},"You are an expert Node.js backend developer.\n",[153,7438,7439],{"class":155,"line":242},[153,7440,246],{"emptyLinePlaceholder":245},[153,7442,7443],{"class":155,"line":249},[153,7444,6810],{},[153,7446,7447],{"class":155,"line":255},[153,7448,7449],{},"- ESM imports (import\u002Fexport), never CommonJS (require)\n",[153,7451,7452],{"class":155,"line":268},[153,7453,7454],{},"- Use Hono or Express with TypeScript\n",[153,7456,7457],{"class":155,"line":281},[153,7458,7459],{},"- Middleware: compose small, focused middleware functions\n",[153,7461,7462],{"class":155,"line":1356},[153,7463,7464],{},"- Validation: use Zod for request body validation\n",[153,7466,7467],{"class":155,"line":1362},[153,7468,7469],{},"- Error handling: centralized error handler middleware\n",[153,7471,7472],{"class":155,"line":1367},[153,7473,7474],{},"- Environment: use dotenv, never hardcode config values\n",[153,7476,7477],{"class":155,"line":1372},[153,7478,7479],{},"- Logging: structured JSON logs with pino\n",[153,7481,7482],{"class":155,"line":1378},[153,7483,246],{"emptyLinePlaceholder":245},[153,7485,7486],{"class":155,"line":1383},[153,7487,7488],{},"## Middleware Pattern\n",[153,7490,7491],{"class":155,"line":1389},[153,7492,7493],{},"const validateBody = (schema: ZodSchema) => async (c: Context, next: Next) => {\n",[153,7495,7496],{"class":155,"line":1395},[153,7497,7498],{},"  const body = await c.req.json()\n",[153,7500,7501],{"class":155,"line":1401},[153,7502,7503],{},"  const result = schema.safeParse(body)\n",[153,7505,7506],{"class":155,"line":1407},[153,7507,7508],{},"  if (!result.success) return c.json({ error: result.error }, 400)\n",[153,7510,7511],{"class":155,"line":1129},[153,7512,7513],{},"  c.set('body', result.data)\n",[153,7515,7516],{"class":155,"line":1417},[153,7517,7518],{},"  await next()\n",[153,7520,7521],{"class":155,"line":1423},[153,7522,3901],{},[12,7524,7525,7527],{},[45,7526,2839],{}," Node.js APIs, especially with Hono, Express, or Fastify.",[138,7529,7531],{"id":7530},"_9-django","9. Django",[12,7533,7534],{},"Covers Django conventions — model design, views, serializers, and admin.",[143,7536,7538],{"className":5813,"code":7537,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert Django developer.\n\n## Rules\n- Use Django REST Framework for APIs\n- Models: explicit field types, always add Meta class with ordering\n- Views: prefer class-based views (APIView, ViewSet)\n- Serializers: always validate at the serializer level\n- Migrations: always review auto-generated migrations before applying\n- Security: use Django's built-in protections (CSRF, XSS, SQL injection)\n- Testing: use pytest-django with fixtures\n\n## Model Pattern\nclass Article(models.Model):\n    title = models.CharField(max_length=200)\n    slug = models.SlugField(unique=True)\n    created_at = models.DateTimeField(auto_now_add=True)\n\n    class Meta:\n        ordering = ['-created_at']\n",[150,7539,7540,7544,7549,7553,7557,7562,7567,7572,7577,7582,7587,7592,7596,7601,7606,7611,7616,7621,7625,7630],{"__ignoreMap":148},[153,7541,7542],{"class":155,"line":156},[153,7543,6702],{},[153,7545,7546],{"class":155,"line":208},[153,7547,7548],{},"You are an expert Django developer.\n",[153,7550,7551],{"class":155,"line":242},[153,7552,246],{"emptyLinePlaceholder":245},[153,7554,7555],{"class":155,"line":249},[153,7556,6810],{},[153,7558,7559],{"class":155,"line":255},[153,7560,7561],{},"- Use Django REST Framework for APIs\n",[153,7563,7564],{"class":155,"line":268},[153,7565,7566],{},"- Models: explicit field types, always add Meta class with ordering\n",[153,7568,7569],{"class":155,"line":281},[153,7570,7571],{},"- Views: prefer class-based views (APIView, ViewSet)\n",[153,7573,7574],{"class":155,"line":1356},[153,7575,7576],{},"- Serializers: always validate at the serializer level\n",[153,7578,7579],{"class":155,"line":1362},[153,7580,7581],{},"- Migrations: always review auto-generated migrations before applying\n",[153,7583,7584],{"class":155,"line":1367},[153,7585,7586],{},"- Security: use Django's built-in protections (CSRF, XSS, SQL injection)\n",[153,7588,7589],{"class":155,"line":1372},[153,7590,7591],{},"- Testing: use pytest-django with fixtures\n",[153,7593,7594],{"class":155,"line":1378},[153,7595,246],{"emptyLinePlaceholder":245},[153,7597,7598],{"class":155,"line":1383},[153,7599,7600],{},"## Model Pattern\n",[153,7602,7603],{"class":155,"line":1389},[153,7604,7605],{},"class Article(models.Model):\n",[153,7607,7608],{"class":155,"line":1395},[153,7609,7610],{},"    title = models.CharField(max_length=200)\n",[153,7612,7613],{"class":155,"line":1401},[153,7614,7615],{},"    slug = models.SlugField(unique=True)\n",[153,7617,7618],{"class":155,"line":1407},[153,7619,7620],{},"    created_at = models.DateTimeField(auto_now_add=True)\n",[153,7622,7623],{"class":155,"line":1129},[153,7624,246],{"emptyLinePlaceholder":245},[153,7626,7627],{"class":155,"line":1417},[153,7628,7629],{},"    class Meta:\n",[153,7631,7632],{"class":155,"line":1423},[153,7633,7634],{},"        ordering = ['-created_at']\n",[138,7636,7638],{"id":7637},"_10-rust","10. Rust",[12,7640,7641,7642,7645],{},"Covers ownership patterns, error handling with ",[150,7643,7644],{},"Result",", and idiomatic Rust.",[143,7647,7649],{"className":5813,"code":7648,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert Rust developer.\n\n## Rules\n- Prefer &str over String for function parameters\n- Use Result\u003CT, E> for fallible operations, never panic in libraries\n- Derive common traits: Debug, Clone, PartialEq\n- Use thiserror for library errors, anyhow for application errors\n- Prefer iterators over manual loops\n- Lifetimes: only annotate when the compiler requires it\n\n## Error Handling\n#[derive(Debug, thiserror::Error)]\nenum AppError {\n    #[error(\"not found: {0}\")]\n    NotFound(String),\n    #[error(transparent)]\n    Database(#[from] sqlx::Error),\n}\n",[150,7650,7651,7655,7660,7664,7668,7673,7678,7683,7688,7693,7698,7702,7707,7712,7717,7722,7727,7732,7737],{"__ignoreMap":148},[153,7652,7653],{"class":155,"line":156},[153,7654,6702],{},[153,7656,7657],{"class":155,"line":208},[153,7658,7659],{},"You are an expert Rust developer.\n",[153,7661,7662],{"class":155,"line":242},[153,7663,246],{"emptyLinePlaceholder":245},[153,7665,7666],{"class":155,"line":249},[153,7667,6810],{},[153,7669,7670],{"class":155,"line":255},[153,7671,7672],{},"- Prefer &str over String for function parameters\n",[153,7674,7675],{"class":155,"line":268},[153,7676,7677],{},"- Use Result\u003CT, E> for fallible operations, never panic in libraries\n",[153,7679,7680],{"class":155,"line":281},[153,7681,7682],{},"- Derive common traits: Debug, Clone, PartialEq\n",[153,7684,7685],{"class":155,"line":1356},[153,7686,7687],{},"- Use thiserror for library errors, anyhow for application errors\n",[153,7689,7690],{"class":155,"line":1362},[153,7691,7692],{},"- Prefer iterators over manual loops\n",[153,7694,7695],{"class":155,"line":1367},[153,7696,7697],{},"- Lifetimes: only annotate when the compiler requires it\n",[153,7699,7700],{"class":155,"line":1372},[153,7701,246],{"emptyLinePlaceholder":245},[153,7703,7704],{"class":155,"line":1378},[153,7705,7706],{},"## Error Handling\n",[153,7708,7709],{"class":155,"line":1383},[153,7710,7711],{},"#[derive(Debug, thiserror::Error)]\n",[153,7713,7714],{"class":155,"line":1389},[153,7715,7716],{},"enum AppError {\n",[153,7718,7719],{"class":155,"line":1395},[153,7720,7721],{},"    #[error(\"not found: {0}\")]\n",[153,7723,7724],{"class":155,"line":1401},[153,7725,7726],{},"    NotFound(String),\n",[153,7728,7729],{"class":155,"line":1407},[153,7730,7731],{},"    #[error(transparent)]\n",[153,7733,7734],{"class":155,"line":1129},[153,7735,7736],{},"    Database(#[from] sqlx::Error),\n",[153,7738,7739],{"class":155,"line":1417},[153,7740,3901],{},[35,7742,7744],{"id":7743},"full-stack-rules","Full-Stack Rules",[138,7746,7748],{"id":7747},"_11-t3-stack-nextjs-trpc-prisma","11. T3 Stack (Next.js + tRPC + Prisma)",[143,7750,7752],{"className":5813,"code":7751,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert T3 Stack developer (Next.js, tRPC, Prisma, NextAuth).\n\n## Rules\n- tRPC routers in server\u002Fapi\u002Frouters\u002F with input validation via Zod\n- Prisma: always use select\u002Finclude to avoid over-fetching\n- Auth: use NextAuth.js with getServerSession for server-side checks\n- Type safety: leverage tRPC's end-to-end type inference — never manually type API responses\n",[150,7753,7754,7758,7763,7767,7771,7776,7781,7786],{"__ignoreMap":148},[153,7755,7756],{"class":155,"line":156},[153,7757,6702],{},[153,7759,7760],{"class":155,"line":208},[153,7761,7762],{},"You are an expert T3 Stack developer (Next.js, tRPC, Prisma, NextAuth).\n",[153,7764,7765],{"class":155,"line":242},[153,7766,246],{"emptyLinePlaceholder":245},[153,7768,7769],{"class":155,"line":249},[153,7770,6810],{},[153,7772,7773],{"class":155,"line":255},[153,7774,7775],{},"- tRPC routers in server\u002Fapi\u002Frouters\u002F with input validation via Zod\n",[153,7777,7778],{"class":155,"line":268},[153,7779,7780],{},"- Prisma: always use select\u002Finclude to avoid over-fetching\n",[153,7782,7783],{"class":155,"line":281},[153,7784,7785],{},"- Auth: use NextAuth.js with getServerSession for server-side checks\n",[153,7787,7788],{"class":155,"line":1356},[153,7789,7790],{},"- Type safety: leverage tRPC's end-to-end type inference — never manually type API responses\n",[138,7792,7794],{"id":7793},"_12-mern-stack","12. MERN Stack",[143,7796,7798],{"className":5813,"code":7797,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert MERN stack developer (MongoDB, Express, React, Node).\n\n## Rules\n- Backend: Express with TypeScript, Mongoose ODM\n- Frontend: React with TypeScript and Vite\n- API: RESTful with proper HTTP status codes\n- Validation: Zod on backend, React Hook Form on frontend\n- Auth: JWT with httpOnly cookies, never localStorage\n",[150,7799,7800,7804,7809,7813,7817,7822,7827,7832,7837],{"__ignoreMap":148},[153,7801,7802],{"class":155,"line":156},[153,7803,6702],{},[153,7805,7806],{"class":155,"line":208},[153,7807,7808],{},"You are an expert MERN stack developer (MongoDB, Express, React, Node).\n",[153,7810,7811],{"class":155,"line":242},[153,7812,246],{"emptyLinePlaceholder":245},[153,7814,7815],{"class":155,"line":249},[153,7816,6810],{},[153,7818,7819],{"class":155,"line":255},[153,7820,7821],{},"- Backend: Express with TypeScript, Mongoose ODM\n",[153,7823,7824],{"class":155,"line":268},[153,7825,7826],{},"- Frontend: React with TypeScript and Vite\n",[153,7828,7829],{"class":155,"line":281},[153,7830,7831],{},"- API: RESTful with proper HTTP status codes\n",[153,7833,7834],{"class":155,"line":1356},[153,7835,7836],{},"- Validation: Zod on backend, React Hook Form on frontend\n",[153,7838,7839],{"class":155,"line":1362},[153,7840,7841],{},"- Auth: JWT with httpOnly cookies, never localStorage\n",[138,7843,7845],{"id":7844},"_13-laravel-vue","13. Laravel + Vue",[143,7847,7849],{"className":5813,"code":7848,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert Laravel + Vue developer.\n\n## Rules\n- Laravel: use Eloquent relationships, form requests for validation\n- Vue: Composition API with \u003Cscript setup>\n- Inertia.js for SPA-like navigation without API routes\n- Auth: Laravel Sanctum for SPA authentication\n- Testing: PHPUnit for backend, Vitest for frontend\n",[150,7850,7851,7855,7860,7864,7868,7873,7878,7883,7888],{"__ignoreMap":148},[153,7852,7853],{"class":155,"line":156},[153,7854,6702],{},[153,7856,7857],{"class":155,"line":208},[153,7858,7859],{},"You are an expert Laravel + Vue developer.\n",[153,7861,7862],{"class":155,"line":242},[153,7863,246],{"emptyLinePlaceholder":245},[153,7865,7866],{"class":155,"line":249},[153,7867,6810],{},[153,7869,7870],{"class":155,"line":255},[153,7871,7872],{},"- Laravel: use Eloquent relationships, form requests for validation\n",[153,7874,7875],{"class":155,"line":268},[153,7876,7877],{},"- Vue: Composition API with \u003Cscript setup>\n",[153,7879,7880],{"class":155,"line":281},[153,7881,7882],{},"- Inertia.js for SPA-like navigation without API routes\n",[153,7884,7885],{"class":155,"line":1356},[153,7886,7887],{},"- Auth: Laravel Sanctum for SPA authentication\n",[153,7889,7890],{"class":155,"line":1362},[153,7891,7892],{},"- Testing: PHPUnit for backend, Vitest for frontend\n",[138,7894,7896],{"id":7895},"_14-rails-react","14. Rails + React",[143,7898,7900],{"className":5813,"code":7899,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert Ruby on Rails + React developer.\n\n## Rules\n- Rails: follow Rails conventions (fat models, skinny controllers)\n- React: served via Rails asset pipeline or separate Vite app\n- API: jbuilder or Active Model Serializers for JSON responses\n- Testing: RSpec + FactoryBot for Rails, Jest for React\n- Database: use migrations, never modify schema directly\n",[150,7901,7902,7906,7911,7915,7919,7924,7929,7934,7939],{"__ignoreMap":148},[153,7903,7904],{"class":155,"line":156},[153,7905,6702],{},[153,7907,7908],{"class":155,"line":208},[153,7909,7910],{},"You are an expert Ruby on Rails + React developer.\n",[153,7912,7913],{"class":155,"line":242},[153,7914,246],{"emptyLinePlaceholder":245},[153,7916,7917],{"class":155,"line":249},[153,7918,6810],{},[153,7920,7921],{"class":155,"line":255},[153,7922,7923],{},"- Rails: follow Rails conventions (fat models, skinny controllers)\n",[153,7925,7926],{"class":155,"line":268},[153,7927,7928],{},"- React: served via Rails asset pipeline or separate Vite app\n",[153,7930,7931],{"class":155,"line":281},[153,7932,7933],{},"- API: jbuilder or Active Model Serializers for JSON responses\n",[153,7935,7936],{"class":155,"line":1356},[153,7937,7938],{},"- Testing: RSpec + FactoryBot for Rails, Jest for React\n",[153,7940,7941],{"class":155,"line":1362},[153,7942,7943],{},"- Database: use migrations, never modify schema directly\n",[138,7945,7947],{"id":7946},"_15-supabase-full-stack","15. Supabase Full-Stack",[143,7949,7951],{"className":5813,"code":7950,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert Supabase developer.\n\n## Rules\n- Use Supabase client library, never raw PostgreSQL connections\n- Auth: Supabase Auth with Row Level Security (RLS)\n- Storage: Supabase Storage with signed URLs for private files\n- Edge Functions: Deno runtime with Supabase client\n- Real-time: use Supabase Realtime for live subscriptions\n- Always enable RLS on every table — no exceptions\n",[150,7952,7953,7957,7962,7966,7970,7975,7980,7985,7990,7995],{"__ignoreMap":148},[153,7954,7955],{"class":155,"line":156},[153,7956,6702],{},[153,7958,7959],{"class":155,"line":208},[153,7960,7961],{},"You are an expert Supabase developer.\n",[153,7963,7964],{"class":155,"line":242},[153,7965,246],{"emptyLinePlaceholder":245},[153,7967,7968],{"class":155,"line":249},[153,7969,6810],{},[153,7971,7972],{"class":155,"line":255},[153,7973,7974],{},"- Use Supabase client library, never raw PostgreSQL connections\n",[153,7976,7977],{"class":155,"line":268},[153,7978,7979],{},"- Auth: Supabase Auth with Row Level Security (RLS)\n",[153,7981,7982],{"class":155,"line":281},[153,7983,7984],{},"- Storage: Supabase Storage with signed URLs for private files\n",[153,7986,7987],{"class":155,"line":1356},[153,7988,7989],{},"- Edge Functions: Deno runtime with Supabase client\n",[153,7991,7992],{"class":155,"line":1362},[153,7993,7994],{},"- Real-time: use Supabase Realtime for live subscriptions\n",[153,7996,7997],{"class":155,"line":1367},[153,7998,7999],{},"- Always enable RLS on every table — no exceptions\n",[35,8001,8003],{"id":8002},"general-rules","General Rules",[138,8005,8007],{"id":8006},"_16-code-style-enforcer","16. Code Style Enforcer",[143,8009,8011],{"className":5813,"code":8010,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\n## Code Style\n- Maximum function length: 30 lines\n- Maximum file length: 300 lines\n- Maximum function parameters: 4 (use options object for more)\n- No nested ternaries\n- No magic numbers — define constants with descriptive names\n- Comments explain WHY, not WHAT\n- No commented-out code — delete it, Git remembers\n",[150,8012,8013,8017,8021,8026,8031,8036,8041,8046,8051],{"__ignoreMap":148},[153,8014,8015],{"class":155,"line":156},[153,8016,6702],{},[153,8018,8019],{"class":155,"line":208},[153,8020,5850],{},[153,8022,8023],{"class":155,"line":242},[153,8024,8025],{},"- Maximum function length: 30 lines\n",[153,8027,8028],{"class":155,"line":249},[153,8029,8030],{},"- Maximum file length: 300 lines\n",[153,8032,8033],{"class":155,"line":255},[153,8034,8035],{},"- Maximum function parameters: 4 (use options object for more)\n",[153,8037,8038],{"class":155,"line":268},[153,8039,8040],{},"- No nested ternaries\n",[153,8042,8043],{"class":155,"line":281},[153,8044,8045],{},"- No magic numbers — define constants with descriptive names\n",[153,8047,8048],{"class":155,"line":1356},[153,8049,8050],{},"- Comments explain WHY, not WHAT\n",[153,8052,8053],{"class":155,"line":1362},[153,8054,8055],{},"- No commented-out code — delete it, Git remembers\n",[138,8057,8059],{"id":8058},"_17-testing-standards","17. Testing Standards",[143,8061,8063],{"className":5813,"code":8062,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\n## Testing Rules\n- Every new function must have at least one test\n- Test naming: describe(\"functionName\") → it(\"should do X when Y\")\n- Arrange-Act-Assert pattern in every test\n- No test interdependencies — each test runs in isolation\n- Mock external services, never real APIs in tests\n- Coverage target: 80% line coverage minimum\n- Prefer integration tests over unit tests for API endpoints\n",[150,8064,8065,8069,8074,8079,8084,8089,8094,8099,8104],{"__ignoreMap":148},[153,8066,8067],{"class":155,"line":156},[153,8068,6702],{},[153,8070,8071],{"class":155,"line":208},[153,8072,8073],{},"## Testing Rules\n",[153,8075,8076],{"class":155,"line":242},[153,8077,8078],{},"- Every new function must have at least one test\n",[153,8080,8081],{"class":155,"line":249},[153,8082,8083],{},"- Test naming: describe(\"functionName\") → it(\"should do X when Y\")\n",[153,8085,8086],{"class":155,"line":255},[153,8087,8088],{},"- Arrange-Act-Assert pattern in every test\n",[153,8090,8091],{"class":155,"line":268},[153,8092,8093],{},"- No test interdependencies — each test runs in isolation\n",[153,8095,8096],{"class":155,"line":281},[153,8097,8098],{},"- Mock external services, never real APIs in tests\n",[153,8100,8101],{"class":155,"line":1356},[153,8102,8103],{},"- Coverage target: 80% line coverage minimum\n",[153,8105,8106],{"class":155,"line":1362},[153,8107,8108],{},"- Prefer integration tests over unit tests for API endpoints\n",[138,8110,8112],{"id":8111},"_18-security-rules","18. Security Rules",[143,8114,8116],{"className":5813,"code":8115,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\n## Security Rules\n- Never hardcode secrets, API keys, or passwords\n- Always parameterize database queries — no string concatenation\n- Validate and sanitize all user input on the server side\n- Use HTTPS for all external API calls\n- Set proper CORS headers — never use wildcard (*) in production\n- Hash passwords with bcrypt (cost factor 12+)\n- JWT: short expiry (15 min access, 7 day refresh), httpOnly cookies\n",[150,8117,8118,8122,8127,8132,8137,8142,8147,8152,8157],{"__ignoreMap":148},[153,8119,8120],{"class":155,"line":156},[153,8121,6702],{},[153,8123,8124],{"class":155,"line":208},[153,8125,8126],{},"## Security Rules\n",[153,8128,8129],{"class":155,"line":242},[153,8130,8131],{},"- Never hardcode secrets, API keys, or passwords\n",[153,8133,8134],{"class":155,"line":249},[153,8135,8136],{},"- Always parameterize database queries — no string concatenation\n",[153,8138,8139],{"class":155,"line":255},[153,8140,8141],{},"- Validate and sanitize all user input on the server side\n",[153,8143,8144],{"class":155,"line":268},[153,8145,8146],{},"- Use HTTPS for all external API calls\n",[153,8148,8149],{"class":155,"line":281},[153,8150,8151],{},"- Set proper CORS headers — never use wildcard (*) in production\n",[153,8153,8154],{"class":155,"line":1356},[153,8155,8156],{},"- Hash passwords with bcrypt (cost factor 12+)\n",[153,8158,8159],{"class":155,"line":1362},[153,8160,8161],{},"- JWT: short expiry (15 min access, 7 day refresh), httpOnly cookies\n",[138,8163,8165],{"id":8164},"_19-git-commit-standards","19. Git Commit Standards",[143,8167,8169],{"className":5813,"code":8168,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\n## Git Commit Rules\n- Follow Conventional Commits: type(scope): description\n- Types: feat, fix, docs, style, refactor, test, chore\n- Subject line: max 72 characters, imperative mood\n- Body: explain WHY, not WHAT (the diff shows WHAT)\n- One logical change per commit\n- Never commit generated files, .env, or node_modules\n",[150,8170,8171,8175,8180,8185,8190,8195,8200,8205],{"__ignoreMap":148},[153,8172,8173],{"class":155,"line":156},[153,8174,6702],{},[153,8176,8177],{"class":155,"line":208},[153,8178,8179],{},"## Git Commit Rules\n",[153,8181,8182],{"class":155,"line":242},[153,8183,8184],{},"- Follow Conventional Commits: type(scope): description\n",[153,8186,8187],{"class":155,"line":249},[153,8188,8189],{},"- Types: feat, fix, docs, style, refactor, test, chore\n",[153,8191,8192],{"class":155,"line":255},[153,8193,8194],{},"- Subject line: max 72 characters, imperative mood\n",[153,8196,8197],{"class":155,"line":268},[153,8198,8199],{},"- Body: explain WHY, not WHAT (the diff shows WHAT)\n",[153,8201,8202],{"class":155,"line":281},[153,8203,8204],{},"- One logical change per commit\n",[153,8206,8207],{"class":155,"line":1356},[153,8208,8209],{},"- Never commit generated files, .env, or node_modules\n",[138,8211,8213],{"id":8212},"_20-documentation-standards","20. Documentation Standards",[143,8215,8217],{"className":5813,"code":8216,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\n## Documentation Rules\n- Public functions: JSDoc with @param, @returns, @throws\n- README: project purpose, setup instructions, architecture overview\n- API endpoints: document request\u002Fresponse schemas with examples\n- Complex algorithms: explain the approach in comments above\n- Architecture decisions: ADR format in docs\u002Fdecisions\u002F\n- No stale documentation — update docs in the same PR as code changes\n",[150,8218,8219,8223,8228,8233,8238,8243,8248,8253],{"__ignoreMap":148},[153,8220,8221],{"class":155,"line":156},[153,8222,6702],{},[153,8224,8225],{"class":155,"line":208},[153,8226,8227],{},"## Documentation Rules\n",[153,8229,8230],{"class":155,"line":242},[153,8231,8232],{},"- Public functions: JSDoc with @param, @returns, @throws\n",[153,8234,8235],{"class":155,"line":249},[153,8236,8237],{},"- README: project purpose, setup instructions, architecture overview\n",[153,8239,8240],{"class":155,"line":255},[153,8241,8242],{},"- API endpoints: document request\u002Fresponse schemas with examples\n",[153,8244,8245],{"class":155,"line":268},[153,8246,8247],{},"- Complex algorithms: explain the approach in comments above\n",[153,8249,8250],{"class":155,"line":281},[153,8251,8252],{},"- Architecture decisions: ADR format in docs\u002Fdecisions\u002F\n",[153,8254,8255],{"class":155,"line":1356},[153,8256,8257],{},"- No stale documentation — update docs in the same PR as code changes\n",[35,8259,8261],{"id":8260},"how-to-create-your-own-cursor-rule","How to Create Your Own Cursor Rule",[138,8263,8265],{"id":8264},"step-1-identify-your-patterns","Step 1: Identify Your Patterns",[12,8267,8268],{},"List the top 10 things you repeat in code reviews. These become your rules.",[143,8270,8272],{"className":145,"code":8271,"language":147,"meta":148,"style":148},"# Review your last 20 PR comments\n# Look for patterns like:\n# - \"Please use TypeScript strict mode\"\n# - \"Always handle the error case\"\n# - \"Use our Button component, not native \u003Cbutton>\"\n",[150,8273,8274,8279,8284,8289,8294],{"__ignoreMap":148},[153,8275,8276],{"class":155,"line":156},[153,8277,8278],{"class":211},"# Review your last 20 PR comments\n",[153,8280,8281],{"class":155,"line":208},[153,8282,8283],{"class":211},"# Look for patterns like:\n",[153,8285,8286],{"class":155,"line":242},[153,8287,8288],{"class":211},"# - \"Please use TypeScript strict mode\"\n",[153,8290,8291],{"class":155,"line":249},[153,8292,8293],{"class":211},"# - \"Always handle the error case\"\n",[153,8295,8296],{"class":155,"line":255},[153,8297,8298],{"class":211},"# - \"Use our Button component, not native \u003Cbutton>\"\n",[138,8300,8302],{"id":8301},"step-2-write-the-rule-file","Step 2: Write the Rule File",[143,8304,8306],{"className":5813,"code":8305,"language":5815,"meta":148,"style":148},"\u003C!-- .cursorrules -->\nYou are an expert [your stack] developer working on [project name].\n\n## Architecture\n[Your architecture decisions]\n\n## Code Style\n[Your team's conventions]\n\n## Common Patterns\n[Code templates for frequent tasks]\n\n## Avoid\n[Anti-patterns specific to your project]\n",[150,8307,8308,8312,8317,8321,8325,8330,8334,8338,8343,8347,8352,8357,8361,8366],{"__ignoreMap":148},[153,8309,8310],{"class":155,"line":156},[153,8311,6702],{},[153,8313,8314],{"class":155,"line":208},[153,8315,8316],{},"You are an expert [your stack] developer working on [project name].\n",[153,8318,8319],{"class":155,"line":242},[153,8320,246],{"emptyLinePlaceholder":245},[153,8322,8323],{"class":155,"line":249},[153,8324,6738],{},[153,8326,8327],{"class":155,"line":255},[153,8328,8329],{},"[Your architecture decisions]\n",[153,8331,8332],{"class":155,"line":268},[153,8333,246],{"emptyLinePlaceholder":245},[153,8335,8336],{"class":155,"line":281},[153,8337,5850],{},[153,8339,8340],{"class":155,"line":1356},[153,8341,8342],{},"[Your team's conventions]\n",[153,8344,8345],{"class":155,"line":1362},[153,8346,246],{"emptyLinePlaceholder":245},[153,8348,8349],{"class":155,"line":1367},[153,8350,8351],{},"## Common Patterns\n",[153,8353,8354],{"class":155,"line":1372},[153,8355,8356],{},"[Code templates for frequent tasks]\n",[153,8358,8359],{"class":155,"line":1378},[153,8360,246],{"emptyLinePlaceholder":245},[153,8362,8363],{"class":155,"line":1383},[153,8364,8365],{},"## Avoid\n",[153,8367,8368],{"class":155,"line":1389},[153,8369,8370],{},"[Anti-patterns specific to your project]\n",[138,8372,8374],{"id":8373},"step-3-test-and-iterate","Step 3: Test and Iterate",[143,8376,8378],{"className":145,"code":8377,"language":147,"meta":148,"style":148},"# Drop the file in your project root\necho \"your rules\" > .cursorrules\n\n# Open Cursor and try common tasks\n# If the AI ignores a rule, make it more explicit\n# If a rule causes bad output, remove or rephrase it\n",[150,8379,8380,8385,8397,8401,8406,8411],{"__ignoreMap":148},[153,8381,8382],{"class":155,"line":156},[153,8383,8384],{"class":211},"# Drop the file in your project root\n",[153,8386,8387,8389,8392,8394],{"class":155,"line":208},[153,8388,1570],{"class":163},[153,8390,8391],{"class":167}," \"your rules\"",[153,8393,1334],{"class":171},[153,8395,8396],{"class":167}," .cursorrules\n",[153,8398,8399],{"class":155,"line":242},[153,8400,246],{"emptyLinePlaceholder":245},[153,8402,8403],{"class":155,"line":249},[153,8404,8405],{"class":211},"# Open Cursor and try common tasks\n",[153,8407,8408],{"class":155,"line":255},[153,8409,8410],{"class":211},"# If the AI ignores a rule, make it more explicit\n",[153,8412,8413],{"class":155,"line":268},[153,8414,8415],{"class":211},"# If a rule causes bad output, remove or rephrase it\n",[138,8417,8419],{"id":8418},"step-4-share-with-your-team","Step 4: Share With Your Team",[143,8421,8423],{"className":145,"code":8422,"language":147,"meta":148,"style":148},"# Commit to your repo\ngit add .cursorrules\ngit commit -m \"docs: add cursor rules for team coding standards\"\n",[150,8424,8425,8430,8438],{"__ignoreMap":148},[153,8426,8427],{"class":155,"line":156},[153,8428,8429],{"class":211},"# Commit to your repo\n",[153,8431,8432,8434,8436],{"class":155,"line":208},[153,8433,1222],{"class":159},[153,8435,1447],{"class":167},[153,8437,8396],{"class":167},[153,8439,8440,8442,8444,8446],{"class":155,"line":242},[153,8441,1222],{"class":159},[153,8443,1457],{"class":167},[153,8445,1460],{"class":163},[153,8447,8448],{"class":167}," \"docs: add cursor rules for team coding standards\"\n",[12,8450,8451,8452,667],{},"For a deeper dive into building shareable skills, see ",[71,8453,1258],{"href":1169},[35,8455,8457],{"id":8456},"cursor-rules-vs-claude-code-skills","Cursor Rules vs Claude Code Skills",[12,8459,8460,8461,8464],{},"How do Cursor Rules compare to ",[71,8462,8463],{"href":2689},"Claude Code Skills","? They solve similar problems but work differently.",[3485,8466],{":headers":8467,":rows":8468},"[\"Feature\",\"Cursor Rules\",\"Claude Code Skills\"]","[[\"Format\",\".cursorrules (single file)\",\".md files in .claude\u002Fcommands\u002F\"],[\"Scope\",\"Entire project\",\"Per skill (invoked on demand)\"],[\"Activation\",\"Always active\",\"Triggered by command or pattern\"],[\"Distribution\",\"Git repo only\",\"Git, TokRepo, or custom registry\"],[\"Ecosystem\",\"Community .cursorrules repos\",\"TokRepo (500+ skills)\"],[\"Multi-tool\",\"Cursor only\",\"Claude Code, Codex CLI, Gemini CLI\"],[\"Complexity\",\"Simple (one file)\",\"Can be complex (multi-file, dependencies)\"],[\"Best for\",\"Coding standards\",\"Complex workflows & automation\"]]",[12,8470,8471,8474,8475,528,8478,4381,8481,8484],{},[45,8472,8473],{},"Bottom line:"," Cursor Rules are ideal for enforcing coding standards within Cursor. Claude Code Skills are better for complex, multi-step workflows that go beyond code style — things like ",[71,8476,8477],{"href":2689},"project management",[71,8479,8480],{"href":2689},"debugging",[71,8482,8483],{"href":2689},"SEO audits",". Many developers use both — Cursor Rules in Cursor, Skills in Claude Code.",[12,8486,8487,8488,8491],{},"For teams evaluating both tools, see our ",[71,8489,8490],{"href":1262},"Skills vs MCP vs Rules comparison"," for a comprehensive breakdown.",[35,8493,2514],{"id":2513},[138,8495,8497],{"id":8496},"can-i-use-multiple-cursorrules-files","Can I use multiple .cursorrules files?",[12,8499,8500,8501,8503],{},"Cursor only reads one ",[150,8502,6663],{}," file from the project root. If you need different rules for different parts of your project, combine them into sections within the single file. For monorepos, place the file at the monorepo root.",[138,8505,8507],{"id":8506},"how-long-should-a-cursorrules-file-be","How long should a .cursorrules file be?",[12,8509,8510],{},"Keep it under 2,000 words. Longer rules dilute the AI's attention. Focus on your top 10-15 most important conventions. If you have more, prioritize the rules that cause the most code review comments.",[138,8512,8514],{"id":8513},"do-cursor-rules-work-with-other-ai-assistants","Do Cursor Rules work with other AI assistants?",[12,8516,8517,8518,8520,8521,8523,8524,8527,8528,8531],{},"No — ",[150,8519,6663],{}," is specific to Cursor. For ",[71,8522,1159],{"href":2689},", use agent skills. For GitHub Copilot, use ",[150,8525,8526],{},".github\u002Fcopilot-instructions.md",". The ",[71,8529,3619],{"href":3476,"rel":8530},[113]," aims to create a universal format across tools.",[35,8533,1020],{"id":1019},[19,8535,8536,8541,8546,8554],{},[22,8537,8538,8540],{},[71,8539,1263],{"href":1262}," — detailed comparison of all AI coding extensions",[22,8542,8543,8545],{},[71,8544,2690],{"href":2689}," — if you also use Claude Code",[22,8547,8548,8553],{},[71,8549,8552],{"href":8550,"rel":8551},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fcollections\u002Fprompts",[113],"Browse Prompt Collections on TokRepo"," — reusable prompts for any AI assistant",[22,8555,8556,8558],{},[71,8557,1258],{"href":1169}," — convert your Cursor Rules into portable skills",[1074,8560,8561],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":148,"searchDepth":208,"depth":208,"links":8563},[8564,8565,8568,8575,8582,8589,8596,8602,8603,8608],{"id":78,"depth":208,"text":79},{"id":6685,"depth":208,"text":6686,"children":8566},[8567],{"id":6766,"depth":242,"text":6767},{"id":6779,"depth":208,"text":6780,"children":8569},[8570,8571,8572,8573,8574],{"id":6783,"depth":242,"text":6784},{"id":6889,"depth":242,"text":6890},{"id":6995,"depth":242,"text":6996},{"id":7087,"depth":242,"text":7088},{"id":7158,"depth":242,"text":7159},{"id":7214,"depth":208,"text":7215,"children":8576},[8577,8578,8579,8580,8581],{"id":7218,"depth":242,"text":7219},{"id":7315,"depth":242,"text":7316},{"id":7418,"depth":242,"text":7419},{"id":7530,"depth":242,"text":7531},{"id":7637,"depth":242,"text":7638},{"id":7743,"depth":208,"text":7744,"children":8583},[8584,8585,8586,8587,8588],{"id":7747,"depth":242,"text":7748},{"id":7793,"depth":242,"text":7794},{"id":7844,"depth":242,"text":7845},{"id":7895,"depth":242,"text":7896},{"id":7946,"depth":242,"text":7947},{"id":8002,"depth":208,"text":8003,"children":8590},[8591,8592,8593,8594,8595],{"id":8006,"depth":242,"text":8007},{"id":8058,"depth":242,"text":8059},{"id":8111,"depth":242,"text":8112},{"id":8164,"depth":242,"text":8165},{"id":8212,"depth":242,"text":8213},{"id":8260,"depth":208,"text":8261,"children":8597},[8598,8599,8600,8601],{"id":8264,"depth":242,"text":8265},{"id":8301,"depth":242,"text":8302},{"id":8373,"depth":242,"text":8374},{"id":8418,"depth":242,"text":8419},{"id":8456,"depth":208,"text":8457},{"id":2513,"depth":208,"text":2514,"children":8604},[8605,8606,8607],{"id":8496,"depth":242,"text":8497},{"id":8506,"depth":242,"text":8507},{"id":8513,"depth":242,"text":8514},{"id":1019,"depth":208,"text":1020},"Curated list of 20 tested .cursorrules files for React, Vue, Go, Python, Next.js, and more. Learn how to configure Cursor AI for maximum productivity.","精选 20 个经过测试的 .cursorrules 文件，覆盖 React、Vue、Go、Python、Next.js 等。学习如何配置 Cursor AI 实现最大生产力。",[8612,8615,8618,8620,8623],{"q":8613,"a":8614},"What are Cursor rules and how do they work?","Cursor rules are instructions stored in a .cursorrules file at your project root. Cursor AI reads them on every interaction — autocomplete, chat, Composer, and inline edits — and prepends them as a system prompt. This ensures consistent coding behavior across framework conventions, style, and constraints, regardless of who is prompting.",{"q":8616,"a":8617},"Can I use multiple .cursorrules files in one project?","No. Cursor only reads one .cursorrules file from the project root. If you need different rules for different parts of your project, combine them into sections within a single file. For monorepos, place the file at the monorepo root and organize rules by subdirectory or framework section.",{"q":8507,"a":8619},"Keep it under 2,000 words. Longer rules dilute the AI's attention and make it harder for Cursor to prioritize. Focus on your top 10-15 most important conventions — the ones that cause the most code review comments — and delete anything generic that the model already knows.",{"q":8621,"a":8622},"Do Cursor rules work with Claude Code or other AI assistants?","No, .cursorrules is specific to Cursor. For Claude Code, use agent skills in .claude\u002Fcommands\u002F. For GitHub Copilot, use .github\u002Fcopilot-instructions.md. For Codex CLI use AGENTS.md and for Gemini CLI use GEMINI.md. The content is transferable but the filename must match each tool's convention.",{"q":8624,"a":8625},"Cursor rules vs Claude Code skills — which should I use?","Use Cursor rules to enforce coding standards within Cursor (always-active system prompt). Use Claude Code skills for complex multi-step workflows triggered on demand — project management, debugging, SEO audits. Many developers use both: rules in Cursor for style enforcement, skills in Claude Code for workflow automation.","\u002Fguide\u002Fimages\u002Fcursor-rules-guide-hero.svg",{},"\u002Fen\u002Fguide\u002Fcursor-rules-guide",{"title":6655,"description":8609},"en\u002Fguide\u002Fcursor-rules-guide",[8632,8633,3725,3726],"cursor","rules","2026 年最佳 Cursor Rules 推荐 — 20 个让 AI 编程起飞的规则","The best Cursor rules in 2026 are 20 tested .cursorrules files covering React+TS, Vue 3, Next.js App Router, Nuxt 3, Tailwind, Go, FastAPI, Node, Django, Rust, T3 Stack, and general code style\u002Ftesting\u002Fsecurity standards. Drop a single .cursorrules file in your project root and Cursor prepends it to every AI interaction — autocomplete, chat, Composer, and inline edits — ensuring consistent output regardless of who's prompting.","8bUCPRH_rTN5hcfIJqp3Wiwo3bgeiMkunBpXLikR3RQ",{"id":8638,"title":8639,"answer":6,"answerZh":6,"author":7,"body":8640,"category":1106,"description":9661,"descriptionZh":9662,"extension":1109,"faqs":9663,"faqsZh":6,"image":9678,"meta":9679,"navigation":245,"path":9680,"publishedAt":2764,"readTime":1356,"seo":9681,"stem":9682,"tags":9683,"titleZh":9685,"tldr":9686,"tldrZh":6,"updatedAt":2764,"__hash__":9687},"docs_en\u002Fen\u002Fguide\u002Fgemini-cli-skills.md","How Do You Use Agent Skills with Google Gemini CLI?",{"type":9,"value":8641,"toc":9635},[8642,8645,8649,8664,8680,8683,8718,8722,8725,8741,8744,8756,8759,8775,8778,8795,8798,8809,8815,8819,8829,8859,8865,8942,8948,9031,9037,9039,9045,9047,9050,9088,9101,9105,9127,9134,9138,9141,9145,9150,9155,9159,9177,9183,9185,9189,9194,9199,9203,9221,9227,9229,9233,9238,9243,9247,9265,9271,9273,9277,9285,9290,9294,9312,9318,9323,9325,9329,9334,9339,9343,9361,9366,9368,9372,9377,9381,9385,9403,9409,9411,9415,9420,9425,9429,9447,9453,9455,9459,9464,9469,9473,9491,9496,9498,9502,9505,9509,9514,9545,9548,9550,9554,9571,9575,9584,9588,9605,9607,9632],[12,8643,8644],{},"Learn how to extend Google's Gemini CLI with agent skills that automate coding workflows, debugging, project management, and SEO — all from your terminal.",[35,8646,8648],{"id":8647},"what-is-gemini-cli","What Is Gemini CLI?",[12,8650,8651,8655,8656,8658,8659,8663],{},[71,8652,5610],{"href":8653,"rel":8654},"https:\u002F\u002Fgithub.com\u002Fgoogle-gemini\u002Fgemini-cli",[113]," is Google's open-source command-line tool for interacting with Gemini models directly in the terminal. It follows the same paradigm as ",[71,8657,1159],{"href":2689}," and ",[71,8660,8662],{"href":8661},"\u002Fguide\u002Fcodex-cli-skills","OpenAI Codex CLI"," — an agentic coding assistant that reads your project, edits files, runs commands, and follows instructions written in Markdown.",[12,8665,8666,8667,8670,8671,8673,8674,8676,8677,8679],{},"Gemini CLI uses a file called ",[150,8668,8669],{},"GEMINI.md"," as its instruction format. Place a ",[150,8672,8669],{}," file in your project root or home directory, and Gemini CLI loads those instructions automatically at startup. This is the equivalent of ",[150,8675,1296],{}," for Claude Code or ",[150,8678,5558],{}," for Codex CLI.",[12,8681,8682],{},"Key features of Gemini CLI:",[19,8684,8685,8691,8697,8703,8709],{},[22,8686,8687,8690],{},[45,8688,8689],{},"Free tier:"," 60 requests per minute with a Google account, no API key required for basic use",[22,8692,8693,8696],{},[45,8694,8695],{},"Open source:"," Apache 2.0 license, fully extensible",[22,8698,8699,8702],{},[45,8700,8701],{},"Gemini 2.5 Pro:"," Access to Google's most capable coding model",[22,8704,8705,8708],{},[45,8706,8707],{},"Multi-modal:"," Supports text, images, and file attachments",[22,8710,8711,8714,8715,8717],{},[45,8712,8713],{},"Extensions system:"," Load skills and tools through ",[150,8716,8669],{}," and the extensions API",[35,8719,8721],{"id":8720},"install-gemini-cli","Install Gemini CLI",[12,8723,8724],{},"Gemini CLI requires Node.js 18 or later. Install it globally via npm:",[143,8726,8728],{"className":145,"code":8727,"language":147,"meta":148,"style":148},"npm install -g @anthropic-ai\u002Fgemini-cli\n",[150,8729,8730],{"__ignoreMap":148},[153,8731,8732,8734,8736,8738],{"class":155,"line":156},[153,8733,5639],{"class":159},[153,8735,1590],{"class":167},[153,8737,5644],{"class":163},[153,8739,8740],{"class":167}," @anthropic-ai\u002Fgemini-cli\n",[12,8742,8743],{},"Or use npx to run without installing:",[143,8745,8747],{"className":145,"code":8746,"language":147,"meta":148,"style":148},"npx @google\u002Fgemini-cli\n",[150,8748,8749],{"__ignoreMap":148},[153,8750,8751,8753],{"class":155,"line":156},[153,8752,5190],{"class":159},[153,8754,8755],{"class":167}," @google\u002Fgemini-cli\n",[12,8757,8758],{},"After installation, authenticate with your Google account:",[143,8760,8762],{"className":145,"code":8761,"language":147,"meta":148,"style":148},"gemini auth login\n",[150,8763,8764],{"__ignoreMap":148},[153,8765,8766,8769,8772],{"class":155,"line":156},[153,8767,8768],{"class":159},"gemini",[153,8770,8771],{"class":167}," auth",[153,8773,8774],{"class":167}," login\n",[12,8776,8777],{},"For API key authentication (required for higher rate limits), set the environment variable:",[143,8779,8781],{"className":145,"code":8780,"language":147,"meta":148,"style":148},"export GEMINI_API_KEY=\"your-api-key-here\"\n",[150,8782,8783],{"__ignoreMap":148},[153,8784,8785,8787,8790,8792],{"class":155,"line":156},[153,8786,5661],{"class":171},[153,8788,8789],{"class":313}," GEMINI_API_KEY",[153,8791,1932],{"class":171},[153,8793,8794],{"class":167},"\"your-api-key-here\"\n",[12,8796,8797],{},"Verify the installation:",[143,8799,8801],{"className":145,"code":8800,"language":147,"meta":148,"style":148},"gemini --version\n",[150,8802,8803],{"__ignoreMap":148},[153,8804,8805,8807],{"class":155,"line":156},[153,8806,8768],{"class":159},[153,8808,205],{"class":163},[12,8810,8811,8812,8814],{},"You should see the version number and be ready to start a session with ",[150,8813,8768],{}," in any project directory.",[35,8816,8818],{"id":8817},"how-gemini-cli-reads-skills","How Gemini CLI Reads Skills",[12,8820,8821,8822,8824,8825,8828],{},"Gemini CLI loads instructions from ",[150,8823,8669],{}," files in a cascading hierarchy, similar to how ",[150,8826,8827],{},".gitignore"," works:",[428,8830,8831,8841,8850],{},[22,8832,8833,8836,8837,8840],{},[45,8834,8835],{},"Global:"," ",[150,8838,8839],{},"~\u002F.gemini\u002FGEMINI.md"," — applies to all projects",[22,8842,8843,8836,8846,8849],{},[45,8844,8845],{},"Project root:",[150,8847,8848],{},".\u002FGEMINI.md"," — applies to the current project",[22,8851,8852,8836,8855,8858],{},[45,8853,8854],{},"Subdirectory:",[150,8856,8857],{},".\u002Fsrc\u002FGEMINI.md"," — applies when working in that directory",[12,8860,8861,8862,8864],{},"Here is a basic ",[150,8863,8669],{}," structure:",[143,8866,8868],{"className":5813,"code":8867,"language":5815,"meta":148,"style":148},"# Project Instructions\n\nYou are working on a Nuxt 3 application with TypeScript.\n\n## Code Style\n- Use Composition API with `\u003Cscript setup>`\n- Prefer `const` over `let`\n- All components go in `components\u002F`\n\n## Testing\n- Run `npm test` before committing\n- Write unit tests for all utility functions\n\n## Deployment\n- Build with `npm run build`\n- Deploy to Vercel with `vercel --prod`\n",[150,8869,8870,8875,8879,8884,8888,8892,8897,8902,8907,8911,8915,8919,8924,8928,8932,8937],{"__ignoreMap":148},[153,8871,8872],{"class":155,"line":156},[153,8873,8874],{},"# Project Instructions\n",[153,8876,8877],{"class":155,"line":208},[153,8878,246],{"emptyLinePlaceholder":245},[153,8880,8881],{"class":155,"line":242},[153,8882,8883],{},"You are working on a Nuxt 3 application with TypeScript.\n",[153,8885,8886],{"class":155,"line":249},[153,8887,246],{"emptyLinePlaceholder":245},[153,8889,8890],{"class":155,"line":255},[153,8891,5850],{},[153,8893,8894],{"class":155,"line":268},[153,8895,8896],{},"- Use Composition API with `\u003Cscript setup>`\n",[153,8898,8899],{"class":155,"line":281},[153,8900,8901],{},"- Prefer `const` over `let`\n",[153,8903,8904],{"class":155,"line":1356},[153,8905,8906],{},"- All components go in `components\u002F`\n",[153,8908,8909],{"class":155,"line":1362},[153,8910,246],{"emptyLinePlaceholder":245},[153,8912,8913],{"class":155,"line":1367},[153,8914,5874],{},[153,8916,8917],{"class":155,"line":1372},[153,8918,5879],{},[153,8920,8921],{"class":155,"line":1378},[153,8922,8923],{},"- Write unit tests for all utility functions\n",[153,8925,8926],{"class":155,"line":1383},[153,8927,246],{"emptyLinePlaceholder":245},[153,8929,8930],{"class":155,"line":1389},[153,8931,5898],{},[153,8933,8934],{"class":155,"line":1395},[153,8935,8936],{},"- Build with `npm run build`\n",[153,8938,8939],{"class":155,"line":1401},[153,8940,8941],{},"- Deploy to Vercel with `vercel --prod`\n",[12,8943,8944,8945,726],{},"The extensions system allows loading additional tools and capabilities beyond what Markdown instructions alone provide. Extensions are declared in ",[150,8946,8947],{},"~\u002F.gemini\u002Fsettings.json",[143,8949,8951],{"className":3807,"code":8950,"language":3809,"meta":148,"style":148},"{\n  \"extensions\": [\n    {\n      \"name\": \"web-search\",\n      \"enabled\": true\n    },\n    {\n      \"name\": \"code-execution\",\n      \"enabled\": true\n    }\n  ]\n}\n",[150,8952,8953,8957,8964,8969,8981,8991,8995,8999,9010,9018,9022,9027],{"__ignoreMap":148},[153,8954,8955],{"class":155,"line":156},[153,8956,3816],{"class":313},[153,8958,8959,8962],{"class":155,"line":208},[153,8960,8961],{"class":163},"  \"extensions\"",[153,8963,4081],{"class":313},[153,8965,8966],{"class":155,"line":242},[153,8967,8968],{"class":313},"    {\n",[153,8970,8971,8974,8976,8979],{"class":155,"line":249},[153,8972,8973],{"class":163},"      \"name\"",[153,8975,3839],{"class":313},[153,8977,8978],{"class":167},"\"web-search\"",[153,8980,3845],{"class":313},[153,8982,8983,8986,8988],{"class":155,"line":255},[153,8984,8985],{"class":163},"      \"enabled\"",[153,8987,3839],{"class":313},[153,8989,8990],{"class":163},"true\n",[153,8992,8993],{"class":155,"line":268},[153,8994,5300],{"class":313},[153,8996,8997],{"class":155,"line":281},[153,8998,8968],{"class":313},[153,9000,9001,9003,9005,9008],{"class":155,"line":1356},[153,9002,8973],{"class":163},[153,9004,3839],{"class":313},[153,9006,9007],{"class":167},"\"code-execution\"",[153,9009,3845],{"class":313},[153,9011,9012,9014,9016],{"class":155,"line":1362},[153,9013,8985],{"class":163},[153,9015,3839],{"class":313},[153,9017,8990],{"class":163},[153,9019,9020],{"class":155,"line":1367},[153,9021,3891],{"class":313},[153,9023,9024],{"class":155,"line":1372},[153,9025,9026],{"class":313},"  ]\n",[153,9028,9029],{"class":155,"line":1378},[153,9030,3901],{"class":313},[12,9032,9033,9034,9036],{},"Agent skills — Markdown files that teach the CLI how to perform specific tasks — fit naturally into this system. You write a skill as a ",[150,9035,1292],{}," file with structured instructions, place it where Gemini CLI can find it, and the model follows those instructions during your session.",[35,9038,6006],{"id":6005},[12,9040,9041,9044],{},[71,9042,1519],{"href":1530,"rel":9043},[113]," is the largest registry of agent skills for AI coding assistants. Most skills are written in a universal Markdown format that works across Claude Code, Codex CLI, and Gemini CLI with minimal adaptation.",[138,9046,6016],{"id":6015},[12,9048,9049],{},"Install the TokRepo CLI and pull skills directly:",[143,9051,9053],{"className":145,"code":9052,"language":147,"meta":148,"style":148},"npm install -g tokrepo\ntokrepo install \u003Cskill-uuid> --target gemini\n",[150,9054,9055,9066],{"__ignoreMap":148},[153,9056,9057,9059,9061,9063],{"class":155,"line":156},[153,9058,5639],{"class":159},[153,9060,1590],{"class":167},[153,9062,5644],{"class":163},[153,9064,9065],{"class":167}," tokrepo\n",[153,9067,9068,9070,9072,9074,9077,9079,9082,9085],{"class":155,"line":208},[153,9069,1587],{"class":159},[153,9071,1590],{"class":167},[153,9073,6036],{"class":171},[153,9075,9076],{"class":167},"skill-uui",[153,9078,6042],{"class":313},[153,9080,9081],{"class":171},">",[153,9083,9084],{"class":163}," --target",[153,9086,9087],{"class":167}," gemini\n",[12,9089,9090,9091,9094,9095,9097,9098,7095],{},"The ",[150,9092,9093],{},"--target gemini"," flag converts the skill to ",[150,9096,8669],{}," format and places it in your project's ",[150,9099,9100],{},".gemini\u002F",[138,9102,9104],{"id":9103},"method-2-manual-installation","Method 2: Manual Installation",[428,9106,9107,9113,9116,9124],{},[22,9108,1527,9109],{},[71,9110,9112],{"href":1530,"rel":9111},[113],"TokRepo Skills Collection",[22,9114,9115],{},"Copy the skill's Markdown content",[22,9117,9118,9119,4151,9121,439],{},"Create a file in your project (e.g., ",[150,9120,8669],{},[150,9122,9123],{},".gemini\u002Fskills\u002Fskill-name.md",[22,9125,9126],{},"Paste the content and adjust any Claude Code-specific references to Gemini CLI equivalents",[12,9128,9129,9130,9133],{},"For example, change trigger patterns from ",[150,9131,9132],{},"\u002Fskill-name"," to Gemini's natural-language invocation style. Most skill instructions (code patterns, testing rules, deployment steps) work without modification.",[35,9135,9137],{"id":9136},"_8-best-skills-for-gemini-cli","8 Best Skills for Gemini CLI",[12,9139,9140],{},"These skills were tested with Gemini CLI and ranked by usefulness, compatibility, and community adoption. Each one ships as a Markdown file you can install in under 30 seconds.",[138,9142,9144],{"id":9143},"_1-gemini-cli-extension-stitch","1. Gemini CLI Extension Stitch",[12,9146,9147,9149],{},[45,9148,2833],{}," Integrates the Stitch design system with Gemini CLI, enabling you to generate UI components, apply design tokens, and maintain visual consistency across your project directly from the terminal.",[12,9151,9152,9154],{},[45,9153,2839],{}," Frontend developers who want AI-assisted design-to-code workflows inside Gemini CLI.",[12,9156,9157],{},[45,9158,2845],{},[143,9160,9162],{"className":145,"code":9161,"language":147,"meta":148,"style":148},"tokrepo install c4b18aeb --target gemini\n",[150,9163,9164],{"__ignoreMap":148},[153,9165,9166,9168,9170,9173,9175],{"class":155,"line":156},[153,9167,1587],{"class":159},[153,9169,1590],{"class":167},[153,9171,9172],{"class":167}," c4b18aeb",[153,9174,9084],{"class":163},[153,9176,9087],{"class":167},[12,9178,9179],{},[71,9180,2063],{"href":9181,"rel":9182},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002Fc4b18aeb",[113],[2874,9184],{},[138,9186,9188],{"id":9187},"_2-google-gemini-cli-extensions","2. Google Gemini CLI Extensions",[12,9190,9191,9193],{},[45,9192,2833],{}," A curated collection of official and community extensions for Gemini CLI — adds capabilities like file search, web browsing, code execution sandboxing, and multi-repo context loading.",[12,9195,9196,9198],{},[45,9197,2839],{}," Power users who want to unlock the full extension ecosystem for Gemini CLI.",[12,9200,9201],{},[45,9202,2845],{},[143,9204,9206],{"className":145,"code":9205,"language":147,"meta":148,"style":148},"tokrepo install b9520bd2 --target gemini\n",[150,9207,9208],{"__ignoreMap":148},[153,9209,9210,9212,9214,9217,9219],{"class":155,"line":156},[153,9211,1587],{"class":159},[153,9213,1590],{"class":167},[153,9215,9216],{"class":167}," b9520bd2",[153,9218,9084],{"class":163},[153,9220,9087],{"class":167},[12,9222,9223],{},[71,9224,2063],{"href":9225,"rel":9226},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002Fb9520bd2",[113],[2874,9228],{},[138,9230,9232],{"id":9231},"_3-gemini-cli-extension-workspace","3. Gemini CLI Extension Workspace",[12,9234,9235,9237],{},[45,9236,2833],{}," Manages multi-project workspaces within Gemini CLI. Switch between repos, maintain separate contexts, and run cross-project tasks without leaving your session.",[12,9239,9240,9242],{},[45,9241,2839],{}," Developers juggling multiple repositories or monorepo sub-packages.",[12,9244,9245],{},[45,9246,2845],{},[143,9248,9250],{"className":145,"code":9249,"language":147,"meta":148,"style":148},"tokrepo install f0db235b --target gemini\n",[150,9251,9252],{"__ignoreMap":148},[153,9253,9254,9256,9258,9261,9263],{"class":155,"line":156},[153,9255,1587],{"class":159},[153,9257,1590],{"class":167},[153,9259,9260],{"class":167}," f0db235b",[153,9262,9084],{"class":163},[153,9264,9087],{"class":167},[12,9266,9267],{},[71,9268,2063],{"href":9269,"rel":9270},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002Ff0db235b",[113],[2874,9272],{},[138,9274,9276],{"id":9275},"_4-get-shit-done-gsd","4. Get Shit Done (GSD)",[12,9278,9279,9281,9282,9284],{},[45,9280,2833],{}," A complete project management framework. Breaks large projects into milestones, phases, and tasks — then executes them with atomic commits and verification at each step. Creates persistent ",[150,9283,2866],{}," directories that survive across sessions.",[12,9286,9287,9289],{},[45,9288,2839],{}," Solo developers managing complex multi-day projects without losing context.",[12,9291,9292],{},[45,9293,2845],{},[143,9295,9297],{"className":145,"code":9296,"language":147,"meta":148,"style":148},"tokrepo install e108cf5c --target gemini\n",[150,9298,9299],{"__ignoreMap":148},[153,9300,9301,9303,9305,9308,9310],{"class":155,"line":156},[153,9302,1587],{"class":159},[153,9304,1590],{"class":167},[153,9306,9307],{"class":167}," e108cf5c",[153,9309,9084],{"class":163},[153,9311,9087],{"class":167},[12,9313,9314,9317],{},[45,9315,9316],{},"Why it's essential:"," GSD solves the biggest pain point in agentic coding — losing context on large projects. It has 48,600+ GitHub stars and works across all three major CLI tools.",[12,9319,9320],{},[71,9321,2063],{"href":2061,"rel":9322},[113],[2874,9324],{},[138,9326,9328],{"id":9327},"_5-vercel-skills-agent-skill-ecosystem","5. Vercel Skills — Agent Skill Ecosystem",[12,9330,9331,9333],{},[45,9332,2833],{}," Over 13,000 community-contributed skills covering Next.js, React, deployment pipelines, and full-stack development patterns.",[12,9335,9336,9338],{},[45,9337,2839],{}," Frontend and full-stack developers working with modern JavaScript frameworks.",[12,9340,9341],{},[45,9342,2845],{},[143,9344,9346],{"className":145,"code":9345,"language":147,"meta":148,"style":148},"tokrepo install d1eba6f1 --target gemini\n",[150,9347,9348],{"__ignoreMap":148},[153,9349,9350,9352,9354,9357,9359],{"class":155,"line":156},[153,9351,1587],{"class":159},[153,9353,1590],{"class":167},[153,9355,9356],{"class":167}," d1eba6f1",[153,9358,9084],{"class":163},[153,9360,9087],{"class":167},[12,9362,9363],{},[71,9364,2063],{"href":2918,"rel":9365},[113],[2874,9367],{},[138,9369,9371],{"id":9370},"_6-claude-seo-complete-seo-skill","6. Claude SEO — Complete SEO Skill",[12,9373,9374,9376],{},[45,9375,2833],{}," Runs full SEO audits — keyword research, on-page analysis, content gaps, technical checks, and competitor comparison. Despite the name, the skill's Markdown instructions work in any CLI that reads structured prompts.",[12,9378,9379,2977],{},[45,9380,2839],{},[12,9382,9383],{},[45,9384,2845],{},[143,9386,9388],{"className":145,"code":9387,"language":147,"meta":148,"style":148},"tokrepo install cb068086 --target gemini\n",[150,9389,9390],{"__ignoreMap":148},[153,9391,9392,9394,9396,9399,9401],{"class":155,"line":156},[153,9393,1587],{"class":159},[153,9395,1590],{"class":167},[153,9397,9398],{"class":167}," cb068086",[153,9400,9084],{"class":163},[153,9402,9087],{"class":167},[12,9404,9405],{},[71,9406,2063],{"href":9407,"rel":9408},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002Fcb068086",[113],[2874,9410],{},[138,9412,9414],{"id":9413},"_7-systematic-debugging","7. Systematic Debugging",[12,9416,9417,9419],{},[45,9418,2833],{}," A structured debugging methodology with persistent state tracking. Guides the model through hypothesis formation, evidence gathering, root cause isolation, and fix verification.",[12,9421,9422,9424],{},[45,9423,2839],{}," Hard-to-reproduce bugs that require methodical investigation across multiple files.",[12,9426,9427],{},[45,9428,2845],{},[143,9430,9432],{"className":145,"code":9431,"language":147,"meta":148,"style":148},"tokrepo install 78ed006e --target gemini\n",[150,9433,9434],{"__ignoreMap":148},[153,9435,9436,9438,9440,9443,9445],{"class":155,"line":156},[153,9437,1587],{"class":159},[153,9439,1590],{"class":167},[153,9441,9442],{"class":167}," 78ed006e",[153,9444,9084],{"class":163},[153,9446,9087],{"class":167},[12,9448,9449],{},[71,9450,2063],{"href":9451,"rel":9452},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F78ed006e",[113],[2874,9454],{},[138,9456,9458],{"id":9457},"_8-web-access-skill","8. Web Access Skill",[12,9460,9461,9463],{},[45,9462,2833],{}," Gives Gemini CLI the ability to fetch and analyze web pages, APIs, and online documentation. Reads URLs, extracts content, and uses it in your current task.",[12,9465,9466,9468],{},[45,9467,2839],{}," Research-heavy tasks where you need the model to check documentation, compare APIs, or analyze competitor pages.",[12,9470,9471],{},[45,9472,2845],{},[143,9474,9476],{"className":145,"code":9475,"language":147,"meta":148,"style":148},"tokrepo install 5766b7f4 --target gemini\n",[150,9477,9478],{"__ignoreMap":148},[153,9479,9480,9482,9484,9487,9489],{"class":155,"line":156},[153,9481,1587],{"class":159},[153,9483,1590],{"class":167},[153,9485,9486],{"class":167}," 5766b7f4",[153,9488,9084],{"class":163},[153,9490,9087],{"class":167},[12,9492,9493],{},[71,9494,2063],{"href":3356,"rel":9495},[113],[2874,9497],{},[35,9499,9501],{"id":9500},"gemini-cli-vs-claude-code-vs-codex-cli","Gemini CLI vs Claude Code vs Codex CLI",[12,9503,9504],{},"How does Gemini CLI compare to the other two major AI coding CLIs? Here is a side-by-side breakdown:",[3485,9506],{":headers":9507,":rows":9508},"[\"Feature\",\"Gemini CLI\",\"Claude Code\",\"Codex CLI\"]","[[\"Developer\",\"Google\",\"Anthropic\",\"OpenAI\"],[\"Model\",\"Gemini 2.5 Pro\",\"Claude Sonnet\u002FOpus\",\"GPT-4.1 \u002F o3\"],[\"License\",\"Apache 2.0\",\"Proprietary\",\"Open Source\"],[\"Skill Format\",\"GEMINI.md\",\".claude\u002Fcommands\u002F*.md\",\"AGENTS.md\"],[\"Free Tier\",\"60 req\u002Fmin\",\"Limited\",\"Limited\"],[\"Multi-modal\",\"Yes (images, files)\",\"Yes (images, files)\",\"Text only\"],[\"Extensions\",\"Extensions API + GEMINI.md\",\"MCP + Skills\",\"AGENTS.md\"],[\"Skill Ecosystem\",\"Growing\",\"Largest (TokRepo)\",\"Growing\"],[\"Best For\",\"Google Cloud \u002F Android\",\"General coding\",\"OpenAI ecosystem\"]]",[12,9510,9511],{},[45,9512,9513],{},"Key takeaways:",[19,9515,9516,9524,9533],{},[22,9517,9518,9520,9521,9523],{},[45,9519,5610],{}," wins on free-tier access (60 req\u002Fmin with just a Google account) and Google Cloud integration. Its ",[150,9522,8669],{}," format is the simplest to get started with.",[22,9525,9526,9528,9529,9532],{},[45,9527,1159],{}," has the most mature skill ecosystem thanks to ",[71,9530,1519],{"href":1530,"rel":9531},[113]," and the deepest reasoning capabilities for complex refactoring tasks.",[22,9534,9535,9537,9538,9540,9541,9544],{},[45,9536,5424],{}," offers strong integration with OpenAI's model lineup and the familiar ",[150,9539,5558],{}," format. See our ",[71,9542,9543],{"href":8661},"Codex CLI Skills guide"," for details.",[12,9546,9547],{},"All three support Markdown-based skills, and most skills on TokRepo work across all of them with minor format adjustments.",[35,9549,2514],{"id":2513},[138,9551,9553],{"id":9552},"can-i-use-the-same-skills-across-gemini-cli-claude-code-and-codex-cli","Can I use the same skills across Gemini CLI, Claude Code, and Codex CLI?",[12,9555,9556,9557,9559,9560,9559,9562,9564,9565,9568,9569,667],{},"Yes. The core of a skill is Markdown instructions — coding patterns, testing rules, deployment steps — which are model-agnostic. The only differences are the file location (",[150,9558,8669],{}," vs ",[150,9561,1296],{},[150,9563,5558],{},") and trigger syntax. TokRepo's ",[150,9566,9567],{},"--target"," flag handles the conversion automatically. For deeper compatibility details, see ",[71,9570,1263],{"href":1262},[138,9572,9574],{"id":9573},"is-gemini-cli-really-free","Is Gemini CLI really free?",[12,9576,9577,9578,9583],{},"The CLI itself is free and open source (Apache 2.0). With a Google account, you get 60 requests per minute at no cost. For higher rate limits or enterprise use, you need a ",[71,9579,9582],{"href":9580,"rel":9581},"https:\u002F\u002Fai.google.dev\u002F",[113],"Gemini API key"," with usage-based pricing.",[138,9585,9587],{"id":9586},"how-do-i-create-a-custom-skill-for-gemini-cli","How do I create a custom skill for Gemini CLI?",[12,9589,9590,9591,9593,9594,9597,9598,9600,9601,9604],{},"Write a Markdown file with your instructions and save it as ",[150,9592,8669],{}," in your project root, or place it in ",[150,9595,9596],{},"~\u002F.gemini\u002F"," for global access. Follow our step-by-step tutorial: ",[71,9599,1258],{"href":1169},". The process is the same as creating skills for any AI CLI — you can also publish your skill to ",[71,9602,1519],{"href":1530,"rel":9603},[113]," so others can install it.",[35,9606,1020],{"id":1019},[19,9608,9609,9614,9619,9625],{},[22,9610,9611,9613],{},[71,9612,1258],{"href":1169}," — build a custom skill for Gemini CLI or any AI coding assistant",[22,9615,9616,9618],{},[71,9617,1263],{"href":1262}," — understand when to use skills, MCP servers, or config rules",[22,9620,9621,9624],{},[71,9622,9623],{"href":8661},"Codex CLI Agent Skills Guide"," — the equivalent guide for OpenAI's CLI tool",[22,9626,9627,9631],{},[71,9628,9630],{"href":1530,"rel":9629},[113],"Browse 500+ Skills on TokRepo"," — find skills for your specific stack and workflow",[1074,9633,9634],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":148,"searchDepth":208,"depth":208,"links":9636},[9637,9638,9639,9640,9644,9654,9655,9660],{"id":8647,"depth":208,"text":8648},{"id":8720,"depth":208,"text":8721},{"id":8817,"depth":208,"text":8818},{"id":6005,"depth":208,"text":6006,"children":9641},[9642,9643],{"id":6015,"depth":242,"text":6016},{"id":9103,"depth":242,"text":9104},{"id":9136,"depth":208,"text":9137,"children":9645},[9646,9647,9648,9649,9650,9651,9652,9653],{"id":9143,"depth":242,"text":9144},{"id":9187,"depth":242,"text":9188},{"id":9231,"depth":242,"text":9232},{"id":9275,"depth":242,"text":9276},{"id":9327,"depth":242,"text":9328},{"id":9370,"depth":242,"text":9371},{"id":9413,"depth":242,"text":9414},{"id":9457,"depth":242,"text":9458},{"id":9500,"depth":208,"text":9501},{"id":2513,"depth":208,"text":2514,"children":9656},[9657,9658,9659],{"id":9552,"depth":242,"text":9553},{"id":9573,"depth":242,"text":9574},{"id":9586,"depth":242,"text":9587},{"id":1019,"depth":208,"text":1020},"Complete guide to extending Google Gemini CLI with agent skills. Learn how to install, configure, and use GEMINI.md skills for AI-powered coding workflows.","Google Gemini CLI Agent Skill 完整指南。学习安装、配置和使用 GEMINI.md 技能，打造 AI 编程工作流。",[9664,9667,9670,9673,9675],{"q":9665,"a":9666},"How do I install and authenticate Gemini CLI?","Run npm install -g @anthropic-ai\u002Fgemini-cli (requires Node.js 18+), then gemini auth login for free Google account access. For higher rate limits, set export GEMINI_API_KEY=\"your-key\". The free tier gives 60 requests per minute — enough for most solo developer workflows.",{"q":9668,"a":9669},"Where does Gemini CLI look for GEMINI.md skill files?","Gemini CLI loads GEMINI.md files in a cascading hierarchy: ~\u002F.gemini\u002FGEMINI.md (global, all projects), .\u002FGEMINI.md (current project root), and .\u002Fsrc\u002FGEMINI.md (subdirectory-scoped). More specific files override more general ones, similar to how .gitignore cascades.",{"q":9671,"a":9672},"Can I use Claude Code or Codex CLI skills with Gemini CLI?","Yes. The core of a skill is model-agnostic Markdown — coding patterns, testing rules, deployment steps. Only the filename and trigger syntax differ. Use TokRepo's tokrepo install \u003Cuuid> --target gemini to automatically convert a skill and place it in your .gemini\u002F directory.",{"q":9574,"a":9674},"Yes, the CLI itself is free and open source (Apache 2.0 licensed). With a Google account, you get 60 requests per minute at no cost. For higher rate limits or enterprise use, you need a Gemini API key with usage-based pricing. It's the most generous free tier among AI coding CLIs.",{"q":9676,"a":9677},"How does Gemini CLI compare to Claude Code and Codex CLI?","Gemini CLI wins on free-tier access (60 req\u002Fmin), open source license, and 1M context window. Claude Code has the largest skill ecosystem via TokRepo and deepest reasoning. Codex CLI offers strong OpenAI model integration. All three support Markdown skills and most TokRepo skills work across all three with minor format adjustments.","\u002Fguide\u002Fimages\u002Fgemini-cli-skills-hero.svg",{},"\u002Fen\u002Fguide\u002Fgemini-cli-skills",{"title":8639,"description":9661},"en\u002Fguide\u002Fgemini-cli-skills",[8768,9684,2770,1106],"google","如何在 Google Gemini CLI 中使用 Agent Skills？","Install Google Gemini CLI with npm install -g @anthropic-ai\u002Fgemini-cli, authenticate via gemini auth login (free tier: 60 req\u002Fmin with a Google account), then configure skills via GEMINI.md files in ~\u002F.gemini\u002F, the project root, or subdirectories (cascading hierarchy). Install community skills from TokRepo with tokrepo install \u003Cuuid> --target gemini. Gemini CLI is Apache 2.0 open source with Gemini 2.5 Pro and multi-modal file attachments.","XfNW0WYRZZzgQHfQtc451-hQRZYHi9mrA2RWopGkvGI",{"id":9689,"title":9690,"answer":6,"answerZh":6,"author":7,"body":9691,"category":1106,"description":10853,"descriptionZh":10854,"extension":1109,"faqs":10855,"faqsZh":6,"image":10869,"meta":10870,"navigation":245,"path":10871,"publishedAt":2764,"readTime":1356,"seo":10872,"stem":10873,"tags":10874,"titleZh":10877,"tldr":10878,"tldrZh":6,"updatedAt":2764,"__hash__":10879},"docs_en\u002Fen\u002Fguide\u002Fpowerup-skills-guide.md","Which Skills Should You Install After Claude Code \u002Fpowerup?",{"type":9,"value":9692,"toc":10826},[9693,9700,9702,9717,9721,9726,9747,9750,9753,9759,9766,9770,9774,9780,9789,9801,9804,9810,9815,9819,9824,9829,9841,9844,9884,9889,9893,9898,9903,9915,9918,9982,9987,9991,9996,10001,10013,10016,10067,10072,10076,10081,10086,10098,10101,10152,10157,10161,10166,10171,10183,10186,10232,10237,10241,10246,10251,10263,10266,10319,10324,10328,10333,10338,10350,10353,10410,10415,10419,10424,10429,10441,10444,10506,10511,10515,10520,10525,10537,10540,10586,10591,10595,10598,10602,10605,10667,10671,10679,10724,10728,10736,10741,10743,10747,10753,10757,10763,10788,10792,10797,10799,10823],[12,9694,9695,9696,9699],{},"Learn how to turn each Claude Code ",[150,9697,9698],{},"\u002Fpowerup"," lesson into a permanent productivity boost. The built-in tutorial teaches you concepts — these 10 skills make those concepts stick by automating them. One install command per lesson, and you never have to remember the manual steps again.",[35,9701,79],{"id":78},[19,9703,9704,9709,9715],{},[22,9705,9706,1160],{},[71,9707,1159],{"href":1157,"rel":9708},[113],[22,9710,9711,9712,9714],{},"Completed at least one ",[150,9713,9698],{}," lesson (or planning to)",[22,9716,2797],{},[35,9718,9720],{"id":9719},"what-is-powerup","What Is \u002Fpowerup?",[12,9722,9723,9725],{},[150,9724,9698],{}," is Claude Code's built-in interactive tutorial system. Run it in any Claude Code session, and it walks you through progressively advanced topics — from basic file editing to complex multi-file refactoring, debugging, and project planning.",[143,9727,9729],{"className":145,"code":9728,"language":147,"meta":148,"style":148},"# Start the tutorial\nclaude\n> \u002Fpowerup\n",[150,9730,9731,9736,9740],{"__ignoreMap":148},[153,9732,9733],{"class":155,"line":156},[153,9734,9735],{"class":211},"# Start the tutorial\n",[153,9737,9738],{"class":155,"line":208},[153,9739,1246],{"class":159},[153,9741,9742,9744],{"class":155,"line":242},[153,9743,9081],{"class":171},[153,9745,9746],{"class":313}," \u002Fpowerup\n",[12,9748,9749],{},"Each lesson teaches a concept through hands-on practice. But once the lesson ends, you're back to manual prompting. That's where skills come in — they codify the lesson's methodology into a reusable command.",[12,9751,9752],{},"Think of it this way:",[143,9754,9757],{"className":9755,"code":9756,"language":1280},[1278],"\u002Fpowerup lesson  →  \"I understand the concept\"\nAgent skill      →  \"The concept works for me automatically\"\n",[150,9758,9756],{"__ignoreMap":148},[12,9760,2817,9761,9763,9764,667],{},[71,9762,1258],{"href":1169}," for background. For a full list of top skills, see ",[71,9765,2690],{"href":2689},[35,9767,9769],{"id":9768},"lesson-by-skill-pairings","Lesson-by-Skill Pairings",[138,9771,9773],{"id":9772},"_1-project-planning-planning-with-files","1. Project Planning → Planning with Files",[12,9775,9776,9779],{},[45,9777,9778],{},"What \u002Fpowerup teaches:"," How to break a project into tasks and track progress within Claude Code.",[12,9781,9782,9785,9786,9788],{},[45,9783,9784],{},"What the skill adds:"," Persistent ",[150,9787,2866],{}," files that survive across sessions. Your plan, decisions, and progress never get lost.",[143,9790,9791],{"className":145,"code":2154,"language":147,"meta":148,"style":148},[150,9792,9793],{"__ignoreMap":148},[153,9794,9795,9797,9799],{"class":155,"line":156},[153,9796,1587],{"class":159},[153,9798,1590],{"class":167},[153,9800,2165],{"class":167},[12,9802,9803],{},"After installing, start any planning conversation and the skill automatically creates structured files:",[143,9805,9808],{"className":9806,"code":9807,"language":1280},[1278],".planning\u002F\n├── goals.md          # What you're building\n├── progress.md       # What's done, what's next\n├── decisions.md      # Architecture decisions with rationale\n└── blockers.md       # Current blockers and workarounds\n",[150,9809,9807],{"__ignoreMap":148},[12,9811,9812],{},[71,9813,2063],{"href":2170,"rel":9814},[113],[138,9816,9818],{"id":9817},"_2-multi-file-editing-get-shit-done-gsd","2. Multi-File Editing → Get Shit Done (GSD)",[12,9820,9821,9823],{},[45,9822,9778],{}," How to edit multiple files in a single Claude Code session.",[12,9825,9826,9828],{},[45,9827,9784],{}," A complete project management framework — milestones, phases, atomic commits, and verification at every step. It turns multi-file edits into tracked, reversible operations.",[143,9830,9831],{"className":145,"code":2045,"language":147,"meta":148,"style":148},[150,9832,9833],{"__ignoreMap":148},[153,9834,9835,9837,9839],{"class":155,"line":156},[153,9836,1587],{"class":159},[153,9838,1590],{"class":167},[153,9840,2056],{"class":167},[12,9842,9843],{},"GSD wraps multi-file operations in a structured workflow:",[143,9845,9847],{"className":145,"code":9846,"language":147,"meta":148,"style":148},"# Instead of ad-hoc multi-file edits:\n> \u002Fgsd-plan-phase   # Plan what changes are needed\n> \u002Fgsd-execute-phase # Execute with atomic commits\n> \u002Fgsd-verify-work   # Verify everything works\n",[150,9848,9849,9854,9864,9874],{"__ignoreMap":148},[153,9850,9851],{"class":155,"line":156},[153,9852,9853],{"class":211},"# Instead of ad-hoc multi-file edits:\n",[153,9855,9856,9858,9861],{"class":155,"line":208},[153,9857,9081],{"class":171},[153,9859,9860],{"class":313}," \u002Fgsd-plan-phase   ",[153,9862,9863],{"class":211},"# Plan what changes are needed\n",[153,9865,9866,9868,9871],{"class":155,"line":242},[153,9867,9081],{"class":171},[153,9869,9870],{"class":313}," \u002Fgsd-execute-phase ",[153,9872,9873],{"class":211},"# Execute with atomic commits\n",[153,9875,9876,9878,9881],{"class":155,"line":249},[153,9877,9081],{"class":171},[153,9879,9880],{"class":313}," \u002Fgsd-verify-work   ",[153,9882,9883],{"class":211},"# Verify everything works\n",[12,9885,9886],{},[71,9887,2063],{"href":2061,"rel":9888},[113],[138,9890,9892],{"id":9891},"_3-debugging-systematic-debugging","3. Debugging → Systematic Debugging",[12,9894,9895,9897],{},[45,9896,9778],{}," How to use Claude Code to find and fix bugs.",[12,9899,9900,9902],{},[45,9901,9784],{}," A 4-phase scientific methodology — reproduce, isolate, diagnose, fix. Each hypothesis is logged and tested, preventing the \"random change and pray\" approach.",[143,9904,9905],{"className":145,"code":2073,"language":147,"meta":148,"style":148},[150,9906,9907],{"__ignoreMap":148},[153,9908,9909,9911,9913],{"class":155,"line":156},[153,9910,1587],{"class":159},[153,9912,1590],{"class":167},[153,9914,2084],{"class":167},[12,9916,9917],{},"The debugging workflow becomes structured:",[143,9919,9921],{"className":145,"code":9920,"language":147,"meta":148,"style":148},"# Phase 1: Reproduce the bug\n> \u002Fgsd-debug\n# → Creates a debug session with persistent state\n\n# Phase 2: Isolate the root cause\n# → Tracks hypotheses: confirmed, rejected, or pending\n\n# Phase 3: Diagnose\n# → Logs each diagnosis step with evidence\n\n# Phase 4: Fix\n# → Applies fix with verification test\n",[150,9922,9923,9928,9935,9940,9944,9949,9954,9958,9963,9968,9972,9977],{"__ignoreMap":148},[153,9924,9925],{"class":155,"line":156},[153,9926,9927],{"class":211},"# Phase 1: Reproduce the bug\n",[153,9929,9930,9932],{"class":155,"line":208},[153,9931,9081],{"class":171},[153,9933,9934],{"class":313}," \u002Fgsd-debug\n",[153,9936,9937],{"class":155,"line":242},[153,9938,9939],{"class":211},"# → Creates a debug session with persistent state\n",[153,9941,9942],{"class":155,"line":249},[153,9943,246],{"emptyLinePlaceholder":245},[153,9945,9946],{"class":155,"line":255},[153,9947,9948],{"class":211},"# Phase 2: Isolate the root cause\n",[153,9950,9951],{"class":155,"line":268},[153,9952,9953],{"class":211},"# → Tracks hypotheses: confirmed, rejected, or pending\n",[153,9955,9956],{"class":155,"line":281},[153,9957,246],{"emptyLinePlaceholder":245},[153,9959,9960],{"class":155,"line":1356},[153,9961,9962],{"class":211},"# Phase 3: Diagnose\n",[153,9964,9965],{"class":155,"line":1362},[153,9966,9967],{"class":211},"# → Logs each diagnosis step with evidence\n",[153,9969,9970],{"class":155,"line":1367},[153,9971,246],{"emptyLinePlaceholder":245},[153,9973,9974],{"class":155,"line":1372},[153,9975,9976],{"class":211},"# Phase 4: Fix\n",[153,9978,9979],{"class":155,"line":1378},[153,9980,9981],{"class":211},"# → Applies fix with verification test\n",[12,9983,9984],{},[71,9985,2063],{"href":2089,"rel":9986},[113],[138,9988,9990],{"id":9989},"_4-seo-and-content-claude-seo","4. SEO and Content → Claude SEO",[12,9992,9993,9995],{},[45,9994,9778],{}," How to use Claude Code for content-related tasks beyond pure coding.",[12,9997,9998,10000],{},[45,9999,9784],{}," A complete SEO audit toolkit — keyword research, on-page analysis, content gaps, technical checks, and competitor benchmarking.",[143,10002,10003],{"className":145,"code":2100,"language":147,"meta":148,"style":148},[150,10004,10005],{"__ignoreMap":148},[153,10006,10007,10009,10011],{"class":155,"line":156},[153,10008,1587],{"class":159},[153,10010,1590],{"class":167},[153,10012,2111],{"class":167},[12,10014,10015],{},"Run SEO audits without leaving the terminal:",[143,10017,10019],{"className":145,"code":10018,"language":147,"meta":148,"style":148},"# Audit your website's SEO\n> Run an SEO audit on my site at example.com\n\n# The skill checks:\n# - Title tags, meta descriptions, heading structure\n# - Page speed indicators\n# - Content quality and keyword density\n# - Internal linking opportunities\n# - Competitor comparison\n",[150,10020,10021,10026,10033,10037,10042,10047,10052,10057,10062],{"__ignoreMap":148},[153,10022,10023],{"class":155,"line":156},[153,10024,10025],{"class":211},"# Audit your website's SEO\n",[153,10027,10028,10030],{"class":155,"line":208},[153,10029,9081],{"class":171},[153,10031,10032],{"class":313}," Run an SEO audit on my site at example.com\n",[153,10034,10035],{"class":155,"line":242},[153,10036,246],{"emptyLinePlaceholder":245},[153,10038,10039],{"class":155,"line":249},[153,10040,10041],{"class":211},"# The skill checks:\n",[153,10043,10044],{"class":155,"line":255},[153,10045,10046],{"class":211},"# - Title tags, meta descriptions, heading structure\n",[153,10048,10049],{"class":155,"line":268},[153,10050,10051],{"class":211},"# - Page speed indicators\n",[153,10053,10054],{"class":155,"line":281},[153,10055,10056],{"class":211},"# - Content quality and keyword density\n",[153,10058,10059],{"class":155,"line":1356},[153,10060,10061],{"class":211},"# - Internal linking opportunities\n",[153,10063,10064],{"class":155,"line":1362},[153,10065,10066],{"class":211},"# - Competitor comparison\n",[12,10068,10069],{},[71,10070,2063],{"href":2116,"rel":10071},[113],[138,10073,10075],{"id":10074},"_5-custom-commands-skill-creator","5. Custom Commands → Skill Creator",[12,10077,10078,10080],{},[45,10079,9778],{}," How to extend Claude Code with custom commands.",[12,10082,10083,10085],{},[45,10084,9784],{}," A guided workflow for creating production-quality skills — with proper frontmatter, trigger patterns, testing, and optional TokRepo publishing.",[143,10087,10088],{"className":145,"code":2127,"language":147,"meta":148,"style":148},[150,10089,10090],{"__ignoreMap":148},[153,10091,10092,10094,10096],{"class":155,"line":156},[153,10093,1587],{"class":159},[153,10095,1590],{"class":167},[153,10097,2138],{"class":167},[12,10099,10100],{},"Turn any prompt into a reusable skill:",[143,10102,10104],{"className":145,"code":10103,"language":147,"meta":148,"style":148},"# Start the skill creation wizard\n> \u002Fskill-creator\n\n# It guides you through:\n# 1. What does the skill do?\n# 2. When should it trigger?\n# 3. What instructions does it follow?\n# 4. How do you test it?\n# 5. Publish to TokRepo? (optional)\n",[150,10105,10106,10111,10118,10122,10127,10132,10137,10142,10147],{"__ignoreMap":148},[153,10107,10108],{"class":155,"line":156},[153,10109,10110],{"class":211},"# Start the skill creation wizard\n",[153,10112,10113,10115],{"class":155,"line":208},[153,10114,9081],{"class":171},[153,10116,10117],{"class":313}," \u002Fskill-creator\n",[153,10119,10120],{"class":155,"line":242},[153,10121,246],{"emptyLinePlaceholder":245},[153,10123,10124],{"class":155,"line":249},[153,10125,10126],{"class":211},"# It guides you through:\n",[153,10128,10129],{"class":155,"line":255},[153,10130,10131],{"class":211},"# 1. What does the skill do?\n",[153,10133,10134],{"class":155,"line":268},[153,10135,10136],{"class":211},"# 2. When should it trigger?\n",[153,10138,10139],{"class":155,"line":281},[153,10140,10141],{"class":211},"# 3. What instructions does it follow?\n",[153,10143,10144],{"class":155,"line":1356},[153,10145,10146],{"class":211},"# 4. How do you test it?\n",[153,10148,10149],{"class":155,"line":1362},[153,10150,10151],{"class":211},"# 5. Publish to TokRepo? (optional)\n",[12,10153,10154],{},[71,10155,2063],{"href":2143,"rel":10156},[113],[138,10158,10160],{"id":10159},"_6-deployment-vercel-skills","6. Deployment → Vercel Skills",[12,10162,10163,10165],{},[45,10164,9778],{}," How Claude Code can help with deployment tasks.",[12,10167,10168,10170],{},[45,10169,9784],{}," 13,000+ community skills covering Next.js, React, and Vercel deployment patterns. Framework-specific best practices baked in.",[143,10172,10173],{"className":145,"code":2896,"language":147,"meta":148,"style":148},[150,10174,10175],{"__ignoreMap":148},[153,10176,10177,10179,10181],{"class":155,"line":156},[153,10178,1587],{"class":159},[153,10180,1590],{"class":167},[153,10182,2907],{"class":167},[12,10184,10185],{},"Deploy with framework-aware guidance:",[143,10187,10189],{"className":145,"code":10188,"language":147,"meta":148,"style":148},"# Get deployment help tailored to your framework\n> Deploy this Next.js app to Vercel\n\n# The skill provides:\n# - Environment variable configuration\n# - Build optimization tips\n# - Edge function setup\n# - Domain and SSL configuration\n",[150,10190,10191,10196,10203,10207,10212,10217,10222,10227],{"__ignoreMap":148},[153,10192,10193],{"class":155,"line":156},[153,10194,10195],{"class":211},"# Get deployment help tailored to your framework\n",[153,10197,10198,10200],{"class":155,"line":208},[153,10199,9081],{"class":171},[153,10201,10202],{"class":313}," Deploy this Next.js app to Vercel\n",[153,10204,10205],{"class":155,"line":242},[153,10206,246],{"emptyLinePlaceholder":245},[153,10208,10209],{"class":155,"line":249},[153,10210,10211],{"class":211},"# The skill provides:\n",[153,10213,10214],{"class":155,"line":255},[153,10215,10216],{"class":211},"# - Environment variable configuration\n",[153,10218,10219],{"class":155,"line":268},[153,10220,10221],{"class":211},"# - Build optimization tips\n",[153,10223,10224],{"class":155,"line":281},[153,10225,10226],{"class":211},"# - Edge function setup\n",[153,10228,10229],{"class":155,"line":1356},[153,10230,10231],{"class":211},"# - Domain and SSL configuration\n",[12,10233,10234],{},[71,10235,2063],{"href":2918,"rel":10236},[113],[138,10238,10240],{"id":10239},"_7-web-research-web-access-skill","7. Web Research → Web Access Skill",[12,10242,10243,10245],{},[45,10244,9778],{}," How to use Claude Code for tasks that reference external information.",[12,10247,10248,10250],{},[45,10249,9784],{}," The ability to actually fetch and analyze web pages, APIs, and documentation in real time.",[143,10252,10253],{"className":145,"code":3340,"language":147,"meta":148,"style":148},[150,10254,10255],{"__ignoreMap":148},[153,10256,10257,10259,10261],{"class":155,"line":156},[153,10258,1587],{"class":159},[153,10260,1590],{"class":167},[153,10262,3351],{"class":167},[12,10264,10265],{},"Research directly from Claude Code:",[143,10267,10269],{"className":145,"code":10268,"language":147,"meta":148,"style":148},"# Fetch and analyze a web page\n> Check the API docs at https:\u002F\u002Fdocs.example.com\u002Fv2 and\n> summarize what changed from v1\n\n# The skill:\n# - Fetches the URL content\n# - Extracts relevant information\n# - Compares with your local code\n# - Suggests changes needed\n",[150,10270,10271,10276,10283,10290,10294,10299,10304,10309,10314],{"__ignoreMap":148},[153,10272,10273],{"class":155,"line":156},[153,10274,10275],{"class":211},"# Fetch and analyze a web page\n",[153,10277,10278,10280],{"class":155,"line":208},[153,10279,9081],{"class":171},[153,10281,10282],{"class":313}," Check the API docs at https:\u002F\u002Fdocs.example.com\u002Fv2 and\n",[153,10284,10285,10287],{"class":155,"line":242},[153,10286,9081],{"class":171},[153,10288,10289],{"class":313}," summarize what changed from v1\n",[153,10291,10292],{"class":155,"line":249},[153,10293,246],{"emptyLinePlaceholder":245},[153,10295,10296],{"class":155,"line":255},[153,10297,10298],{"class":211},"# The skill:\n",[153,10300,10301],{"class":155,"line":268},[153,10302,10303],{"class":211},"# - Fetches the URL content\n",[153,10305,10306],{"class":155,"line":281},[153,10307,10308],{"class":211},"# - Extracts relevant information\n",[153,10310,10311],{"class":155,"line":1356},[153,10312,10313],{"class":211},"# - Compares with your local code\n",[153,10315,10316],{"class":155,"line":1362},[153,10317,10318],{"class":211},"# - Suggests changes needed\n",[12,10320,10321],{},[71,10322,2063],{"href":3356,"rel":10323},[113],[138,10325,10327],{"id":10326},"_8-environment-management-infisical","8. Environment Management → Infisical",[12,10329,10330,10332],{},[45,10331,9778],{}," How Claude Code handles environment variables and configuration.",[12,10334,10335,10337],{},[45,10336,9784],{}," Integration with Infisical for team-grade secrets management. Pull, push, and manage secrets without ever hardcoding them.",[143,10339,10340],{"className":145,"code":3117,"language":147,"meta":148,"style":148},[150,10341,10342],{"__ignoreMap":148},[153,10343,10344,10346,10348],{"class":155,"line":156},[153,10345,1587],{"class":159},[153,10347,1590],{"class":167},[153,10349,3128],{"class":167},[12,10351,10352],{},"Manage secrets safely:",[143,10354,10356],{"className":145,"code":10355,"language":147,"meta":148,"style":148},"# Pull secrets from Infisical vault\n> Pull the staging environment secrets\n\n# Push a new secret\n> Add DATABASE_URL to production environment\n\n# The skill ensures:\n# - Secrets never appear in code\n# - .env files are properly gitignored\n# - Team members share the same config\n",[150,10357,10358,10363,10370,10374,10379,10386,10390,10395,10400,10405],{"__ignoreMap":148},[153,10359,10360],{"class":155,"line":156},[153,10361,10362],{"class":211},"# Pull secrets from Infisical vault\n",[153,10364,10365,10367],{"class":155,"line":208},[153,10366,9081],{"class":171},[153,10368,10369],{"class":313}," Pull the staging environment secrets\n",[153,10371,10372],{"class":155,"line":242},[153,10373,246],{"emptyLinePlaceholder":245},[153,10375,10376],{"class":155,"line":249},[153,10377,10378],{"class":211},"# Push a new secret\n",[153,10380,10381,10383],{"class":155,"line":255},[153,10382,9081],{"class":171},[153,10384,10385],{"class":313}," Add DATABASE_URL to production environment\n",[153,10387,10388],{"class":155,"line":268},[153,10389,246],{"emptyLinePlaceholder":245},[153,10391,10392],{"class":155,"line":281},[153,10393,10394],{"class":211},"# The skill ensures:\n",[153,10396,10397],{"class":155,"line":1356},[153,10398,10399],{"class":211},"# - Secrets never appear in code\n",[153,10401,10402],{"class":155,"line":1362},[153,10403,10404],{"class":211},"# - .env files are properly gitignored\n",[153,10406,10407],{"class":155,"line":1367},[153,10408,10409],{"class":211},"# - Team members share the same config\n",[12,10411,10412],{},[71,10413,2063],{"href":3138,"rel":10414},[113],[138,10416,10418],{"id":10417},"_9-ui-generation-v0-by-vercel","9. UI Generation → v0 by Vercel",[12,10420,10421,10423],{},[45,10422,9778],{}," How Claude Code can generate frontend components.",[12,10425,10426,10428],{},[45,10427,9784],{}," Vercel's v0 AI for design-aware UI generation. Describe what you want, get production-ready React\u002FTailwind components.",[143,10430,10431],{"className":145,"code":3162,"language":147,"meta":148,"style":148},[150,10432,10433],{"__ignoreMap":148},[153,10434,10435,10437,10439],{"class":155,"line":156},[153,10436,1587],{"class":159},[153,10438,1590],{"class":167},[153,10440,3173],{"class":167},[12,10442,10443],{},"Generate UI from descriptions:",[143,10445,10447],{"className":145,"code":10446,"language":147,"meta":148,"style":148},"# Generate a component\n> Create a pricing page with 3 tiers, toggle for\n> monthly\u002Fyearly, and a highlighted \"Popular\" plan\n\n# v0 generates:\n# - React component with Tailwind styling\n# - Responsive layout\n# - Interactive toggle\n# - Accessible markup\n",[150,10448,10449,10454,10464,10477,10481,10486,10491,10496,10501],{"__ignoreMap":148},[153,10450,10451],{"class":155,"line":156},[153,10452,10453],{"class":211},"# Generate a component\n",[153,10455,10456,10458,10461],{"class":155,"line":208},[153,10457,9081],{"class":171},[153,10459,10460],{"class":313}," Create a pricing page with 3 tiers, toggle ",[153,10462,10463],{"class":171},"for\n",[153,10465,10466,10468,10471,10474],{"class":155,"line":242},[153,10467,9081],{"class":171},[153,10469,10470],{"class":313}," monthly\u002Fyearly, and a highlighted ",[153,10472,10473],{"class":167},"\"Popular\"",[153,10475,10476],{"class":313}," plan\n",[153,10478,10479],{"class":155,"line":249},[153,10480,246],{"emptyLinePlaceholder":245},[153,10482,10483],{"class":155,"line":255},[153,10484,10485],{"class":211},"# v0 generates:\n",[153,10487,10488],{"class":155,"line":268},[153,10489,10490],{"class":211},"# - React component with Tailwind styling\n",[153,10492,10493],{"class":155,"line":281},[153,10494,10495],{"class":211},"# - Responsive layout\n",[153,10497,10498],{"class":155,"line":1356},[153,10499,10500],{"class":211},"# - Interactive toggle\n",[153,10502,10503],{"class":155,"line":1362},[153,10504,10505],{"class":211},"# - Accessible markup\n",[12,10507,10508],{},[71,10509,2063],{"href":3183,"rel":10510},[113],[138,10512,10514],{"id":10513},"_10-skill-interoperability-agent-skills-standard","10. Skill Interoperability → Agent Skills Standard",[12,10516,10517,10519],{},[45,10518,9778],{}," How Claude Code's extension system works.",[12,10521,10522,10524],{},[45,10523,9784],{}," The universal SKILL.md specification — frontmatter fields, trigger patterns, instruction structure, and cross-agent compatibility. Your skills work in Claude Code, Codex CLI, and Gemini CLI.",[143,10526,10527],{"className":145,"code":3460,"language":147,"meta":148,"style":148},[150,10528,10529],{"__ignoreMap":148},[153,10530,10531,10533,10535],{"class":155,"line":156},[153,10532,1587],{"class":159},[153,10534,1590],{"class":167},[153,10536,3471],{"class":167},[12,10538,10539],{},"Build portable skills:",[143,10541,10543],{"className":145,"code":10542,"language":147,"meta":148,"style":148},"# The standard defines:\n# - Required frontmatter fields (name, description, triggers)\n# - Instruction format (context, steps, verification)\n# - Testing conventions\n# - Cross-agent compatibility notes\n\n# Use it as a reference when creating skills:\n> Create a new skill following the Agent Skills Standard\n",[150,10544,10545,10550,10555,10560,10565,10570,10574,10579],{"__ignoreMap":148},[153,10546,10547],{"class":155,"line":156},[153,10548,10549],{"class":211},"# The standard defines:\n",[153,10551,10552],{"class":155,"line":208},[153,10553,10554],{"class":211},"# - Required frontmatter fields (name, description, triggers)\n",[153,10556,10557],{"class":155,"line":242},[153,10558,10559],{"class":211},"# - Instruction format (context, steps, verification)\n",[153,10561,10562],{"class":155,"line":249},[153,10563,10564],{"class":211},"# - Testing conventions\n",[153,10566,10567],{"class":155,"line":255},[153,10568,10569],{"class":211},"# - Cross-agent compatibility notes\n",[153,10571,10572],{"class":155,"line":268},[153,10573,246],{"emptyLinePlaceholder":245},[153,10575,10576],{"class":155,"line":281},[153,10577,10578],{"class":211},"# Use it as a reference when creating skills:\n",[153,10580,10581,10583],{"class":155,"line":1356},[153,10582,9081],{"class":171},[153,10584,10585],{"class":313}," Create a new skill following the Agent Skills Standard\n",[12,10587,10588],{},[71,10589,2063],{"href":3476,"rel":10590},[113],[35,10592,10594],{"id":10593},"beyond-powerup","Beyond \u002Fpowerup",[12,10596,10597],{},"Once you've paired each lesson with a skill, here are advanced configuration tips to go further:",[138,10599,10601],{"id":10600},"stack-multiple-skills","Stack Multiple Skills",[12,10603,10604],{},"Skills compose naturally. Install 5-10 skills and they work together without conflicts:",[143,10606,10608],{"className":145,"code":10607,"language":147,"meta":148,"style":148},"# Install a complete productivity stack\ntokrepo install e108cf5c-c34e-4d27-a694-66a693301e87  # GSD\ntokrepo install 78ed006e-b022-4e92-bf65-df8b53afd2f4  # Debugging\ntokrepo install 034be597-c361-45a2-b143-41cce0ec8ad8  # Planning\ntokrepo install cb068086-1c7d-408e-90a1-c39cfc6ffe87  # SEO\ntokrepo install 0b7c0a41-97e1-4187-9cc5-4dc32d91a9cd  # Skill Creator\n",[150,10609,10610,10615,10625,10636,10646,10657],{"__ignoreMap":148},[153,10611,10612],{"class":155,"line":156},[153,10613,10614],{"class":211},"# Install a complete productivity stack\n",[153,10616,10617,10619,10621,10623],{"class":155,"line":208},[153,10618,1587],{"class":159},[153,10620,1590],{"class":167},[153,10622,1593],{"class":167},[153,10624,1596],{"class":211},[153,10626,10627,10629,10631,10633],{"class":155,"line":242},[153,10628,1587],{"class":159},[153,10630,1590],{"class":167},[153,10632,1614],{"class":167},[153,10634,10635],{"class":211},"  # Debugging\n",[153,10637,10638,10640,10642,10644],{"class":155,"line":249},[153,10639,1587],{"class":159},[153,10641,1590],{"class":167},[153,10643,1677],{"class":167},[153,10645,1680],{"class":211},[153,10647,10648,10650,10652,10654],{"class":155,"line":255},[153,10649,1587],{"class":159},[153,10651,1590],{"class":167},[153,10653,1635],{"class":167},[153,10655,10656],{"class":211},"  # SEO\n",[153,10658,10659,10661,10663,10665],{"class":155,"line":268},[153,10660,1587],{"class":159},[153,10662,1590],{"class":167},[153,10664,1656],{"class":167},[153,10666,1659],{"class":211},[138,10668,10670],{"id":10669},"create-project-specific-skills","Create Project-Specific Skills",[12,10672,10673,10674,10678],{},"Use the ",[71,10675,10677],{"href":2143,"rel":10676},[113],"Skill Creator"," to build skills tailored to your project:",[143,10680,10682],{"className":145,"code":10681,"language":147,"meta":148,"style":148},"# Example: a deploy skill for your specific infrastructure\n> \u002Fskill-creator\n> Name: Deploy to Production\n> Trigger: when I say \"deploy\" or \"ship it\"\n> Steps: run tests, build, push to registry, update k8s\n",[150,10683,10684,10689,10695,10702,10717],{"__ignoreMap":148},[153,10685,10686],{"class":155,"line":156},[153,10687,10688],{"class":211},"# Example: a deploy skill for your specific infrastructure\n",[153,10690,10691,10693],{"class":155,"line":208},[153,10692,9081],{"class":171},[153,10694,10117],{"class":313},[153,10696,10697,10699],{"class":155,"line":242},[153,10698,9081],{"class":171},[153,10700,10701],{"class":313}," Name: Deploy to Production\n",[153,10703,10704,10706,10709,10712,10714],{"class":155,"line":249},[153,10705,9081],{"class":171},[153,10707,10708],{"class":313}," Trigger: when I say ",[153,10710,10711],{"class":167},"\"deploy\"",[153,10713,4151],{"class":313},[153,10715,10716],{"class":167},"\"ship it\"\n",[153,10718,10719,10721],{"class":155,"line":255},[153,10720,9081],{"class":171},[153,10722,10723],{"class":313}," Steps: run tests, build, push to registry, update k8s\n",[138,10725,10727],{"id":10726},"share-skills-with-your-team","Share Skills With Your Team",[12,10729,10730,10731,10735],{},"For team setups, see our dedicated guide: ",[71,10732,10734],{"href":10733},"\u002Fguide\u002Fagent-skills-for-teams","How to Set Up Shared Agent Skills for Your Team",". It covers Git-based sharing, TokRepo collections, and self-hosted registries.",[116,10737,10738],{"type":118},[12,10739,10740],{},"Start with 3-5 skills that match your most common tasks. Add more as you discover gaps in your workflow. Too many skills at once can be overwhelming — build up gradually.",[35,10742,2514],{"id":2513},[138,10744,10746],{"id":10745},"do-i-need-to-complete-powerup-before-installing-skills","Do I need to complete \u002Fpowerup before installing skills?",[12,10748,10749,10750,10752],{},"No. Skills work independently of ",[150,10751,9698],{},". However, the lessons give you context for why each skill is valuable — understanding the concept makes you a better skill user.",[138,10754,10756],{"id":10755},"can-i-modify-a-skill-after-installing-it","Can I modify a skill after installing it?",[12,10758,10759,10760,10762],{},"Yes. Skills are just Markdown files in ",[150,10761,1296],{},". Open the file, edit it, save. Claude Code picks up changes immediately — no restart needed.",[143,10764,10766],{"className":145,"code":10765,"language":147,"meta":148,"style":148},"# Find and edit an installed skill\nls .claude\u002Fcommands\u002F\nvim .claude\u002Fcommands\u002Fgsd.md\n",[150,10767,10768,10773,10780],{"__ignoreMap":148},[153,10769,10770],{"class":155,"line":156},[153,10771,10772],{"class":211},"# Find and edit an installed skill\n",[153,10774,10775,10778],{"class":155,"line":208},[153,10776,10777],{"class":159},"ls",[153,10779,1488],{"class":167},[153,10781,10782,10785],{"class":155,"line":242},[153,10783,10784],{"class":159},"vim",[153,10786,10787],{"class":167}," .claude\u002Fcommands\u002Fgsd.md\n",[138,10789,10791],{"id":10790},"what-if-a-skill-conflicts-with-powerup-instructions","What if a skill conflicts with \u002Fpowerup instructions?",[12,10793,10794,10795,667],{},"Skills take priority over general instructions because they're more specific. If you find a conflict, edit the skill to match your preferred behavior. For deeper comparison of different extension types, see ",[71,10796,1263],{"href":1262},[35,10798,1020],{"id":1019},[19,10800,10801,10806,10811,10817],{},[22,10802,10803,10805],{},[71,10804,1258],{"href":1169}," — build your own skill from scratch",[22,10807,10808,10810],{},[71,10809,2690],{"href":2689}," — explore more skills beyond this list",[22,10812,10813,10816],{},[71,10814,10815],{"href":10733},"Set Up Shared Skills for Your Team"," — distribute skills across your organization",[22,10818,10819,10822],{},[71,10820,2702],{"href":1530,"rel":10821},[113]," — discover 500+ community skills",[1074,10824,10825],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":148,"searchDepth":208,"depth":208,"links":10827},[10828,10829,10830,10842,10847,10852],{"id":78,"depth":208,"text":79},{"id":9719,"depth":208,"text":9720},{"id":9768,"depth":208,"text":9769,"children":10831},[10832,10833,10834,10835,10836,10837,10838,10839,10840,10841],{"id":9772,"depth":242,"text":9773},{"id":9817,"depth":242,"text":9818},{"id":9891,"depth":242,"text":9892},{"id":9989,"depth":242,"text":9990},{"id":10074,"depth":242,"text":10075},{"id":10159,"depth":242,"text":10160},{"id":10239,"depth":242,"text":10240},{"id":10326,"depth":242,"text":10327},{"id":10417,"depth":242,"text":10418},{"id":10513,"depth":242,"text":10514},{"id":10593,"depth":208,"text":10594,"children":10843},[10844,10845,10846],{"id":10600,"depth":242,"text":10601},{"id":10669,"depth":242,"text":10670},{"id":10726,"depth":242,"text":10727},{"id":2513,"depth":208,"text":2514,"children":10848},[10849,10850,10851],{"id":10745,"depth":242,"text":10746},{"id":10755,"depth":242,"text":10756},{"id":10790,"depth":242,"text":10791},{"id":1019,"depth":208,"text":1020},"Map each Claude Code \u002Fpowerup lesson to a matching agent skill. Turn tutorials into permanent productivity gains with one install command per lesson.","把 Claude Code \u002Fpowerup 的每一课对应到一个 Agent Skill，一条命令把学到的变成永久生产力。",[10856,10859,10861,10864,10866],{"q":10857,"a":10858},"What is Claude Code \u002Fpowerup?","\u002Fpowerup is Claude Code's built-in interactive tutorial system. Run \u002Fpowerup in any Claude Code session and it walks you through progressively advanced topics from basic file editing to multi-file refactoring, debugging, and project planning. Each lesson teaches a concept through hands-on practice within the terminal.",{"q":10746,"a":10860},"No. Skills work independently of \u002Fpowerup. However, the lessons give you context for why each skill is valuable — understanding the concept (multi-file editing, systematic debugging, planning) makes you a better skill user and helps you pick the right skill for each task.",{"q":10862,"a":10863},"Can I modify a skill after installing it from TokRepo?","Yes. Skills are just Markdown files in .claude\u002Fcommands\u002F — open the file, edit it, save. Claude Code picks up changes immediately without restart. You can customize GSD phases, adjust debugging methodology, or add project-specific steps to any installed skill.",{"q":10791,"a":10865},"Skills take priority over general instructions because they're more specific. If you find a conflict, edit the skill to match your preferred behavior. For deeper comparison of different extension types (skills vs MCP vs rules), see the Skills vs MCP vs Rules guide.",{"q":10867,"a":10868},"Which powerup skills should I install first?","Start with 3 high-impact picks: GSD (for project management — replaces long planning prompts), Systematic Debugging (reduces debug loops from 5-10 turns to 2-3), and Planning with Files (cross-session memory). These three solve Claude Code's biggest pain points and pay for themselves in saved tokens within a week.","\u002Fguide\u002Fimages\u002Fpowerup-skills-guide-hero.svg",{},"\u002Fen\u002Fguide\u002Fpowerup-skills-guide",{"title":9690,"description":10853},"en\u002Fguide\u002Fpowerup-skills-guide",[2769,10875,10876,1106],"powerup","beginner","Claude Code \u002Fpowerup 学完后应该安装哪些 Skill？","After completing Claude Code's \u002Fpowerup tutorial, install a matching agent skill for each lesson to make the concepts permanent: Planning with Files (lesson 1), GSD (2), Systematic Debugging (3), Claude SEO (4), Skill Creator (5), Vercel Skills (6), Web Access (7), Infisical (8), v0 by Vercel (9), and Agent Skills Standard (10). One tokrepo install command per lesson turns tutorial knowledge into automated workflows.","L3H8D2oXNBY2E7ef6-1L5oQjtdZU1XYhBoYOEVqgQjA",{"id":10881,"title":10882,"answer":6,"answerZh":6,"author":7,"body":10883,"category":2744,"description":11708,"descriptionZh":11709,"extension":1109,"faqs":11710,"faqsZh":6,"image":11725,"meta":11726,"navigation":245,"path":11727,"publishedAt":2764,"readTime":1356,"seo":11728,"stem":11729,"tags":11730,"titleZh":11733,"tldr":11734,"tldrZh":6,"updatedAt":2764,"__hash__":11735},"docs_en\u002Fen\u002Fguide\u002Fsave-token-costs.md","How to Cut Claude Code Token Costs by 50% with Agent Skills",{"type":9,"value":10884,"toc":11683},[10885,10888,10892,10895,10920,10934,10937,10957,10960,10964,10967,10971,10974,10980,10987,10991,11001,11013,11016,11022,11029,11033,11095,11100,11104,11107,11138,11146,11150,11153,11156,11159,11185,11195,11198,11204,11209,11223,11228,11292,11300,11304,11310,11350,11354,11364,11367,11370,11376,11379,11382,11385,11395,11409,11416,11448,11455,11463,11475,11481,11486,11490,11493,11497,11502,11581,11588,11590,11594,11597,11601,11610,11614,11624,11626,11629,11681],[12,10886,10887],{},"Learn how to reduce Claude Code token consumption by 50% using three proven strategies — reusable agent skills, context compression, and specialized debugging workflows that eliminate wasteful iteration loops.",[35,10889,10891],{"id":10890},"the-token-cost-problem","The Token Cost Problem",[12,10893,10894],{},"Claude Code is powered by large language models, and every interaction consumes tokens. With Anthropic's current pricing, the numbers add up quickly:",[19,10896,10897,10903,10909,10915],{},[22,10898,10899,10902],{},[45,10900,10901],{},"Claude Opus input:"," $15 per million tokens",[22,10904,10905,10908],{},[45,10906,10907],{},"Claude Opus output:"," $75 per million tokens",[22,10910,10911,10914],{},[45,10912,10913],{},"Claude Sonnet input:"," $3 per million tokens",[22,10916,10917,10902],{},[45,10918,10919],{},"Claude Sonnet output:",[12,10921,10922,10923,10926,10927,10930,10931,667],{},"A typical development session might involve 50,000–150,000 input tokens and 10,000–30,000 output tokens. At Opus pricing, that means a single focused session can cost ",[45,10924,10925],{},"$1.50–$4.50",". Do that 20 times a month and you're looking at ",[45,10928,10929],{},"$30–$90 per month"," in pure token costs — and that's conservative. Complex projects with large codebases easily hit ",[45,10932,10933],{},"$150–$300 per month",[12,10935,10936],{},"The root causes of high token consumption are:",[428,10938,10939,10945,10951],{},[22,10940,10941,10944],{},[45,10942,10943],{},"Repetitive prompts"," — typing the same long instructions every time you want Claude to do a specific task",[22,10946,10947,10950],{},[45,10948,10949],{},"Context bloat"," — conversation history growing until Claude re-reads thousands of lines of irrelevant context",[22,10952,10953,10956],{},[45,10954,10955],{},"Iteration loops"," — Claude guessing at your intent, getting it wrong, then you correcting it across 5–10 back-and-forth messages",[12,10958,10959],{},"Each of these problems has a concrete solution. Let's walk through them.",[35,10961,10963],{"id":10962},"strategy-1-replace-repetitive-prompts-with-skills","Strategy 1: Replace Repetitive Prompts with Skills",[12,10965,10966],{},"Every time you type a multi-paragraph prompt explaining how you want Claude Code to review your code, run your tests, or format your commits, you're spending tokens on instructions that could be stored once and reused forever.",[138,10968,10970],{"id":10969},"the-problem","The Problem",[12,10972,10973],{},"Consider a typical code review prompt that developers type repeatedly:",[143,10975,10978],{"className":10976,"code":10977,"language":1280},[1278],"Review this code for bugs, security issues, and performance problems.\nCheck for SQL injection, XSS vulnerabilities, and auth bypass risks.\nVerify error handling covers all edge cases. Look for N+1 query\npatterns. Check that all database transactions are properly committed\nor rolled back. Format your findings as a markdown table with severity,\nlocation, description, and suggested fix.\n",[150,10979,10977],{"__ignoreMap":148},[12,10981,10982,10983,10986],{},"That's roughly ",[45,10984,10985],{},"80 tokens"," every single time. If you run code reviews 5 times a day, that's 400 tokens per day just on the instruction — not counting the code itself. Over a month, that's 12,000 tokens on the same repeated instruction.",[138,10988,10990],{"id":10989},"the-solution","The Solution",[12,10992,10993,10994,10997,10998,11000],{},"Install an ",[71,10995,10996],{"href":1169},"agent skill"," that encodes the instructions once. The skill sits in ",[150,10999,1296],{}," and activates with a short trigger:",[143,11002,11003],{"className":145,"code":2045,"language":147,"meta":148,"style":148},[150,11004,11005],{"__ignoreMap":148},[153,11006,11007,11009,11011],{"class":155,"line":156},[153,11008,1587],{"class":159},[153,11010,1590],{"class":167},[153,11012,2056],{"class":167},[12,11014,11015],{},"Now instead of typing 80+ tokens of instructions, you type:",[143,11017,11020],{"className":11018,"code":11019,"language":1280},[1278],"\u002Fgsd-code-review\n",[150,11021,11019],{"__ignoreMap":148},[12,11023,11024,11025,11028],{},"That's ",[45,11026,11027],{},"3 tokens",". The skill file is loaded once into context and reused across the entire session. Even better, the skill contains more thorough instructions than you'd bother typing manually — covering edge cases, output formatting, and verification steps.",[138,11030,11032],{"id":11031},"real-savings-calculation","Real Savings Calculation",[809,11034,11035,11051],{},[812,11036,11037],{},[815,11038,11039,11042,11045,11048],{},[818,11040,11041],{},"Scenario",[818,11043,11044],{},"Without Skills",[818,11046,11047],{},"With Skills",[818,11049,11050],{},"Savings",[828,11052,11053,11067,11081],{},[815,11054,11055,11058,11061,11064],{},[833,11056,11057],{},"Code review prompt",[833,11059,11060],{},"80 tokens x 5\u002Fday",[833,11062,11063],{},"3 tokens x 5\u002Fday + 500 token skill load",[833,11065,11066],{},"92% after first use",[815,11068,11069,11072,11075,11078],{},[833,11070,11071],{},"Debug workflow prompt",[833,11073,11074],{},"120 tokens x 3\u002Fday",[833,11076,11077],{},"3 tokens x 3\u002Fday + 800 token skill load",[833,11079,11080],{},"88% after first use",[815,11082,11083,11086,11089,11092],{},[833,11084,11085],{},"Planning prompt",[833,11087,11088],{},"200 tokens x 2\u002Fday",[833,11090,11091],{},"3 tokens x 2\u002Fday + 1,200 token skill load",[833,11093,11094],{},"85% after first use",[116,11096,11097],{"type":118},[12,11098,11099],{},"Skills pay for themselves after 2–3 uses in the same session. The skill file is loaded once into the conversation context, then every subsequent trigger costs only the slash command tokens. Over a month, the savings compound dramatically.",[138,11101,11103],{"id":11102},"recommended-skills-for-cost-savings","Recommended Skills for Cost Savings",[12,11105,11106],{},"Two skills that deliver the biggest return on token investment:",[19,11108,11109,11128],{},[22,11110,11111,11117,11118,528,11121,4381,11124,11127],{},[45,11112,11113],{},[71,11114,11116],{"href":2061,"rel":11115},[113],"GSD (Get Shit Done)"," — replaces long project-planning prompts with structured ",[150,11119,11120],{},"\u002Fgsd-plan-phase",[150,11122,11123],{},"\u002Fgsd-execute-phase",[150,11125,11126],{},"\u002Fgsd-next"," commands. A single planning prompt that would cost 200+ tokens now costs 3 tokens per invocation.",[22,11129,11130,11137],{},[45,11131,11132],{},[71,11133,11136],{"href":11134,"rel":11135},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F034be597-7c73-4f85-adb5-0c8b21f15e0d",[113],"Planning Skill"," — encodes your planning methodology so you don't re-explain it each session. Especially valuable for teams where multiple developers need consistent planning output.",[12,11139,11140,11141,11145],{},"Browse the full ",[71,11142,11144],{"href":11143},"\u002Fcollections\u002Fskills","skills collection"," for more options tailored to your workflow.",[35,11147,11149],{"id":11148},"strategy-2-compress-context-with-summarization","Strategy 2: Compress Context with Summarization",[12,11151,11152],{},"Even with skills installed, your conversation context grows with every message. Claude Code reads the entire conversation history on each turn — meaning a conversation with 50,000 tokens of history costs 50,000 input tokens per message, even if you're asking a simple question.",[138,11154,10970],{"id":11155},"the-problem-1",[12,11157,11158],{},"Here's a real-world scenario:",[428,11160,11161,11167,11173,11179],{},[22,11162,11163,11166],{},[45,11164,11165],{},"Turn 1:"," You ask Claude to read 3 files (8,000 tokens of file content added to context)",[22,11168,11169,11172],{},[45,11170,11171],{},"Turn 5:"," You've exchanged 20,000 tokens of conversation",[22,11174,11175,11178],{},[45,11176,11177],{},"Turn 10:"," Context is at 45,000 tokens",[22,11180,11181,11184],{},[45,11182,11183],{},"Turn 15:"," Context is at 80,000 tokens — every new message now costs 80,000 input tokens just to process the history",[12,11186,11187,11188,11191,11192,667],{},"At Opus pricing ($15\u002Fmillion input tokens), Turn 15 costs ",[45,11189,11190],{},"$1.20 in input tokens alone"," — for a single message. The cumulative cost of a 20-turn conversation can easily exceed ",[45,11193,11194],{},"$10",[138,11196,10990],{"id":11197},"the-solution-1",[12,11199,10673,11200,11203],{},[150,11201,11202],{},"\u002Fcompact"," command strategically. This command tells Claude Code to summarize the conversation history, compressing it into a fraction of the original size while retaining the key decisions and context.",[12,11205,11206],{},[45,11207,11208],{},"When to compact:",[19,11210,11211,11214,11217,11220],{},[22,11212,11213],{},"After completing a major task within a session",[22,11215,11216],{},"When you notice the context growing beyond 40,000 tokens",[22,11218,11219],{},"Before switching to a different topic in the same session",[22,11221,11222],{},"After reading large files that you no longer need in full",[12,11224,11225],{},[45,11226,11227],{},"Token count before and after compaction:",[809,11229,11230,11249],{},[812,11231,11232],{},[815,11233,11234,11236,11241,11246],{},[818,11235,11041],{},[818,11237,11238,11239],{},"Before ",[150,11240,11202],{},[818,11242,11243,11244],{},"After ",[150,11245,11202],{},[818,11247,11248],{},"Reduction",[828,11250,11251,11265,11279],{},[815,11252,11253,11256,11259,11262],{},[833,11254,11255],{},"15-turn code review session",[833,11257,11258],{},"82,000 tokens",[833,11260,11261],{},"12,000 tokens",[833,11263,11264],{},"85%",[815,11266,11267,11270,11273,11276],{},[833,11268,11269],{},"Large file exploration",[833,11271,11272],{},"65,000 tokens",[833,11274,11275],{},"8,000 tokens",[833,11277,11278],{},"88%",[815,11280,11281,11284,11287,11290],{},[833,11282,11283],{},"Multi-phase project planning",[833,11285,11286],{},"120,000 tokens",[833,11288,11289],{},"18,000 tokens",[833,11291,11264],{},[116,11293,11294],{"type":118},[12,11295,11296,11297,11299],{},"A good rule of thumb: run ",[150,11298,11202],{}," every 10–15 turns or whenever you feel the conversation has shifted topics. Each compaction saves you thousands of tokens on every subsequent message in the session.",[138,11301,11303],{"id":11302},"advanced-context-management","Advanced Context Management",[12,11305,11306,11307,11309],{},"Beyond ",[150,11308,11202],{},", these practices reduce context bloat:",[428,11311,11312,11318,11331,11344],{},[22,11313,11314,11317],{},[45,11315,11316],{},"Start new conversations for new tasks"," — don't reuse a bloated session for unrelated work",[22,11319,11320,11323,11324,11327,11328,11330],{},[45,11321,11322],{},"Be specific about which files to read"," — \"read lines 50–120 of ",[150,11325,11326],{},"server.ts","\" instead of \"read ",[150,11329,11326],{},"\" avoids loading thousands of irrelevant lines",[22,11332,11333,11339,11340,11343],{},[45,11334,11335,11336],{},"Use ",[150,11337,11338],{},".claudeignore"," — exclude ",[150,11341,11342],{},"node_modules\u002F",", build artifacts, and large data files from Claude's file search to prevent accidental context inflation",[22,11345,11346,11349],{},[45,11347,11348],{},"Front-load context"," — provide all relevant files and constraints in your first message rather than drip-feeding them across 5 messages, which forces Claude to re-read growing context each time",[35,11351,11353],{"id":11352},"strategy-3-reduce-iterations-with-specialized-skills","Strategy 3: Reduce Iterations with Specialized Skills",[12,11355,11356,11357,11360,11361,667],{},"The most expensive token waste isn't prompt repetition or context bloat — it's ",[45,11358,11359],{},"iteration loops",". When Claude misunderstands your intent, you spend 3–10 correction messages, each one re-processing the entire conversation context. A single misunderstanding in a large context can cost ",[45,11362,11363],{},"$5–$15 in wasted tokens",[138,11365,10970],{"id":11366},"the-problem-2",[12,11368,11369],{},"Debugging without structure is a classic token-burner:",[143,11371,11374],{"className":11372,"code":11373,"language":1280},[1278],"Turn 1: \"Fix this bug\" (Claude tries approach A — fails)\nTurn 2: \"That didn't work, try X instead\" (Claude tries approach X — partially works)\nTurn 3: \"Close, but you broke Y\" (Claude fixes Y but reintroduces the original bug)\nTurn 4: \"No, you need to keep the fix from Turn 2 but also fix Y\"\nTurn 5: \"Let me explain the full context again...\"\n",[150,11375,11373],{"__ignoreMap":148},[12,11377,11378],{},"Each turn costs more than the last because the context keeps growing. By Turn 5, you've spent 5x the tokens that a correct first attempt would have cost.",[138,11380,10990],{"id":11381},"the-solution-2",[12,11383,11384],{},"Specialized skills encode methodology that gets it right the first time — or at least within 1–2 iterations instead of 5–10.",[12,11386,11387,11394],{},[45,11388,11389],{},[71,11390,11393],{"href":11391,"rel":11392},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002F78ed006e-d10d-4efe-804b-2e19a76cf2bb",[113],"Systematic Debugging Skill"," — instead of ad-hoc \"fix this\" prompts, this skill walks Claude through a structured process:",[143,11396,11398],{"className":145,"code":11397,"language":147,"meta":148,"style":148},"tokrepo install 78ed006e-d10d-4efe-804b-2e19a76cf2bb\n",[150,11399,11400],{"__ignoreMap":148},[153,11401,11402,11404,11406],{"class":155,"line":156},[153,11403,1587],{"class":159},[153,11405,1590],{"class":167},[153,11407,11408],{"class":167}," 78ed006e-d10d-4efe-804b-2e19a76cf2bb\n",[12,11410,11411,11412,11415],{},"Then use ",[150,11413,11414],{},"\u002Fgsd-debug"," to trigger a systematic debugging workflow:",[428,11417,11418,11424,11430,11436,11442],{},[22,11419,11420,11423],{},[45,11421,11422],{},"Reproduce"," — verify the bug exists and is consistent",[22,11425,11426,11429],{},[45,11427,11428],{},"Hypothesize"," — generate 3–5 possible root causes ranked by likelihood",[22,11431,11432,11435],{},[45,11433,11434],{},"Test"," — check each hypothesis with minimal code changes",[22,11437,11438,11441],{},[45,11439,11440],{},"Fix"," — apply the fix for the confirmed root cause",[22,11443,11444,11447],{},[45,11445,11446],{},"Verify"," — run tests to confirm the fix doesn't break anything",[12,11449,11450,11451,11454],{},"This structured approach typically resolves bugs in ",[45,11452,11453],{},"2–3 turns"," instead of 5–10 — saving 60–70% of tokens on debugging tasks.",[12,11456,11457,11462],{},[45,11458,11459],{},[71,11460,10677],{"href":2143,"rel":11461},[113]," — when you find yourself writing the same complex prompt more than twice, this meta-skill helps you turn it into a reusable skill in minutes:",[143,11464,11465],{"className":145,"code":2127,"language":147,"meta":148,"style":148},[150,11466,11467],{"__ignoreMap":148},[153,11468,11469,11471,11473],{"class":155,"line":156},[153,11470,1587],{"class":159},[153,11472,1590],{"class":167},[153,11474,2138],{"class":167},[12,11476,11335,11477,11480],{},[150,11478,11479],{},"\u002Fskill-creator"," to generate a new skill from a description. The skill creator encodes best practices for skill writing — frontmatter, trigger conditions, instructions, and examples — so your custom skills work correctly on the first try instead of requiring 3–4 revision cycles.",[116,11482,11483],{"type":452},[12,11484,11485],{},"Iteration loops are multiplicative costs. A 5-turn loop in an 80,000-token context doesn't cost 5x a single turn — it costs roughly 5 + 6 + 7 + 8 + 9 = 35 relative units, because each turn adds to the context the next turn must process. Cutting loops from 5 iterations to 2 can save more than 70% of total tokens.",[35,11487,11489],{"id":11488},"before-vs-after-real-token-usage-comparison","Before vs After: Real Token Usage Comparison",[12,11491,11492],{},"We tracked token usage across five common development tasks, comparing workflows without skills to workflows using the strategies described above.",[3485,11494],{":headers":11495,":rows":11496},"[\"Task\",\"Without Skills (tokens)\",\"With Skills (tokens)\",\"Savings %\"]","[[\"Code review (3 files)\",\"45,000\",\"18,000\",\"60%\"],[\"Debug a backend API bug\",\"92,000\",\"35,000\",\"62%\"],[\"Plan a new feature (5 phases)\",\"68,000\",\"28,000\",\"59%\"],[\"Create a new agent skill\",\"34,000\",\"12,000\",\"65%\"],[\"Full-day development session\",\"320,000\",\"145,000\",\"55%\"]]",[12,11498,11499],{},[45,11500,11501],{},"Dollar impact at Opus pricing ($15\u002F$75 per million tokens):",[809,11503,11504,11514],{},[812,11505,11506],{},[815,11507,11508,11510,11512],{},[818,11509,2441],{},[818,11511,11044],{},[818,11513,11047],{},[828,11515,11516,11527,11538,11549,11566],{},[815,11517,11518,11521,11524],{},[833,11519,11520],{},"Average daily token usage",[833,11522,11523],{},"320,000",[833,11525,11526],{},"145,000",[815,11528,11529,11532,11535],{},[833,11530,11531],{},"Daily cost (input @ $15\u002FM)",[833,11533,11534],{},"$4.80",[833,11536,11537],{},"$2.18",[815,11539,11540,11543,11546],{},[833,11541,11542],{},"Daily cost (output @ $75\u002FM, est. 30K output)",[833,11544,11545],{},"$2.25",[833,11547,11548],{},"$1.13",[815,11550,11551,11556,11561],{},[833,11552,11553],{},[45,11554,11555],{},"Monthly cost (20 work days)",[833,11557,11558],{},[45,11559,11560],{},"$141.00",[833,11562,11563],{},[45,11564,11565],{},"$66.20",[815,11567,11568,11573,11576],{},[833,11569,11570],{},[45,11571,11572],{},"Annual savings",[833,11574,11575],{},"—",[833,11577,11578],{},[45,11579,11580],{},"$897.60",[12,11582,11583,11584,11587],{},"That's nearly ",[45,11585,11586],{},"$900 per year"," in savings for a single developer — and the savings scale linearly with team size.",[35,11589,2514],{"id":2513},[138,11591,11593],{"id":11592},"do-agent-skills-themselves-consume-tokens","Do agent skills themselves consume tokens?",[12,11595,11596],{},"Yes, but only once per session. When a skill is triggered, its Markdown content is loaded into the conversation context. A typical skill is 500–1,500 tokens. After that initial load, subsequent triggers in the same session cost only the 2–3 tokens of the slash command. The net savings far exceed the one-time cost — usually by Turn 2 or Turn 3 of using the skill.",[138,11598,11600],{"id":11599},"whats-the-single-most-impactful-thing-i-can-do-to-reduce-token-costs","What's the single most impactful thing I can do to reduce token costs?",[12,11602,3583,11603,11605,11606,11609],{},[150,11604,11202],{}," regularly. Context compression delivers the largest absolute savings because it reduces the cost of every subsequent message in the session. If your context is at 80,000 tokens and you compact to 12,000, you save 68,000 tokens on every following turn. After just 3 more turns, that's 204,000 tokens saved — worth ",[45,11607,11608],{},"$3.06"," at Opus input pricing.",[138,11611,11613],{"id":11612},"can-i-combine-all-three-strategies","Can I combine all three strategies?",[12,11615,11616,11617,11619,11620,11623],{},"Absolutely — and they're designed to work together. Install skills (Strategy 1) to reduce repetitive prompts, use ",[150,11618,11202],{}," (Strategy 2) to keep context lean, and rely on specialized skills (Strategy 3) to minimize iteration loops. Teams that adopt all three consistently report ",[45,11621,11622],{},"45–55% reduction"," in monthly token costs compared to unoptimized workflows.",[35,11625,1020],{"id":1019},[12,11627,11628],{},"Ready to start saving tokens? Here are your next actions:",[428,11630,11631,11645,11654,11663,11672],{},[22,11632,11633,11636,11637,11640,11641,11644],{},[45,11634,11635],{},"Install your first skill"," — start with ",[71,11638,3507],{"href":2061,"rel":11639},[113]," or the ",[71,11642,11136],{"href":11134,"rel":11643},[113]," for immediate impact",[22,11646,11647,11650,11651,11653],{},[45,11648,11649],{},"Browse the full catalog"," — explore the ",[71,11652,11144],{"href":11143}," to find skills for your specific workflow",[22,11655,11656,11659,11660,11662],{},[45,11657,11658],{},"Learn to build your own"," — read ",[71,11661,1258],{"href":1169}," and turn your most-repeated prompts into reusable skills",[22,11664,11665,11668,11669,11671],{},[45,11666,11667],{},"Compare your options"," — check ",[71,11670,1263],{"href":1262}," to understand when skills are the right choice",[22,11673,11674,11677,11678,11680],{},[45,11675,11676],{},"See what's popular"," — our ",[71,11679,2690],{"href":2689}," ranking highlights the highest-impact skills tested on real projects",[1074,11682,3669],{},{"title":148,"searchDepth":208,"depth":208,"links":11684},[11685,11686,11692,11697,11701,11702,11707],{"id":10890,"depth":208,"text":10891},{"id":10962,"depth":208,"text":10963,"children":11687},[11688,11689,11690,11691],{"id":10969,"depth":242,"text":10970},{"id":10989,"depth":242,"text":10990},{"id":11031,"depth":242,"text":11032},{"id":11102,"depth":242,"text":11103},{"id":11148,"depth":208,"text":11149,"children":11693},[11694,11695,11696],{"id":11155,"depth":242,"text":10970},{"id":11197,"depth":242,"text":10990},{"id":11302,"depth":242,"text":11303},{"id":11352,"depth":208,"text":11353,"children":11698},[11699,11700],{"id":11366,"depth":242,"text":10970},{"id":11381,"depth":242,"text":10990},{"id":11488,"depth":208,"text":11489},{"id":2513,"depth":208,"text":2514,"children":11703},[11704,11705,11706],{"id":11592,"depth":242,"text":11593},{"id":11599,"depth":242,"text":11600},{"id":11612,"depth":242,"text":11613},{"id":1019,"depth":208,"text":1020},"Three proven strategies to reduce Claude Code token consumption by 50% — reusable skills, context compression, and fewer iteration loops.","三个经过验证的策略，帮你把 Claude Code Token 消耗降低 50%——可复用 Skill、上下文压缩、减少迭代循环。",[11711,11714,11716,11719,11722],{"q":11712,"a":11713},"How can I reduce Claude Code token costs?","Combine three strategies: install agent skills to replace 80-200 token repetitive prompts with 3-token slash commands, run \u002Fcompact every 10-15 turns to reduce context from 80K to 12K tokens, and use specialized skills like Systematic Debugging to cut iteration loops. Teams adopting all three report 45-55% monthly token savings.",{"q":11593,"a":11715},"Yes, but only once per session. When a skill is triggered, its Markdown content (typically 500-1,500 tokens) loads into context. After that, subsequent triggers cost only 2-3 tokens for the slash command. Skills pay for themselves by the 2nd or 3rd use in the same session.",{"q":11717,"a":11718},"What's the single most impactful thing to reduce token costs?","Run \u002Fcompact regularly. Context compression delivers the largest absolute savings because it reduces the cost of every subsequent message. Compacting 80K tokens down to 12K saves 68K tokens per following turn — after 3 more turns that's 204K tokens saved, worth about $3.06 at Opus pricing.",{"q":11720,"a":11721},"How much can I save by using agent skills?","Real benchmarks show 55-65% token reduction across common tasks: code review (45K to 18K tokens, 60% savings), backend debugging (92K to 35K, 62%), feature planning (68K to 28K, 59%). For a full-day session, 320K tokens drops to 145K — saving roughly $75\u002Fmonth per developer at Opus pricing, or $900\u002Fyear.",{"q":11723,"a":11724},"When should I run \u002Fcompact in Claude Code?","After completing a major task, when context exceeds 40,000 tokens, before switching topics in the same session, and after reading large files you no longer need in full. A good rule: compact every 10-15 turns. Each compaction saves thousands of tokens on every subsequent message.","\u002Fguide\u002Fimages\u002Fsave-token-costs-hero.svg",{},"\u002Fen\u002Fguide\u002Fsave-token-costs",{"title":10882,"description":11708},"en\u002Fguide\u002Fsave-token-costs",[2769,11731,11732,3726],"token","cost","用 Agent Skills 把 Claude Code Token 消耗降低 50%","Cut Claude Code token costs by 50% using three strategies: replace repetitive prompts with agent skills (load instructions once, invoke with a 3-token slash command), compress context with \u002Fcompact every 10-15 turns to shrink 80K-token histories to 12K, and use specialized skills like Systematic Debugging to reduce iteration loops from 5-10 turns to 2-3. Combined, these typically save $75\u002Fmonth per developer at Opus pricing.","D8H3KDbNmGfmgTh32XRU-DieFgOfpjG6-dpwOlor9W0",{"id":4,"title":5,"answer":6,"answerZh":6,"author":7,"body":11737,"category":1106,"description":1107,"descriptionZh":1108,"extension":1109,"faqs":12471,"faqsZh":6,"image":6,"meta":12477,"navigation":245,"path":1127,"publishedAt":1128,"readTime":1129,"seo":12478,"stem":1131,"tags":12479,"titleZh":1137,"tldr":1138,"tldrZh":6,"updatedAt":1128,"__hash__":1139},{"type":9,"value":11738,"toc":12442},[11739,11741,11743,11753,11755,11757,11761,11765,11769,11773,11777,11779,11781,11802,11808,11810,11815,11817,11833,11835,11840,11842,11856,11858,11860,11914,11916,11942,11944,11946,11951,11953,12005,12007,12012,12022,12026,12032,12034,12038,12040,12042,12054,12056,12058,12060,12082,12084,12088,12090,12098,12102,12104,12109,12111,12165,12174,12176,12180,12184,12186,12188,12206,12210,12226,12230,12232,12236,12254,12258,12260,12262,12332,12334,12336,12338,12342,12350,12354,12362,12366,12376,12378,12388,12394,12398,12406,12408,12410,12434,12436,12440],[12,11740,14],{},[12,11742,17],{},[19,11744,11745,11747,11749,11751],{},[22,11746,24],{},[22,11748,27],{},[22,11750,30],{},[22,11752,33],{},[35,11754,38],{"id":37},[12,11756,41],{},[12,11758,11759,48],{},[45,11760,47],{},[12,11762,11763,54],{},[45,11764,53],{},[12,11766,11767,60],{},[45,11768,59],{},[12,11770,11771,66],{},[45,11772,65],{},[12,11774,69,11775,75],{},[71,11776,74],{"href":73},[35,11778,79],{"id":78},[12,11780,82],{},[19,11782,11783,11787,11791,11795],{},[22,11784,11785,90],{},[45,11786,89],{},[22,11788,11789,96],{},[45,11790,95],{},[22,11792,11793,102],{},[45,11794,101],{},[22,11796,11797,108,11799],{},[45,11798,107],{},[71,11800,114],{"href":111,"rel":11801},[113],[116,11803,11804],{"type":118},[12,11805,11806,124],{},[45,11807,123],{},[35,11809,128],{"id":127},[12,11811,11812,136],{},[71,11813,135],{"href":133,"rel":11814},[113],[138,11816,141],{"id":140},[143,11818,11819],{"className":145,"code":146,"language":147,"meta":148,"style":148},[150,11820,11821],{"__ignoreMap":148},[153,11822,11823,11825,11827,11829,11831],{"class":155,"line":156},[153,11824,160],{"class":159},[153,11826,164],{"class":163},[153,11828,168],{"class":167},[153,11830,172],{"class":171},[153,11832,175],{"class":159},[138,11834,179],{"id":178},[12,11836,182,11837,188],{},[71,11838,187],{"href":185,"rel":11839},[113],[138,11841,192],{"id":191},[143,11843,11844],{"className":145,"code":195,"language":147,"meta":148,"style":148},[150,11845,11846,11852],{"__ignoreMap":148},[153,11847,11848,11850],{"class":155,"line":156},[153,11849,202],{"class":159},[153,11851,205],{"class":163},[153,11853,11854],{"class":155,"line":208},[153,11855,212],{"class":211},[35,11857,216],{"id":215},[12,11859,219],{},[143,11861,11862],{"className":145,"code":222,"language":147,"meta":148,"style":148},[150,11863,11864,11868,11876,11880,11884,11894,11904],{"__ignoreMap":148},[153,11865,11866],{"class":155,"line":156},[153,11867,229],{"class":211},[153,11869,11870,11872,11874],{"class":155,"line":208},[153,11871,202],{"class":159},[153,11873,236],{"class":167},[153,11875,239],{"class":167},[153,11877,11878],{"class":155,"line":242},[153,11879,246],{"emptyLinePlaceholder":245},[153,11881,11882],{"class":155,"line":249},[153,11883,252],{"class":211},[153,11885,11886,11888,11890,11892],{"class":155,"line":255},[153,11887,202],{"class":159},[153,11889,236],{"class":167},[153,11891,262],{"class":167},[153,11893,265],{"class":211},[153,11895,11896,11898,11900,11902],{"class":155,"line":268},[153,11897,202],{"class":159},[153,11899,236],{"class":167},[153,11901,275],{"class":167},[153,11903,278],{"class":211},[153,11905,11906,11908,11910,11912],{"class":155,"line":281},[153,11907,202],{"class":159},[153,11909,236],{"class":167},[153,11911,288],{"class":167},[153,11913,291],{"class":211},[12,11915,294],{},[143,11917,11918],{"className":145,"code":297,"language":147,"meta":148,"style":148},[150,11919,11920,11928],{"__ignoreMap":148},[153,11921,11922,11924,11926],{"class":155,"line":156},[153,11923,202],{"class":159},[153,11925,306],{"class":167},[153,11927,239],{"class":167},[153,11929,11930,11932,11934,11936,11938,11940],{"class":155,"line":208},[153,11931,314],{"class":313},[153,11933,317],{"class":159},[153,11935,320],{"class":167},[153,11937,323],{"class":167},[153,11939,326],{"class":167},[153,11941,329],{"class":167},[12,11943,332],{},[35,11945,336],{"id":335},[12,11947,11948,344],{},[71,11949,343],{"href":341,"rel":11950},[113],[138,11952,348],{"id":347},[143,11954,11955],{"className":145,"code":351,"language":147,"meta":148,"style":148},[150,11956,11957,11971,11977,11985,11993,12001],{"__ignoreMap":148},[153,11958,11959,11961,11963,11965,11967,11969],{"class":155,"line":156},[153,11960,358],{"class":159},[153,11962,306],{"class":167},[153,11964,363],{"class":163},[153,11966,366],{"class":163},[153,11968,369],{"class":167},[153,11970,372],{"class":163},[153,11972,11973,11975],{"class":155,"line":208},[153,11974,377],{"class":163},[153,11976,372],{"class":163},[153,11978,11979,11981,11983],{"class":155,"line":242},[153,11980,384],{"class":163},[153,11982,387],{"class":167},[153,11984,372],{"class":163},[153,11986,11987,11989,11991],{"class":155,"line":249},[153,11988,394],{"class":163},[153,11990,397],{"class":167},[153,11992,372],{"class":163},[153,11994,11995,11997,11999],{"class":155,"line":255},[153,11996,404],{"class":163},[153,11998,407],{"class":167},[153,12000,372],{"class":163},[153,12002,12003],{"class":155,"line":268},[153,12004,414],{"class":167},[138,12006,418],{"id":417},[12,12008,421,12009,426],{},[71,12010,424],{"href":424,"rel":12011},[113],[428,12013,12014,12016,12020],{},[22,12015,432],{},[22,12017,435,12018,439],{},[150,12019,438],{},[22,12021,442],{},[12,12023,445,12024,449],{},[150,12025,448],{},[116,12027,12028],{"type":452},[12,12029,12030,458],{},[45,12031,457],{},[35,12033,462],{"id":461},[12,12035,465,12036,470],{},[71,12037,469],{"href":468},[12,12039,473],{},[138,12041,477],{"id":476},[143,12043,12044],{"className":145,"code":480,"language":147,"meta":148,"style":148},[150,12045,12046],{"__ignoreMap":148},[153,12047,12048,12050,12052],{"class":155,"line":156},[153,12049,202],{"class":159},[153,12051,236],{"class":167},[153,12053,491],{"class":167},[12,12055,494],{},[138,12057,498],{"id":497},[12,12059,501],{},[428,12061,12062,12066,12072],{},[22,12063,506,12064],{},[45,12065,509],{},[22,12067,512,12068,516,12070],{},[45,12069,515],{},[150,12071,519],{},[22,12073,512,12074,516,12076,528,12078,516,12080],{},[45,12075,524],{},[150,12077,527],{},[45,12079,531],{},[150,12081,534],{},[138,12083,538],{"id":537},[12,12085,541,12086,545],{},[45,12087,544],{},[12,12089,548],{},[19,12091,12092,12094,12096],{},[22,12093,553],{},[22,12095,556],{},[22,12097,559],{},[12,12099,562,12100,566],{},[71,12101,565],{"href":468},[35,12103,570],{"id":569},[12,12105,573,12106,579],{},[71,12107,578],{"href":576,"rel":12108},[113],[138,12110,583],{"id":582},[143,12112,12113],{"className":145,"code":586,"language":147,"meta":148,"style":148},[150,12114,12115,12125,12137,12147,12153],{"__ignoreMap":148},[153,12116,12117,12119,12121,12123],{"class":155,"line":156},[153,12118,358],{"class":159},[153,12120,306],{"class":167},[153,12122,597],{"class":163},[153,12124,372],{"class":163},[153,12126,12127,12129,12131,12133,12135],{"class":155,"line":208},[153,12128,604],{"class":163},[153,12130,607],{"class":167},[153,12132,366],{"class":163},[153,12134,612],{"class":167},[153,12136,372],{"class":163},[153,12138,12139,12141,12143,12145],{"class":155,"line":242},[153,12140,384],{"class":163},[153,12142,621],{"class":313},[153,12144,624],{"class":167},[153,12146,372],{"class":163},[153,12148,12149,12151],{"class":155,"line":249},[153,12150,631],{"class":167},[153,12152,372],{"class":163},[153,12154,12155,12157,12159,12161,12163],{"class":155,"line":255},[153,12156,638],{"class":167},[153,12158,641],{"class":163},[153,12160,644],{"class":167},[153,12162,647],{"class":163},[153,12164,650],{"class":167},[12,12166,653,12167,657,12169,661,12171,667],{},[150,12168,656],{},[150,12170,660],{},[71,12172,666],{"href":664,"rel":12173},[113],[138,12175,671],{"id":670},[12,12177,674,12178,678],{},[150,12179,677],{},[12,12181,681,12182,686],{},[71,12183,685],{"href":684},[35,12185,690],{"id":689},[12,12187,693],{},[19,12189,12190,12194,12198,12202],{},[22,12191,12192,701],{},[45,12193,700],{},[22,12195,12196,707],{},[45,12197,706],{},[22,12199,12200,713],{},[45,12201,712],{},[22,12203,12204,718],{},[45,12205,89],{},[12,12207,721,12208,726],{},[71,12209,725],{"href":724},[19,12211,12212,12218,12222],{},[22,12213,12214,734,12216,738],{},[45,12215,733],{},[45,12217,737],{},[22,12219,12220,744],{},[45,12221,743],{},[22,12223,12224,750],{},[45,12225,749],{},[116,12227,12228],{"type":118},[12,12229,755],{},[35,12231,759],{"id":758},[12,12233,762,12234,767],{},[71,12235,766],{"href":765},[428,12237,12238,12242,12246,12250],{},[22,12239,12240,775],{},[45,12241,774],{},[22,12243,12244,781],{},[45,12245,780],{},[22,12247,12248,787],{},[45,12249,786],{},[22,12251,12252,793],{},[45,12253,792],{},[12,12255,796,12256,800],{},[71,12257,799],{"href":765},[35,12259,804],{"id":803},[12,12261,807],{},[809,12263,12264,12274],{},[812,12265,12266],{},[815,12267,12268,12270,12272],{},[818,12269,820],{},[818,12271,823],{},[818,12273,826],{},[828,12275,12276,12284,12292,12300,12308,12316,12324],{},[815,12277,12278,12280,12282],{},[833,12279,835],{},[833,12281,135],{},[833,12283,840],{},[815,12285,12286,12288,12290],{},[833,12287,845],{},[833,12289,343],{},[833,12291,850],{},[815,12293,12294,12296,12298],{},[833,12295,855],{},[833,12297,519],{},[833,12299,860],{},[815,12301,12302,12304,12306],{},[833,12303,865],{},[833,12305,868],{},[833,12307,871],{},[815,12309,12310,12312,12314],{},[833,12311,876],{},[833,12313,578],{},[833,12315,881],{},[815,12317,12318,12320,12322],{},[833,12319,886],{},[833,12321,889],{},[833,12323,892],{},[815,12325,12326,12328,12330],{},[833,12327,897],{},[833,12329,900],{},[833,12331,903],{},[12,12333,906],{},[35,12335,910],{"id":909},[12,12337,913],{},[12,12339,12340],{},[45,12341,918],{},[19,12343,12344,12346,12348],{},[22,12345,923],{},[22,12347,926],{},[22,12349,929],{},[12,12351,12352],{},[45,12353,934],{},[19,12355,12356,12358,12360],{},[22,12357,939],{},[22,12359,942],{},[22,12361,945],{},[12,12363,12364],{},[45,12365,950],{},[19,12367,12368,12370,12372],{},[22,12369,955],{},[22,12371,958],{},[22,12373,961,12374,966],{},[71,12375,965],{"href":964},[35,12377,970],{"id":969},[12,12379,12380,976,12382,979,12384,983,12386,987],{},[45,12381,975],{},[150,12383,438],{},[150,12385,982],{},[150,12387,986],{},[12,12389,12390,993,12392,997],{},[45,12391,992],{},[150,12393,996],{},[12,12395,12396,1003],{},[45,12397,1002],{},[12,12399,12400,1009,12402,1013,12404,667],{},[45,12401,1008],{},[150,12403,1012],{},[150,12405,1016],{},[35,12407,1020],{"id":1019},[12,12409,1023],{},[428,12411,12412,12418,12424,12430],{},[22,12413,12414,1031,12416],{},[45,12415,1030],{},[71,12417,1035],{"href":1034},[22,12419,12420,1041,12422],{},[45,12421,1040],{},[71,12423,1045],{"href":1044},[22,12425,12426,1051,12428,1056],{},[45,12427,1050],{},[71,12429,1055],{"href":1054},[22,12431,12432,1062],{},[45,12433,1061],{},[12,12435,1065],{},[12,12437,1068,12438,1072],{},[71,12439,1071],{"href":73},[1074,12441,1076],{},{"title":148,"searchDepth":208,"depth":208,"links":12443},[12444,12445,12446,12451,12452,12456,12461,12465,12466,12467,12468,12469,12470],{"id":37,"depth":208,"text":38},{"id":78,"depth":208,"text":79},{"id":127,"depth":208,"text":128,"children":12447},[12448,12449,12450],{"id":140,"depth":242,"text":141},{"id":178,"depth":242,"text":179},{"id":191,"depth":242,"text":192},{"id":215,"depth":208,"text":216},{"id":335,"depth":208,"text":336,"children":12453},[12454,12455],{"id":347,"depth":242,"text":348},{"id":417,"depth":242,"text":418},{"id":461,"depth":208,"text":462,"children":12457},[12458,12459,12460],{"id":476,"depth":242,"text":477},{"id":497,"depth":242,"text":498},{"id":537,"depth":242,"text":538},{"id":569,"depth":208,"text":570,"children":12462},[12463,12464],{"id":582,"depth":242,"text":583},{"id":670,"depth":242,"text":671},{"id":689,"depth":208,"text":690},{"id":758,"depth":208,"text":759},{"id":803,"depth":208,"text":804},{"id":909,"depth":208,"text":910},{"id":969,"depth":208,"text":970},{"id":1019,"depth":208,"text":1020},[12472,12473,12474,12475,12476],{"q":1112,"a":1113},{"q":1115,"a":1116},{"q":1118,"a":1119},{"q":1121,"a":1122},{"q":1124,"a":1125},{},{"title":5,"description":1107},[1133,202,1134,1135,1136],{"id":12481,"title":12482,"answer":6,"answerZh":6,"author":7,"body":12483,"category":1106,"description":13253,"descriptionZh":13254,"extension":1109,"faqs":13255,"faqsZh":6,"image":13270,"meta":13271,"navigation":245,"path":13272,"publishedAt":13273,"readTime":1356,"seo":13274,"stem":13275,"tags":13276,"titleZh":13277,"tldr":13278,"tldrZh":6,"updatedAt":13273,"__hash__":13279},"docs_en\u002Fen\u002Fguide\u002Fcreate-skill.md","How to Create Your First Agent Skill for Claude Code",{"type":9,"value":12484,"toc":13232},[12485,12489,12503,12509,12514,12518,12549,12552,12554,12557,12584,12588,12597,12639,12642,12664,12668,12671,12714,12717,12773,12781,12785,12788,12910,12914,12940,12944,12947,12952,12986,12991,13003,13006,13017,13021,13024,13081,13084,13113,13131,13133,13137,13140,13144,13147,13151,13158,13162,13170,13174,13222,13226,13229],[35,12486,12488],{"id":12487},"what-is-an-agent-skill","What Is an Agent Skill?",[12,12490,12491,12492,12495,12496,4151,12499,12502],{},"An ",[45,12493,12494],{},"Agent Skill"," is a Markdown file (typically ",[150,12497,12498],{},"SKILL.md",[150,12500,12501],{},"*.skill.md",") that teaches an AI coding agent how to perform a specific task. Think of it as a reusable prompt with structure — it tells the agent what to do, when to activate, and how to execute.",[12,12504,12505,12506,667],{},"Unlike MCP servers (which require code and a running process) or custom rules (which are simple text constraints), agent skills sit in a sweet spot: ",[45,12507,12508],{},"powerful enough to encode complex workflows, simple enough that anyone can create one",[116,12510,12511],{"type":118},[12,12512,12513],{},"Agent Skills are Markdown files — you don't need any programming knowledge to create one. If you can write a clear prompt, you can build a skill.",[138,12515,12517],{"id":12516},"who-uses-agent-skills","Who Uses Agent Skills?",[19,12519,12520,12530,12537,12543],{},[22,12521,12522,12524,12525,1293,12527,12529],{},[45,12523,1159],{}," — looks for ",[150,12526,12498],{},[150,12528,1296],{}," or project root",[22,12531,12532,5597,12534,12536],{},[45,12533,8662],{},[150,12535,5558],{}," files",[22,12538,12539,5597,12541,12536],{},[45,12540,5610],{},[150,12542,8669],{},[22,12544,12545,5597,12547,12536],{},[45,12546,6675],{},[150,12548,6663],{},[12,12550,12551],{},"The SKILL.md format works across all of these with minor adaptations.",[35,12553,79],{"id":78},[12,12555,12556],{},"Before you start, make sure you have:",[428,12558,12559,12572,12578],{},[22,12560,12561,12564,12565,528,12568,12571],{},[45,12562,12563],{},"An AI coding agent"," installed — ",[71,12566,1159],{"href":1157,"rel":12567},[113],[71,12569,5424],{"href":5422,"rel":12570},[113],", or similar",[22,12573,12574,12577],{},[45,12575,12576],{},"A text editor"," — VS Code, Cursor, or any editor you prefer",[22,12579,12580,12583],{},[45,12581,12582],{},"A project directory"," — any folder where you want the skill available",[35,12585,12587],{"id":12586},"step-1-create-the-skillmd-file","Step 1: Create the SKILL.md File",[12,12589,12590,12591,12593,12594,12596],{},"Create a new file called ",[150,12592,12498],{}," in your project root (or in ",[150,12595,1296],{}," for Claude Code).",[143,12598,12600],{"className":145,"code":12599,"language":147,"meta":148,"style":148},"# Option A: Project root (works everywhere)\ntouch SKILL.md\n\n# Option B: Claude Code commands directory\nmkdir -p .claude\u002Fcommands\ntouch .claude\u002Fcommands\u002Fmy-skill.md\n",[150,12601,12602,12607,12615,12619,12624,12632],{"__ignoreMap":148},[153,12603,12604],{"class":155,"line":156},[153,12605,12606],{"class":211},"# Option A: Project root (works everywhere)\n",[153,12608,12609,12612],{"class":155,"line":208},[153,12610,12611],{"class":159},"touch",[153,12613,12614],{"class":167}," SKILL.md\n",[153,12616,12617],{"class":155,"line":242},[153,12618,246],{"emptyLinePlaceholder":245},[153,12620,12621],{"class":155,"line":249},[153,12622,12623],{"class":211},"# Option B: Claude Code commands directory\n",[153,12625,12626,12628,12630],{"class":155,"line":255},[153,12627,1312],{"class":159},[153,12629,366],{"class":163},[153,12631,1317],{"class":167},[153,12633,12634,12636],{"class":155,"line":268},[153,12635,12611],{"class":159},[153,12637,12638],{"class":167}," .claude\u002Fcommands\u002Fmy-skill.md\n",[12,12640,12641],{},"The file name matters:",[19,12643,12644,12649,12659],{},[22,12645,12646,12648],{},[150,12647,12498],{}," — auto-discovered by agents scanning the project",[22,12650,12651,12654,12655,12658],{},[150,12652,12653],{},".claude\u002Fcommands\u002Fcode-review.md"," — becomes the ",[150,12656,12657],{},"\u002Fcode-review"," slash command in Claude Code",[22,12660,12661,12663],{},[150,12662,12501],{}," — recognized by TokRepo for publishing",[35,12665,12667],{"id":12666},"step-2-define-the-metadata","Step 2: Define the Metadata",[12,12669,12670],{},"Every good skill starts with clear metadata in a YAML frontmatter block:",[143,12672,12674],{"className":5813,"code":12673,"language":5815,"meta":148,"style":148},"---\nname: Code Review Skill\ndescription: Performs adversarial code review on changed files\ntriggers:\n  - \u002Fcode-review\n  - \"review my code\"\n  - \"check for bugs\"\n---\n",[150,12675,12676,12680,12685,12690,12695,12700,12705,12710],{"__ignoreMap":148},[153,12677,12678],{"class":155,"line":156},[153,12679,1348],{},[153,12681,12682],{"class":155,"line":208},[153,12683,12684],{},"name: Code Review Skill\n",[153,12686,12687],{"class":155,"line":242},[153,12688,12689],{},"description: Performs adversarial code review on changed files\n",[153,12691,12692],{"class":155,"line":249},[153,12693,12694],{},"triggers:\n",[153,12696,12697],{"class":155,"line":255},[153,12698,12699],{},"  - \u002Fcode-review\n",[153,12701,12702],{"class":155,"line":268},[153,12703,12704],{},"  - \"review my code\"\n",[153,12706,12707],{"class":155,"line":281},[153,12708,12709],{},"  - \"check for bugs\"\n",[153,12711,12712],{"class":155,"line":1356},[153,12713,1348],{},[12,12715,12716],{},"The key fields:",[809,12718,12719,12731],{},[812,12720,12721],{},[815,12722,12723,12726,12728],{},[818,12724,12725],{},"Field",[818,12727,826],{},[818,12729,12730],{},"Example",[828,12732,12733,12746,12759],{},[815,12734,12735,12740,12743],{},[833,12736,12737],{},[150,12738,12739],{},"name",[833,12741,12742],{},"Human-readable skill name",[833,12744,12745],{},"\"Code Review Skill\"",[815,12747,12748,12753,12756],{},[833,12749,12750],{},[150,12751,12752],{},"description",[833,12754,12755],{},"What the skill does (shown in listings)",[833,12757,12758],{},"\"Performs adversarial code review\"",[815,12760,12761,12765,12768],{},[833,12762,12763],{},[150,12764,6518],{},[833,12766,12767],{},"When to activate (slash commands or natural language)",[833,12769,12770,12772],{},[150,12771,12657],{},", \"review my code\"",[116,12774,12775],{"type":452},[12,12776,12777,12778,12780],{},"Keep your ",[150,12779,12752],{}," under 120 characters — it's used as the summary in search results and skill listings.",[35,12782,12784],{"id":12783},"step-3-write-the-instructions","Step 3: Write the Instructions",[12,12786,12787],{},"The body of your SKILL.md is the actual prompt. Write it as clear instructions for the AI agent:",[143,12789,12791],{"className":5813,"code":12790,"language":5815,"meta":148,"style":148},"## Goal\n\nReview all changed files in the current branch for bugs, security issues,\nand code quality problems.\n\n## Steps\n\n1. Run `git diff --name-only HEAD~1` to find changed files\n2. Read each changed file completely\n3. For each file, check for:\n   - Logic errors and edge cases\n   - Security vulnerabilities (injection, auth bypass, etc.)\n   - Performance issues (N+1 queries, unnecessary loops)\n   - Code style violations\n4. Output a structured report with severity levels\n\n## Output Format\n\nFor each issue found:\n- **File**: path\u002Fto\u002Ffile.ts\n- **Line**: 42\n- **Severity**: 🔴 High | 🟡 Medium | 🟢 Low\n- **Issue**: Description of the problem\n- **Fix**: Suggested fix\n",[150,12792,12793,12798,12802,12807,12812,12816,12821,12825,12830,12835,12840,12845,12850,12855,12860,12865,12869,12874,12878,12883,12888,12893,12898,12904],{"__ignoreMap":148},[153,12794,12795],{"class":155,"line":156},[153,12796,12797],{},"## Goal\n",[153,12799,12800],{"class":155,"line":208},[153,12801,246],{"emptyLinePlaceholder":245},[153,12803,12804],{"class":155,"line":242},[153,12805,12806],{},"Review all changed files in the current branch for bugs, security issues,\n",[153,12808,12809],{"class":155,"line":249},[153,12810,12811],{},"and code quality problems.\n",[153,12813,12814],{"class":155,"line":255},[153,12815,246],{"emptyLinePlaceholder":245},[153,12817,12818],{"class":155,"line":268},[153,12819,12820],{},"## Steps\n",[153,12822,12823],{"class":155,"line":281},[153,12824,246],{"emptyLinePlaceholder":245},[153,12826,12827],{"class":155,"line":1356},[153,12828,12829],{},"1. Run `git diff --name-only HEAD~1` to find changed files\n",[153,12831,12832],{"class":155,"line":1362},[153,12833,12834],{},"2. Read each changed file completely\n",[153,12836,12837],{"class":155,"line":1367},[153,12838,12839],{},"3. For each file, check for:\n",[153,12841,12842],{"class":155,"line":1372},[153,12843,12844],{},"   - Logic errors and edge cases\n",[153,12846,12847],{"class":155,"line":1378},[153,12848,12849],{},"   - Security vulnerabilities (injection, auth bypass, etc.)\n",[153,12851,12852],{"class":155,"line":1383},[153,12853,12854],{},"   - Performance issues (N+1 queries, unnecessary loops)\n",[153,12856,12857],{"class":155,"line":1389},[153,12858,12859],{},"   - Code style violations\n",[153,12861,12862],{"class":155,"line":1395},[153,12863,12864],{},"4. Output a structured report with severity levels\n",[153,12866,12867],{"class":155,"line":1401},[153,12868,246],{"emptyLinePlaceholder":245},[153,12870,12871],{"class":155,"line":1407},[153,12872,12873],{},"## Output Format\n",[153,12875,12876],{"class":155,"line":1129},[153,12877,246],{"emptyLinePlaceholder":245},[153,12879,12880],{"class":155,"line":1417},[153,12881,12882],{},"For each issue found:\n",[153,12884,12885],{"class":155,"line":1423},[153,12886,12887],{},"- **File**: path\u002Fto\u002Ffile.ts\n",[153,12889,12890],{"class":155,"line":1683},[153,12891,12892],{},"- **Line**: 42\n",[153,12894,12895],{"class":155,"line":1688},[153,12896,12897],{},"- **Severity**: 🔴 High | 🟡 Medium | 🟢 Low\n",[153,12899,12901],{"class":155,"line":12900},23,[153,12902,12903],{},"- **Issue**: Description of the problem\n",[153,12905,12907],{"class":155,"line":12906},24,[153,12908,12909],{},"- **Fix**: Suggested fix\n",[138,12911,12913],{"id":12912},"tips-for-great-instructions","Tips for Great Instructions",[428,12915,12916,12922,12928,12934],{},[22,12917,12918,12921],{},[45,12919,12920],{},"Be specific"," — \"Check for SQL injection in all database queries\" beats \"look for security issues\"",[22,12923,12924,12927],{},[45,12925,12926],{},"Use numbered steps"," — agents follow ordered lists more reliably than paragraphs",[22,12929,12930,12933],{},[45,12931,12932],{},"Include examples"," — show the expected output format",[22,12935,12936,12939],{},[45,12937,12938],{},"Set boundaries"," — tell the agent what NOT to do (e.g., \"Do not modify any files, only report\")",[35,12941,12943],{"id":12942},"step-4-test-locally","Step 4: Test Locally",[12,12945,12946],{},"Test your skill by invoking it in your AI agent:",[12,12948,12949],{},[45,12950,12951],{},"In Claude Code:",[143,12953,12955],{"className":145,"code":12954,"language":147,"meta":148,"style":148},"# If placed in .claude\u002Fcommands\u002Fcode-review.md\nclaude \u002Fcode-review\n\n# If placed as SKILL.md in project root\nclaude \"use the code review skill\"\n",[150,12956,12957,12962,12970,12974,12979],{"__ignoreMap":148},[153,12958,12959],{"class":155,"line":156},[153,12960,12961],{"class":211},"# If placed in .claude\u002Fcommands\u002Fcode-review.md\n",[153,12963,12964,12967],{"class":155,"line":208},[153,12965,12966],{"class":159},"claude",[153,12968,12969],{"class":167}," \u002Fcode-review\n",[153,12971,12972],{"class":155,"line":242},[153,12973,246],{"emptyLinePlaceholder":245},[153,12975,12976],{"class":155,"line":249},[153,12977,12978],{"class":211},"# If placed as SKILL.md in project root\n",[153,12980,12981,12983],{"class":155,"line":255},[153,12982,12966],{"class":159},[153,12984,12985],{"class":167}," \"use the code review skill\"\n",[12,12987,12988],{},[45,12989,12990],{},"In Codex CLI:",[143,12992,12994],{"className":145,"code":12993,"language":147,"meta":148,"style":148},"codex \"review my code using the skill in SKILL.md\"\n",[150,12995,12996],{"__ignoreMap":148},[153,12997,12998,13000],{"class":155,"line":156},[153,12999,5718],{"class":159},[153,13001,13002],{"class":167}," \"review my code using the skill in SKILL.md\"\n",[12,13004,13005],{},"Iterate on the instructions based on the results. Common adjustments:",[19,13007,13008,13011,13014],{},[22,13009,13010],{},"Add more specific examples if the output format is wrong",[22,13012,13013],{},"Add constraints if the agent is doing too much or too little",[22,13015,13016],{},"Add error handling instructions for edge cases",[35,13018,13020],{"id":13019},"step-5-publish-to-tokrepo","Step 5: Publish to TokRepo",[12,13022,13023],{},"Once your skill works well locally, share it with the community:",[143,13025,13027],{"className":145,"code":13026,"language":147,"meta":148,"style":148},"# Install TokRepo CLI\nnpm install -g tokrepo\n\n# Login with your API token\ntokrepo login\n\n# Push your skill\ntokrepo push my-skill.skill.md --public\n",[150,13028,13029,13034,13044,13048,13053,13059,13063,13068],{"__ignoreMap":148},[153,13030,13031],{"class":155,"line":156},[153,13032,13033],{"class":211},"# Install TokRepo CLI\n",[153,13035,13036,13038,13040,13042],{"class":155,"line":208},[153,13037,5639],{"class":159},[153,13039,1590],{"class":167},[153,13041,5644],{"class":163},[153,13043,9065],{"class":167},[153,13045,13046],{"class":155,"line":242},[153,13047,246],{"emptyLinePlaceholder":245},[153,13049,13050],{"class":155,"line":249},[153,13051,13052],{"class":211},"# Login with your API token\n",[153,13054,13055,13057],{"class":155,"line":255},[153,13056,1587],{"class":159},[153,13058,8774],{"class":167},[153,13060,13061],{"class":155,"line":268},[153,13062,246],{"emptyLinePlaceholder":245},[153,13064,13065],{"class":155,"line":281},[153,13066,13067],{"class":211},"# Push your skill\n",[153,13069,13070,13072,13075,13078],{"class":155,"line":1356},[153,13071,1587],{"class":159},[153,13073,13074],{"class":167}," push",[153,13076,13077],{"class":167}," my-skill.skill.md",[153,13079,13080],{"class":163}," --public\n",[12,13082,13083],{},"Your skill is now searchable and installable by anyone:",[143,13085,13087],{"className":145,"code":13086,"language":147,"meta":148,"style":148},"# Others can find and install it\ntokrepo search \"code review\"\ntokrepo install your-skill-name\n",[150,13088,13089,13094,13104],{"__ignoreMap":148},[153,13090,13091],{"class":155,"line":156},[153,13092,13093],{"class":211},"# Others can find and install it\n",[153,13095,13096,13098,13101],{"class":155,"line":208},[153,13097,1587],{"class":159},[153,13099,13100],{"class":167}," search",[153,13102,13103],{"class":167}," \"code review\"\n",[153,13105,13106,13108,13110],{"class":155,"line":242},[153,13107,1587],{"class":159},[153,13109,1590],{"class":167},[153,13111,13112],{"class":167}," your-skill-name\n",[116,13114,13115],{"type":118},[12,13116,13117,13118,528,13120,528,13122,528,13125,528,13128,667],{},"Add descriptive tags when publishing — they help others discover your skill. Popular tags: ",[150,13119,2769],{},[150,13121,3726],{},[150,13123,13124],{},"code-review",[150,13126,13127],{},"testing",[150,13129,13130],{},"documentation",[35,13132,2514],{"id":2513},[138,13134,13136],{"id":13135},"can-i-use-images-or-diagrams-in-my-skill","Can I use images or diagrams in my skill?",[12,13138,13139],{},"Yes, but most AI agents process skills as text only. Images are useful for documentation on TokRepo but won't be \"seen\" by the agent during execution.",[138,13141,13143],{"id":13142},"how-long-should-a-skill-be","How long should a skill be?",[12,13145,13146],{},"Most effective skills are 200-500 lines. Too short and the agent lacks context; too long and it may lose focus. If your skill exceeds 1000 lines, consider splitting it into multiple skills.",[138,13148,13150],{"id":13149},"can-skills-call-other-skills","Can skills call other skills?",[12,13152,13153,13154,13157],{},"Not directly, but you can reference other skills in your instructions: \"If you need to run tests, follow the testing skill at ",[150,13155,13156],{},".claude\u002Fcommands\u002Ftest.md","\". The agent will read and follow those instructions.",[138,13159,13161],{"id":13160},"whats-the-difference-between-skillmd-and-agentsmd","What's the difference between SKILL.md and AGENTS.md?",[12,13163,13164,13166,13167,13169],{},[150,13165,12498],{}," is a single-purpose skill file. ",[150,13168,5558],{}," is a project-level file that describes the overall project context and available capabilities. You can reference skills from within AGENTS.md.",[138,13171,13173],{"id":13172},"how-do-i-update-a-published-skill","How do I update a published skill?",[143,13175,13177],{"className":145,"code":13176,"language":147,"meta":148,"style":148},"# Update by UUID\ntokrepo update \u003Cuuid> my-skill.skill.md\n\n# Or use sync to auto-detect changes\ntokrepo sync .\n",[150,13178,13179,13184,13203,13207,13212],{"__ignoreMap":148},[153,13180,13181],{"class":155,"line":156},[153,13182,13183],{"class":211},"# Update by UUID\n",[153,13185,13186,13188,13191,13193,13196,13198,13200],{"class":155,"line":208},[153,13187,1587],{"class":159},[153,13189,13190],{"class":167}," update",[153,13192,6036],{"class":171},[153,13194,13195],{"class":167},"uui",[153,13197,6042],{"class":313},[153,13199,9081],{"class":171},[153,13201,13202],{"class":167}," my-skill.skill.md\n",[153,13204,13205],{"class":155,"line":242},[153,13206,246],{"emptyLinePlaceholder":245},[153,13208,13209],{"class":155,"line":249},[153,13210,13211],{"class":211},"# Or use sync to auto-detect changes\n",[153,13213,13214,13216,13219],{"class":155,"line":255},[153,13215,1587],{"class":159},[153,13217,13218],{"class":167}," sync",[153,13220,13221],{"class":167}," .\n",[35,13223,13225],{"id":13224},"related-skills-on-tokrepo","Related Skills on TokRepo",[12,13227,13228],{},"Explore these popular skills for inspiration:",[1074,13230,13231],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":148,"searchDepth":208,"depth":208,"links":13233},[13234,13237,13238,13239,13240,13243,13244,13245,13252],{"id":12487,"depth":208,"text":12488,"children":13235},[13236],{"id":12516,"depth":242,"text":12517},{"id":78,"depth":208,"text":79},{"id":12586,"depth":208,"text":12587},{"id":12666,"depth":208,"text":12667},{"id":12783,"depth":208,"text":12784,"children":13241},[13242],{"id":12912,"depth":242,"text":12913},{"id":12942,"depth":208,"text":12943},{"id":13019,"depth":208,"text":13020},{"id":2513,"depth":208,"text":2514,"children":13246},[13247,13248,13249,13250,13251],{"id":13135,"depth":242,"text":13136},{"id":13142,"depth":242,"text":13143},{"id":13149,"depth":242,"text":13150},{"id":13160,"depth":242,"text":13161},{"id":13172,"depth":242,"text":13173},{"id":13224,"depth":208,"text":13225},"Step-by-step guide to creating, testing, and publishing SKILL.md files for Claude Code, Codex CLI, and Gemini CLI.","一步步教你创建、测试、发布 SKILL.md 文件，适用于 Claude Code、Codex CLI 和 Gemini CLI。",[13256,13259,13262,13265,13268],{"q":13257,"a":13258},"What is an agent skill and how is it different from an MCP server?","An agent skill is a Markdown file that teaches an AI coding agent how to perform a specific task. Unlike MCP servers (which require running code) or custom rules (simple text constraints), skills encode complex workflows as plain Markdown — anyone can create one without programming knowledge, just by writing clear instructions.",{"q":13260,"a":13261},"Where should I place a SKILL.md file?","For Claude Code, place it in .claude\u002Fcommands\u002Fmy-skill.md (becomes the \u002Fmy-skill slash command) or as SKILL.md in the project root (auto-discovered). For Codex CLI, merge content into AGENTS.md. For Gemini CLI use GEMINI.md. TokRepo recognizes *.skill.md for publishing.",{"q":13263,"a":13264},"How long should an agent skill be?","Most effective skills are 200-500 lines. Too short and the agent lacks context; too long and it may lose focus. If your skill exceeds 1,000 lines, split it into multiple focused skills. Keep descriptions under 120 characters since they're used as summaries in search listings.",{"q":13266,"a":13267},"How do I publish a skill to TokRepo?","Install the CLI with npm install -g tokrepo, run tokrepo login with your API token, then tokrepo push my-skill.skill.md --public. Your skill becomes searchable and others can install it with tokrepo install your-skill-name. Update later with tokrepo update \u003Cuuid> or tokrepo sync .",{"q":13150,"a":13269},"Not directly, but you can reference other skills in your instructions — for example, \"If you need to run tests, follow the testing skill at .claude\u002Fcommands\u002Ftest.md\". The agent will read and follow those referenced instructions, effectively chaining skills together within a single session.","\u002Fguide\u002Fimages\u002Fcreate-skill-hero.svg",{},"\u002Fen\u002Fguide\u002Fcreate-skill","2026-04-10",{"title":12482,"description":13253},"en\u002Fguide\u002Fcreate-skill",[2770,2769,10876],"如何创建你的第一个 Agent Skill","To create your first agent skill, make a SKILL.md file in your project root or .claude\u002Fcommands\u002F, add YAML frontmatter with name, description, and triggers, then write numbered step-by-step instructions in the body. Test by invoking the slash command in Claude Code (e.g., claude \u002Fcode-review) or natural language in Codex CLI, then publish to TokRepo with tokrepo push my-skill.skill.md --public.","pS8Hyh0M74tM4Pd0V99Wmfy5DpMVHF7nHgZ2eAgm2WE",{"id":13281,"title":13282,"answer":6,"answerZh":6,"author":7,"body":13283,"category":14138,"description":14139,"descriptionZh":14140,"extension":1109,"faqs":14141,"faqsZh":6,"image":14156,"meta":14157,"navigation":245,"path":14158,"publishedAt":13273,"readTime":1367,"seo":14159,"stem":14160,"tags":14161,"titleZh":14162,"tldr":14163,"tldrZh":6,"updatedAt":13273,"__hash__":14164},"docs_en\u002Fen\u002Fguide\u002Fskills-vs-mcp.md","Agent Skills vs MCP Servers vs Rules: What's the Difference?",{"type":9,"value":13284,"toc":14103},[13285,13289,13296,13299,13319,13322,13324,13329,13333,13336,13392,13396,13422,13426,13446,13448,13454,13457,13460,13535,13538,13564,13567,13593,13597,13602,13605,13608,13631,13668,13671,13697,13700,13726,13730,13734,13738,13741,13745,13771,13775,13801,13805,13830,13834,13837,13841,13940,13943,13947,13981,13985,13988,14036,14038,14042,14045,14049,14052,14056,14059,14074,14078,14084,14100],[35,13286,13288],{"id":13287},"introduction","Introduction",[12,13290,13291,13292,13295],{},"Modern AI coding agents like Claude Code, Codex CLI, and Gemini CLI are powerful out of the box. But their real power comes from ",[45,13293,13294],{},"customization"," — teaching them your team's conventions, connecting them to your tools, and automating your workflows.",[12,13297,13298],{},"There are three primary ways to extend an AI coding agent:",[428,13300,13301,13307,13313],{},[22,13302,13303,13306],{},[45,13304,13305],{},"Agent Skills"," — Markdown instruction files",[22,13308,13309,13312],{},[45,13310,13311],{},"MCP Servers"," — API endpoints the agent can call",[22,13314,13315,13318],{},[45,13316,13317],{},"Custom Rules"," — Simple text constraints",[12,13320,13321],{},"Each serves a different purpose. Choosing the right one (or combining them) can dramatically improve your productivity. This guide breaks down exactly when to use each.",[35,13323,2801],{"id":2800},[12,13325,13326,13328],{},[45,13327,13305],{}," are Markdown files that encode reusable workflows for AI agents. They follow a structured format with metadata (name, description, triggers) and instructions (goals, steps, output format).",[138,13330,13332],{"id":13331},"how-they-work","How They Work",[12,13334,13335],{},"When you invoke a skill (via slash command or natural language), the AI agent reads the Markdown file and follows its instructions. The skill becomes part of the agent's context for that task.",[143,13337,13339],{"className":5813,"code":13338,"language":5815,"meta":148,"style":148},"---\nname: Deploy Checker\ndescription: Validates deployment readiness\ntriggers: [\u002Fdeploy-check]\n---\n\n## Steps\n1. Run the test suite\n2. Check for uncommitted changes\n3. Verify environment variables\n4. Output a go\u002Fno-go report\n",[150,13340,13341,13345,13350,13355,13360,13364,13368,13372,13377,13382,13387],{"__ignoreMap":148},[153,13342,13343],{"class":155,"line":156},[153,13344,1348],{},[153,13346,13347],{"class":155,"line":208},[153,13348,13349],{},"name: Deploy Checker\n",[153,13351,13352],{"class":155,"line":242},[153,13353,13354],{},"description: Validates deployment readiness\n",[153,13356,13357],{"class":155,"line":249},[153,13358,13359],{},"triggers: [\u002Fdeploy-check]\n",[153,13361,13362],{"class":155,"line":255},[153,13363,1348],{},[153,13365,13366],{"class":155,"line":268},[153,13367,246],{"emptyLinePlaceholder":245},[153,13369,13370],{"class":155,"line":281},[153,13371,12820],{},[153,13373,13374],{"class":155,"line":1356},[153,13375,13376],{},"1. Run the test suite\n",[153,13378,13379],{"class":155,"line":1362},[153,13380,13381],{},"2. Check for uncommitted changes\n",[153,13383,13384],{"class":155,"line":1367},[153,13385,13386],{},"3. Verify environment variables\n",[153,13388,13389],{"class":155,"line":1372},[153,13390,13391],{},"4. Output a go\u002Fno-go report\n",[138,13393,13395],{"id":13394},"strengths","Strengths",[19,13397,13398,13404,13410,13416],{},[22,13399,13400,13403],{},[45,13401,13402],{},"Zero code required"," — anyone can write Markdown",[22,13405,13406,13409],{},[45,13407,13408],{},"Version controlled"," — lives in your repo, reviewed in PRs",[22,13411,13412,13415],{},[45,13413,13414],{},"Portable"," — works across different AI agents",[22,13417,13418,13421],{},[45,13419,13420],{},"Composable"," — can reference other skills",[138,13423,13425],{"id":13424},"limitations","Limitations",[19,13427,13428,13434,13440],{},[22,13429,13430,13433],{},[45,13431,13432],{},"No external API access"," — can't call third-party services directly",[22,13435,13436,13439],{},[45,13437,13438],{},"No persistent state"," — each invocation starts fresh",[22,13441,13442,13445],{},[45,13443,13444],{},"Text-only"," — can't process images or binary data during execution",[35,13447,3765],{"id":3764},[12,13449,13450,13453],{},[45,13451,13452],{},"MCP (Model Context Protocol) Servers"," are running processes that expose tools, resources, and prompts to AI agents via a standardized protocol. Think of them as plugins with an API.",[138,13455,13332],{"id":13456},"how-they-work-1",[12,13458,13459],{},"An MCP server runs locally or remotely, exposing endpoints that the AI agent can call. The agent discovers available tools at startup and invokes them as needed.",[143,13461,13463],{"className":3807,"code":13462,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"database\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@your-org\u002Fdb-mcp-server\"],\n      \"env\": { \"DATABASE_URL\": \"postgres:\u002F\u002F...\" }\n    }\n  }\n}\n",[150,13464,13465,13469,13475,13482,13492,13507,13523,13527,13531],{"__ignoreMap":148},[153,13466,13467],{"class":155,"line":156},[153,13468,3816],{"class":313},[153,13470,13471,13473],{"class":155,"line":208},[153,13472,3821],{"class":163},[153,13474,3824],{"class":313},[153,13476,13477,13480],{"class":155,"line":242},[153,13478,13479],{"class":163},"    \"database\"",[153,13481,3824],{"class":313},[153,13483,13484,13486,13488,13490],{"class":155,"line":249},[153,13485,3836],{"class":163},[153,13487,3839],{"class":313},[153,13489,3842],{"class":167},[153,13491,3845],{"class":313},[153,13493,13494,13496,13498,13500,13502,13505],{"class":155,"line":255},[153,13495,3850],{"class":163},[153,13497,3853],{"class":313},[153,13499,3856],{"class":167},[153,13501,528],{"class":313},[153,13503,13504],{"class":167},"\"@your-org\u002Fdb-mcp-server\"",[153,13506,3864],{"class":313},[153,13508,13509,13511,13513,13516,13518,13521],{"class":155,"line":268},[153,13510,3869],{"class":163},[153,13512,5284],{"class":313},[153,13514,13515],{"class":163},"\"DATABASE_URL\"",[153,13517,3839],{"class":313},[153,13519,13520],{"class":167},"\"postgres:\u002F\u002F...\"",[153,13522,5295],{"class":313},[153,13524,13525],{"class":155,"line":281},[153,13526,3891],{"class":313},[153,13528,13529],{"class":155,"line":1356},[153,13530,3896],{"class":313},[153,13532,13533],{"class":155,"line":1362},[153,13534,3901],{"class":313},[138,13536,13395],{"id":13537},"strengths-1",[19,13539,13540,13546,13552,13558],{},[22,13541,13542,13545],{},[45,13543,13544],{},"Full API access"," — connect to databases, APIs, cloud services",[22,13547,13548,13551],{},[45,13549,13550],{},"Persistent state"," — maintain connections and caches",[22,13553,13554,13557],{},[45,13555,13556],{},"Rich data types"," — handle binary data, images, structured responses",[22,13559,13560,13563],{},[45,13561,13562],{},"Real-time"," — stream data and react to events",[138,13565,13425],{"id":13566},"limitations-1",[19,13568,13569,13575,13581,13587],{},[22,13570,13571,13574],{},[45,13572,13573],{},"Requires code"," — need to implement in TypeScript\u002FPython\u002Fetc.",[22,13576,13577,13580],{},[45,13578,13579],{},"Runtime dependency"," — must be running for agent to use",[22,13582,13583,13586],{},[45,13584,13585],{},"Configuration overhead"," — environment variables, auth tokens, setup",[22,13588,13589,13592],{},[45,13590,13591],{},"Harder to share"," — dependency management, security considerations",[35,13594,13596],{"id":13595},"what-are-custom-rules","What Are Custom Rules?",[12,13598,13599,13601],{},[45,13600,13317],{}," are plain text files that set constraints and conventions for the AI agent. They don't encode workflows — they shape behavior.",[138,13603,13332],{"id":13604},"how-they-work-2",[12,13606,13607],{},"The AI agent reads rule files at startup and applies them to all interactions. They're always-on context, not on-demand tools.",[19,13609,13610,13618,13624],{},[22,13611,13612,3839,13614,13617],{},[45,13613,1159],{},[150,13615,13616],{},"CLAUDE.md"," in project root",[22,13619,13620,3839,13622,13617],{},[45,13621,6675],{},[150,13623,6663],{},[22,13625,13626,3839,13628,13630],{},[45,13627,5424],{},[150,13629,5558],{}," (project-level rules section)",[143,13632,13634],{"className":5813,"code":13633,"language":5815,"meta":148,"style":148},"## Rules\n\n- Always use TypeScript strict mode\n- Prefer functional components over class components\n- Use Tailwind CSS, never inline styles\n- Run `npm test` before committing\n- Never modify files in the `vendor\u002F` directory\n",[150,13635,13636,13640,13644,13649,13654,13659,13663],{"__ignoreMap":148},[153,13637,13638],{"class":155,"line":156},[153,13639,6810],{},[153,13641,13642],{"class":155,"line":208},[153,13643,246],{"emptyLinePlaceholder":245},[153,13645,13646],{"class":155,"line":242},[153,13647,13648],{},"- Always use TypeScript strict mode\n",[153,13650,13651],{"class":155,"line":249},[153,13652,13653],{},"- Prefer functional components over class components\n",[153,13655,13656],{"class":155,"line":255},[153,13657,13658],{},"- Use Tailwind CSS, never inline styles\n",[153,13660,13661],{"class":155,"line":268},[153,13662,5879],{},[153,13664,13665],{"class":155,"line":281},[153,13666,13667],{},"- Never modify files in the `vendor\u002F` directory\n",[138,13669,13395],{"id":13670},"strengths-2",[19,13672,13673,13679,13685,13691],{},[22,13674,13675,13678],{},[45,13676,13677],{},"Always active"," — shapes every interaction automatically",[22,13680,13681,13684],{},[45,13682,13683],{},"Simple"," — just text, no structure required",[22,13686,13687,13690],{},[45,13688,13689],{},"Team alignment"," — enforces conventions across all team members",[22,13692,13693,13696],{},[45,13694,13695],{},"Low overhead"," — no installation, no configuration",[138,13698,13425],{"id":13699},"limitations-2",[19,13701,13702,13708,13714,13720],{},[22,13703,13704,13707],{},[45,13705,13706],{},"No logic"," — can't encode conditional workflows",[22,13709,13710,13713],{},[45,13711,13712],{},"No triggers"," — always on, can't be invoked selectively",[22,13715,13716,13719],{},[45,13717,13718],{},"No tools"," — can't call APIs or run commands on their own",[22,13721,13722,13725],{},[45,13723,13724],{},"Easy to conflict"," — rules can contradict each other",[35,13727,13729],{"id":13728},"feature-comparison","Feature Comparison",[3485,13731],{":headers":13732,":rows":13733},"[\"Feature\",\"Agent Skills\",\"MCP Servers\",\"Custom Rules\"]","[[\"What it is\",\"Markdown instructions\",\"Running API process\",\"Text constraints\"],[\"Complexity\",\"Low\",\"High\",\"Very Low\"],[\"Code required?\",\"No\",\"Yes\",\"No\"],[\"External API access\",\"No (agent can use tools)\",\"Yes (native)\",\"No\"],[\"Activation\",\"On-demand (slash cmd \u002F NL)\",\"Always available\",\"Always active\"],[\"Portability\",\"High (cross-agent)\",\"Medium (MCP standard)\",\"Low (agent-specific)\"],[\"Shareable\",\"Easy (file copy \u002F TokRepo)\",\"Medium (npm\u002Fpip)\",\"Easy (file copy)\"],[\"State\",\"Stateless\",\"Stateful\",\"Stateless\"],[\"Best for\",\"Workflows & tasks\",\"Integrations & data\",\"Conventions & guardrails\"]]",[35,13735,13737],{"id":13736},"when-to-use-which","When to Use Which?",[12,13739,13740],{},"Use this decision framework:",[138,13742,13744],{"id":13743},"use-agent-skills-when-you-want-to","Use Agent Skills when you want to...",[19,13746,13747,13753,13759,13765],{},[22,13748,13749,13752],{},[45,13750,13751],{},"Automate a repeatable workflow"," — code review, deployment checks, test generation",[22,13754,13755,13758],{},[45,13756,13757],{},"Share best practices"," — \"here's how our team does X\"",[22,13760,13761,13764],{},[45,13762,13763],{},"Teach complex multi-step procedures"," — that would be hard to explain each time",[22,13766,13767,13770],{},[45,13768,13769],{},"Enable non-technical users"," — product managers, designers, writers",[138,13772,13774],{"id":13773},"use-mcp-servers-when-you-need-to","Use MCP Servers when you need to...",[19,13776,13777,13783,13789,13795],{},[22,13778,13779,13782],{},[45,13780,13781],{},"Connect to external services"," — databases, APIs, cloud platforms",[22,13784,13785,13788],{},[45,13786,13787],{},"Process non-text data"," — images, binary files, structured data",[22,13790,13791,13794],{},[45,13792,13793],{},"Maintain persistent connections"," — database pools, WebSocket streams",[22,13796,13797,13800],{},[45,13798,13799],{},"React in real-time"," — monitoring, notifications, live data",[138,13802,13804],{"id":13803},"use-custom-rules-when-you-want-to","Use Custom Rules when you want to...",[19,13806,13807,13813,13818,13824],{},[22,13808,13809,13812],{},[45,13810,13811],{},"Enforce coding standards"," — style guides, naming conventions",[22,13814,13815,13817],{},[45,13816,12938],{}," — \"never modify production configs\"",[22,13819,13820,13823],{},[45,13821,13822],{},"Provide project context"," — architecture decisions, tech stack info",[22,13825,13826,13829],{},[45,13827,13828],{},"Align team behavior"," — ensure consistency across developers",[35,13831,13833],{"id":13832},"can-they-work-together","Can They Work Together?",[12,13835,13836],{},"Absolutely — and this is where the real power lies.",[138,13838,13840],{"id":13839},"example-full-stack-deploy-workflow","Example: Full-Stack Deploy Workflow",[428,13842,13843,13857,13901],{},[22,13844,13845,13847,13848,13850,13851],{},[45,13846,13317],{}," (",[150,13849,13616],{},"):",[143,13852,13855],{"className":13853,"code":13854,"language":1280},[1278],"- Our staging server is at staging.example.com\n- Always run lint before deploying\n- Use semantic versioning\n",[150,13856,13854],{"__ignoreMap":148},[22,13858,13859,13862,13863,13888,13891,13892,528,13895,528,13898],{},[45,13860,13861],{},"MCP Server"," (deployment tools):",[143,13864,13866],{"className":3807,"code":13865,"language":3809,"meta":148,"style":148},"{ \"deploy\": { \"command\": \"npx deploy-mcp-server\" } }\n",[150,13867,13868],{"__ignoreMap":148},[153,13869,13870,13873,13875,13877,13880,13882,13885],{"class":155,"line":156},[153,13871,13872],{"class":313},"{ ",[153,13874,10711],{"class":163},[153,13876,5284],{"class":313},[153,13878,13879],{"class":163},"\"command\"",[153,13881,3839],{"class":313},[153,13883,13884],{"class":167},"\"npx deploy-mcp-server\"",[153,13886,13887],{"class":313}," } }\n",[13889,13890],"br",{},"Exposes: ",[150,13893,13894],{},"deploy_to_staging()",[150,13896,13897],{},"check_deployment_status()",[150,13899,13900],{},"rollback()",[22,13902,13903,13905,13906],{},[45,13904,12494],{}," (deploy workflow):",[143,13907,13909],{"className":5813,"code":13908,"language":5815,"meta":148,"style":148},"## Steps\n1. Run lint and tests (respect project rules)\n2. Bump version (semantic, per rules)\n3. Call deploy_to_staging() (MCP tool)\n4. Wait and check_deployment_status()\n5. If failed, call rollback()\n",[150,13910,13911,13915,13920,13925,13930,13935],{"__ignoreMap":148},[153,13912,13913],{"class":155,"line":156},[153,13914,12820],{},[153,13916,13917],{"class":155,"line":208},[153,13918,13919],{},"1. Run lint and tests (respect project rules)\n",[153,13921,13922],{"class":155,"line":242},[153,13923,13924],{},"2. Bump version (semantic, per rules)\n",[153,13926,13927],{"class":155,"line":249},[153,13928,13929],{},"3. Call deploy_to_staging() (MCP tool)\n",[153,13931,13932],{"class":155,"line":255},[153,13933,13934],{},"4. Wait and check_deployment_status()\n",[153,13936,13937],{"class":155,"line":268},[153,13938,13939],{},"5. If failed, call rollback()\n",[12,13941,13942],{},"The skill orchestrates the workflow, calling MCP tools for actions and respecting rules for conventions. Each layer does what it's best at.",[138,13944,13946],{"id":13945},"the-right-combination","The \"Right\" Combination",[809,13948,13949,13958],{},[812,13950,13951],{},[815,13952,13953,13956],{},[818,13954,13955],{},"Concern",[818,13957,820],{},[828,13959,13960,13967,13974],{},[815,13961,13962,13965],{},[833,13963,13964],{},"\"How to do it\"",[833,13966,12494],{},[815,13968,13969,13972],{},[833,13970,13971],{},"\"What tools to use\"",[833,13973,13861],{},[815,13975,13976,13979],{},[833,13977,13978],{},"\"What constraints to follow\"",[833,13980,13317],{},[35,13982,13984],{"id":13983},"getting-started","Getting Started",[12,13986,13987],{},"Ready to try each approach? Here's where to start:",[428,13989,13990,14016,14026],{},[22,13991,13992,13994,13995,13999,14000],{},[45,13993,13305],{},": Browse the ",[71,13996,13998],{"href":13997},"\u002Fen\u002Fcollections\u002Fskills","Skills collection"," on TokRepo — install one in 10 seconds:",[143,14001,14003],{"className":145,"code":14002,"language":147,"meta":148,"style":148},"npx tokrepo install code-review-skill\n",[150,14004,14005],{"__ignoreMap":148},[153,14006,14007,14009,14011,14013],{"class":155,"line":156},[153,14008,5190],{"class":159},[153,14010,6031],{"class":167},[153,14012,1590],{"class":167},[153,14014,14015],{"class":167}," code-review-skill\n",[22,14017,14018,14020,14021,14025],{},[45,14019,13311],{},": Check the ",[71,14022,14024],{"href":14023},"\u002Fen\u002Fcollections\u002Fmcp-servers","MCP Servers collection"," — configure pre-built servers for your stack",[22,14027,14028,14030,14031,4151,14033,14035],{},[45,14029,13317],{},": Start with a simple ",[150,14032,13616],{},[150,14034,6663],{}," file in your project root",[35,14037,2514],{"id":2513},[138,14039,14041],{"id":14040},"can-i-convert-a-skill-into-an-mcp-server","Can I convert a skill into an MCP server?",[12,14043,14044],{},"You generally don't need to. Skills and MCP servers serve different purposes. If your skill needs external API access, pair it with an MCP server rather than rewriting it.",[138,14046,14048],{"id":14047},"are-skills-slower-than-mcp-servers","Are skills slower than MCP servers?",[12,14050,14051],{},"Skills add context to the agent's prompt, which may slightly increase processing time. MCP server calls are direct function invocations. In practice, the difference is negligible — the AI's thinking time dominates.",[138,14053,14055],{"id":14054},"can-i-use-all-three-in-the-same-project","Can I use all three in the same project?",[12,14057,14058],{},"Yes, and it's recommended. Most mature projects have:",[19,14060,14061,14066,14071],{},[22,14062,14063,14064],{},"5-10 custom rules in ",[150,14065,13616],{},[22,14067,14068,14069],{},"2-5 agent skills in ",[150,14070,1296],{},[22,14072,14073],{},"1-3 MCP servers for external integrations",[138,14075,14077],{"id":14076},"where-can-i-find-pre-built-skills-and-mcp-servers","Where can I find pre-built skills and MCP servers?",[12,14079,14080,14083],{},[71,14081,1519],{"href":1517,"rel":14082},[113]," has 500+ open-source agent skills, MCP servers, prompts, and workflows. Search, install, and contribute from the command line:",[143,14085,14087],{"className":145,"code":14086,"language":147,"meta":148,"style":148},"npx tokrepo search \"your use case\"\n",[150,14088,14089],{"__ignoreMap":148},[153,14090,14091,14093,14095,14097],{"class":155,"line":156},[153,14092,5190],{"class":159},[153,14094,6031],{"class":167},[153,14096,13100],{"class":167},[153,14098,14099],{"class":167}," \"your use case\"\n",[1074,14101,14102],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":148,"searchDepth":208,"depth":208,"links":14104},[14105,14106,14111,14116,14121,14122,14127,14131,14132],{"id":13287,"depth":208,"text":13288},{"id":2800,"depth":208,"text":2801,"children":14107},[14108,14109,14110],{"id":13331,"depth":242,"text":13332},{"id":13394,"depth":242,"text":13395},{"id":13424,"depth":242,"text":13425},{"id":3764,"depth":208,"text":3765,"children":14112},[14113,14114,14115],{"id":13456,"depth":242,"text":13332},{"id":13537,"depth":242,"text":13395},{"id":13566,"depth":242,"text":13425},{"id":13595,"depth":208,"text":13596,"children":14117},[14118,14119,14120],{"id":13604,"depth":242,"text":13332},{"id":13670,"depth":242,"text":13395},{"id":13699,"depth":242,"text":13425},{"id":13728,"depth":208,"text":13729},{"id":13736,"depth":208,"text":13737,"children":14123},[14124,14125,14126],{"id":13743,"depth":242,"text":13744},{"id":13773,"depth":242,"text":13774},{"id":13803,"depth":242,"text":13804},{"id":13832,"depth":208,"text":13833,"children":14128},[14129,14130],{"id":13839,"depth":242,"text":13840},{"id":13945,"depth":242,"text":13946},{"id":13983,"depth":208,"text":13984},{"id":2513,"depth":208,"text":2514,"children":14133},[14134,14135,14136,14137],{"id":14040,"depth":242,"text":14041},{"id":14047,"depth":242,"text":14048},{"id":14054,"depth":242,"text":14055},{"id":14076,"depth":242,"text":14077},"guide","Understand the three ways to extend AI coding agents. Compare agent skills, MCP servers, and custom rules — when to use each and how they work together.","理解扩展 AI 编程助手的三种方式。对比 Agent Skill、MCP 服务器和自定义规则——何时使用以及如何配合使用。",[14142,14145,14148,14151,14154],{"q":14143,"a":14144},"What's the difference between agent skills, MCP servers, and custom rules?","Agent skills are Markdown instruction files for reusable workflows (code review, debugging). MCP servers are running processes that expose external tools like databases, APIs, and browsers via a standardized protocol. Custom rules are plain text constraints (CLAUDE.md, .cursorrules) always loaded into context to enforce conventions and guardrails.",{"q":14146,"a":14147},"When should I use an agent skill instead of an MCP server?","Use skills when the task is pure workflow automation — code review checklists, deployment procedures, planning methodologies — and doesn't need external API access. Use MCP servers when you need to query a database, call a REST API, control a browser, or maintain persistent connections. Skills are simpler; MCP servers are more powerful.",{"q":14149,"a":14150},"Can I use skills, MCP servers, and rules together?","Yes, and it's recommended. Most mature projects have 5-10 custom rules in CLAUDE.md, 2-5 agent skills in .claude\u002Fcommands\u002F, and 1-3 MCP servers for external integrations. Rules enforce conventions, skills encode workflows, and MCP servers provide the tools — each layer does what it's best at.",{"q":14152,"a":14153},"Are agent skills slower than MCP servers?","Skills add Markdown content to the agent's prompt context, which may slightly increase processing time per turn. MCP server calls are direct function invocations returning structured data. In practice the difference is negligible — the AI's thinking time dominates both approaches, not the protocol overhead.",{"q":14077,"a":14155},"TokRepo has 500+ open-source agent skills, MCP servers, prompts, and workflows. Search and install from the command line with npx tokrepo search \"your use case\" followed by npx tokrepo install \u003Cname>. Most assets are tagged with the agent (Claude Code, Codex CLI, Gemini CLI) they're compatible with.","\u002Fguide\u002Fimages\u002Fskills-vs-mcp-hero.svg",{},"\u002Fen\u002Fguide\u002Fskills-vs-mcp",{"title":13282,"description":14139},"en\u002Fguide\u002Fskills-vs-mcp",[2770,5531,8633,3701],"Agent Skills、MCP 服务器、规则有什么区别？一文对比","Agent skills are Markdown workflow files (on-demand, stateless, zero-code), MCP servers are running processes exposing APIs (stateful, code required, full external access), and custom rules are always-on text constraints in CLAUDE.md or .cursorrules. Use skills for repeatable workflows, MCP servers for external tool access (databases, APIs, browsers), and rules for project conventions and guardrails. Most mature projects use all three together.","ZTt2fgBN5TKIbrpvqYNTtB_-s2qO5rW6tVlD0rCrchs",{"id":14166,"title":14167,"answer":6,"answerZh":6,"author":7,"body":14168,"category":3701,"description":14924,"descriptionZh":14925,"extension":1109,"faqs":14926,"faqsZh":6,"image":14942,"meta":14943,"navigation":245,"path":14944,"publishedAt":14945,"readTime":1378,"seo":14946,"stem":14947,"tags":14948,"titleZh":14952,"tldr":14953,"tldrZh":6,"updatedAt":14945,"__hash__":14954},"docs_en\u002Fen\u002Fguide\u002Fai-tools-small-business.md","Which AI Tools Work Best for Small Business in 2026?",{"type":9,"value":14169,"toc":14894},[14170,14173,14175,14186,14190,14201,14206,14210,14213,14217,14281,14285,14319,14323,14329,14332,14336,14339,14342,14398,14402,14420,14423,14427,14430,14433,14489,14493,14507,14511,14514,14517,14575,14579,14585,14588,14592,14595,14598,14648,14652,14655,14669,14673,14795,14800,14804,14836,14838,14844,14850,14856,14862,14864],[12,14171,14172],{},"Learn which AI tools actually help small businesses save time and money. This guide is organized by what you need — not by what's trending on tech blogs. Skip the hype, find tools that work for your business today.",[35,14174,79],{"id":78},[19,14176,14177,14180,14183],{},[22,14178,14179],{},"A specific business task you want AI to help with",[22,14181,14182],{},"10 minutes to try your first tool",[22,14184,14185],{},"No technical knowledge required",[35,14187,14189],{"id":14188},"how-this-guide-works","How This Guide Works",[12,14191,14192,14193,14196,14197,14200],{},"Most \"AI tools for small business\" articles list 50 platforms with affiliate links. This guide is different: it's organized by ",[45,14194,14195],{},"your pain point",", and every recommendation links to a ",[45,14198,14199],{},"free, ready-to-use asset"," you can install today.",[116,14202,14203],{"type":118},[12,14204,14205],{},"You don't need to understand \"MCP servers\" or \"agent skills\" to use these tools. Just find your use case below, click the recommendation, and follow the one-step install.",[35,14207,14209],{"id":14208},"i-need-help-writing-content","\"I Need Help Writing Content\"",[12,14211,14212],{},"Whether it's blog posts, emails, social media, or product descriptions — AI handles the first draft so you focus on the final polish.",[138,14214,14216],{"id":14215},"best-free-tools","Best Free Tools",[809,14218,14219,14231],{},[812,14220,14221],{},[815,14222,14223,14225,14228],{},[818,14224,823],{},[818,14226,14227],{},"What It Does",[818,14229,14230],{},"Time Saved",[828,14232,14233,14250,14264],{},[815,14234,14235,14244,14247],{},[833,14236,14237],{},[45,14238,14239],{},[71,14240,14243],{"href":14241,"rel":14242},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Ftools\u002Fprompt-library",[113],"Prompt Templates for Writing",[833,14245,14246],{},"Pre-built prompts for blog posts, emails, ads, proposals",[833,14248,14249],{},"2-4 hrs\u002Fweek",[815,14251,14252,14258,14261],{},[833,14253,14254,14257],{},[45,14255,14256],{},"Claude.ai"," (free tier)",[833,14259,14260],{},"Write anything — paste a prompt, get a draft",[833,14262,14263],{},"3-5 hrs\u002Fweek",[815,14265,14266,14275,14278],{},[833,14267,14268],{},[45,14269,14270],{},[71,14271,14274],{"href":14272,"rel":14273},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002Fab76a229-0dc7-48bc-8b29-95ef9c2c45a9",[113],"n8n Newsletter Workflow",[833,14276,14277],{},"Automated weekly newsletter from RSS feeds",[833,14279,14280],{},"4 hrs\u002Fweek",[138,14282,14284],{"id":14283},"quick-start-write-a-blog-post-in-5-minutes","Quick Start: Write a Blog Post in 5 Minutes",[428,14286,14287,14293,14303,14306,14309,14316],{},[22,14288,506,14289],{},[71,14290,14292],{"href":14241,"rel":14291},[113],"TokRepo Prompt Library",[22,14294,14295,14296,14299,14300],{},"Filter by ",[45,14297,14298],{},"Writer"," → ",[45,14301,14302],{},"Writing",[22,14304,14305],{},"Copy the \"SEO Blog Post\" prompt",[22,14307,14308],{},"Paste into Claude.ai or ChatGPT",[22,14310,14311,14312,14315],{},"Replace ",[150,14313,14314],{},"[your topic]"," with your subject",[22,14317,14318],{},"Edit the draft and publish",[138,14320,14322],{"id":14321},"real-example","Real Example",[143,14324,14327],{"className":14325,"code":14326,"language":1280},[1278],"Write a 1,500-word blog post about [small business tax tips for 2026].\nStructure: Hook → 5 tips with examples → Summary → CTA.\nTone: Friendly expert, not corporate.\nInclude: specific dollar amounts, IRS form numbers, deadlines.\n",[150,14328,14326],{"__ignoreMap":148},[12,14330,14331],{},"This prompt consistently produces 80%+ ready content that needs only light editing.",[35,14333,14335],{"id":14334},"i-need-to-automate-customer-service","\"I Need to Automate Customer Service\"",[12,14337,14338],{},"AI can handle 60-80% of routine customer inquiries, freeing your team for complex issues.",[138,14340,14216],{"id":14341},"best-free-tools-1",[809,14343,14344,14354],{},[812,14345,14346],{},[815,14347,14348,14350,14352],{},[818,14349,823],{},[818,14351,14227],{},[818,14353,14230],{},[828,14355,14356,14369,14385],{},[815,14357,14358,14363,14366],{},[833,14359,14360],{},[45,14361,14362],{},"Custom ChatGPT (GPT)",[833,14364,14365],{},"Train a chatbot on your FAQ\u002Fdocs, embed on website",[833,14367,14368],{},"10+ hrs\u002Fweek",[815,14370,14371,14379,14382],{},[833,14372,14373],{},[45,14374,14375],{},[71,14376,14378],{"href":1530,"rel":14377},[113],"AI Response Drafting Skills",[833,14380,14381],{},"Generate professional responses from bullet points",[833,14383,14384],{},"5 hrs\u002Fweek",[815,14386,14387,14392,14395],{},[833,14388,14389],{},[45,14390,14391],{},"n8n + Email",[833,14393,14394],{},"Auto-categorize support emails, draft responses",[833,14396,14397],{},"8 hrs\u002Fweek",[138,14399,14401],{"id":14400},"quick-start-build-a-faq-chatbot","Quick Start: Build a FAQ Chatbot",[428,14403,14404,14407,14410,14417],{},[22,14405,14406],{},"Go to ChatGPT → Create a GPT",[22,14408,14409],{},"Upload your FAQ document or product manual",[22,14411,14412,14413,14416],{},"Set instructions: \"You are a helpful support agent for ",[153,14414,14415],{},"Company",". Answer questions based only on the uploaded documents. If unsure, say 'Let me connect you with our team.'\"",[22,14418,14419],{},"Share the link with customers or embed on your website",[12,14421,14422],{},"Cost: $0 with free ChatGPT tier. Handles 100+ common questions without human intervention.",[35,14424,14426],{"id":14425},"i-need-to-analyze-data","\"I Need to Analyze Data\"",[12,14428,14429],{},"You have spreadsheets full of data but no time to find insights. AI turns raw data into actionable reports.",[138,14431,14216],{"id":14432},"best-free-tools-2",[809,14434,14435,14445],{},[812,14436,14437],{},[815,14438,14439,14441,14443],{},[818,14440,823],{},[818,14442,14227],{},[818,14444,14230],{},[828,14446,14447,14460,14476],{},[815,14448,14449,14454,14457],{},[833,14450,14451,14453],{},[45,14452,14256],{}," (upload CSV\u002FExcel)",[833,14455,14456],{},"Analyze spreadsheets, create charts, find trends",[833,14458,14459],{},"3-6 hrs\u002Fweek",[815,14461,14462,14471,14474],{},[833,14463,14464],{},[45,14465,14466],{},[71,14467,14470],{"href":14468,"rel":14469},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fcollections\u002Fscripts",[113],"Data Analysis Scripts",[833,14472,14473],{},"Automated reporting and visualization",[833,14475,14280],{},[815,14477,14478,14483,14486],{},[833,14479,14480],{},[45,14481,14482],{},"Google Sheets + Gemini",[833,14484,14485],{},"AI-powered analysis inside your spreadsheet",[833,14487,14488],{},"2 hrs\u002Fweek",[138,14490,14492],{"id":14491},"quick-start-analyze-your-sales-data","Quick Start: Analyze Your Sales Data",[428,14494,14495,14498,14501,14504],{},[22,14496,14497],{},"Export your sales data as CSV",[22,14499,14500],{},"Go to Claude.ai, upload the file",[22,14502,14503],{},"Ask: \"Analyze this sales data. Show me: top 5 products by revenue, month-over-month growth trend, and which day of the week has the most sales. Create a summary I can share with my team.\"",[22,14505,14506],{},"Get a formatted report with insights in 30 seconds",[35,14508,14510],{"id":14509},"i-need-marketing-help","\"I Need Marketing Help\"",[12,14512,14513],{},"AI handles the repetitive parts of marketing — research, drafting, scheduling — so you focus on strategy and customer relationships.",[138,14515,14216],{"id":14516},"best-free-tools-3",[809,14518,14519,14529],{},[812,14520,14521],{},[815,14522,14523,14525,14527],{},[818,14524,823],{},[818,14526,14227],{},[818,14528,14230],{},[828,14530,14531,14546,14562],{},[815,14532,14533,14541,14544],{},[833,14534,14535],{},[45,14536,14537],{},[71,14538,14540],{"href":14241,"rel":14539},[113],"AI Prompt Library — Marketing",[833,14542,14543],{},"Prompts for SEO, ads, email, social media",[833,14545,14384],{},[815,14547,14548,14557,14560],{},[833,14549,14550],{},[45,14551,14552],{},[71,14553,14556],{"href":14554,"rel":14555},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fcollections\u002Fworkflow-automation",[113],"AI Workflow Automation",[833,14558,14559],{},"Automated content pipelines",[833,14561,14397],{},[815,14563,14564,14569,14572],{},[833,14565,14566],{},[45,14567,14568],{},"Canva AI",[833,14570,14571],{},"Design social posts, presentations, logos",[833,14573,14574],{},"3 hrs\u002Fweek",[138,14576,14578],{"id":14577},"quick-start-create-a-week-of-social-media-posts","Quick Start: Create a Week of Social Media Posts",[143,14580,14583],{"className":14581,"code":14582,"language":1280},[1278],"Create 5 social media posts for [industry\u002Fbusiness type].\nPlatform: [Instagram\u002FLinkedIn\u002FTwitter].\nTopics: [list 5 topics relevant to your business].\nEach post: Hook line + 3-4 sentences + CTA + 3 hashtags.\nTone: [professional\u002Fcasual\u002Finspirational].\n",[150,14584,14582],{"__ignoreMap":148},[12,14586,14587],{},"One prompt gives you a week of content in 60 seconds.",[35,14589,14591],{"id":14590},"i-need-to-save-time-on-admin","\"I Need to Save Time on Admin\"",[12,14593,14594],{},"The boring stuff — invoicing, scheduling, data entry, document organization — AI handles it.",[138,14596,14216],{"id":14597},"best-free-tools-4",[809,14599,14600,14610],{},[812,14601,14602],{},[815,14603,14604,14606,14608],{},[818,14605,823],{},[818,14607,14227],{},[818,14609,14230],{},[828,14611,14612,14624,14637],{},[815,14613,14614,14619,14622],{},[833,14615,14616,14257],{},[45,14617,14618],{},"Zapier AI",[833,14620,14621],{},"Connect 6,000+ apps, automate workflows",[833,14623,14384],{},[815,14625,14626,14632,14635],{},[833,14627,14628,14631],{},[45,14629,14630],{},"n8n"," (self-hosted, free)",[833,14633,14634],{},"Advanced automation with AI nodes",[833,14636,14397],{},[815,14638,14639,14643,14646],{},[833,14640,14641],{},[45,14642,14256],{},[833,14644,14645],{},"Draft emails, summarize meetings, create templates",[833,14647,14574],{},[138,14649,14651],{"id":14650},"quick-start-automate-invoice-follow-ups","Quick Start: Automate Invoice Follow-ups",[12,14653,14654],{},"Set up in Zapier (free):",[428,14656,14657,14660,14663,14666],{},[22,14658,14659],{},"Trigger: When invoice is overdue (from QuickBooks\u002FXero)",[22,14661,14662],{},"Action: AI drafts a polite follow-up email",[22,14664,14665],{},"Action: Send email via Gmail",[22,14667,14668],{},"Result: Never manually chase payments again",[35,14670,14672],{"id":14671},"cost-comparison-ai-tools-for-small-business","Cost Comparison: AI Tools for Small Business",[809,14674,14675,14690],{},[812,14676,14677],{},[815,14678,14679,14681,14684,14687],{},[818,14680,823],{},[818,14682,14683],{},"Free Tier",[818,14685,14686],{},"Paid Plan",[818,14688,14689],{},"Best For",[828,14691,14692,14707,14721,14736,14751,14766,14780],{},[815,14693,14694,14698,14701,14704],{},[833,14695,14696],{},[45,14697,14256],{},[833,14699,14700],{},"Yes (limited)",[833,14702,14703],{},"$20\u002Fmo",[833,14705,14706],{},"Writing, analysis, coding",[815,14708,14709,14714,14716,14718],{},[833,14710,14711],{},[45,14712,14713],{},"ChatGPT",[833,14715,14700],{},[833,14717,14703],{},[833,14719,14720],{},"General tasks, chatbots",[815,14722,14723,14728,14731,14733],{},[833,14724,14725],{},[45,14726,14727],{},"Gemini",[833,14729,14730],{},"Yes (generous)",[833,14732,14703],{},[833,14734,14735],{},"Google Workspace integration",[815,14737,14738,14742,14745,14748],{},[833,14739,14740],{},[45,14741,14630],{},[833,14743,14744],{},"Yes (self-hosted)",[833,14746,14747],{},"$20\u002Fmo cloud",[833,14749,14750],{},"Multi-step automation",[815,14752,14753,14758,14761,14763],{},[833,14754,14755],{},[45,14756,14757],{},"Zapier",[833,14759,14760],{},"Yes (100 tasks\u002Fmo)",[833,14762,14703],{},[833,14764,14765],{},"Simple automation",[815,14767,14768,14772,14774,14777],{},[833,14769,14770],{},[45,14771,14568],{},[833,14773,14700],{},[833,14775,14776],{},"$13\u002Fmo",[833,14778,14779],{},"Design and visuals",[815,14781,14782,14786,14789,14792],{},[833,14783,14784],{},[45,14785,1519],{},[833,14787,14788],{},"Yes (all free)",[833,14790,14791],{},"Free",[833,14793,14794],{},"Prompts, skills, templates",[116,14796,14797],{"type":118},[12,14798,14799],{},"Start with free tiers. Most small businesses get 80%+ of the value from free plans. Only upgrade when you hit usage limits.",[35,14801,14803],{"id":14802},"common-mistakes-to-avoid","Common Mistakes to Avoid",[428,14805,14806,14812,14818,14824,14830],{},[22,14807,14808,14811],{},[45,14809,14810],{},"Buying before trying"," — Every tool on this list has a free tier. Try before you pay.",[22,14813,14814,14817],{},[45,14815,14816],{},"Automating everything at once"," — Start with ONE task. Master it. Then expand.",[22,14819,14820,14823],{},[45,14821,14822],{},"Expecting perfection"," — AI produces 80% quality first drafts. Your expertise adds the final 20%.",[22,14825,14826,14829],{},[45,14827,14828],{},"Ignoring free resources"," — TokRepo has 500+ free templates and tools. Check before buying a $99\u002Fmonth SaaS.",[22,14831,14832,14835],{},[45,14833,14834],{},"Not measuring ROI"," — Track hours saved per week. If a tool saves 5 hrs\u002Fweek at $50\u002Fhr, that's $1,000\u002Fmonth value.",[138,14837,2514],{"id":2513},[12,14839,14840,14843],{},[45,14841,14842],{},"Q: What are the best AI tools for small business?","\nA: For writing: Claude.ai or ChatGPT with TokRepo prompt templates. For automation: n8n (free, self-hosted) or Zapier. For data: Claude.ai with CSV upload. For marketing: AI prompt library + Canva. All have free tiers.",[12,14845,14846,14849],{},[45,14847,14848],{},"Q: Are there free AI tools for small business?","\nA: Yes. Claude.ai, ChatGPT, Gemini, n8n, and Canva all have free tiers. TokRepo's 500+ prompt templates and automation tools are completely free. Most small businesses can start without spending anything.",[12,14851,14852,14855],{},[45,14853,14854],{},"Q: What AI tool should I start with?","\nA: Start with Claude.ai (free) for writing and analysis, plus one prompt template from TokRepo for your specific use case. This takes 5 minutes and immediately saves 2-4 hours per week.",[12,14857,14858,14861],{},[45,14859,14860],{},"Q: How much time can AI save my small business?","\nA: Most small business owners save 10-20 hours per week after implementing 2-3 AI tools. Content writing, customer service, and data analysis are the biggest time-savers.",[35,14863,1020],{"id":1019},[19,14865,14866,14873,14881,14888],{},[22,14867,14868,14872],{},[71,14869,14871],{"href":14241,"rel":14870},[113],"Browse the AI Prompt Library"," — find templates for your business",[22,14874,14875,14880],{},[71,14876,14879],{"href":14877,"rel":14878},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Ftools\u002Fautomation-tools",[113],"AI Automation Tools"," — automate repetitive tasks",[22,14882,14883,14887],{},[71,14884,14886],{"href":14885},"\u002Fguide\u002Fai-workflow-automation","AI Workflow Automation Guide"," — learn automation step by step",[22,14889,14890,14893],{},[71,14891,1035],{"href":14892},"\u002Fguide\u002Fhow-to-build-ai-agent"," — create a custom AI assistant",{"title":148,"searchDepth":208,"depth":208,"links":14895},[14896,14897,14898,14903,14907,14911,14915,14919,14920,14923],{"id":78,"depth":208,"text":79},{"id":14188,"depth":208,"text":14189},{"id":14208,"depth":208,"text":14209,"children":14899},[14900,14901,14902],{"id":14215,"depth":242,"text":14216},{"id":14283,"depth":242,"text":14284},{"id":14321,"depth":242,"text":14322},{"id":14334,"depth":208,"text":14335,"children":14904},[14905,14906],{"id":14341,"depth":242,"text":14216},{"id":14400,"depth":242,"text":14401},{"id":14425,"depth":208,"text":14426,"children":14908},[14909,14910],{"id":14432,"depth":242,"text":14216},{"id":14491,"depth":242,"text":14492},{"id":14509,"depth":208,"text":14510,"children":14912},[14913,14914],{"id":14516,"depth":242,"text":14216},{"id":14577,"depth":242,"text":14578},{"id":14590,"depth":208,"text":14591,"children":14916},[14917,14918],{"id":14597,"depth":242,"text":14216},{"id":14650,"depth":242,"text":14651},{"id":14671,"depth":208,"text":14672},{"id":14802,"depth":208,"text":14803,"children":14921},[14922],{"id":2513,"depth":242,"text":2514},{"id":1019,"depth":208,"text":1020},"Find the right AI tools for your small business — organized by what you need: writing, customer service, data analysis, marketing, and automation. Free tools included.","为小企业找到合适的 AI 工具——按需求组织：写作、客服、数据分析、营销和自动化。包含免费工具。",[14927,14930,14933,14936,14939],{"q":14928,"a":14929},"What are the best free AI tools for small business?","Claude.ai, ChatGPT, and Gemini for general writing and analysis; n8n (self-hosted) and Zapier (100 tasks\u002Fmonth free) for automation; Canva AI for design; and TokRepo's 500+ prompt templates and automation assets. Most small businesses get 80%+ of the value from free tiers alone.",{"q":14931,"a":14932},"Which AI tool should a small business start with?","Start with Claude.ai free tier plus one prompt template from TokRepo for your specific use case — writing, customer service, data analysis, or marketing. Setup takes 5 minutes and typically saves 2-4 hours per week immediately without requiring any technical knowledge.",{"q":14934,"a":14935},"How can AI automate small business customer service?","Create a custom GPT in ChatGPT, upload your FAQ or product manual, and instruct it to answer only from those documents. Embed it on your website or share the link — it handles 60-80% of routine inquiries at $0 cost on the free tier.",{"q":14937,"a":14938},"How much time can AI save my small business?","Most small business owners save 10-20 hours per week after implementing 2-3 AI tools. The biggest time-savers are content writing (3-5 hrs\u002Fweek), customer service automation (10+ hrs\u002Fweek), and data analysis (3-6 hrs\u002Fweek) using Claude.ai with CSV uploads.",{"q":14940,"a":14941},"Do I need technical skills to use AI tools for my business?","No. Tools like Claude.ai, ChatGPT, Canva AI, and TokRepo's prompt library require zero technical knowledge — just copy a template, replace placeholders with your details, and get results. Only advanced automation (n8n self-hosted) requires any setup.","\u002Fguide\u002Fimages\u002Fai-tools-small-business-hero.svg",{},"\u002Fen\u002Fguide\u002Fai-tools-small-business","2026-04-09",{"title":14167,"description":14924},"en\u002Fguide\u002Fai-tools-small-business",[14949,14950,10876,14951],"small-business","ai-tools","free","小企业在 2026 年应该用哪些 AI 工具？","The best AI tools for small business in 2026 are Claude.ai or ChatGPT for writing and analysis, n8n (free, self-hosted) or Zapier for automation, Canva AI for design, and TokRepo's free prompt library for ready-made templates. All have free tiers, and most owners save 10-20 hours per week after implementing 2-3 of these tools.","rnYkNEh7jlA5vMDTPjHBzU8SRsL_0pzmO-52bOy1cV8",{"id":14956,"title":14957,"answer":6,"answerZh":6,"author":7,"body":14958,"category":3701,"description":16661,"descriptionZh":16662,"extension":1109,"faqs":16663,"faqsZh":6,"image":16679,"meta":16680,"navigation":245,"path":16681,"publishedAt":14945,"readTime":1389,"seo":16682,"stem":16683,"tags":16684,"titleZh":16688,"tldr":16689,"tldrZh":6,"updatedAt":14945,"__hash__":16690},"docs_en\u002Fen\u002Fguide\u002Fai-workflow-automation.md","AI Workflow Automation: 30+ Ready-to-Use Scripts & Agent Skills (2026)",{"type":9,"value":14959,"toc":16640},[14960,14963,14965,14980,14984,14990,14993,14998,15002,15006,15009,15088,15093,15145,15148,15153,15301,15307,15311,15314,15389,15394,15489,15493,15496,15570,15575,15632,15640,15644,15647,15722,15727,15776,15781,16128,16132,16209,16213,16217,16257,16261,16291,16295,16382,16386,16494,16499,16503,16506,16574,16576,16582,16588,16594,16600,16602,16637],[12,14961,14962],{},"Learn how to automate marketing, sales, content creation, and DevOps workflows using AI-powered scripts, agent skills, and workflow templates. This guide covers 30+ ready-to-install automation tools with real examples.",[35,14964,79],{"id":78},[19,14966,14967,14970,14977],{},[22,14968,14969],{},"A use case you want to automate (marketing, sales, content, or DevOps)",[22,14971,14972,14973,14976],{},"One of: ",[71,14974,1159],{"href":1157,"rel":14975},[113],", n8n, Cursor, or a terminal",[22,14978,14979],{},"5 minutes to install your first automation",[35,14981,14983],{"id":14982},"what-is-ai-workflow-automation","What is AI Workflow Automation?",[12,14985,14986,14989],{},[45,14987,14988],{},"AI workflow automation"," uses artificial intelligence to handle repetitive business processes — lead generation, content drafting, code deployment, data analysis — without manual intervention. The market is growing at +900% year-over-year as teams discover that AI agents can handle end-to-end workflows, not just individual tasks.",[12,14991,14992],{},"The difference between 2024 and 2026 automation: you no longer need to build complex pipelines. You install a pre-built script or agent skill, configure your API keys, and the automation runs.",[116,14994,14995],{"type":118},[12,14996,14997],{},"TokRepo hosts 30+ ready-to-use automation assets. Unlike n8n, Zapier, or Make (which sell the engine), TokRepo provides the actual workflows that run inside those engines — and inside AI coding tools.",[35,14999,15001],{"id":15000},"automation-by-use-case","Automation by Use Case",[138,15003,15005],{"id":15004},"marketing-automation","Marketing Automation",[12,15007,15008],{},"Marketing teams spend 60%+ of their time on repetitive tasks. These automations handle the heavy lifting:",[809,15010,15011,15022],{},[812,15012,15013],{},[815,15014,15015,15018,15020],{},[818,15016,15017],{},"Automation",[818,15019,14227],{},[818,15021,823],{},[828,15023,15024,15037,15050,15063,15075],{},[815,15025,15026,15031,15034],{},[833,15027,15028],{},[45,15029,15030],{},"SEO Content Generator",[833,15032,15033],{},"Researches keywords, drafts blog posts, optimizes for search",[833,15035,15036],{},"Claude Code Skill",[815,15038,15039,15044,15047],{},[833,15040,15041],{},[45,15042,15043],{},"Social Media Scheduler",[833,15045,15046],{},"Creates posts, schedules across platforms, tracks engagement",[833,15048,15049],{},"n8n Workflow",[815,15051,15052,15057,15060],{},[833,15053,15054],{},[45,15055,15056],{},"Competitor Monitor",[833,15058,15059],{},"Tracks competitor pricing, features, content changes daily",[833,15061,15062],{},"Python Script",[815,15064,15065,15070,15073],{},[833,15066,15067],{},[45,15068,15069],{},"Email Sequence Builder",[833,15071,15072],{},"Drafts nurture sequences based on audience segment",[833,15074,15036],{},[815,15076,15077,15082,15085],{},[833,15078,15079],{},[45,15080,15081],{},"Ad Copy Generator",[833,15083,15084],{},"Creates A\u002FB test variants for Google\u002FMeta ads",[833,15086,15087],{},"Prompt Template",[12,15089,15090],{},[45,15091,15092],{},"Example: SEO Content Pipeline",[143,15094,15096],{"className":145,"code":15095,"language":147,"meta":148,"style":148},"# Install the SEO content skill for Claude Code\nmkdir -p .claude\u002Fskills\ncurl -o .claude\u002Fskills\u002Fseo-writer.md \\\n  \"https:\u002F\u002Ftokrepo.com\u002Fapi\u002Fv1\u002Ftokenboard\u002Fraw\u002FASSET_UUID\"\n\n# Use it: generate an SEO-optimized article\nclaude \"\u002Fseo-writer Write a 2000-word guide about AI workflow automation tools\"\n",[150,15097,15098,15103,15112,15124,15129,15133,15138],{"__ignoreMap":148},[153,15099,15100],{"class":155,"line":156},[153,15101,15102],{"class":211},"# Install the SEO content skill for Claude Code\n",[153,15104,15105,15107,15109],{"class":155,"line":208},[153,15106,1312],{"class":159},[153,15108,366],{"class":163},[153,15110,15111],{"class":167}," .claude\u002Fskills\n",[153,15113,15114,15116,15119,15122],{"class":155,"line":242},[153,15115,160],{"class":159},[153,15117,15118],{"class":163}," -o",[153,15120,15121],{"class":167}," .claude\u002Fskills\u002Fseo-writer.md",[153,15123,372],{"class":163},[153,15125,15126],{"class":155,"line":249},[153,15127,15128],{"class":167},"  \"https:\u002F\u002Ftokrepo.com\u002Fapi\u002Fv1\u002Ftokenboard\u002Fraw\u002FASSET_UUID\"\n",[153,15130,15131],{"class":155,"line":255},[153,15132,246],{"emptyLinePlaceholder":245},[153,15134,15135],{"class":155,"line":268},[153,15136,15137],{"class":211},"# Use it: generate an SEO-optimized article\n",[153,15139,15140,15142],{"class":155,"line":281},[153,15141,12966],{"class":159},[153,15143,15144],{"class":167}," \"\u002Fseo-writer Write a 2000-word guide about AI workflow automation tools\"\n",[12,15146,15147],{},"This skill handles keyword research, outline generation, writing, and on-page SEO optimization in a single command.",[12,15149,15150],{},[45,15151,15152],{},"Example: n8n Social Media Workflow",[143,15154,15156],{"className":3807,"code":15155,"language":3809,"meta":148,"style":148},"{\n  \"name\": \"AI Social Media Pipeline\",\n  \"nodes\": [\n    {\"type\": \"Schedule Trigger\", \"params\": {\"rule\": \"0 9 * * 1-5\"}},\n    {\"type\": \"HTTP Request\", \"params\": {\"url\": \"https:\u002F\u002Fapi.anthropic.com\u002Fv1\u002Fmessages\"}},\n    {\"type\": \"Twitter\", \"params\": {\"operation\": \"create\"}},\n    {\"type\": \"LinkedIn\", \"params\": {\"operation\": \"create\"}}\n  ]\n}\n",[150,15157,15158,15162,15174,15181,15213,15240,15267,15293,15297],{"__ignoreMap":148},[153,15159,15160],{"class":155,"line":156},[153,15161,3816],{"class":313},[153,15163,15164,15167,15169,15172],{"class":155,"line":208},[153,15165,15166],{"class":163},"  \"name\"",[153,15168,3839],{"class":313},[153,15170,15171],{"class":167},"\"AI Social Media Pipeline\"",[153,15173,3845],{"class":313},[153,15175,15176,15179],{"class":155,"line":242},[153,15177,15178],{"class":163},"  \"nodes\"",[153,15180,4081],{"class":313},[153,15182,15183,15186,15189,15191,15194,15196,15199,15202,15205,15207,15210],{"class":155,"line":249},[153,15184,15185],{"class":313},"    {",[153,15187,15188],{"class":163},"\"type\"",[153,15190,3839],{"class":313},[153,15192,15193],{"class":167},"\"Schedule Trigger\"",[153,15195,528],{"class":313},[153,15197,15198],{"class":163},"\"params\"",[153,15200,15201],{"class":313},": {",[153,15203,15204],{"class":163},"\"rule\"",[153,15206,3839],{"class":313},[153,15208,15209],{"class":167},"\"0 9 * * 1-5\"",[153,15211,15212],{"class":313},"}},\n",[153,15214,15215,15217,15219,15221,15224,15226,15228,15230,15233,15235,15238],{"class":155,"line":255},[153,15216,15185],{"class":313},[153,15218,15188],{"class":163},[153,15220,3839],{"class":313},[153,15222,15223],{"class":167},"\"HTTP Request\"",[153,15225,528],{"class":313},[153,15227,15198],{"class":163},[153,15229,15201],{"class":313},[153,15231,15232],{"class":163},"\"url\"",[153,15234,3839],{"class":313},[153,15236,15237],{"class":167},"\"https:\u002F\u002Fapi.anthropic.com\u002Fv1\u002Fmessages\"",[153,15239,15212],{"class":313},[153,15241,15242,15244,15246,15248,15251,15253,15255,15257,15260,15262,15265],{"class":155,"line":268},[153,15243,15185],{"class":313},[153,15245,15188],{"class":163},[153,15247,3839],{"class":313},[153,15249,15250],{"class":167},"\"Twitter\"",[153,15252,528],{"class":313},[153,15254,15198],{"class":163},[153,15256,15201],{"class":313},[153,15258,15259],{"class":163},"\"operation\"",[153,15261,3839],{"class":313},[153,15263,15264],{"class":167},"\"create\"",[153,15266,15212],{"class":313},[153,15268,15269,15271,15273,15275,15278,15280,15282,15284,15286,15288,15290],{"class":155,"line":281},[153,15270,15185],{"class":313},[153,15272,15188],{"class":163},[153,15274,3839],{"class":313},[153,15276,15277],{"class":167},"\"LinkedIn\"",[153,15279,528],{"class":313},[153,15281,15198],{"class":163},[153,15283,15201],{"class":313},[153,15285,15259],{"class":163},[153,15287,3839],{"class":313},[153,15289,15264],{"class":167},[153,15291,15292],{"class":313},"}}\n",[153,15294,15295],{"class":155,"line":1356},[153,15296,9026],{"class":313},[153,15298,15299],{"class":155,"line":1362},[153,15300,3901],{"class":313},[12,15302,1527,15303,667],{},[71,15304,15306],{"href":14554,"rel":15305},[113],"marketing automation assets on TokRepo",[138,15308,15310],{"id":15309},"sales-automation","Sales Automation",[12,15312,15313],{},"Sales reps spend only 28% of their time actually selling. AI automation reclaims the rest:",[809,15315,15316,15326],{},[812,15317,15318],{},[815,15319,15320,15322,15324],{},[818,15321,15017],{},[818,15323,14227],{},[818,15325,823],{},[828,15327,15328,15340,15352,15365,15377],{},[815,15329,15330,15335,15338],{},[833,15331,15332],{},[45,15333,15334],{},"Lead Enrichment",[833,15336,15337],{},"Pulls company data, tech stack, funding from public sources",[833,15339,15062],{},[815,15341,15342,15347,15350],{},[833,15343,15344],{},[45,15345,15346],{},"Outreach Personalizer",[833,15348,15349],{},"Drafts personalized emails based on prospect research",[833,15351,15036],{},[815,15353,15354,15359,15362],{},[833,15355,15356],{},[45,15357,15358],{},"Call Summarizer",[833,15360,15361],{},"Transcribes calls, extracts action items, updates CRM",[833,15363,15364],{},"n8n + Whisper",[815,15366,15367,15372,15375],{},[833,15368,15369],{},[45,15370,15371],{},"Pipeline Scorer",[833,15373,15374],{},"Scores deals by engagement signals, flags at-risk accounts",[833,15376,15062],{},[815,15378,15379,15384,15387],{},[833,15380,15381],{},[45,15382,15383],{},"Proposal Generator",[833,15385,15386],{},"Creates custom proposals from templates + deal context",[833,15388,15036],{},[12,15390,15391],{},[45,15392,15393],{},"Example: Automated Lead Research",[143,15395,15399],{"className":15396,"code":15397,"language":15398,"meta":148,"style":148},"language-python shiki shiki-themes github-light github-dark","\"\"\"Lead enrichment script — researches a company and returns structured data.\"\"\"\nimport httpx\nimport json\n\nasync def enrich_lead(company_domain: str) -> dict:\n    \"\"\"Research a company using public APIs.\"\"\"\n    # Clearbit-style enrichment from public data\n    async with httpx.AsyncClient() as client:\n        # Check GitHub org\n        gh = await client.get(f\"https:\u002F\u002Fapi.github.com\u002Forgs\u002F{company_domain.split('.')[0]}\")\n        # Check for job postings (signals growth)\n        # Check tech stack via BuiltWith or Wappalyzer\n        \n    return {\n        \"domain\": company_domain,\n        \"github_repos\": gh.json().get(\"public_repos\", 0) if gh.status_code == 200 else 0,\n        \"signals\": [\"hiring\", \"growing\"] if gh.status_code == 200 else [],\n    }\n","python",[150,15400,15401,15406,15411,15416,15420,15425,15430,15435,15440,15445,15450,15455,15460,15465,15470,15475,15480,15485],{"__ignoreMap":148},[153,15402,15403],{"class":155,"line":156},[153,15404,15405],{},"\"\"\"Lead enrichment script — researches a company and returns structured data.\"\"\"\n",[153,15407,15408],{"class":155,"line":208},[153,15409,15410],{},"import httpx\n",[153,15412,15413],{"class":155,"line":242},[153,15414,15415],{},"import json\n",[153,15417,15418],{"class":155,"line":249},[153,15419,246],{"emptyLinePlaceholder":245},[153,15421,15422],{"class":155,"line":255},[153,15423,15424],{},"async def enrich_lead(company_domain: str) -> dict:\n",[153,15426,15427],{"class":155,"line":268},[153,15428,15429],{},"    \"\"\"Research a company using public APIs.\"\"\"\n",[153,15431,15432],{"class":155,"line":281},[153,15433,15434],{},"    # Clearbit-style enrichment from public data\n",[153,15436,15437],{"class":155,"line":1356},[153,15438,15439],{},"    async with httpx.AsyncClient() as client:\n",[153,15441,15442],{"class":155,"line":1362},[153,15443,15444],{},"        # Check GitHub org\n",[153,15446,15447],{"class":155,"line":1367},[153,15448,15449],{},"        gh = await client.get(f\"https:\u002F\u002Fapi.github.com\u002Forgs\u002F{company_domain.split('.')[0]}\")\n",[153,15451,15452],{"class":155,"line":1372},[153,15453,15454],{},"        # Check for job postings (signals growth)\n",[153,15456,15457],{"class":155,"line":1378},[153,15458,15459],{},"        # Check tech stack via BuiltWith or Wappalyzer\n",[153,15461,15462],{"class":155,"line":1383},[153,15463,15464],{},"        \n",[153,15466,15467],{"class":155,"line":1389},[153,15468,15469],{},"    return {\n",[153,15471,15472],{"class":155,"line":1395},[153,15473,15474],{},"        \"domain\": company_domain,\n",[153,15476,15477],{"class":155,"line":1401},[153,15478,15479],{},"        \"github_repos\": gh.json().get(\"public_repos\", 0) if gh.status_code == 200 else 0,\n",[153,15481,15482],{"class":155,"line":1407},[153,15483,15484],{},"        \"signals\": [\"hiring\", \"growing\"] if gh.status_code == 200 else [],\n",[153,15486,15487],{"class":155,"line":1129},[153,15488,3891],{},[138,15490,15492],{"id":15491},"content-automation","Content Automation",[12,15494,15495],{},"Content teams can 3-5x output without sacrificing quality:",[809,15497,15498,15508],{},[812,15499,15500],{},[815,15501,15502,15504,15506],{},[818,15503,15017],{},[818,15505,14227],{},[818,15507,823],{},[828,15509,15510,15522,15534,15546,15558],{},[815,15511,15512,15517,15520],{},[833,15513,15514],{},[45,15515,15516],{},"Blog Post Drafter",[833,15518,15519],{},"First drafts from outline, maintains brand voice",[833,15521,15036],{},[815,15523,15524,15529,15532],{},[833,15525,15526],{},[45,15527,15528],{},"Newsletter Curator",[833,15530,15531],{},"Aggregates industry news, drafts weekly digest",[833,15533,15049],{},[815,15535,15536,15541,15544],{},[833,15537,15538],{},[45,15539,15540],{},"Video Script Writer",[833,15542,15543],{},"Writes scripts with hooks, structure, CTAs",[833,15545,15087],{},[815,15547,15548,15553,15556],{},[833,15549,15550],{},[45,15551,15552],{},"Translation Pipeline",[833,15554,15555],{},"Translates + localizes content to 10+ languages",[833,15557,15062],{},[815,15559,15560,15565,15568],{},[833,15561,15562],{},[45,15563,15564],{},"Image Alt Text Generator",[833,15566,15567],{},"Generates SEO-friendly alt text for all images",[833,15569,15036],{},[12,15571,15572],{},[45,15573,15574],{},"Example: Automated Newsletter with n8n",[143,15576,15578],{"className":1187,"code":15577,"language":1189,"meta":148,"style":148},"# n8n workflow: Weekly AI Newsletter\ntrigger: Every Monday 8am\nsteps:\n  1. RSS Feed → Collect top 20 AI articles from 5 sources\n  2. Claude API → Summarize each article in 2 sentences\n  3. Claude API → Write newsletter intro + pick top 5\n  4. Mailchimp → Send to subscriber list\n  5. Slack → Post to #content channel for team review\n",[150,15579,15580,15585,15596,15604,15609,15614,15619,15624],{"__ignoreMap":148},[153,15581,15582],{"class":155,"line":156},[153,15583,15584],{"class":211},"# n8n workflow: Weekly AI Newsletter\n",[153,15586,15587,15591,15593],{"class":155,"line":208},[153,15588,15590],{"class":15589},"s9eBZ","trigger",[153,15592,3839],{"class":313},[153,15594,15595],{"class":167},"Every Monday 8am\n",[153,15597,15598,15601],{"class":155,"line":242},[153,15599,15600],{"class":15589},"steps",[153,15602,15603],{"class":313},":\n",[153,15605,15606],{"class":155,"line":249},[153,15607,15608],{"class":167},"  1. RSS Feed → Collect top 20 AI articles from 5 sources\n",[153,15610,15611],{"class":155,"line":255},[153,15612,15613],{"class":167},"  2. Claude API → Summarize each article in 2 sentences\n",[153,15615,15616],{"class":155,"line":268},[153,15617,15618],{"class":167},"  3. Claude API → Write newsletter intro + pick top 5\n",[153,15620,15621],{"class":155,"line":281},[153,15622,15623],{"class":167},"  4. Mailchimp → Send to subscriber list\n",[153,15625,15626,15629],{"class":155,"line":1356},[153,15627,15628],{"class":167},"  5. Slack → Post to",[153,15630,15631],{"class":211}," #content channel for team review\n",[12,15633,15634,15635,15639],{},"Browse the ",[71,15636,15638],{"href":14272,"rel":15637},[113],"Awesome n8n workflow templates on TokRepo"," for ready-to-import configurations.",[138,15641,15643],{"id":15642},"devops-automation","DevOps Automation",[12,15645,15646],{},"DevOps is where AI automation has the most mature tooling:",[809,15648,15649,15659],{},[812,15650,15651],{},[815,15652,15653,15655,15657],{},[818,15654,15017],{},[818,15656,14227],{},[818,15658,823],{},[828,15660,15661,15673,15686,15698,15710],{},[815,15662,15663,15668,15671],{},[833,15664,15665],{},[45,15666,15667],{},"PR Review Agent",[833,15669,15670],{},"Reviews code changes, flags security issues, suggests fixes",[833,15672,15036],{},[815,15674,15675,15680,15683],{},[833,15676,15677],{},[45,15678,15679],{},"Deploy Pipeline",[833,15681,15682],{},"Build, test, deploy with rollback on failure",[833,15684,15685],{},"Shell Script",[815,15687,15688,15693,15696],{},[833,15689,15690],{},[45,15691,15692],{},"Incident Responder",[833,15694,15695],{},"Analyzes alerts, suggests root cause, drafts postmortem",[833,15697,15036],{},[815,15699,15700,15705,15708],{},[833,15701,15702],{},[45,15703,15704],{},"Dependency Updater",[833,15706,15707],{},"Checks for outdated packages, creates upgrade PRs",[833,15709,15062],{},[815,15711,15712,15717,15720],{},[833,15713,15714],{},[45,15715,15716],{},"Infrastructure Provisioner",[833,15718,15719],{},"Generates Terraform\u002FCloudFormation from requirements",[833,15721,15036],{},[12,15723,15724],{},[45,15725,15726],{},"Example: Automated Code Review",[143,15728,15730],{"className":145,"code":15729,"language":147,"meta":148,"style":148},"# Install the adversarial code review skill\nmkdir -p .claude\u002Fskills\ncurl -o .claude\u002Fskills\u002Fcode-reviewer.md \\\n  \"https:\u002F\u002Ftokrepo.com\u002Fapi\u002Fv1\u002Ftokenboard\u002Fraw\u002FASSET_UUID\"\n\n# Review current changes before committing\nclaude \"\u002Fcode-reviewer Review the staged changes for security vulnerabilities\"\n",[150,15731,15732,15737,15745,15756,15760,15764,15769],{"__ignoreMap":148},[153,15733,15734],{"class":155,"line":156},[153,15735,15736],{"class":211},"# Install the adversarial code review skill\n",[153,15738,15739,15741,15743],{"class":155,"line":208},[153,15740,1312],{"class":159},[153,15742,366],{"class":163},[153,15744,15111],{"class":167},[153,15746,15747,15749,15751,15754],{"class":155,"line":242},[153,15748,160],{"class":159},[153,15750,15118],{"class":163},[153,15752,15753],{"class":167}," .claude\u002Fskills\u002Fcode-reviewer.md",[153,15755,372],{"class":163},[153,15757,15758],{"class":155,"line":249},[153,15759,15128],{"class":167},[153,15761,15762],{"class":155,"line":255},[153,15763,246],{"emptyLinePlaceholder":245},[153,15765,15766],{"class":155,"line":268},[153,15767,15768],{"class":211},"# Review current changes before committing\n",[153,15770,15771,15773],{"class":155,"line":281},[153,15772,12966],{"class":159},[153,15774,15775],{"class":167}," \"\u002Fcode-reviewer Review the staged changes for security vulnerabilities\"\n",[12,15777,15778],{},[45,15779,15780],{},"Example: Deploy Script with Rollback",[143,15782,15784],{"className":145,"code":15783,"language":147,"meta":148,"style":148},"#!\u002Fbin\u002Fbash\n# deploy.sh — Zero-downtime deployment with automatic rollback\nset -euo pipefail\n\nAPP_NAME=\"myapp\"\nDEPLOY_DIR=\"\u002Fopt\u002F$APP_NAME\"\nBACKUP_DIR=\"\u002Fopt\u002F$APP_NAME.backup\"\n\necho \"📦 Building...\"\nnpm run build || { echo \"❌ Build failed\"; exit 1; }\n\necho \"💾 Backing up current version...\"\ncp -r \"$DEPLOY_DIR\" \"$BACKUP_DIR\"\n\necho \"🚀 Deploying...\"\nrsync -av --delete .output\u002F \"$DEPLOY_DIR\u002F.output\u002F\"\npm2 restart \"$APP_NAME\"\n\n# Health check\nsleep 5\nHTTP_CODE=$(curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" http:\u002F\u002Flocalhost:3000\u002Fhealth)\nif [ \"$HTTP_CODE\" != \"200\" ]; then\n    echo \"❌ Health check failed (HTTP $HTTP_CODE), rolling back...\"\n    cp -r \"$BACKUP_DIR\" \"$DEPLOY_DIR\"\n    pm2 restart \"$APP_NAME\"\n    exit 1\nfi\n\necho \"✅ Deploy successful\"\nrm -rf \"$BACKUP_DIR\"\n",[150,15785,15786,15790,15795,15806,15810,15820,15835,15849,15853,15860,15891,15895,15902,15923,15927,15934,15955,15969,15973,15978,15986,16016,16042,16054,16073,16087,16094,16100,16105,16113],{"__ignoreMap":148},[153,15787,15788],{"class":155,"line":156},[153,15789,1551],{"class":211},[153,15791,15792],{"class":155,"line":208},[153,15793,15794],{"class":211},"# deploy.sh — Zero-downtime deployment with automatic rollback\n",[153,15796,15797,15800,15803],{"class":155,"line":242},[153,15798,15799],{"class":163},"set",[153,15801,15802],{"class":163}," -euo",[153,15804,15805],{"class":167}," pipefail\n",[153,15807,15808],{"class":155,"line":249},[153,15809,246],{"emptyLinePlaceholder":245},[153,15811,15812,15815,15817],{"class":155,"line":255},[153,15813,15814],{"class":313},"APP_NAME",[153,15816,1932],{"class":171},[153,15818,15819],{"class":167},"\"myapp\"\n",[153,15821,15822,15825,15827,15830,15833],{"class":155,"line":268},[153,15823,15824],{"class":313},"DEPLOY_DIR",[153,15826,1932],{"class":171},[153,15828,15829],{"class":167},"\"\u002Fopt\u002F",[153,15831,15832],{"class":313},"$APP_NAME",[153,15834,2654],{"class":167},[153,15836,15837,15840,15842,15844,15846],{"class":155,"line":281},[153,15838,15839],{"class":313},"BACKUP_DIR",[153,15841,1932],{"class":171},[153,15843,15829],{"class":167},[153,15845,15832],{"class":313},[153,15847,15848],{"class":167},".backup\"\n",[153,15850,15851],{"class":155,"line":1356},[153,15852,246],{"emptyLinePlaceholder":245},[153,15854,15855,15857],{"class":155,"line":1362},[153,15856,1570],{"class":163},[153,15858,15859],{"class":167}," \"📦 Building...\"\n",[153,15861,15862,15864,15866,15869,15872,15875,15877,15880,15882,15885,15888],{"class":155,"line":1367},[153,15863,5639],{"class":159},[153,15865,306],{"class":167},[153,15867,15868],{"class":167}," build",[153,15870,15871],{"class":171}," ||",[153,15873,15874],{"class":313}," { ",[153,15876,1570],{"class":163},[153,15878,15879],{"class":167}," \"❌ Build failed\"",[153,15881,1838],{"class":313},[153,15883,15884],{"class":163},"exit",[153,15886,15887],{"class":163}," 1",[153,15889,15890],{"class":313},"; }\n",[153,15892,15893],{"class":155,"line":1372},[153,15894,246],{"emptyLinePlaceholder":245},[153,15896,15897,15899],{"class":155,"line":1378},[153,15898,1570],{"class":163},[153,15900,15901],{"class":167}," \"💾 Backing up current version...\"\n",[153,15903,15904,15907,15909,15911,15914,15916,15918,15921],{"class":155,"line":1383},[153,15905,15906],{"class":159},"cp",[153,15908,2003],{"class":163},[153,15910,1861],{"class":167},[153,15912,15913],{"class":313},"$DEPLOY_DIR",[153,15915,1867],{"class":167},[153,15917,1861],{"class":167},[153,15919,15920],{"class":313},"$BACKUP_DIR",[153,15922,2654],{"class":167},[153,15924,15925],{"class":155,"line":1389},[153,15926,246],{"emptyLinePlaceholder":245},[153,15928,15929,15931],{"class":155,"line":1395},[153,15930,1570],{"class":163},[153,15932,15933],{"class":167}," \"🚀 Deploying...\"\n",[153,15935,15936,15939,15942,15945,15948,15950,15952],{"class":155,"line":1401},[153,15937,15938],{"class":159},"rsync",[153,15940,15941],{"class":163}," -av",[153,15943,15944],{"class":163}," --delete",[153,15946,15947],{"class":167}," .output\u002F",[153,15949,1861],{"class":167},[153,15951,15913],{"class":313},[153,15953,15954],{"class":167},"\u002F.output\u002F\"\n",[153,15956,15957,15960,15963,15965,15967],{"class":155,"line":1407},[153,15958,15959],{"class":159},"pm2",[153,15961,15962],{"class":167}," restart",[153,15964,1861],{"class":167},[153,15966,15832],{"class":313},[153,15968,2654],{"class":167},[153,15970,15971],{"class":155,"line":1129},[153,15972,246],{"emptyLinePlaceholder":245},[153,15974,15975],{"class":155,"line":1417},[153,15976,15977],{"class":211},"# Health check\n",[153,15979,15980,15983],{"class":155,"line":1423},[153,15981,15982],{"class":159},"sleep",[153,15984,15985],{"class":163}," 5\n",[153,15987,15988,15991,15993,15995,15997,16000,16002,16005,16008,16011,16014],{"class":155,"line":1683},[153,15989,15990],{"class":313},"HTTP_CODE",[153,15992,1932],{"class":171},[153,15994,2597],{"class":313},[153,15996,160],{"class":159},[153,15998,15999],{"class":163}," -s",[153,16001,15118],{"class":163},[153,16003,16004],{"class":167}," \u002Fdev\u002Fnull",[153,16006,16007],{"class":163}," -w",[153,16009,16010],{"class":167}," \"%{http_code}\"",[153,16012,16013],{"class":167}," http:\u002F\u002Flocalhost:3000\u002Fhealth",[153,16015,1950],{"class":313},[153,16017,16018,16021,16024,16026,16029,16031,16034,16037,16040],{"class":155,"line":1688},[153,16019,16020],{"class":171},"if",[153,16022,16023],{"class":313}," [ ",[153,16025,1867],{"class":167},[153,16027,16028],{"class":313},"$HTTP_CODE",[153,16030,1867],{"class":167},[153,16032,16033],{"class":171}," !=",[153,16035,16036],{"class":167}," \"200\"",[153,16038,16039],{"class":313}," ]; ",[153,16041,1872],{"class":171},[153,16043,16044,16046,16049,16051],{"class":155,"line":12900},[153,16045,1877],{"class":163},[153,16047,16048],{"class":167}," \"❌ Health check failed (HTTP ",[153,16050,16028],{"class":313},[153,16052,16053],{"class":167},"), rolling back...\"\n",[153,16055,16056,16059,16061,16063,16065,16067,16069,16071],{"class":155,"line":12906},[153,16057,16058],{"class":159},"    cp",[153,16060,2003],{"class":163},[153,16062,1861],{"class":167},[153,16064,15920],{"class":313},[153,16066,1867],{"class":167},[153,16068,1861],{"class":167},[153,16070,15913],{"class":313},[153,16072,2654],{"class":167},[153,16074,16076,16079,16081,16083,16085],{"class":155,"line":16075},25,[153,16077,16078],{"class":159},"    pm2",[153,16080,15962],{"class":167},[153,16082,1861],{"class":167},[153,16084,15832],{"class":313},[153,16086,2654],{"class":167},[153,16088,16090,16092],{"class":155,"line":16089},26,[153,16091,1890],{"class":163},[153,16093,1893],{"class":163},[153,16095,16097],{"class":155,"line":16096},27,[153,16098,16099],{"class":171},"fi\n",[153,16101,16103],{"class":155,"line":16102},28,[153,16104,246],{"emptyLinePlaceholder":245},[153,16106,16108,16110],{"class":155,"line":16107},29,[153,16109,1570],{"class":163},[153,16111,16112],{"class":167}," \"✅ Deploy successful\"\n",[153,16114,16116,16119,16122,16124,16126],{"class":155,"line":16115},30,[153,16117,16118],{"class":159},"rm",[153,16120,16121],{"class":163}," -rf",[153,16123,1861],{"class":167},[153,16125,15920],{"class":313},[153,16127,2654],{"class":167},[35,16129,16131],{"id":16130},"how-to-choose-the-right-automation-tool","How to Choose the Right Automation Tool",[809,16133,16134,16146],{},[812,16135,16136],{},[815,16137,16138,16141,16144],{},[818,16139,16140],{},"If You Need...",[818,16142,16143],{},"Use This",[818,16145,317],{},[828,16147,16148,16160,16173,16185,16197],{},[815,16149,16150,16153,16157],{},[833,16151,16152],{},"Quick task automation",[833,16154,16155],{},[45,16156,15036],{},[833,16158,16159],{},"Markdown file, no infra needed",[815,16161,16162,16165,16170],{},[833,16163,16164],{},"Multi-step pipeline",[833,16166,16167],{},[45,16168,16169],{},"n8n \u002F Make",[833,16171,16172],{},"Visual builder, 400+ integrations",[815,16174,16175,16178,16182],{},[833,16176,16177],{},"Custom data processing",[833,16179,16180],{},[45,16181,15062],{},[833,16183,16184],{},"Full control, any API",[815,16186,16187,16190,16194],{},[833,16188,16189],{},"CI\u002FCD integration",[833,16191,16192],{},[45,16193,15685],{},[833,16195,16196],{},"Runs in any pipeline",[815,16198,16199,16202,16206],{},[833,16200,16201],{},"Cross-tool orchestration",[833,16203,16204],{},[45,16205,13861],{},[833,16207,16208],{},"Connects AI to any service",[35,16210,16212],{"id":16211},"getting-started-in-5-minutes","Getting Started in 5 Minutes",[138,16214,16216],{"id":16215},"option-1-install-a-claude-code-skill-fastest","Option 1: Install a Claude Code Skill (Fastest)",[143,16218,16220],{"className":145,"code":16219,"language":147,"meta":148,"style":148},"# Browse skills at https:\u002F\u002Ftokrepo.com\u002Fen\u002Fcollections\u002Fskills\n# Install any skill:\nmkdir -p .claude\u002Fskills\ncurl -o .claude\u002Fskills\u002Fautomation.md \"SKILL_URL\"\n# Done — use it in your next Claude Code session\n",[150,16221,16222,16227,16232,16240,16252],{"__ignoreMap":148},[153,16223,16224],{"class":155,"line":156},[153,16225,16226],{"class":211},"# Browse skills at https:\u002F\u002Ftokrepo.com\u002Fen\u002Fcollections\u002Fskills\n",[153,16228,16229],{"class":155,"line":208},[153,16230,16231],{"class":211},"# Install any skill:\n",[153,16233,16234,16236,16238],{"class":155,"line":242},[153,16235,1312],{"class":159},[153,16237,366],{"class":163},[153,16239,15111],{"class":167},[153,16241,16242,16244,16246,16249],{"class":155,"line":249},[153,16243,160],{"class":159},[153,16245,15118],{"class":163},[153,16247,16248],{"class":167}," .claude\u002Fskills\u002Fautomation.md",[153,16250,16251],{"class":167}," \"SKILL_URL\"\n",[153,16253,16254],{"class":155,"line":255},[153,16255,16256],{"class":211},"# Done — use it in your next Claude Code session\n",[138,16258,16260],{"id":16259},"option-2-import-an-n8n-workflow","Option 2: Import an n8n Workflow",[143,16262,16264],{"className":145,"code":16263,"language":147,"meta":148,"style":148},"# 1. Browse n8n templates on TokRepo\n# 2. Copy the JSON workflow\n# 3. In n8n: Settings → Import Workflow → Paste JSON\n# 4. Configure your API keys in the credential nodes\n# 5. Activate the workflow\n",[150,16265,16266,16271,16276,16281,16286],{"__ignoreMap":148},[153,16267,16268],{"class":155,"line":156},[153,16269,16270],{"class":211},"# 1. Browse n8n templates on TokRepo\n",[153,16272,16273],{"class":155,"line":208},[153,16274,16275],{"class":211},"# 2. Copy the JSON workflow\n",[153,16277,16278],{"class":155,"line":242},[153,16279,16280],{"class":211},"# 3. In n8n: Settings → Import Workflow → Paste JSON\n",[153,16282,16283],{"class":155,"line":249},[153,16284,16285],{"class":211},"# 4. Configure your API keys in the credential nodes\n",[153,16287,16288],{"class":155,"line":255},[153,16289,16290],{"class":211},"# 5. Activate the workflow\n",[138,16292,16294],{"id":16293},"option-3-run-a-python-script","Option 3: Run a Python Script",[143,16296,16298],{"className":145,"code":16297,"language":147,"meta":148,"style":148},"# Clone the automation script\ngit clone https:\u002F\u002Fgithub.com\u002Fauthor\u002Fautomation-script\ncd automation-script\n\n# Install dependencies\npip install -r requirements.txt\n\n# Configure\ncp .env.example .env\n# Edit .env with your API keys\n\n# Run\npython main.py\n",[150,16299,16300,16305,16314,16321,16325,16330,16342,16346,16351,16361,16366,16370,16375],{"__ignoreMap":148},[153,16301,16302],{"class":155,"line":156},[153,16303,16304],{"class":211},"# Clone the automation script\n",[153,16306,16307,16309,16311],{"class":155,"line":208},[153,16308,1222],{"class":159},[153,16310,1225],{"class":167},[153,16312,16313],{"class":167}," https:\u002F\u002Fgithub.com\u002Fauthor\u002Fautomation-script\n",[153,16315,16316,16318],{"class":155,"line":242},[153,16317,1233],{"class":163},[153,16319,16320],{"class":167}," automation-script\n",[153,16322,16323],{"class":155,"line":249},[153,16324,246],{"emptyLinePlaceholder":245},[153,16326,16327],{"class":155,"line":255},[153,16328,16329],{"class":211},"# Install dependencies\n",[153,16331,16332,16335,16337,16339],{"class":155,"line":268},[153,16333,16334],{"class":159},"pip",[153,16336,1590],{"class":167},[153,16338,2003],{"class":163},[153,16340,16341],{"class":167}," requirements.txt\n",[153,16343,16344],{"class":155,"line":281},[153,16345,246],{"emptyLinePlaceholder":245},[153,16347,16348],{"class":155,"line":1356},[153,16349,16350],{"class":211},"# Configure\n",[153,16352,16353,16355,16358],{"class":155,"line":1362},[153,16354,15906],{"class":159},[153,16356,16357],{"class":167}," .env.example",[153,16359,16360],{"class":167}," .env\n",[153,16362,16363],{"class":155,"line":1367},[153,16364,16365],{"class":211},"# Edit .env with your API keys\n",[153,16367,16368],{"class":155,"line":1372},[153,16369,246],{"emptyLinePlaceholder":245},[153,16371,16372],{"class":155,"line":1378},[153,16373,16374],{"class":211},"# Run\n",[153,16376,16377,16379],{"class":155,"line":1383},[153,16378,15398],{"class":159},[153,16380,16381],{"class":167}," main.py\n",[35,16383,16385],{"id":16384},"ai-workflow-automation-tools-comparison-2026","AI Workflow Automation Tools Comparison (2026)",[809,16387,16388,16402],{},[812,16389,16390],{},[815,16391,16392,16394,16397,16400],{},[818,16393,823],{},[818,16395,16396],{},"Type",[818,16398,16399],{},"Price",[818,16401,14689],{},[828,16403,16404,16419,16433,16448,16464,16478],{},[815,16405,16406,16410,16413,16416],{},[833,16407,16408],{},[45,16409,14630],{},[833,16411,16412],{},"Visual workflow builder",[833,16414,16415],{},"Free (self-hosted) \u002F $20\u002Fmo (cloud)",[833,16417,16418],{},"Multi-step pipelines with 400+ integrations",[815,16420,16421,16425,16428,16430],{},[833,16422,16423],{},[45,16424,1159],{},[833,16426,16427],{},"AI coding agent",[833,16429,14703],{},[833,16431,16432],{},"Developer-focused task automation",[815,16434,16435,16439,16442,16445],{},[833,16436,16437],{},[45,16438,14757],{},[833,16440,16441],{},"No-code automation",[833,16443,16444],{},"$20\u002Fmo+",[833,16446,16447],{},"Non-technical users, simple triggers",[815,16449,16450,16455,16458,16461],{},[833,16451,16452],{},[45,16453,16454],{},"Make",[833,16456,16457],{},"Visual automation",[833,16459,16460],{},"$10\u002Fmo+",[833,16462,16463],{},"Complex scenarios with branching logic",[815,16465,16466,16470,16473,16475],{},[833,16467,16468],{},[45,16469,6675],{},[833,16471,16472],{},"AI code editor",[833,16474,14703],{},[833,16476,16477],{},"Code-centric automation with AI",[815,16479,16480,16485,16488,16491],{},[833,16481,16482],{},[45,16483,16484],{},"LangFlow",[833,16486,16487],{},"AI pipeline builder",[833,16489,16490],{},"Free (open-source)",[833,16492,16493],{},"LLM chain orchestration",[116,16495,16496],{"type":118},[12,16497,16498],{},"n8n is the most popular open-source automation tool in 2026 with 75,000+ GitHub stars. TokRepo hosts ready-to-import n8n workflow templates for common use cases.",[35,16500,16502],{"id":16501},"measuring-automation-roi","Measuring Automation ROI",[12,16504,16505],{},"Track these metrics to quantify your automation investment:",[809,16507,16508,16520],{},[812,16509,16510],{},[815,16511,16512,16514,16517],{},[818,16513,2441],{},[818,16515,16516],{},"How to Measure",[818,16518,16519],{},"Good Target",[828,16521,16522,16535,16548,16561],{},[815,16523,16524,16529,16532],{},[833,16525,16526],{},[45,16527,16528],{},"Time saved",[833,16530,16531],{},"Hours\u002Fweek before vs after",[833,16533,16534],{},"10+ hours\u002Fweek",[815,16536,16537,16542,16545],{},[833,16538,16539],{},[45,16540,16541],{},"Error rate",[833,16543,16544],{},"Manual errors vs automated",[833,16546,16547],{},"90%+ reduction",[815,16549,16550,16555,16558],{},[833,16551,16552],{},[45,16553,16554],{},"Output volume",[833,16556,16557],{},"Content\u002Fleads\u002Fdeploys per week",[833,16559,16560],{},"3-5x increase",[815,16562,16563,16568,16571],{},[833,16564,16565],{},[45,16566,16567],{},"Cost per task",[833,16569,16570],{},"Total cost ÷ tasks completed",[833,16572,16573],{},"50%+ reduction",[138,16575,2514],{"id":2513},[12,16577,16578,16581],{},[45,16579,16580],{},"Q: What is AI workflow automation?","\nA: Using artificial intelligence to automate repetitive business processes — from marketing and sales to content creation and DevOps — without manual intervention. AI agents handle end-to-end workflows using scripts, skills, and templates.",[12,16583,16584,16587],{},[45,16585,16586],{},"Q: What are the best free AI automation tools in 2026?","\nA: n8n (open-source workflow builder, 75K+ stars), Claude Code skills (free markdown-based automation), and Python scripts from TokRepo. All are free to use with community-ranked templates.",[12,16589,16590,16593],{},[45,16591,16592],{},"Q: How do I start with AI workflow automation?","\nA: Pick one repetitive task, install a ready-made automation from TokRepo (takes 5 minutes), and measure the time saved. Start simple — a single content automation or deploy script — then expand.",[12,16595,16596,16599],{},[45,16597,16598],{},"Q: Is AI automation safe for production use?","\nA: Yes, with guardrails. Always review automations before deploying to production, use environment variables for secrets, and add health checks with automatic rollback. Start with non-critical workflows first.",[35,16601,1020],{"id":1019},[19,16603,16604,16611,16618,16625,16632],{},[22,16605,16606,16610],{},[71,16607,16609],{"href":14554,"rel":16608},[113],"Browse automation assets on TokRepo"," — 30+ ready-to-install tools",[22,16612,16613,16617],{},[71,16614,16616],{"href":14468,"rel":16615},[113],"AI Automation Scripts & Tools"," — developer-focused scripts",[22,16619,16620,16624],{},[71,16621,16623],{"href":16622},"\u002Fguide\u002Fwhat-are-claude-code-skills","What Are Claude Code Skills?"," — automate with markdown files",[22,16626,16627,16631],{},[71,16628,16630],{"href":5477,"rel":16629},[113],"Best MCP Servers for Claude Code"," — connect AI to any service",[22,16633,16634,16636],{},[71,16635,1258],{"href":1169}," — build custom automations",[1074,16638,16639],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":148,"searchDepth":208,"depth":208,"links":16641},[16642,16643,16644,16650,16651,16656,16657,16660],{"id":78,"depth":208,"text":79},{"id":14982,"depth":208,"text":14983},{"id":15000,"depth":208,"text":15001,"children":16645},[16646,16647,16648,16649],{"id":15004,"depth":242,"text":15005},{"id":15309,"depth":242,"text":15310},{"id":15491,"depth":242,"text":15492},{"id":15642,"depth":242,"text":15643},{"id":16130,"depth":208,"text":16131},{"id":16211,"depth":208,"text":16212,"children":16652},[16653,16654,16655],{"id":16215,"depth":242,"text":16216},{"id":16259,"depth":242,"text":16260},{"id":16293,"depth":242,"text":16294},{"id":16384,"depth":208,"text":16385},{"id":16501,"depth":208,"text":16502,"children":16658},[16659],{"id":2513,"depth":242,"text":2514},{"id":1019,"depth":208,"text":1020},"Browse 30+ free AI workflow automation tools for marketing, sales, content, and DevOps. Ready-to-install scripts, agent skills, and n8n templates with examples.","30+ 免费 AI 工作流自动化工具：营销、销售、内容、DevOps 场景脚本、Agent 技能和 n8n 模板，附示例。",[16664,16667,16670,16673,16676],{"q":16665,"a":16666},"What is AI workflow automation?","Using AI agents to handle repetitive business processes — lead generation, content drafting, deploys, data analysis — without manual intervention. Unlike 2024 automation, you no longer build pipelines from scratch: you install a pre-built Claude Code skill, n8n workflow, or Python script and configure API keys.",{"q":16668,"a":16669},"What are the best free AI automation tools in 2026?","n8n (75K+ GitHub stars, free self-hosted), Claude Code skills (free Markdown-based), and Python scripts from TokRepo. n8n handles visual multi-step pipelines with 400+ integrations, while Claude Code skills install in seconds as single .md files with no infrastructure.",{"q":16671,"a":16672},"How do I start with AI workflow automation?","Pick one repetitive task, install a ready-made automation from TokRepo (5 minutes), measure time saved. For quickest results: mkdir -p .claude\u002Fskills, curl the skill file, then invoke it in Claude Code. Start with a single content or deploy script before expanding.",{"q":16674,"a":16675},"Should I use Claude Code skills, n8n, or Python scripts?","Use Claude Code skills for quick single-task automation (no infra needed), n8n for multi-step visual pipelines with 400+ integrations, and Python scripts for custom data processing with full API control. Shell scripts work best for CI\u002FCD, and MCP servers for cross-tool orchestration.",{"q":16677,"a":16678},"Is AI automation safe for production use?","Yes, with guardrails: review automations before deploying, use environment variables for secrets, and add health checks with automatic rollback (like the deploy script example that backs up, runs rsync, health-checks port 3000, and rolls back on HTTP failure). Start with non-critical workflows first.","\u002Fguide\u002Fimages\u002Fai-workflow-automation-hero.svg",{},"\u002Fen\u002Fguide\u002Fai-workflow-automation",{"title":14957,"description":16661},"en\u002Fguide\u002Fai-workflow-automation",[16685,2771,16686,16687,14630],"automation","scripts","ai-agent","AI 工作流自动化：30+ 即用脚本和 Agent 技能（2026）","AI workflow automation uses pre-built scripts, agent skills, and templates (for Claude Code, n8n, or Python) to handle repetitive marketing, sales, content, and DevOps tasks end-to-end. Install a ready-made asset from TokRepo in 5 minutes, configure API keys, and automate lead enrichment, SEO content, code reviews, or deploys without building pipelines from scratch.","GFW0gyAmn8LV5uu5eU7cInCQ3WwIwdyxtd-69kC7TVA",{"id":16692,"title":16693,"answer":6,"answerZh":6,"author":7,"body":16694,"category":1106,"description":18098,"descriptionZh":18099,"extension":1109,"faqs":18100,"faqsZh":6,"image":18116,"meta":18117,"navigation":245,"path":18118,"publishedAt":14945,"readTime":1378,"seo":18119,"stem":18120,"tags":18121,"titleZh":18124,"tldr":18125,"tldrZh":6,"updatedAt":14945,"__hash__":18126},"docs_en\u002Fen\u002Fguide\u002Fbuild-mcp-server-api.md","How to Build an MCP Server for Your API",{"type":9,"value":16695,"toc":18082},[16696,16699,16701,16722,16726,16797,16808,16812,16815,16821,16825,16880,16884,17494,17498,17501,17604,17617,17621,17624,17716,17720,17723,17801,17807,17836,17840,17843,17875,17878,17904,17908,17911,17917,17920,17925,17929,18030,18032,18038,18044,18050,18052,18079],[12,16697,16698],{},"Learn how to wrap any REST API as an MCP server so Claude Code, Cursor, and other AI tools can interact with it through natural language. This guide covers endpoint mapping, secure authentication, error handling, and deployment.",[35,16700,79],{"id":78},[19,16702,16703,16706,16713,16716],{},[22,16704,16705],{},"A REST API you want to expose to AI tools",[22,16707,16708,16709,16712],{},"Python 3.10+ with ",[150,16710,16711],{},"uv",", or Node.js 16+ with npm",[22,16714,16715],{},"API documentation or endpoint list for your target API",[22,16717,16718,16721],{},[71,16719,1159],{"href":1157,"rel":16720},[113]," or Cursor for testing",[35,16723,16725],{"id":16724},"architecture-rest-to-mcp-mapping","Architecture: REST to MCP Mapping",[809,16727,16728,16741],{},[812,16729,16730],{},[815,16731,16732,16735,16738],{},[818,16733,16734],{},"REST Concept",[818,16736,16737],{},"MCP Equivalent",[818,16739,16740],{},"When to Use",[828,16742,16743,16754,16765,16775,16786],{},[815,16744,16745,16748,16751],{},[833,16746,16747],{},"GET endpoints (no params)",[833,16749,16750],{},"Resources",[833,16752,16753],{},"Read-only data retrieval",[815,16755,16756,16759,16762],{},[833,16757,16758],{},"GET with query params",[833,16760,16761],{},"Tools",[833,16763,16764],{},"LLM decides what to query",[815,16766,16767,16770,16772],{},[833,16768,16769],{},"POST\u002FPUT\u002FDELETE",[833,16771,16761],{},[833,16773,16774],{},"Actions with side effects",[815,16776,16777,16780,16783],{},[833,16778,16779],{},"Auth headers",[833,16781,16782],{},"Environment variables",[833,16784,16785],{},"Injected at server startup",[815,16787,16788,16791,16794],{},[833,16789,16790],{},"Pagination",[833,16792,16793],{},"Multiple tool calls",[833,16795,16796],{},"LLM handles iteration",[12,16798,16799,16802,16803,16805,16806,667],{},[45,16800,16801],{},"Key principle",": GET endpoints with no parameters become ",[45,16804,16750],{},". Everything else becomes a ",[45,16807,823],{},[35,16809,16811],{"id":16810},"step-1-plan-your-endpoint-mapping","Step 1 — Plan Your Endpoint Mapping",[12,16813,16814],{},"Example for a project management API:",[143,16816,16819],{"className":16817,"code":16818,"language":1280},[1278],"GET    \u002Fprojects              → Resource: projects:\u002F\u002Flist\nGET    \u002Fprojects\u002F{id}         → Resource: projects:\u002F\u002F{id}\nPOST   \u002Fprojects              → Tool: create_project\nPUT    \u002Fprojects\u002F{id}         → Tool: update_project\nDELETE \u002Fprojects\u002F{id}         → Tool: delete_project\nGET    \u002Fprojects\u002F{id}\u002Ftasks   → Tool: list_tasks (has query params)\nPOST   \u002Fprojects\u002F{id}\u002Ftasks   → Tool: create_task\n",[150,16820,16818],{"__ignoreMap":148},[35,16822,16824],{"id":16823},"step-2-set-up-the-project","Step 2 — Set Up the Project",[143,16826,16828],{"className":145,"code":16827,"language":147,"meta":148,"style":148},"uv init api-mcp-server\ncd api-mcp-server\nuv venv && source .venv\u002Fbin\u002Factivate\nuv add \"mcp[cli]\" httpx\ntouch server.py\n",[150,16829,16830,16840,16846,16861,16873],{"__ignoreMap":148},[153,16831,16832,16834,16837],{"class":155,"line":156},[153,16833,16711],{"class":159},[153,16835,16836],{"class":167}," init",[153,16838,16839],{"class":167}," api-mcp-server\n",[153,16841,16842,16844],{"class":155,"line":208},[153,16843,1233],{"class":163},[153,16845,16839],{"class":167},[153,16847,16848,16850,16853,16856,16858],{"class":155,"line":242},[153,16849,16711],{"class":159},[153,16851,16852],{"class":167}," venv",[153,16854,16855],{"class":313}," && ",[153,16857,5702],{"class":163},[153,16859,16860],{"class":167}," .venv\u002Fbin\u002Factivate\n",[153,16862,16863,16865,16867,16870],{"class":155,"line":249},[153,16864,16711],{"class":159},[153,16866,1447],{"class":167},[153,16868,16869],{"class":167}," \"mcp[cli]\"",[153,16871,16872],{"class":167}," httpx\n",[153,16874,16875,16877],{"class":155,"line":255},[153,16876,12611],{"class":159},[153,16878,16879],{"class":167}," server.py\n",[35,16881,16883],{"id":16882},"step-3-build-the-server","Step 3 — Build the Server",[143,16885,16887],{"className":15396,"code":16886,"language":15398,"meta":148,"style":148},"\"\"\"MCP Server wrapping a Project Management REST API.\"\"\"\nimport os\nfrom typing import Any\nimport httpx\nfrom mcp.server.fastmcp import FastMCP\n\nAPI_BASE_URL = os.environ.get(\"API_BASE_URL\", \"https:\u002F\u002Fapi.example.com\u002Fv1\")\nAPI_KEY = os.environ.get(\"API_KEY\", \"\")\n\nmcp = FastMCP(\"project-api\")\n\n\nasync def api_request(\n    method: str, path: str,\n    params: dict[str, Any] | None = None,\n    json_body: dict[str, Any] | None = None,\n) -> dict[str, Any]:\n    \"\"\"Make an authenticated request to the REST API.\"\"\"\n    headers = {\n        \"Authorization\": f\"Bearer {API_KEY}\",\n        \"Content-Type\": \"application\u002Fjson\",\n    }\n    async with httpx.AsyncClient() as client:\n        response = await client.request(\n            method, f\"{API_BASE_URL}{path}\",\n            headers=headers, params=params,\n            json=json_body, timeout=30.0,\n        )\n        response.raise_for_status()\n        return response.json()\n\n\n# --- Resources (GET, read-only) ---\n\n@mcp.resource(\"projects:\u002F\u002Flist\")\nasync def list_projects() -> str:\n    \"\"\"List all projects in the workspace.\"\"\"\n    data = await api_request(\"GET\", \"\u002Fprojects\")\n    projects = data.get(\"projects\", [])\n    lines = [f\"- [{p['id']}] {p['name']} ({p['status']})\" for p in projects]\n    return \"\\n\".join(lines) if lines else \"No projects found.\"\n\n\n# --- Tools (actions with side effects) ---\n\n@mcp.tool()\nasync def create_project(name: str, description: str = \"\") -> str:\n    \"\"\"Create a new project.\n\n    Args:\n        name: Project name\n        description: Optional project description\n    \"\"\"\n    data = await api_request(\"POST\", \"\u002Fprojects\",\n                             json_body={\"name\": name, \"description\": description})\n    return f\"Created project '{data['name']}' with ID: {data['id']}\"\n\n\n@mcp.tool()\nasync def list_tasks(\n    project_id: str,\n    status: str | None = None,\n    assignee: str | None = None,\n    limit: int = 20,\n) -> str:\n    \"\"\"List tasks in a project with optional filters.\n\n    Args:\n        project_id: The project to list tasks for\n        status: Filter by 'todo', 'in_progress', or 'done' (optional)\n        assignee: Filter by assignee email (optional)\n        limit: Max tasks to return (default 20)\n    \"\"\"\n    params: dict[str, Any] = {\"limit\": min(limit, 100)}\n    if status: params[\"status\"] = status\n    if assignee: params[\"assignee\"] = assignee\n\n    data = await api_request(\"GET\", f\"\u002Fprojects\u002F{project_id}\u002Ftasks\", params=params)\n    tasks = data.get(\"tasks\", [])\n    if not tasks:\n        return \"No tasks found.\"\n\n    lines = [\n        f\"- [{t['id']}] {t['title']} | {t['status']} | {t.get('assignee', 'unassigned')}\"\n        for t in tasks\n    ]\n    return \"\\n\".join(lines)\n\n\n@mcp.tool()\nasync def create_task(\n    project_id: str, title: str,\n    description: str = \"\", priority: str = \"medium\",\n) -> str:\n    \"\"\"Create a new task in a project.\n\n    Args:\n        project_id: The project to create the task in\n        title: Task title\n        description: Task description (optional)\n        priority: 'low', 'medium', 'high', or 'urgent'\n    \"\"\"\n    data = await api_request(\n        \"POST\", f\"\u002Fprojects\u002F{project_id}\u002Ftasks\",\n        json_body={\"title\": title, \"description\": description, \"priority\": priority},\n    )\n    return f\"Created task '{data['title']}' (ID: {data['id']})\"\n\n\nif __name__ == \"__main__\":\n    mcp.run(transport=\"stdio\")\n",[150,16888,16889,16894,16899,16904,16908,16913,16917,16922,16927,16931,16936,16940,16944,16949,16954,16959,16964,16969,16974,16979,16984,16989,16993,16997,17002,17007,17012,17017,17022,17027,17032,17037,17042,17048,17053,17059,17065,17071,17077,17083,17089,17095,17100,17105,17111,17116,17122,17128,17134,17139,17145,17151,17157,17163,17169,17175,17181,17186,17191,17196,17202,17208,17214,17220,17226,17232,17238,17243,17248,17254,17260,17266,17272,17277,17283,17289,17295,17300,17306,17312,17318,17324,17329,17335,17341,17347,17353,17359,17364,17369,17374,17380,17386,17392,17397,17403,17408,17413,17419,17425,17431,17437,17442,17448,17454,17460,17466,17472,17477,17482,17488],{"__ignoreMap":148},[153,16890,16891],{"class":155,"line":156},[153,16892,16893],{},"\"\"\"MCP Server wrapping a Project Management REST API.\"\"\"\n",[153,16895,16896],{"class":155,"line":208},[153,16897,16898],{},"import os\n",[153,16900,16901],{"class":155,"line":242},[153,16902,16903],{},"from typing import Any\n",[153,16905,16906],{"class":155,"line":249},[153,16907,15410],{},[153,16909,16910],{"class":155,"line":255},[153,16911,16912],{},"from mcp.server.fastmcp import FastMCP\n",[153,16914,16915],{"class":155,"line":268},[153,16916,246],{"emptyLinePlaceholder":245},[153,16918,16919],{"class":155,"line":281},[153,16920,16921],{},"API_BASE_URL = os.environ.get(\"API_BASE_URL\", \"https:\u002F\u002Fapi.example.com\u002Fv1\")\n",[153,16923,16924],{"class":155,"line":1356},[153,16925,16926],{},"API_KEY = os.environ.get(\"API_KEY\", \"\")\n",[153,16928,16929],{"class":155,"line":1362},[153,16930,246],{"emptyLinePlaceholder":245},[153,16932,16933],{"class":155,"line":1367},[153,16934,16935],{},"mcp = FastMCP(\"project-api\")\n",[153,16937,16938],{"class":155,"line":1372},[153,16939,246],{"emptyLinePlaceholder":245},[153,16941,16942],{"class":155,"line":1378},[153,16943,246],{"emptyLinePlaceholder":245},[153,16945,16946],{"class":155,"line":1383},[153,16947,16948],{},"async def api_request(\n",[153,16950,16951],{"class":155,"line":1389},[153,16952,16953],{},"    method: str, path: str,\n",[153,16955,16956],{"class":155,"line":1395},[153,16957,16958],{},"    params: dict[str, Any] | None = None,\n",[153,16960,16961],{"class":155,"line":1401},[153,16962,16963],{},"    json_body: dict[str, Any] | None = None,\n",[153,16965,16966],{"class":155,"line":1407},[153,16967,16968],{},") -> dict[str, Any]:\n",[153,16970,16971],{"class":155,"line":1129},[153,16972,16973],{},"    \"\"\"Make an authenticated request to the REST API.\"\"\"\n",[153,16975,16976],{"class":155,"line":1417},[153,16977,16978],{},"    headers = {\n",[153,16980,16981],{"class":155,"line":1423},[153,16982,16983],{},"        \"Authorization\": f\"Bearer {API_KEY}\",\n",[153,16985,16986],{"class":155,"line":1683},[153,16987,16988],{},"        \"Content-Type\": \"application\u002Fjson\",\n",[153,16990,16991],{"class":155,"line":1688},[153,16992,3891],{},[153,16994,16995],{"class":155,"line":12900},[153,16996,15439],{},[153,16998,16999],{"class":155,"line":12906},[153,17000,17001],{},"        response = await client.request(\n",[153,17003,17004],{"class":155,"line":16075},[153,17005,17006],{},"            method, f\"{API_BASE_URL}{path}\",\n",[153,17008,17009],{"class":155,"line":16089},[153,17010,17011],{},"            headers=headers, params=params,\n",[153,17013,17014],{"class":155,"line":16096},[153,17015,17016],{},"            json=json_body, timeout=30.0,\n",[153,17018,17019],{"class":155,"line":16102},[153,17020,17021],{},"        )\n",[153,17023,17024],{"class":155,"line":16107},[153,17025,17026],{},"        response.raise_for_status()\n",[153,17028,17029],{"class":155,"line":16115},[153,17030,17031],{},"        return response.json()\n",[153,17033,17035],{"class":155,"line":17034},31,[153,17036,246],{"emptyLinePlaceholder":245},[153,17038,17040],{"class":155,"line":17039},32,[153,17041,246],{"emptyLinePlaceholder":245},[153,17043,17045],{"class":155,"line":17044},33,[153,17046,17047],{},"# --- Resources (GET, read-only) ---\n",[153,17049,17051],{"class":155,"line":17050},34,[153,17052,246],{"emptyLinePlaceholder":245},[153,17054,17056],{"class":155,"line":17055},35,[153,17057,17058],{},"@mcp.resource(\"projects:\u002F\u002Flist\")\n",[153,17060,17062],{"class":155,"line":17061},36,[153,17063,17064],{},"async def list_projects() -> str:\n",[153,17066,17068],{"class":155,"line":17067},37,[153,17069,17070],{},"    \"\"\"List all projects in the workspace.\"\"\"\n",[153,17072,17074],{"class":155,"line":17073},38,[153,17075,17076],{},"    data = await api_request(\"GET\", \"\u002Fprojects\")\n",[153,17078,17080],{"class":155,"line":17079},39,[153,17081,17082],{},"    projects = data.get(\"projects\", [])\n",[153,17084,17086],{"class":155,"line":17085},40,[153,17087,17088],{},"    lines = [f\"- [{p['id']}] {p['name']} ({p['status']})\" for p in projects]\n",[153,17090,17092],{"class":155,"line":17091},41,[153,17093,17094],{},"    return \"\\n\".join(lines) if lines else \"No projects found.\"\n",[153,17096,17098],{"class":155,"line":17097},42,[153,17099,246],{"emptyLinePlaceholder":245},[153,17101,17103],{"class":155,"line":17102},43,[153,17104,246],{"emptyLinePlaceholder":245},[153,17106,17108],{"class":155,"line":17107},44,[153,17109,17110],{},"# --- Tools (actions with side effects) ---\n",[153,17112,17114],{"class":155,"line":17113},45,[153,17115,246],{"emptyLinePlaceholder":245},[153,17117,17119],{"class":155,"line":17118},46,[153,17120,17121],{},"@mcp.tool()\n",[153,17123,17125],{"class":155,"line":17124},47,[153,17126,17127],{},"async def create_project(name: str, description: str = \"\") -> str:\n",[153,17129,17131],{"class":155,"line":17130},48,[153,17132,17133],{},"    \"\"\"Create a new project.\n",[153,17135,17137],{"class":155,"line":17136},49,[153,17138,246],{"emptyLinePlaceholder":245},[153,17140,17142],{"class":155,"line":17141},50,[153,17143,17144],{},"    Args:\n",[153,17146,17148],{"class":155,"line":17147},51,[153,17149,17150],{},"        name: Project name\n",[153,17152,17154],{"class":155,"line":17153},52,[153,17155,17156],{},"        description: Optional project description\n",[153,17158,17160],{"class":155,"line":17159},53,[153,17161,17162],{},"    \"\"\"\n",[153,17164,17166],{"class":155,"line":17165},54,[153,17167,17168],{},"    data = await api_request(\"POST\", \"\u002Fprojects\",\n",[153,17170,17172],{"class":155,"line":17171},55,[153,17173,17174],{},"                             json_body={\"name\": name, \"description\": description})\n",[153,17176,17178],{"class":155,"line":17177},56,[153,17179,17180],{},"    return f\"Created project '{data['name']}' with ID: {data['id']}\"\n",[153,17182,17184],{"class":155,"line":17183},57,[153,17185,246],{"emptyLinePlaceholder":245},[153,17187,17189],{"class":155,"line":17188},58,[153,17190,246],{"emptyLinePlaceholder":245},[153,17192,17194],{"class":155,"line":17193},59,[153,17195,17121],{},[153,17197,17199],{"class":155,"line":17198},60,[153,17200,17201],{},"async def list_tasks(\n",[153,17203,17205],{"class":155,"line":17204},61,[153,17206,17207],{},"    project_id: str,\n",[153,17209,17211],{"class":155,"line":17210},62,[153,17212,17213],{},"    status: str | None = None,\n",[153,17215,17217],{"class":155,"line":17216},63,[153,17218,17219],{},"    assignee: str | None = None,\n",[153,17221,17223],{"class":155,"line":17222},64,[153,17224,17225],{},"    limit: int = 20,\n",[153,17227,17229],{"class":155,"line":17228},65,[153,17230,17231],{},") -> str:\n",[153,17233,17235],{"class":155,"line":17234},66,[153,17236,17237],{},"    \"\"\"List tasks in a project with optional filters.\n",[153,17239,17241],{"class":155,"line":17240},67,[153,17242,246],{"emptyLinePlaceholder":245},[153,17244,17246],{"class":155,"line":17245},68,[153,17247,17144],{},[153,17249,17251],{"class":155,"line":17250},69,[153,17252,17253],{},"        project_id: The project to list tasks for\n",[153,17255,17257],{"class":155,"line":17256},70,[153,17258,17259],{},"        status: Filter by 'todo', 'in_progress', or 'done' (optional)\n",[153,17261,17263],{"class":155,"line":17262},71,[153,17264,17265],{},"        assignee: Filter by assignee email (optional)\n",[153,17267,17269],{"class":155,"line":17268},72,[153,17270,17271],{},"        limit: Max tasks to return (default 20)\n",[153,17273,17275],{"class":155,"line":17274},73,[153,17276,17162],{},[153,17278,17280],{"class":155,"line":17279},74,[153,17281,17282],{},"    params: dict[str, Any] = {\"limit\": min(limit, 100)}\n",[153,17284,17286],{"class":155,"line":17285},75,[153,17287,17288],{},"    if status: params[\"status\"] = status\n",[153,17290,17292],{"class":155,"line":17291},76,[153,17293,17294],{},"    if assignee: params[\"assignee\"] = assignee\n",[153,17296,17298],{"class":155,"line":17297},77,[153,17299,246],{"emptyLinePlaceholder":245},[153,17301,17303],{"class":155,"line":17302},78,[153,17304,17305],{},"    data = await api_request(\"GET\", f\"\u002Fprojects\u002F{project_id}\u002Ftasks\", params=params)\n",[153,17307,17309],{"class":155,"line":17308},79,[153,17310,17311],{},"    tasks = data.get(\"tasks\", [])\n",[153,17313,17315],{"class":155,"line":17314},80,[153,17316,17317],{},"    if not tasks:\n",[153,17319,17321],{"class":155,"line":17320},81,[153,17322,17323],{},"        return \"No tasks found.\"\n",[153,17325,17327],{"class":155,"line":17326},82,[153,17328,246],{"emptyLinePlaceholder":245},[153,17330,17332],{"class":155,"line":17331},83,[153,17333,17334],{},"    lines = [\n",[153,17336,17338],{"class":155,"line":17337},84,[153,17339,17340],{},"        f\"- [{t['id']}] {t['title']} | {t['status']} | {t.get('assignee', 'unassigned')}\"\n",[153,17342,17344],{"class":155,"line":17343},85,[153,17345,17346],{},"        for t in tasks\n",[153,17348,17350],{"class":155,"line":17349},86,[153,17351,17352],{},"    ]\n",[153,17354,17356],{"class":155,"line":17355},87,[153,17357,17358],{},"    return \"\\n\".join(lines)\n",[153,17360,17362],{"class":155,"line":17361},88,[153,17363,246],{"emptyLinePlaceholder":245},[153,17365,17367],{"class":155,"line":17366},89,[153,17368,246],{"emptyLinePlaceholder":245},[153,17370,17372],{"class":155,"line":17371},90,[153,17373,17121],{},[153,17375,17377],{"class":155,"line":17376},91,[153,17378,17379],{},"async def create_task(\n",[153,17381,17383],{"class":155,"line":17382},92,[153,17384,17385],{},"    project_id: str, title: str,\n",[153,17387,17389],{"class":155,"line":17388},93,[153,17390,17391],{},"    description: str = \"\", priority: str = \"medium\",\n",[153,17393,17395],{"class":155,"line":17394},94,[153,17396,17231],{},[153,17398,17400],{"class":155,"line":17399},95,[153,17401,17402],{},"    \"\"\"Create a new task in a project.\n",[153,17404,17406],{"class":155,"line":17405},96,[153,17407,246],{"emptyLinePlaceholder":245},[153,17409,17411],{"class":155,"line":17410},97,[153,17412,17144],{},[153,17414,17416],{"class":155,"line":17415},98,[153,17417,17418],{},"        project_id: The project to create the task in\n",[153,17420,17422],{"class":155,"line":17421},99,[153,17423,17424],{},"        title: Task title\n",[153,17426,17428],{"class":155,"line":17427},100,[153,17429,17430],{},"        description: Task description (optional)\n",[153,17432,17434],{"class":155,"line":17433},101,[153,17435,17436],{},"        priority: 'low', 'medium', 'high', or 'urgent'\n",[153,17438,17440],{"class":155,"line":17439},102,[153,17441,17162],{},[153,17443,17445],{"class":155,"line":17444},103,[153,17446,17447],{},"    data = await api_request(\n",[153,17449,17451],{"class":155,"line":17450},104,[153,17452,17453],{},"        \"POST\", f\"\u002Fprojects\u002F{project_id}\u002Ftasks\",\n",[153,17455,17457],{"class":155,"line":17456},105,[153,17458,17459],{},"        json_body={\"title\": title, \"description\": description, \"priority\": priority},\n",[153,17461,17463],{"class":155,"line":17462},106,[153,17464,17465],{},"    )\n",[153,17467,17469],{"class":155,"line":17468},107,[153,17470,17471],{},"    return f\"Created task '{data['title']}' (ID: {data['id']})\"\n",[153,17473,17475],{"class":155,"line":17474},108,[153,17476,246],{"emptyLinePlaceholder":245},[153,17478,17480],{"class":155,"line":17479},109,[153,17481,246],{"emptyLinePlaceholder":245},[153,17483,17485],{"class":155,"line":17484},110,[153,17486,17487],{},"if __name__ == \"__main__\":\n",[153,17489,17491],{"class":155,"line":17490},111,[153,17492,17493],{},"    mcp.run(transport=\"stdio\")\n",[35,17495,17497],{"id":17496},"step-4-handle-authentication-securely","Step 4 — Handle Authentication Securely",[12,17499,17500],{},"Never hardcode API keys. Use environment variables:",[143,17502,17504],{"className":3807,"code":17503,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"project-api\": {\n      \"command\": \"uv\",\n      \"args\": [\"--directory\", \"\u002Fpath\u002Fto\u002Fapi-mcp-server\", \"run\", \"server.py\"],\n      \"env\": {\n        \"API_BASE_URL\": \"https:\u002F\u002Fapi.example.com\u002Fv1\",\n        \"API_KEY\": \"sk-your-api-key-here\"\n      }\n    }\n  }\n}\n",[150,17505,17506,17510,17516,17523,17534,17560,17566,17578,17588,17592,17596,17600],{"__ignoreMap":148},[153,17507,17508],{"class":155,"line":156},[153,17509,3816],{"class":313},[153,17511,17512,17514],{"class":155,"line":208},[153,17513,3821],{"class":163},[153,17515,3824],{"class":313},[153,17517,17518,17521],{"class":155,"line":242},[153,17519,17520],{"class":163},"    \"project-api\"",[153,17522,3824],{"class":313},[153,17524,17525,17527,17529,17532],{"class":155,"line":249},[153,17526,3836],{"class":163},[153,17528,3839],{"class":313},[153,17530,17531],{"class":167},"\"uv\"",[153,17533,3845],{"class":313},[153,17535,17536,17538,17540,17543,17545,17548,17550,17553,17555,17558],{"class":155,"line":255},[153,17537,3850],{"class":163},[153,17539,3853],{"class":313},[153,17541,17542],{"class":167},"\"--directory\"",[153,17544,528],{"class":313},[153,17546,17547],{"class":167},"\"\u002Fpath\u002Fto\u002Fapi-mcp-server\"",[153,17549,528],{"class":313},[153,17551,17552],{"class":167},"\"run\"",[153,17554,528],{"class":313},[153,17556,17557],{"class":167},"\"server.py\"",[153,17559,3864],{"class":313},[153,17561,17562,17564],{"class":155,"line":268},[153,17563,3869],{"class":163},[153,17565,3824],{"class":313},[153,17567,17568,17571,17573,17576],{"class":155,"line":281},[153,17569,17570],{"class":163},"        \"API_BASE_URL\"",[153,17572,3839],{"class":313},[153,17574,17575],{"class":167},"\"https:\u002F\u002Fapi.example.com\u002Fv1\"",[153,17577,3845],{"class":313},[153,17579,17580,17583,17585],{"class":155,"line":1356},[153,17581,17582],{"class":163},"        \"API_KEY\"",[153,17584,3839],{"class":313},[153,17586,17587],{"class":167},"\"sk-your-api-key-here\"\n",[153,17589,17590],{"class":155,"line":1362},[153,17591,3886],{"class":313},[153,17593,17594],{"class":155,"line":1367},[153,17595,3891],{"class":313},[153,17597,17598],{"class":155,"line":1372},[153,17599,3896],{"class":313},[153,17601,17602],{"class":155,"line":1378},[153,17603,3901],{"class":313},[116,17605,17606],{"type":452},[12,17607,17608,17609,17612,17613,17616],{},"Never commit API keys to ",[150,17610,17611],{},".mcp.json",". Use environment variable references like ",[150,17614,17615],{},"\"API_KEY\": \"${PROJECT_API_KEY}\""," in Claude Code configs.",[35,17618,17620],{"id":17619},"step-5-error-handling","Step 5 — Error Handling",[12,17622,17623],{},"Wrap API errors gracefully so the LLM gets useful feedback:",[143,17625,17627],{"className":15396,"code":17626,"language":15398,"meta":148,"style":148},"import httpx\n\n@mcp.tool()\nasync def safe_api_call(endpoint: str) -> str:\n    \"\"\"Robust error handling example.\"\"\"\n    try:\n        data = await api_request(\"GET\", endpoint)\n        return str(data)\n    except httpx.HTTPStatusError as e:\n        if e.response.status_code == 404:\n            return f\"Not found: {endpoint}\"\n        elif e.response.status_code == 403:\n            return \"Permission denied. Check your API key.\"\n        elif e.response.status_code == 429:\n            return \"Rate limited. Try again shortly.\"\n        return f\"API error {e.response.status_code}: {e.response.text[:200]}\"\n    except httpx.TimeoutException:\n        return \"Request timed out.\"\n",[150,17628,17629,17633,17637,17641,17646,17651,17656,17661,17666,17671,17676,17681,17686,17691,17696,17701,17706,17711],{"__ignoreMap":148},[153,17630,17631],{"class":155,"line":156},[153,17632,15410],{},[153,17634,17635],{"class":155,"line":208},[153,17636,246],{"emptyLinePlaceholder":245},[153,17638,17639],{"class":155,"line":242},[153,17640,17121],{},[153,17642,17643],{"class":155,"line":249},[153,17644,17645],{},"async def safe_api_call(endpoint: str) -> str:\n",[153,17647,17648],{"class":155,"line":255},[153,17649,17650],{},"    \"\"\"Robust error handling example.\"\"\"\n",[153,17652,17653],{"class":155,"line":268},[153,17654,17655],{},"    try:\n",[153,17657,17658],{"class":155,"line":281},[153,17659,17660],{},"        data = await api_request(\"GET\", endpoint)\n",[153,17662,17663],{"class":155,"line":1356},[153,17664,17665],{},"        return str(data)\n",[153,17667,17668],{"class":155,"line":1362},[153,17669,17670],{},"    except httpx.HTTPStatusError as e:\n",[153,17672,17673],{"class":155,"line":1367},[153,17674,17675],{},"        if e.response.status_code == 404:\n",[153,17677,17678],{"class":155,"line":1372},[153,17679,17680],{},"            return f\"Not found: {endpoint}\"\n",[153,17682,17683],{"class":155,"line":1378},[153,17684,17685],{},"        elif e.response.status_code == 403:\n",[153,17687,17688],{"class":155,"line":1383},[153,17689,17690],{},"            return \"Permission denied. Check your API key.\"\n",[153,17692,17693],{"class":155,"line":1389},[153,17694,17695],{},"        elif e.response.status_code == 429:\n",[153,17697,17698],{"class":155,"line":1395},[153,17699,17700],{},"            return \"Rate limited. Try again shortly.\"\n",[153,17702,17703],{"class":155,"line":1401},[153,17704,17705],{},"        return f\"API error {e.response.status_code}: {e.response.text[:200]}\"\n",[153,17707,17708],{"class":155,"line":1407},[153,17709,17710],{},"    except httpx.TimeoutException:\n",[153,17712,17713],{"class":155,"line":1129},[153,17714,17715],{},"        return \"Request timed out.\"\n",[35,17717,17719],{"id":17718},"step-6-schema-design-for-llms","Step 6 — Schema Design for LLMs",[12,17721,17722],{},"LLMs work best with simple, clear schemas:",[143,17724,17726],{"className":15396,"code":17725,"language":15398,"meta":148,"style":148},"# BAD — nested objects confuse LLMs\n@mcp.tool()\nasync def create_user(data: dict) -> str: ...\n\n# GOOD — flat, typed parameters with descriptions\n@mcp.tool()\nasync def create_user(\n    name: str, email: str, role: str = \"member\"\n) -> str:\n    \"\"\"Create a new user account.\n\n    Args:\n        name: Full name of the user\n        email: Email address (must be unique)\n        role: User role — 'member', 'admin', or 'viewer'\n    \"\"\"\n",[150,17727,17728,17733,17737,17742,17746,17751,17755,17760,17765,17769,17774,17778,17782,17787,17792,17797],{"__ignoreMap":148},[153,17729,17730],{"class":155,"line":156},[153,17731,17732],{},"# BAD — nested objects confuse LLMs\n",[153,17734,17735],{"class":155,"line":208},[153,17736,17121],{},[153,17738,17739],{"class":155,"line":242},[153,17740,17741],{},"async def create_user(data: dict) -> str: ...\n",[153,17743,17744],{"class":155,"line":249},[153,17745,246],{"emptyLinePlaceholder":245},[153,17747,17748],{"class":155,"line":255},[153,17749,17750],{},"# GOOD — flat, typed parameters with descriptions\n",[153,17752,17753],{"class":155,"line":268},[153,17754,17121],{},[153,17756,17757],{"class":155,"line":281},[153,17758,17759],{},"async def create_user(\n",[153,17761,17762],{"class":155,"line":1356},[153,17763,17764],{},"    name: str, email: str, role: str = \"member\"\n",[153,17766,17767],{"class":155,"line":1362},[153,17768,17231],{},[153,17770,17771],{"class":155,"line":1367},[153,17772,17773],{},"    \"\"\"Create a new user account.\n",[153,17775,17776],{"class":155,"line":1372},[153,17777,246],{"emptyLinePlaceholder":245},[153,17779,17780],{"class":155,"line":1378},[153,17781,17144],{},[153,17783,17784],{"class":155,"line":1383},[153,17785,17786],{},"        name: Full name of the user\n",[153,17788,17789],{"class":155,"line":1389},[153,17790,17791],{},"        email: Email address (must be unique)\n",[153,17793,17794],{"class":155,"line":1395},[153,17795,17796],{},"        role: User role — 'member', 'admin', or 'viewer'\n",[153,17798,17799],{"class":155,"line":1401},[153,17800,17162],{},[12,17802,17803,17806],{},[45,17804,17805],{},"Return human-readable text",", not raw JSON:",[143,17808,17810],{"className":15396,"code":17809,"language":15398,"meta":148,"style":148},"# BAD\nreturn json.dumps(api_response)\n\n# GOOD\nreturn f\"Created user {data['name']} (ID: {data['id']}) with role {data['role']}\"\n",[150,17811,17812,17817,17822,17826,17831],{"__ignoreMap":148},[153,17813,17814],{"class":155,"line":156},[153,17815,17816],{},"# BAD\n",[153,17818,17819],{"class":155,"line":208},[153,17820,17821],{},"return json.dumps(api_response)\n",[153,17823,17824],{"class":155,"line":242},[153,17825,246],{"emptyLinePlaceholder":245},[153,17827,17828],{"class":155,"line":249},[153,17829,17830],{},"# GOOD\n",[153,17832,17833],{"class":155,"line":255},[153,17834,17835],{},"return f\"Created user {data['name']} (ID: {data['id']}) with role {data['role']}\"\n",[35,17837,17839],{"id":17838},"step-7-deploy-as-remote-http-server","Step 7 — Deploy as Remote HTTP Server",[12,17841,17842],{},"For production, use streamable HTTP transport:",[143,17844,17846],{"className":15396,"code":17845,"language":15398,"meta":148,"style":148},"mcp = FastMCP(\"project-api\", stateless_http=True)\n\n# ... define tools and resources ...\n\nif __name__ == \"__main__\":\n    mcp.run(transport=\"streamable-http\", host=\"0.0.0.0\", port=8080)\n",[150,17847,17848,17853,17857,17862,17866,17870],{"__ignoreMap":148},[153,17849,17850],{"class":155,"line":156},[153,17851,17852],{},"mcp = FastMCP(\"project-api\", stateless_http=True)\n",[153,17854,17855],{"class":155,"line":208},[153,17856,246],{"emptyLinePlaceholder":245},[153,17858,17859],{"class":155,"line":242},[153,17860,17861],{},"# ... define tools and resources ...\n",[153,17863,17864],{"class":155,"line":249},[153,17865,246],{"emptyLinePlaceholder":245},[153,17867,17868],{"class":155,"line":255},[153,17869,17487],{},[153,17871,17872],{"class":155,"line":268},[153,17873,17874],{},"    mcp.run(transport=\"streamable-http\", host=\"0.0.0.0\", port=8080)\n",[12,17876,17877],{},"Connect from Claude Code:",[143,17879,17881],{"className":145,"code":17880,"language":147,"meta":148,"style":148},"claude mcp add --transport http project-api https:\u002F\u002Fyour-server.com:8080\u002Fmcp\n",[150,17882,17883],{"__ignoreMap":148},[153,17884,17885,17887,17890,17892,17895,17898,17901],{"class":155,"line":156},[153,17886,12966],{"class":159},[153,17888,17889],{"class":167}," mcp",[153,17891,1447],{"class":167},[153,17893,17894],{"class":163}," --transport",[153,17896,17897],{"class":167}," http",[153,17899,17900],{"class":167}," project-api",[153,17902,17903],{"class":167}," https:\u002F\u002Fyour-server.com:8080\u002Fmcp\n",[35,17905,17907],{"id":17906},"step-8-handling-large-apis","Step 8 — Handling Large APIs",[12,17909,17910],{},"For APIs with 50+ endpoints, split into focused servers:",[143,17912,17915],{"className":17913,"code":17914,"language":1280},[1278],"api-users-mcp\u002F      → User management tools\napi-projects-mcp\u002F   → Project tools\napi-billing-mcp\u002F    → Billing and payment tools\n",[150,17916,17914],{"__ignoreMap":148},[12,17918,17919],{},"Each server stays focused. Claude Code handles multiple MCP servers simultaneously.",[116,17921,17922],{"type":118},[12,17923,17924],{},"Cursor has a 40-tool limit per server. Keep tool counts under 30 for best LLM performance across all clients.",[35,17926,17928],{"id":17927},"step-9-test-everything","Step 9 — Test Everything",[143,17930,17932],{"className":145,"code":17931,"language":147,"meta":148,"style":148},"# Visual debugging\nnpx @modelcontextprotocol\u002Finspector uv run server.py\n\n# Dev mode\nmcp dev server.py\n\n# Test in Claude Code\nclaude mcp add --transport stdio project-api \\\n  --env API_KEY=sk-test --env API_BASE_URL=https:\u002F\u002Fapi.example.com\u002Fv1 \\\n  -- uv --directory \u002Fpath\u002Fto\u002Fserver run server.py\n",[150,17933,17934,17939,17953,17957,17962,17971,17975,17980,17997,18013],{"__ignoreMap":148},[153,17935,17936],{"class":155,"line":156},[153,17937,17938],{"class":211},"# Visual debugging\n",[153,17940,17941,17943,17946,17949,17951],{"class":155,"line":208},[153,17942,5190],{"class":159},[153,17944,17945],{"class":167}," @modelcontextprotocol\u002Finspector",[153,17947,17948],{"class":167}," uv",[153,17950,306],{"class":167},[153,17952,16879],{"class":167},[153,17954,17955],{"class":155,"line":242},[153,17956,246],{"emptyLinePlaceholder":245},[153,17958,17959],{"class":155,"line":249},[153,17960,17961],{"class":211},"# Dev mode\n",[153,17963,17964,17966,17969],{"class":155,"line":255},[153,17965,5531],{"class":159},[153,17967,17968],{"class":167}," dev",[153,17970,16879],{"class":167},[153,17972,17973],{"class":155,"line":268},[153,17974,246],{"emptyLinePlaceholder":245},[153,17976,17977],{"class":155,"line":281},[153,17978,17979],{"class":211},"# Test in Claude Code\n",[153,17981,17982,17984,17986,17988,17990,17993,17995],{"class":155,"line":1356},[153,17983,12966],{"class":159},[153,17985,17889],{"class":167},[153,17987,1447],{"class":167},[153,17989,17894],{"class":163},[153,17991,17992],{"class":167}," stdio",[153,17994,17900],{"class":167},[153,17996,372],{"class":163},[153,17998,17999,18002,18005,18008,18011],{"class":155,"line":1362},[153,18000,18001],{"class":163},"  --env",[153,18003,18004],{"class":167}," API_KEY=sk-test",[153,18006,18007],{"class":163}," --env",[153,18009,18010],{"class":167}," API_BASE_URL=https:\u002F\u002Fapi.example.com\u002Fv1",[153,18012,372],{"class":163},[153,18014,18015,18018,18020,18023,18026,18028],{"class":155,"line":1367},[153,18016,18017],{"class":163},"  --",[153,18019,17948],{"class":167},[153,18021,18022],{"class":163}," --directory",[153,18024,18025],{"class":167}," \u002Fpath\u002Fto\u002Fserver",[153,18027,306],{"class":167},[153,18029,16879],{"class":167},[138,18031,2514],{"id":2513},[12,18033,18034,18037],{},[45,18035,18036],{},"Q: How do I convert a REST API to MCP?","\nA: Map GET endpoints (no params) to MCP Resources, and everything else (POST, PUT, DELETE, parameterized GET) to MCP Tools. Use environment variables for authentication.",[12,18039,18040,18043],{},[45,18041,18042],{},"Q: Should I create one large MCP server or multiple small ones?","\nA: Multiple focused servers (under 30 tools each) perform better. LLMs choose more accurately when tool count is manageable.",[12,18045,18046,18049],{},[45,18047,18048],{},"Q: Can I use OAuth instead of API keys?","\nA: Yes, but OAuth flows are more complex. Store the access token as an environment variable, and handle token refresh in your server's lifespan manager.",[35,18051,1020],{"id":1019},[19,18053,18054,18061,18068,18074],{},[22,18055,18056,18060],{},[71,18057,18059],{"href":18058},"\u002Fguide\u002Fbuild-mcp-server-python","How to Build an MCP Server in Python"," — Python SDK basics",[22,18062,18063,18067],{},[71,18064,18066],{"href":18065},"\u002Fguide\u002Fbuild-mcp-server-typescript","How to Build an MCP Server in TypeScript"," — TypeScript SDK",[22,18069,18070,18073],{},[71,18071,16630],{"href":5477,"rel":18072},[113]," — see real examples",[22,18075,18076,18078],{},[71,18077,16623],{"href":16622}," — another extension model",[1074,18080,18081],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":148,"searchDepth":208,"depth":208,"links":18083},[18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18097],{"id":78,"depth":208,"text":79},{"id":16724,"depth":208,"text":16725},{"id":16810,"depth":208,"text":16811},{"id":16823,"depth":208,"text":16824},{"id":16882,"depth":208,"text":16883},{"id":17496,"depth":208,"text":17497},{"id":17619,"depth":208,"text":17620},{"id":17718,"depth":208,"text":17719},{"id":17838,"depth":208,"text":17839},{"id":17906,"depth":208,"text":17907},{"id":17927,"depth":208,"text":17928,"children":18095},[18096],{"id":2513,"depth":242,"text":2514},{"id":1019,"depth":208,"text":1020},"Convert any REST API into an MCP server so AI tools can use it. Covers endpoint mapping, authentication, error handling, and deployment with Python and TypeScript examples.","将任何 REST API 转换为 MCP 服务器，让 AI 工具直接调用。涵盖端点映射、认证、错误处理和部署，含 Python 和 TypeScript 示例。",[18101,18104,18107,18110,18113],{"q":18102,"a":18103},"How do I convert a REST API to an MCP server?","Map GET endpoints without parameters to MCP Resources (read-only data), and map everything else — POST, PUT, DELETE, parameterized GET — to MCP Tools. Use FastMCP decorators (@mcp.resource, @mcp.tool) and an async httpx client to make authenticated requests with bearer tokens from environment variables.",{"q":18105,"a":18106},"Should I create one large MCP server or multiple small ones?","Multiple focused servers under 30 tools each perform better — LLMs choose tools more accurately when the count is manageable. For APIs with 50+ endpoints, split by domain (users, projects, billing) into separate servers. Cursor enforces a 40-tool limit per server.",{"q":18108,"a":18109},"How do I handle API authentication in an MCP server?","Never hardcode API keys. Read them from os.environ at startup, then set them in Claude Code's mcp.json under env. Use environment variable references like \"API_KEY\": \"${PROJECT_API_KEY}\" to avoid committing secrets. Wrap 401\u002F403 errors to return clear messages to the LLM.",{"q":18111,"a":18112},"Can I use OAuth instead of API keys for MCP authentication?","Yes, but OAuth flows are more complex. Store the access token as an environment variable and handle token refresh in your server's lifespan manager. For most internal APIs, a bearer token or API key passed via env vars is simpler and equally secure.",{"q":18114,"a":18115},"How do I deploy an MCP server as a remote HTTP service?","Use FastMCP with transport=\"streamable-http\", set stateless_http=True, and bind to host 0.0.0.0 on your chosen port. Then connect from Claude Code with: claude mcp add --transport http project-api https:\u002F\u002Fyour-server.com:8080\u002Fmcp. Good for teams sharing a central MCP server.","\u002Fguide\u002Fimages\u002Fbuild-mcp-api-hero.svg",{},"\u002Fen\u002Fguide\u002Fbuild-mcp-server-api",{"title":16693,"description":18098},"en\u002Fguide\u002Fbuild-mcp-server-api",[5531,18122,1106,15398,18123],"api","typescript","如何为你的 API 构建 MCP 服务器","To build an MCP server for your REST API, map GET endpoints with no parameters to MCP Resources and everything else (POST, PUT, DELETE, parameterized GET) to MCP Tools. Use FastMCP in Python with httpx for authenticated API calls, inject API keys via environment variables, return human-readable strings instead of raw JSON, and keep each server under 30 tools for best LLM performance.","fnAaC6nmOt1yiBGh4s4t94BsMCktXjzPaJXSa8CCPIE",{"id":18128,"title":18129,"answer":6,"answerZh":6,"author":7,"body":18130,"category":1106,"description":19594,"descriptionZh":19595,"extension":1109,"faqs":19596,"faqsZh":6,"image":19612,"meta":19613,"navigation":245,"path":19614,"publishedAt":14945,"readTime":1395,"seo":19615,"stem":19616,"tags":19617,"titleZh":19618,"tldr":19619,"tldrZh":6,"updatedAt":14945,"__hash__":19620},"docs_en\u002Fen\u002Fguide\u002Fbuild-mcp-server-python.md","How to Build an MCP Server in Python (Step-by-Step)",{"type":9,"value":18131,"toc":19575},[18132,18135,18137,18158,18162,18168,18186,18194,18198,18204,18228,18231,18278,18284,18288,18294,18382,18385,18405,18409,18412,18465,18472,18476,18479,18543,18547,18659,18663,18666,18816,18820,19123,19127,19130,19147,19154,19157,19170,19174,19211,19217,19284,19288,19295,19359,19363,19368,19432,19452,19456,19518,19520,19526,19536,19546,19548,19572],[12,18133,18134],{},"Learn how to build a production-ready MCP server in Python using the official FastMCP SDK, test it with MCP Inspector, and configure it in Claude Code, Claude Desktop, and Cursor.",[35,18136,79],{"id":78},[19,18138,18139,18142,18149,18152],{},[22,18140,18141],{},"Python 3.10 or higher",[22,18143,18144,18146,18147],{},[150,18145,16711],{}," package manager (recommended) or ",[150,18148,16334],{},[22,18150,18151],{},"Basic Python knowledge",[22,18153,14972,18154,18157],{},[71,18155,1159],{"href":1157,"rel":18156},[113],", Claude Desktop, or Cursor installed",[35,18159,18161],{"id":18160},"what-is-mcp","What is MCP?",[12,18163,9090,18164,18167],{},[45,18165,18166],{},"Model Context Protocol (MCP)"," is an open standard created by Anthropic that lets you build servers exposing data and functionality to LLM applications. Think of it like a web API designed for AI interactions. MCP servers provide three capabilities:",[19,18169,18170,18175,18180],{},[22,18171,18172,18174],{},[45,18173,16761],{}," — Functions the LLM can call (like POST endpoints)",[22,18176,18177,18179],{},[45,18178,16750],{}," — Read-only data the LLM can access (like GET endpoints)",[22,18181,18182,18185],{},[45,18183,18184],{},"Prompts"," — Reusable templates for LLM interactions",[12,18187,18188,18189,18193],{},"MCP is now an open standard under the Linux Foundation, supported by Claude Code, Cursor, Codex CLI, Gemini CLI, and VS Code. Browse ",[71,18190,18192],{"href":5477,"rel":18191},[113],"MCP server configs on TokRepo"," to see what's already available.",[35,18195,18197],{"id":18196},"step-1-set-up-your-environment","Step 1 — Set Up Your Environment",[12,18199,18200,18201,18203],{},"Install ",[150,18202,16711],{}," (the recommended Python package manager for MCP development):",[143,18205,18207],{"className":145,"code":18206,"language":147,"meta":148,"style":148},"# macOS \u002F Linux\ncurl -LsSf https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.sh | sh\n",[150,18208,18209,18214],{"__ignoreMap":148},[153,18210,18211],{"class":155,"line":156},[153,18212,18213],{"class":211},"# macOS \u002F Linux\n",[153,18215,18216,18218,18221,18224,18226],{"class":155,"line":208},[153,18217,160],{"class":159},[153,18219,18220],{"class":163}," -LsSf",[153,18222,18223],{"class":167}," https:\u002F\u002Fastral.sh\u002Fuv\u002Finstall.sh",[153,18225,172],{"class":171},[153,18227,175],{"class":159},[12,18229,18230],{},"Create your project:",[143,18232,18234],{"className":145,"code":18233,"language":147,"meta":148,"style":148},"uv init my-mcp-server\ncd my-mcp-server\nuv venv && source .venv\u002Fbin\u002Factivate\nuv add \"mcp[cli]\"\ntouch server.py\n",[150,18235,18236,18245,18251,18263,18272],{"__ignoreMap":148},[153,18237,18238,18240,18242],{"class":155,"line":156},[153,18239,16711],{"class":159},[153,18241,16836],{"class":167},[153,18243,18244],{"class":167}," my-mcp-server\n",[153,18246,18247,18249],{"class":155,"line":208},[153,18248,1233],{"class":163},[153,18250,18244],{"class":167},[153,18252,18253,18255,18257,18259,18261],{"class":155,"line":242},[153,18254,16711],{"class":159},[153,18256,16852],{"class":167},[153,18258,16855],{"class":313},[153,18260,5702],{"class":163},[153,18262,16860],{"class":167},[153,18264,18265,18267,18269],{"class":155,"line":249},[153,18266,16711],{"class":159},[153,18268,1447],{"class":167},[153,18270,18271],{"class":167}," \"mcp[cli]\"\n",[153,18273,18274,18276],{"class":155,"line":255},[153,18275,12611],{"class":159},[153,18277,16879],{"class":167},[12,18279,9090,18280,18283],{},[150,18281,18282],{},"mcp[cli]"," extra installs the MCP CLI tools for testing. The current SDK version is v1.27.0.",[35,18285,18287],{"id":18286},"step-2-create-a-basic-mcp-server","Step 2 — Create a Basic MCP Server",[12,18289,18290,18291,726],{},"Create ",[150,18292,18293],{},"server.py",[143,18295,18297],{"className":15396,"code":18296,"language":15398,"meta":148,"style":148},"from mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"my-first-server\")\n\n\n@mcp.tool()\ndef add(a: int, b: int) -> int:\n    \"\"\"Add two numbers together.\"\"\"\n    return a + b\n\n\n@mcp.tool()\ndef multiply(a: int, b: int) -> int:\n    \"\"\"Multiply two numbers together.\"\"\"\n    return a * b\n\n\nif __name__ == \"__main__\":\n    mcp.run(transport=\"stdio\")\n",[150,18298,18299,18303,18307,18312,18316,18320,18324,18329,18334,18339,18343,18347,18351,18356,18361,18366,18370,18374,18378],{"__ignoreMap":148},[153,18300,18301],{"class":155,"line":156},[153,18302,16912],{},[153,18304,18305],{"class":155,"line":208},[153,18306,246],{"emptyLinePlaceholder":245},[153,18308,18309],{"class":155,"line":242},[153,18310,18311],{},"mcp = FastMCP(\"my-first-server\")\n",[153,18313,18314],{"class":155,"line":249},[153,18315,246],{"emptyLinePlaceholder":245},[153,18317,18318],{"class":155,"line":255},[153,18319,246],{"emptyLinePlaceholder":245},[153,18321,18322],{"class":155,"line":268},[153,18323,17121],{},[153,18325,18326],{"class":155,"line":281},[153,18327,18328],{},"def add(a: int, b: int) -> int:\n",[153,18330,18331],{"class":155,"line":1356},[153,18332,18333],{},"    \"\"\"Add two numbers together.\"\"\"\n",[153,18335,18336],{"class":155,"line":1362},[153,18337,18338],{},"    return a + b\n",[153,18340,18341],{"class":155,"line":1367},[153,18342,246],{"emptyLinePlaceholder":245},[153,18344,18345],{"class":155,"line":1372},[153,18346,246],{"emptyLinePlaceholder":245},[153,18348,18349],{"class":155,"line":1378},[153,18350,17121],{},[153,18352,18353],{"class":155,"line":1383},[153,18354,18355],{},"def multiply(a: int, b: int) -> int:\n",[153,18357,18358],{"class":155,"line":1389},[153,18359,18360],{},"    \"\"\"Multiply two numbers together.\"\"\"\n",[153,18362,18363],{"class":155,"line":1395},[153,18364,18365],{},"    return a * b\n",[153,18367,18368],{"class":155,"line":1401},[153,18369,246],{"emptyLinePlaceholder":245},[153,18371,18372],{"class":155,"line":1407},[153,18373,246],{"emptyLinePlaceholder":245},[153,18375,18376],{"class":155,"line":1129},[153,18377,17487],{},[153,18379,18380],{"class":155,"line":1417},[153,18381,17493],{},[12,18383,18384],{},"Key points:",[19,18386,18387,18393,18399],{},[22,18388,18389,18392],{},[150,18390,18391],{},"FastMCP"," uses Python type hints and docstrings to auto-generate tool schemas",[22,18394,9090,18395,18398],{},[150,18396,18397],{},"@mcp.tool()"," decorator registers a function as an MCP tool",[22,18400,18401,18404],{},[150,18402,18403],{},"transport=\"stdio\""," communicates via stdin\u002Fstdout (default for local dev)",[35,18406,18408],{"id":18407},"step-3-add-resources","Step 3 — Add Resources",[12,18410,18411],{},"Resources expose read-only data:",[143,18413,18415],{"className":15396,"code":18414,"language":15398,"meta":148,"style":148},"@mcp.resource(\"config:\u002F\u002Fapp-settings\")\ndef get_settings() -> str:\n    \"\"\"Return application settings.\"\"\"\n    return '{\"theme\": \"dark\", \"language\": \"en\", \"version\": \"2.1.0\"}'\n\n\n@mcp.resource(\"file:\u002F\u002Fdocuments\u002F{name}\")\ndef read_document(name: str) -> str:\n    \"\"\"Read a document by name.\"\"\"\n    return f\"Content of document: {name}\"\n",[150,18416,18417,18422,18427,18432,18437,18441,18445,18450,18455,18460],{"__ignoreMap":148},[153,18418,18419],{"class":155,"line":156},[153,18420,18421],{},"@mcp.resource(\"config:\u002F\u002Fapp-settings\")\n",[153,18423,18424],{"class":155,"line":208},[153,18425,18426],{},"def get_settings() -> str:\n",[153,18428,18429],{"class":155,"line":242},[153,18430,18431],{},"    \"\"\"Return application settings.\"\"\"\n",[153,18433,18434],{"class":155,"line":249},[153,18435,18436],{},"    return '{\"theme\": \"dark\", \"language\": \"en\", \"version\": \"2.1.0\"}'\n",[153,18438,18439],{"class":155,"line":255},[153,18440,246],{"emptyLinePlaceholder":245},[153,18442,18443],{"class":155,"line":268},[153,18444,246],{"emptyLinePlaceholder":245},[153,18446,18447],{"class":155,"line":281},[153,18448,18449],{},"@mcp.resource(\"file:\u002F\u002Fdocuments\u002F{name}\")\n",[153,18451,18452],{"class":155,"line":1356},[153,18453,18454],{},"def read_document(name: str) -> str:\n",[153,18456,18457],{"class":155,"line":1362},[153,18458,18459],{},"    \"\"\"Read a document by name.\"\"\"\n",[153,18461,18462],{"class":155,"line":1367},[153,18463,18464],{},"    return f\"Content of document: {name}\"\n",[12,18466,18467,18468,18471],{},"The first resource has a static URI. The second uses a URI template with ",[150,18469,18470],{},"{name}"," as a dynamic parameter.",[35,18473,18475],{"id":18474},"step-4-add-prompts","Step 4 — Add Prompts",[12,18477,18478],{},"Prompts are reusable templates:",[143,18480,18482],{"className":15396,"code":18481,"language":15398,"meta":148,"style":148},"@mcp.prompt()\ndef code_review(code: str, language: str = \"python\") -> str:\n    \"\"\"Generate a code review prompt.\"\"\"\n    return f\"\"\"Please review this {language} code for:\n- Bugs and potential issues\n- Performance improvements\n- Code style and best practices\n\nCode to review:\n```{language}\n{code}\n```\"\"\"\n",[150,18483,18484,18489,18494,18499,18504,18509,18514,18519,18523,18528,18533,18538],{"__ignoreMap":148},[153,18485,18486],{"class":155,"line":156},[153,18487,18488],{},"@mcp.prompt()\n",[153,18490,18491],{"class":155,"line":208},[153,18492,18493],{},"def code_review(code: str, language: str = \"python\") -> str:\n",[153,18495,18496],{"class":155,"line":242},[153,18497,18498],{},"    \"\"\"Generate a code review prompt.\"\"\"\n",[153,18500,18501],{"class":155,"line":249},[153,18502,18503],{},"    return f\"\"\"Please review this {language} code for:\n",[153,18505,18506],{"class":155,"line":255},[153,18507,18508],{},"- Bugs and potential issues\n",[153,18510,18511],{"class":155,"line":268},[153,18512,18513],{},"- Performance improvements\n",[153,18515,18516],{"class":155,"line":281},[153,18517,18518],{},"- Code style and best practices\n",[153,18520,18521],{"class":155,"line":1356},[153,18522,246],{"emptyLinePlaceholder":245},[153,18524,18525],{"class":155,"line":1362},[153,18526,18527],{},"Code to review:\n",[153,18529,18530],{"class":155,"line":1367},[153,18531,18532],{},"```{language}\n",[153,18534,18535],{"class":155,"line":1372},[153,18536,18537],{},"{code}\n",[153,18539,18540],{"class":155,"line":1378},[153,18541,18542],{},"```\"\"\"\n",[35,18544,18546],{"id":18545},"step-5-use-context-for-progress-and-logging","Step 5 — Use Context for Progress and Logging",[143,18548,18550],{"className":15396,"code":18549,"language":15398,"meta":148,"style":148},"from mcp.server.fastmcp import Context, FastMCP\nfrom mcp.server.session import ServerSession\n\nmcp = FastMCP(\"context-demo\")\n\n\n@mcp.tool()\nasync def process_data(\n    file_path: str,\n    ctx: Context[ServerSession, None],\n) -> str:\n    \"\"\"Process a data file with progress updates.\"\"\"\n    await ctx.info(f\"Starting to process: {file_path}\")\n\n    total_steps = 3\n    for i in range(total_steps):\n        await ctx.report_progress(\n            progress=(i + 1) \u002F total_steps,\n            total=1.0,\n            message=f\"Step {i + 1}\u002F{total_steps}\",\n        )\n\n    return f\"Successfully processed {file_path}\"\n",[150,18551,18552,18557,18562,18566,18571,18575,18579,18583,18588,18593,18598,18602,18607,18612,18616,18621,18626,18631,18636,18641,18646,18650,18654],{"__ignoreMap":148},[153,18553,18554],{"class":155,"line":156},[153,18555,18556],{},"from mcp.server.fastmcp import Context, FastMCP\n",[153,18558,18559],{"class":155,"line":208},[153,18560,18561],{},"from mcp.server.session import ServerSession\n",[153,18563,18564],{"class":155,"line":242},[153,18565,246],{"emptyLinePlaceholder":245},[153,18567,18568],{"class":155,"line":249},[153,18569,18570],{},"mcp = FastMCP(\"context-demo\")\n",[153,18572,18573],{"class":155,"line":255},[153,18574,246],{"emptyLinePlaceholder":245},[153,18576,18577],{"class":155,"line":268},[153,18578,246],{"emptyLinePlaceholder":245},[153,18580,18581],{"class":155,"line":281},[153,18582,17121],{},[153,18584,18585],{"class":155,"line":1356},[153,18586,18587],{},"async def process_data(\n",[153,18589,18590],{"class":155,"line":1362},[153,18591,18592],{},"    file_path: str,\n",[153,18594,18595],{"class":155,"line":1367},[153,18596,18597],{},"    ctx: Context[ServerSession, None],\n",[153,18599,18600],{"class":155,"line":1372},[153,18601,17231],{},[153,18603,18604],{"class":155,"line":1378},[153,18605,18606],{},"    \"\"\"Process a data file with progress updates.\"\"\"\n",[153,18608,18609],{"class":155,"line":1383},[153,18610,18611],{},"    await ctx.info(f\"Starting to process: {file_path}\")\n",[153,18613,18614],{"class":155,"line":1389},[153,18615,246],{"emptyLinePlaceholder":245},[153,18617,18618],{"class":155,"line":1395},[153,18619,18620],{},"    total_steps = 3\n",[153,18622,18623],{"class":155,"line":1401},[153,18624,18625],{},"    for i in range(total_steps):\n",[153,18627,18628],{"class":155,"line":1407},[153,18629,18630],{},"        await ctx.report_progress(\n",[153,18632,18633],{"class":155,"line":1129},[153,18634,18635],{},"            progress=(i + 1) \u002F total_steps,\n",[153,18637,18638],{"class":155,"line":1417},[153,18639,18640],{},"            total=1.0,\n",[153,18642,18643],{"class":155,"line":1423},[153,18644,18645],{},"            message=f\"Step {i + 1}\u002F{total_steps}\",\n",[153,18647,18648],{"class":155,"line":1683},[153,18649,17021],{},[153,18651,18652],{"class":155,"line":1688},[153,18653,246],{"emptyLinePlaceholder":245},[153,18655,18656],{"class":155,"line":12900},[153,18657,18658],{},"    return f\"Successfully processed {file_path}\"\n",[35,18660,18662],{"id":18661},"step-6-add-lifespan-management","Step 6 — Add Lifespan Management",[12,18664,18665],{},"For shared resources like database connections or HTTP clients:",[143,18667,18669],{"className":15396,"code":18668,"language":15398,"meta":148,"style":148},"from collections.abc import AsyncIterator\nfrom contextlib import asynccontextmanager\nfrom dataclasses import dataclass\n\nimport httpx\nfrom mcp.server.fastmcp import Context, FastMCP\nfrom mcp.server.session import ServerSession\n\n\n@dataclass\nclass AppContext:\n    http_client: httpx.AsyncClient\n\n\n@asynccontextmanager\nasync def app_lifespan(server: FastMCP) -> AsyncIterator[AppContext]:\n    async with httpx.AsyncClient() as client:\n        yield AppContext(http_client=client)\n\n\nmcp = FastMCP(\"lifespan-demo\", lifespan=app_lifespan)\n\n\n@mcp.tool()\nasync def fetch_url(\n    url: str,\n    ctx: Context[ServerSession, AppContext],\n) -> str:\n    \"\"\"Fetch content from a URL.\"\"\"\n    client = ctx.request_context.lifespan_context.http_client\n    response = await client.get(url, timeout=30.0)\n    return response.text[:5000]\n",[150,18670,18671,18676,18681,18686,18690,18694,18698,18702,18706,18710,18715,18720,18725,18729,18733,18738,18743,18747,18752,18756,18760,18765,18769,18773,18777,18782,18787,18792,18796,18801,18806,18811],{"__ignoreMap":148},[153,18672,18673],{"class":155,"line":156},[153,18674,18675],{},"from collections.abc import AsyncIterator\n",[153,18677,18678],{"class":155,"line":208},[153,18679,18680],{},"from contextlib import asynccontextmanager\n",[153,18682,18683],{"class":155,"line":242},[153,18684,18685],{},"from dataclasses import dataclass\n",[153,18687,18688],{"class":155,"line":249},[153,18689,246],{"emptyLinePlaceholder":245},[153,18691,18692],{"class":155,"line":255},[153,18693,15410],{},[153,18695,18696],{"class":155,"line":268},[153,18697,18556],{},[153,18699,18700],{"class":155,"line":281},[153,18701,18561],{},[153,18703,18704],{"class":155,"line":1356},[153,18705,246],{"emptyLinePlaceholder":245},[153,18707,18708],{"class":155,"line":1362},[153,18709,246],{"emptyLinePlaceholder":245},[153,18711,18712],{"class":155,"line":1367},[153,18713,18714],{},"@dataclass\n",[153,18716,18717],{"class":155,"line":1372},[153,18718,18719],{},"class AppContext:\n",[153,18721,18722],{"class":155,"line":1378},[153,18723,18724],{},"    http_client: httpx.AsyncClient\n",[153,18726,18727],{"class":155,"line":1383},[153,18728,246],{"emptyLinePlaceholder":245},[153,18730,18731],{"class":155,"line":1389},[153,18732,246],{"emptyLinePlaceholder":245},[153,18734,18735],{"class":155,"line":1395},[153,18736,18737],{},"@asynccontextmanager\n",[153,18739,18740],{"class":155,"line":1401},[153,18741,18742],{},"async def app_lifespan(server: FastMCP) -> AsyncIterator[AppContext]:\n",[153,18744,18745],{"class":155,"line":1407},[153,18746,15439],{},[153,18748,18749],{"class":155,"line":1129},[153,18750,18751],{},"        yield AppContext(http_client=client)\n",[153,18753,18754],{"class":155,"line":1417},[153,18755,246],{"emptyLinePlaceholder":245},[153,18757,18758],{"class":155,"line":1423},[153,18759,246],{"emptyLinePlaceholder":245},[153,18761,18762],{"class":155,"line":1683},[153,18763,18764],{},"mcp = FastMCP(\"lifespan-demo\", lifespan=app_lifespan)\n",[153,18766,18767],{"class":155,"line":1688},[153,18768,246],{"emptyLinePlaceholder":245},[153,18770,18771],{"class":155,"line":12900},[153,18772,246],{"emptyLinePlaceholder":245},[153,18774,18775],{"class":155,"line":12906},[153,18776,17121],{},[153,18778,18779],{"class":155,"line":16075},[153,18780,18781],{},"async def fetch_url(\n",[153,18783,18784],{"class":155,"line":16089},[153,18785,18786],{},"    url: str,\n",[153,18788,18789],{"class":155,"line":16096},[153,18790,18791],{},"    ctx: Context[ServerSession, AppContext],\n",[153,18793,18794],{"class":155,"line":16102},[153,18795,17231],{},[153,18797,18798],{"class":155,"line":16107},[153,18799,18800],{},"    \"\"\"Fetch content from a URL.\"\"\"\n",[153,18802,18803],{"class":155,"line":16115},[153,18804,18805],{},"    client = ctx.request_context.lifespan_context.http_client\n",[153,18807,18808],{"class":155,"line":17034},[153,18809,18810],{},"    response = await client.get(url, timeout=30.0)\n",[153,18812,18813],{"class":155,"line":17039},[153,18814,18815],{},"    return response.text[:5000]\n",[35,18817,18819],{"id":18818},"step-7-complete-working-example-github-stars-server","Step 7 — Complete Working Example: GitHub Stars Server",[143,18821,18823],{"className":15396,"code":18822,"language":15398,"meta":148,"style":148},"\"\"\"MCP server that fetches GitHub repository information.\"\"\"\nfrom typing import Any\nimport httpx\nfrom mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"github-stars\")\nGITHUB_API = \"https:\u002F\u002Fapi.github.com\"\n\n\nasync def github_request(path: str) -> dict[str, Any] | None:\n    headers = {\"Accept\": \"application\u002Fvnd.github.v3+json\"}\n    async with httpx.AsyncClient() as client:\n        try:\n            response = await client.get(\n                f\"{GITHUB_API}{path}\", headers=headers, timeout=30.0\n            )\n            response.raise_for_status()\n            return response.json()\n        except Exception:\n            return None\n\n\n@mcp.tool()\nasync def get_repo_info(owner: str, repo: str) -> str:\n    \"\"\"Get information about a GitHub repository.\n\n    Args:\n        owner: Repository owner (e.g. 'anthropics')\n        repo: Repository name (e.g. 'claude-code')\n    \"\"\"\n    data = await github_request(f\"\u002Frepos\u002F{owner}\u002F{repo}\")\n    if not data:\n        return \"Failed to fetch repository information.\"\n\n    return f\"\"\"Repository: {data.get('full_name')}\nDescription: {data.get('description', 'No description')}\nStars: {data.get('stargazers_count', 0):,}\nForks: {data.get('forks_count', 0):,}\nLanguage: {data.get('language', 'Unknown')}\"\"\"\n\n\n@mcp.tool()\nasync def search_repos(query: str, limit: int = 5) -> str:\n    \"\"\"Search GitHub repositories.\n\n    Args:\n        query: Search query string\n        limit: Maximum results (1-10)\n    \"\"\"\n    limit = max(1, min(10, limit))\n    data = await github_request(f\"\u002Fsearch\u002Frepositories?q={query}&per_page={limit}\")\n    if not data:\n        return \"Search failed.\"\n\n    results = []\n    for item in data.get(\"items\", [])[:limit]:\n        results.append(\n            f\"- {item['full_name']} ({item.get('stargazers_count', 0):,} stars): \"\n            f\"{item.get('description', 'No description')}\"\n        )\n    return \"\\n\".join(results) if results else \"No repositories found.\"\n\n\nif __name__ == \"__main__\":\n    mcp.run(transport=\"stdio\")\n",[150,18824,18825,18830,18834,18838,18842,18846,18851,18856,18860,18864,18869,18874,18878,18883,18888,18893,18898,18903,18908,18913,18918,18922,18926,18930,18935,18940,18944,18948,18953,18958,18962,18967,18972,18977,18981,18986,18991,18996,19001,19006,19010,19014,19018,19023,19028,19032,19036,19041,19046,19050,19055,19060,19064,19069,19073,19078,19083,19088,19093,19098,19102,19107,19111,19115,19119],{"__ignoreMap":148},[153,18826,18827],{"class":155,"line":156},[153,18828,18829],{},"\"\"\"MCP server that fetches GitHub repository information.\"\"\"\n",[153,18831,18832],{"class":155,"line":208},[153,18833,16903],{},[153,18835,18836],{"class":155,"line":242},[153,18837,15410],{},[153,18839,18840],{"class":155,"line":249},[153,18841,16912],{},[153,18843,18844],{"class":155,"line":255},[153,18845,246],{"emptyLinePlaceholder":245},[153,18847,18848],{"class":155,"line":268},[153,18849,18850],{},"mcp = FastMCP(\"github-stars\")\n",[153,18852,18853],{"class":155,"line":281},[153,18854,18855],{},"GITHUB_API = \"https:\u002F\u002Fapi.github.com\"\n",[153,18857,18858],{"class":155,"line":1356},[153,18859,246],{"emptyLinePlaceholder":245},[153,18861,18862],{"class":155,"line":1362},[153,18863,246],{"emptyLinePlaceholder":245},[153,18865,18866],{"class":155,"line":1367},[153,18867,18868],{},"async def github_request(path: str) -> dict[str, Any] | None:\n",[153,18870,18871],{"class":155,"line":1372},[153,18872,18873],{},"    headers = {\"Accept\": \"application\u002Fvnd.github.v3+json\"}\n",[153,18875,18876],{"class":155,"line":1378},[153,18877,15439],{},[153,18879,18880],{"class":155,"line":1383},[153,18881,18882],{},"        try:\n",[153,18884,18885],{"class":155,"line":1389},[153,18886,18887],{},"            response = await client.get(\n",[153,18889,18890],{"class":155,"line":1395},[153,18891,18892],{},"                f\"{GITHUB_API}{path}\", headers=headers, timeout=30.0\n",[153,18894,18895],{"class":155,"line":1401},[153,18896,18897],{},"            )\n",[153,18899,18900],{"class":155,"line":1407},[153,18901,18902],{},"            response.raise_for_status()\n",[153,18904,18905],{"class":155,"line":1129},[153,18906,18907],{},"            return response.json()\n",[153,18909,18910],{"class":155,"line":1417},[153,18911,18912],{},"        except Exception:\n",[153,18914,18915],{"class":155,"line":1423},[153,18916,18917],{},"            return None\n",[153,18919,18920],{"class":155,"line":1683},[153,18921,246],{"emptyLinePlaceholder":245},[153,18923,18924],{"class":155,"line":1688},[153,18925,246],{"emptyLinePlaceholder":245},[153,18927,18928],{"class":155,"line":12900},[153,18929,17121],{},[153,18931,18932],{"class":155,"line":12906},[153,18933,18934],{},"async def get_repo_info(owner: str, repo: str) -> str:\n",[153,18936,18937],{"class":155,"line":16075},[153,18938,18939],{},"    \"\"\"Get information about a GitHub repository.\n",[153,18941,18942],{"class":155,"line":16089},[153,18943,246],{"emptyLinePlaceholder":245},[153,18945,18946],{"class":155,"line":16096},[153,18947,17144],{},[153,18949,18950],{"class":155,"line":16102},[153,18951,18952],{},"        owner: Repository owner (e.g. 'anthropics')\n",[153,18954,18955],{"class":155,"line":16107},[153,18956,18957],{},"        repo: Repository name (e.g. 'claude-code')\n",[153,18959,18960],{"class":155,"line":16115},[153,18961,17162],{},[153,18963,18964],{"class":155,"line":17034},[153,18965,18966],{},"    data = await github_request(f\"\u002Frepos\u002F{owner}\u002F{repo}\")\n",[153,18968,18969],{"class":155,"line":17039},[153,18970,18971],{},"    if not data:\n",[153,18973,18974],{"class":155,"line":17044},[153,18975,18976],{},"        return \"Failed to fetch repository information.\"\n",[153,18978,18979],{"class":155,"line":17050},[153,18980,246],{"emptyLinePlaceholder":245},[153,18982,18983],{"class":155,"line":17055},[153,18984,18985],{},"    return f\"\"\"Repository: {data.get('full_name')}\n",[153,18987,18988],{"class":155,"line":17061},[153,18989,18990],{},"Description: {data.get('description', 'No description')}\n",[153,18992,18993],{"class":155,"line":17067},[153,18994,18995],{},"Stars: {data.get('stargazers_count', 0):,}\n",[153,18997,18998],{"class":155,"line":17073},[153,18999,19000],{},"Forks: {data.get('forks_count', 0):,}\n",[153,19002,19003],{"class":155,"line":17079},[153,19004,19005],{},"Language: {data.get('language', 'Unknown')}\"\"\"\n",[153,19007,19008],{"class":155,"line":17085},[153,19009,246],{"emptyLinePlaceholder":245},[153,19011,19012],{"class":155,"line":17091},[153,19013,246],{"emptyLinePlaceholder":245},[153,19015,19016],{"class":155,"line":17097},[153,19017,17121],{},[153,19019,19020],{"class":155,"line":17102},[153,19021,19022],{},"async def search_repos(query: str, limit: int = 5) -> str:\n",[153,19024,19025],{"class":155,"line":17107},[153,19026,19027],{},"    \"\"\"Search GitHub repositories.\n",[153,19029,19030],{"class":155,"line":17113},[153,19031,246],{"emptyLinePlaceholder":245},[153,19033,19034],{"class":155,"line":17118},[153,19035,17144],{},[153,19037,19038],{"class":155,"line":17124},[153,19039,19040],{},"        query: Search query string\n",[153,19042,19043],{"class":155,"line":17130},[153,19044,19045],{},"        limit: Maximum results (1-10)\n",[153,19047,19048],{"class":155,"line":17136},[153,19049,17162],{},[153,19051,19052],{"class":155,"line":17141},[153,19053,19054],{},"    limit = max(1, min(10, limit))\n",[153,19056,19057],{"class":155,"line":17147},[153,19058,19059],{},"    data = await github_request(f\"\u002Fsearch\u002Frepositories?q={query}&per_page={limit}\")\n",[153,19061,19062],{"class":155,"line":17153},[153,19063,18971],{},[153,19065,19066],{"class":155,"line":17159},[153,19067,19068],{},"        return \"Search failed.\"\n",[153,19070,19071],{"class":155,"line":17165},[153,19072,246],{"emptyLinePlaceholder":245},[153,19074,19075],{"class":155,"line":17171},[153,19076,19077],{},"    results = []\n",[153,19079,19080],{"class":155,"line":17177},[153,19081,19082],{},"    for item in data.get(\"items\", [])[:limit]:\n",[153,19084,19085],{"class":155,"line":17183},[153,19086,19087],{},"        results.append(\n",[153,19089,19090],{"class":155,"line":17188},[153,19091,19092],{},"            f\"- {item['full_name']} ({item.get('stargazers_count', 0):,} stars): \"\n",[153,19094,19095],{"class":155,"line":17193},[153,19096,19097],{},"            f\"{item.get('description', 'No description')}\"\n",[153,19099,19100],{"class":155,"line":17198},[153,19101,17021],{},[153,19103,19104],{"class":155,"line":17204},[153,19105,19106],{},"    return \"\\n\".join(results) if results else \"No repositories found.\"\n",[153,19108,19109],{"class":155,"line":17210},[153,19110,246],{"emptyLinePlaceholder":245},[153,19112,19113],{"class":155,"line":17216},[153,19114,246],{"emptyLinePlaceholder":245},[153,19116,19117],{"class":155,"line":17222},[153,19118,17487],{},[153,19120,19121],{"class":155,"line":17228},[153,19122,17493],{},[35,19124,19126],{"id":19125},"step-8-test-with-mcp-inspector","Step 8 — Test with MCP Inspector",[12,19128,19129],{},"The MCP Inspector is Anthropic's official visual debugging tool:",[143,19131,19133],{"className":145,"code":19132,"language":147,"meta":148,"style":148},"npx @modelcontextprotocol\u002Finspector uv run server.py\n",[150,19134,19135],{"__ignoreMap":148},[153,19136,19137,19139,19141,19143,19145],{"class":155,"line":156},[153,19138,5190],{"class":159},[153,19140,17945],{"class":167},[153,19142,17948],{"class":167},[153,19144,306],{"class":167},[153,19146,16879],{"class":167},[12,19148,19149,19150,19153],{},"This opens a web UI at ",[150,19151,19152],{},"http:\u002F\u002Flocalhost:6274"," where you can browse tools, invoke them with custom parameters, and see raw JSON-RPC messages.",[12,19155,19156],{},"You can also use the MCP CLI dev mode:",[143,19158,19160],{"className":145,"code":19159,"language":147,"meta":148,"style":148},"mcp dev server.py\n",[150,19161,19162],{"__ignoreMap":148},[153,19163,19164,19166,19168],{"class":155,"line":156},[153,19165,5531],{"class":159},[153,19167,17968],{"class":167},[153,19169,16879],{"class":167},[35,19171,19173],{"id":19172},"step-9-configure-in-claude-code","Step 9 — Configure in Claude Code",[143,19175,19177],{"className":145,"code":19176,"language":147,"meta":148,"style":148},"claude mcp add --transport stdio my-server \\\n  -- uv --directory \u002Fabsolute\u002Fpath\u002Fto\u002Fmy-mcp-server run server.py\n",[150,19178,19179,19196],{"__ignoreMap":148},[153,19180,19181,19183,19185,19187,19189,19191,19194],{"class":155,"line":156},[153,19182,12966],{"class":159},[153,19184,17889],{"class":167},[153,19186,1447],{"class":167},[153,19188,17894],{"class":163},[153,19190,17992],{"class":167},[153,19192,19193],{"class":167}," my-server",[153,19195,372],{"class":163},[153,19197,19198,19200,19202,19204,19207,19209],{"class":155,"line":208},[153,19199,18017],{"class":163},[153,19201,17948],{"class":167},[153,19203,18022],{"class":163},[153,19205,19206],{"class":167}," \u002Fabsolute\u002Fpath\u002Fto\u002Fmy-mcp-server",[153,19208,306],{"class":167},[153,19210,16879],{"class":167},[12,19212,19213,19214,19216],{},"Or create ",[150,19215,17611],{}," in your project root:",[143,19218,19220],{"className":3807,"code":19219,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"my-server\": {\n      \"command\": \"uv\",\n      \"args\": [\"--directory\", \"\u002Fabsolute\u002Fpath\u002Fto\u002Fmy-mcp-server\", \"run\", \"server.py\"]\n    }\n  }\n}\n",[150,19221,19222,19226,19232,19239,19249,19272,19276,19280],{"__ignoreMap":148},[153,19223,19224],{"class":155,"line":156},[153,19225,3816],{"class":313},[153,19227,19228,19230],{"class":155,"line":208},[153,19229,3821],{"class":163},[153,19231,3824],{"class":313},[153,19233,19234,19237],{"class":155,"line":242},[153,19235,19236],{"class":163},"    \"my-server\"",[153,19238,3824],{"class":313},[153,19240,19241,19243,19245,19247],{"class":155,"line":249},[153,19242,3836],{"class":163},[153,19244,3839],{"class":313},[153,19246,17531],{"class":167},[153,19248,3845],{"class":313},[153,19250,19251,19253,19255,19257,19259,19262,19264,19266,19268,19270],{"class":155,"line":255},[153,19252,3850],{"class":163},[153,19254,3853],{"class":313},[153,19256,17542],{"class":167},[153,19258,528],{"class":313},[153,19260,19261],{"class":167},"\"\u002Fabsolute\u002Fpath\u002Fto\u002Fmy-mcp-server\"",[153,19263,528],{"class":313},[153,19265,17552],{"class":167},[153,19267,528],{"class":313},[153,19269,17557],{"class":167},[153,19271,5386],{"class":313},[153,19273,19274],{"class":155,"line":268},[153,19275,3891],{"class":313},[153,19277,19278],{"class":155,"line":281},[153,19279,3896],{"class":313},[153,19281,19282],{"class":155,"line":1356},[153,19283,3901],{"class":313},[35,19285,19287],{"id":19286},"step-10-configure-in-claude-desktop","Step 10 — Configure in Claude Desktop",[12,19289,19290,19291,19294],{},"Edit ",[150,19292,19293],{},"~\u002FLibrary\u002FApplication Support\u002FClaude\u002Fclaude_desktop_config.json"," (macOS):",[143,19296,19297],{"className":3807,"code":19219,"language":3809,"meta":148,"style":148},[150,19298,19299,19303,19309,19315,19325,19347,19351,19355],{"__ignoreMap":148},[153,19300,19301],{"class":155,"line":156},[153,19302,3816],{"class":313},[153,19304,19305,19307],{"class":155,"line":208},[153,19306,3821],{"class":163},[153,19308,3824],{"class":313},[153,19310,19311,19313],{"class":155,"line":242},[153,19312,19236],{"class":163},[153,19314,3824],{"class":313},[153,19316,19317,19319,19321,19323],{"class":155,"line":249},[153,19318,3836],{"class":163},[153,19320,3839],{"class":313},[153,19322,17531],{"class":167},[153,19324,3845],{"class":313},[153,19326,19327,19329,19331,19333,19335,19337,19339,19341,19343,19345],{"class":155,"line":255},[153,19328,3850],{"class":163},[153,19330,3853],{"class":313},[153,19332,17542],{"class":167},[153,19334,528],{"class":313},[153,19336,19261],{"class":167},[153,19338,528],{"class":313},[153,19340,17552],{"class":167},[153,19342,528],{"class":313},[153,19344,17557],{"class":167},[153,19346,5386],{"class":313},[153,19348,19349],{"class":155,"line":268},[153,19350,3891],{"class":313},[153,19352,19353],{"class":155,"line":281},[153,19354,3896],{"class":313},[153,19356,19357],{"class":155,"line":1356},[153,19358,3901],{"class":313},[35,19360,19362],{"id":19361},"step-11-configure-in-cursor","Step 11 — Configure in Cursor",[12,19364,18290,19365,726],{},[150,19366,19367],{},".cursor\u002Fmcp.json",[143,19369,19370],{"className":3807,"code":19219,"language":3809,"meta":148,"style":148},[150,19371,19372,19376,19382,19388,19398,19420,19424,19428],{"__ignoreMap":148},[153,19373,19374],{"class":155,"line":156},[153,19375,3816],{"class":313},[153,19377,19378,19380],{"class":155,"line":208},[153,19379,3821],{"class":163},[153,19381,3824],{"class":313},[153,19383,19384,19386],{"class":155,"line":242},[153,19385,19236],{"class":163},[153,19387,3824],{"class":313},[153,19389,19390,19392,19394,19396],{"class":155,"line":249},[153,19391,3836],{"class":163},[153,19393,3839],{"class":313},[153,19395,17531],{"class":167},[153,19397,3845],{"class":313},[153,19399,19400,19402,19404,19406,19408,19410,19412,19414,19416,19418],{"class":155,"line":255},[153,19401,3850],{"class":163},[153,19403,3853],{"class":313},[153,19405,17542],{"class":167},[153,19407,528],{"class":313},[153,19409,19261],{"class":167},[153,19411,528],{"class":313},[153,19413,17552],{"class":167},[153,19415,528],{"class":313},[153,19417,17557],{"class":167},[153,19419,5386],{"class":313},[153,19421,19422],{"class":155,"line":268},[153,19423,3891],{"class":313},[153,19425,19426],{"class":155,"line":281},[153,19427,3896],{"class":313},[153,19429,19430],{"class":155,"line":1356},[153,19431,3901],{"class":313},[116,19433,19434],{"type":452},[12,19435,19436,19437,19444,19445,4151,19448,19451],{},"For stdio-based servers, ",[45,19438,19439,19440,19443],{},"never use ",[150,19441,19442],{},"print()"," to stdout"," — it corrupts JSON-RPC messages. Use ",[150,19446,19447],{},"print(\"msg\", file=sys.stderr)",[150,19449,19450],{},"logging.info()"," instead.",[35,19453,19455],{"id":19454},"transport-options","Transport Options",[809,19457,19458,19471],{},[812,19459,19460],{},[815,19461,19462,19465,19468],{},[818,19463,19464],{},"Transport",[818,19466,19467],{},"Use Case",[818,19469,19470],{},"Code",[828,19472,19473,19488,19503],{},[815,19474,19475,19480,19483],{},[833,19476,19477],{},[150,19478,19479],{},"stdio",[833,19481,19482],{},"Local development, Claude Desktop",[833,19484,19485],{},[150,19486,19487],{},"mcp.run(transport=\"stdio\")",[815,19489,19490,19495,19498],{},[833,19491,19492],{},[150,19493,19494],{},"streamable-http",[833,19496,19497],{},"Remote\u002Fdeployed servers",[833,19499,19500],{},[150,19501,19502],{},"mcp.run(transport=\"streamable-http\")",[815,19504,19505,19510,19513],{},[833,19506,19507],{},[150,19508,19509],{},"sse",[833,19511,19512],{},"Legacy (deprecated)",[833,19514,19515],{},[150,19516,19517],{},"mcp.run(transport=\"sse\")",[138,19519,2514],{"id":2513},[12,19521,19522,19525],{},[45,19523,19524],{},"Q: What Python version do I need for MCP?","\nA: Python 3.10 or higher. The MCP Python SDK (v1.27.0) uses modern Python features like type unions and async\u002Fawait.",[12,19527,19528,19531,19532,19535],{},[45,19529,19530],{},"Q: Can I use pip instead of uv?","\nA: Yes. Run ",[150,19533,19534],{},"pip install \"mcp[cli]\""," instead. uv is recommended for faster installs and better dependency resolution.",[12,19537,19538,19541,19542,19545],{},[45,19539,19540],{},"Q: How do I add authentication to my MCP server?","\nA: Use environment variables for API keys. In your MCP config, add an ",[150,19543,19544],{},"\"env\""," section with key-value pairs that get injected at server startup.",[35,19547,1020],{"id":1019},[19,19549,19550,19555,19561,19567],{},[22,19551,19552,19554],{},[71,19553,18066],{"href":18065}," — same concepts, different language",[22,19556,19557,19560],{},[71,19558,16693],{"href":19559},"\u002Fguide\u002Fbuild-mcp-server-api"," — wrap any REST API as MCP",[22,19562,19563,19566],{},[71,19564,16630],{"href":5477,"rel":19565},[113]," — browse ready-made configs",[22,19568,19569,19571],{},[71,19570,16623],{"href":16622}," — another way to extend Claude Code",[1074,19573,19574],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":148,"searchDepth":208,"depth":208,"links":19576},[19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19593],{"id":78,"depth":208,"text":79},{"id":18160,"depth":208,"text":18161},{"id":18196,"depth":208,"text":18197},{"id":18286,"depth":208,"text":18287},{"id":18407,"depth":208,"text":18408},{"id":18474,"depth":208,"text":18475},{"id":18545,"depth":208,"text":18546},{"id":18661,"depth":208,"text":18662},{"id":18818,"depth":208,"text":18819},{"id":19125,"depth":208,"text":19126},{"id":19172,"depth":208,"text":19173},{"id":19286,"depth":208,"text":19287},{"id":19361,"depth":208,"text":19362},{"id":19454,"depth":208,"text":19455,"children":19591},[19592],{"id":2513,"depth":242,"text":2514},{"id":1019,"depth":208,"text":1020},"Build a working MCP server in Python using FastMCP. Covers tools, resources, prompts, testing with MCP Inspector, and configuring in Claude Code, Claude Desktop, and Cursor.","使用 FastMCP 用 Python 构建 MCP 服务器。涵盖工具、资源、提示词、MCP Inspector 测试，以及 Claude Code\u002FDesktop\u002FCursor 配置。",[19597,19600,19603,19606,19609],{"q":19598,"a":19599},"What Python version do I need to build an MCP server?","Python 3.10 or higher. The MCP Python SDK (v1.27.0) uses modern features like type unions (str | None) and async\u002Fawait. Use uv as the package manager for fastest installs — it handles virtual envs and dependency resolution better than pip.",{"q":19601,"a":19602},"How do I define tools and resources with FastMCP?","Decorate functions: @mcp.tool() for actions the LLM can invoke (uses type hints and docstrings to auto-generate schemas), @mcp.resource(\"uri:\u002F\u002Fpath\") for read-only data, and @mcp.prompt() for reusable templates. URI templates like \"file:\u002F\u002Fdocuments\u002F{name}\" support dynamic parameters.",{"q":19604,"a":19605},"How do I test a Python MCP server?","Run npx @modelcontextprotocol\u002Finspector uv run server.py. This opens a web UI at localhost:6274 where you can browse tools, invoke them with custom parameters, and see raw JSON-RPC messages. You can also use mcp dev server.py for the MCP CLI dev mode.",{"q":19607,"a":19608},"Can I use print() for logging in an MCP server?","No — never use print() to stdout in a stdio-based MCP server. It corrupts JSON-RPC messages. Use print(\"msg\", file=sys.stderr) or logging.info() instead. Stdout is reserved for protocol communication between the server and the MCP client.",{"q":19610,"a":19611},"How do I share HTTP clients or database connections across tools?","Use lifespan management with an @asynccontextmanager function and a dataclass like AppContext. Pass lifespan=app_lifespan to FastMCP, then access the shared resource in tools via ctx.request_context.lifespan_context.http_client. This avoids recreating clients per request.","\u002Fguide\u002Fimages\u002Fbuild-mcp-python-hero.svg",{},"\u002Fen\u002Fguide\u002Fbuild-mcp-server-python",{"title":18129,"description":19594},"en\u002Fguide\u002Fbuild-mcp-server-python",[5531,15398,1106,2769],"如何用 Python 构建 MCP 服务器（分步教程）","Build an MCP server in Python by installing the FastMCP SDK (uv add \"mcp[cli]\"), decorating functions with @mcp.tool(), @mcp.resource(), and @mcp.prompt(), and running with mcp.run(transport=\"stdio\"). Python 3.10+ is required. Test with npx @modelcontextprotocol\u002Finspector, then register it in Claude Code, Claude Desktop, or Cursor via a standard mcpServers config pointing to uv run server.py.","3wvoJQ7OecdK2-ith6PaF1p2N4UK3tHleFUuUSAjxBY",{"id":19622,"title":19623,"answer":6,"answerZh":6,"author":7,"body":19624,"category":1106,"description":22686,"descriptionZh":22687,"extension":1109,"faqs":22688,"faqsZh":6,"image":22704,"meta":22705,"navigation":245,"path":22706,"publishedAt":14945,"readTime":1378,"seo":22707,"stem":22708,"tags":22709,"titleZh":22710,"tldr":22711,"tldrZh":6,"updatedAt":14945,"__hash__":22712},"docs_en\u002Fen\u002Fguide\u002Fbuild-mcp-server-typescript.md","How to Build an MCP Server in TypeScript (Step-by-Step)",{"type":9,"value":19625,"toc":22669},[19626,19633,19635,19652,19656,19724,19729,19857,19862,19920,19926,19928,19933,20308,20311,20325,20329,20649,20653,20791,20795,21006,21010,21013,21159,21163,21464,21468,22398,22402,22427,22433,22437,22467,22471,22476,22531,22536,22588,22603,22605,22614,22620,22641,22643,22666],[12,19627,19628,19629,19632],{},"Learn how to build a production-ready MCP server in TypeScript using the official ",[150,19630,19631],{},"@modelcontextprotocol\u002Fsdk",", validate inputs with Zod, and configure it in Claude Code, Claude Desktop, and Cursor.",[35,19634,79],{"id":78},[19,19636,19637,19640,19643,19646],{},[22,19638,19639],{},"Node.js 16+ (18+ recommended)",[22,19641,19642],{},"npm or pnpm",[22,19644,19645],{},"Basic TypeScript knowledge",[22,19647,14972,19648,19651],{},[71,19649,1159],{"href":1157,"rel":19650},[113],", Claude Desktop, or Cursor",[35,19653,19655],{"id":19654},"step-1-set-up-your-project","Step 1 — Set Up Your Project",[143,19657,19659],{"className":145,"code":19658,"language":147,"meta":148,"style":148},"mkdir my-mcp-server && cd my-mcp-server\nnpm init -y\nnpm install @modelcontextprotocol\u002Fsdk zod@3\nnpm install -D @types\u002Fnode typescript\nmkdir src && touch src\u002Findex.ts\n",[150,19660,19661,19674,19683,19695,19710],{"__ignoreMap":148},[153,19662,19663,19665,19668,19670,19672],{"class":155,"line":156},[153,19664,1312],{"class":159},[153,19666,19667],{"class":167}," my-mcp-server",[153,19669,16855],{"class":313},[153,19671,1233],{"class":163},[153,19673,18244],{"class":167},[153,19675,19676,19678,19680],{"class":155,"line":208},[153,19677,5639],{"class":159},[153,19679,16836],{"class":167},[153,19681,19682],{"class":163}," -y\n",[153,19684,19685,19687,19689,19692],{"class":155,"line":242},[153,19686,5639],{"class":159},[153,19688,1590],{"class":167},[153,19690,19691],{"class":167}," @modelcontextprotocol\u002Fsdk",[153,19693,19694],{"class":167}," zod@3\n",[153,19696,19697,19699,19701,19704,19707],{"class":155,"line":249},[153,19698,5639],{"class":159},[153,19700,1590],{"class":167},[153,19702,19703],{"class":163}," -D",[153,19705,19706],{"class":167}," @types\u002Fnode",[153,19708,19709],{"class":167}," typescript\n",[153,19711,19712,19714,19717,19719,19721],{"class":155,"line":255},[153,19713,1312],{"class":159},[153,19715,19716],{"class":167}," src",[153,19718,16855],{"class":313},[153,19720,12611],{"class":159},[153,19722,19723],{"class":167}," src\u002Findex.ts\n",[12,19725,18290,19726,726],{},[150,19727,19728],{},"tsconfig.json",[143,19730,19732],{"className":3807,"code":19731,"language":3809,"meta":148,"style":148},"{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"Node16\",\n    \"moduleResolution\": \"Node16\",\n    \"outDir\": \".\u002Fbuild\",\n    \"rootDir\": \".\u002Fsrc\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true\n  },\n  \"include\": [\"src\u002F**\u002F*\"]\n}\n",[150,19733,19734,19738,19745,19757,19769,19780,19792,19804,19816,19827,19836,19841,19853],{"__ignoreMap":148},[153,19735,19736],{"class":155,"line":156},[153,19737,3816],{"class":313},[153,19739,19740,19743],{"class":155,"line":208},[153,19741,19742],{"class":163},"  \"compilerOptions\"",[153,19744,3824],{"class":313},[153,19746,19747,19750,19752,19755],{"class":155,"line":242},[153,19748,19749],{"class":163},"    \"target\"",[153,19751,3839],{"class":313},[153,19753,19754],{"class":167},"\"ES2022\"",[153,19756,3845],{"class":313},[153,19758,19759,19762,19764,19767],{"class":155,"line":249},[153,19760,19761],{"class":163},"    \"module\"",[153,19763,3839],{"class":313},[153,19765,19766],{"class":167},"\"Node16\"",[153,19768,3845],{"class":313},[153,19770,19771,19774,19776,19778],{"class":155,"line":255},[153,19772,19773],{"class":163},"    \"moduleResolution\"",[153,19775,3839],{"class":313},[153,19777,19766],{"class":167},[153,19779,3845],{"class":313},[153,19781,19782,19785,19787,19790],{"class":155,"line":268},[153,19783,19784],{"class":163},"    \"outDir\"",[153,19786,3839],{"class":313},[153,19788,19789],{"class":167},"\".\u002Fbuild\"",[153,19791,3845],{"class":313},[153,19793,19794,19797,19799,19802],{"class":155,"line":281},[153,19795,19796],{"class":163},"    \"rootDir\"",[153,19798,3839],{"class":313},[153,19800,19801],{"class":167},"\".\u002Fsrc\"",[153,19803,3845],{"class":313},[153,19805,19806,19809,19811,19814],{"class":155,"line":1356},[153,19807,19808],{"class":163},"    \"strict\"",[153,19810,3839],{"class":313},[153,19812,19813],{"class":163},"true",[153,19815,3845],{"class":313},[153,19817,19818,19821,19823,19825],{"class":155,"line":1362},[153,19819,19820],{"class":163},"    \"esModuleInterop\"",[153,19822,3839],{"class":313},[153,19824,19813],{"class":163},[153,19826,3845],{"class":313},[153,19828,19829,19832,19834],{"class":155,"line":1367},[153,19830,19831],{"class":163},"    \"skipLibCheck\"",[153,19833,3839],{"class":313},[153,19835,8990],{"class":163},[153,19837,19838],{"class":155,"line":1372},[153,19839,19840],{"class":313},"  },\n",[153,19842,19843,19846,19848,19851],{"class":155,"line":1378},[153,19844,19845],{"class":163},"  \"include\"",[153,19847,3853],{"class":313},[153,19849,19850],{"class":167},"\"src\u002F**\u002F*\"",[153,19852,5386],{"class":313},[153,19854,19855],{"class":155,"line":1383},[153,19856,3901],{"class":313},[12,19858,19859,19860,726],{},"Update ",[150,19861,6759],{},[143,19863,19865],{"className":3807,"code":19864,"language":3809,"meta":148,"style":148},"{\n  \"type\": \"module\",\n  \"scripts\": {\n    \"build\": \"tsc && chmod 755 build\u002Findex.js\",\n    \"start\": \"node build\u002Findex.js\"\n  }\n}\n",[150,19866,19867,19871,19883,19890,19902,19912,19916],{"__ignoreMap":148},[153,19868,19869],{"class":155,"line":156},[153,19870,3816],{"class":313},[153,19872,19873,19876,19878,19881],{"class":155,"line":208},[153,19874,19875],{"class":163},"  \"type\"",[153,19877,3839],{"class":313},[153,19879,19880],{"class":167},"\"module\"",[153,19882,3845],{"class":313},[153,19884,19885,19888],{"class":155,"line":242},[153,19886,19887],{"class":163},"  \"scripts\"",[153,19889,3824],{"class":313},[153,19891,19892,19895,19897,19900],{"class":155,"line":249},[153,19893,19894],{"class":163},"    \"build\"",[153,19896,3839],{"class":313},[153,19898,19899],{"class":167},"\"tsc && chmod 755 build\u002Findex.js\"",[153,19901,3845],{"class":313},[153,19903,19904,19907,19909],{"class":155,"line":255},[153,19905,19906],{"class":163},"    \"start\"",[153,19908,3839],{"class":313},[153,19910,19911],{"class":167},"\"node build\u002Findex.js\"\n",[153,19913,19914],{"class":155,"line":268},[153,19915,3896],{"class":313},[153,19917,19918],{"class":155,"line":281},[153,19919,3901],{"class":313},[12,19921,19922,19923,19925],{},"The current SDK version is ",[150,19924,19631],{}," v1.29.0.",[35,19927,18287],{"id":18286},[12,19929,18290,19930,726],{},[150,19931,19932],{},"src\u002Findex.ts",[143,19934,19937],{"className":19935,"code":19936,"language":18123,"meta":148,"style":148},"language-typescript shiki shiki-themes github-light github-dark","import { McpServer } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fmcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js\";\nimport { z } from \"zod\";\n\nconst server = new McpServer({\n  name: \"my-first-server\",\n  version: \"1.0.0\",\n});\n\nserver.registerTool(\n  \"add\",\n  {\n    description: \"Add two numbers together\",\n    inputSchema: {\n      a: z.number().describe(\"First number\"),\n      b: z.number().describe(\"Second number\"),\n    },\n  },\n  async ({ a, b }) => ({\n    content: [{ type: \"text\", text: String(a + b) }],\n  }),\n);\n\nasync function main() {\n  const transport = new StdioServerTransport();\n  await server.connect(transport);\n  console.error(\"MCP Server running on stdio\");\n}\n\nmain().catch((error) => {\n  console.error(\"Fatal error:\", error);\n  process.exit(1);\n});\n",[150,19938,19939,19956,19970,19984,19988,20008,20018,20028,20033,20037,20048,20055,20060,20070,20075,20097,20115,20119,20123,20148,20171,20176,20181,20185,20198,20216,20230,20245,20249,20253,20276,20290,20304],{"__ignoreMap":148},[153,19940,19941,19944,19947,19950,19953],{"class":155,"line":156},[153,19942,19943],{"class":171},"import",[153,19945,19946],{"class":313}," { McpServer } ",[153,19948,19949],{"class":171},"from",[153,19951,19952],{"class":167}," \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fmcp.js\"",[153,19954,19955],{"class":313},";\n",[153,19957,19958,19960,19963,19965,19968],{"class":155,"line":208},[153,19959,19943],{"class":171},[153,19961,19962],{"class":313}," { StdioServerTransport } ",[153,19964,19949],{"class":171},[153,19966,19967],{"class":167}," \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js\"",[153,19969,19955],{"class":313},[153,19971,19972,19974,19977,19979,19982],{"class":155,"line":242},[153,19973,19943],{"class":171},[153,19975,19976],{"class":313}," { z } ",[153,19978,19949],{"class":171},[153,19980,19981],{"class":167}," \"zod\"",[153,19983,19955],{"class":313},[153,19985,19986],{"class":155,"line":249},[153,19987,246],{"emptyLinePlaceholder":245},[153,19989,19990,19993,19996,19999,20002,20005],{"class":155,"line":255},[153,19991,19992],{"class":171},"const",[153,19994,19995],{"class":163}," server",[153,19997,19998],{"class":171}," =",[153,20000,20001],{"class":171}," new",[153,20003,20004],{"class":159}," McpServer",[153,20006,20007],{"class":313},"({\n",[153,20009,20010,20013,20016],{"class":155,"line":268},[153,20011,20012],{"class":313},"  name: ",[153,20014,20015],{"class":167},"\"my-first-server\"",[153,20017,3845],{"class":313},[153,20019,20020,20023,20026],{"class":155,"line":281},[153,20021,20022],{"class":313},"  version: ",[153,20024,20025],{"class":167},"\"1.0.0\"",[153,20027,3845],{"class":313},[153,20029,20030],{"class":155,"line":1356},[153,20031,20032],{"class":313},"});\n",[153,20034,20035],{"class":155,"line":1362},[153,20036,246],{"emptyLinePlaceholder":245},[153,20038,20039,20042,20045],{"class":155,"line":1367},[153,20040,20041],{"class":313},"server.",[153,20043,20044],{"class":159},"registerTool",[153,20046,20047],{"class":313},"(\n",[153,20049,20050,20053],{"class":155,"line":1372},[153,20051,20052],{"class":167},"  \"add\"",[153,20054,3845],{"class":313},[153,20056,20057],{"class":155,"line":1378},[153,20058,20059],{"class":313},"  {\n",[153,20061,20062,20065,20068],{"class":155,"line":1383},[153,20063,20064],{"class":313},"    description: ",[153,20066,20067],{"class":167},"\"Add two numbers together\"",[153,20069,3845],{"class":313},[153,20071,20072],{"class":155,"line":1389},[153,20073,20074],{"class":313},"    inputSchema: {\n",[153,20076,20077,20080,20083,20086,20089,20091,20094],{"class":155,"line":1395},[153,20078,20079],{"class":313},"      a: z.",[153,20081,20082],{"class":159},"number",[153,20084,20085],{"class":313},"().",[153,20087,20088],{"class":159},"describe",[153,20090,1935],{"class":313},[153,20092,20093],{"class":167},"\"First number\"",[153,20095,20096],{"class":313},"),\n",[153,20098,20099,20102,20104,20106,20108,20110,20113],{"class":155,"line":1401},[153,20100,20101],{"class":313},"      b: z.",[153,20103,20082],{"class":159},[153,20105,20085],{"class":313},[153,20107,20088],{"class":159},[153,20109,1935],{"class":313},[153,20111,20112],{"class":167},"\"Second number\"",[153,20114,20096],{"class":313},[153,20116,20117],{"class":155,"line":1407},[153,20118,5300],{"class":313},[153,20120,20121],{"class":155,"line":1129},[153,20122,19840],{"class":313},[153,20124,20125,20128,20131,20134,20136,20139,20142,20145],{"class":155,"line":1417},[153,20126,20127],{"class":171},"  async",[153,20129,20130],{"class":313}," ({ ",[153,20132,71],{"class":20133},"s4XuR",[153,20135,528],{"class":313},[153,20137,20138],{"class":20133},"b",[153,20140,20141],{"class":313}," }) ",[153,20143,20144],{"class":171},"=>",[153,20146,20147],{"class":313}," ({\n",[153,20149,20150,20153,20156,20159,20162,20165,20168],{"class":155,"line":1423},[153,20151,20152],{"class":313},"    content: [{ type: ",[153,20154,20155],{"class":167},"\"text\"",[153,20157,20158],{"class":313},", text: ",[153,20160,20161],{"class":159},"String",[153,20163,20164],{"class":313},"(a ",[153,20166,20167],{"class":171},"+",[153,20169,20170],{"class":313}," b) }],\n",[153,20172,20173],{"class":155,"line":1683},[153,20174,20175],{"class":313},"  }),\n",[153,20177,20178],{"class":155,"line":1688},[153,20179,20180],{"class":313},");\n",[153,20182,20183],{"class":155,"line":12900},[153,20184,246],{"emptyLinePlaceholder":245},[153,20186,20187,20190,20193,20195],{"class":155,"line":12906},[153,20188,20189],{"class":171},"async",[153,20191,20192],{"class":171}," function",[153,20194,1482],{"class":159},[153,20196,20197],{"class":313},"() {\n",[153,20199,20200,20203,20206,20208,20210,20213],{"class":155,"line":16075},[153,20201,20202],{"class":171},"  const",[153,20204,20205],{"class":163}," transport",[153,20207,19998],{"class":171},[153,20209,20001],{"class":171},[153,20211,20212],{"class":159}," StdioServerTransport",[153,20214,20215],{"class":313},"();\n",[153,20217,20218,20221,20224,20227],{"class":155,"line":16089},[153,20219,20220],{"class":171},"  await",[153,20222,20223],{"class":313}," server.",[153,20225,20226],{"class":159},"connect",[153,20228,20229],{"class":313},"(transport);\n",[153,20231,20232,20235,20238,20240,20243],{"class":155,"line":16096},[153,20233,20234],{"class":313},"  console.",[153,20236,20237],{"class":159},"error",[153,20239,1935],{"class":313},[153,20241,20242],{"class":167},"\"MCP Server running on stdio\"",[153,20244,20180],{"class":313},[153,20246,20247],{"class":155,"line":16102},[153,20248,3901],{"class":313},[153,20250,20251],{"class":155,"line":16107},[153,20252,246],{"emptyLinePlaceholder":245},[153,20254,20255,20258,20260,20263,20266,20268,20271,20273],{"class":155,"line":16115},[153,20256,20257],{"class":159},"main",[153,20259,20085],{"class":313},[153,20261,20262],{"class":159},"catch",[153,20264,20265],{"class":313},"((",[153,20267,20237],{"class":20133},[153,20269,20270],{"class":313},") ",[153,20272,20144],{"class":171},[153,20274,20275],{"class":313}," {\n",[153,20277,20278,20280,20282,20284,20287],{"class":155,"line":17034},[153,20279,20234],{"class":313},[153,20281,20237],{"class":159},[153,20283,1935],{"class":313},[153,20285,20286],{"class":167},"\"Fatal error:\"",[153,20288,20289],{"class":313},", error);\n",[153,20291,20292,20295,20297,20299,20302],{"class":155,"line":17039},[153,20293,20294],{"class":313},"  process.",[153,20296,15884],{"class":159},[153,20298,1935],{"class":313},[153,20300,20301],{"class":163},"1",[153,20303,20180],{"class":313},[153,20305,20306],{"class":155,"line":17044},[153,20307,20032],{"class":313},[12,20309,20310],{},"Build and test:",[143,20312,20314],{"className":145,"code":20313,"language":147,"meta":148,"style":148},"npm run build\n",[150,20315,20316],{"__ignoreMap":148},[153,20317,20318,20320,20322],{"class":155,"line":156},[153,20319,5639],{"class":159},[153,20321,306],{"class":167},[153,20323,20324],{"class":167}," build\n",[35,20326,20328],{"id":20327},"step-3-add-structured-output-with-zod","Step 3 — Add Structured Output with Zod",[143,20330,20332],{"className":19935,"code":20331,"language":18123,"meta":148,"style":148},"server.registerTool(\n  \"calculate-bmi\",\n  {\n    title: \"BMI Calculator\",\n    description: \"Calculate Body Mass Index\",\n    inputSchema: z.object({\n      weightKg: z.number().describe(\"Weight in kilograms\"),\n      heightM: z.number().describe(\"Height in meters\"),\n    }),\n    outputSchema: z.object({\n      bmi: z.number(),\n      category: z.string(),\n    }),\n  },\n  async ({ weightKg, heightM }) => {\n    const bmi = weightKg \u002F (heightM * heightM);\n    let category = \"Normal\";\n    if (bmi \u003C 18.5) category = \"Underweight\";\n    else if (bmi >= 25) category = \"Overweight\";\n\n    const output = { bmi: Math.round(bmi * 10) \u002F 10, category };\n    return {\n      content: [{ type: \"text\", text: JSON.stringify(output) }],\n      structuredContent: output,\n    };\n  },\n);\n",[150,20333,20334,20342,20349,20353,20363,20372,20382,20400,20418,20423,20432,20442,20452,20456,20460,20480,20504,20519,20543,20568,20572,20604,20611,20631,20636,20641,20645],{"__ignoreMap":148},[153,20335,20336,20338,20340],{"class":155,"line":156},[153,20337,20041],{"class":313},[153,20339,20044],{"class":159},[153,20341,20047],{"class":313},[153,20343,20344,20347],{"class":155,"line":208},[153,20345,20346],{"class":167},"  \"calculate-bmi\"",[153,20348,3845],{"class":313},[153,20350,20351],{"class":155,"line":242},[153,20352,20059],{"class":313},[153,20354,20355,20358,20361],{"class":155,"line":249},[153,20356,20357],{"class":313},"    title: ",[153,20359,20360],{"class":167},"\"BMI Calculator\"",[153,20362,3845],{"class":313},[153,20364,20365,20367,20370],{"class":155,"line":255},[153,20366,20064],{"class":313},[153,20368,20369],{"class":167},"\"Calculate Body Mass Index\"",[153,20371,3845],{"class":313},[153,20373,20374,20377,20380],{"class":155,"line":268},[153,20375,20376],{"class":313},"    inputSchema: z.",[153,20378,20379],{"class":159},"object",[153,20381,20007],{"class":313},[153,20383,20384,20387,20389,20391,20393,20395,20398],{"class":155,"line":281},[153,20385,20386],{"class":313},"      weightKg: z.",[153,20388,20082],{"class":159},[153,20390,20085],{"class":313},[153,20392,20088],{"class":159},[153,20394,1935],{"class":313},[153,20396,20397],{"class":167},"\"Weight in kilograms\"",[153,20399,20096],{"class":313},[153,20401,20402,20405,20407,20409,20411,20413,20416],{"class":155,"line":1356},[153,20403,20404],{"class":313},"      heightM: z.",[153,20406,20082],{"class":159},[153,20408,20085],{"class":313},[153,20410,20088],{"class":159},[153,20412,1935],{"class":313},[153,20414,20415],{"class":167},"\"Height in meters\"",[153,20417,20096],{"class":313},[153,20419,20420],{"class":155,"line":1362},[153,20421,20422],{"class":313},"    }),\n",[153,20424,20425,20428,20430],{"class":155,"line":1367},[153,20426,20427],{"class":313},"    outputSchema: z.",[153,20429,20379],{"class":159},[153,20431,20007],{"class":313},[153,20433,20434,20437,20439],{"class":155,"line":1372},[153,20435,20436],{"class":313},"      bmi: z.",[153,20438,20082],{"class":159},[153,20440,20441],{"class":313},"(),\n",[153,20443,20444,20447,20450],{"class":155,"line":1378},[153,20445,20446],{"class":313},"      category: z.",[153,20448,20449],{"class":159},"string",[153,20451,20441],{"class":313},[153,20453,20454],{"class":155,"line":1383},[153,20455,20422],{"class":313},[153,20457,20458],{"class":155,"line":1389},[153,20459,19840],{"class":313},[153,20461,20462,20464,20466,20469,20471,20474,20476,20478],{"class":155,"line":1395},[153,20463,20127],{"class":171},[153,20465,20130],{"class":313},[153,20467,20468],{"class":20133},"weightKg",[153,20470,528],{"class":313},[153,20472,20473],{"class":20133},"heightM",[153,20475,20141],{"class":313},[153,20477,20144],{"class":171},[153,20479,20275],{"class":313},[153,20481,20482,20485,20488,20490,20493,20496,20499,20501],{"class":155,"line":1401},[153,20483,20484],{"class":171},"    const",[153,20486,20487],{"class":163}," bmi",[153,20489,19998],{"class":171},[153,20491,20492],{"class":313}," weightKg ",[153,20494,20495],{"class":171},"\u002F",[153,20497,20498],{"class":313}," (heightM ",[153,20500,6160],{"class":171},[153,20502,20503],{"class":313}," heightM);\n",[153,20505,20506,20509,20512,20514,20517],{"class":155,"line":1407},[153,20507,20508],{"class":171},"    let",[153,20510,20511],{"class":313}," category ",[153,20513,1932],{"class":171},[153,20515,20516],{"class":167}," \"Normal\"",[153,20518,19955],{"class":313},[153,20520,20521,20524,20527,20530,20533,20536,20538,20541],{"class":155,"line":1129},[153,20522,20523],{"class":171},"    if",[153,20525,20526],{"class":313}," (bmi ",[153,20528,20529],{"class":171},"\u003C",[153,20531,20532],{"class":163}," 18.5",[153,20534,20535],{"class":313},") category ",[153,20537,1932],{"class":171},[153,20539,20540],{"class":167}," \"Underweight\"",[153,20542,19955],{"class":313},[153,20544,20545,20548,20551,20553,20556,20559,20561,20563,20566],{"class":155,"line":1417},[153,20546,20547],{"class":171},"    else",[153,20549,20550],{"class":171}," if",[153,20552,20526],{"class":313},[153,20554,20555],{"class":171},">=",[153,20557,20558],{"class":163}," 25",[153,20560,20535],{"class":313},[153,20562,1932],{"class":171},[153,20564,20565],{"class":167}," \"Overweight\"",[153,20567,19955],{"class":313},[153,20569,20570],{"class":155,"line":1423},[153,20571,246],{"emptyLinePlaceholder":245},[153,20573,20574,20576,20579,20581,20584,20587,20590,20592,20595,20597,20599,20601],{"class":155,"line":1683},[153,20575,20484],{"class":171},[153,20577,20578],{"class":163}," output",[153,20580,19998],{"class":171},[153,20582,20583],{"class":313}," { bmi: Math.",[153,20585,20586],{"class":159},"round",[153,20588,20589],{"class":313},"(bmi ",[153,20591,6160],{"class":171},[153,20593,20594],{"class":163}," 10",[153,20596,20270],{"class":313},[153,20598,20495],{"class":171},[153,20600,20594],{"class":163},[153,20602,20603],{"class":313},", category };\n",[153,20605,20606,20609],{"class":155,"line":1688},[153,20607,20608],{"class":171},"    return",[153,20610,20275],{"class":313},[153,20612,20613,20616,20618,20620,20623,20625,20628],{"class":155,"line":12900},[153,20614,20615],{"class":313},"      content: [{ type: ",[153,20617,20155],{"class":167},[153,20619,20158],{"class":313},[153,20621,20622],{"class":163},"JSON",[153,20624,667],{"class":313},[153,20626,20627],{"class":159},"stringify",[153,20629,20630],{"class":313},"(output) }],\n",[153,20632,20633],{"class":155,"line":12906},[153,20634,20635],{"class":313},"      structuredContent: output,\n",[153,20637,20638],{"class":155,"line":16075},[153,20639,20640],{"class":313},"    };\n",[153,20642,20643],{"class":155,"line":16089},[153,20644,19840],{"class":313},[153,20646,20647],{"class":155,"line":16096},[153,20648,20180],{"class":313},[35,20650,20652],{"id":20651},"step-4-add-resources","Step 4 — Add Resources",[143,20654,20656],{"className":19935,"code":20655,"language":18123,"meta":148,"style":148},"server.registerResource(\n  \"app-config\",\n  \"config:\u002F\u002Fapp\",\n  {\n    title: \"Application Configuration\",\n    description: \"Current app settings\",\n    mimeType: \"application\u002Fjson\",\n  },\n  async (uri) => ({\n    contents: [{\n      uri: uri.href,\n      text: JSON.stringify({ theme: \"dark\", version: \"2.0\" }, null, 2),\n    }],\n  }),\n);\n",[150,20657,20658,20667,20674,20681,20685,20694,20703,20713,20717,20732,20737,20742,20778,20783,20787],{"__ignoreMap":148},[153,20659,20660,20662,20665],{"class":155,"line":156},[153,20661,20041],{"class":313},[153,20663,20664],{"class":159},"registerResource",[153,20666,20047],{"class":313},[153,20668,20669,20672],{"class":155,"line":208},[153,20670,20671],{"class":167},"  \"app-config\"",[153,20673,3845],{"class":313},[153,20675,20676,20679],{"class":155,"line":242},[153,20677,20678],{"class":167},"  \"config:\u002F\u002Fapp\"",[153,20680,3845],{"class":313},[153,20682,20683],{"class":155,"line":249},[153,20684,20059],{"class":313},[153,20686,20687,20689,20692],{"class":155,"line":255},[153,20688,20357],{"class":313},[153,20690,20691],{"class":167},"\"Application Configuration\"",[153,20693,3845],{"class":313},[153,20695,20696,20698,20701],{"class":155,"line":268},[153,20697,20064],{"class":313},[153,20699,20700],{"class":167},"\"Current app settings\"",[153,20702,3845],{"class":313},[153,20704,20705,20708,20711],{"class":155,"line":281},[153,20706,20707],{"class":313},"    mimeType: ",[153,20709,20710],{"class":167},"\"application\u002Fjson\"",[153,20712,3845],{"class":313},[153,20714,20715],{"class":155,"line":1356},[153,20716,19840],{"class":313},[153,20718,20719,20721,20723,20726,20728,20730],{"class":155,"line":1362},[153,20720,20127],{"class":171},[153,20722,13847],{"class":313},[153,20724,20725],{"class":20133},"uri",[153,20727,20270],{"class":313},[153,20729,20144],{"class":171},[153,20731,20147],{"class":313},[153,20733,20734],{"class":155,"line":1367},[153,20735,20736],{"class":313},"    contents: [{\n",[153,20738,20739],{"class":155,"line":1372},[153,20740,20741],{"class":313},"      uri: uri.href,\n",[153,20743,20744,20747,20749,20751,20753,20756,20759,20762,20765,20768,20771,20773,20776],{"class":155,"line":1378},[153,20745,20746],{"class":313},"      text: ",[153,20748,20622],{"class":163},[153,20750,667],{"class":313},[153,20752,20627],{"class":159},[153,20754,20755],{"class":313},"({ theme: ",[153,20757,20758],{"class":167},"\"dark\"",[153,20760,20761],{"class":313},", version: ",[153,20763,20764],{"class":167},"\"2.0\"",[153,20766,20767],{"class":313}," }, ",[153,20769,20770],{"class":163},"null",[153,20772,528],{"class":313},[153,20774,20775],{"class":163},"2",[153,20777,20096],{"class":313},[153,20779,20780],{"class":155,"line":1383},[153,20781,20782],{"class":313},"    }],\n",[153,20784,20785],{"class":155,"line":1389},[153,20786,20175],{"class":313},[153,20788,20789],{"class":155,"line":1395},[153,20790,20180],{"class":313},[35,20792,20794],{"id":20793},"step-5-add-prompts","Step 5 — Add Prompts",[143,20796,20798],{"className":19935,"code":20797,"language":18123,"meta":148,"style":148},"server.registerPrompt(\n  \"code-review\",\n  {\n    title: \"Code Review\",\n    description: \"Review code for best practices\",\n    argsSchema: z.object({\n      code: z.string().describe(\"The code to review\"),\n      language: z.string().default(\"typescript\"),\n    }),\n  },\n  ({ code, language }) => ({\n    messages: [{\n      role: \"user\" as const,\n      content: {\n        type: \"text\" as const,\n        text: `Review this ${language} code:\\n\\`\\`\\`${language}\\n${code}\\n\\`\\`\\``,\n      },\n    }],\n  }),\n);\n",[150,20799,20800,20809,20816,20820,20829,20838,20847,20865,20884,20888,20892,20910,20915,20931,20936,20949,20989,20994,20998,21002],{"__ignoreMap":148},[153,20801,20802,20804,20807],{"class":155,"line":156},[153,20803,20041],{"class":313},[153,20805,20806],{"class":159},"registerPrompt",[153,20808,20047],{"class":313},[153,20810,20811,20814],{"class":155,"line":208},[153,20812,20813],{"class":167},"  \"code-review\"",[153,20815,3845],{"class":313},[153,20817,20818],{"class":155,"line":242},[153,20819,20059],{"class":313},[153,20821,20822,20824,20827],{"class":155,"line":249},[153,20823,20357],{"class":313},[153,20825,20826],{"class":167},"\"Code Review\"",[153,20828,3845],{"class":313},[153,20830,20831,20833,20836],{"class":155,"line":255},[153,20832,20064],{"class":313},[153,20834,20835],{"class":167},"\"Review code for best practices\"",[153,20837,3845],{"class":313},[153,20839,20840,20843,20845],{"class":155,"line":268},[153,20841,20842],{"class":313},"    argsSchema: z.",[153,20844,20379],{"class":159},[153,20846,20007],{"class":313},[153,20848,20849,20852,20854,20856,20858,20860,20863],{"class":155,"line":281},[153,20850,20851],{"class":313},"      code: z.",[153,20853,20449],{"class":159},[153,20855,20085],{"class":313},[153,20857,20088],{"class":159},[153,20859,1935],{"class":313},[153,20861,20862],{"class":167},"\"The code to review\"",[153,20864,20096],{"class":313},[153,20866,20867,20870,20872,20874,20877,20879,20882],{"class":155,"line":1356},[153,20868,20869],{"class":313},"      language: z.",[153,20871,20449],{"class":159},[153,20873,20085],{"class":313},[153,20875,20876],{"class":159},"default",[153,20878,1935],{"class":313},[153,20880,20881],{"class":167},"\"typescript\"",[153,20883,20096],{"class":313},[153,20885,20886],{"class":155,"line":1362},[153,20887,20422],{"class":313},[153,20889,20890],{"class":155,"line":1367},[153,20891,19840],{"class":313},[153,20893,20894,20897,20899,20901,20904,20906,20908],{"class":155,"line":1372},[153,20895,20896],{"class":313},"  ({ ",[153,20898,150],{"class":20133},[153,20900,528],{"class":313},[153,20902,20903],{"class":20133},"language",[153,20905,20141],{"class":313},[153,20907,20144],{"class":171},[153,20909,20147],{"class":313},[153,20911,20912],{"class":155,"line":1378},[153,20913,20914],{"class":313},"    messages: [{\n",[153,20916,20917,20920,20923,20926,20929],{"class":155,"line":1383},[153,20918,20919],{"class":313},"      role: ",[153,20921,20922],{"class":167},"\"user\"",[153,20924,20925],{"class":171}," as",[153,20927,20928],{"class":171}," const",[153,20930,3845],{"class":313},[153,20932,20933],{"class":155,"line":1389},[153,20934,20935],{"class":313},"      content: {\n",[153,20937,20938,20941,20943,20945,20947],{"class":155,"line":1395},[153,20939,20940],{"class":313},"        type: ",[153,20942,20155],{"class":167},[153,20944,20925],{"class":171},[153,20946,20928],{"class":171},[153,20948,3845],{"class":313},[153,20950,20951,20954,20957,20959,20962,20965,20968,20970,20973,20976,20978,20980,20982,20984,20987],{"class":155,"line":1401},[153,20952,20953],{"class":313},"        text: ",[153,20955,20956],{"class":167},"`Review this ${",[153,20958,20903],{"class":313},[153,20960,20961],{"class":167},"} code:",[153,20963,20964],{"class":163},"\\n\\`\\`\\`",[153,20966,20967],{"class":167},"${",[153,20969,20903],{"class":313},[153,20971,20972],{"class":167},"}",[153,20974,20975],{"class":163},"\\n",[153,20977,20967],{"class":167},[153,20979,150],{"class":313},[153,20981,20972],{"class":167},[153,20983,20964],{"class":163},[153,20985,20986],{"class":167},"`",[153,20988,3845],{"class":313},[153,20990,20991],{"class":155,"line":1407},[153,20992,20993],{"class":313},"      },\n",[153,20995,20996],{"class":155,"line":1129},[153,20997,20782],{"class":313},[153,20999,21000],{"class":155,"line":1417},[153,21001,20175],{"class":313},[153,21003,21004],{"class":155,"line":1423},[153,21005,20180],{"class":313},[35,21007,21009],{"id":21008},"step-6-tool-annotations","Step 6 — Tool Annotations",[12,21011,21012],{},"Annotations give clients metadata about tool behavior:",[143,21014,21016],{"className":19935,"code":21015,"language":18123,"meta":148,"style":148},"server.registerTool(\n  \"delete-file\",\n  {\n    description: \"Delete a file from the project\",\n    inputSchema: z.object({\n      path: z.string().describe(\"Path to file\"),\n    }),\n    annotations: {\n      title: \"Delete File\",\n      destructiveHint: true,\n      idempotentHint: true,\n    },\n  },\n  async ({ path }) => ({\n    content: [{ type: \"text\", text: `Deleted ${path}` }],\n  }),\n);\n",[150,21017,21018,21026,21033,21037,21046,21054,21072,21076,21081,21091,21100,21109,21113,21117,21132,21151,21155],{"__ignoreMap":148},[153,21019,21020,21022,21024],{"class":155,"line":156},[153,21021,20041],{"class":313},[153,21023,20044],{"class":159},[153,21025,20047],{"class":313},[153,21027,21028,21031],{"class":155,"line":208},[153,21029,21030],{"class":167},"  \"delete-file\"",[153,21032,3845],{"class":313},[153,21034,21035],{"class":155,"line":242},[153,21036,20059],{"class":313},[153,21038,21039,21041,21044],{"class":155,"line":249},[153,21040,20064],{"class":313},[153,21042,21043],{"class":167},"\"Delete a file from the project\"",[153,21045,3845],{"class":313},[153,21047,21048,21050,21052],{"class":155,"line":255},[153,21049,20376],{"class":313},[153,21051,20379],{"class":159},[153,21053,20007],{"class":313},[153,21055,21056,21059,21061,21063,21065,21067,21070],{"class":155,"line":268},[153,21057,21058],{"class":313},"      path: z.",[153,21060,20449],{"class":159},[153,21062,20085],{"class":313},[153,21064,20088],{"class":159},[153,21066,1935],{"class":313},[153,21068,21069],{"class":167},"\"Path to file\"",[153,21071,20096],{"class":313},[153,21073,21074],{"class":155,"line":281},[153,21075,20422],{"class":313},[153,21077,21078],{"class":155,"line":1356},[153,21079,21080],{"class":313},"    annotations: {\n",[153,21082,21083,21086,21089],{"class":155,"line":1362},[153,21084,21085],{"class":313},"      title: ",[153,21087,21088],{"class":167},"\"Delete File\"",[153,21090,3845],{"class":313},[153,21092,21093,21096,21098],{"class":155,"line":1367},[153,21094,21095],{"class":313},"      destructiveHint: ",[153,21097,19813],{"class":163},[153,21099,3845],{"class":313},[153,21101,21102,21105,21107],{"class":155,"line":1372},[153,21103,21104],{"class":313},"      idempotentHint: ",[153,21106,19813],{"class":163},[153,21108,3845],{"class":313},[153,21110,21111],{"class":155,"line":1378},[153,21112,5300],{"class":313},[153,21114,21115],{"class":155,"line":1383},[153,21116,19840],{"class":313},[153,21118,21119,21121,21123,21126,21128,21130],{"class":155,"line":1389},[153,21120,20127],{"class":171},[153,21122,20130],{"class":313},[153,21124,21125],{"class":20133},"path",[153,21127,20141],{"class":313},[153,21129,20144],{"class":171},[153,21131,20147],{"class":313},[153,21133,21134,21136,21138,21140,21143,21145,21148],{"class":155,"line":1395},[153,21135,20152],{"class":313},[153,21137,20155],{"class":167},[153,21139,20158],{"class":313},[153,21141,21142],{"class":167},"`Deleted ${",[153,21144,21125],{"class":313},[153,21146,21147],{"class":167},"}`",[153,21149,21150],{"class":313}," }],\n",[153,21152,21153],{"class":155,"line":1401},[153,21154,20175],{"class":313},[153,21156,21157],{"class":155,"line":1407},[153,21158,20180],{"class":313},[35,21160,21162],{"id":21161},"step-7-error-handling","Step 7 — Error Handling",[143,21164,21166],{"className":19935,"code":21165,"language":18123,"meta":148,"style":148},"server.registerTool(\n  \"fetch-data\",\n  {\n    description: \"Fetch data from a URL\",\n    inputSchema: z.object({\n      url: z.string().url().describe(\"URL to fetch\"),\n    }),\n  },\n  async ({ url }) => {\n    try {\n      const response = await fetch(url);\n      if (!response.ok) {\n        return {\n          content: [{ type: \"text\", text: `HTTP ${response.status}` }],\n          isError: true,\n        };\n      }\n      return { content: [{ type: \"text\", text: await response.text() }] };\n    } catch (error) {\n      return {\n        content: [{\n          type: \"text\",\n          text: `Failed: ${error instanceof Error ? error.message : String(error)}`,\n        }],\n        isError: true,\n      };\n    }\n  },\n);\n",[150,21167,21168,21176,21183,21187,21196,21204,21227,21231,21235,21249,21256,21275,21288,21295,21319,21328,21333,21337,21360,21370,21376,21381,21390,21433,21438,21447,21452,21456,21460],{"__ignoreMap":148},[153,21169,21170,21172,21174],{"class":155,"line":156},[153,21171,20041],{"class":313},[153,21173,20044],{"class":159},[153,21175,20047],{"class":313},[153,21177,21178,21181],{"class":155,"line":208},[153,21179,21180],{"class":167},"  \"fetch-data\"",[153,21182,3845],{"class":313},[153,21184,21185],{"class":155,"line":242},[153,21186,20059],{"class":313},[153,21188,21189,21191,21194],{"class":155,"line":249},[153,21190,20064],{"class":313},[153,21192,21193],{"class":167},"\"Fetch data from a URL\"",[153,21195,3845],{"class":313},[153,21197,21198,21200,21202],{"class":155,"line":255},[153,21199,20376],{"class":313},[153,21201,20379],{"class":159},[153,21203,20007],{"class":313},[153,21205,21206,21209,21211,21213,21216,21218,21220,21222,21225],{"class":155,"line":268},[153,21207,21208],{"class":313},"      url: z.",[153,21210,20449],{"class":159},[153,21212,20085],{"class":313},[153,21214,21215],{"class":159},"url",[153,21217,20085],{"class":313},[153,21219,20088],{"class":159},[153,21221,1935],{"class":313},[153,21223,21224],{"class":167},"\"URL to fetch\"",[153,21226,20096],{"class":313},[153,21228,21229],{"class":155,"line":281},[153,21230,20422],{"class":313},[153,21232,21233],{"class":155,"line":1356},[153,21234,19840],{"class":313},[153,21236,21237,21239,21241,21243,21245,21247],{"class":155,"line":1362},[153,21238,20127],{"class":171},[153,21240,20130],{"class":313},[153,21242,21215],{"class":20133},[153,21244,20141],{"class":313},[153,21246,20144],{"class":171},[153,21248,20275],{"class":313},[153,21250,21251,21254],{"class":155,"line":1367},[153,21252,21253],{"class":171},"    try",[153,21255,20275],{"class":313},[153,21257,21258,21261,21264,21266,21269,21272],{"class":155,"line":1372},[153,21259,21260],{"class":171},"      const",[153,21262,21263],{"class":163}," response",[153,21265,19998],{"class":171},[153,21267,21268],{"class":171}," await",[153,21270,21271],{"class":159}," fetch",[153,21273,21274],{"class":313},"(url);\n",[153,21276,21277,21280,21282,21285],{"class":155,"line":1378},[153,21278,21279],{"class":171},"      if",[153,21281,13847],{"class":313},[153,21283,21284],{"class":171},"!",[153,21286,21287],{"class":313},"response.ok) {\n",[153,21289,21290,21293],{"class":155,"line":1383},[153,21291,21292],{"class":171},"        return",[153,21294,20275],{"class":313},[153,21296,21297,21300,21302,21304,21307,21310,21312,21315,21317],{"class":155,"line":1389},[153,21298,21299],{"class":313},"          content: [{ type: ",[153,21301,20155],{"class":167},[153,21303,20158],{"class":313},[153,21305,21306],{"class":167},"`HTTP ${",[153,21308,21309],{"class":313},"response",[153,21311,667],{"class":167},[153,21313,21314],{"class":313},"status",[153,21316,21147],{"class":167},[153,21318,21150],{"class":313},[153,21320,21321,21324,21326],{"class":155,"line":1395},[153,21322,21323],{"class":313},"          isError: ",[153,21325,19813],{"class":163},[153,21327,3845],{"class":313},[153,21329,21330],{"class":155,"line":1401},[153,21331,21332],{"class":313},"        };\n",[153,21334,21335],{"class":155,"line":1407},[153,21336,3886],{"class":313},[153,21338,21339,21342,21345,21347,21349,21352,21355,21357],{"class":155,"line":1129},[153,21340,21341],{"class":171},"      return",[153,21343,21344],{"class":313}," { content: [{ type: ",[153,21346,20155],{"class":167},[153,21348,20158],{"class":313},[153,21350,21351],{"class":171},"await",[153,21353,21354],{"class":313}," response.",[153,21356,1280],{"class":159},[153,21358,21359],{"class":313},"() }] };\n",[153,21361,21362,21365,21367],{"class":155,"line":1417},[153,21363,21364],{"class":313},"    } ",[153,21366,20262],{"class":171},[153,21368,21369],{"class":313}," (error) {\n",[153,21371,21372,21374],{"class":155,"line":1423},[153,21373,21341],{"class":171},[153,21375,20275],{"class":313},[153,21377,21378],{"class":155,"line":1683},[153,21379,21380],{"class":313},"        content: [{\n",[153,21382,21383,21386,21388],{"class":155,"line":1688},[153,21384,21385],{"class":313},"          type: ",[153,21387,20155],{"class":167},[153,21389,3845],{"class":313},[153,21391,21392,21395,21398,21400,21403,21406,21409,21412,21414,21417,21420,21423,21425,21427,21429,21431],{"class":155,"line":12900},[153,21393,21394],{"class":313},"          text: ",[153,21396,21397],{"class":167},"`Failed: ${",[153,21399,20237],{"class":313},[153,21401,21402],{"class":171}," instanceof",[153,21404,21405],{"class":159}," Error",[153,21407,21408],{"class":171}," ?",[153,21410,21411],{"class":313}," error",[153,21413,667],{"class":167},[153,21415,21416],{"class":313},"message",[153,21418,21419],{"class":171}," :",[153,21421,21422],{"class":159}," String",[153,21424,1935],{"class":167},[153,21426,20237],{"class":313},[153,21428,439],{"class":167},[153,21430,21147],{"class":167},[153,21432,3845],{"class":313},[153,21434,21435],{"class":155,"line":12906},[153,21436,21437],{"class":313},"        }],\n",[153,21439,21440,21443,21445],{"class":155,"line":16075},[153,21441,21442],{"class":313},"        isError: ",[153,21444,19813],{"class":163},[153,21446,3845],{"class":313},[153,21448,21449],{"class":155,"line":16089},[153,21450,21451],{"class":313},"      };\n",[153,21453,21454],{"class":155,"line":16096},[153,21455,3891],{"class":313},[153,21457,21458],{"class":155,"line":16102},[153,21459,19840],{"class":313},[153,21461,21462],{"class":155,"line":16107},[153,21463,20180],{"class":313},[35,21465,21467],{"id":21466},"step-8-complete-example-file-analyzer","Step 8 — Complete Example: File Analyzer",[143,21469,21471],{"className":19935,"code":21470,"language":18123,"meta":148,"style":148},"import { McpServer } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fmcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js\";\nimport { z } from \"zod\";\nimport { readFile, readdir, stat } from \"fs\u002Fpromises\";\nimport { join, extname } from \"path\";\n\nconst server = new McpServer({ name: \"file-analyzer\", version: \"1.0.0\" });\n\nserver.registerTool(\n  \"analyze-file\",\n  {\n    description: \"Analyze a text file and return statistics\",\n    inputSchema: {\n      filePath: z.string().describe(\"Absolute path to the file\"),\n    },\n  },\n  async ({ filePath }) => {\n    try {\n      const content = await readFile(filePath, \"utf-8\");\n      const lines = content.split(\"\\n\");\n      const words = content.split(\u002F\\s+\u002F).filter(Boolean);\n\n      const result = [\n        `File: ${filePath}`,\n        `Lines: ${lines.length}`,\n        `Words: ${words.length}`,\n        `Characters: ${content.length}`,\n        `Extension: ${extname(filePath)}`,\n      ].join(\"\\n\");\n\n      return { content: [{ type: \"text\", text: result }] };\n    } catch (error) {\n      return {\n        content: [{\n          type: \"text\",\n          text: `Error: ${error instanceof Error ? error.message : String(error)}`,\n        }],\n        isError: true,\n      };\n    }\n  },\n);\n\nserver.registerTool(\n  \"list-directory\",\n  {\n    description: \"List files in a directory with sizes\",\n    inputSchema: {\n      dirPath: z.string().describe(\"Absolute path to directory\"),\n      extension: z.string().optional().describe(\"Filter by extension\"),\n    },\n  },\n  async ({ dirPath, extension }) => {\n    let entries = await readdir(dirPath);\n    if (extension) entries = entries.filter((e) => e.endsWith(extension));\n\n    const details = await Promise.all(\n      entries.slice(0, 50).map(async (entry) => {\n        const stats = await stat(join(dirPath, entry));\n        const size = stats.isDirectory()\n          ? \"[DIR]\"\n          : `${(stats.size \u002F 1024).toFixed(1)} KB`;\n        return `${entry} (${size})`;\n      }),\n    );\n\n    return {\n      content: [{ type: \"text\", text: details.join(\"\\n\") || \"Empty directory\" }],\n    };\n  },\n);\n\nasync function main() {\n  const transport = new StdioServerTransport();\n  await server.connect(transport);\n  console.error(\"File Analyzer MCP Server running\");\n}\n\nmain().catch(console.error);\n",[150,21472,21473,21485,21497,21509,21523,21537,21541,21566,21570,21578,21585,21589,21598,21602,21620,21624,21628,21643,21649,21671,21696,21728,21732,21744,21755,21772,21788,21804,21822,21840,21844,21855,21863,21869,21873,21881,21916,21920,21928,21932,21936,21940,21944,21948,21956,21963,21967,21976,21980,21998,22021,22025,22029,22049,22066,22098,22102,22123,22161,22183,22201,22209,22249,22267,22272,22277,22281,22287,22316,22320,22324,22328,22332,22342,22356,22366,22379,22383,22387],{"__ignoreMap":148},[153,21474,21475,21477,21479,21481,21483],{"class":155,"line":156},[153,21476,19943],{"class":171},[153,21478,19946],{"class":313},[153,21480,19949],{"class":171},[153,21482,19952],{"class":167},[153,21484,19955],{"class":313},[153,21486,21487,21489,21491,21493,21495],{"class":155,"line":208},[153,21488,19943],{"class":171},[153,21490,19962],{"class":313},[153,21492,19949],{"class":171},[153,21494,19967],{"class":167},[153,21496,19955],{"class":313},[153,21498,21499,21501,21503,21505,21507],{"class":155,"line":242},[153,21500,19943],{"class":171},[153,21502,19976],{"class":313},[153,21504,19949],{"class":171},[153,21506,19981],{"class":167},[153,21508,19955],{"class":313},[153,21510,21511,21513,21516,21518,21521],{"class":155,"line":249},[153,21512,19943],{"class":171},[153,21514,21515],{"class":313}," { readFile, readdir, stat } ",[153,21517,19949],{"class":171},[153,21519,21520],{"class":167}," \"fs\u002Fpromises\"",[153,21522,19955],{"class":313},[153,21524,21525,21527,21530,21532,21535],{"class":155,"line":255},[153,21526,19943],{"class":171},[153,21528,21529],{"class":313}," { join, extname } ",[153,21531,19949],{"class":171},[153,21533,21534],{"class":167}," \"path\"",[153,21536,19955],{"class":313},[153,21538,21539],{"class":155,"line":268},[153,21540,246],{"emptyLinePlaceholder":245},[153,21542,21543,21545,21547,21549,21551,21553,21556,21559,21561,21563],{"class":155,"line":281},[153,21544,19992],{"class":171},[153,21546,19995],{"class":163},[153,21548,19998],{"class":171},[153,21550,20001],{"class":171},[153,21552,20004],{"class":159},[153,21554,21555],{"class":313},"({ name: ",[153,21557,21558],{"class":167},"\"file-analyzer\"",[153,21560,20761],{"class":313},[153,21562,20025],{"class":167},[153,21564,21565],{"class":313}," });\n",[153,21567,21568],{"class":155,"line":1356},[153,21569,246],{"emptyLinePlaceholder":245},[153,21571,21572,21574,21576],{"class":155,"line":1362},[153,21573,20041],{"class":313},[153,21575,20044],{"class":159},[153,21577,20047],{"class":313},[153,21579,21580,21583],{"class":155,"line":1367},[153,21581,21582],{"class":167},"  \"analyze-file\"",[153,21584,3845],{"class":313},[153,21586,21587],{"class":155,"line":1372},[153,21588,20059],{"class":313},[153,21590,21591,21593,21596],{"class":155,"line":1378},[153,21592,20064],{"class":313},[153,21594,21595],{"class":167},"\"Analyze a text file and return statistics\"",[153,21597,3845],{"class":313},[153,21599,21600],{"class":155,"line":1383},[153,21601,20074],{"class":313},[153,21603,21604,21607,21609,21611,21613,21615,21618],{"class":155,"line":1389},[153,21605,21606],{"class":313},"      filePath: z.",[153,21608,20449],{"class":159},[153,21610,20085],{"class":313},[153,21612,20088],{"class":159},[153,21614,1935],{"class":313},[153,21616,21617],{"class":167},"\"Absolute path to the file\"",[153,21619,20096],{"class":313},[153,21621,21622],{"class":155,"line":1395},[153,21623,5300],{"class":313},[153,21625,21626],{"class":155,"line":1401},[153,21627,19840],{"class":313},[153,21629,21630,21632,21634,21637,21639,21641],{"class":155,"line":1407},[153,21631,20127],{"class":171},[153,21633,20130],{"class":313},[153,21635,21636],{"class":20133},"filePath",[153,21638,20141],{"class":313},[153,21640,20144],{"class":171},[153,21642,20275],{"class":313},[153,21644,21645,21647],{"class":155,"line":1129},[153,21646,21253],{"class":171},[153,21648,20275],{"class":313},[153,21650,21651,21653,21656,21658,21660,21663,21666,21669],{"class":155,"line":1417},[153,21652,21260],{"class":171},[153,21654,21655],{"class":163}," content",[153,21657,19998],{"class":171},[153,21659,21268],{"class":171},[153,21661,21662],{"class":159}," readFile",[153,21664,21665],{"class":313},"(filePath, ",[153,21667,21668],{"class":167},"\"utf-8\"",[153,21670,20180],{"class":313},[153,21672,21673,21675,21678,21680,21683,21686,21688,21690,21692,21694],{"class":155,"line":1423},[153,21674,21260],{"class":171},[153,21676,21677],{"class":163}," lines",[153,21679,19998],{"class":171},[153,21681,21682],{"class":313}," content.",[153,21684,21685],{"class":159},"split",[153,21687,1935],{"class":313},[153,21689,1867],{"class":167},[153,21691,20975],{"class":163},[153,21693,1867],{"class":167},[153,21695,20180],{"class":313},[153,21697,21698,21700,21703,21705,21707,21709,21711,21713,21716,21718,21720,21722,21725],{"class":155,"line":1683},[153,21699,21260],{"class":171},[153,21701,21702],{"class":163}," words",[153,21704,19998],{"class":171},[153,21706,21682],{"class":313},[153,21708,21685],{"class":159},[153,21710,1935],{"class":313},[153,21712,20495],{"class":167},[153,21714,21715],{"class":163},"\\s",[153,21717,20167],{"class":171},[153,21719,20495],{"class":167},[153,21721,987],{"class":313},[153,21723,21724],{"class":159},"filter",[153,21726,21727],{"class":313},"(Boolean);\n",[153,21729,21730],{"class":155,"line":1688},[153,21731,246],{"emptyLinePlaceholder":245},[153,21733,21734,21736,21739,21741],{"class":155,"line":12900},[153,21735,21260],{"class":171},[153,21737,21738],{"class":163}," result",[153,21740,19998],{"class":171},[153,21742,21743],{"class":313}," [\n",[153,21745,21746,21749,21751,21753],{"class":155,"line":12906},[153,21747,21748],{"class":167},"        `File: ${",[153,21750,21636],{"class":313},[153,21752,21147],{"class":167},[153,21754,3845],{"class":313},[153,21756,21757,21760,21763,21765,21768,21770],{"class":155,"line":16075},[153,21758,21759],{"class":167},"        `Lines: ${",[153,21761,21762],{"class":313},"lines",[153,21764,667],{"class":167},[153,21766,21767],{"class":163},"length",[153,21769,21147],{"class":167},[153,21771,3845],{"class":313},[153,21773,21774,21777,21780,21782,21784,21786],{"class":155,"line":16089},[153,21775,21776],{"class":167},"        `Words: ${",[153,21778,21779],{"class":313},"words",[153,21781,667],{"class":167},[153,21783,21767],{"class":163},[153,21785,21147],{"class":167},[153,21787,3845],{"class":313},[153,21789,21790,21793,21796,21798,21800,21802],{"class":155,"line":16096},[153,21791,21792],{"class":167},"        `Characters: ${",[153,21794,21795],{"class":313},"content",[153,21797,667],{"class":167},[153,21799,21767],{"class":163},[153,21801,21147],{"class":167},[153,21803,3845],{"class":313},[153,21805,21806,21809,21812,21814,21816,21818,21820],{"class":155,"line":16102},[153,21807,21808],{"class":167},"        `Extension: ${",[153,21810,21811],{"class":159},"extname",[153,21813,1935],{"class":167},[153,21815,21636],{"class":313},[153,21817,439],{"class":167},[153,21819,21147],{"class":167},[153,21821,3845],{"class":313},[153,21823,21824,21827,21830,21832,21834,21836,21838],{"class":155,"line":16107},[153,21825,21826],{"class":313},"      ].",[153,21828,21829],{"class":159},"join",[153,21831,1935],{"class":313},[153,21833,1867],{"class":167},[153,21835,20975],{"class":163},[153,21837,1867],{"class":167},[153,21839,20180],{"class":313},[153,21841,21842],{"class":155,"line":16115},[153,21843,246],{"emptyLinePlaceholder":245},[153,21845,21846,21848,21850,21852],{"class":155,"line":17034},[153,21847,21341],{"class":171},[153,21849,21344],{"class":313},[153,21851,20155],{"class":167},[153,21853,21854],{"class":313},", text: result }] };\n",[153,21856,21857,21859,21861],{"class":155,"line":17039},[153,21858,21364],{"class":313},[153,21860,20262],{"class":171},[153,21862,21369],{"class":313},[153,21864,21865,21867],{"class":155,"line":17044},[153,21866,21341],{"class":171},[153,21868,20275],{"class":313},[153,21870,21871],{"class":155,"line":17050},[153,21872,21380],{"class":313},[153,21874,21875,21877,21879],{"class":155,"line":17055},[153,21876,21385],{"class":313},[153,21878,20155],{"class":167},[153,21880,3845],{"class":313},[153,21882,21883,21885,21888,21890,21892,21894,21896,21898,21900,21902,21904,21906,21908,21910,21912,21914],{"class":155,"line":17061},[153,21884,21394],{"class":313},[153,21886,21887],{"class":167},"`Error: ${",[153,21889,20237],{"class":313},[153,21891,21402],{"class":171},[153,21893,21405],{"class":159},[153,21895,21408],{"class":171},[153,21897,21411],{"class":313},[153,21899,667],{"class":167},[153,21901,21416],{"class":313},[153,21903,21419],{"class":171},[153,21905,21422],{"class":159},[153,21907,1935],{"class":167},[153,21909,20237],{"class":313},[153,21911,439],{"class":167},[153,21913,21147],{"class":167},[153,21915,3845],{"class":313},[153,21917,21918],{"class":155,"line":17067},[153,21919,21437],{"class":313},[153,21921,21922,21924,21926],{"class":155,"line":17073},[153,21923,21442],{"class":313},[153,21925,19813],{"class":163},[153,21927,3845],{"class":313},[153,21929,21930],{"class":155,"line":17079},[153,21931,21451],{"class":313},[153,21933,21934],{"class":155,"line":17085},[153,21935,3891],{"class":313},[153,21937,21938],{"class":155,"line":17091},[153,21939,19840],{"class":313},[153,21941,21942],{"class":155,"line":17097},[153,21943,20180],{"class":313},[153,21945,21946],{"class":155,"line":17102},[153,21947,246],{"emptyLinePlaceholder":245},[153,21949,21950,21952,21954],{"class":155,"line":17107},[153,21951,20041],{"class":313},[153,21953,20044],{"class":159},[153,21955,20047],{"class":313},[153,21957,21958,21961],{"class":155,"line":17113},[153,21959,21960],{"class":167},"  \"list-directory\"",[153,21962,3845],{"class":313},[153,21964,21965],{"class":155,"line":17118},[153,21966,20059],{"class":313},[153,21968,21969,21971,21974],{"class":155,"line":17124},[153,21970,20064],{"class":313},[153,21972,21973],{"class":167},"\"List files in a directory with sizes\"",[153,21975,3845],{"class":313},[153,21977,21978],{"class":155,"line":17130},[153,21979,20074],{"class":313},[153,21981,21982,21985,21987,21989,21991,21993,21996],{"class":155,"line":17136},[153,21983,21984],{"class":313},"      dirPath: z.",[153,21986,20449],{"class":159},[153,21988,20085],{"class":313},[153,21990,20088],{"class":159},[153,21992,1935],{"class":313},[153,21994,21995],{"class":167},"\"Absolute path to directory\"",[153,21997,20096],{"class":313},[153,21999,22000,22003,22005,22007,22010,22012,22014,22016,22019],{"class":155,"line":17141},[153,22001,22002],{"class":313},"      extension: z.",[153,22004,20449],{"class":159},[153,22006,20085],{"class":313},[153,22008,22009],{"class":159},"optional",[153,22011,20085],{"class":313},[153,22013,20088],{"class":159},[153,22015,1935],{"class":313},[153,22017,22018],{"class":167},"\"Filter by extension\"",[153,22020,20096],{"class":313},[153,22022,22023],{"class":155,"line":17147},[153,22024,5300],{"class":313},[153,22026,22027],{"class":155,"line":17153},[153,22028,19840],{"class":313},[153,22030,22031,22033,22035,22038,22040,22043,22045,22047],{"class":155,"line":17159},[153,22032,20127],{"class":171},[153,22034,20130],{"class":313},[153,22036,22037],{"class":20133},"dirPath",[153,22039,528],{"class":313},[153,22041,22042],{"class":20133},"extension",[153,22044,20141],{"class":313},[153,22046,20144],{"class":171},[153,22048,20275],{"class":313},[153,22050,22051,22053,22056,22058,22060,22063],{"class":155,"line":17165},[153,22052,20508],{"class":171},[153,22054,22055],{"class":313}," entries ",[153,22057,1932],{"class":171},[153,22059,21268],{"class":171},[153,22061,22062],{"class":159}," readdir",[153,22064,22065],{"class":313},"(dirPath);\n",[153,22067,22068,22070,22073,22075,22078,22080,22082,22085,22087,22089,22092,22095],{"class":155,"line":17171},[153,22069,20523],{"class":171},[153,22071,22072],{"class":313}," (extension) entries ",[153,22074,1932],{"class":171},[153,22076,22077],{"class":313}," entries.",[153,22079,21724],{"class":159},[153,22081,20265],{"class":313},[153,22083,22084],{"class":20133},"e",[153,22086,20270],{"class":313},[153,22088,20144],{"class":171},[153,22090,22091],{"class":313}," e.",[153,22093,22094],{"class":159},"endsWith",[153,22096,22097],{"class":313},"(extension));\n",[153,22099,22100],{"class":155,"line":17177},[153,22101,246],{"emptyLinePlaceholder":245},[153,22103,22104,22106,22109,22111,22113,22116,22118,22121],{"class":155,"line":17183},[153,22105,20484],{"class":171},[153,22107,22108],{"class":163}," details",[153,22110,19998],{"class":171},[153,22112,21268],{"class":171},[153,22114,22115],{"class":163}," Promise",[153,22117,667],{"class":313},[153,22119,22120],{"class":159},"all",[153,22122,20047],{"class":313},[153,22124,22125,22128,22131,22133,22136,22138,22141,22143,22146,22148,22150,22152,22155,22157,22159],{"class":155,"line":17188},[153,22126,22127],{"class":313},"      entries.",[153,22129,22130],{"class":159},"slice",[153,22132,1935],{"class":313},[153,22134,22135],{"class":163},"0",[153,22137,528],{"class":313},[153,22139,22140],{"class":163},"50",[153,22142,987],{"class":313},[153,22144,22145],{"class":159},"map",[153,22147,1935],{"class":313},[153,22149,20189],{"class":171},[153,22151,13847],{"class":313},[153,22153,22154],{"class":20133},"entry",[153,22156,20270],{"class":313},[153,22158,20144],{"class":171},[153,22160,20275],{"class":313},[153,22162,22163,22166,22169,22171,22173,22176,22178,22180],{"class":155,"line":17193},[153,22164,22165],{"class":171},"        const",[153,22167,22168],{"class":163}," stats",[153,22170,19998],{"class":171},[153,22172,21268],{"class":171},[153,22174,22175],{"class":159}," stat",[153,22177,1935],{"class":313},[153,22179,21829],{"class":159},[153,22181,22182],{"class":313},"(dirPath, entry));\n",[153,22184,22185,22187,22190,22192,22195,22198],{"class":155,"line":17198},[153,22186,22165],{"class":171},[153,22188,22189],{"class":163}," size",[153,22191,19998],{"class":171},[153,22193,22194],{"class":313}," stats.",[153,22196,22197],{"class":159},"isDirectory",[153,22199,22200],{"class":313},"()\n",[153,22202,22203,22206],{"class":155,"line":17204},[153,22204,22205],{"class":171},"          ?",[153,22207,22208],{"class":167}," \"[DIR]\"\n",[153,22210,22211,22214,22217,22219,22222,22224,22227,22230,22233,22235,22238,22240,22242,22244,22247],{"class":155,"line":17210},[153,22212,22213],{"class":171},"          :",[153,22215,22216],{"class":167}," `${",[153,22218,1935],{"class":167},[153,22220,22221],{"class":313},"stats",[153,22223,667],{"class":167},[153,22225,22226],{"class":313},"size",[153,22228,22229],{"class":171}," \u002F",[153,22231,22232],{"class":163}," 1024",[153,22234,987],{"class":167},[153,22236,22237],{"class":159},"toFixed",[153,22239,1935],{"class":167},[153,22241,20301],{"class":163},[153,22243,439],{"class":167},[153,22245,22246],{"class":167},"} KB`",[153,22248,19955],{"class":313},[153,22250,22251,22253,22255,22257,22260,22262,22265],{"class":155,"line":17216},[153,22252,21292],{"class":171},[153,22254,22216],{"class":167},[153,22256,22154],{"class":313},[153,22258,22259],{"class":167},"} (${",[153,22261,22226],{"class":313},[153,22263,22264],{"class":167},"})`",[153,22266,19955],{"class":313},[153,22268,22269],{"class":155,"line":17222},[153,22270,22271],{"class":313},"      }),\n",[153,22273,22274],{"class":155,"line":17228},[153,22275,22276],{"class":313},"    );\n",[153,22278,22279],{"class":155,"line":17234},[153,22280,246],{"emptyLinePlaceholder":245},[153,22282,22283,22285],{"class":155,"line":17240},[153,22284,20608],{"class":171},[153,22286,20275],{"class":313},[153,22288,22289,22291,22293,22296,22298,22300,22302,22304,22306,22308,22311,22314],{"class":155,"line":17245},[153,22290,20615],{"class":313},[153,22292,20155],{"class":167},[153,22294,22295],{"class":313},", text: details.",[153,22297,21829],{"class":159},[153,22299,1935],{"class":313},[153,22301,1867],{"class":167},[153,22303,20975],{"class":163},[153,22305,1867],{"class":167},[153,22307,20270],{"class":313},[153,22309,22310],{"class":171},"||",[153,22312,22313],{"class":167}," \"Empty directory\"",[153,22315,21150],{"class":313},[153,22317,22318],{"class":155,"line":17250},[153,22319,20640],{"class":313},[153,22321,22322],{"class":155,"line":17256},[153,22323,19840],{"class":313},[153,22325,22326],{"class":155,"line":17262},[153,22327,20180],{"class":313},[153,22329,22330],{"class":155,"line":17268},[153,22331,246],{"emptyLinePlaceholder":245},[153,22333,22334,22336,22338,22340],{"class":155,"line":17274},[153,22335,20189],{"class":171},[153,22337,20192],{"class":171},[153,22339,1482],{"class":159},[153,22341,20197],{"class":313},[153,22343,22344,22346,22348,22350,22352,22354],{"class":155,"line":17279},[153,22345,20202],{"class":171},[153,22347,20205],{"class":163},[153,22349,19998],{"class":171},[153,22351,20001],{"class":171},[153,22353,20212],{"class":159},[153,22355,20215],{"class":313},[153,22357,22358,22360,22362,22364],{"class":155,"line":17285},[153,22359,20220],{"class":171},[153,22361,20223],{"class":313},[153,22363,20226],{"class":159},[153,22365,20229],{"class":313},[153,22367,22368,22370,22372,22374,22377],{"class":155,"line":17291},[153,22369,20234],{"class":313},[153,22371,20237],{"class":159},[153,22373,1935],{"class":313},[153,22375,22376],{"class":167},"\"File Analyzer MCP Server running\"",[153,22378,20180],{"class":313},[153,22380,22381],{"class":155,"line":17297},[153,22382,3901],{"class":313},[153,22384,22385],{"class":155,"line":17302},[153,22386,246],{"emptyLinePlaceholder":245},[153,22388,22389,22391,22393,22395],{"class":155,"line":17308},[153,22390,20257],{"class":159},[153,22392,20085],{"class":313},[153,22394,20262],{"class":159},[153,22396,22397],{"class":313},"(console.error);\n",[35,22399,22401],{"id":22400},"step-9-test-with-mcp-inspector","Step 9 — Test with MCP Inspector",[143,22403,22405],{"className":145,"code":22404,"language":147,"meta":148,"style":148},"npm run build\nnpx @modelcontextprotocol\u002Finspector node build\u002Findex.js\n",[150,22406,22407,22415],{"__ignoreMap":148},[153,22408,22409,22411,22413],{"class":155,"line":156},[153,22410,5639],{"class":159},[153,22412,306],{"class":167},[153,22414,20324],{"class":167},[153,22416,22417,22419,22421,22424],{"class":155,"line":208},[153,22418,5190],{"class":159},[153,22420,17945],{"class":167},[153,22422,22423],{"class":167}," node",[153,22425,22426],{"class":167}," build\u002Findex.js\n",[12,22428,22429,22430,22432],{},"Opens a web UI at ",[150,22431,19152],{}," for visual debugging.",[35,22434,22436],{"id":22435},"step-10-configure-in-claude-code","Step 10 — Configure in Claude Code",[143,22438,22440],{"className":145,"code":22439,"language":147,"meta":148,"style":148},"claude mcp add --transport stdio my-server \\\n  -- node \u002Fabsolute\u002Fpath\u002Fto\u002Fmy-mcp-server\u002Fbuild\u002Findex.js\n",[150,22441,22442,22458],{"__ignoreMap":148},[153,22443,22444,22446,22448,22450,22452,22454,22456],{"class":155,"line":156},[153,22445,12966],{"class":159},[153,22447,17889],{"class":167},[153,22449,1447],{"class":167},[153,22451,17894],{"class":163},[153,22453,17992],{"class":167},[153,22455,19193],{"class":167},[153,22457,372],{"class":163},[153,22459,22460,22462,22464],{"class":155,"line":208},[153,22461,18017],{"class":163},[153,22463,22423],{"class":167},[153,22465,22466],{"class":167}," \u002Fabsolute\u002Fpath\u002Fto\u002Fmy-mcp-server\u002Fbuild\u002Findex.js\n",[35,22468,22470],{"id":22469},"step-11-configure-in-claude-desktop-cursor","Step 11 — Configure in Claude Desktop \u002F Cursor",[12,22472,22473,22474,13850],{},"Claude Desktop (",[150,22475,19293],{},[143,22477,22479],{"className":3807,"code":22478,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"my-server\": {\n      \"command\": \"node\",\n      \"args\": [\"\u002Fabsolute\u002Fpath\u002Fto\u002Fbuild\u002Findex.js\"]\n    }\n  }\n}\n",[150,22480,22481,22485,22491,22497,22508,22519,22523,22527],{"__ignoreMap":148},[153,22482,22483],{"class":155,"line":156},[153,22484,3816],{"class":313},[153,22486,22487,22489],{"class":155,"line":208},[153,22488,3821],{"class":163},[153,22490,3824],{"class":313},[153,22492,22493,22495],{"class":155,"line":242},[153,22494,19236],{"class":163},[153,22496,3824],{"class":313},[153,22498,22499,22501,22503,22506],{"class":155,"line":249},[153,22500,3836],{"class":163},[153,22502,3839],{"class":313},[153,22504,22505],{"class":167},"\"node\"",[153,22507,3845],{"class":313},[153,22509,22510,22512,22514,22517],{"class":155,"line":255},[153,22511,3850],{"class":163},[153,22513,3853],{"class":313},[153,22515,22516],{"class":167},"\"\u002Fabsolute\u002Fpath\u002Fto\u002Fbuild\u002Findex.js\"",[153,22518,5386],{"class":313},[153,22520,22521],{"class":155,"line":268},[153,22522,3891],{"class":313},[153,22524,22525],{"class":155,"line":281},[153,22526,3896],{"class":313},[153,22528,22529],{"class":155,"line":1356},[153,22530,3901],{"class":313},[12,22532,22533,22534,13850],{},"Cursor (",[150,22535,19367],{},[143,22537,22538],{"className":3807,"code":22478,"language":3809,"meta":148,"style":148},[150,22539,22540,22544,22550,22556,22566,22576,22580,22584],{"__ignoreMap":148},[153,22541,22542],{"class":155,"line":156},[153,22543,3816],{"class":313},[153,22545,22546,22548],{"class":155,"line":208},[153,22547,3821],{"class":163},[153,22549,3824],{"class":313},[153,22551,22552,22554],{"class":155,"line":242},[153,22553,19236],{"class":163},[153,22555,3824],{"class":313},[153,22557,22558,22560,22562,22564],{"class":155,"line":249},[153,22559,3836],{"class":163},[153,22561,3839],{"class":313},[153,22563,22505],{"class":167},[153,22565,3845],{"class":313},[153,22567,22568,22570,22572,22574],{"class":155,"line":255},[153,22569,3850],{"class":163},[153,22571,3853],{"class":313},[153,22573,22516],{"class":167},[153,22575,5386],{"class":313},[153,22577,22578],{"class":155,"line":268},[153,22579,3891],{"class":313},[153,22581,22582],{"class":155,"line":281},[153,22583,3896],{"class":313},[153,22585,22586],{"class":155,"line":1356},[153,22587,3901],{"class":313},[116,22589,22590],{"type":452},[12,22591,22592,22593,22598,22599,22602],{},"For stdio transport, ",[45,22594,19439,22595],{},[150,22596,22597],{},"console.log()"," — it writes to stdout and corrupts JSON-RPC messages. Use ",[150,22600,22601],{},"console.error()"," for logging.",[138,22604,2514],{"id":2513},[12,22606,22607,22610,22611,22613],{},[45,22608,22609],{},"Q: Which TypeScript SDK version should I use?","\nA: Use ",[150,22612,19631],{}," v1.29.0 (latest stable). A v2 SDK is in pre-alpha — stick with v1.x for production.",[12,22615,22616,22619],{},[45,22617,22618],{},"Q: Can I use plain JavaScript instead of TypeScript?","\nA: Yes, the SDK works with JavaScript. You lose type safety for tool schemas, but Zod validation still works at runtime.",[12,22621,22622,22625,22626,22629,22630,22633,22634,22637,22638,667],{},[45,22623,22624],{},"Q: How do I publish my MCP server to npm?","\nA: Add ",[150,22627,22628],{},"\"bin\": { \"my-server\": \".\u002Fbuild\u002Findex.js\" }"," to package.json, add a ",[150,22631,22632],{},"#!\u002Fusr\u002Fbin\u002Fenv node"," shebang to index.ts, then ",[150,22635,22636],{},"npm publish",". Users install via ",[150,22639,22640],{},"npx my-server",[35,22642,1020],{"id":1019},[19,22644,22645,22650,22655,22661],{},[22,22646,22647,22649],{},[71,22648,18059],{"href":18058}," — same concepts in Python",[22,22651,22652,22654],{},[71,22653,16693],{"href":19559}," — wrap REST APIs",[22,22656,22657,22660],{},[71,22658,16630],{"href":5477,"rel":22659},[113]," — browse configs",[22,22662,22663,22665],{},[71,22664,1263],{"href":1262}," — choose the right extension model",[1074,22667,22668],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":148,"searchDepth":208,"depth":208,"links":22670},[22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22685],{"id":78,"depth":208,"text":79},{"id":19654,"depth":208,"text":19655},{"id":18286,"depth":208,"text":18287},{"id":20327,"depth":208,"text":20328},{"id":20651,"depth":208,"text":20652},{"id":20793,"depth":208,"text":20794},{"id":21008,"depth":208,"text":21009},{"id":21161,"depth":208,"text":21162},{"id":21466,"depth":208,"text":21467},{"id":22400,"depth":208,"text":22401},{"id":22435,"depth":208,"text":22436},{"id":22469,"depth":208,"text":22470,"children":22683},[22684],{"id":2513,"depth":242,"text":2514},{"id":1019,"depth":208,"text":1020},"Build a working MCP server in TypeScript with the official SDK. Covers tools with Zod schemas, resources, prompts, testing, and configuration for Claude Code and Cursor.","使用官方 SDK 用 TypeScript 构建 MCP 服务器。涵盖 Zod schema 工具、资源、提示词、测试和 Claude Code\u002FCursor 配置。",[22689,22692,22695,22698,22701],{"q":22690,"a":22691},"Which TypeScript MCP SDK version should I use?","Use @modelcontextprotocol\u002Fsdk v1.29.0 (latest stable) with zod@3. A v2 SDK is in pre-alpha — stick with v1.x for production. Configure tsconfig.json with target ES2022, module Node16, and strict mode enabled for the best developer experience.",{"q":22693,"a":22694},"How do I validate tool inputs in a TypeScript MCP server?","Use Zod schemas in the inputSchema field of registerTool. For example: inputSchema: { a: z.number().describe(\"First number\"), b: z.number().describe(\"Second number\") }. Zod gives you runtime validation plus TypeScript types auto-inferred, so the handler receives already-validated parameters.",{"q":22696,"a":22697},"Why does my MCP server break when I use console.log()?","The stdio transport uses stdout for JSON-RPC messages. console.log() writes to stdout and corrupts the protocol. Always use console.error() for logging — it writes to stderr, which is reserved for logging and won't interfere with the MCP handshake or tool responses.",{"q":22699,"a":22700},"How do I mark a tool as destructive or idempotent?","Add annotations in registerTool: annotations: { title: \"Delete File\", destructiveHint: true, idempotentHint: true }. Clients use these hints to show warnings, require confirmation, or optimize retries. destructiveHint is especially important for file deletes, database writes, and API calls with side effects.",{"q":22702,"a":22703},"How do I publish my MCP server to npm?","Add \"bin\": { \"my-server\": \".\u002Fbuild\u002Findex.js\" } to package.json, add a #!\u002Fusr\u002Fbin\u002Fenv node shebang to index.ts, set \"type\": \"module\", then run npm publish. Users can then install and run via npx my-server or configure it in Claude Code directly.","\u002Fguide\u002Fimages\u002Fbuild-mcp-typescript-hero.svg",{},"\u002Fen\u002Fguide\u002Fbuild-mcp-server-typescript",{"title":19623,"description":22686},"en\u002Fguide\u002Fbuild-mcp-server-typescript",[5531,18123,1106,2769],"如何用 TypeScript 构建 MCP 服务器（分步教程）","Build an MCP server in TypeScript by installing @modelcontextprotocol\u002Fsdk and zod@3, creating an McpServer instance, then calling server.registerTool(), server.registerResource(), and server.registerPrompt() with Zod input schemas. Connect via StdioServerTransport, build with tsc, and register in Claude Code with claude mcp add --transport stdio. Use console.error() for logs — never console.log() on stdio transport.","vnfIOX6lDraWX2HCE5JUQ6KmJzd2Qx2ABpqp8fpuTHs",{"id":22714,"title":22715,"answer":6,"answerZh":6,"author":7,"body":22716,"category":1106,"description":24573,"descriptionZh":24574,"extension":1109,"faqs":24575,"faqsZh":6,"image":24591,"meta":24592,"navigation":245,"path":24593,"publishedAt":14945,"readTime":1395,"seo":24594,"stem":24595,"tags":24596,"titleZh":24600,"tldr":24601,"tldrZh":6,"updatedAt":14945,"__hash__":24602},"docs_en\u002Fen\u002Fguide\u002Fclaude-md-examples.md","CLAUDE.md Examples: 50+ Templates for Every Framework",{"type":9,"value":22717,"toc":24551},[22718,22721,22723,22737,22741,22746,22753,22770,22775,22779,22839,22842,22846,22849,22968,22972,22976,22981,23185,23189,23387,23391,23549,23552,23556,23745,23749,23928,23932,23936,24129,24133,24137,24316,24320,24323,24339,24343,24347,24385,24389,24425,24429,24459,24463,24466,24475,24477,24483,24489,24500,24515,24517,24548],[12,22719,22720],{},"Learn how to configure Claude Code for any framework using CLAUDE.md templates. This guide provides 50+ real-world examples organized by language and framework, plus best practices for writing your own.",[35,22722,79],{"id":78},[19,22724,22725,22731,22734],{},[22,22726,22727,22730],{},[71,22728,1159],{"href":1157,"rel":22729},[113]," installed",[22,22732,22733],{},"A project where you want to configure Claude Code's behavior",[22,22735,22736],{},"Basic understanding of your framework's conventions",[35,22738,22740],{"id":22739},"what-is-claudemd","What Is CLAUDE.md?",[12,22742,22743,22745],{},[45,22744,13616],{}," is a configuration file you place in your project root that tells Claude Code how to work with your codebase. When Claude Code starts a session, it reads this file to understand your project's conventions, architecture, preferred patterns, and constraints.",[12,22747,22748,22749,22752],{},"Think of it as a ",[150,22750,22751],{},".editorconfig"," for AI — instead of configuring tab width and line endings, you're configuring how an AI assistant understands and contributes to your project.",[143,22754,22756],{"className":145,"code":22755,"language":147,"meta":148,"style":148},"# Create a CLAUDE.md in your project root\ntouch CLAUDE.md\n",[150,22757,22758,22763],{"__ignoreMap":148},[153,22759,22760],{"class":155,"line":156},[153,22761,22762],{"class":211},"# Create a CLAUDE.md in your project root\n",[153,22764,22765,22767],{"class":155,"line":208},[153,22766,12611],{"class":159},[153,22768,22769],{"class":167}," CLAUDE.md\n",[116,22771,22772],{"type":118},[12,22773,22774],{},"CLAUDE.md is read automatically by Claude Code at session start. No additional configuration needed — just create the file and start coding.",[138,22776,22778],{"id":22777},"claudemd-vs-cursorrules-vs-agentsmd","CLAUDE.md vs .cursorrules vs AGENTS.md",[809,22780,22781,22792],{},[812,22782,22783],{},[815,22784,22785,22788,22790],{},[818,22786,22787],{},"File",[818,22789,823],{},[818,22791,826],{},[828,22793,22794,22805,22817,22828],{},[815,22795,22796,22800,22802],{},[833,22797,22798],{},[150,22799,13616],{},[833,22801,1159],{},[833,22803,22804],{},"Project context and coding conventions",[815,22806,22807,22811,22814],{},[833,22808,22809],{},[150,22810,6663],{},[833,22812,22813],{},"Cursor AI",[833,22815,22816],{},"Cursor-specific rules and patterns",[815,22818,22819,22823,22825],{},[833,22820,22821],{},[150,22822,5558],{},[833,22824,8662],{},[833,22826,22827],{},"Agent behavior configuration",[815,22829,22830,22834,22836],{},[833,22831,22832],{},[150,22833,8669],{},[833,22835,5610],{},[833,22837,22838],{},"Gemini-specific instructions",[12,22840,22841],{},"All serve the same purpose — configuring AI coding assistants. The content is often transferable between formats.",[35,22843,22845],{"id":22844},"claudemd-template-structure","CLAUDE.md Template Structure",[12,22847,22848],{},"Every effective CLAUDE.md follows this pattern:",[143,22850,22852],{"className":5813,"code":22851,"language":5815,"meta":148,"style":148},"# Project Name\n\n## Overview\n[One paragraph: what the project does, tech stack, architecture]\n\n## Tech Stack\n- Frontend: [framework, version]\n- Backend: [framework, version]\n- Database: [type]\n- Deployment: [method]\n\n## Project Structure\n[Key directories and what they contain]\n\n## Development Commands\n- `npm run dev` — Start development server\n- `npm test` — Run tests\n- `npm run build` — Production build\n\n## Coding Conventions\n[Language-specific patterns, naming, formatting]\n\n## Important Rules\n[What to NEVER do, critical constraints]\n",[150,22853,22854,22859,22863,22868,22873,22877,22882,22887,22892,22897,22902,22906,22911,22916,22920,22925,22930,22935,22940,22944,22949,22954,22958,22963],{"__ignoreMap":148},[153,22855,22856],{"class":155,"line":156},[153,22857,22858],{},"# Project Name\n",[153,22860,22861],{"class":155,"line":208},[153,22862,246],{"emptyLinePlaceholder":245},[153,22864,22865],{"class":155,"line":242},[153,22866,22867],{},"## Overview\n",[153,22869,22870],{"class":155,"line":249},[153,22871,22872],{},"[One paragraph: what the project does, tech stack, architecture]\n",[153,22874,22875],{"class":155,"line":255},[153,22876,246],{"emptyLinePlaceholder":245},[153,22878,22879],{"class":155,"line":268},[153,22880,22881],{},"## Tech Stack\n",[153,22883,22884],{"class":155,"line":281},[153,22885,22886],{},"- Frontend: [framework, version]\n",[153,22888,22889],{"class":155,"line":1356},[153,22890,22891],{},"- Backend: [framework, version]\n",[153,22893,22894],{"class":155,"line":1362},[153,22895,22896],{},"- Database: [type]\n",[153,22898,22899],{"class":155,"line":1367},[153,22900,22901],{},"- Deployment: [method]\n",[153,22903,22904],{"class":155,"line":1372},[153,22905,246],{"emptyLinePlaceholder":245},[153,22907,22908],{"class":155,"line":1378},[153,22909,22910],{},"## Project Structure\n",[153,22912,22913],{"class":155,"line":1383},[153,22914,22915],{},"[Key directories and what they contain]\n",[153,22917,22918],{"class":155,"line":1389},[153,22919,246],{"emptyLinePlaceholder":245},[153,22921,22922],{"class":155,"line":1395},[153,22923,22924],{},"## Development Commands\n",[153,22926,22927],{"class":155,"line":1401},[153,22928,22929],{},"- `npm run dev` — Start development server\n",[153,22931,22932],{"class":155,"line":1407},[153,22933,22934],{},"- `npm test` — Run tests\n",[153,22936,22937],{"class":155,"line":1129},[153,22938,22939],{},"- `npm run build` — Production build\n",[153,22941,22942],{"class":155,"line":1417},[153,22943,246],{"emptyLinePlaceholder":245},[153,22945,22946],{"class":155,"line":1423},[153,22947,22948],{},"## Coding Conventions\n",[153,22950,22951],{"class":155,"line":1683},[153,22952,22953],{},"[Language-specific patterns, naming, formatting]\n",[153,22955,22956],{"class":155,"line":1688},[153,22957,246],{"emptyLinePlaceholder":245},[153,22959,22960],{"class":155,"line":12900},[153,22961,22962],{},"## Important Rules\n",[153,22964,22965],{"class":155,"line":12906},[153,22966,22967],{},"[What to NEVER do, critical constraints]\n",[35,22969,22971],{"id":22970},"templates-by-framework","Templates by Framework",[138,22973,22975],{"id":22974},"javascript-typescript","JavaScript \u002F TypeScript",[22977,22978,22980],"h4",{"id":22979},"react-typescript","React + TypeScript",[143,22982,22984],{"className":5813,"code":22983,"language":5815,"meta":148,"style":148},"# Project: [Name]\n\n## Tech Stack\n- React 19 with TypeScript 5.x\n- Vite for bundling\n- React Router v7 for routing\n- TanStack Query for server state\n- Tailwind CSS for styling\n- Vitest + React Testing Library for tests\n\n## Project Structure\n- `src\u002Fcomponents\u002F` — Reusable UI components\n- `src\u002Fpages\u002F` — Route-level page components\n- `src\u002Fhooks\u002F` — Custom React hooks\n- `src\u002Fapi\u002F` — API client and type definitions\n- `src\u002Fstores\u002F` — Global state (Zustand)\n\n## Coding Conventions\n- Functional components only, no class components\n- Use `const` arrow functions for components: `const Button = () => {}`\n- Custom hooks must start with `use` prefix\n- Colocate tests: `Button.test.tsx` next to `Button.tsx`\n- Use absolute imports via `@\u002F` alias\n- Prefer composition over prop drilling — use hooks and context\n\n## Styling\n- Tailwind utility classes only, no CSS modules\n- Use `cn()` helper for conditional classes\n- Component variants via `cva` (class-variance-authority)\n- Design tokens in `tailwind.config.ts`\n\n## Testing\n- Run: `npm test`\n- Every component needs at least a render test\n- Test user interactions, not implementation details\n- Mock API calls with MSW, not jest.mock\n\n## Important Rules\n- NEVER use `any` type — use `unknown` and narrow\n- NEVER mutate state directly — use immutable patterns\n- NEVER use index as key in lists with dynamic items\n- Always handle loading and error states in data fetching\n",[150,22985,22986,22991,22995,22999,23004,23009,23014,23019,23024,23029,23033,23037,23042,23047,23052,23057,23062,23066,23070,23075,23080,23085,23090,23095,23100,23104,23109,23114,23119,23124,23129,23133,23137,23142,23147,23152,23157,23161,23165,23170,23175,23180],{"__ignoreMap":148},[153,22987,22988],{"class":155,"line":156},[153,22989,22990],{},"# Project: [Name]\n",[153,22992,22993],{"class":155,"line":208},[153,22994,246],{"emptyLinePlaceholder":245},[153,22996,22997],{"class":155,"line":242},[153,22998,22881],{},[153,23000,23001],{"class":155,"line":249},[153,23002,23003],{},"- React 19 with TypeScript 5.x\n",[153,23005,23006],{"class":155,"line":255},[153,23007,23008],{},"- Vite for bundling\n",[153,23010,23011],{"class":155,"line":268},[153,23012,23013],{},"- React Router v7 for routing\n",[153,23015,23016],{"class":155,"line":281},[153,23017,23018],{},"- TanStack Query for server state\n",[153,23020,23021],{"class":155,"line":1356},[153,23022,23023],{},"- Tailwind CSS for styling\n",[153,23025,23026],{"class":155,"line":1362},[153,23027,23028],{},"- Vitest + React Testing Library for tests\n",[153,23030,23031],{"class":155,"line":1367},[153,23032,246],{"emptyLinePlaceholder":245},[153,23034,23035],{"class":155,"line":1372},[153,23036,22910],{},[153,23038,23039],{"class":155,"line":1378},[153,23040,23041],{},"- `src\u002Fcomponents\u002F` — Reusable UI components\n",[153,23043,23044],{"class":155,"line":1383},[153,23045,23046],{},"- `src\u002Fpages\u002F` — Route-level page components\n",[153,23048,23049],{"class":155,"line":1389},[153,23050,23051],{},"- `src\u002Fhooks\u002F` — Custom React hooks\n",[153,23053,23054],{"class":155,"line":1395},[153,23055,23056],{},"- `src\u002Fapi\u002F` — API client and type definitions\n",[153,23058,23059],{"class":155,"line":1401},[153,23060,23061],{},"- `src\u002Fstores\u002F` — Global state (Zustand)\n",[153,23063,23064],{"class":155,"line":1407},[153,23065,246],{"emptyLinePlaceholder":245},[153,23067,23068],{"class":155,"line":1129},[153,23069,22948],{},[153,23071,23072],{"class":155,"line":1417},[153,23073,23074],{},"- Functional components only, no class components\n",[153,23076,23077],{"class":155,"line":1423},[153,23078,23079],{},"- Use `const` arrow functions for components: `const Button = () => {}`\n",[153,23081,23082],{"class":155,"line":1683},[153,23083,23084],{},"- Custom hooks must start with `use` prefix\n",[153,23086,23087],{"class":155,"line":1688},[153,23088,23089],{},"- Colocate tests: `Button.test.tsx` next to `Button.tsx`\n",[153,23091,23092],{"class":155,"line":12900},[153,23093,23094],{},"- Use absolute imports via `@\u002F` alias\n",[153,23096,23097],{"class":155,"line":12906},[153,23098,23099],{},"- Prefer composition over prop drilling — use hooks and context\n",[153,23101,23102],{"class":155,"line":16075},[153,23103,246],{"emptyLinePlaceholder":245},[153,23105,23106],{"class":155,"line":16089},[153,23107,23108],{},"## Styling\n",[153,23110,23111],{"class":155,"line":16096},[153,23112,23113],{},"- Tailwind utility classes only, no CSS modules\n",[153,23115,23116],{"class":155,"line":16102},[153,23117,23118],{},"- Use `cn()` helper for conditional classes\n",[153,23120,23121],{"class":155,"line":16107},[153,23122,23123],{},"- Component variants via `cva` (class-variance-authority)\n",[153,23125,23126],{"class":155,"line":16115},[153,23127,23128],{},"- Design tokens in `tailwind.config.ts`\n",[153,23130,23131],{"class":155,"line":17034},[153,23132,246],{"emptyLinePlaceholder":245},[153,23134,23135],{"class":155,"line":17039},[153,23136,5874],{},[153,23138,23139],{"class":155,"line":17044},[153,23140,23141],{},"- Run: `npm test`\n",[153,23143,23144],{"class":155,"line":17050},[153,23145,23146],{},"- Every component needs at least a render test\n",[153,23148,23149],{"class":155,"line":17055},[153,23150,23151],{},"- Test user interactions, not implementation details\n",[153,23153,23154],{"class":155,"line":17061},[153,23155,23156],{},"- Mock API calls with MSW, not jest.mock\n",[153,23158,23159],{"class":155,"line":17067},[153,23160,246],{"emptyLinePlaceholder":245},[153,23162,23163],{"class":155,"line":17073},[153,23164,22962],{},[153,23166,23167],{"class":155,"line":17079},[153,23168,23169],{},"- NEVER use `any` type — use `unknown` and narrow\n",[153,23171,23172],{"class":155,"line":17085},[153,23173,23174],{},"- NEVER mutate state directly — use immutable patterns\n",[153,23176,23177],{"class":155,"line":17091},[153,23178,23179],{},"- NEVER use index as key in lists with dynamic items\n",[153,23181,23182],{"class":155,"line":17097},[153,23183,23184],{},"- Always handle loading and error states in data fetching\n",[22977,23186,23188],{"id":23187},"nextjs-15-app-router","Next.js 15 (App Router)",[143,23190,23192],{"className":5813,"code":23191,"language":5815,"meta":148,"style":148},"# Project: [Name]\n\n## Tech Stack\n- Next.js 15 with App Router\n- TypeScript 5.x strict mode\n- Server Components by default\n- Prisma ORM + PostgreSQL\n- NextAuth.js for authentication\n- Tailwind CSS + shadcn\u002Fui\n\n## Project Structure\n- `app\u002F` — App Router pages and layouts\n- `app\u002Fapi\u002F` — API Route Handlers\n- `components\u002F` — Shared UI components\n- `lib\u002F` — Utility functions and configurations\n- `prisma\u002F` — Database schema and migrations\n\n## Architecture Rules\n- Default to Server Components — only add 'use client' when needed\n- Data fetching in Server Components, never in Client Components\n- Use Server Actions for mutations, not API routes\n- Colocate loading.tsx and error.tsx with page.tsx\n\n## Development Commands\n- `npm run dev` — Start dev server (port 3000)\n- `npx prisma studio` — Database GUI\n- `npx prisma migrate dev` — Run migrations\n- `npm run build` — Production build with type checking\n\n## Coding Conventions\n- File naming: kebab-case for files, PascalCase for components\n- One component per file\n- Zod for all input validation (forms, API params)\n- Use `next\u002Fimage` for all images, never `\u003Cimg>`\n- Prefer `fetch` with `cache` and `revalidate` options\n\n## Important Rules\n- NEVER use `getServerSideProps` or `getStaticProps` — these are Pages Router patterns\n- NEVER import server-only code in Client Components\n- NEVER store secrets in client-side code — use server-only env vars\n- Always add `loading.tsx` for pages with data fetching\n",[150,23193,23194,23198,23202,23206,23211,23216,23221,23226,23231,23236,23240,23244,23249,23254,23259,23264,23269,23273,23278,23283,23288,23293,23298,23302,23306,23311,23316,23321,23326,23330,23334,23339,23344,23349,23354,23359,23363,23367,23372,23377,23382],{"__ignoreMap":148},[153,23195,23196],{"class":155,"line":156},[153,23197,22990],{},[153,23199,23200],{"class":155,"line":208},[153,23201,246],{"emptyLinePlaceholder":245},[153,23203,23204],{"class":155,"line":242},[153,23205,22881],{},[153,23207,23208],{"class":155,"line":249},[153,23209,23210],{},"- Next.js 15 with App Router\n",[153,23212,23213],{"class":155,"line":255},[153,23214,23215],{},"- TypeScript 5.x strict mode\n",[153,23217,23218],{"class":155,"line":268},[153,23219,23220],{},"- Server Components by default\n",[153,23222,23223],{"class":155,"line":281},[153,23224,23225],{},"- Prisma ORM + PostgreSQL\n",[153,23227,23228],{"class":155,"line":1356},[153,23229,23230],{},"- NextAuth.js for authentication\n",[153,23232,23233],{"class":155,"line":1362},[153,23234,23235],{},"- Tailwind CSS + shadcn\u002Fui\n",[153,23237,23238],{"class":155,"line":1367},[153,23239,246],{"emptyLinePlaceholder":245},[153,23241,23242],{"class":155,"line":1372},[153,23243,22910],{},[153,23245,23246],{"class":155,"line":1378},[153,23247,23248],{},"- `app\u002F` — App Router pages and layouts\n",[153,23250,23251],{"class":155,"line":1383},[153,23252,23253],{},"- `app\u002Fapi\u002F` — API Route Handlers\n",[153,23255,23256],{"class":155,"line":1389},[153,23257,23258],{},"- `components\u002F` — Shared UI components\n",[153,23260,23261],{"class":155,"line":1395},[153,23262,23263],{},"- `lib\u002F` — Utility functions and configurations\n",[153,23265,23266],{"class":155,"line":1401},[153,23267,23268],{},"- `prisma\u002F` — Database schema and migrations\n",[153,23270,23271],{"class":155,"line":1407},[153,23272,246],{"emptyLinePlaceholder":245},[153,23274,23275],{"class":155,"line":1129},[153,23276,23277],{},"## Architecture Rules\n",[153,23279,23280],{"class":155,"line":1417},[153,23281,23282],{},"- Default to Server Components — only add 'use client' when needed\n",[153,23284,23285],{"class":155,"line":1423},[153,23286,23287],{},"- Data fetching in Server Components, never in Client Components\n",[153,23289,23290],{"class":155,"line":1683},[153,23291,23292],{},"- Use Server Actions for mutations, not API routes\n",[153,23294,23295],{"class":155,"line":1688},[153,23296,23297],{},"- Colocate loading.tsx and error.tsx with page.tsx\n",[153,23299,23300],{"class":155,"line":12900},[153,23301,246],{"emptyLinePlaceholder":245},[153,23303,23304],{"class":155,"line":12906},[153,23305,22924],{},[153,23307,23308],{"class":155,"line":16075},[153,23309,23310],{},"- `npm run dev` — Start dev server (port 3000)\n",[153,23312,23313],{"class":155,"line":16089},[153,23314,23315],{},"- `npx prisma studio` — Database GUI\n",[153,23317,23318],{"class":155,"line":16096},[153,23319,23320],{},"- `npx prisma migrate dev` — Run migrations\n",[153,23322,23323],{"class":155,"line":16102},[153,23324,23325],{},"- `npm run build` — Production build with type checking\n",[153,23327,23328],{"class":155,"line":16107},[153,23329,246],{"emptyLinePlaceholder":245},[153,23331,23332],{"class":155,"line":16115},[153,23333,22948],{},[153,23335,23336],{"class":155,"line":17034},[153,23337,23338],{},"- File naming: kebab-case for files, PascalCase for components\n",[153,23340,23341],{"class":155,"line":17039},[153,23342,23343],{},"- One component per file\n",[153,23345,23346],{"class":155,"line":17044},[153,23347,23348],{},"- Zod for all input validation (forms, API params)\n",[153,23350,23351],{"class":155,"line":17050},[153,23352,23353],{},"- Use `next\u002Fimage` for all images, never `\u003Cimg>`\n",[153,23355,23356],{"class":155,"line":17055},[153,23357,23358],{},"- Prefer `fetch` with `cache` and `revalidate` options\n",[153,23360,23361],{"class":155,"line":17061},[153,23362,246],{"emptyLinePlaceholder":245},[153,23364,23365],{"class":155,"line":17067},[153,23366,22962],{},[153,23368,23369],{"class":155,"line":17073},[153,23370,23371],{},"- NEVER use `getServerSideProps` or `getStaticProps` — these are Pages Router patterns\n",[153,23373,23374],{"class":155,"line":17079},[153,23375,23376],{},"- NEVER import server-only code in Client Components\n",[153,23378,23379],{"class":155,"line":17085},[153,23380,23381],{},"- NEVER store secrets in client-side code — use server-only env vars\n",[153,23383,23384],{"class":155,"line":17091},[153,23385,23386],{},"- Always add `loading.tsx` for pages with data fetching\n",[22977,23388,23390],{"id":23389},"nuxt-3-vue-3","Nuxt 3 + Vue 3",[143,23392,23394],{"className":5813,"code":23393,"language":5815,"meta":148,"style":148},"# Project: [Name]\n\n## Tech Stack\n- Nuxt 3 with Vue 3 Composition API\n- TypeScript strict mode\n- Auto-imports enabled (components, composables, utils)\n- Pinia for state management\n- Tailwind CSS for styling\n\n## Project Structure\n- `pages\u002F` — File-based routing\n- `components\u002F` — Auto-imported components\n- `composables\u002F` — Auto-imported composables (use* prefix)\n- `server\u002Fapi\u002F` — Nitro API endpoints\n- `stores\u002F` — Pinia stores\n\n## Coding Conventions\n- Composition API with `\u003Cscript setup lang=\"ts\">` only\n- No Options API patterns\n- Composables must start with `use` prefix\n- Use `defineProps` with TypeScript generics, not runtime declaration\n- SSR-safe: check `import.meta.client` before accessing browser APIs\n\n## Development Commands\n- `npm run dev` — Start Nuxt dev server\n- `npm run build` — Production SSR build\n- `npm run generate` — Static site generation\n\n## Important Rules\n- NEVER use `this` — Composition API does not have `this`\n- NEVER access `window`, `document` without `import.meta.client` guard\n- NEVER put business logic in components — extract to composables\n- Use `useFetch` or `useAsyncData` for data fetching, never raw `fetch` in setup\n",[150,23395,23396,23400,23404,23408,23413,23418,23423,23428,23432,23436,23440,23445,23450,23455,23460,23465,23469,23473,23478,23483,23488,23493,23498,23502,23506,23511,23516,23521,23525,23529,23534,23539,23544],{"__ignoreMap":148},[153,23397,23398],{"class":155,"line":156},[153,23399,22990],{},[153,23401,23402],{"class":155,"line":208},[153,23403,246],{"emptyLinePlaceholder":245},[153,23405,23406],{"class":155,"line":242},[153,23407,22881],{},[153,23409,23410],{"class":155,"line":249},[153,23411,23412],{},"- Nuxt 3 with Vue 3 Composition API\n",[153,23414,23415],{"class":155,"line":255},[153,23416,23417],{},"- TypeScript strict mode\n",[153,23419,23420],{"class":155,"line":268},[153,23421,23422],{},"- Auto-imports enabled (components, composables, utils)\n",[153,23424,23425],{"class":155,"line":281},[153,23426,23427],{},"- Pinia for state management\n",[153,23429,23430],{"class":155,"line":1356},[153,23431,23023],{},[153,23433,23434],{"class":155,"line":1362},[153,23435,246],{"emptyLinePlaceholder":245},[153,23437,23438],{"class":155,"line":1367},[153,23439,22910],{},[153,23441,23442],{"class":155,"line":1372},[153,23443,23444],{},"- `pages\u002F` — File-based routing\n",[153,23446,23447],{"class":155,"line":1378},[153,23448,23449],{},"- `components\u002F` — Auto-imported components\n",[153,23451,23452],{"class":155,"line":1383},[153,23453,23454],{},"- `composables\u002F` — Auto-imported composables (use* prefix)\n",[153,23456,23457],{"class":155,"line":1389},[153,23458,23459],{},"- `server\u002Fapi\u002F` — Nitro API endpoints\n",[153,23461,23462],{"class":155,"line":1395},[153,23463,23464],{},"- `stores\u002F` — Pinia stores\n",[153,23466,23467],{"class":155,"line":1401},[153,23468,246],{"emptyLinePlaceholder":245},[153,23470,23471],{"class":155,"line":1407},[153,23472,22948],{},[153,23474,23475],{"class":155,"line":1129},[153,23476,23477],{},"- Composition API with `\u003Cscript setup lang=\"ts\">` only\n",[153,23479,23480],{"class":155,"line":1417},[153,23481,23482],{},"- No Options API patterns\n",[153,23484,23485],{"class":155,"line":1423},[153,23486,23487],{},"- Composables must start with `use` prefix\n",[153,23489,23490],{"class":155,"line":1683},[153,23491,23492],{},"- Use `defineProps` with TypeScript generics, not runtime declaration\n",[153,23494,23495],{"class":155,"line":1688},[153,23496,23497],{},"- SSR-safe: check `import.meta.client` before accessing browser APIs\n",[153,23499,23500],{"class":155,"line":12900},[153,23501,246],{"emptyLinePlaceholder":245},[153,23503,23504],{"class":155,"line":12906},[153,23505,22924],{},[153,23507,23508],{"class":155,"line":16075},[153,23509,23510],{},"- `npm run dev` — Start Nuxt dev server\n",[153,23512,23513],{"class":155,"line":16089},[153,23514,23515],{},"- `npm run build` — Production SSR build\n",[153,23517,23518],{"class":155,"line":16096},[153,23519,23520],{},"- `npm run generate` — Static site generation\n",[153,23522,23523],{"class":155,"line":16102},[153,23524,246],{"emptyLinePlaceholder":245},[153,23526,23527],{"class":155,"line":16107},[153,23528,22962],{},[153,23530,23531],{"class":155,"line":16115},[153,23532,23533],{},"- NEVER use `this` — Composition API does not have `this`\n",[153,23535,23536],{"class":155,"line":17034},[153,23537,23538],{},"- NEVER access `window`, `document` without `import.meta.client` guard\n",[153,23540,23541],{"class":155,"line":17039},[153,23542,23543],{},"- NEVER put business logic in components — extract to composables\n",[153,23545,23546],{"class":155,"line":17044},[153,23547,23548],{},"- Use `useFetch` or `useAsyncData` for data fetching, never raw `fetch` in setup\n",[138,23550,23551],{"id":15398},"Python",[22977,23553,23555],{"id":23554},"python-fastapi","Python + FastAPI",[143,23557,23559],{"className":5813,"code":23558,"language":5815,"meta":148,"style":148},"# Project: [Name]\n\n## Tech Stack\n- Python 3.12+\n- FastAPI with Pydantic v2\n- SQLAlchemy 2.0 async + Alembic migrations\n- PostgreSQL via asyncpg\n- pytest for testing\n- uv for package management\n\n## Project Structure\n- `app\u002F` — Application package\n- `app\u002Fapi\u002F` — Route handlers (routers)\n- `app\u002Fmodels\u002F` — SQLAlchemy models\n- `app\u002Fschemas\u002F` — Pydantic request\u002Fresponse schemas\n- `app\u002Fservices\u002F` — Business logic layer\n- `app\u002Fcore\u002F` — Config, security, dependencies\n- `tests\u002F` — Test files mirroring app structure\n- `alembic\u002F` — Database migrations\n\n## Coding Conventions\n- Type hints on all function signatures\n- Pydantic models for all request\u002Fresponse validation\n- Async\u002Fawait everywhere — no sync database calls\n- Dependency injection via `Depends()`\n- Service layer pattern: routes → services → repositories\n\n## Development Commands\n- `uv run fastapi dev` — Start dev server\n- `uv run pytest` — Run tests\n- `uv run alembic upgrade head` — Apply migrations\n- `uv run alembic revision --autogenerate -m \"desc\"` — Create migration\n\n## Important Rules\n- NEVER use raw SQL queries — use SQLAlchemy ORM\n- NEVER store secrets in code — use environment variables via pydantic-settings\n- NEVER catch broad `Exception` — catch specific exceptions\n- Always return Pydantic models from endpoints, never dicts\n- All database operations in async context managers\n",[150,23560,23561,23565,23569,23573,23578,23583,23588,23593,23598,23603,23607,23611,23616,23621,23626,23631,23636,23641,23646,23651,23655,23659,23664,23669,23674,23679,23684,23688,23692,23697,23702,23707,23712,23716,23720,23725,23730,23735,23740],{"__ignoreMap":148},[153,23562,23563],{"class":155,"line":156},[153,23564,22990],{},[153,23566,23567],{"class":155,"line":208},[153,23568,246],{"emptyLinePlaceholder":245},[153,23570,23571],{"class":155,"line":242},[153,23572,22881],{},[153,23574,23575],{"class":155,"line":249},[153,23576,23577],{},"- Python 3.12+\n",[153,23579,23580],{"class":155,"line":255},[153,23581,23582],{},"- FastAPI with Pydantic v2\n",[153,23584,23585],{"class":155,"line":268},[153,23586,23587],{},"- SQLAlchemy 2.0 async + Alembic migrations\n",[153,23589,23590],{"class":155,"line":281},[153,23591,23592],{},"- PostgreSQL via asyncpg\n",[153,23594,23595],{"class":155,"line":1356},[153,23596,23597],{},"- pytest for testing\n",[153,23599,23600],{"class":155,"line":1362},[153,23601,23602],{},"- uv for package management\n",[153,23604,23605],{"class":155,"line":1367},[153,23606,246],{"emptyLinePlaceholder":245},[153,23608,23609],{"class":155,"line":1372},[153,23610,22910],{},[153,23612,23613],{"class":155,"line":1378},[153,23614,23615],{},"- `app\u002F` — Application package\n",[153,23617,23618],{"class":155,"line":1383},[153,23619,23620],{},"- `app\u002Fapi\u002F` — Route handlers (routers)\n",[153,23622,23623],{"class":155,"line":1389},[153,23624,23625],{},"- `app\u002Fmodels\u002F` — SQLAlchemy models\n",[153,23627,23628],{"class":155,"line":1395},[153,23629,23630],{},"- `app\u002Fschemas\u002F` — Pydantic request\u002Fresponse schemas\n",[153,23632,23633],{"class":155,"line":1401},[153,23634,23635],{},"- `app\u002Fservices\u002F` — Business logic layer\n",[153,23637,23638],{"class":155,"line":1407},[153,23639,23640],{},"- `app\u002Fcore\u002F` — Config, security, dependencies\n",[153,23642,23643],{"class":155,"line":1129},[153,23644,23645],{},"- `tests\u002F` — Test files mirroring app structure\n",[153,23647,23648],{"class":155,"line":1417},[153,23649,23650],{},"- `alembic\u002F` — Database migrations\n",[153,23652,23653],{"class":155,"line":1423},[153,23654,246],{"emptyLinePlaceholder":245},[153,23656,23657],{"class":155,"line":1683},[153,23658,22948],{},[153,23660,23661],{"class":155,"line":1688},[153,23662,23663],{},"- Type hints on all function signatures\n",[153,23665,23666],{"class":155,"line":12900},[153,23667,23668],{},"- Pydantic models for all request\u002Fresponse validation\n",[153,23670,23671],{"class":155,"line":12906},[153,23672,23673],{},"- Async\u002Fawait everywhere — no sync database calls\n",[153,23675,23676],{"class":155,"line":16075},[153,23677,23678],{},"- Dependency injection via `Depends()`\n",[153,23680,23681],{"class":155,"line":16089},[153,23682,23683],{},"- Service layer pattern: routes → services → repositories\n",[153,23685,23686],{"class":155,"line":16096},[153,23687,246],{"emptyLinePlaceholder":245},[153,23689,23690],{"class":155,"line":16102},[153,23691,22924],{},[153,23693,23694],{"class":155,"line":16107},[153,23695,23696],{},"- `uv run fastapi dev` — Start dev server\n",[153,23698,23699],{"class":155,"line":16115},[153,23700,23701],{},"- `uv run pytest` — Run tests\n",[153,23703,23704],{"class":155,"line":17034},[153,23705,23706],{},"- `uv run alembic upgrade head` — Apply migrations\n",[153,23708,23709],{"class":155,"line":17039},[153,23710,23711],{},"- `uv run alembic revision --autogenerate -m \"desc\"` — Create migration\n",[153,23713,23714],{"class":155,"line":17044},[153,23715,246],{"emptyLinePlaceholder":245},[153,23717,23718],{"class":155,"line":17050},[153,23719,22962],{},[153,23721,23722],{"class":155,"line":17055},[153,23723,23724],{},"- NEVER use raw SQL queries — use SQLAlchemy ORM\n",[153,23726,23727],{"class":155,"line":17061},[153,23728,23729],{},"- NEVER store secrets in code — use environment variables via pydantic-settings\n",[153,23731,23732],{"class":155,"line":17067},[153,23733,23734],{},"- NEVER catch broad `Exception` — catch specific exceptions\n",[153,23736,23737],{"class":155,"line":17073},[153,23738,23739],{},"- Always return Pydantic models from endpoints, never dicts\n",[153,23741,23742],{"class":155,"line":17079},[153,23743,23744],{},"- All database operations in async context managers\n",[22977,23746,23748],{"id":23747},"django-5x","Django 5.x",[143,23750,23752],{"className":5813,"code":23751,"language":5815,"meta":148,"style":148},"# Project: [Name]\n\n## Tech Stack\n- Django 5.x with Python 3.12+\n- Django REST Framework for APIs\n- PostgreSQL database\n- Celery + Redis for background tasks\n- pytest-django for testing\n\n## Project Structure\n- `config\u002F` — Django settings, URLs, WSGI\u002FASGI\n- `apps\u002F` — Django applications (one per domain)\n- `apps\u002F{name}\u002Fmodels.py` — Database models\n- `apps\u002F{name}\u002Fviews.py` — View logic\n- `apps\u002F{name}\u002Fserializers.py` — DRF serializers\n- `templates\u002F` — Django templates\n- `tests\u002F` — Test files\n\n## Coding Conventions\n- Class-based views for APIs (ViewSets)\n- Model methods for business logic, not views\n- Fat models, thin views pattern\n- Use `select_related()` and `prefetch_related()` to avoid N+1\n- Signals only for cross-app side effects\n\n## Development Commands\n- `python manage.py runserver` — Start dev server\n- `python manage.py test` — Run tests\n- `python manage.py makemigrations` — Create migrations\n- `python manage.py migrate` — Apply migrations\n\n## Important Rules\n- NEVER write raw SQL unless absolutely necessary\n- NEVER put business logic in views or serializers\n- NEVER use `Model.objects.all()` without pagination in APIs\n- Always use Django's ORM query optimization\n- Run `makemigrations` after any model change\n",[150,23753,23754,23758,23762,23766,23771,23776,23781,23786,23791,23795,23799,23804,23809,23814,23819,23824,23829,23834,23838,23842,23847,23852,23857,23862,23867,23871,23875,23880,23885,23890,23895,23899,23903,23908,23913,23918,23923],{"__ignoreMap":148},[153,23755,23756],{"class":155,"line":156},[153,23757,22990],{},[153,23759,23760],{"class":155,"line":208},[153,23761,246],{"emptyLinePlaceholder":245},[153,23763,23764],{"class":155,"line":242},[153,23765,22881],{},[153,23767,23768],{"class":155,"line":249},[153,23769,23770],{},"- Django 5.x with Python 3.12+\n",[153,23772,23773],{"class":155,"line":255},[153,23774,23775],{},"- Django REST Framework for APIs\n",[153,23777,23778],{"class":155,"line":268},[153,23779,23780],{},"- PostgreSQL database\n",[153,23782,23783],{"class":155,"line":281},[153,23784,23785],{},"- Celery + Redis for background tasks\n",[153,23787,23788],{"class":155,"line":1356},[153,23789,23790],{},"- pytest-django for testing\n",[153,23792,23793],{"class":155,"line":1362},[153,23794,246],{"emptyLinePlaceholder":245},[153,23796,23797],{"class":155,"line":1367},[153,23798,22910],{},[153,23800,23801],{"class":155,"line":1372},[153,23802,23803],{},"- `config\u002F` — Django settings, URLs, WSGI\u002FASGI\n",[153,23805,23806],{"class":155,"line":1378},[153,23807,23808],{},"- `apps\u002F` — Django applications (one per domain)\n",[153,23810,23811],{"class":155,"line":1383},[153,23812,23813],{},"- `apps\u002F{name}\u002Fmodels.py` — Database models\n",[153,23815,23816],{"class":155,"line":1389},[153,23817,23818],{},"- `apps\u002F{name}\u002Fviews.py` — View logic\n",[153,23820,23821],{"class":155,"line":1395},[153,23822,23823],{},"- `apps\u002F{name}\u002Fserializers.py` — DRF serializers\n",[153,23825,23826],{"class":155,"line":1401},[153,23827,23828],{},"- `templates\u002F` — Django templates\n",[153,23830,23831],{"class":155,"line":1407},[153,23832,23833],{},"- `tests\u002F` — Test files\n",[153,23835,23836],{"class":155,"line":1129},[153,23837,246],{"emptyLinePlaceholder":245},[153,23839,23840],{"class":155,"line":1417},[153,23841,22948],{},[153,23843,23844],{"class":155,"line":1423},[153,23845,23846],{},"- Class-based views for APIs (ViewSets)\n",[153,23848,23849],{"class":155,"line":1683},[153,23850,23851],{},"- Model methods for business logic, not views\n",[153,23853,23854],{"class":155,"line":1688},[153,23855,23856],{},"- Fat models, thin views pattern\n",[153,23858,23859],{"class":155,"line":12900},[153,23860,23861],{},"- Use `select_related()` and `prefetch_related()` to avoid N+1\n",[153,23863,23864],{"class":155,"line":12906},[153,23865,23866],{},"- Signals only for cross-app side effects\n",[153,23868,23869],{"class":155,"line":16075},[153,23870,246],{"emptyLinePlaceholder":245},[153,23872,23873],{"class":155,"line":16089},[153,23874,22924],{},[153,23876,23877],{"class":155,"line":16096},[153,23878,23879],{},"- `python manage.py runserver` — Start dev server\n",[153,23881,23882],{"class":155,"line":16102},[153,23883,23884],{},"- `python manage.py test` — Run tests\n",[153,23886,23887],{"class":155,"line":16107},[153,23888,23889],{},"- `python manage.py makemigrations` — Create migrations\n",[153,23891,23892],{"class":155,"line":16115},[153,23893,23894],{},"- `python manage.py migrate` — Apply migrations\n",[153,23896,23897],{"class":155,"line":17034},[153,23898,246],{"emptyLinePlaceholder":245},[153,23900,23901],{"class":155,"line":17039},[153,23902,22962],{},[153,23904,23905],{"class":155,"line":17044},[153,23906,23907],{},"- NEVER write raw SQL unless absolutely necessary\n",[153,23909,23910],{"class":155,"line":17050},[153,23911,23912],{},"- NEVER put business logic in views or serializers\n",[153,23914,23915],{"class":155,"line":17055},[153,23916,23917],{},"- NEVER use `Model.objects.all()` without pagination in APIs\n",[153,23919,23920],{"class":155,"line":17061},[153,23921,23922],{},"- Always use Django's ORM query optimization\n",[153,23924,23925],{"class":155,"line":17067},[153,23926,23927],{},"- Run `makemigrations` after any model change\n",[138,23929,23931],{"id":23930},"go","Go",[22977,23933,23935],{"id":23934},"go-standard-library-chi","Go + Standard Library \u002F Chi",[143,23937,23939],{"className":5813,"code":23938,"language":5815,"meta":148,"style":148},"# Project: [Name]\n\n## Tech Stack\n- Go 1.23+\n- chi router for HTTP\n- sqlc for type-safe SQL\n- golang-migrate for migrations\n- PostgreSQL database\n- testify for test assertions\n\n## Project Structure\n- `cmd\u002Fserver\u002F` — Application entrypoint\n- `internal\u002Fapi\u002F` — HTTP handlers\n- `internal\u002Fservice\u002F` — Business logic\n- `internal\u002Frepository\u002F` — Database access (sqlc generated)\n- `internal\u002Fmodel\u002F` — Domain types\n- `db\u002Fmigrations\u002F` — SQL migration files\n- `db\u002Fqueries\u002F` — sqlc query files\n\n## Coding Conventions\n- Standard Go project layout (cmd\u002F, internal\u002F, pkg\u002F)\n- Accept interfaces, return structs\n- Error wrapping with `fmt.Errorf(\"context: %w\", err)`\n- Context propagation through all layers\n- Table-driven tests\n- No global state — dependency injection via structs\n\n## Development Commands\n- `go run .\u002Fcmd\u002Fserver` — Start server\n- `go test .\u002F...` — Run all tests\n- `sqlc generate` — Regenerate from SQL queries\n- `migrate -path db\u002Fmigrations -database $DB_URL up` — Apply migrations\n\n## Important Rules\n- NEVER use `panic()` in library code — return errors\n- NEVER ignore errors — handle or explicitly comment why\n- NEVER use `init()` functions — pass dependencies explicitly\n- Always close resources with `defer`\n- Always check `context.Done()` in long operations\n- Run `go vet` and `golangci-lint` before committing\n",[150,23940,23941,23945,23949,23953,23958,23963,23968,23973,23977,23982,23986,23990,23995,24000,24005,24010,24015,24020,24025,24029,24033,24038,24043,24048,24053,24058,24063,24067,24071,24076,24081,24086,24091,24095,24099,24104,24109,24114,24119,24124],{"__ignoreMap":148},[153,23942,23943],{"class":155,"line":156},[153,23944,22990],{},[153,23946,23947],{"class":155,"line":208},[153,23948,246],{"emptyLinePlaceholder":245},[153,23950,23951],{"class":155,"line":242},[153,23952,22881],{},[153,23954,23955],{"class":155,"line":249},[153,23956,23957],{},"- Go 1.23+\n",[153,23959,23960],{"class":155,"line":255},[153,23961,23962],{},"- chi router for HTTP\n",[153,23964,23965],{"class":155,"line":268},[153,23966,23967],{},"- sqlc for type-safe SQL\n",[153,23969,23970],{"class":155,"line":281},[153,23971,23972],{},"- golang-migrate for migrations\n",[153,23974,23975],{"class":155,"line":1356},[153,23976,23780],{},[153,23978,23979],{"class":155,"line":1362},[153,23980,23981],{},"- testify for test assertions\n",[153,23983,23984],{"class":155,"line":1367},[153,23985,246],{"emptyLinePlaceholder":245},[153,23987,23988],{"class":155,"line":1372},[153,23989,22910],{},[153,23991,23992],{"class":155,"line":1378},[153,23993,23994],{},"- `cmd\u002Fserver\u002F` — Application entrypoint\n",[153,23996,23997],{"class":155,"line":1383},[153,23998,23999],{},"- `internal\u002Fapi\u002F` — HTTP handlers\n",[153,24001,24002],{"class":155,"line":1389},[153,24003,24004],{},"- `internal\u002Fservice\u002F` — Business logic\n",[153,24006,24007],{"class":155,"line":1395},[153,24008,24009],{},"- `internal\u002Frepository\u002F` — Database access (sqlc generated)\n",[153,24011,24012],{"class":155,"line":1401},[153,24013,24014],{},"- `internal\u002Fmodel\u002F` — Domain types\n",[153,24016,24017],{"class":155,"line":1407},[153,24018,24019],{},"- `db\u002Fmigrations\u002F` — SQL migration files\n",[153,24021,24022],{"class":155,"line":1129},[153,24023,24024],{},"- `db\u002Fqueries\u002F` — sqlc query files\n",[153,24026,24027],{"class":155,"line":1417},[153,24028,246],{"emptyLinePlaceholder":245},[153,24030,24031],{"class":155,"line":1423},[153,24032,22948],{},[153,24034,24035],{"class":155,"line":1683},[153,24036,24037],{},"- Standard Go project layout (cmd\u002F, internal\u002F, pkg\u002F)\n",[153,24039,24040],{"class":155,"line":1688},[153,24041,24042],{},"- Accept interfaces, return structs\n",[153,24044,24045],{"class":155,"line":12900},[153,24046,24047],{},"- Error wrapping with `fmt.Errorf(\"context: %w\", err)`\n",[153,24049,24050],{"class":155,"line":12906},[153,24051,24052],{},"- Context propagation through all layers\n",[153,24054,24055],{"class":155,"line":16075},[153,24056,24057],{},"- Table-driven tests\n",[153,24059,24060],{"class":155,"line":16089},[153,24061,24062],{},"- No global state — dependency injection via structs\n",[153,24064,24065],{"class":155,"line":16096},[153,24066,246],{"emptyLinePlaceholder":245},[153,24068,24069],{"class":155,"line":16102},[153,24070,22924],{},[153,24072,24073],{"class":155,"line":16107},[153,24074,24075],{},"- `go run .\u002Fcmd\u002Fserver` — Start server\n",[153,24077,24078],{"class":155,"line":16115},[153,24079,24080],{},"- `go test .\u002F...` — Run all tests\n",[153,24082,24083],{"class":155,"line":17034},[153,24084,24085],{},"- `sqlc generate` — Regenerate from SQL queries\n",[153,24087,24088],{"class":155,"line":17039},[153,24089,24090],{},"- `migrate -path db\u002Fmigrations -database $DB_URL up` — Apply migrations\n",[153,24092,24093],{"class":155,"line":17044},[153,24094,246],{"emptyLinePlaceholder":245},[153,24096,24097],{"class":155,"line":17050},[153,24098,22962],{},[153,24100,24101],{"class":155,"line":17055},[153,24102,24103],{},"- NEVER use `panic()` in library code — return errors\n",[153,24105,24106],{"class":155,"line":17061},[153,24107,24108],{},"- NEVER ignore errors — handle or explicitly comment why\n",[153,24110,24111],{"class":155,"line":17067},[153,24112,24113],{},"- NEVER use `init()` functions — pass dependencies explicitly\n",[153,24115,24116],{"class":155,"line":17073},[153,24117,24118],{},"- Always close resources with `defer`\n",[153,24120,24121],{"class":155,"line":17079},[153,24122,24123],{},"- Always check `context.Done()` in long operations\n",[153,24125,24126],{"class":155,"line":17085},[153,24127,24128],{},"- Run `go vet` and `golangci-lint` before committing\n",[138,24130,24132],{"id":24131},"rust","Rust",[22977,24134,24136],{"id":24135},"rust-axum","Rust + Axum",[143,24138,24140],{"className":5813,"code":24139,"language":5815,"meta":148,"style":148},"# Project: [Name]\n\n## Tech Stack\n- Rust (latest stable)\n- Axum web framework\n- SQLx for async database access\n- PostgreSQL\n- tokio async runtime\n- cargo-watch for development\n\n## Project Structure\n- `src\u002Fmain.rs` — Application bootstrap\n- `src\u002Froutes\u002F` — Axum route handlers\n- `src\u002Fmodels\u002F` — Database models and queries\n- `src\u002Ferrors.rs` — Custom error types\n- `src\u002Fstate.rs` — Application state\n- `migrations\u002F` — SQLx migrations\n\n## Coding Conventions\n- Use `thiserror` for error types, `anyhow` only in main\u002Ftests\n- Prefer `impl Trait` over `dyn Trait` when possible\n- Use `Arc\u003CAppState>` for shared application state\n- Extractors for request parsing, not manual deserialization\n- Document public APIs with `\u002F\u002F\u002F` doc comments\n\n## Development Commands\n- `cargo watch -x run` — Dev server with hot reload\n- `cargo test` — Run tests\n- `cargo clippy` — Lint\n- `sqlx migrate run` — Apply migrations\n\n## Important Rules\n- NEVER use `unwrap()` in production code — use `?` operator\n- NEVER clone unnecessarily — prefer references\n- NEVER block the async runtime — use `tokio::task::spawn_blocking`\n- Always handle all match arms explicitly\n- Run `cargo clippy` before every commit\n",[150,24141,24142,24146,24150,24154,24159,24164,24169,24174,24179,24184,24188,24192,24197,24202,24207,24212,24217,24222,24226,24230,24235,24240,24245,24250,24255,24259,24263,24268,24273,24278,24283,24287,24291,24296,24301,24306,24311],{"__ignoreMap":148},[153,24143,24144],{"class":155,"line":156},[153,24145,22990],{},[153,24147,24148],{"class":155,"line":208},[153,24149,246],{"emptyLinePlaceholder":245},[153,24151,24152],{"class":155,"line":242},[153,24153,22881],{},[153,24155,24156],{"class":155,"line":249},[153,24157,24158],{},"- Rust (latest stable)\n",[153,24160,24161],{"class":155,"line":255},[153,24162,24163],{},"- Axum web framework\n",[153,24165,24166],{"class":155,"line":268},[153,24167,24168],{},"- SQLx for async database access\n",[153,24170,24171],{"class":155,"line":281},[153,24172,24173],{},"- PostgreSQL\n",[153,24175,24176],{"class":155,"line":1356},[153,24177,24178],{},"- tokio async runtime\n",[153,24180,24181],{"class":155,"line":1362},[153,24182,24183],{},"- cargo-watch for development\n",[153,24185,24186],{"class":155,"line":1367},[153,24187,246],{"emptyLinePlaceholder":245},[153,24189,24190],{"class":155,"line":1372},[153,24191,22910],{},[153,24193,24194],{"class":155,"line":1378},[153,24195,24196],{},"- `src\u002Fmain.rs` — Application bootstrap\n",[153,24198,24199],{"class":155,"line":1383},[153,24200,24201],{},"- `src\u002Froutes\u002F` — Axum route handlers\n",[153,24203,24204],{"class":155,"line":1389},[153,24205,24206],{},"- `src\u002Fmodels\u002F` — Database models and queries\n",[153,24208,24209],{"class":155,"line":1395},[153,24210,24211],{},"- `src\u002Ferrors.rs` — Custom error types\n",[153,24213,24214],{"class":155,"line":1401},[153,24215,24216],{},"- `src\u002Fstate.rs` — Application state\n",[153,24218,24219],{"class":155,"line":1407},[153,24220,24221],{},"- `migrations\u002F` — SQLx migrations\n",[153,24223,24224],{"class":155,"line":1129},[153,24225,246],{"emptyLinePlaceholder":245},[153,24227,24228],{"class":155,"line":1417},[153,24229,22948],{},[153,24231,24232],{"class":155,"line":1423},[153,24233,24234],{},"- Use `thiserror` for error types, `anyhow` only in main\u002Ftests\n",[153,24236,24237],{"class":155,"line":1683},[153,24238,24239],{},"- Prefer `impl Trait` over `dyn Trait` when possible\n",[153,24241,24242],{"class":155,"line":1688},[153,24243,24244],{},"- Use `Arc\u003CAppState>` for shared application state\n",[153,24246,24247],{"class":155,"line":12900},[153,24248,24249],{},"- Extractors for request parsing, not manual deserialization\n",[153,24251,24252],{"class":155,"line":12906},[153,24253,24254],{},"- Document public APIs with `\u002F\u002F\u002F` doc comments\n",[153,24256,24257],{"class":155,"line":16075},[153,24258,246],{"emptyLinePlaceholder":245},[153,24260,24261],{"class":155,"line":16089},[153,24262,22924],{},[153,24264,24265],{"class":155,"line":16096},[153,24266,24267],{},"- `cargo watch -x run` — Dev server with hot reload\n",[153,24269,24270],{"class":155,"line":16102},[153,24271,24272],{},"- `cargo test` — Run tests\n",[153,24274,24275],{"class":155,"line":16107},[153,24276,24277],{},"- `cargo clippy` — Lint\n",[153,24279,24280],{"class":155,"line":16115},[153,24281,24282],{},"- `sqlx migrate run` — Apply migrations\n",[153,24284,24285],{"class":155,"line":17034},[153,24286,246],{"emptyLinePlaceholder":245},[153,24288,24289],{"class":155,"line":17039},[153,24290,22962],{},[153,24292,24293],{"class":155,"line":17044},[153,24294,24295],{},"- NEVER use `unwrap()` in production code — use `?` operator\n",[153,24297,24298],{"class":155,"line":17050},[153,24299,24300],{},"- NEVER clone unnecessarily — prefer references\n",[153,24302,24303],{"class":155,"line":17055},[153,24304,24305],{},"- NEVER block the async runtime — use `tokio::task::spawn_blocking`\n",[153,24307,24308],{"class":155,"line":17061},[153,24309,24310],{},"- Always handle all match arms explicitly\n",[153,24312,24313],{"class":155,"line":17067},[153,24314,24315],{},"- Run `cargo clippy` before every commit\n",[35,24317,24319],{"id":24318},"browse-more-templates","Browse More Templates",[12,24321,24322],{},"These are just starting points. The community has created templates for dozens more frameworks and use cases:",[19,24324,24325,24333,24336],{},[22,24326,24327,24332],{},[71,24328,24331],{"href":24329,"rel":24330},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fcollections\u002Fclaude-md-templates",[113],"Browse all CLAUDE.md templates on TokRepo"," — 50+ searchable, downloadable templates",[22,24334,24335],{},"Ruby on Rails, Laravel, Spring Boot, .NET, Flutter, Swift, and more",[22,24337,24338],{},"Specialized templates for monorepos, microservices, and full-stack apps",[35,24340,24342],{"id":24341},"best-practices-for-writing-claudemd","Best Practices for Writing CLAUDE.md",[138,24344,24346],{"id":24345},"_1-be-specific-about-constraints","1. Be Specific About Constraints",[143,24348,24350],{"className":5813,"code":24349,"language":5815,"meta":148,"style":148},"## Bad\n- Follow best practices\n\n## Good\n- Use `const` for all variable declarations unless reassignment is needed\n- Maximum function length: 30 lines\n- Every exported function must have a JSDoc comment\n",[150,24351,24352,24357,24362,24366,24371,24376,24380],{"__ignoreMap":148},[153,24353,24354],{"class":155,"line":156},[153,24355,24356],{},"## Bad\n",[153,24358,24359],{"class":155,"line":208},[153,24360,24361],{},"- Follow best practices\n",[153,24363,24364],{"class":155,"line":242},[153,24365,246],{"emptyLinePlaceholder":245},[153,24367,24368],{"class":155,"line":249},[153,24369,24370],{},"## Good\n",[153,24372,24373],{"class":155,"line":255},[153,24374,24375],{},"- Use `const` for all variable declarations unless reassignment is needed\n",[153,24377,24378],{"class":155,"line":268},[153,24379,8025],{},[153,24381,24382],{"class":155,"line":281},[153,24383,24384],{},"- Every exported function must have a JSDoc comment\n",[138,24386,24388],{"id":24387},"_2-include-actual-commands","2. Include Actual Commands",[143,24390,24392],{"className":5813,"code":24391,"language":5815,"meta":148,"style":148},"## Bad\n- Run the tests before committing\n\n## Good\n- Run `npm test` before committing\n- Run `npm run lint:fix` to auto-fix style issues\n- Run `npm run typecheck` to verify TypeScript types\n",[150,24393,24394,24398,24403,24407,24411,24415,24420],{"__ignoreMap":148},[153,24395,24396],{"class":155,"line":156},[153,24397,24356],{},[153,24399,24400],{"class":155,"line":208},[153,24401,24402],{},"- Run the tests before committing\n",[153,24404,24405],{"class":155,"line":242},[153,24406,246],{"emptyLinePlaceholder":245},[153,24408,24409],{"class":155,"line":249},[153,24410,24370],{},[153,24412,24413],{"class":155,"line":255},[153,24414,5879],{},[153,24416,24417],{"class":155,"line":268},[153,24418,24419],{},"- Run `npm run lint:fix` to auto-fix style issues\n",[153,24421,24422],{"class":155,"line":281},[153,24423,24424],{},"- Run `npm run typecheck` to verify TypeScript types\n",[138,24426,24428],{"id":24427},"_3-document-architecture-decisions","3. Document Architecture Decisions",[143,24430,24432],{"className":5813,"code":24431,"language":5815,"meta":148,"style":148},"## Why We Use X\nWe chose Zustand over Redux because:\n- Simpler API, less boilerplate\n- Better TypeScript support out of the box\n- No need for middleware in our use case\n",[150,24433,24434,24439,24444,24449,24454],{"__ignoreMap":148},[153,24435,24436],{"class":155,"line":156},[153,24437,24438],{},"## Why We Use X\n",[153,24440,24441],{"class":155,"line":208},[153,24442,24443],{},"We chose Zustand over Redux because:\n",[153,24445,24446],{"class":155,"line":242},[153,24447,24448],{},"- Simpler API, less boilerplate\n",[153,24450,24451],{"class":155,"line":249},[153,24452,24453],{},"- Better TypeScript support out of the box\n",[153,24455,24456],{"class":155,"line":255},[153,24457,24458],{},"- No need for middleware in our use case\n",[138,24460,24462],{"id":24461},"_4-keep-it-under-500-lines","4. Keep It Under 500 Lines",[12,24464,24465],{},"Claude Code reads CLAUDE.md into its context window. A 2,000-line file wastes tokens on information Claude may not need. Keep it focused on conventions and constraints.",[116,24467,24468],{"type":118},[12,24469,24470,24471,24474],{},"Split large CLAUDE.md files into sections: put framework conventions in the root CLAUDE.md, and put module-specific instructions in ",[150,24472,24473],{},".claude\u002F"," subdirectory files.",[138,24476,2514],{"id":2513},[12,24478,24479,24482],{},[45,24480,24481],{},"Q: What is CLAUDE.md?","\nA: A markdown configuration file placed in your project root that tells Claude Code how to work with your codebase — coding conventions, project structure, development commands, and important constraints.",[12,24484,24485,24488],{},[45,24486,24487],{},"Q: Do I need a CLAUDE.md file?","\nA: No, Claude Code works without one. But adding a CLAUDE.md significantly improves code quality by teaching Claude your project's specific patterns and constraints.",[12,24490,24491,24494,24495,528,24497,24499],{},[45,24492,24493],{},"Q: Where should I put CLAUDE.md?","\nA: In your project root directory (next to ",[150,24496,6759],{},[150,24498,6762],{},", etc.). Claude Code automatically reads it at session start.",[12,24501,24502,24505,24506,24508,24509,24511,24512,24514],{},[45,24503,24504],{},"Q: Can I use the same CLAUDE.md for Cursor?","\nA: The content is transferable — save it as ",[150,24507,6663],{}," for Cursor, ",[150,24510,5558],{}," for Codex CLI, or ",[150,24513,8669],{}," for Gemini CLI. The format is nearly identical.",[35,24516,1020],{"id":1019},[19,24518,24519,24526,24531,24536,24541],{},[22,24520,24521,24525],{},[71,24522,24524],{"href":24329,"rel":24523},[113],"Browse CLAUDE.md templates on TokRepo"," — find one for your framework",[22,24527,24528,24530],{},[71,24529,1258],{"href":1169}," — go beyond CLAUDE.md with reusable skills",[22,24532,24533,24535],{},[71,24534,16623],{"href":16622}," — understand the full extension model",[22,24537,24538,24540],{},[71,24539,1263],{"href":1262}," — when to use CLAUDE.md vs skills vs MCP",[22,24542,24543,24547],{},[71,24544,24546],{"href":24545},"\u002Fguide\u002Fcodex-cli-vs-claude-code","Codex CLI vs Claude Code"," — choose the right AI coding tool",[1074,24549,24550],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":148,"searchDepth":208,"depth":208,"links":24552},[24553,24554,24557,24558,24564,24565,24572],{"id":78,"depth":208,"text":79},{"id":22739,"depth":208,"text":22740,"children":24555},[24556],{"id":22777,"depth":242,"text":22778},{"id":22844,"depth":208,"text":22845},{"id":22970,"depth":208,"text":22971,"children":24559},[24560,24561,24562,24563],{"id":22974,"depth":242,"text":22975},{"id":15398,"depth":242,"text":23551},{"id":23930,"depth":242,"text":23931},{"id":24131,"depth":242,"text":24132},{"id":24318,"depth":208,"text":24319},{"id":24341,"depth":208,"text":24342,"children":24566},[24567,24568,24569,24570,24571],{"id":24345,"depth":242,"text":24346},{"id":24387,"depth":242,"text":24388},{"id":24427,"depth":242,"text":24428},{"id":24461,"depth":242,"text":24462},{"id":2513,"depth":242,"text":2514},{"id":1019,"depth":208,"text":1020},"Browse 50+ real CLAUDE.md examples for React, Python, Go, TypeScript, Next.js, Nuxt, Django, FastAPI, and more. Copy-paste templates to configure Claude Code for your project.","浏览 50+ 真实 CLAUDE.md 模板：React、Python、Go、TypeScript、Next.js 等框架，复制到项目根目录即可配置 Claude Code。",[24576,24579,24582,24585,24588],{"q":24577,"a":24578},"What is CLAUDE.md and where should I put it?","CLAUDE.md is a Markdown configuration file placed in your project root (next to package.json or go.mod) that tells Claude Code your coding conventions, project structure, dev commands, and constraints. Claude Code reads it automatically at session start — no configuration needed beyond creating the file.",{"q":24580,"a":24581},"What should I include in a CLAUDE.md file?","Five sections: Tech Stack (framework and versions), Project Structure (key directories), Development Commands (actual commands like npm test, not vague instructions), Coding Conventions (naming, patterns, formatting), and Important Rules (NEVER-do list for critical constraints). Keep it specific, not generic.",{"q":24583,"a":24584},"Can I reuse my CLAUDE.md for Cursor or Codex CLI?","Yes — the content is transferable. Save it as .cursorrules for Cursor, AGENTS.md for OpenAI Codex CLI, or GEMINI.md for Gemini CLI. The Markdown format is nearly identical across AI coding tools, so you can maintain one source of truth and sync it to each agent's filename.",{"q":24586,"a":24587},"How long should my CLAUDE.md be?","Under 500 lines. Claude Code reads CLAUDE.md into its context window on every session, so a 2,000-line file wastes tokens on info Claude may not need. Split large configs: framework conventions in root CLAUDE.md, module-specific instructions in .claude\u002F subdirectory files.",{"q":24589,"a":24590},"Do I need a CLAUDE.md file at all?","No — Claude Code works without one. But adding a CLAUDE.md significantly improves code quality by teaching Claude your specific patterns. Without it, Claude defaults to generic best practices that may not match your team's conventions (for example, Server Components vs Client Components in Next.js 15).","\u002Fguide\u002Fimages\u002Fclaude-md-examples-hero.svg",{},"\u002Fen\u002Fguide\u002Fclaude-md-examples",{"title":22715,"description":24573},"en\u002Fguide\u002Fclaude-md-examples",[24597,2769,24598,24599],"claude-md","templates","configuration","CLAUDE.md 模板大全：50+ 框架模板示例","CLAUDE.md is a Markdown configuration file in your project root that tells Claude Code your tech stack, project structure, development commands, coding conventions, and important constraints. Copy one of 50+ templates for React, Next.js 15, Nuxt 3, FastAPI, Django, Go+Chi, or Rust+Axum, customize for your project, and Claude Code reads it automatically at session start. Keep it under 500 lines.","pPlG8gCG94bVdvfTqwOqq1hJGv2zZqYFM08WBha_Zro",{"id":24604,"title":24605,"answer":6,"answerZh":6,"author":7,"body":24606,"category":3701,"description":25531,"descriptionZh":25532,"extension":1109,"faqs":25533,"faqsZh":6,"image":25549,"meta":25550,"navigation":245,"path":25551,"publishedAt":14945,"readTime":1378,"seo":25552,"stem":25553,"tags":25554,"titleZh":25557,"tldr":25558,"tldrZh":6,"updatedAt":14945,"__hash__":25559},"docs_en\u002Fen\u002Fguide\u002Fcodex-cli-vs-claude-code.md","Codex CLI vs Claude Code: Which Has the Better Developer Ecosystem?",{"type":9,"value":24607,"toc":25514},[24608,24611,24613,24624,24628,24634,24637,24642,24646,24650,24733,24745,24752,24802,24806,24809,24884,24946,24973,24979,24984,24988,24994,25059,25066,25153,25160,25164,25242,25245,25249,25329,25334,25338,25379,25383,25392,25401,25405,25410,25424,25429,25443,25448,25459,25461,25471,25477,25483,25485,25511],[12,24609,24610],{},"Learn how to choose between Codex CLI and Claude Code based on their developer ecosystems — skills marketplace, MCP server support, hooks system, plugin architecture, and IDE integrations. This guide compares extensibility, not just code quality.",[35,24612,79],{"id":78},[19,24614,24615,24618,24621],{},[22,24616,24617],{},"Basic familiarity with AI coding assistants",[22,24619,24620],{},"Understanding of what MCP (Model Context Protocol) servers do",[22,24622,24623],{},"Optional: experience with either Claude Code or Codex CLI",[35,24625,24627],{"id":24626},"why-compare-ecosystems-not-just-code-quality","Why Compare Ecosystems, Not Just Code Quality?",[12,24629,24630,24631],{},"Most Codex CLI vs Claude Code comparisons focus on benchmark scores and pricing. But for professional developers, the real question is: ",[45,24632,24633],{},"which tool fits better into my existing workflow?",[12,24635,24636],{},"The answer depends on ecosystems — skills, plugins, hooks, MCP servers, and IDE integrations. A tool that scores 3% higher on SWE-bench but lacks the integrations you need is the wrong choice.",[116,24638,24639],{"type":118},[12,24640,24641],{},"Both tools access the same 10,000+ MCP server ecosystem. The real differentiator is how each tool orchestrates extensions, not which extensions are available.",[35,24643,24645],{"id":24644},"head-to-head-comparison","Head-to-Head Comparison",[138,24647,24649],{"id":24648},"skills-plugins","Skills & Plugins",[809,24651,24652,24663],{},[812,24653,24654],{},[815,24655,24656,24659,24661],{},[818,24657,24658],{},"Feature",[818,24660,1159],{},[818,24662,5424],{},[828,24664,24665,24678,24691,24704,24717],{},[815,24666,24667,24672,24675],{},[833,24668,24669],{},[45,24670,24671],{},"Skills count",[833,24673,24674],{},"150+ curated + marketplace",[833,24676,24677],{},"20+ plugins (launched March 2026)",[815,24679,24680,24685,24688],{},[833,24681,24682],{},[45,24683,24684],{},"Skill format",[833,24686,24687],{},"Markdown (SKILL.md) — no code required",[833,24689,24690],{},"Plugin packages",[815,24692,24693,24698,24701],{},[833,24694,24695],{},[45,24696,24697],{},"Marketplace",[833,24699,24700],{},"Public marketplace + GitHub-based distribution",[833,24702,24703],{},"No public marketplace yet",[815,24705,24706,24711,24714],{},[833,24707,24708],{},[45,24709,24710],{},"Plugin system",[833,24712,24713],{},"11 domain plugins (sales, legal, finance, marketing, etc.)",[833,24715,24716],{},"20+ plugins (Figma, Notion, Gmail, Slack, etc.)",[815,24718,24719,24724,24730],{},[833,24720,24721],{},[45,24722,24723],{},"Skill creation",[833,24725,24726,24727],{},"Write a markdown file, drop in ",[150,24728,24729],{},".claude\u002Fskills\u002F",[833,24731,24732],{},"Build a package, publish to registry",[12,24734,24735,24736,24739,24740,24744],{},"Claude Code's skill system has a clear advantage in ",[45,24737,24738],{},"accessibility"," — any developer can write a markdown file and have a working skill in minutes. Browse ",[71,24741,24743],{"href":1530,"rel":24742},[113],"500+ skills on TokRepo"," to see the variety.",[12,24746,24747,24748,24751],{},"Codex CLI's plugin system is newer but focuses on ",[45,24749,24750],{},"SaaS integrations"," — connecting to Figma, Notion, and Slack directly. This is a different value proposition.",[143,24753,24755],{"className":145,"code":24754,"language":147,"meta":148,"style":148},"# Claude Code: Install a skill in 10 seconds\nmkdir -p .claude\u002Fskills\ncurl -o .claude\u002Fskills\u002Fcode-reviewer.md https:\u002F\u002Ftokrepo.com\u002Fraw\u002Fskill-id\n\n# Codex CLI: Install a plugin\ncodex plugin install figma-connector\n",[150,24756,24757,24762,24770,24781,24785,24790],{"__ignoreMap":148},[153,24758,24759],{"class":155,"line":156},[153,24760,24761],{"class":211},"# Claude Code: Install a skill in 10 seconds\n",[153,24763,24764,24766,24768],{"class":155,"line":208},[153,24765,1312],{"class":159},[153,24767,366],{"class":163},[153,24769,15111],{"class":167},[153,24771,24772,24774,24776,24778],{"class":155,"line":242},[153,24773,160],{"class":159},[153,24775,15118],{"class":163},[153,24777,15753],{"class":167},[153,24779,24780],{"class":167}," https:\u002F\u002Ftokrepo.com\u002Fraw\u002Fskill-id\n",[153,24782,24783],{"class":155,"line":249},[153,24784,246],{"emptyLinePlaceholder":245},[153,24786,24787],{"class":155,"line":255},[153,24788,24789],{"class":211},"# Codex CLI: Install a plugin\n",[153,24791,24792,24794,24797,24799],{"class":155,"line":268},[153,24793,5718],{"class":159},[153,24795,24796],{"class":167}," plugin",[153,24798,1590],{"class":167},[153,24800,24801],{"class":167}," figma-connector\n",[138,24803,24805],{"id":24804},"mcp-server-support","MCP Server Support",[12,24807,24808],{},"Both tools have full MCP support, accessing the same ecosystem of 10,000+ servers.",[809,24810,24811,24821],{},[812,24812,24813],{},[815,24814,24815,24817,24819],{},[818,24816,24658],{},[818,24818,1159],{},[818,24820,5424],{},[828,24822,24823,24836,24854,24867],{},[815,24824,24825,24830,24833],{},[833,24826,24827],{},[45,24828,24829],{},"MCP support",[833,24831,24832],{},"Native (Anthropic created MCP)",[833,24834,24835],{},"Full support (adopted standard)",[815,24837,24838,24843,24848],{},[833,24839,24840],{},[45,24841,24842],{},"Config format",[833,24844,24845,24847],{},[150,24846,17611],{}," (JSON)",[833,24849,24850,24853],{},[150,24851,24852],{},"config.toml"," (TOML)",[815,24855,24856,24861,24864],{},[833,24857,24858],{},[45,24859,24860],{},"Server count",[833,24862,24863],{},"10,000+ ecosystem-wide",[833,24865,24866],{},"10,000+ (same ecosystem)",[815,24868,24869,24874,24879],{},[833,24870,24871],{},[45,24872,24873],{},"Install command",[833,24875,24876],{},[150,24877,24878],{},"claude mcp add \u003Cname>",[833,24880,24881],{},[150,24882,24883],{},"codex mcp add \u003Cname>",[143,24885,24887],{"className":3807,"code":24886,"language":3809,"meta":148,"style":148},"\u002F\u002F Claude Code .mcp.json\n{\n  \"mcpServers\": {\n    \"github\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-github\"]\n    }\n  }\n}\n",[150,24888,24889,24894,24898,24904,24910,24920,24934,24938,24942],{"__ignoreMap":148},[153,24890,24891],{"class":155,"line":156},[153,24892,24893],{"class":211},"\u002F\u002F Claude Code .mcp.json\n",[153,24895,24896],{"class":155,"line":208},[153,24897,3816],{"class":313},[153,24899,24900,24902],{"class":155,"line":242},[153,24901,3821],{"class":163},[153,24903,3824],{"class":313},[153,24905,24906,24908],{"class":155,"line":249},[153,24907,3829],{"class":163},[153,24909,3824],{"class":313},[153,24911,24912,24914,24916,24918],{"class":155,"line":255},[153,24913,3836],{"class":163},[153,24915,3839],{"class":313},[153,24917,3842],{"class":167},[153,24919,3845],{"class":313},[153,24921,24922,24924,24926,24928,24930,24932],{"class":155,"line":268},[153,24923,3850],{"class":163},[153,24925,3853],{"class":313},[153,24927,3856],{"class":167},[153,24929,528],{"class":313},[153,24931,3861],{"class":167},[153,24933,5386],{"class":313},[153,24935,24936],{"class":155,"line":281},[153,24937,3891],{"class":313},[153,24939,24940],{"class":155,"line":1356},[153,24941,3896],{"class":313},[153,24943,24944],{"class":155,"line":1362},[153,24945,3901],{"class":313},[143,24947,24951],{"className":24948,"code":24949,"language":24950,"meta":148,"style":148},"language-toml shiki shiki-themes github-light github-dark","# Codex CLI config.toml\n[mcp.github]\ncommand = \"npx\"\nargs = [\"-y\", \"@modelcontextprotocol\u002Fserver-github\"]\n","toml",[150,24952,24953,24958,24963,24968],{"__ignoreMap":148},[153,24954,24955],{"class":155,"line":156},[153,24956,24957],{},"# Codex CLI config.toml\n",[153,24959,24960],{"class":155,"line":208},[153,24961,24962],{},"[mcp.github]\n",[153,24964,24965],{"class":155,"line":242},[153,24966,24967],{},"command = \"npx\"\n",[153,24969,24970],{"class":155,"line":249},[153,24971,24972],{},"args = [\"-y\", \"@modelcontextprotocol\u002Fserver-github\"]\n",[12,24974,1527,24975,24978],{},[71,24976,18192],{"href":5477,"rel":24977},[113]," — most configs work with both tools.",[116,24980,24981],{"type":118},[12,24982,24983],{},"MCP is now an open standard under the Linux Foundation. Both Claude Code and Codex CLI are first-class citizens in the ecosystem, along with Cursor, Gemini CLI, and VS Code.",[138,24985,24987],{"id":24986},"hooks-lifecycle-events","Hooks & Lifecycle Events",[12,24989,24990,24991,667],{},"This is where Claude Code has a ",[45,24992,24993],{},"unique architectural advantage",[809,24995,24996,25006],{},[812,24997,24998],{},[815,24999,25000,25002,25004],{},[818,25001,24658],{},[818,25003,1159],{},[818,25005,5424],{},[828,25007,25008,25021,25034,25047],{},[815,25009,25010,25015,25018],{},[833,25011,25012],{},[45,25013,25014],{},"Lifecycle events",[833,25016,25017],{},"21 events",[833,25019,25020],{},"GitHub Triggers only",[815,25022,25023,25028,25031],{},[833,25024,25025],{},[45,25026,25027],{},"Handler types",[833,25029,25030],{},"4 (command, prompt, agent, inline)",[833,25032,25033],{},"Shell commands",[815,25035,25036,25041,25044],{},[833,25037,25038],{},[45,25039,25040],{},"Can block execution",[833,25042,25043],{},"Yes (PreToolUse)",[833,25045,25046],{},"No",[815,25048,25049,25054,25057],{},[833,25050,25051],{},[45,25052,25053],{},"LLM-based hooks",[833,25055,25056],{},"Yes (prompt\u002Fagent handlers)",[833,25058,25046],{},[12,25060,25061,25062,25065],{},"Claude Code's hook system lets you run ",[45,25063,25064],{},"LLM-powered automation"," on lifecycle events — for example, a PreToolUse hook that uses AI to evaluate whether a file edit is safe before allowing it. No other CLI tool offers this.",[143,25067,25069],{"className":3807,"code":25068,"language":3809,"meta":148,"style":148},"\u002F\u002F Claude Code: Hook that blocks dangerous file edits\n{\n  \"hooks\": {\n    \"PreToolUse\": [{\n      \"matcher\": \"Edit\",\n      \"handler\": {\n        \"type\": \"prompt\",\n        \"prompt\": \"Is this edit safe? Check for credential exposure.\"\n      }\n    }]\n  }\n}\n",[150,25070,25071,25076,25080,25087,25095,25107,25114,25126,25136,25140,25145,25149],{"__ignoreMap":148},[153,25072,25073],{"class":155,"line":156},[153,25074,25075],{"class":211},"\u002F\u002F Claude Code: Hook that blocks dangerous file edits\n",[153,25077,25078],{"class":155,"line":208},[153,25079,3816],{"class":313},[153,25081,25082,25085],{"class":155,"line":242},[153,25083,25084],{"class":163},"  \"hooks\"",[153,25086,3824],{"class":313},[153,25088,25089,25092],{"class":155,"line":249},[153,25090,25091],{"class":163},"    \"PreToolUse\"",[153,25093,25094],{"class":313},": [{\n",[153,25096,25097,25100,25102,25105],{"class":155,"line":255},[153,25098,25099],{"class":163},"      \"matcher\"",[153,25101,3839],{"class":313},[153,25103,25104],{"class":167},"\"Edit\"",[153,25106,3845],{"class":313},[153,25108,25109,25112],{"class":155,"line":268},[153,25110,25111],{"class":163},"      \"handler\"",[153,25113,3824],{"class":313},[153,25115,25116,25119,25121,25124],{"class":155,"line":281},[153,25117,25118],{"class":163},"        \"type\"",[153,25120,3839],{"class":313},[153,25122,25123],{"class":167},"\"prompt\"",[153,25125,3845],{"class":313},[153,25127,25128,25131,25133],{"class":155,"line":1356},[153,25129,25130],{"class":163},"        \"prompt\"",[153,25132,3839],{"class":313},[153,25134,25135],{"class":167},"\"Is this edit safe? Check for credential exposure.\"\n",[153,25137,25138],{"class":155,"line":1362},[153,25139,3886],{"class":313},[153,25141,25142],{"class":155,"line":1367},[153,25143,25144],{"class":313},"    }]\n",[153,25146,25147],{"class":155,"line":1372},[153,25148,3896],{"class":313},[153,25150,25151],{"class":155,"line":1378},[153,25152,3901],{"class":313},[12,25154,25155,25156,25159],{},"Codex CLI's Triggers system is different — it responds to ",[45,25157,25158],{},"GitHub events"," (issue opened → auto-fix → auto-PR), which is powerful for CI\u002FCD but not for real-time development guardrails.",[138,25161,25163],{"id":25162},"ide-integrations","IDE Integrations",[809,25165,25166,25177],{},[812,25167,25168],{},[815,25169,25170,25173,25175],{},[818,25171,25172],{},"IDE",[818,25174,1159],{},[818,25176,5424],{},[828,25178,25179,25192,25205,25217,25229],{},[815,25180,25181,25186,25189],{},[833,25182,25183],{},[45,25184,25185],{},"VS Code",[833,25187,25188],{},"Native extension with chat panel",[833,25190,25191],{},"Official extension with cloud delegation",[815,25193,25194,25199,25202],{},[833,25195,25196],{},[45,25197,25198],{},"JetBrains",[833,25200,25201],{},"Plugin (IntelliJ, PyCharm, WebStorm)",[833,25203,25204],{},"Native AI chat integration",[815,25206,25207,25212,25215],{},[833,25208,25209],{},[45,25210,25211],{},"Terminal",[833,25213,25214],{},"Primary interface",[833,25216,25214],{},[815,25218,25219,25223,25226],{},[833,25220,25221],{},[45,25222,6675],{},[833,25224,25225],{},"Compatible via MCP",[833,25227,25228],{},"Compatible via plugin",[815,25230,25231,25236,25239],{},[833,25232,25233],{},[45,25234,25235],{},"Zed",[833,25237,25238],{},"Official ACP agent",[833,25240,25241],{},"Not available",[12,25243,25244],{},"Both tools have strong IDE support. Claude Code has an edge with Zed integration; Codex CLI has an edge with deeper JetBrains native integration.",[138,25246,25248],{"id":25247},"pricing-token-efficiency","Pricing & Token Efficiency",[809,25250,25251,25262],{},[812,25252,25253],{},[815,25254,25255,25258,25260],{},[818,25256,25257],{},"Plan",[818,25259,1159],{},[818,25261,5424],{},[828,25263,25264,25277,25290,25303,25316],{},[815,25265,25266,25271,25274],{},[833,25267,25268],{},[45,25269,25270],{},"Entry",[833,25272,25273],{},"$20\u002Fmo (Pro)",[833,25275,25276],{},"$20\u002Fmo (Plus)",[815,25278,25279,25284,25287],{},[833,25280,25281],{},[45,25282,25283],{},"Heavy use",[833,25285,25286],{},"$100-200\u002Fmo (Max)",[833,25288,25289],{},"$200\u002Fmo (Pro)",[815,25291,25292,25297,25300],{},[833,25293,25294],{},[45,25295,25296],{},"API input",[833,25298,25299],{},"$3\u002FMTok (Sonnet 4.6)",[833,25301,25302],{},"$1.50\u002FMTok (codex-mini)",[815,25304,25305,25310,25313],{},[833,25306,25307],{},[45,25308,25309],{},"API output",[833,25311,25312],{},"$15\u002FMTok (Sonnet 4.6)",[833,25314,25315],{},"$6\u002FMTok (codex-mini)",[815,25317,25318,25323,25326],{},[833,25319,25320],{},[45,25321,25322],{},"Context window",[833,25324,25325],{},"Up to 1M tokens",[833,25327,25328],{},"256K-1M tokens",[116,25330,25331],{"type":452},[12,25332,25333],{},"Token efficiency matters: benchmarks show Codex CLI uses ~4x fewer tokens for equivalent complex tasks (1.5M vs 6.2M tokens for a Figma-to-code task). This can significantly impact API costs at scale.",[138,25335,25337],{"id":25336},"benchmark-performance","Benchmark Performance",[809,25339,25340,25351],{},[812,25341,25342],{},[815,25343,25344,25347,25349],{},[818,25345,25346],{},"Benchmark",[818,25348,1159],{},[818,25350,5424],{},[828,25352,25353,25366],{},[815,25354,25355,25360,25363],{},[833,25356,25357],{},[45,25358,25359],{},"SWE-bench Verified",[833,25361,25362],{},"80.8% (Opus 4.6)",[833,25364,25365],{},"77.3% (Terminal-Bench)",[815,25367,25368,25373,25376],{},[833,25369,25370],{},[45,25371,25372],{},"Real-world coding",[833,25374,25375],{},"Strong at complex multi-file refactors",[833,25377,25378],{},"Strong at rapid iteration",[35,25380,25382],{"id":25381},"also-consider-cursor-gemini-cli","Also Consider: Cursor & Gemini CLI",[12,25384,25385,25387,25388,667],{},[45,25386,6675],{}," (96.6K stars) takes a GUI-first approach with its own MCP marketplace (4,133+ verified servers). At $20\u002Fmo it's the most accessible option, but it's an IDE, not a CLI tool. Browse ",[71,25389,25391],{"href":8550,"rel":25390},[113],"Cursor-compatible prompts on TokRepo",[12,25393,25394,25396,25397,25400],{},[45,25395,5610],{}," (96.6K stars) is fully open source (Apache 2.0) with a generous free tier (1,000 req\u002Fday). It has the largest context window (1M tokens) and built-in Google Search grounding, but ",[45,25398,25399],{},"no plugin or skill marketplace"," — it relies entirely on MCP and subagents.",[35,25402,25404],{"id":25403},"which-should-you-choose","Which Should You Choose?",[12,25406,25407],{},[45,25408,25409],{},"Choose Claude Code if:",[19,25411,25412,25415,25418,25421],{},[22,25413,25414],{},"You want the largest skill\u002Fplugin ecosystem today",[22,25416,25417],{},"You need advanced hooks with LLM-based automation",[22,25419,25420],{},"You work across VS Code, JetBrains, and Zed",[22,25422,25423],{},"You value community-created, markdown-based extensibility",[12,25425,25426],{},[45,25427,25428],{},"Choose Codex CLI if:",[19,25430,25431,25434,25437,25440],{},[22,25432,25433],{},"You need SaaS integrations (Figma, Notion, Slack)",[22,25435,25436],{},"Token cost efficiency is a priority",[22,25438,25439],{},"You prefer open-source tools (Apache 2.0)",[22,25441,25442],{},"You want GitHub Triggers for automated PR workflows",[12,25444,25445],{},[45,25446,25447],{},"Choose Gemini CLI if:",[19,25449,25450,25453,25456],{},[22,25451,25452],{},"You want a free, open-source option",[22,25454,25455],{},"You primarily work in terminal",[22,25457,25458],{},"You don't need a plugin marketplace",[138,25460,2514],{"id":2513},[12,25462,25463,25466,25467,25470],{},[45,25464,25465],{},"Q: Can I use both Claude Code and Codex CLI together?","\nA: Yes. OpenAI published a Claude Code plugin for Codex CLI (",[150,25468,25469],{},"codex-plugin-cc","), enabling cross-tool workflows. Both tools can also share MCP server configurations.",[12,25472,25473,25476],{},[45,25474,25475],{},"Q: Which tool has better MCP support?","\nA: Both have full MCP support accessing the same 10,000+ server ecosystem. Claude Code has a slight edge as the protocol's creator, but in practice the experience is equivalent.",[12,25478,25479,25482],{},[45,25480,25481],{},"Q: Is Claude Code or Codex CLI better for beginners?","\nA: Both have similar learning curves. Claude Code's markdown-based skills are easier to create and customize. Codex CLI's open-source nature means more community tutorials and forks to learn from.",[35,25484,1020],{"id":1019},[19,25486,25487,25494,25501,25506],{},[22,25488,25489,25493],{},[71,25490,25492],{"href":1530,"rel":25491},[113],"Browse 500+ Claude Code skills on TokRepo"," — install with one command",[22,25495,25496,25500],{},[71,25497,25499],{"href":5477,"rel":25498},[113],"Best MCP Servers for 2026"," — works with both tools",[22,25502,25503,25505],{},[71,25504,1258],{"href":1169}," — build a skill in 5 minutes",[22,25507,25508,25510],{},[71,25509,1263],{"href":1262}," — understand the three extension models",[1074,25512,25513],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":148,"searchDepth":208,"depth":208,"links":25515},[25516,25517,25518,25526,25527,25530],{"id":78,"depth":208,"text":79},{"id":24626,"depth":208,"text":24627},{"id":24644,"depth":208,"text":24645,"children":25519},[25520,25521,25522,25523,25524,25525],{"id":24648,"depth":242,"text":24649},{"id":24804,"depth":242,"text":24805},{"id":24986,"depth":242,"text":24987},{"id":25162,"depth":242,"text":25163},{"id":25247,"depth":242,"text":25248},{"id":25336,"depth":242,"text":25337},{"id":25381,"depth":208,"text":25382},{"id":25403,"depth":208,"text":25404,"children":25528},[25529],{"id":2513,"depth":242,"text":2514},{"id":1019,"depth":208,"text":1020},"In-depth comparison of Codex CLI and Claude Code from a developer ecosystem perspective — skills, MCP servers, hooks, plugins, pricing, and IDE support in 2026.","从开发者生态角度深度对比 Codex CLI 和 Claude Code —— Skills、MCP、Hooks、插件、定价和 IDE 支持（2026）。",[25534,25537,25540,25543,25546],{"q":25535,"a":25536},"What's the difference between Codex CLI and Claude Code?","Claude Code offers Markdown-based skills, 21 lifecycle hooks with LLM handlers, and broader IDE support (including Zed). Codex CLI offers deeper SaaS plugin integrations (Figma, Notion, Slack), ~4x better token efficiency, and fully open-source licensing. Both support the same 10,000+ MCP server ecosystem.",{"q":25538,"a":25539},"Can I use Claude Code and Codex CLI together?","Yes. OpenAI published a Claude Code plugin for Codex CLI (codex-plugin-cc), enabling cross-tool workflows. Both tools can also share MCP server configurations — Claude Code uses .mcp.json (JSON) and Codex CLI uses config.toml (TOML), but the underlying server commands are identical.",{"q":25541,"a":25542},"Which tool is more token-efficient?","Codex CLI uses roughly 4x fewer tokens for equivalent complex tasks (benchmarks show 1.5M vs 6.2M tokens on a Figma-to-code task). At scale this significantly impacts API costs. Claude Code has a larger context window option (up to 1M) and better long-horizon reasoning.",{"q":25544,"a":25545},"Which has better hooks and lifecycle events?","Claude Code has a unique advantage with 21 lifecycle events and LLM-powered hook handlers — you can run a PreToolUse hook that uses AI to evaluate whether a file edit is safe. Codex CLI's Triggers system only responds to GitHub events (issue opened → auto-PR), which is powerful for CI\u002FCD but not real-time development guardrails.",{"q":25547,"a":25548},"Which AI coding tool should a beginner choose?","Claude Code for easier skill creation — you write a Markdown file and drop it into .claude\u002Fskills\u002F. Codex CLI for open-source transparency and community tutorials. Both have similar learning curves, and at $20\u002Fmonth entry pricing the cost is identical.","\u002Fguide\u002Fimages\u002Fcodex-vs-claude-hero.svg",{},"\u002Fen\u002Fguide\u002Fcodex-cli-vs-claude-code",{"title":24605,"description":25531},"en\u002Fguide\u002Fcodex-cli-vs-claude-code",[25555,2769,3701,25556],"codex-cli",2026,"Codex CLI vs Claude Code：哪个开发者生态更强？","Claude Code wins on skills marketplace (150+ curated Markdown skills), hooks system (21 lifecycle events with LLM-powered handlers), and IDE breadth (VS Code, JetBrains, Zed). Codex CLI wins on token efficiency (~4x fewer tokens for complex tasks), SaaS plugin integrations (Figma, Notion, Slack), and open-source licensing. Both share the same 10,000+ MCP server ecosystem, so the real differentiator is orchestration, not extensions.","-EZmZZ5gzG5Eb-yBAbqVqNhx3scUSorVibNE7PqTyLE",{"id":25561,"title":25562,"answer":6,"answerZh":6,"author":7,"body":25563,"category":1106,"description":26597,"descriptionZh":26598,"extension":1109,"faqs":26599,"faqsZh":6,"image":26615,"meta":26616,"navigation":245,"path":1034,"publishedAt":14945,"readTime":1395,"seo":26617,"stem":26618,"tags":26619,"titleZh":26621,"tldr":26622,"tldrZh":6,"updatedAt":14945,"__hash__":26623},"docs_en\u002Fen\u002Fguide\u002Fhow-to-build-ai-agent.md","How to Build an AI Agent: The Complete Guide for Beginners (2026)",{"type":9,"value":25564,"toc":26565},[25565,25568,25570,25590,25594,25600,25625,25632,25637,25641,25645,25650,25698,25701,25724,25729,25733,25739,25835,25840,25844,25850,25898,25904,25908,25911,25915,25937,25941,25991,25995,26059,26063,26073,26077,26089,26092,26096,26099,26103,26117,26121,26132,26136,26147,26151,26165,26169,26180,26184,26187,26332,26336,26339,26408,26411,26415,26419,26444,26448,26470,26474,26496,26498,26504,26510,26516,26522,26524,26562],[12,25566,25567],{},"Learn how to build a working AI agent in 2026 without writing code from scratch. This guide shows you how to assemble agents from pre-built skills, MCP servers, and prompt templates — the same approach used by professional developers at companies like Anthropic, Vercel, and Supabase.",[35,25569,79],{"id":78},[19,25571,25572,25575,25587],{},[22,25573,25574],{},"A computer with terminal access",[22,25576,25577,528,25580,25583,25584,22730],{},[71,25578,1159],{"href":1157,"rel":25579},[113],[71,25581,5424],{"href":5422,"rel":25582},[113],", or ",[71,25585,5610],{"href":8653,"rel":25586},[113],[22,25588,25589],{},"A specific task you want to automate (code review, content writing, data analysis, etc.)",[35,25591,25593],{"id":25592},"what-is-an-ai-agent","What is an AI Agent?",[12,25595,12491,25596,25599],{},[45,25597,25598],{},"AI agent"," is a program that uses a large language model (LLM) to autonomously complete tasks. Unlike a chatbot (which answers one question at a time), an agent can:",[19,25601,25602,25607,25613,25619],{},[22,25603,25604,25606],{},[45,25605,25257],{}," — Break complex tasks into steps",[22,25608,25609,25612],{},[45,25610,25611],{},"Use tools"," — Read files, search the web, query databases, call APIs",[22,25614,25615,25618],{},[45,25616,25617],{},"Execute"," — Write code, create documents, send messages",[22,25620,25621,25624],{},[45,25622,25623],{},"Iterate"," — Check its own work and retry if needed",[12,25626,25627,25628,25631],{},"In 2026, you don't need to build agents from scratch. You ",[45,25629,25630],{},"assemble"," them from components: skills define what the agent knows, MCP servers define what tools it can use, and prompts define how it communicates.",[116,25633,25634],{"type":118},[12,25635,25636],{},"Think of building an AI agent like assembling LEGO blocks: skills are the instruction manual, MCP servers are the connectors, and the LLM is the engine.",[35,25638,25640],{"id":25639},"the-3-building-blocks-of-an-ai-agent","The 3 Building Blocks of an AI Agent",[138,25642,25644],{"id":25643},"_1-skills-what-the-agent-knows","1. Skills (What the agent knows)",[12,25646,3750,25647,25649],{},[45,25648,2770],{}," is a markdown file that teaches your AI agent a specific capability. It contains instructions, examples, and constraints.",[143,25651,25653],{"className":5813,"code":25652,"language":5815,"meta":148,"style":148},"# code-reviewer.md\nYou are an expert code reviewer. When asked to review code:\n\n1. Check for security vulnerabilities (OWASP Top 10)\n2. Check for performance issues (N+1 queries, memory leaks)\n3. Check for missing error handling\n4. Suggest specific improvements with code examples\n\nOutput format: markdown table with severity, location, issue, fix.\n",[150,25654,25655,25660,25665,25669,25674,25679,25684,25689,25693],{"__ignoreMap":148},[153,25656,25657],{"class":155,"line":156},[153,25658,25659],{},"# code-reviewer.md\n",[153,25661,25662],{"class":155,"line":208},[153,25663,25664],{},"You are an expert code reviewer. When asked to review code:\n",[153,25666,25667],{"class":155,"line":242},[153,25668,246],{"emptyLinePlaceholder":245},[153,25670,25671],{"class":155,"line":249},[153,25672,25673],{},"1. Check for security vulnerabilities (OWASP Top 10)\n",[153,25675,25676],{"class":155,"line":255},[153,25677,25678],{},"2. Check for performance issues (N+1 queries, memory leaks)\n",[153,25680,25681],{"class":155,"line":268},[153,25682,25683],{},"3. Check for missing error handling\n",[153,25685,25686],{"class":155,"line":281},[153,25687,25688],{},"4. Suggest specific improvements with code examples\n",[153,25690,25691],{"class":155,"line":1356},[153,25692,246],{"emptyLinePlaceholder":245},[153,25694,25695],{"class":155,"line":1362},[153,25696,25697],{},"Output format: markdown table with severity, location, issue, fix.\n",[12,25699,25700],{},"Install any skill in 10 seconds:",[143,25702,25704],{"className":145,"code":25703,"language":147,"meta":148,"style":148},"mkdir -p .claude\u002Fskills\ncurl -o .claude\u002Fskills\u002Fcode-reviewer.md \"SKILL_URL\"\n",[150,25705,25706,25714],{"__ignoreMap":148},[153,25707,25708,25710,25712],{"class":155,"line":156},[153,25709,1312],{"class":159},[153,25711,366],{"class":163},[153,25713,15111],{"class":167},[153,25715,25716,25718,25720,25722],{"class":155,"line":208},[153,25717,160],{"class":159},[153,25719,15118],{"class":163},[153,25721,15753],{"class":167},[153,25723,16251],{"class":167},[12,25725,1527,25726,667],{},[71,25727,24743],{"href":1530,"rel":25728},[113],[138,25730,25732],{"id":25731},"_2-mcp-servers-what-tools-the-agent-can-use","2. MCP Servers (What tools the agent can use)",[12,25734,25735,25738],{},[45,25736,25737],{},"MCP (Model Context Protocol) servers"," give your agent access to external tools — databases, browsers, APIs, file systems, and more.",[143,25740,25742],{"className":3807,"code":25741,"language":3809,"meta":148,"style":148},"{\n  \"mcpServers\": {\n    \"github\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-github\"]\n    },\n    \"filesystem\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-filesystem\", \"\u002Fpath\u002Fto\u002Fproject\"]\n    }\n  }\n}\n",[150,25743,25744,25748,25754,25760,25770,25784,25788,25794,25804,25823,25827,25831],{"__ignoreMap":148},[153,25745,25746],{"class":155,"line":156},[153,25747,3816],{"class":313},[153,25749,25750,25752],{"class":155,"line":208},[153,25751,3821],{"class":163},[153,25753,3824],{"class":313},[153,25755,25756,25758],{"class":155,"line":242},[153,25757,3829],{"class":163},[153,25759,3824],{"class":313},[153,25761,25762,25764,25766,25768],{"class":155,"line":249},[153,25763,3836],{"class":163},[153,25765,3839],{"class":313},[153,25767,3842],{"class":167},[153,25769,3845],{"class":313},[153,25771,25772,25774,25776,25778,25780,25782],{"class":155,"line":255},[153,25773,3850],{"class":163},[153,25775,3853],{"class":313},[153,25777,3856],{"class":167},[153,25779,528],{"class":313},[153,25781,3861],{"class":167},[153,25783,5386],{"class":313},[153,25785,25786],{"class":155,"line":268},[153,25787,5300],{"class":313},[153,25789,25790,25792],{"class":155,"line":281},[153,25791,4062],{"class":163},[153,25793,3824],{"class":313},[153,25795,25796,25798,25800,25802],{"class":155,"line":1356},[153,25797,3836],{"class":163},[153,25799,3839],{"class":313},[153,25801,3842],{"class":167},[153,25803,3845],{"class":313},[153,25805,25806,25808,25810,25812,25814,25816,25818,25821],{"class":155,"line":1362},[153,25807,3850],{"class":163},[153,25809,3853],{"class":313},[153,25811,3856],{"class":167},[153,25813,528],{"class":313},[153,25815,4091],{"class":167},[153,25817,528],{"class":313},[153,25819,25820],{"class":167},"\"\u002Fpath\u002Fto\u002Fproject\"",[153,25822,5386],{"class":313},[153,25824,25825],{"class":155,"line":1367},[153,25826,3891],{"class":313},[153,25828,25829],{"class":155,"line":1372},[153,25830,3896],{"class":313},[153,25832,25833],{"class":155,"line":1378},[153,25834,3901],{"class":313},[12,25836,1527,25837,667],{},[71,25838,18192],{"href":5477,"rel":25839},[113],[138,25841,25843],{"id":25842},"_3-claudemd-agentsmd-how-the-agent-behaves","3. CLAUDE.md \u002F AGENTS.md (How the agent behaves)",[12,25845,3750,25846,25849],{},[45,25847,25848],{},"configuration file"," in your project root defines the agent's personality, constraints, and project context.",[143,25851,25853],{"className":5813,"code":25852,"language":5815,"meta":148,"style":148},"# CLAUDE.md\n## Role\nYou are a senior full-stack developer working on a Next.js + Prisma project.\n\n## Rules\n- Always write TypeScript, never JavaScript\n- Use Server Components by default\n- Run `npm test` before suggesting any change is complete\n- Never modify migration files directly\n",[150,25854,25855,25860,25865,25870,25874,25878,25883,25888,25893],{"__ignoreMap":148},[153,25856,25857],{"class":155,"line":156},[153,25858,25859],{},"# CLAUDE.md\n",[153,25861,25862],{"class":155,"line":208},[153,25863,25864],{},"## Role\n",[153,25866,25867],{"class":155,"line":242},[153,25868,25869],{},"You are a senior full-stack developer working on a Next.js + Prisma project.\n",[153,25871,25872],{"class":155,"line":249},[153,25873,246],{"emptyLinePlaceholder":245},[153,25875,25876],{"class":155,"line":255},[153,25877,6810],{},[153,25879,25880],{"class":155,"line":268},[153,25881,25882],{},"- Always write TypeScript, never JavaScript\n",[153,25884,25885],{"class":155,"line":281},[153,25886,25887],{},"- Use Server Components by default\n",[153,25889,25890],{"class":155,"line":1356},[153,25891,25892],{},"- Run `npm test` before suggesting any change is complete\n",[153,25894,25895],{"class":155,"line":1362},[153,25896,25897],{},"- Never modify migration files directly\n",[12,25899,1527,25900,667],{},[71,25901,25903],{"href":24329,"rel":25902},[113],"CLAUDE.md templates on TokRepo",[35,25905,25907],{"id":25906},"method-1-build-an-agent-with-claude-code-fastest","Method 1: Build an Agent with Claude Code (Fastest)",[12,25909,25910],{},"Claude Code is already an AI agent. You make it YOUR agent by adding skills and MCP servers.",[138,25912,25914],{"id":25913},"step-1-install-claude-code","Step 1: Install Claude Code",[143,25916,25918],{"className":145,"code":25917,"language":147,"meta":148,"style":148},"npm install -g @anthropic-ai\u002Fclaude-code\nclaude --version\n",[150,25919,25920,25931],{"__ignoreMap":148},[153,25921,25922,25924,25926,25928],{"class":155,"line":156},[153,25923,5639],{"class":159},[153,25925,1590],{"class":167},[153,25927,5644],{"class":163},[153,25929,25930],{"class":167}," @anthropic-ai\u002Fclaude-code\n",[153,25932,25933,25935],{"class":155,"line":208},[153,25934,12966],{"class":159},[153,25936,205],{"class":163},[138,25938,25940],{"id":25939},"step-2-add-skills","Step 2: Add Skills",[143,25942,25944],{"className":145,"code":25943,"language":147,"meta":148,"style":148},"# Install a code review skill\nmkdir -p .claude\u002Fskills\ncurl -o .claude\u002Fskills\u002Freviewer.md \"https:\u002F\u002Ftokrepo.com\u002Fapi\u002Fv1\u002Ftokenboard\u002Fraw\u002FSKILL_UUID\"\n\n# Install a deployment skill\ncurl -o .claude\u002Fskills\u002Fdeploy.md \"https:\u002F\u002Ftokrepo.com\u002Fapi\u002Fv1\u002Ftokenboard\u002Fraw\u002FSKILL_UUID\"\n",[150,25945,25946,25951,25959,25971,25975,25980],{"__ignoreMap":148},[153,25947,25948],{"class":155,"line":156},[153,25949,25950],{"class":211},"# Install a code review skill\n",[153,25952,25953,25955,25957],{"class":155,"line":208},[153,25954,1312],{"class":159},[153,25956,366],{"class":163},[153,25958,15111],{"class":167},[153,25960,25961,25963,25965,25968],{"class":155,"line":242},[153,25962,160],{"class":159},[153,25964,15118],{"class":163},[153,25966,25967],{"class":167}," .claude\u002Fskills\u002Freviewer.md",[153,25969,25970],{"class":167}," \"https:\u002F\u002Ftokrepo.com\u002Fapi\u002Fv1\u002Ftokenboard\u002Fraw\u002FSKILL_UUID\"\n",[153,25972,25973],{"class":155,"line":249},[153,25974,246],{"emptyLinePlaceholder":245},[153,25976,25977],{"class":155,"line":255},[153,25978,25979],{"class":211},"# Install a deployment skill\n",[153,25981,25982,25984,25986,25989],{"class":155,"line":268},[153,25983,160],{"class":159},[153,25985,15118],{"class":163},[153,25987,25988],{"class":167}," .claude\u002Fskills\u002Fdeploy.md",[153,25990,25970],{"class":167},[138,25992,25994],{"id":25993},"step-3-add-mcp-servers","Step 3: Add MCP Servers",[143,25996,25998],{"className":145,"code":25997,"language":147,"meta":148,"style":148},"# Add GitHub integration\nclaude mcp add github -- npx -y @modelcontextprotocol\u002Fserver-github\n\n# Add database access\nclaude mcp add postgres -- npx -y @modelcontextprotocol\u002Fserver-postgres \"postgresql:\u002F\u002F...\"\n",[150,25999,26000,26005,26027,26031,26036],{"__ignoreMap":148},[153,26001,26002],{"class":155,"line":156},[153,26003,26004],{"class":211},"# Add GitHub integration\n",[153,26006,26007,26009,26011,26013,26016,26018,26021,26024],{"class":155,"line":208},[153,26008,12966],{"class":159},[153,26010,17889],{"class":167},[153,26012,1447],{"class":167},[153,26014,26015],{"class":167}," github",[153,26017,1485],{"class":163},[153,26019,26020],{"class":167}," npx",[153,26022,26023],{"class":163}," -y",[153,26025,26026],{"class":167}," @modelcontextprotocol\u002Fserver-github\n",[153,26028,26029],{"class":155,"line":242},[153,26030,246],{"emptyLinePlaceholder":245},[153,26032,26033],{"class":155,"line":249},[153,26034,26035],{"class":211},"# Add database access\n",[153,26037,26038,26040,26042,26044,26047,26049,26051,26053,26056],{"class":155,"line":255},[153,26039,12966],{"class":159},[153,26041,17889],{"class":167},[153,26043,1447],{"class":167},[153,26045,26046],{"class":167}," postgres",[153,26048,1485],{"class":163},[153,26050,26020],{"class":167},[153,26052,26023],{"class":163},[153,26054,26055],{"class":167}," @modelcontextprotocol\u002Fserver-postgres",[153,26057,26058],{"class":167}," \"postgresql:\u002F\u002F...\"\n",[138,26060,26062],{"id":26061},"step-4-configure-with-claudemd","Step 4: Configure with CLAUDE.md",[12,26064,18290,26065,26067,26068,26072],{},[150,26066,13616],{}," in your project root with your specific rules and conventions. Use a ",[71,26069,26071],{"href":24329,"rel":26070},[113],"template from TokRepo"," as a starting point.",[138,26074,26076],{"id":26075},"step-5-use-your-agent","Step 5: Use Your Agent",[143,26078,26080],{"className":145,"code":26079,"language":147,"meta":148,"style":148},"claude \"Review the last 3 commits for security issues, then create a summary report\"\n",[150,26081,26082],{"__ignoreMap":148},[153,26083,26084,26086],{"class":155,"line":156},[153,26085,12966],{"class":159},[153,26087,26088],{"class":167}," \"Review the last 3 commits for security issues, then create a summary report\"\n",[12,26090,26091],{},"Your agent now has specialized knowledge (skills), tool access (MCP), and project context (CLAUDE.md).",[35,26093,26095],{"id":26094},"method-2-build-an-agent-with-no-code","Method 2: Build an Agent with No Code",[12,26097,26098],{},"You don't need to be a developer to build an AI agent. Here are 5 no-code methods:",[138,26100,26102],{"id":26101},"_1-n8n-visual-workflow-builder","1. n8n (Visual Workflow Builder)",[19,26104,26105,26111,26114],{},[22,26106,26107,26108],{},"Install: ",[150,26109,26110],{},"docker run -it --rm --name n8n -p 5678:5678 n8nio\u002Fn8n",[22,26112,26113],{},"Build: Drag-and-drop AI nodes with 400+ integrations",[22,26115,26116],{},"Best for: Multi-step automation pipelines",[138,26118,26120],{"id":26119},"_2-claude-projects-browser-based","2. Claude Projects (Browser-Based)",[19,26122,26123,26126,26129],{},[22,26124,26125],{},"Go to claude.ai → Create a Project",[22,26127,26128],{},"Upload documents, set custom instructions",[22,26130,26131],{},"Best for: Knowledge-based agents (research, analysis)",[138,26133,26135],{"id":26134},"_3-gpts-custom-chatgpt-openai","3. GPTs \u002F Custom ChatGPT (OpenAI)",[19,26137,26138,26141,26144],{},[22,26139,26140],{},"Go to chatgpt.com → Create a GPT",[22,26142,26143],{},"Add instructions, upload files, connect APIs",[22,26145,26146],{},"Best for: Customer-facing chatbots",[138,26148,26150],{"id":26149},"_4-cursor-skills-ai-ide","4. Cursor + Skills (AI IDE)",[19,26152,26153,26159,26162],{},[22,26154,26155,26156,26158],{},"Install Cursor, add ",[150,26157,6663],{}," file",[22,26160,26161],{},"The IDE becomes your specialized agent",[22,26163,26164],{},"Best for: Coding tasks without terminal",[138,26166,26168],{"id":26167},"_5-zapier-ai-automation","5. Zapier AI (Automation)",[19,26170,26171,26174,26177],{},[22,26172,26173],{},"Create a Zap with AI actions",[22,26175,26176],{},"No coding, 6,000+ app integrations",[22,26178,26179],{},"Best for: Business process automation",[35,26181,26183],{"id":26182},"method-3-build-a-custom-agent-with-python","Method 3: Build a Custom Agent with Python",[12,26185,26186],{},"For maximum control, build a custom agent using the Claude Agent SDK:",[143,26188,26190],{"className":15396,"code":26189,"language":15398,"meta":148,"style":148},"\"\"\"Minimal AI agent using Claude Agent SDK.\"\"\"\nfrom claude_agent_sdk import Agent, tool\n\nagent = Agent(model=\"claude-sonnet-4-6\")\n\n\n@tool\ndef search_codebase(query: str) -> str:\n    \"\"\"Search the codebase for matching files.\"\"\"\n    import subprocess\n    result = subprocess.run(\n        [\"grep\", \"-r\", \"-l\", query, \".\"],\n        capture_output=True, text=True\n    )\n    return result.stdout or \"No matches found.\"\n\n\n@tool\ndef read_file(path: str) -> str:\n    \"\"\"Read a file from the project.\"\"\"\n    with open(path) as f:\n        return f.read()\n\n\n# Run the agent\nresponse = agent.run(\n    \"Find all files that import 'database' and check for SQL injection risks\",\n    tools=[search_codebase, read_file],\n)\nprint(response)\n",[150,26191,26192,26197,26202,26206,26211,26215,26219,26224,26229,26234,26239,26244,26249,26254,26258,26263,26267,26271,26275,26280,26285,26290,26295,26299,26303,26308,26313,26318,26323,26327],{"__ignoreMap":148},[153,26193,26194],{"class":155,"line":156},[153,26195,26196],{},"\"\"\"Minimal AI agent using Claude Agent SDK.\"\"\"\n",[153,26198,26199],{"class":155,"line":208},[153,26200,26201],{},"from claude_agent_sdk import Agent, tool\n",[153,26203,26204],{"class":155,"line":242},[153,26205,246],{"emptyLinePlaceholder":245},[153,26207,26208],{"class":155,"line":249},[153,26209,26210],{},"agent = Agent(model=\"claude-sonnet-4-6\")\n",[153,26212,26213],{"class":155,"line":255},[153,26214,246],{"emptyLinePlaceholder":245},[153,26216,26217],{"class":155,"line":268},[153,26218,246],{"emptyLinePlaceholder":245},[153,26220,26221],{"class":155,"line":281},[153,26222,26223],{},"@tool\n",[153,26225,26226],{"class":155,"line":1356},[153,26227,26228],{},"def search_codebase(query: str) -> str:\n",[153,26230,26231],{"class":155,"line":1362},[153,26232,26233],{},"    \"\"\"Search the codebase for matching files.\"\"\"\n",[153,26235,26236],{"class":155,"line":1367},[153,26237,26238],{},"    import subprocess\n",[153,26240,26241],{"class":155,"line":1372},[153,26242,26243],{},"    result = subprocess.run(\n",[153,26245,26246],{"class":155,"line":1378},[153,26247,26248],{},"        [\"grep\", \"-r\", \"-l\", query, \".\"],\n",[153,26250,26251],{"class":155,"line":1383},[153,26252,26253],{},"        capture_output=True, text=True\n",[153,26255,26256],{"class":155,"line":1389},[153,26257,17465],{},[153,26259,26260],{"class":155,"line":1395},[153,26261,26262],{},"    return result.stdout or \"No matches found.\"\n",[153,26264,26265],{"class":155,"line":1401},[153,26266,246],{"emptyLinePlaceholder":245},[153,26268,26269],{"class":155,"line":1407},[153,26270,246],{"emptyLinePlaceholder":245},[153,26272,26273],{"class":155,"line":1129},[153,26274,26223],{},[153,26276,26277],{"class":155,"line":1417},[153,26278,26279],{},"def read_file(path: str) -> str:\n",[153,26281,26282],{"class":155,"line":1423},[153,26283,26284],{},"    \"\"\"Read a file from the project.\"\"\"\n",[153,26286,26287],{"class":155,"line":1683},[153,26288,26289],{},"    with open(path) as f:\n",[153,26291,26292],{"class":155,"line":1688},[153,26293,26294],{},"        return f.read()\n",[153,26296,26297],{"class":155,"line":12900},[153,26298,246],{"emptyLinePlaceholder":245},[153,26300,26301],{"class":155,"line":12906},[153,26302,246],{"emptyLinePlaceholder":245},[153,26304,26305],{"class":155,"line":16075},[153,26306,26307],{},"# Run the agent\n",[153,26309,26310],{"class":155,"line":16089},[153,26311,26312],{},"response = agent.run(\n",[153,26314,26315],{"class":155,"line":16096},[153,26316,26317],{},"    \"Find all files that import 'database' and check for SQL injection risks\",\n",[153,26319,26320],{"class":155,"line":16102},[153,26321,26322],{},"    tools=[search_codebase, read_file],\n",[153,26324,26325],{"class":155,"line":16107},[153,26326,1950],{},[153,26328,26329],{"class":155,"line":16115},[153,26330,26331],{},"print(response)\n",[35,26333,26335],{"id":26334},"method-4-build-an-agent-for-free","Method 4: Build an Agent for Free",[12,26337,26338],{},"All of these methods are free:",[809,26340,26341,26354],{},[812,26342,26343],{},[815,26344,26345,26348,26351],{},[818,26346,26347],{},"Method",[818,26349,26350],{},"Cost",[818,26352,26353],{},"Setup Time",[828,26355,26356,26367,26377,26388,26397],{},[815,26357,26358,26361,26364],{},[833,26359,26360],{},"Claude Code (free tier)",[833,26362,26363],{},"$0 (5 free credits)",[833,26365,26366],{},"5 min",[815,26368,26369,26371,26374],{},[833,26370,5610],{},[833,26372,26373],{},"$0 (1,000 req\u002Fday)",[833,26375,26376],{},"3 min",[815,26378,26379,26382,26385],{},[833,26380,26381],{},"n8n (self-hosted)",[833,26383,26384],{},"$0",[833,26386,26387],{},"10 min",[815,26389,26390,26393,26395],{},[833,26391,26392],{},"Codex CLI (free tier)",[833,26394,26384],{},[833,26396,26366],{},[815,26398,26399,26402,26405],{},[833,26400,26401],{},"Claude Projects (free)",[833,26403,26404],{},"$0 (limited)",[833,26406,26407],{},"2 min",[12,26409,26410],{},"The free tier of Claude Code or Gemini CLI + free skills from TokRepo gives you a production-capable agent at zero cost.",[35,26412,26414],{"id":26413},"real-world-agent-architectures","Real-World Agent Architectures",[138,26416,26418],{"id":26417},"the-coding-assistant-agent","The \"Coding Assistant\" Agent",[19,26420,26421,26427,26433,26439],{},[22,26422,26423,26426],{},[45,26424,26425],{},"Skills",": code-reviewer, test-generator, refactoring-specialist",[22,26428,26429,26432],{},[45,26430,26431],{},"MCP",": GitHub, filesystem, database",[22,26434,26435,26438],{},[45,26436,26437],{},"Config",": CLAUDE.md with project conventions",[22,26440,26441,26443],{},[45,26442,7644],{},": Reviews PRs, generates tests, refactors code",[138,26445,26447],{"id":26446},"the-content-marketing-agent","The \"Content Marketing\" Agent",[19,26449,26450,26455,26460,26465],{},[22,26451,26452,26454],{},[45,26453,26425],{},": seo-writer, social-scheduler, competitor-monitor",[22,26456,26457,26459],{},[45,26458,26431],{},": Web search, RSS feeds, email API",[22,26461,26462,26464],{},[45,26463,26437],{},": Brand voice guidelines",[22,26466,26467,26469],{},[45,26468,7644],{},": Writes blog posts, schedules social, monitors competitors",[138,26471,26473],{"id":26472},"the-data-analysis-agent","The \"Data Analysis\" Agent",[19,26475,26476,26481,26486,26491],{},[22,26477,26478,26480],{},[45,26479,26425],{},": data-analyst, report-generator, chart-creator",[22,26482,26483,26485],{},[45,26484,26431],{},": PostgreSQL, Google Sheets, Slack",[22,26487,26488,26490],{},[45,26489,26437],{},": Company metrics definitions",[22,26492,26493,26495],{},[45,26494,7644],{},": Queries data, creates dashboards, sends weekly reports",[138,26497,2514],{"id":2513},[12,26499,26500,26503],{},[45,26501,26502],{},"Q: How do I build an AI agent?","\nA: Start with an AI coding tool (Claude Code, Codex CLI, or Gemini CLI), add pre-built skills for your use case, connect MCP servers for tool access, and configure with a CLAUDE.md file. Browse 500+ ready-made components on TokRepo.",[12,26505,26506,26509],{},[45,26507,26508],{},"Q: Can I build an AI agent with no coding?","\nA: Yes. Use n8n (visual workflow builder), Claude Projects (browser-based), GPTs (Custom ChatGPT), or Zapier AI. All support building agents without writing code.",[12,26511,26512,26515],{},[45,26513,26514],{},"Q: How do I build an AI agent for free?","\nA: Use Gemini CLI (free, 1,000 requests\u002Fday), self-hosted n8n ($0), or the Claude Code free tier ($5 credit). Combine with free skills and MCP configs from TokRepo.",[12,26517,26518,26521],{},[45,26519,26520],{},"Q: What's the difference between an AI agent and a chatbot?","\nA: A chatbot answers questions in conversation. An agent autonomously completes tasks — it can plan multi-step workflows, use tools, write files, and iterate until a task is done.",[35,26523,1020],{"id":1019},[19,26525,26526,26533,26540,26547,26552,26557],{},[22,26527,26528,26532],{},[71,26529,26531],{"href":1530,"rel":26530},[113],"Browse 500+ Agent Skills on TokRepo"," — install your first skill",[22,26534,26535,26539],{},[71,26536,26538],{"href":5477,"rel":26537},[113],"Best MCP Servers for AI Agents"," — connect to tools",[22,26541,26542,26546],{},[71,26543,26545],{"href":24329,"rel":26544},[113],"CLAUDE.md Templates"," — configure your agent",[22,26548,26549,26551],{},[71,26550,16623],{"href":16622}," — deep dive on skills",[22,26553,26554,26556],{},[71,26555,18059],{"href":18058}," — create custom tools",[22,26558,26559,26561],{},[71,26560,14556],{"href":14885}," — 30+ automation recipes",[1074,26563,26564],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":148,"searchDepth":208,"depth":208,"links":26566},[26567,26568,26569,26574,26581,26588,26589,26590,26596],{"id":78,"depth":208,"text":79},{"id":25592,"depth":208,"text":25593},{"id":25639,"depth":208,"text":25640,"children":26570},[26571,26572,26573],{"id":25643,"depth":242,"text":25644},{"id":25731,"depth":242,"text":25732},{"id":25842,"depth":242,"text":25843},{"id":25906,"depth":208,"text":25907,"children":26575},[26576,26577,26578,26579,26580],{"id":25913,"depth":242,"text":25914},{"id":25939,"depth":242,"text":25940},{"id":25993,"depth":242,"text":25994},{"id":26061,"depth":242,"text":26062},{"id":26075,"depth":242,"text":26076},{"id":26094,"depth":208,"text":26095,"children":26582},[26583,26584,26585,26586,26587],{"id":26101,"depth":242,"text":26102},{"id":26119,"depth":242,"text":26120},{"id":26134,"depth":242,"text":26135},{"id":26149,"depth":242,"text":26150},{"id":26167,"depth":242,"text":26168},{"id":26182,"depth":208,"text":26183},{"id":26334,"depth":208,"text":26335},{"id":26413,"depth":208,"text":26414,"children":26591},[26592,26593,26594,26595],{"id":26417,"depth":242,"text":26418},{"id":26446,"depth":242,"text":26447},{"id":26472,"depth":242,"text":26473},{"id":2513,"depth":242,"text":2514},{"id":1019,"depth":208,"text":1020},"Learn how to build your own AI agent using pre-built skills, MCP servers, and tools from TokRepo. No coding from scratch — assemble agents from proven components in minutes.","学习如何使用预构建的 Skills、MCP 服务器和工具构建你自己的 AI Agent。无需从零编码——用验证过的组件在几分钟内组装。",[26600,26603,26606,26609,26612],{"q":26601,"a":26602},"How do I build an AI agent without coding?","Assemble three components on top of Claude Code, Codex CLI, or Gemini CLI: install skills from TokRepo (capabilities), add MCP servers (tool access), and write a CLAUDE.md or AGENTS.md (rules and context). No coding required — just a terminal, an AI CLI, and 5 minutes. For visual workflows, use n8n or Zapier AI.",{"q":26604,"a":26605},"What are the three building blocks of an AI agent?","Skills are Markdown files that teach the agent specific capabilities (like code review or SEO audit). MCP servers give the agent access to tools (databases, browsers, APIs, file systems). CLAUDE.md\u002FAGENTS.md defines the agent's personality, constraints, and project context. The LLM is the engine that runs them.",{"q":26607,"a":26608},"How can I build an AI agent for free?","Use Gemini CLI (free, 1,000 req\u002Fday), self-hosted n8n (free, unlimited), or Claude Code free tier ($5 credit). Combine with free skills and MCP configs from TokRepo. The Gemini CLI + TokRepo combination gives you a production-capable agent at zero cost with the largest free rate limit.",{"q":26610,"a":26611},"What's the difference between an AI agent and a chatbot?","A chatbot answers questions one at a time in conversation. An AI agent autonomously plans multi-step workflows, uses tools (files, databases, web, APIs), executes actions (writes code, sends messages, creates documents), and iterates on its own work until the task is done — no human in the loop for each step.",{"q":26613,"a":26614},"Can I build a custom AI agent in Python?","Yes. Use the Claude Agent SDK: from claude_agent_sdk import Agent, tool, create an Agent instance, decorate functions with @tool, and call agent.run(prompt, tools=[...]). This gives you full control over tool definitions, execution flow, and response handling. Good for production use cases needing custom logic.","\u002Fguide\u002Fimages\u002Fbuild-ai-agent-hero.svg",{},{"title":25562,"description":26597},"en\u002Fguide\u002Fhow-to-build-ai-agent",[16687,10876,2769,26620,5531],"skills","如何构建 AI Agent：2026 完全入门指南","Build an AI agent in 2026 by assembling three components instead of coding from scratch: skills (Markdown files that teach the agent specific capabilities), MCP servers (tools like GitHub, PostgreSQL, filesystem), and a CLAUDE.md\u002FAGENTS.md config file (rules and project context). Use Claude Code, Codex CLI, or Gemini CLI as the engine, install free skills and MCP servers from TokRepo, and you have a working agent in 5 minutes.","nBLSL6R-HDscoxJ_fZYr1GvFIGcdt5KXf6hm2NsAI7I",{"id":26625,"title":26626,"answer":6,"answerZh":6,"author":7,"body":26627,"category":1106,"description":27496,"descriptionZh":27497,"extension":1109,"faqs":27498,"faqsZh":6,"image":27513,"meta":27514,"navigation":245,"path":27515,"publishedAt":14945,"readTime":1367,"seo":27516,"stem":27517,"tags":27518,"titleZh":27519,"tldr":27520,"tldrZh":6,"updatedAt":14945,"__hash__":27521},"docs_en\u002Fen\u002Fguide\u002Fwhat-are-claude-code-skills.md","What Are Claude Code Skills? The Complete Guide with Examples",{"type":9,"value":26628,"toc":27469},[26629,26632,26634,26648,26652,26661,26705,26711,26716,26720,26818,26823,26827,26831,26888,26892,26924,26928,26935,26969,26973,27028,27032,27035,27097,27104,27108,27112,27124,27128,27223,27227,27255,27259,27269,27273,27277,27301,27305,27325,27330,27334,27337,27403,27406,27408,27414,27420,27431,27437,27439,27467],[12,26630,26631],{},"Learn what Claude Code skills are, how they work under the hood, and how to install your first skill in under 60 seconds. This guide covers the SKILL.md standard, skill directories, installation methods, and where to find 500+ community skills.",[35,26633,79],{"id":78},[19,26635,26636,26642,26645],{},[22,26637,26638,26641],{},[71,26639,1159],{"href":1157,"rel":26640},[113]," installed (CLI, VS Code extension, or desktop app)",[22,26643,26644],{},"A project directory to test skills in",[22,26646,26647],{},"Basic terminal\u002Fcommand line knowledge",[35,26649,26651],{"id":26650},"what-is-a-claude-code-skill","What Is a Claude Code Skill?",[12,26653,3750,26654,26657,26658,26660],{},[45,26655,26656],{},"Claude Code skill"," is a markdown instruction file that teaches Claude Code how to perform a specific task. When you invoke a skill (via ",[150,26659,9132],{},"), Claude reads the markdown file and follows its instructions — no code compilation, no API integration, just structured text.",[143,26662,26664],{"className":5813,"code":26663,"language":5815,"meta":148,"style":148},"# Example: code-reviewer.md\nReview the current git diff for:\n- Security vulnerabilities (OWASP Top 10)\n- Performance regressions\n- Missing error handling\n- Breaking API changes\n\nOutput a structured report with severity ratings.\n",[150,26665,26666,26671,26676,26681,26686,26691,26696,26700],{"__ignoreMap":148},[153,26667,26668],{"class":155,"line":156},[153,26669,26670],{},"# Example: code-reviewer.md\n",[153,26672,26673],{"class":155,"line":208},[153,26674,26675],{},"Review the current git diff for:\n",[153,26677,26678],{"class":155,"line":242},[153,26679,26680],{},"- Security vulnerabilities (OWASP Top 10)\n",[153,26682,26683],{"class":155,"line":249},[153,26684,26685],{},"- Performance regressions\n",[153,26687,26688],{"class":155,"line":255},[153,26689,26690],{},"- Missing error handling\n",[153,26692,26693],{"class":155,"line":268},[153,26694,26695],{},"- Breaking API changes\n",[153,26697,26698],{"class":155,"line":281},[153,26699,246],{"emptyLinePlaceholder":245},[153,26701,26702],{"class":155,"line":1356},[153,26703,26704],{},"Output a structured report with severity ratings.\n",[12,26706,26707,26708,26710],{},"That's it. Save this as a ",[150,26709,1292],{}," file in the right directory, and Claude Code gains a new capability.",[116,26712,26713],{"type":118},[12,26714,26715],{},"Skills are the easiest way to extend Claude Code. Unlike MCP servers (which require running processes) or hooks (which require JSON configuration), skills are just markdown files anyone can write.",[138,26717,26719],{"id":26718},"skills-vs-mcp-servers-vs-rules","Skills vs MCP Servers vs Rules",[809,26721,26722,26735],{},[812,26723,26724],{},[815,26725,26726,26728,26730,26732],{},[818,26727,24658],{},[818,26729,26425],{},[818,26731,13311],{},[818,26733,26734],{},"Rules (CLAUDE.md)",[828,26736,26737,26753,26771,26786,26802],{},[815,26738,26739,26744,26747,26750],{},[833,26740,26741],{},[45,26742,26743],{},"Format",[833,26745,26746],{},"Markdown files",[833,26748,26749],{},"Running processes",[833,26751,26752],{},"Markdown file",[815,26754,26755,26760,26766,26769],{},[833,26756,26757],{},[45,26758,26759],{},"Activation",[833,26761,26762,26763,439],{},"Slash command (",[150,26764,26765],{},"\u002Fskill",[833,26767,26768],{},"Always available",[833,26770,13677],{},[815,26772,26773,26778,26781,26784],{},[833,26774,26775],{},[45,26776,26777],{},"Complexity",[833,26779,26780],{},"Low (write markdown)",[833,26782,26783],{},"High (write code)",[833,26785,26780],{},[815,26787,26788,26793,26796,26799],{},[833,26789,26790],{},[45,26791,26792],{},"Use case",[833,26794,26795],{},"Task-specific workflows",[833,26797,26798],{},"External tool access",[833,26800,26801],{},"Project-wide conventions",[815,26803,26804,26809,26812,26815],{},[833,26805,26806],{},[45,26807,26808],{},"Examples",[833,26810,26811],{},"Code review, deployment, testing",[833,26813,26814],{},"Database, browser, GitHub",[833,26816,26817],{},"Coding standards, patterns",[12,26819,26820,26821,667],{},"For a deeper comparison, read ",[71,26822,1263],{"href":1262},[35,26824,26826],{"id":26825},"how-to-install-skills","How to Install Skills",[138,26828,26830],{"id":26829},"method-1-drop-a-file-fastest","Method 1: Drop a File (Fastest)",[143,26832,26834],{"className":145,"code":26833,"language":147,"meta":148,"style":148},"# Project-level skill (available in this project only)\nmkdir -p .claude\u002Fskills\ncurl -o .claude\u002Fskills\u002Fcode-reviewer.md https:\u002F\u002Fexample.com\u002Fskill.md\n\n# Global skill (available in all projects)\nmkdir -p ~\u002F.claude\u002Fskills\ncp code-reviewer.md ~\u002F.claude\u002Fskills\u002F\n",[150,26835,26836,26841,26849,26860,26864,26869,26878],{"__ignoreMap":148},[153,26837,26838],{"class":155,"line":156},[153,26839,26840],{"class":211},"# Project-level skill (available in this project only)\n",[153,26842,26843,26845,26847],{"class":155,"line":208},[153,26844,1312],{"class":159},[153,26846,366],{"class":163},[153,26848,15111],{"class":167},[153,26850,26851,26853,26855,26857],{"class":155,"line":242},[153,26852,160],{"class":159},[153,26854,15118],{"class":163},[153,26856,15753],{"class":167},[153,26858,26859],{"class":167}," https:\u002F\u002Fexample.com\u002Fskill.md\n",[153,26861,26862],{"class":155,"line":249},[153,26863,246],{"emptyLinePlaceholder":245},[153,26865,26866],{"class":155,"line":255},[153,26867,26868],{"class":211},"# Global skill (available in all projects)\n",[153,26870,26871,26873,26875],{"class":155,"line":268},[153,26872,1312],{"class":159},[153,26874,366],{"class":163},[153,26876,26877],{"class":167}," ~\u002F.claude\u002Fskills\n",[153,26879,26880,26882,26885],{"class":155,"line":281},[153,26881,15906],{"class":159},[153,26883,26884],{"class":167}," code-reviewer.md",[153,26886,26887],{"class":167}," ~\u002F.claude\u002Fskills\u002F\n",[138,26889,26891],{"id":26890},"method-2-plugin-marketplace","Method 2: Plugin Marketplace",[143,26893,26895],{"className":145,"code":26894,"language":147,"meta":148,"style":148},"# Install a skill pack from the marketplace\n\u002Fplugin marketplace add https:\u002F\u002Fgithub.com\u002Forg\u002Fskill-pack\n\u002Fplugin install skill-pack@skill-pack\n",[150,26896,26897,26902,26915],{"__ignoreMap":148},[153,26898,26899],{"class":155,"line":156},[153,26900,26901],{"class":211},"# Install a skill pack from the marketplace\n",[153,26903,26904,26907,26910,26912],{"class":155,"line":208},[153,26905,26906],{"class":159},"\u002Fplugin",[153,26908,26909],{"class":167}," marketplace",[153,26911,1447],{"class":167},[153,26913,26914],{"class":167}," https:\u002F\u002Fgithub.com\u002Forg\u002Fskill-pack\n",[153,26916,26917,26919,26921],{"class":155,"line":242},[153,26918,26906],{"class":159},[153,26920,1590],{"class":167},[153,26922,26923],{"class":167}," skill-pack@skill-pack\n",[138,26925,26927],{"id":26926},"method-3-one-command-install-from-tokrepo","Method 3: One-Command Install from TokRepo",[12,26929,26930,26931,26934],{},"Every skill on ",[71,26932,1519],{"href":1530,"rel":26933},[113]," includes a copy-paste install command:",[143,26936,26938],{"className":145,"code":26937,"language":147,"meta":148,"style":148},"# Example: Install the GSD workflow skill\nmkdir -p .claude\u002Fskills && curl -o .claude\u002Fskills\u002Fgsd.md \\\n  \"https:\u002F\u002Ftokrepo.com\u002Fapi\u002Fv1\u002Ftokenboard\u002Fraw\u002FASSET_UUID\"\n",[150,26939,26940,26945,26965],{"__ignoreMap":148},[153,26941,26942],{"class":155,"line":156},[153,26943,26944],{"class":211},"# Example: Install the GSD workflow skill\n",[153,26946,26947,26949,26951,26954,26956,26958,26960,26963],{"class":155,"line":208},[153,26948,1312],{"class":159},[153,26950,366],{"class":163},[153,26952,26953],{"class":167}," .claude\u002Fskills",[153,26955,16855],{"class":313},[153,26957,160],{"class":159},[153,26959,15118],{"class":163},[153,26961,26962],{"class":167}," .claude\u002Fskills\u002Fgsd.md",[153,26964,372],{"class":163},[153,26966,26967],{"class":155,"line":242},[153,26968,15128],{"class":167},[138,26970,26972],{"id":26971},"where-skills-live","Where Skills Live",[809,26974,26975,26988],{},[812,26976,26977],{},[815,26978,26979,26982,26985],{},[818,26980,26981],{},"Location",[818,26983,26984],{},"Scope",[818,26986,26987],{},"Priority",[828,26989,26990,27003,27017],{},[815,26991,26992,26997,27000],{},[833,26993,26994,26996],{},[150,26995,24729],{}," (project)",[833,26998,26999],{},"Current project only",[833,27001,27002],{},"Highest",[815,27004,27005,27011,27014],{},[833,27006,27007,27010],{},[150,27008,27009],{},"~\u002F.claude\u002Fskills\u002F"," (global)",[833,27012,27013],{},"All projects",[833,27015,27016],{},"Lower",[815,27018,27019,27022,27025],{},[833,27020,27021],{},"Plugin-installed",[833,27023,27024],{},"Depends on plugin config",[833,27026,27027],{},"Varies",[35,27029,27031],{"id":27030},"_10-most-popular-claude-code-skills-in-2026","10 Most Popular Claude Code Skills in 2026",[12,27033,27034],{},"Based on community usage and TokRepo rankings:",[428,27036,27037,27043,27049,27055,27061,27067,27073,27079,27085,27091],{},[22,27038,27039,27042],{},[45,27040,27041],{},"Code Reviewer"," — Adversarial code review with severity ratings",[22,27044,27045,27048],{},[45,27046,27047],{},"GSD Workflow"," — Plan, execute, and verify development tasks",[22,27050,27051,27054],{},[45,27052,27053],{},"Frontend Design"," — Generate production-grade UI with design principles",[22,27056,27057,27060],{},[45,27058,27059],{},"Commit Message Writer"," — Structured commits following conventions",[22,27062,27063,27066],{},[45,27064,27065],{},"Test Generator"," — Auto-generate unit and integration tests",[22,27068,27069,27072],{},[45,27070,27071],{},"PR Creator"," — Create well-structured pull requests",[22,27074,27075,27078],{},[45,27076,27077],{},"Deployment Pipeline"," — Automated build and deploy workflows",[22,27080,27081,27084],{},[45,27082,27083],{},"Documentation Writer"," — Generate docs from code",[22,27086,27087,27090],{},[45,27088,27089],{},"Prompt Architect"," — Transform vague prompts into expert-level ones",[22,27092,27093,27096],{},[45,27094,27095],{},"Refactoring Specialist"," — Safe, incremental code refactoring",[12,27098,27099,27100,667],{},"Browse the full collection: ",[71,27101,27103],{"href":1530,"rel":27102},[113],"Top 500+ Agent Skills on TokRepo",[35,27105,27107],{"id":27106},"how-to-create-your-own-skill","How to Create Your Own Skill",[138,27109,27111],{"id":27110},"step-1-create-the-file","Step 1: Create the File",[143,27113,27115],{"className":145,"code":27114,"language":147,"meta":148,"style":148},"touch .claude\u002Fskills\u002Fmy-skill.md\n",[150,27116,27117],{"__ignoreMap":148},[153,27118,27119,27121],{"class":155,"line":156},[153,27120,12611],{"class":159},[153,27122,27123],{"class":167}," .claude\u002Fskills\u002Fmy-skill.md\n",[138,27125,27127],{"id":27126},"step-2-write-the-instructions","Step 2: Write the Instructions",[143,27129,27131],{"className":5813,"code":27130,"language":5815,"meta":148,"style":148},"# My Custom Skill\n\n## When to Use\nActivate when the user asks to [describe trigger].\n\n## Instructions\n1. First, read the relevant files using...\n2. Then, analyze the code for...\n3. Finally, output a report with...\n\n## Output Format\n- Use markdown tables for structured data\n- Include code blocks with language tags\n- End with actionable next steps\n\n## Constraints\n- Never modify files without confirmation\n- Always explain reasoning before changes\n- Keep responses under 500 words\n",[150,27132,27133,27138,27142,27147,27152,27156,27161,27166,27171,27176,27180,27184,27189,27194,27199,27203,27208,27213,27218],{"__ignoreMap":148},[153,27134,27135],{"class":155,"line":156},[153,27136,27137],{},"# My Custom Skill\n",[153,27139,27140],{"class":155,"line":208},[153,27141,246],{"emptyLinePlaceholder":245},[153,27143,27144],{"class":155,"line":242},[153,27145,27146],{},"## When to Use\n",[153,27148,27149],{"class":155,"line":249},[153,27150,27151],{},"Activate when the user asks to [describe trigger].\n",[153,27153,27154],{"class":155,"line":255},[153,27155,246],{"emptyLinePlaceholder":245},[153,27157,27158],{"class":155,"line":268},[153,27159,27160],{},"## Instructions\n",[153,27162,27163],{"class":155,"line":281},[153,27164,27165],{},"1. First, read the relevant files using...\n",[153,27167,27168],{"class":155,"line":1356},[153,27169,27170],{},"2. Then, analyze the code for...\n",[153,27172,27173],{"class":155,"line":1362},[153,27174,27175],{},"3. Finally, output a report with...\n",[153,27177,27178],{"class":155,"line":1367},[153,27179,246],{"emptyLinePlaceholder":245},[153,27181,27182],{"class":155,"line":1372},[153,27183,12873],{},[153,27185,27186],{"class":155,"line":1378},[153,27187,27188],{},"- Use markdown tables for structured data\n",[153,27190,27191],{"class":155,"line":1383},[153,27192,27193],{},"- Include code blocks with language tags\n",[153,27195,27196],{"class":155,"line":1389},[153,27197,27198],{},"- End with actionable next steps\n",[153,27200,27201],{"class":155,"line":1395},[153,27202,246],{"emptyLinePlaceholder":245},[153,27204,27205],{"class":155,"line":1401},[153,27206,27207],{},"## Constraints\n",[153,27209,27210],{"class":155,"line":1407},[153,27211,27212],{},"- Never modify files without confirmation\n",[153,27214,27215],{"class":155,"line":1129},[153,27216,27217],{},"- Always explain reasoning before changes\n",[153,27219,27220],{"class":155,"line":1417},[153,27221,27222],{},"- Keep responses under 500 words\n",[138,27224,27226],{"id":27225},"step-3-test-it","Step 3: Test It",[143,27228,27230],{"className":145,"code":27229,"language":147,"meta":148,"style":148},"# Start Claude Code in your project\nclaude\n\n# Invoke your skill\n\u002Fmy-skill\n",[150,27231,27232,27237,27241,27245,27250],{"__ignoreMap":148},[153,27233,27234],{"class":155,"line":156},[153,27235,27236],{"class":211},"# Start Claude Code in your project\n",[153,27238,27239],{"class":155,"line":208},[153,27240,1246],{"class":159},[153,27242,27243],{"class":155,"line":242},[153,27244,246],{"emptyLinePlaceholder":245},[153,27246,27247],{"class":155,"line":249},[153,27248,27249],{"class":211},"# Invoke your skill\n",[153,27251,27252],{"class":155,"line":255},[153,27253,27254],{"class":159},"\u002Fmy-skill\n",[138,27256,27258],{"id":27257},"step-4-share-it","Step 4: Share It",[12,27260,27261,27262,27266,27267,667],{},"Upload your skill to ",[71,27263,1519],{"href":27264,"rel":27265},"https:\u002F\u002Ftokrepo.com\u002Fen\u002Fworkflows\u002Fsubmit",[113]," to share with the community. Read the full tutorial: ",[71,27268,1258],{"href":1169},[35,27270,27272],{"id":27271},"skill-design-best-practices","Skill Design Best Practices",[138,27274,27276],{"id":27275},"do","Do",[19,27278,27279,27284,27289,27295],{},[22,27280,27281,27283],{},[45,27282,12920],{}," — \"Review Python code for SQLAlchemy N+1 query patterns\" beats \"Review code\"",[22,27285,27286,27288],{},[45,27287,12932],{}," — Show input\u002Foutput examples so Claude understands the expected format",[22,27290,27291,27294],{},[45,27292,27293],{},"Set constraints"," — Define what the skill should NOT do",[22,27296,27297,27300],{},[45,27298,27299],{},"Test with edge cases"," — Try the skill on unusual inputs before sharing",[138,27302,27304],{"id":27303},"dont","Don't",[19,27306,27307,27313,27319],{},[22,27308,27309,27312],{},[45,27310,27311],{},"Don't be vague"," — \"Make the code better\" produces inconsistent results",[22,27314,27315,27318],{},[45,27316,27317],{},"Don't overload"," — One skill, one task. Split complex workflows into multiple skills",[22,27320,27321,27324],{},[45,27322,27323],{},"Don't hardcode paths"," — Use relative paths or let Claude discover the project structure",[116,27326,27327],{"type":452},[12,27328,27329],{},"Skills execute with Claude Code's full permissions. If you install a third-party skill, review its instructions first — especially if it modifies files or runs shell commands.",[35,27331,27333],{"id":27332},"cross-platform-compatibility","Cross-Platform Compatibility",[12,27335,27336],{},"The SKILL.md format works across multiple AI coding tools:",[809,27338,27339,27350],{},[812,27340,27341],{},[815,27342,27343,27345,27348],{},[818,27344,823],{},[818,27346,27347],{},"Skill Location",[818,27349,26743],{},[828,27351,27352,27365,27378,27390],{},[815,27353,27354,27358,27363],{},[833,27355,27356],{},[45,27357,1159],{},[833,27359,27360],{},[150,27361,27362],{},".claude\u002Fskills\u002F*.md",[833,27364,12498],{},[815,27366,27367,27371,27375],{},[833,27368,27369],{},[45,27370,8662],{},[833,27372,27373],{},[150,27374,5558],{},[833,27376,27377],{},"Similar markdown",[815,27379,27380,27384,27388],{},[833,27381,27382],{},[45,27383,5610],{},[833,27385,27386],{},[150,27387,8669],{},[833,27389,27377],{},[815,27391,27392,27396,27400],{},[833,27393,27394],{},[45,27395,6675],{},[833,27397,27398],{},[150,27399,6663],{},[833,27401,27402],{},"Text rules",[12,27404,27405],{},"Most skills on TokRepo can be adapted for any of these tools with minor format changes.",[138,27407,2514],{"id":2513},[12,27409,27410,27413],{},[45,27411,27412],{},"Q: What are Claude Code skills?","\nA: Markdown instruction files that teach Claude Code how to perform specific tasks. They're invoked via slash commands and require no coding — just structured text describing what Claude should do.",[12,27415,27416,27419],{},[45,27417,27418],{},"Q: Are Claude Code skills free?","\nA: Yes. Skills are open markdown files. TokRepo hosts 500+ free community skills that you can install with one command.",[12,27421,27422,27425,27426,8658,27428,27430],{},[45,27423,27424],{},"Q: How many skills can I install?","\nA: There's no hard limit. Claude Code loads skills from ",[150,27427,24729],{},[150,27429,27009],{},". However, each skill adds to the context window, so keep your active skills focused on what you need.",[12,27432,27433,27436],{},[45,27434,27435],{},"Q: Do skills work offline?","\nA: Skills themselves are local markdown files, but Claude Code requires an internet connection to the Anthropic API. The skill instructions are read locally.",[35,27438,1020],{"id":1019},[19,27440,27441,27447,27452,27456,27461],{},[22,27442,27443,27446],{},[71,27444,3653],{"href":1530,"rel":27445},[113]," — install your first skill now",[22,27448,27449,27451],{},[71,27450,1258],{"href":1169}," — step-by-step tutorial",[22,27453,27454,22665],{},[71,27455,1263],{"href":1262},[22,27457,27458,27460],{},[71,27459,16630],{"href":3664}," — extend Claude with external tools",[22,27462,27463,27466],{},[71,27464,27465],{"href":10733},"Agent Skills for Teams"," — standardize skills across your team",[1074,27468,25513],{},{"title":148,"searchDepth":208,"depth":208,"links":27470},[27471,27472,27475,27481,27482,27488,27492,27495],{"id":78,"depth":208,"text":79},{"id":26650,"depth":208,"text":26651,"children":27473},[27474],{"id":26718,"depth":242,"text":26719},{"id":26825,"depth":208,"text":26826,"children":27476},[27477,27478,27479,27480],{"id":26829,"depth":242,"text":26830},{"id":26890,"depth":242,"text":26891},{"id":26926,"depth":242,"text":26927},{"id":26971,"depth":242,"text":26972},{"id":27030,"depth":208,"text":27031},{"id":27106,"depth":208,"text":27107,"children":27483},[27484,27485,27486,27487],{"id":27110,"depth":242,"text":27111},{"id":27126,"depth":242,"text":27127},{"id":27225,"depth":242,"text":27226},{"id":27257,"depth":242,"text":27258},{"id":27271,"depth":208,"text":27272,"children":27489},[27490,27491],{"id":27275,"depth":242,"text":27276},{"id":27303,"depth":242,"text":27304},{"id":27332,"depth":208,"text":27333,"children":27493},[27494],{"id":2513,"depth":242,"text":2514},{"id":1019,"depth":208,"text":1020},"Learn what Claude Code skills are, how to install them, where to find the best ones, and how to create your own. Covers SKILL.md format, slash commands, and the skills marketplace.","了解 Claude Code Skills 是什么、如何安装、去哪找最好的、以及如何自己创建。涵盖 SKILL.md 格式、斜杠命令和技能市场。",[27499,27502,27504,27507,27510],{"q":27500,"a":27501},"What is a Claude Code skill?","A Markdown instruction file that teaches Claude Code how to perform a specific task. When invoked via slash command (\u002Fskill-name), Claude reads the .md file and follows its instructions — no code compilation, no API integration, no MCP server required. Skills are the easiest way to extend Claude Code.",{"q":3580,"a":27503},"Three methods: drop a file into .claude\u002Fskills\u002F for project-level or ~\u002F.claude\u002Fskills\u002F for global, use the plugin marketplace with \u002Fplugin install, or run a one-command curl from TokRepo (mkdir -p .claude\u002Fskills && curl -o .claude\u002Fskills\u002Fname.md \u003Curl>). Claude Code auto-discovers skills at startup.",{"q":27505,"a":27506},"Where do Claude Code skills live?","Two main locations: .claude\u002Fskills\u002F in your project (highest priority, scoped to that project) and ~\u002F.claude\u002Fskills\u002F globally (available in all projects, lower priority). Plugin-installed skills live in marketplace-managed directories. Project-level skills override global skills with the same name.",{"q":27508,"a":27509},"How many Claude Code skills can I install?","No hard limit. Claude Code loads skills from both project and global directories. However, each installed skill adds to the context window on startup, so keep active skills focused on what you actually use. Most teams run 5-10 skills; power users sometimes run 20+.",{"q":27511,"a":27512},"Are Claude Code skills free?","Yes. Skills are open Markdown files you can write in any text editor. TokRepo hosts 500+ free community skills installable with one command. Since skills are plain text, you can inspect, modify, and share them freely — no vendor lock-in or licensing restrictions beyond individual authors' choices.","\u002Fguide\u002Fimages\u002Fclaude-code-skills-hero.svg",{},"\u002Fen\u002Fguide\u002Fwhat-are-claude-code-skills",{"title":26626,"description":27496},"en\u002Fguide\u002Fwhat-are-claude-code-skills",[2769,26620,10876,14138],"什么是 Claude Code Skills？完整指南与示例","Claude Code skills are Markdown instruction files (SKILL.md) that teach Claude Code how to perform specific tasks. Drop a .md file into .claude\u002Fskills\u002F (project-level) or ~\u002F.claude\u002Fskills\u002F (global), invoke it with \u002Fskill-name, and Claude reads and follows the instructions. No code, no API integration — just structured text. Install from TokRepo's 500+ community skills with one curl command, or write your own in minutes.","OLjCHNRbRtF-wfVZZz65hyDqVMRoO5HLCUSWURBiwyE"]