Token导航 LogoToken导航TokenDH.com
Fs MCP (Neftedollar) logo
AI代理未说明官方级别未说明来源级核验

Fs MCP (Neftedollar)

MCP Server

FsMcp是一个用于构建模型上下文协议(MCP)服务器和客户端的F#工具包,提供类型安全和零样板代码的开发体验。

工具数

0

提示词数

0

GitHub Stars

11

资源数

0
服务器构建类型安全ClaudeClaude

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

作者 / 组织

Neftedollar

提供方

Neftedollar

最后核验

2026/5/17 20:20

快速接入

先看主来源和安装命令,再打开仓库或文档;下面只保留这个条目的关键接入事实。

详细介绍

FsMcp

![CI](https://github.com/Neftedollar/FsMcp/actions) ![NuGet](https://www.nuget.org/packages/FsMcp.Server) ![License: MIT](LICENSE) ![Docs](https://neftedollar.github.io/FsMcp/)

type GreetArgs = { name: string; greeting: string option }

let server = mcpServer {
    name "MyServer"
    version "1.0.0"

    tool (TypedTool.define "greet" "Greets a person" (fun args -> task {
        let greeting = args.greeting |> Option.defaultValue "Hello"
        return Ok [ Content.text $"{greeting}, {args.name}!" ]
    }) |> unwrapResult)

    useStdio
}

Server.run server |> fun t -> t.GetAwaiter().GetResult()
// Input schema auto-generated: name=required, greeting=optional

安装

dotnet add package FsMcp.Server     # server builder + stdio transport
dotnet add package FsMcp.Client     # typed client wrapper
dotnet add package FsMcp.Testing    # test helpers + FsCheck generators
dotnet add package FsMcp.TaskApi    # FsToolkit.ErrorHandling pipeline
dotnet add package FsMcp.Server.Http  # HTTP/SSE transport (opt-in ASP.NET)
dotnet add package FsMcp.Sampling   # LLM sampling from server tools

为什么是FsMcp?

  • mcpServer { } CE --在单个块中声明工具、资源和提示
  • TypedTool.define --F#记录作为输入,JSON模式通过TypeShape自动生成
  • Result --预期路径中没有异常,到处都是键入错误
  • 智能建设者ToolName.create 在构建时验证,而不是在运行时验证
  • 可组合中间件 --通过以下方式记录、验证、遥测 Middleware.pipeline
  • 322测试 --对每种域类型进行Expecto+FsCheck属性测试

快速开始

带键入工具的服务器

open FsMcp.Core
open FsMcp.Core.Validation
open FsMcp.Server

type CalcArgs = { a: float; b: float }

let server = mcpServer {
    name "Calculator"
    version "1.0.0"

    tool (TypedTool.define "add" "Add two numbers" (fun args -> task {
        return Ok [ Content.text $"{args.a + args.b}" ]
    }) |> unwrapResult)

    tool (TypedTool.define "divide" "Divide a by b" (fun args -> task {
        if args.b = 0.0 then return Error (TransportError "Division by zero")
        else return Ok [ Content.text $"{args.a / args.b}" ]
    }) |> unwrapResult)

    useStdio
}

Server.run server |> fun t -> t.GetAwaiter().GetResult()

HTTP传输

dotnet add package FsMcp.Server.Http
open FsMcp.Server.Http

HttpServer.run server (Some "/mcp") "http://localhost:3001"
|> fun t -> t.GetAwaiter().GetResult()

客户

open FsMcp.Core.Validation
open FsMcp.Client

let demo () = task {
    let config = {
        Transport = ClientTransport.stdio "dotnet" ["run"; "--project"; "../Calculator"]
        Name = "TestClient"
        ShutdownTimeout = None
    }
    let! client = McpClient.connect config
    let! tools = McpClient.listTools client

    let toolName = ToolName.create "add" |> unwrapResult
    let args = Map.ofList [
        "a", System.Text.Json.JsonDocument.Parse("10").RootElement
        "b", System.Text.Json.JsonDocument.Parse("20").RootElement
    ]
    let! result = McpClient.callTool client toolName args
    // result : Result
}

测试

open FsMcp.Testing

// Direct handler invocation — no network, no process spawning
let result =
    TestServer.callTool serverConfig "add"
        (Map.ofList ["a", jsonEl 10; "b", jsonEl 20])
    |> Async.AwaitTask |> Async.RunSynchronously

result |> Expect.mcpHasTextContent "30" "addition works"

建筑

┌─────────────────────────────────────────────────────────────────┐
│                        Your F# Code                             │
│   mcpServer { tool ...; resource ...; prompt ... }              │
├──────────────┬──────────────────────────────┬───────────────────┤
│ FsMcp.Server │       FsMcp.Core             │   FsMcp.Client    │
│              │                              │                   │
│ CE builder     Types (DUs, records)         │ Typed wrapper     │
│ TypedHandlers  Validation (smart ctors)     │ Async module      │
│ Middleware     Serialization (JSON)          │                   │
│ Streaming      Interop (internal)           │                   │
│ Telemetry                                   │                   │
├──────────────┴──────────────────────────────┴───────────────────┤
│              Microsoft ModelContextProtocol SDK                  │
├─────────────────────────────────────────────────────────────────┤
│                      .NET 10 Runtime                            │
└─────────────────────────────────────────────────────────────────┘

包裹

包装它的作用
FsMcp。核心域类型、智能构造函数、JSON序列化
FsMcp。服务器mcpServer { } CE、类型化处理程序、中间件、stdio传输
FsMcp。服务器。超文本传输协议通过ASP进行HTTP/SSE传输。NET Core(选择加入)
FsMcp。客户键入客户端 Result
FsMcp。测试TestServer.callTool, Expect.mcp*,FsCheck发电机
FsMcp。TaskApitaskResult { } 通过FsToolkit的管道。错误处理
FsMcp。采样通过MCP采样进行服务器端LLM调用

特性

  • 键入工具处理程序TypedTool.define 使用TypeShape驱动的JSON模式+缓存
  • 嵌套CEmcpTool { toolName "..."; typedHandler ... }
  • 流媒体工具StreamingTool.defineIAsyncEnumerable
  • 通知ContextualTool.define 带有进度+日志回调
  • 验证中间件 --在处理程序之前根据架构自动验证参数
  • 遥测Telemetry.tracing() (活动/OTel)+ MetricsCollector
  • 热重载DynamicServer.addTool / removeTool 在运行时
  • 错误处理FsToolkit.ErrorHandling 整合通过 FsMcp.TaskApi

构建与测试

dotnet build       # 7 packages
dotnet test        # 322 tests (Expecto + FsCheck)

stdio服务器的运行时调优

默认情况下。NET运行服务器GC,它是吞吐量优化的,不会主动将提交的堆页面返回给操作系统。对于空闲的stdio MCP服务器,这可能看起来像是内存泄漏——RSS在会话期间会增长,即使服务器安静,也会保持高位。一旦操作系统发出内存压力信号,运行时会立即释放内存,确认这是提交增长,而不是真正的泄漏。

设置这些环境变量以减少空闲RSS:

DOTNET_gcServer=0      # Workstation GC — returns memory at idle
DOTNET_gcConcurrent=1  # Concurrent collection — shorter pauses

docs/运行时调优.md 如需完整解释,请参阅MCP客户端配置示例(Claude Code、Codex) runtimeconfig.template.json 可再分发工具的代码片段,以及区分提交增长和实际泄漏的五分钟诊断配方。

示例

examples/ 对于可运行的MCP服务器:

  • EchoServer --echo+反向工具、资源、提示
  • 计算器 --加/减/乘/除
  • 文件服务器 --read_file、list_directory、file_info

设计原则

  1. 包裹,不要重新实施 --协议问题仍存在于Microsoft SDK中
  2. 成语F# --DU、结果、CE、管道友好型
  3. 类型安全性 --私人构造函数,否 obj 公开API
  4. 先测试 --Expecto+Fs检查每个功能
  5. 可组合 --中间件、函数处理程序、无继承

贡献

贡献.md欢迎提出问题和公关。

许可证

麻省理工学院

目录标签

目录标签

服务器构建类型安全ClaudeF#本地部署F#开发MCP协议零样板代码

支持客户端

Claude

接入字段

传输方式(transport,传输协议)

未说明

鉴权方式(authType,认证方式)

none

工具数量(toolCount,工具数)

0

资源数量(resourceCount,资源数)

0

提示词数量(promptCount,提示词数)

0

权限和风险

未说明none部署方式未说明

接入前请确认传输方式、认证方式和部署位置,并根据实际工具能力限制访问范围。

安装前确认

不要直接授予不必要的文件、网络或账号权限;先核对安装命令和配置内容。

仍需确认:installCommand

来源信息

继续浏览同类 MCP