MCP适用于Olama
一个MCP(模型上下文协议)服务器,通过本地网络公开Ollama模型可调用的工具。NET 10,旨在通过流式HTTP传输与OpenWebUI集成。
特性
- 可流式HTTP传输 --网络可访问的MCP服务器,无需stdio网桥
- OpenWebUI集成 --通过“管理面板”>“设置”>“外部工具”直接连接
- 依赖注入 --工具是带有构造函数注入服务的实例类
- 结构化日志记录 --带有控制台、文件和序列接收器的Serilog
- 健康终点 --快速可达性检查
/health
可用工具
| 工具 | 说明 |
|---|---|
generate_random_number | 生成一个介于最小值和最大值之间的随机数。默认值为1-100。 |
get_temperatures | 获取所有Netatmo气象站和模块的当前温度和湿度读数。需要一次性设置OAuth2。 |
get_historical_data | 获取特定模块/房间在可配置时间段(最多30天)内的历史温度和湿度。自动选择时间刻度并提供最小/最大/平均摘要。 |
技术栈
- .NET 10 C
- 模型上下文协议。AspNetCore v0.9.0预览版。1
- Serilog (控制台、文件、序列)
- xUnit v3 用于测试
入门指南
先决条件
- .NET 10 SDK (10.0.103或更高版本)
- 序列 (可选,用于集中查看日志)
- Netatmo开发者应用程序 (适用于Netatmo天气工具)
构建与运行
# Build
dotnet build
# Run the server (listens on http://0.0.0.0:5000)
dotnet run --project src/MCPForOllama.Server
# Run tests
dotnet test验证
# Health check
curl http://localhost:5000/health
# Returns: {"status":"healthy","service":"MCPForOllama"}从OpenWebUI连接
Docker注意事项: 如果OpenWebUI在Docker中运行,请使用host.docker.internal而不是localhost.
- 打开 管理面板>设置>外部工具
- 点击 + 添加新连接
- 填写:
- 连接类型: MCP流式HTTP - 网址: http://host.docker.internal:5000/mcp (Docker)或 http://localhost:5000/mcp (本地) - 认证: 无 - 身份证件: mcpforollama - 姓名: MCPForOllama - 访问权限: 所有用户
- 点击 保存,然后单击 刷新图标 在URL旁边验证连接
- 在模型的 高级参数,set 函数调用 到
Native
推荐型号:qwen2.5,qwen3,mistral-nemo--这些工具具有可靠的工具调用支持。llama3.1可能会产生幻觉,而不是调用工具结果。
重要提示: 重启服务器或更换工具后,始终 开始新的聊天。旧聊天会缓存过时的工具定义,可能无法正确调用更新的工具。
有关详细的分步测试说明,请参阅 docs/LOCAL-TESTING.md.
Netatmo天气设置
Netatmo工具(get_temperatures 和 get_historical_data)从Netatmo气象站读取温度和湿度。它们需要一次性的OAuth2设置。
1.创建Netatmo应用程序
- 首选 dev.netatmo.com/apps 并登录
- 创建新应用程序
- 将重定向URI设置为
http://localhost:5000/netatmo/callback - 注意你的 客户端ID 和 客户端密钥
2.存储凭据
dotnet user-secrets set "Netatmo:ClientId" "YOUR_CLIENT_ID" --project src/MCPForOllama.Server
dotnet user-secrets set "Netatmo:ClientSecret" "YOUR_CLIENT_SECRET" --project src/MCPForOllama.Server3.授权
- 启动服务器:
dotnet run --project src/MCPForOllama.Server - 打开
http://localhost:5000/netatmo/auth在浏览器中 - 登录Netatmo并授予访问权限
- 您将看到一条成功消息——令牌存储在
netatmo-tokens.json
令牌会自动刷新。只有当刷新令牌过期时(通常是在长时间不活动之后),您才需要重复此操作。
日志记录
服务器使用 Serilog 对于具有三个水槽的结构化测井:
| 水槽 | 描述 |
|---|---|
| 控制台 | 带有时间戳、级别、服务名称和源上下文的结构化输出 |
| 文件 | 每日滚动日志 logs/mcpforollama-YYYYMMDD.log 保留7天 |
| 序列 | 将结构化事件发送到 序列 服务器在 http://localhost:5341 |
所有日志记录配置都在 appsettings.json.Seq API密钥(如果需要)通过存储。NET用户机密:
dotnet user-secrets set "Serilog:WriteTo:2:Args:apiKey" "YOUR_SEQ_API_KEY" --project src/MCPForOllama.Server防火墙
如果在Ubuntu上部署时ufw处于活动状态:
sudo ufw allow 5000/tcp在Windows上,如果防火墙阻止连接:
netsh advfirewall firewall add rule name="MCPForOllama" dir=in action=allow protocol=TCP localport=5000添加新工具
在中创建新类 src/MCPForOllama.Server/Tools/:
using System.ComponentModel;
using ModelContextProtocol.Server;
namespace MCPForOllama.Server.Tools;
[McpServerToolType]
public class MyNewTool(ILogger logger)
{
[McpServerTool, Description("Describe what this tool does.")]
public string DoSomething(
[Description("Describe the parameter.")] string input)
{
logger.LogInformation("DoSomething invoked with input={Input}", input);
return $"Result: {input}";
}
}重要提示: 始终返回 string 来自工具方法——OpenWebUI期望来自MCP工具的字符串结果。
然后在中注册 Program.cs:
builder.Services
.AddMcpServer()
.WithHttpTransport()
.WithTools()
.WithTools();项目结构
MCPForOllama/
├── MCPForOllama.slnx
├── global.json
├── docs/
│ └── LOCAL-TESTING.md
├── src/
│ └── MCPForOllama.Server/
│ ├── MCPForOllama.Server.csproj
│ ├── Program.cs
│ ├── appsettings.json
│ ├── Properties/launchSettings.json
│ ├── Models/
│ │ ├── NetatmoSettings.cs
│ │ ├── NetatmoTokens.cs
│ │ ├── NetatmoStationData.cs
│ │ └── NetatmoMeasureData.cs
│ ├── Services/
│ │ ├── INetatmoTokenStore.cs
│ │ ├── FileNetatmoTokenStore.cs
│ │ ├── INetatmoApiService.cs
│ │ └── NetatmoApiService.cs
│ └── Tools/
│ ├── RandomNumberTool.cs
│ └── NetatmoWeatherTool.cs
└── tests/
└── MCPForOllama.Server.Tests/
├── MCPForOllama.Server.Tests.csproj
├── Services/
│ ├── FileNetatmoTokenStoreTests.cs
│ └── NetatmoApiServiceTests.cs
└── Tools/
├── RandomNumberToolTests.cs
└── NetatmoWeatherToolTests.cs作者
- 公司: Berrevoets 系统
- 作者 贝尔特 Berrevoets
- 联系人: bert@berrevoets.net
许可证
此项目用于个人/教育用途。
