# Unlocking the Power of MCP Servers on Linux: A Quickstart Guide

# What is MCP and why should I use it?

I spent this weekend exploring [MCP](https://modelcontextprotocol.io/introduction) (Model Context Protocol), a protocol that allows LLMs (Large Language Models) to interact with other systems. This means you can connect your LLM, like Claude, to your file system, for example. You can then instruct your LLM to "change all my file names with whitespace to underscores," and it will execute the commands on your system, making the actual changes. This enables you to use natural language to interact with the systems you're working with, potentially transforming how we engage with our systems.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1743944051890/7160d5af-438e-4a59-b232-c7ffce39347c.png align="center")

# How do I interact with MCP?

To interact with an MCP, you need a client that can communicate with an MCP server. See [here](https://modelcontextprotocol.io/clients#feature-support-matrix) for a matrix of supported clients. In this post, I will use Claude Desktop. Since I’m running Linux and there’s no officially supported version of Claude, I’m using the [unofficial desktop version](https://github.com/aaddrick/claude-desktop-debian) of Claude Desktop. *NB: Read and evaluate the code before you run it!*

# Adding an MCP server

After installing the desktop version, you can add your first MCP server. Our MCP server in this example will require npx. Check if you have it installed:

```plaintext
npx --version
```

If not, install it.

We will then add an [MCP server](https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem) to your Claude desktop config that interacts with your local file system:

```bash
vim .config/Claude/claude_desktop_config.json
```

Add the following:

```bash
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/home/oystein/Desktop",
        "/home/oystein/Downloads"
      ]
    }
  }
}
```

This list will specify the directories in which the LLM can operate. Replace `<myhomedir>` with the name of your home directory.

Restart Claude Desktop. You will now see a hammer with a number, indicating that you have MCP tools available:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1743941625175/946cf60e-79cc-4621-9025-955aebb37411.png align="center")

You can also select the “attach” button to the right of the hammer to see connected MCP servers:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1743941662817/9bbc38d0-bc95-4a76-af91-36d8978e840a.png align="center")

You can see that I have two file servers installed.

# Make changes to your local filesystem

You can now start interacting with Claude to make changes to your file system. Here, I ask it to create a script in my Desktop directory:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1743941924210/aa5a22ee-3842-45e3-af97-6d7c39e3aa46.png align="center")

You will have to confirm when it wants to execute commands on your system:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1743941773313/7ecd7b7e-c7ae-4262-b9fd-2449562665e8.png align="center")

Claude does its work:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1743941961783/d6c50e96-5852-439f-b804-ebbd4f19af11.png align="center")

And to confirm that it actually exists:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1743942050135/6023e03d-cd49-4b50-8f0a-d0fa776faa08.png align="center")

As you can see, the file now exists locally in my file system.

A very basic example, but full of potential. Let’s take it a bit further and see how we can interact with Azure DevOps.

# Interacting with Azure DevOps

In this example, I will use the [mcp-server-azure-devops](https://github.com/Tiberriver256/mcp-server-azure-devops) for interacting with Azure DevOps. Note: I recommend using this only in your personal lab Azure DevOps organization.

Start by adding the Azure DevOps MCP server to your Claude Desktop config:

```bash
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/home/oystein/Desktop",
        "/home/oystein/Downloads"
      ]
    },
    "azureDevOps": {
      "command": "npx",
      "args": ["-y", "@tiberriver256/mcp-server-azure-devops"],
      "env": {
        "AZURE_DEVOPS_ORG_URL": "https://dev.azure.com/<myorg>",
        "AZURE_DEVOPS_AUTH_METHOD": "pat",
        "AZURE_DEVOPS_PAT": "<redacted>",
        "AZURE_DEVOPS_DEFAULT_PROJECT": "Demo"
      }
    }
  }
}
```

Add your organization in `<myorg>` and your Azure DevOps PAT to `<redacted>`. I granted the PAT read access with write access to tasks.

Restart Claude and ask it to:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1743942453114/9f947815-9d07-4930-9cd3-ba36e604a051.png align="center")

It will start listing all tasks assigned to me and their states:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1743942494407/05e09bf2-a651-4a88-becb-34d56ad6f9e0.png align="center")

I can even add comments and close tasks:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1743943033419/dd3e03bd-8e75-4d98-9c87-81b891922d8a.png align="center")

# Conclusion

This was a quick introduction to the how and why of the MCP server. Even though it’s early, I believe this will significantly change our daily workflow, and it will be interesting to see what MCP server capabilities people will develop. However powerful it is, security departments will have a lot to monitor going forward, and the chance of user mistakes can increase since one can quickly select “yes” to all prompts asked by the LLM.
