<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Krithika</title>
    <description>The latest articles on DEV Community by Krithika (@thatcaffeinateddev).</description>
    <link>https://dev.to/thatcaffeinateddev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4060210%2F1e923a00-69b8-4131-bcf9-e15eabaacb7e.jpg</url>
      <title>DEV Community: Krithika</title>
      <link>https://dev.to/thatcaffeinateddev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thatcaffeinateddev"/>
    <language>en</language>
    <item>
      <title>5 Underrated MCP Features That Make AI Clients Smarter</title>
      <dc:creator>Krithika</dc:creator>
      <pubDate>Thu, 06 Aug 2026 05:14:12 +0000</pubDate>
      <link>https://dev.to/thatcaffeinateddev/5-underrated-mcp-features-that-make-ai-clients-smarter-1d9k</link>
      <guid>https://dev.to/thatcaffeinateddev/5-underrated-mcp-features-that-make-ai-clients-smarter-1d9k</guid>
      <description>&lt;p&gt;Everyone's building MCP servers.&lt;/p&gt;

&lt;p&gt;Most conversations focus on transports, authentication, OAuth, and exposing tools. Those topics are important, but while building a few MCP servers recently, I found myself appreciating a different part of the specification that doesn't seem to get nearly as much attention.&lt;/p&gt;

&lt;p&gt;The interesting thing is that these aren't hidden APIs. They're already part of the Model Context Protocol specification or its official extensions.&lt;/p&gt;

&lt;p&gt;None of the features below change what your tool &lt;em&gt;does&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;They change how clearly a client can understand and interact with your server.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Tool Annotations
&lt;/h2&gt;

&lt;p&gt;This is the feature that inspired this post.&lt;/p&gt;

&lt;p&gt;MCP lets you describe a tool's behavior through annotations such as &lt;code&gt;readOnlyHint&lt;/code&gt;, &lt;code&gt;idempotentHint&lt;/code&gt;, &lt;code&gt;destructiveHint&lt;/code&gt;, and &lt;code&gt;openWorldHint&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"annotations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"readOnlyHint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"idempotentHint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"destructiveHint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"openWorldHint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of only telling a client &lt;em&gt;what&lt;/em&gt; a tool does, you're also telling it &lt;em&gt;how&lt;/em&gt; it behaves.&lt;/p&gt;

&lt;p&gt;A few examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;readOnlyHint&lt;/code&gt; indicates that the tool does not modify its environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;idempotentHint&lt;/code&gt; indicates that repeatedly calling a write tool with the same arguments has no additional effect on its environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;destructiveHint&lt;/code&gt; distinguishes potentially destructive updates from additive ones.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;openWorldHint&lt;/code&gt; indicates whether the tool may interact with an open world of external entities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a web search tool operates in an open world, while a tool that accesses a fixed local memory store operates in a closed domain.&lt;/p&gt;

&lt;p&gt;These may look like simple booleans, but they can give clients useful context when planning execution, presenting tools to users, or designing confirmation flows.&lt;/p&gt;

&lt;p&gt;There are a couple of details worth noting.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;idempotentHint&lt;/code&gt; and &lt;code&gt;destructiveHint&lt;/code&gt; are meaningful only for tools that are not read-only. Also, &lt;code&gt;destructiveHint: false&lt;/code&gt; means the tool performs only additive updates.&lt;/p&gt;

&lt;p&gt;Most importantly, these are &lt;strong&gt;hints&lt;/strong&gt;, not security guarantees. Clients should not make security-sensitive decisions based on annotations from untrusted servers. Authentication, authorization, user consent, and deterministic safeguards still matter.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://modelcontextprotocol.io/specification/2026-07-28/server/tools" rel="noopener noreferrer"&gt;MCP specification: Tools&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Structured Tool Results
&lt;/h2&gt;

&lt;p&gt;Many MCP tools still return only text.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Found 12 matching documents.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That works perfectly for humans.&lt;/p&gt;

&lt;p&gt;Clients often benefit from receiving the underlying data in a structured form too.&lt;/p&gt;

&lt;p&gt;MCP tools can return a JSON value through &lt;code&gt;structuredContent&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"structuredContent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"documents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"lastModified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The value does not have to be an object. It can be any valid JSON value, including an array, string, number, boolean, or null.&lt;/p&gt;

&lt;p&gt;Structured data can make it easier for clients to validate results, render interfaces, pass data into another workflow, or let models work with individual fields without parsing a natural-language response.&lt;/p&gt;

&lt;p&gt;For backward compatibility, the specification recommends also returning the serialized JSON in a regular text content block.&lt;/p&gt;

&lt;p&gt;One terminology distinction is useful here: MCP &lt;code&gt;structuredContent&lt;/code&gt; is a structured tool result. It is not the same thing as LLM structured output or schema-constrained model generation.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://modelcontextprotocol.io/specification/2026-07-28/server/tools#structured-content" rel="noopener noreferrer"&gt;MCP specification: Structured Content&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Output Schemas
&lt;/h2&gt;

&lt;p&gt;If you're returning structured data, tell clients what it looks like.&lt;/p&gt;

&lt;p&gt;When a client discovers tools through &lt;code&gt;tools/list&lt;/code&gt;, it receives each tool's &lt;code&gt;inputSchema&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A tool can also expose an &lt;code&gt;outputSchema&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search_documents"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"inputSchema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outputSchema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"documents"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"array"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"required"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"documents"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means the client can inspect the expected shape of &lt;code&gt;structuredContent&lt;/code&gt; before invoking the tool.&lt;/p&gt;

&lt;p&gt;If an output schema is defined, the server must return structured content that conforms to it. Clients are encouraged to validate the result.&lt;/p&gt;

&lt;p&gt;This can support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Response validation&lt;/li&gt;
&lt;li&gt;Typed integrations&lt;/li&gt;
&lt;li&gt;More predictable client-side handling&lt;/li&gt;
&lt;li&gt;Richer interfaces&lt;/li&gt;
&lt;li&gt;Clearer tool documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I like thinking of it this way:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Structured content tells clients what you returned. An output schema tells clients what to expect before you return it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The two features complement each other nicely.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://modelcontextprotocol.io/specification/2026-07-28/server/tools#output-schema" rel="noopener noreferrer"&gt;MCP specification: Output Schema&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Progress Reporting
&lt;/h2&gt;

&lt;p&gt;Not every operation finishes in a second.&lt;/p&gt;

&lt;p&gt;Think about indexing a repository, processing thousands of files, or running a large AI workflow.&lt;/p&gt;

&lt;p&gt;Without progress reporting, users may be left staring at a loading spinner with no indication that work is continuing.&lt;/p&gt;

&lt;p&gt;MCP supports optional progress notifications for long-running requests.&lt;/p&gt;

&lt;p&gt;When a client wants progress updates, it includes a unique &lt;code&gt;progressToken&lt;/code&gt; in the request metadata.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"_meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"progressToken"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index-repository-123"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server may then send &lt;code&gt;notifications/progress&lt;/code&gt; messages associated with that token.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"notifications/progress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"progressToken"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index-repository-123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"progress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Indexing repository"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server is not required to send progress notifications, even when the client supplies a token. If it does send them, the progress value must increase with each notification. The total is optional when the amount of work is unknown.&lt;/p&gt;

&lt;p&gt;Sometimes good UX isn't about making things faster.&lt;/p&gt;

&lt;p&gt;It's about making the waiting less mysterious.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://modelcontextprotocol.io/specification/2026-07-28/basic/patterns/progress" rel="noopener noreferrer"&gt;MCP specification: Progress&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Tasks
&lt;/h2&gt;

&lt;p&gt;Some operations should not keep a request open until the work is finished.&lt;/p&gt;

&lt;p&gt;MCP Tasks provide asynchronous execution for long-running operations such as CI pipelines, batch processing, external jobs, approval workflows, or model training.&lt;/p&gt;

&lt;p&gt;Tasks are an official MCP extension rather than part of the core protocol. Both the client and server must declare support for the extension.&lt;/p&gt;

&lt;p&gt;When a server decides that a supported request will be long-running, it can return a durable task handle instead of the final result.&lt;/p&gt;

&lt;p&gt;The client can then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receive a task identifier&lt;/li&gt;
&lt;li&gt;Poll the task using &lt;code&gt;tasks/get&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Resume polling after reconnecting&lt;/li&gt;
&lt;li&gt;Provide requested input through &lt;code&gt;tasks/update&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Request cancellation through &lt;code&gt;tasks/cancel&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Retrieve the final result when the task completes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tasks can also expose states such as &lt;code&gt;working&lt;/code&gt;, &lt;code&gt;input_required&lt;/code&gt;, &lt;code&gt;completed&lt;/code&gt;, &lt;code&gt;failed&lt;/code&gt;, and &lt;code&gt;cancelled&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Polling is the default mechanism. Servers may additionally provide task notifications when supported.&lt;/p&gt;

&lt;p&gt;This model is particularly useful when the underlying operation may outlive a network connection or pause while waiting for human input.&lt;/p&gt;

&lt;p&gt;📖 &lt;a href="https://modelcontextprotocol.io/extensions/tasks/overview" rel="noopener noreferrer"&gt;MCP Tasks extension&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;It's easy to think of MCP as a protocol for exposing tools.&lt;/p&gt;

&lt;p&gt;I think it's more than that.&lt;/p&gt;

&lt;p&gt;It's also a protocol for helping clients understand and operate those tools.&lt;/p&gt;

&lt;p&gt;A client that knows whether a tool modifies its environment, whether repeated calls have additional effects, what output shape to expect, how to consume structured data, and how to track longer-running work has much more context than one that receives only a name and description.&lt;/p&gt;

