Fused MCP Agents
Official
by fusedio
# Fused MCP Agents: Setting up MCP Servers for Data Scientists
MCP servers allow Claude & other LLMs to make HTTP requests, connecting them to APIs & executable code. We built this repo for ourselves & other data scientists to easily pass _any_ Python code directly to your own desktop Claude app.
This repo offers a simple step-by-step notebook workflow to setup [MCP Servers](https://modelcontextprotocol.io/introduction) with Claude's Desktop App, all in Python built on top of Fused [User Defined Functions](https://docs.fused.io/core-concepts/write/) (UDFs).

## Requirements
- Python 3.11
- Latest [Claude Desktop app](https://claude.ai/download) installed (MacOS & Windows)
If you're on Linux, the desktop app isn't available so [we've made a simple client](#using-a-local-claude-client-without-claude-desktop-app) you can use to have it running locally too!
You do _not_ need a Fused account to do any of this! All of this will be running on your local machine.
## Installation
- Clone this repo in any local directory, and navigate to the repo:
```bash
git clone https://github.com/fusedio/fused-mcp.git
cd fused-mcp/
```
- Install [`uv`](https://docs.astral.sh/uv/getting-started/installation/)
if you don't have it:
Macos / Linux:
```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
```
Windows:
```
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
```
- Test out the client by asking for its info:
```bash
uv run main.py -h
```
- Start by following our getting-started notebook [`fused_mcp_agents.ipynb`](fused_mcp_agents.ipynb) in your favorite local IDE to get set up and then make your way to the more advanced notebook to [make your own Agents & functions](create_your_own_agents.ipynb)

## Repository structure
This repo is build on top of [MCP Server](https://modelcontextprotocol.io/introduction) & [Fused UDFs](https://docs.fused.io/core-concepts/write/) which are Python functions that can be run from anywhere.
## Support & Community
Feel free to join our [Discord server](https://discord.com/invite/BxS5wMzdRk) if you want some help getting unblocked!
Here are a few common steps to debug the setup:
- Running `uv run main.py -h` should return something like this:

- You might need to pass global paths to some functions to the `Claude_Desktop_Config.json`. For example, by default we only pass `uv`:
```json
{
"mcpServers": {
"qgis": {
"command": "uv",
"args": ["..."]
}
}
}
```
But you might need to pass the full path to `uv`, which you can simply pass to `common.generate_local_mcp_config` in the notebook:
```python
# in fused_mcp_agents.ipynb
import shutil
common.generate_local_mcp_config(
config_path=PATH_TO_CLAUDE_CONFIG,
agents_list = ["get_current_time"],
repo_path= WORKING_DIR,
uv_path=shutil.which('uv'),
)
```
Which would create a config like this:
```json
{
"mcpServers": {
"qgis": {
"command": "/Users/<YOUR_USERNAME>/.local/bin/uv",
"args": ["..."]
}
}
}
```
- If Claude runs without showing any connected tools, take a look at the [MCP Docs for troubleshooting the Claude Desktop setup](https://modelcontextprotocol.io/quickstart/server#claude-for-desktop-integration-issues)
## Contribute
Feel free to open PRs to add your own UDFs to `udfs/` so others can play around with them locally too!
## Using a local Claude client (without Claude Desktop app)
If you are unable to install the Claude Desktop app (e.g., on Linux), we provide
a small example local client interface to use Claude with the MCP server configured
in this repo:
NOTE: You'll need an API key for Claude here as you won't use the Desktop App
- Create an [Anthropic Console Account](https://console.anthropic.com/)
- Create an [Anthropic API Key](https://console.anthropic.com/settings/keys)
- Create a `.env`:
```bash
touch .env
```
- Add your key as `ANTHROPIC_API_KEY` inside the `.env`:
```
# .env
ANTHROPIC_API_KEY = "your-key-here"
```
- Start the MCP server:
```bash
uv run main.py --agent get_current_time
```
- In another terminal session, start the local client, pointing to the address of the server:
```bash
uv run client.py http://localhost:8080/sse
```