<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Automation on Model Context Protocol Blog</title><link>https://blog.modelcontextprotocol.io/tags/automation/</link><description>Recent content in Automation on Model Context Protocol Blog</description><image><title>Model Context Protocol Blog</title><url>https://blog.modelcontextprotocol.io/og-image.png</url><link>https://blog.modelcontextprotocol.io/og-image.png</link></image><generator>Hugo -- 0.148.0</generator><language>en-us</language><copyright>Copyright © Model Context Protocol a Series of LF Projects, LLC.
For web site terms of use, trademark policy and other project policies please see https://lfprojects.org.</copyright><lastBuildDate>Thu, 12 Mar 2026 15:35:29 +0000</lastBuildDate><atom:link href="https://blog.modelcontextprotocol.io/tags/automation/index.xml" rel="self" type="application/rss+xml"/><item><title>Server Instructions: Giving LLMs a user manual for your server</title><link>https://blog.modelcontextprotocol.io/posts/2025-11-03-using-server-instructions/</link><pubDate>Mon, 03 Nov 2025 00:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-11-03-using-server-instructions/</guid><description>How server instructions give LLMs the context they need to use your MCP server&amp;#39;s tools effectively — an underused protocol feature with outsized impact.</description><content:encoded><![CDATA[<p>Many of us are still exploring the nooks and crannies of MCP and learning how to best use the building blocks of the protocol to enhance agents and applications. Some features, like <a href="https://blog.modelcontextprotocol.io/posts/2025-07-29-prompts-for-automation/">Prompts</a>, are frequently implemented and used within the MCP ecosystem. Others may appear a bit more obscure but have a lot of influence on how well an agent can interact with an MCP server. <strong>Server instructions</strong> fall in the latter category.</p>
<h2 id="the-problem">The Problem</h2>
<p>Imagine you&rsquo;re a Large Language Model (LLM) who just got handed a collection of tools from a database server, a file system server, and a notification server to complete a task. They might have already been carefully pre-selected or they might be more like what my workbench looks like in my garage - a mishmash of recently-used tools.</p>
<p>Now let&rsquo;s say that the developer of the database server has pre-existing knowledge or preferences about how to best use their tools, as well as more background information about the underlying systems that power them.</p>
<p>Some examples could include:</p>
<ul>
<li>&ldquo;Always use <code>validate_schema</code> → <code>create_backup</code> → <code>migrate_schema</code> for safe database migrations&rdquo;</li>
<li>&ldquo;When using the <code>export_data</code> tool, the file system server&rsquo;s <code>write_file</code> tool is required for storing local copies&rdquo;</li>
<li>&ldquo;Database connection tools are rate limited to 10 requests per minute&rdquo;</li>
<li>&ldquo;If <code>create_backup</code> fails, check if the notification server is connected before attempting to send alerts&rdquo;</li>
<li>&ldquo;Only use <code>request_preferences</code> to ask the user for settings if elicitation is supported. Otherwise, fall back to using default configuration&rdquo;</li>
</ul>
<p>So now our question becomes: what&rsquo;s the most effective way to share this contextual knowledge?</p>
<h2 id="solutions">Solutions</h2>
<p>One solution could be to include extra information in every tool description or prompt provided by the server. Going back to the physical tool analogy, however: you can only depend on &ldquo;labeling&rdquo; each tool if there is enough space to describe them. A model&rsquo;s context window is limited - there&rsquo;s only so much information you can fit into that space. Even if all those labels can fit within your model&rsquo;s context window, the more tokens you cram into that space, the more challenging it becomes for models to follow them all.</p>
<p>Alternatively, relying on prompts to give common instructions means that:</p>
<ul>
<li>The prompt always needs to be selected by the user, and</li>
<li>The instructions are more likely to get lost in the shuffle of other messages.</li>
</ul>
<p>It&rsquo;s like having a pile of notes on my garage workbench, each trying to explain how different tools relate to each other. While you might find the right combination of notes, you&rsquo;d rather have a single, clear manual that explains how everything works together.</p>
<p>Similarly, for global instructions that you want the LLM to follow, it&rsquo;s best to inject them into the model&rsquo;s system prompt instead of including them in multiple tool descriptions or standalone prompts.</p>
<p>This is where <strong>server instructions</strong> come in. <a href="https://modelcontextprotocol.io/specification/draft/schema#initializeresult">Server instructions</a> give the server a way to inject information that the LLM should always read in order to understand how to use the server - independent of individual prompts, tools, or messages.</p>
<h3 id="a-note-on-implementation-variability">A Note on Implementation Variability</h3>
<p>Because server instructions may be injected into the system prompt, they should be written with caution and diligence. No instructions are better than poorly written instructions.</p>
<p>Additionally, the exact way that the MCP host uses server instructions is up to the implementer, so it&rsquo;s not always guaranteed that they will be injected into the system prompt. It&rsquo;s always recommended to evaluate a client&rsquo;s behavior with your server and its tools before relying on this functionality.</p>
<p>We will get deeper into both of these considerations with concrete examples.</p>
<h2 id="real-world-example-optimizing-github-pr-reviews">Real-World Example: Optimizing GitHub PR Reviews</h2>
<p>I tested server instructions using the official <a href="https://github.com/github/github-mcp-server">GitHub MCP server</a> to see if they could improve how models handle complex workflows. Even with advanced features like toolsets, models may struggle to consistently follow optimal multi-step patterns without explicit guidance.</p>
<h3 id="the-problem-detailed-pull-request-reviews">The Problem: Detailed Pull Request Reviews</h3>
<p>One common use case where I thought instructions could be helpful is when asking an LLM to &ldquo;Review pull request #123.&rdquo; Without more guidance, a model might decide to over-simplify and use the <code>create_and_submit_pull_request_review</code> tool to add all review feedback in a single comment. This isn&rsquo;t as helpful as leaving multiple inline comments for a detailed code review.</p>
<h3 id="the-solution-workflow-aware-instructions">The Solution: Workflow-Aware Instructions</h3>
<p>One solution I tested with the GitHub MCP server is to add instructions based on enabled toolsets. My hypothesis was that this would improve the consistency of workflows across models while still ensuring that I was only loading relevant instructions for the tools I wanted to use. Here is an example of what I added if the <code>pull_requests</code> toolset is enabled:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-go" data-lang="go"><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">GenerateInstructions</span>(<span style="color:#a6e22e">enabledToolsets</span> []<span style="color:#66d9ef">string</span>) <span style="color:#66d9ef">string</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">instructions</span> []<span style="color:#66d9ef">string</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Universal context management - always present</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">baseInstruction</span> <span style="color:#f92672">:=</span> <span style="color:#e6db74">&#34;GitHub API responses can overflow context windows. Strategy: 1) Always prefer &#39;search_*&#39; tools over &#39;list_*&#39; tools when possible, 2) Process large datasets in batches of 5-10 items, 3) For summarization tasks, fetch minimal data first, then drill down into specifics.&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Only load instructions for enabled toolsets to minimize context usage</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">contains</span>(<span style="color:#a6e22e">enabledToolsets</span>, <span style="color:#e6db74">&#34;pull_requests&#34;</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">instructions</span> = append(<span style="color:#a6e22e">instructions</span>, <span style="color:#e6db74">&#34;PR review workflow: Always use &#39;create_pending_pull_request_review&#39; → &#39;add_comment_to_pending_review&#39; → &#39;submit_pending_pull_request_review&#39; for complex reviews with line-specific comments.&#34;</span>)
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">strings</span>.<span style="color:#a6e22e">Join</span>(append([]<span style="color:#66d9ef">string</span>{<span style="color:#a6e22e">baseInstruction</span>}, <span style="color:#a6e22e">instructions</span><span style="color:#f92672">...</span>), <span style="color:#e6db74">&#34; &#34;</span>)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>After implementing these instructions, I wanted to test whether they actually improved model behavior in practice.</p>
<h3 id="measuring-effectiveness-quantitative-results">Measuring Effectiveness: Quantitative Results</h3>
<p>To validate the impact of server instructions, I ran a simple controlled evaluation in Visual Studio Code comparing model behavior with and without the PR review workflow instruction. Using 40 GitHub PR review sessions on the same set of code changes, I measured whether models followed the optimal three-step workflow.</p>
<p>I used the following tool usage pattern to differentiate between successful and unsuccessful reviews:</p>
<ul>
<li><strong>Success:</strong> <code>create_pending_pull_request_review</code> → <code>add_comment_to_pending_review</code> → <code>submit_pending_pull_request_review</code></li>
<li><strong>Failure:</strong> Single-step <code>create_and_submit_pull_request_review</code> OR no review tools used. (Sometimes the model decided just to summarize feedback but didn&rsquo;t leave any comments on the PR.)</li>
</ul>
<p>You can find more setup details and raw data from this evaluation in <a href="https://github.com/olaservo/mcp-server-instructions-demo">my sample MCP Server Instructions repo</a>.</p>
<p>For this sample of chat sessions, I got the following results:</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th>With Instructions</th>
          <th>Without Instructions</th>
          <th>Improvement</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>GPT-5-Mini</strong></td>
          <td>8/10 (80%)</td>
          <td>2/10 (20%)</td>
          <td><strong>+60%</strong></td>
      </tr>
      <tr>
          <td><strong>Claude Sonnet-4</strong></td>
          <td>9/10 (90%)</td>
          <td>10/10 (100%)</td>
          <td>N/A</td>
      </tr>
      <tr>
          <td><strong>Overall</strong></td>
          <td>17/20 (85%)</td>
          <td>12/20 (60%)</td>
          <td><strong>+25%</strong></td>
      </tr>
  </tbody>