&lt;p&gt;That's the part I find fascinating.&lt;/p&gt;

&lt;p&gt;The protocol isn't just describing capabilities.&lt;/p&gt;

&lt;p&gt;It's also describing behavior and execution patterns.&lt;/p&gt;

&lt;p&gt;Some of these features take only a small amount of work to implement. Others, such as Tasks, require deeper support from both the client and server.&lt;/p&gt;

&lt;p&gt;Still, they are worth understanding because they can lead to more predictable integrations and a better experience for users.&lt;/p&gt;

&lt;p&gt;If you're building an MCP server today, it is worth spending a little extra time looking beyond tool names, descriptions, and input schemas.&lt;/p&gt;

&lt;p&gt;Your clients may understand your server better, and your users may get a more transparent and reliable experience because of it.&lt;/p&gt;

&lt;p&gt;I'd love to hear what other parts of MCP you think deserve more attention.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>programming</category>
      <category>agents</category>
    </item>
    <item>
      <title>Dosa Therapy: The Comfort of Butter, Batter &amp; Better Days</title>
      <dc:creator>Krithika</dc:creator>
      <pubDate>Thu, 06 Aug 2026 04:26:04 +0000</pubDate>
      <link>https://dev.to/thatcaffeinateddev/dosa-therapy-the-comfort-of-butter-batter-better-days-163n</link>
      <guid>https://dev.to/thatcaffeinateddev/dosa-therapy-the-comfort-of-butter-batter-better-days-163n</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2026-07-29"&gt;Frontend Challenge - Comfort Food Edition, Perfect Landing&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;Dosa Therapy&lt;/strong&gt;, a colorful and playful landing page that treats dosa less like a meal and more like an emotional support system.&lt;/p&gt;

&lt;p&gt;The idea came from how deeply comfort food is tied to mood. A crispy dosa, hot sambar, fresh chutney, and filter coffee can genuinely make a bad day feel slightly more manageable. So instead of creating a conventional restaurant landing page, I imagined a fictional therapy experience centered entirely around dosa.&lt;/p&gt;

&lt;p&gt;The page takes users through the different layers of the dosa experience, from the batter and rice varieties to sambar, chutneys, dosa personalities, and mood-based recommendations.&lt;/p&gt;

&lt;p&gt;Visually, I wanted the site to feel energetic, warm, and slightly chaotic in the best way. I avoided food photography and built the experience using bold geometric illustrations, expressive typography, vibrant colors, and playful animations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ayvgp1uh4yj8qblcokx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6ayvgp1uh4yj8qblcokx.png" alt="Dosa Therapy Landing Page" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🥞 &lt;strong&gt;Live Demo:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://dosatherapy.vercel.app" rel="noopener noreferrer"&gt;https://dosatherapy.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;Source Code:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/krxthx/dosa-therapy" rel="noopener noreferrer"&gt;https://github.com/krxthx/dosa-therapy&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Journey
&lt;/h2&gt;

&lt;p&gt;I began with a much simpler idea: a bright landing page about dosa. But while exploring the concept, I realized that simply presenting dosa varieties and ingredients felt too similar to a restaurant menu.&lt;/p&gt;

&lt;p&gt;That led to the idea of &lt;strong&gt;Dosa Therapy&lt;/strong&gt;, a playful wellness-inspired brand where every mood has a corresponding dosa prescription.&lt;/p&gt;

&lt;p&gt;One of the most important creative decisions was to use a fully illustrated visual style rather than realistic food images. I wanted the site to feel like its own tiny universe, with geometric dosas, animated chutney bowls, expressive ingredients, and sections that feel different while still belonging to the same visual system.&lt;/p&gt;

&lt;p&gt;I particularly enjoyed building the sections around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The anatomy of a comforting dosa meal&lt;/li&gt;
&lt;li&gt;Different rice varieties used in dosa batter&lt;/li&gt;
&lt;li&gt;Sambar and chutney as essential supporting characters&lt;/li&gt;
&lt;li&gt;Popular dosa variants with their own personalities&lt;/li&gt;
&lt;li&gt;Mood-based dosa recommendations&lt;/li&gt;
&lt;li&gt;A filter coffee-inspired ending to complete the experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most challenging part was balancing all the colors, illustrations, typography, and movement without making the page feel visually overwhelming. I spent a lot of time adjusting spacing, section transitions, responsive layouts, and animation timing so the experience would still feel intentional.&lt;/p&gt;

&lt;p&gt;I am especially proud that the final result does not look like a generic food landing page. It feels playful, culturally familiar, and very specifically about the joy of eating dosa.&lt;/p&gt;

&lt;p&gt;Given more time, I would love to add a more interactive “Find Your Dosa” experience, richer scroll-based animations, and additional regional dosa varieties.&lt;/p&gt;

&lt;p&gt;Because sometimes the solution is not deep breathing.&lt;/p&gt;

&lt;p&gt;Sometimes it is dosa.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
