持久任务集成工具

一个使用Durable Task SDK与Durable Task Scheduler后端实现MCP任务规范的原型工具,用于构建可靠、可观察的长期运行工具。

  • by cgillum
  • C#
  • 本地部署
  • 更新于
在 GitHub 查看 cgillum/durabletask-dotnet-mcp

使用说明

持久任务MCP集成

一个原型实现 MCP任务规范 使用 持久任务SDK。网 随着 持久任务调度程序(DTS) 作为后端。

概述

本项目桥梁 MCP任务 和 持久任务 编排,启用 MCP服务器开发人员构建由持久任务支持的可靠、可观察、长时间运行的工具 调度程序。MCP工具映射到持久任务编排或活动,以及框架 自动处理所有协议细节。

为什么是持久任务?

  • 可靠性 --任务状态在DTS中持久保存。编排自动恢复 服务器重新启动后,不会丢失进度。
  • 可观测性 --内置 DTS仪表板 提供实时可见性 将任务执行历史、时间线、输入/输出和故障详细信息。
  • 可扩展性 --DTS是一种独立于MCP服务器扩展的托管服务。
  • 丰富的执行模型 --简单的单活动工具和复杂的多步骤编排 在人类参与的情况下,所有这些都使用相同的编程模型。

运作原理

MCP Client ──► MCP Server (.NET)
                    │
               IMcpTaskStore
                    │
              DurableTaskMcpTaskStore ◄── maps MCP lifecycle to orchestrations
                    │
               DurableTaskClient
                    │
              ┌─────┴──────┐
              │    DTS     │  (Emulator or Azure)
              └────────────┘

每个MCP工具都通过以下方式注册 WithDurableTaskTool<T>() 获取内部 包装编排器 处理MCP协议问题(TTL、状态报告、启发)。用户的编排器 或者活动在这个包装器内运行,因此开发人员编写没有MCP的简单持久任务代码 样板。

概念图

MCP任务概念 持久任务概念
任务ID 业务流程实例ID
任务生命周期 编排生命周期
working Pending 或 Running
input_required Running +自定义状态
completed Completed
failed Failed
cancelled Terminated
任务状态消息 自定义状态
激励 WaitForExternalEvent +自定义状态
TTL 持久定时器逻辑
列出任务 列出编排
取消任务 终止业务流程

编程模型

将编排和活动注册为MCP工具,每个工具只需一行代码:

// Program.cs
builder.Services.AddDurableTaskClient(b => b.UseDurableTaskScheduler(connectionString));

builder.Services.AddDurableTaskWorker(b =>
{
    b.UseDurableTaskScheduler(connectionString);
    b.AddTasks(tasks =>
    {
        tasks.AddOrchestrator<PurchaseOrderOrchestrator>();
        tasks.AddActivity<ValidateOrderActivity>();
        tasks.AddActivity<ProcessItemsActivity>();
    });
});

builder.Services.AddMcpServer(options => { /* ... */ })
    .AddDurableTaskMcpTaskStore()
    .WithDurableTaskTool<PurchaseOrderOrchestrator>()  // registers as MCP tool
    .WithTools<ApprovalTools>()                         // regular tools work too
    .WithHttpTransport();

编排器使用标准的持久任务API和MCP扩展方法来处理状态和 启发:

[McpDurableTaskTool(Name = "purchase_order")]
[Description("Submit a purchase order. Orders over $1,000 require approval.")]
public class PurchaseOrderOrchestrator : TaskOrchestrator<PurchaseOrderInput, string>
{
    public override async Task<string> RunAsync(
        TaskOrchestrationContext context, PurchaseOrderInput input)
    {
        context.SetMcpStatus("Validating order...");
        await context.CallActivityAsync<bool>(nameof(ValidateOrderActivity), input);

        if (input.Amount > 1000)
        {
            // Pauses the task and sets status to "input_required"
            var decision = await context.WaitForMcpInputAsync<ApprovalDecision>(
                $"Approve order for ${input.Amount}?");
            if (!decision.Approved)
                return "Order rejected.";
        }

        context.SetMcpStatus("Processing items...");
        await context.CallActivityAsync<int>(nameof(ProcessItemsActivity), input.ItemCount);
        return "Order completed.";
    }
}

样品

两个样本都暴露了相同的两个工具(process_data 和 purchase_order)并演示 完整的MCP任务生命周期,包括人工在环审批。每个示例README包括 使用测试的分步说明 MCP检查员.

样品 运输 描述
StreamableHttpServer 流式HTTP ASP。NET Core MCP服务器 http://localhost:5000
标准服务器 stdio MCP客户端作为子进程启动的控制台应用程序

先决条件

快速开始

# 1. Start the DTS emulator
docker run -d -p 8080:8080 -p 8082:8082 mcr.microsoft.com/dts/dts-emulator:latest

# 2. Run a sample
dotnet run --project samples/StreamableHttpServer

然后按照示例的README获取测试说明。

配置

从以下位置读取DTS连接字符串 DurableTask:ConnectionString 在配置中 (appsettings.json 或环境变量 DurableTask__ConnectionString).

环境 连接字符串
本地仿真器 Endpoint=http://localhost:8080;TaskHub=default;Authentication=None
Azure DTS Endpoint=https://<name>.westus2.durabletask.io;TaskHub=default;Authentication=DefaultAzure

项目结构

├── src/Microsoft.DurableTask.Mcp/     # Core library (NuGet package)
│   ├── DurableTaskMcpTaskStore.cs     # IMcpTaskStore implementation
│   ├── DurableTaskMcpServerTool.cs    # Custom McpServerTool
│   ├── McpToolWrapperOrchestrator.cs  # Internal wrapper orchestrator
│   ├── McpDurableTaskToolAttribute.cs # [McpDurableTaskTool] attribute
│   ├── McpOrchestrationExtensions.cs  # SetMcpStatus / WaitForMcpInputAsync
│   ├── ServiceCollectionExtensions.cs # DI registration
│   └── StatusMapping.cs              # Orchestration → MCP status mapping
├── samples/
│   ├── StreamableHttpServer/          # Streamable HTTP sample
│   └── StdioServer/                   # stdio sample
├── tests/
│   └── Microsoft.DurableTask.Mcp.Tests/
└── docs/
    ├── PRD.md                         # Product Requirements Document
    ├── design.md                      # Technical Design (V1)
    ├── DesignV2.md                    # Simplified Programming Model (V2)
    └── spec-feedback.md               # MCP Task Spec feedback

文档

文档 描述
产品需求文档 产品要求、场景和成功标准
设计V1 原始技术设计 IMcpTaskStore 整合
设计V2 简化 WithDurableTaskTool<T>() 程序设计模型
规格反馈 对MCP任务规范的观察和反馈

许可证

麻省理工学院