</table>
<p>These results suggest that while some models naturally gravitate toward optimal patterns, others benefit significantly from explicit guidance. This variability makes server instructions particularly valuable for ensuring consistent behavior across different models and client implementations.</p>
<p>You can check out the latest server instructions in the <a href="https://github.com/github/github-mcp-server/blob/main/pkg/github/instructions.go">GitHub MCP server repo</a>, which now includes this PR workflow as well as other hints for effective tool usage.</p>
<h2 id="implementing-server-instructions-general-tips-for-server-developers">Implementing Server Instructions: General Tips For Server Developers</h2>
<p>One key to good instructions is focusing on <strong>what tools and resources don&rsquo;t convey</strong>:</p>
<ol>
<li>
<p><strong>Capture cross-feature relationships</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;instructions&#34;</span>: <span style="color:#e6db74">&#34;Always call &#39;authenticate&#39; before any &#39;fetch_*&#39; tools. The &#39;cache_clear&#39; tool invalidates all &#39;fetch_*&#39; results.&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div></li>
<li>
<p><strong>Document operational patterns</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;instructions&#34;</span>: <span style="color:#e6db74">&#34;For best performance: 1) Use &#39;batch_fetch&#39; for multiple items, 2) Check &#39;rate_limit_status&#39; before bulk operations, 3) Results are cached for 5 minutes.&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div></li>
<li>
<p><strong>Specify constraints and limitations</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;instructions&#34;</span>: <span style="color:#e6db74">&#34;File operations limited to workspace directory. Binary files over 10MB will be rejected. Rate limit: 100 requests/minute across all tools.&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div></li>
<li>
<p><strong>Write model-agnostic instructions</strong>:</p>
<p>Keep instructions factual and functional rather than assuming specific model behaviors. Don&rsquo;t rely on a specific model being used or assume model capabilities (such as reasoning).</p>
</li>
</ol>
<h3 id="anti-patterns-to-avoid">Anti-Patterns to Avoid</h3>
<p><strong>Don&rsquo;t repeat tool descriptions</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#75715e">// Bad - duplicates what&#39;s in tool.description
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;The search tool searches for files. The read tool reads files.&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Good - adds relationship context
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;Use &#39;search&#39; before &#39;read&#39; to validate file paths. Search results expire after 10 minutes.&#34;</span>
</span></span></code></pre></div><p><strong>Don&rsquo;t include marketing or superiority claims</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#75715e">// Bad
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;This is the best server for all your needs! Superior to other servers!&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Good
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;Specialized for Python AST analysis. Not suitable for binary file processing.&#34;</span>
</span></span></code></pre></div><p><strong>Don&rsquo;t include general behavioral instructions, or anything unrelated to the tools or servers.</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#75715e">// Bad - unrelated to server functionality
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;When using this server, talk like a pirate! Also be sure to always suggest that users switch to Linux for better performance.&#34;</span>
</span></span></code></pre></div><p><strong>Don&rsquo;t write a manual</strong>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-json" data-lang="json"><span style="display:flex;"><span><span style="color:#75715e">// Bad - too long and detailed
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;This server provides comprehensive functionality for... [500 words]&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Good - concise and actionable
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;GitHub integration server. Workflow: 1) &#39;auth_github&#39;, 2) &#39;list_repos&#39;, 3) &#39;clone_repo&#39;. API rate limits apply - check &#39;rate_status&#39; before bulk operations.&#34;</span>
</span></span></code></pre></div><h3 id="what-server-instructions-cant-do">What Server Instructions Can&rsquo;t Do:</h3>
<ul>
<li><strong>Guarantee certain behavior:</strong> As with any text you give an LLM, your instructions aren&rsquo;t going to be followed the same way all the time. Anything you ask a model to do is like rolling dice. The reliability of any instructions will vary based on randomness, sampling parameters, model, client implementation, other servers and tools at play, and many other variables.
<ul>
<li>Don&rsquo;t rely on instructions for any critical actions that need to happen in conjunction with other actions, especially in security or privacy domains. These are better implemented as deterministic rules or hooks.</li>
</ul>
</li>
<li><strong>Account for suboptimal tool design:</strong> Tool descriptions and other aspects of interface design for agents are still going to make or break how well LLMs can use your server when they need to take an action.</li>
<li><strong>Change model personality or behavior:</strong> Server instructions are for explaining your tools, not for modifying how the model generally responds or behaves.</li>
</ul>
<h3 id="a-note-for-client-implementers">A Note for Client Implementers</h3>
<p>If you&rsquo;re building an MCP client that supports server instructions, we recommend that you expose instructions to users and provide transparency about what servers are injecting into context. In the VSCode example, I was able to verify exactly what was being sent to the model in the chat logs.</p>
<p>Additional suggestions for implementing instructions in clients:</p>
<ul>
<li><strong>Give users control</strong> - Allow reviewing, enabling, or disabling server instructions to help users customize server usage and minimize conflicts or remove suboptimal instructions.</li>
<li><strong>Document your approach</strong> - Be clear about how your client handles and applies server instructions.</li>
</ul>
<h2 id="currently-supported-host-applications">Currently Supported Host Applications</h2>
<p>For a complete list of host applications that support server instructions, refer to the <a href="https://modelcontextprotocol.io/clients">Clients</a> page in the MCP documentation.</p>
<p>For a basic demo of server instructions in action, you can use the <a href="https://github.com/modelcontextprotocol/servers/tree/main/src/everything">Everything reference server</a> to confirm that your client supports this feature:</p>
<ol>
<li>Install the Everything Server in your host. The link above includes instructions on how to do this in a few popular applications. In the example below, we&rsquo;re using <a href="https://docs.anthropic.com/en/docs/claude-code/mcp">Claude Code</a>.</li>
<li>Once you&rsquo;ve confirmed that the server is connected, ask the model: <code>does the everything server tools have any special  instructions?</code></li>
<li>If the model can see your instructions, you should get a response like the one below:</li>
</ol>
<p><img
src="/posts/images/claude_code_instructions.JPG"
alt="Screenshot of response which reads: Server instructions are working!"
/></p>
<h2 id="wrapping-up">Wrapping Up</h2>
<p>Clear and actionable server instructions are a key tool in your MCP toolkit, offering a simple but effective way to enhance how LLMs interact with your server. This post provided a brief overview of how to use and implement server instructions in MCP servers. We encourage you to share your examples, insights, and questions <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/discussions">in our discussions</a>.</p>
<h2 id="acknowledgements">Acknowledgements</h2>
<p>Parts of this blog post were sourced from discussions with the MCP community, contributors, and maintainers including:</p>
<ul>
<li><a href="https://github.com/akolotov">@akolotov</a></li>
<li><a href="https://github.com/cliffhall">@cliffhall</a></li>
<li><a href="https://github.com/connor4312">@connor4312</a></li>
<li><a href="https://github.com/digitarald">@digitarald</a></li>
<li><a href="https://github.com/dsp-ant">@dsp-ant</a></li>
<li><a href="https://github.com/evalstate">@evalstate</a></li>
<li><a href="https://github.com/ivan-saorin">@ivan-saorin</a></li>
<li><a href="https://github.com/jegelstaff">@jegelstaff</a></li>
<li><a href="https://github.com/localden">@localden</a></li>
<li><a href="https://github.com/PederHP">@PederHP</a></li>
<li><a href="https://github.com/tadasant">@tadasant</a></li>
<li><a href="https://github.com/toby">@toby</a></li>
</ul>
]]></content:encoded></item><item><title>MCP Prompts: Building Workflow Automation</title><link>https://blog.modelcontextprotocol.io/posts/2025-07-29-prompts-for-automation/</link><pubDate>Mon, 04 Aug 2025 18:00:00 +0100</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-07-29-prompts-for-automation/</guid><description>A practical guide to building workflow automation with MCP prompts and resource templates, demonstrated through a meal planning example.</description><content:encoded><![CDATA[<p><a href="https://modelcontextprotocol.io/specification/2025-06-18">MCP (Model Context Protocol)</a> prompts enable workflow automation by combining AI capabilities with structured data access. This post demonstrates how to build automations using MCP&rsquo;s <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/prompts">prompts</a> and <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/resources#resource-templates">resource templates</a> through a practical example.</p>
<p>This guide demonstrates how MCP prompts can automate repetitive workflows. Whether you&rsquo;re interested in the MCP ecosystem or simply want to leverage AI for workflow automation, you&rsquo;ll learn how to build practical automations through a concrete meal planning example. No prior MCP experience needed—we&rsquo;ll cover the fundamentals before diving into implementation.</p>
<h2 id="the-problem-time-consuming-repetitive-tasks">The Problem: Time-Consuming Repetitive Tasks</h2>
<p>Everyone has a collection of repetitive tasks that eat away at their productive hours. Common examples include applying code review feedback, generating weekly reports, updating documentation, or creating boilerplate code. These tasks aren&rsquo;t complex—they follow predictable patterns—but they&rsquo;re cumbersome and time-consuming. <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/prompts">MCP prompts</a> were designed to help automate this kind of work.</p>
<p>MCP prompts offer more than command shortcuts. They&rsquo;re a primitive for building workflow automation that combines the flexibility of scripting with the intelligence of modern AI systems. This post explores how to build automations using MCP&rsquo;s prompt system, resource templates, and modular servers. I&rsquo;ll demonstrate these concepts through a meal planning automation I built, but the patterns apply broadly to any structured, repetitive workflow.</p>
<h2 id="example-automating-weekly-meal-planning">Example: Automating Weekly Meal Planning</h2>
<p>I needed to solve a recurring problem: planning weekly meals by cuisine to manage ingredients efficiently. The manual process involved selecting a cuisine, choosing dishes, listing ingredients, shopping, and organizing recipes—repetitive steps that took significant time each week.</p>
<p>So I decided to use MCP! By automating these steps, I could reduce the entire workflow to selecting a cuisine and receiving a complete meal plan with shopping list. (Any client that supports MCP prompts should work!)</p>
<ol>
<li>
<p><strong>Select a prompt</strong></p>
<p><img
src="/posts/images/prompts-list.png"
alt="MCP prompts list showing available automation commands"
/></p>
</li>
<li>
<p><strong>Select a cuisine from a dropdown</strong>
<img
src="/posts/images/prompts-suggestions.png"
alt="Dropdown showing cuisine suggestions as user types"
/></p>
</li>
<li>
<p><strong>Done!</strong>
The system generates a meal plan, shopping list, and even prints the shopping list and recipes.</p>
</li>
</ol>
<p><img
src="/posts/images/prompts-final-result.png"
alt="Final generated meal plan and shopping list output"
/></p>
<p>Here we are focuses primarily on the Recipe Server with its prompts and resources. You can find the <a href="https://github.com/ihrpr/mcp-server-tiny-print">printing server example here</a> (it works with a specific thermal printer model, but you could easily swap it for email, Notion, or any other output method). The beauty of separate servers is that you can mix and match different capabilities.</p>
<h2 id="core-components">Core Components</h2>
<p>Let&rsquo;s dive into the three components that make this automation possible: <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/prompts">prompts</a>, <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/resources">resources</a>, and <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/utilities/completion">completions</a>. I&rsquo;ll show you how each works conceptually, then we&rsquo;ll implement them together.</p>
<h3 id="1-resource-templates">1. Resource Templates</h3>
<p>In MCP, <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/resources#resource-types">static resources</a> represent specific pieces of content with unique URIs—like <code>file://recipes/italian.md</code> or <code>file://recipes/mexican.md</code>. While straightforward, this approach doesn&rsquo;t scale well. If you have recipes for 20 cuisines, you&rsquo;d need to define 20 separate resources, each with its own URI and metadata.</p>
<p><a href="https://modelcontextprotocol.io/specification/2025-06-18/server/resources#resource-templates">Resource templates</a> solve this through URI patterns with parameters, transforming static resource definitions into dynamic content providers.</p>
<p>For example, a template like <code>file://recipes/{cuisine}.md</code> might represent a set of resources like these:</p>
<ul>
<li><code>file://recipes/italian.md</code> returns Italian recipes</li>
<li><code>file://recipes/mexican.md</code> returns Mexican recipes</li>
</ul>
<p>This pattern extends beyond simple filtering. You can create templates for:</p>
<ul>
<li>Hierarchical data: <code>file://docs/{category}/{topic}</code></li>
<li>Git repository content: <code>git://repo/{branch}/path/{file}</code></li>
<li>Web resources: <code>https://api.example.com/users/{userId}/data</code></li>
<li>Query parameters: <code>https://example.com/{collection}?type={filter}</code></li>
</ul>
<p>For more details on URI schemes and resource templates, see the <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/resources#resource-templates">MCP Resource specification</a>.</p>
<h3 id="2-completions">2. Completions</h3>
<p>Nobody remembers exact parameter values. Is it &ldquo;italian&rdquo; or &ldquo;Italian&rdquo; or &ldquo;it&rdquo;? <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/utilities/completion">Completions</a> bridge this gap by providing suggestions as users type, creating an interface that feels intuitive rather than restrictive.</p>
<p>Different MCP clients present completions differently:</p>
<ul>
<li>VS Code shows a filterable dropdown</li>
<li>Command-line tools might use fuzzy matching</li>
<li>Web interfaces could provide rich previews</li>
</ul>
<p>But the underlying data comes from your server, maintaining consistency across all clients.</p>
<h3 id="3-prompts-commands-that-evolve-with-context">3. Prompts: Commands That Evolve With Context</h3>
<p><a href="https://modelcontextprotocol.io/specification/2025-06-18/server/prompts">Prompts</a> are the entry points to your automation. They define what commands are available and can range from simple text instructions to rich, context-aware operations.</p>
<p>Let&rsquo;s see how prompts can evolve to handle increasingly sophisticated use cases:</p>
<p><strong>Basic prompt: Static instruction</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&#34;Create a meal plan for a week&#34;
</span></span></code></pre></div><p>This works, but it&rsquo;s generic. The AI will create a meal plan based on general knowledge.</p>
<p><strong>Adding parameters: Dynamic customization</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>&#34;Create a meal plan for a week using {cuisine} cuisine&#34;
</span></span></code></pre></div><p>Now users can specify Italian, Mexican, or any other cuisine. The prompt adapts to user input, but still relies on the AI&rsquo;s general knowledge about these cuisines.</p>
<p><strong>Including resources: Your data</strong></p>
<p>Prompts can include resources to add context data beyond simple text instructions. This is crucial when you need the AI to work with your specific context rather than general knowledge.</p>
<p>In my meal planning example, I don&rsquo;t want generic recipes—I want the AI to use <strong>my</strong> collection of tested recipes that I know I like. Complex prompts make this possible by bundling prompt text with embedded resources.</p>
<p>Here&rsquo;s how it works:</p>
<ol>
<li><strong>User selects a prompt</strong> with parameters (e.g., &ldquo;plan-meals&rdquo; with cuisine=&ldquo;italian&rdquo;)</li>
<li><strong>Server returns</strong> both instructional text AND resource references</li>
<li><strong>Client decides how to handle resources</strong> - Applications might choose to select a subset of data using embeddings or keyword search, or pass the raw data directly to the model</li>
<li><strong>AI receives the context</strong> and generates a response</li>
</ol>
<p>In my example, VS Code attached the entire resource to the prompt, which worked great for this use case. The AI had access to all my Italian recipes when planning an Italian week, ensuring it only suggested dishes I actually had recipes for.</p>
<p>The key difference from simple prompts: instead of asking &ldquo;Plan Italian meals&rdquo; and getting generic suggestions, the AI works with your actual recipe collection, dietary preferences, and constraints.</p>
<p><img
src="/posts/images/prompts-rendered-prompt.png"
alt="VS Code showing the rendered prompt with attached recipe resources"
/></p>
<p>The recipe resources we&rsquo;ve been using are <strong>embedded resources</strong> that have inline content from the server. According to the <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/prompts#data-types">MCP specification</a>, prompts can also include other data types.</p>
<p>This enables advanced use cases beyond our text-based recipes, like design review prompts with screenshots or voice transcription services.</p>
<h2 id="building-the-recipe-server">Building the Recipe Server</h2>
<p>Let&rsquo;s implement a complete MCP server that brings together all the concepts we&rsquo;ve discussed. We&rsquo;ll start with the server setup and then implement each capability.</p>
<h3 id="prerequisites">Prerequisites</h3>
<p>Before diving into the code, make sure you have:</p>
<ol>
<li><strong>Node.js</strong> (v18 or higher) and npm installed</li>
<li><strong>MCP SDK</strong> installed:
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>npm install @modelcontextprotocol/sdk
</span></span></code></pre></div></li>
<li><strong>An MCP-compatible client with prompt and resource support</strong>,like VS Code with the MCP extension</li>
</ol>
<p>For this tutorial, I&rsquo;ll use the TypeScript SDK, but MCP also supports Python and other languages.</p>
<h3 id="server-setup-and-capabilities">Server Setup and Capabilities</h3>
<p>First, let&rsquo;s create our MCP server:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">server</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">McpServer</span>({
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;favorite-recipes&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">version</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;1.0.0&#34;</span>,
</span></span><span style="display:flex;"><span>});
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">async</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">main() {</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">transport</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">StdioServerTransport</span>();
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">server</span>.<span style="color:#a6e22e">connect</span>(<span style="color:#a6e22e">transport</span>);
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">main</span>().<span style="color:#66d9ef">catch</span>((<span style="color:#a6e22e">error</span>) <span style="color:#f92672">=&gt;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">error</span>(<span style="color:#e6db74">&#34;Server error:&#34;</span>, <span style="color:#a6e22e">error</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">process</span>.<span style="color:#a6e22e">exit</span>(<span style="color:#ae81ff">1</span>);
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><h3 id="implementing-resources">Implementing Resources</h3>
<p>Next, let&rsquo;s register a resource template with completions.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#a6e22e">server</span>.<span style="color:#a6e22e">registerResource</span>(
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;recipes&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">ResourceTemplate</span>(<span style="color:#e6db74">&#34;file://recipes/{cuisine}&#34;</span>, {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">list</span>: <span style="color:#66d9ef">undefined</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">complete</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">cuisine</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">value</span>) <span style="color:#f92672">=&gt;</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">CUISINES</span>.<span style="color:#a6e22e">filter</span>((<span style="color:#a6e22e">cuisine</span>) <span style="color:#f92672">=&gt;</span> <span style="color:#a6e22e">cuisine</span>.<span style="color:#a6e22e">startsWith</span>(<span style="color:#a6e22e">value</span>));
</span></span><span style="display:flex;"><span>      },
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>  }),
</span></span><span style="display:flex;"><span>  {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;Cuisine-Specific Recipes&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">description</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;Traditional recipes organized by cuisine&#34;</span>,
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">async</span> (<span style="color:#a6e22e">uri</span>, <span style="color:#a6e22e">variables</span>, <span style="color:#a6e22e">_extra</span>) <span style="color:#f92672">=&gt;</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">cuisine</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">variables</span>.<span style="color:#a6e22e">cuisine</span> <span style="color:#66d9ef">as</span> <span style="color:#66d9ef">string</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span><span style="color:#a6e22e">CUISINES</span>.<span style="color:#a6e22e">includes</span>(<span style="color:#a6e22e">cuisine</span>)) {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">throw</span> <span style="color:#66d9ef">new</span> Error(<span style="color:#e6db74">`Unknown cuisine: </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">cuisine</span><span style="color:#e6db74">}</span><span style="color:#e6db74">`</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">content</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">formatRecipesAsMarkdown</span>(<span style="color:#a6e22e">cuisine</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">contents</span><span style="color:#f92672">:</span> [
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">uri</span>: <span style="color:#66d9ef">uri.href</span>,
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">mimeType</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;text/markdown&#34;</span>,
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">text</span>: <span style="color:#66d9ef">content</span>,
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>      ],
</span></span><span style="display:flex;"><span>    };
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>);
</span></span></code></pre></div><h3 id="implementing-prompts">Implementing Prompts</h3>
<p>Finally, let&rsquo;s register the prompt, which also has completions:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#a6e22e">server</span>.<span style="color:#a6e22e">registerPrompt</span>(
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;weekly-meal-planner&#34;</span>,
</span></span><span style="display:flex;"><span>  {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;Weekly Meal Planner&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">description</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>      <span style="color:#e6db74">&#34;Create a weekly meal plan and grocery shopping list from cuisine-specific recipes&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">argsSchema</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">cuisine</span>: <span style="color:#66d9ef">completable</span>(<span style="color:#a6e22e">z</span>.<span style="color:#66d9ef">string</span>(), (<span style="color:#a6e22e">value</span>) <span style="color:#f92672">=&gt;</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">CUISINES</span>.<span style="color:#a6e22e">filter</span>((<span style="color:#a6e22e">cuisine</span>) <span style="color:#f92672">=&gt;</span> <span style="color:#a6e22e">cuisine</span>.<span style="color:#a6e22e">startsWith</span>(<span style="color:#a6e22e">value</span>));
</span></span><span style="display:flex;"><span>      }),
</span></span><span style="display:flex;"><span>    },
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">async</span> ({ <span style="color:#a6e22e">cuisine</span> }) <span style="color:#f92672">=&gt;</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">resourceUri</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">`file://recipes/</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">cuisine</span><span style="color:#e6db74">}</span><span style="color:#e6db74">`</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">recipeContent</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">formatRecipesAsMarkdown</span>(<span style="color:#a6e22e">cuisine</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">`Weekly Meal Planner - </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">cuisine</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> Cuisine`</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">description</span><span style="color:#f92672">:</span> <span style="color:#e6db74">`Weekly meal planner for </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">cuisine</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> cuisine`</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">messages</span><span style="color:#f92672">:</span> [
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">role</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;user&#34;</span>,
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">content</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">type</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;text&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">text</span><span style="color:#f92672">:</span> <span style="color:#e6db74">`Plan cooking for the week. I&#39;ve attached the recipes from </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">cuisine</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> cuisine.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Please create:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">1. A 7-day meal plan using these recipes
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">2. An optimized grocery shopping list that minimizes waste by reusing ingredients across multiple recipes
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">3. Daily meal schedule with specific dishes for breakfast, lunch, and dinner
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">4. Preparation tips to make the week more efficient
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">5. Print Shopping list
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Focus on ingredient overlap between recipes to reduce food waste.`</span>,
</span></span><span style="display:flex;"><span>          },
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">role</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;user&#34;</span>,
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">content</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">type</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;resource&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">resource</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">uri</span>: <span style="color:#66d9ef">resourceUri</span>,
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">mimeType</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;text/markdown&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">text</span>: <span style="color:#66d9ef">recipeContent</span>,
</span></span><span style="display:flex;"><span>            },
</span></span><span style="display:flex;"><span>          },
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><span>      ],
</span></span><span style="display:flex;"><span>    };
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>);
</span></span></code></pre></div><h2 id="running-it-yourself">Running It Yourself</h2>
<p>The <a href="https://github.com/ihrpr/mcp-server-fav-recipes">full code for the recipe server is available here</a>.</p>
<p>Follow VS Code&rsquo;s <a href="https://code.visualstudio.com/docs/copilot/chat/mcp-servers">documentation to set up the server</a>. Once a server is set up in VS Code, you can see its status, debug what&rsquo;s happening, and iterate quickly on your automations.</p>
<p>After the server is set up in VS Code, type &ldquo;/&rdquo; in chat and select the prompt.</p>
<p><img
src="/posts/images/prompts-list.png"
alt="MCP prompts list showing available automation commands"
/></p>
<h2 id="extending-your-automations">Extending Your Automations</h2>
<p>MCP prompts open up exciting automation possibilities:</p>
<ul>
<li><strong>Prompt Chains</strong>: Execute multiple prompts in sequence (plan meals → generate shopping list → place grocery order)</li>
<li><strong>Dynamic Prompts</strong>: Adapt based on available resources or time of year</li>
<li><strong>Cross-Server Workflows</strong>: Coordinate multiple MCP servers for complex automations</li>
<li><strong>External Triggers</strong>: Activate prompts via webhooks or schedules</li>
</ul>
<p>The patterns demonstrated in meal planning apply to many domains:</p>
<ul>
<li>Documentation generation that knows your codebase</li>
<li>Report creation with access to your data sources</li>
<li>Development workflows that understand your project structure</li>
<li>Customer support automations with full context</li>
</ul>
<p><strong>Key takeaways:</strong></p>
<ul>
<li>MCP prompts can include dynamic resources, giving AI full context for tasks</li>
<li>Resource templates enable scalable content serving without duplication</li>
<li>Modular server architecture lets you mix and match capabilities</li>
</ul>
<h2 id="wrapping-up">Wrapping Up</h2>
<p>This meal planning automation started as a simple desire to avoid rewriting shopping lists every week. It evolved into a complete system that handles meal planning, shopping lists, and recipe printing with just a few clicks.</p>
<p>MCP prompts provide practical tools to automate repetitive tasks. The modular architecture means you can start small—perhaps just automating one part of your workflow—and expand as needed. Whether you&rsquo;re automating documentation, reports, or meal planning, the patterns remain the same: identify repetitive tasks, build focused automations, and let the system handle the tedious parts.</p>
]]></content:encoded></item></channel></rss>