时区管理工具

McpTimeTools是一个基于.NET 8的MCP服务器,提供时区感知的时间管理功能,支持获取UTC时间和全球多个城市的本地时间。

  • by LouisGheysensCodit
  • C#
  • 本地部署
  • 更新于
在 GitHub 查看 LouisGheysensCodit/McpTimeTools

使用说明

McpTimeTools

用于跨多个城市和时区进行当前和本地时间管理的模型上下文协议(MCP)服务器。

??概述

McpTimeTools是一个。NET 8 MCP服务器,提供时区感知时间实用程序。它支持检索全球各个城市的当前UTC时间和当地时间,并具有可扩展的架构,用于添加自定义城市时区映射。

?特点

  • 当前UTC时间:获取UTC格式的当前时间
  • 城市当地时间:检索预定义城市的当地时间
  • 可扩展时区映射:添加或更新自定义城市时区映射
  • 稳健的错误处理:用于清除错误诊断的自定义异常类型
  • 类型安全:使用C#12和可以为null的引用类型构建
  • 依赖注入:现代。支持DI的NET模式
  • 经过全面测试:全面的单元测试覆盖率

默认支持的城市

  • 坎昆 (America/Cancun)
  • 墨西哥城 (America/Mexico_City)
  • 纽约 (America/New_York)
  • 伦敦 (Europe/London)
  • 东京 (Asia/Tokyo)

??入门

先决条件

安装

克隆存储库:

git clone https://github.com/LouisGheysensCodit/McpTimeTools.git
cd McpTimeTools/src/McpTimeServer

构建

dotnet build

跑

dotnet run

运行测试

dotnet test

??使用方法

MCP工具

服务器公开了以下MCP工具:

GetCurrentTime

获取当前UTC时间。

退货:当前UTC时间 yyyy-MM-dd HH:mm:ss 格式

示例:

2024-01-15 14:30:45

GetLocalTime

获取指定城市的本地时间。

参数:

  • city (string):城市名称

退货:带有城市名称、当地时间和时区ID的格式化字符串

示例:

Tokyo: 2024-01-15 23:30:45 (Asia/Tokyo)

程序化使用

// Create a timezone provider
var timeZoneProvider = new TimeZoneProvider();

// Get timezone ID for a city
var timezoneId = timeZoneProvider.GetTimeZoneId("London");
// Returns: "Europe/London"

// Try to get timezone ID
if (timeZoneProvider.TryGetTimeZoneId("Paris", out var tz))
{
    Console.WriteLine($"Timezone: {tz}");
}

// Add a custom city
timeZoneProvider.AddOrUpdateCity("Paris", "Europe/Paris");

// Get all available cities
var cities = timeZoneProvider.GetAvailableCities();

GetAvailableCityNames

获取所有可用城市名称的逗号分隔列表。

参数:

  • sortOrder (CitySortOrder,可选):指定城市的排序方式。
    默认为 Alphabetical (A–Z)。可能值:
    • None --按插入顺序返回城市
    • Alphabetical --升序(A-Z)
    • AlphabeticalDescending --下降(Z-A)

退货:
以逗号分隔的城市名称列表,或 "No cities configured." 如果不存在。

示例: 坎昆、伦敦、墨西哥城、纽约、东京

备注:

  • 适用于轻量级的城市列表或填充客户端的下拉菜单。
  • 投掷 InvalidCitySortOrderException 如果提供了不受支持的排序顺序。

建筑

项目结构

McpTimeServer/
??? Program.cs                          # Application entry point
??? TimeTools.cs                        # MCP tool implementations
??? ITimeZoneProvider.cs                # Timezone provider interface
??? TimeZoneProvider.cs                 # Timezone provider implementation
??? Exceptions/
?   ??? TimeZoneException.cs            # Base exception
?   ??? InvalidCityException.cs         # Invalid city name exception
?   ??? InvalidTimeZoneIdException.cs   # Invalid timezone ID exception
?   ??? CityNotFoundException.cs        # City not found exception
??? McpTimeServer.Tests/
    ??? TimeToolsTests.cs               # TimeTools unit tests
    ??? TimeZoneProviderTests.cs        # TimeZoneProvider unit tests

关键组件

  • TimeTools:提供时间相关操作的MCP服务器工具类
  • ITimeZoneProvider:时区映射操作界面
  • TimeZoneProvider:默认使用预定义的城市
  • 自定义例外:特定于域的异常,以更好地处理错误

异常层次结构

Exception
??? TimeZoneException (abstract base)
    ??? InvalidCityException
    ??? InvalidTimeZoneIdException
    ??? CityNotFoundException
    ??? InvalidCitySortOrderException

技术

  • .NET 8:目标框架
  • C#12:具有现代功能的语言版本
  • 奥拉玛夏普。模型上下文协议:MCP服务器实现
  • 微软。扩展。托管:托管基础设施
  • x单位:测试框架

??测试

该项目包括全面的单元测试,包括:

  • ?有效和无效的城市查找
  • ?不区分大小写的城市匹配
  • ?自定义异常情况
  • ?可用城市检索
  • ?城市地图更新
  • ?边缘情况(null、空、空白)

测试覆盖率22次测试,全部通过?

??示例

自定义异常的错误处理

try
{
    var tz = provider.GetTimeZoneId("InvalidCity");
}
catch (CityNotFoundException ex)
{
    Console.WriteLine($"City '{ex.CityName}' not found!");
    Console.WriteLine($"Available: {string.Join(", ", ex.AvailableCities)}");
}
catch (InvalidCityException ex)
{
    Console.WriteLine($"Invalid city name: {ex.CityName}");
}

添加自定义城市

var provider = new TimeZoneProvider();

// Add a new city
provider.AddOrUpdateCity("Berlin", "Europe/Berlin");
provider.AddOrUpdateCity("Sydney", "Australia/Sydney");

// Use the new cities
var berlinTime = provider.GetTimeZoneId("Berlin");

??贡献

欢迎投稿!请随时提交拉取请求。

  1. 分叉存储库
  2. 创建功能分支(git checkout -b feature/AmazingFeature)
  3. 提交您的更改(git commit -m 'Add some AmazingFeature')
  4. 推到分支(git push origin feature/AmazingFeature)
  5. 打开拉取请求

作者

路易斯·盖森斯

??致谢


如果你觉得这个项目有用,请考虑给它一颗星!