custom-mcp-server
by dakofler
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)
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues