Skip to main content
Glama
README.md
# Ollama MCP Demo

This demo shows how to create a custom MCP server to expose custom Python functions as tools. It also demonstrates how a custom MCP client class can be used to integrate the MCP server with Ollama. Both, the MCP server and Ollama are independent and can be run on different machines.

## Add Tools to your MCP Server

To add new tools to the MCP server, simply create Python functions in `mcp_server/tools`. Once created, add them to the `TOOLS` tuple in  `mcp_server/__main__.py` which is used to register them to the MCP server.

```Python
# mcp_server/__main__.py
from mcp_server.tools import echo
...
SERVER = FastMCP(name="custom-mcp-server", **SERVER_CONFIG)
TOOLS = (echo,)  # add functions here
...
```

## Running the MCP Server

1. (Optional) Configure the environments in the `docker-compose.yml` file (ports, ollama configs, ...).

2. Start the services. This spins up an Ollama instance and the MCP server.
    ```bash
    docker compose up -d
    ```

3. (Optional) To download ollama models once the containers are running, use
    ```bash
    docker compose exec ollama ollama pull <your model>
    ```

The Ollama server can then be accessed at `http://localhost:11434` and the MCP server at `http://localhost:7777/mcp` (replace ports with your configuration).

## MCP Client Usage

Install the dependencies used for the MCP client
```bash
uv sync
```

You can then use the `mcp_client.client.MCPClient` class to communicate with the MCP server like this:
```Python
from mcp_client.client import MCPClient

mcp_client = MCPClient(host="localhost", port=7777)

# list available tools
tools = await mcp_client.list_tools()
...

# call a tool
result = await mcp_client.call_tool(tool_name="some_tool", arguments={"some_arg": "value"})
...
```

Integrating it with Ollama can be done like so:
```Python
from mcp_client.client import MCPClient
from ollama import Client as OllamaClient

mcp_client = MCPClient(host="localhost", port=7777)
ollama_client = OllamaClient("http://localhost:11434")

# invoke llm
response = ollama_client.chat(
    model="qwen3:4b",
    messages=[{"role": "user", "content": "Echo this message 'Hi, Alice!'"}],
    tools=await mcp_client.list_tools(),
)

print(response.message.content)

# handle tool calls
if tool_calls := response.message.tool_calls:
    for tool_call in tool_calls:
        tool_name = tool_call.function.name
        arguments = tool_call.function.arguments
        print("Calling", tool_name, "with arguments", arguments)
        tool_result = await mcp_client.call_tool(tool_name, arguments)
        print("Result: ", tool_result)
```

## Helpful Links
- [MCP Docs](https://modelcontextprotocol.io/introduction)
- [Ollama Tool Calling](https://ollama.com/blog/tool-support)