Skip to main content

MCP resources–The piece everyone overlooks

I think it is hard to miss the buzz around the Model Context Protocol (MCP), the so-called USB-C for AI apps. What I noticed is that the main focus is on tools. GitHub integration tools, file system tools, API tools—the list goes on. Tools are powerful, they're exciting, and they let AI agents take action in your development environment.

But the protocol exposes 2 other types of primitives what almost nobody talks about: Resources and Prompts.

And that's a shame, because both might be underrated in the entire MCP specification.

My goal of this post is to give at least MCP Resources the attention it deserves. Let’s dive in!

The tools-only tunnel vision

When Anthropic released MCP, the developer community immediately gravitated toward tools. It makes sense—tools are action-oriented and flashy. They let your AI agent create GitHub issues, run terminal commands, and interact with APIs. That's the kind of capability that makes for great demos.

But MCP wasn't designed around tools alone. The protocol defines three core primitives that work together:

  1. Tools - Model-controlled actions with side effects
  2. Resources - Application-controlled context and data
  3. Prompts - User-controlled interaction workflows

Most tutorials, articles, and examples focus exclusively on tools, treating MCP as if it's just a fancy function-calling protocol. This misses the bigger picture entirely.

What are MCP resources?

Think of resources as context providers for your AI conversations. While tools let the AI do things, resources let the AI know things.

Resources in MCP are any data that can provide context to language models:

  • Files and directory structures
  • Database schemas and table contents
  • API documentation and specifications
  • Application logs (potentially with real-time updates)
  • Configuration files
  • Design assets and specifications
  • Really, any structured or unstructured data your AI might need to reference

Each resource is uniquely identified by a URI (like file:///project/readme.md or db://users/schema) and can include metadata like a human-readable name, description, and MIME type.

Why resources matter

Here's the key insight: AI agents need context just as much as they need capabilities.

Imagine asking Claude to help debug your application. With tools alone, Claude could:

  • Execute code
  • Run tests
  • Query your database

But without resources, Claude would be flying blind. It wouldn't have access to:

  • Your application logs showing the actual error
  • Your database schema to understand the data structure
  • Your API documentation to know what endpoints exist
  • Your configuration files to see how things are set up

Resources bridge this gap. They give Claude the information it needs to make informed decisions before taking action.

Resources vs Tools: When to use what

The distinction is actually quite elegant:

Use resources when:

  • Providing read-only context and information
  • Sharing reference materials (docs, schemas, specs)
  • Exposing data that changes over time (logs, metrics)
  • Giving AI access to your knowledge base
  • You want the user/application to control what's shared

Use tools when:

  • Performing actions with side effects
  • Creating, updating, or deleting data
  • Executing commands or running processes
  • Triggering external API calls
  • You want the AI model to decide when to act

Think of it this way: resources are like giving someone a library card, tools are like giving them a set of keys.

Real-world resource examples?

Here is a sad reality, I checked some of the most popular MCP servers available at MCP Registry but most of them don't expose resources. 

After some further digging, I discovered that the Github MCP server exposes the repo content through MCP resource templates:

What's next

I only scratched the surface on MCP resources. So I have planned to write some follow-up posts where we'll explore:

  • How to use resources in VS Code and Visual Studio
  • Building your own MCP resource server from scratch
  • Advanced features like templates, subscriptions, and binary resources

MCP resources are not used a lot in the wild but I want to dig deeper…

More information

Resources - Model Context Protocol

Popular posts from this blog

Azure DevOps/ GitHub emoji

I’m really bad at remembering emoji’s. So here is cheat sheet with all emoji’s that can be used in tools that support the github emoji markdown markup: All credits go to rcaviers who created this list.

Kubernetes–Limit your environmental impact

Reducing the carbon footprint and CO2 emission of our (cloud) workloads, is a responsibility of all of us. If you are running a Kubernetes cluster, have a look at Kube-Green . kube-green is a simple Kubernetes operator that automatically shuts down (some of) your pods when you don't need them. A single pod produces about 11 Kg CO2eq per year( here the calculation). Reason enough to give it a try! Installing kube-green in your cluster The easiest way to install the operator in your cluster is through kubectl. We first need to install a cert-manager: kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.5/cert-manager.yaml Remark: Wait a minute before you continue as it can take some time before the cert-manager is up & running inside your cluster. Now we can install the kube-green operator: kubectl apply -f https://github.com/kube-green/kube-green/releases/latest/download/kube-green.yaml Now in the namespace where we want t...

Podman– Command execution failed with exit code 125

After updating WSL on one of the developer machines, Podman failed to work. When we took a look through Podman Desktop, we noticed that Podman had stopped running and returned the following error message: Error: Command execution failed with exit code 125 Here are the steps we tried to fix the issue: We started by running podman info to get some extra details on what could be wrong: >podman info OS: windows/amd64 provider: wsl version: 5.3.1 Cannot connect to Podman. Please verify your connection to the Linux system using `podman system connection list`, or try `podman machine init` and `podman machine start` to manage a new Linux VM Error: unable to connect to Podman socket: failed to connect: dial tcp 127.0.0.1:2655: connectex: No connection could be made because the target machine actively refused it. That makes sense as the podman VM was not running. Let’s check the VM: >podman machine list NAME         ...