渐进式API发现服务器

ProDisco是一个渐进式API发现服务器框架,通过索引TypeScript库API并提供沙箱执行环境,帮助开发者动态发现和使用库功能。适用于Kubernetes管理、数据分析等多种场景。

  • by harche
  • TypeScript
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 harche/ProDisco

使用说明

ProDisco(渐进式披露MCP服务器)

ProDisco是一个 渐进式披露MCP服务器框架:您提供一个TypeScript库列表,ProDisco为它们的API建立索引以供发现,沙盒只执行使用这些库的代码。它遵循Anthropic的 渐进呈现 模式:MCP服务器公开搜索工具,代理发现这些工具来编写代码,在沙箱中执行代码,只有最终的控制台输出返回给代理。

Kubernetes/可观察性只是一个例子 配置(参见 examples/).您同样可以围绕AWS/GCP SDK、Postgres客户端、内部TypeScript SDK等构建MCP服务器。

注意:ProDisco更喜欢从TypeScript声明文件中索引API(.d.ts).如果图书馆不发货 .d.ts,ProDisco可以退回到索引 ESM JavaScript 导出(尽力而为;类型默认为 any).不支持仅包含CommonJS的JavaScript包,不支持键入。

演示用例(可选):

  • Kubernetes访问 通过 @kubernetes/client-node
  • 普罗米修斯指标 通过 @prodisco/prometheus-client
  • 洛基原木 通过 @prodisco/loki-client
  • 分析 通过 simple-statistics

建筑

每个MCP客户端会话都有自己的隔离沙盒CRD(Kata-VM),每个会话都有gRPC连接、空闲超时清理和最大会话限制。看 docs/grpc-sandbox-architecture.md 了解详情。


目录


为什么是渐进式披露?

Anthropic的最新指南解释了为什么MCP服务器应该逐步显示功能,而不是将每个工具定义都转储到模型上下文中。当代理探索TypeScript模块的文件系统时,它们只加载所需的内容,并在执行环境中处理数据,然后向聊天返回简洁的结果。这使令牌使用率保持较低水平,改善了延迟,并避免了通过模型复制大型中间有效载荷(来源).

ProDisco更进一步:它提供了一个结构化的参数搜索工具,使用TypeScript AST解析从上游库中动态提取方法,而不是公开自定义TypeScript模块。这意味着:

  • 零维护 -方法直接从库中提取 .d.ts 文件
  • 始终为最新 -升级依赖关系会自动暴露新方法
  • 类型安全 -包括完整的参数类型和返回类型

快速开始

添加到克劳德代码

Kubernetes+可观察性:

curl -O https://raw.githubusercontent.com/harche/ProDisco/main/examples/prodisco.kubernetes.yaml
claude mcp add ProDisco --env KUBECONFIG="${HOME}/.kube/config" -- npx -y @prodisco/mcp-server --config prodisco.kubernetes.yaml

PostgreSQL(内存测试):

curl -O https://raw.githubusercontent.com/harche/ProDisco/main/examples/prodisco.postgres.yaml
claude mcp add ProDisco -- npx -y @prodisco/mcp-server --config prodisco.postgres.yaml

如果需要,请删除:

claude mcp remove ProDisco

环境变量

变量 必填 描述
PRODISCO_CONFIG_PATH 否 库配置文件的路径(与 --config)
KUBECONFIG 否 (如果使用 @kubernetes/client-node)kubeconfig的路径(默认为 ~/.kube/config)
PROMETHEUS_URL 否 (如果使用 @prodisco/prometheus-client)Prometheus服务器URL
LOKI_URL 否 (如果使用 @prodisco/loki-client)洛基服务器URL

重要提示: 运行前导出环境变量 claude mcp addThe --env 标志可能无法可靠地将变量传递给MCP服务器进程。

提示: 如果您正在使用kind集群进行本地测试,则可以将其移植到Prometheus:

kubectl port-forward -n monitoring svc/prometheus-server 9090:80

然后设置 PROMETHEUS_URL="http://localhost:9090"

开发设置

对于当地发展:

git clone https://github.com/harche/ProDisco.git
cd ProDisco
npm install
npm run build
claude mcp add --transport stdio prodisco -- node dist/server.js
claude mcp remove prodisco # remove when you're done

启动选项:

标志 描述
--clear-cache 启动前清除脚本缓存
--config <path> 要索引/允许的YAML/JSON配置列表库的路径
--transport <mode> 运输方式: stdio (默认)或 http
--host <host> 要绑定的HTTP主机(默认值: 127.0.0.1)
--port <port> HTTP端口(默认值: 3000,暗示 --transport http)
node dist/server.js --clear-cache

动态库配置

ProDisco可以通过一个配置文件启动,该文件确定哪些npm包是:

  • 已编入索引 通过 prodisco.searchTools
  • 允许 在沙盒中通过 require() (与索引保持同步)

看 examples/ 用于即用型配置(Kubernetes、PostgreSQL等)。

示例 prodisco.config.yaml:

libraries:
  - name: "@kubernetes/client-node"
    description: "Kubernetes API client"
  - name: "@prodisco/prometheus-client"
    description: "Prometheus queries + metric discovery"
  - name: "@prodisco/loki-client"
    description: "Loki LogQL querying"
  - name: "simple-statistics"
    description: "Statistics helpers"

从配置文件开始:

node dist/server.js --config prodisco.config.yaml

缺少的软件包会自动安装到 .cache/deps 在启动时。

环境变量:

变量 描述
PRODISCO_CONFIG_PATH YAML/JSON配置列表库的路径

从配置构建Docker镜像

如果你想要已经包含配置库的映像(用于单独部署MCP和沙盒),你可以直接从同一个配置文件构建它们:

npm run docker:build:config -- --config prodisco.config.yaml

这将构建:

  • prodisco/mcp-server:<configSha8> 使用根 Dockerfile
  • prodisco/sandbox-server:<configSha8> 使用 packages/sandbox-server/Dockerfile

您可以覆盖图像名称/标签:

npm run docker:build:config -- --config prodisco.config.yaml --tag dev --mcp-image myorg/prodisco-mcp --sandbox-image myorg/prodisco-sandbox

HTTP传输

ProDisco支持基于网络的MCP连接的HTTP传输,支持远程访问和容器化部署。

以HTTP模式启动:

# HTTP mode on default port (3000)
node dist/server.js --transport http

# HTTP mode on custom port
node dist/server.js --port 8080

# HTTP mode on all interfaces (for network access)
node dist/server.js --host 0.0.0.0 --port 3000

环境变量:

变量 默认值 描述
MCP_TRANSPORT stdio 运输方式(stdio 或 http)
MCP_HOST 127.0.0.1 要绑定的HTTP主机
MCP_PORT 3000 要侦听的HTTP端口

HTTP端点:

端点 方法 描述
/health GET 健康检查,返回 {"status":"ok"}
/mcp POST MCP JSON-RPC端点(可流式HTTP)

示例:使用curl连接

# Health check
curl http://localhost:3000/health

# Initialize MCP session
curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}'

# Use session ID from response header for subsequent requests
curl -X POST http://localhost:3000/mcp \
  -H "Content-Type: application/json" \
  -H "mcp-session-id: <session-id-from-init>" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'

HTTP传输使用MCP SDK StreamableHTTPServerTransport,通过以下方式支持会话管理 mcp-session-id 用于流式响应的标头和服务器发送事件(SSE)。


可用工具

ProDisco公开了两个工具:

prodisco.search工具

搜索和浏览提取的API文档 启动配置的TypeScript库 (从 .d.ts).使用它来发现正确的方法/类型/函数签名 之前 召唤 prodisco.runSandbox.

文档类型:

类型 描述
method 从配置的库中提取的类方法/实例API
type TypeScript类型(接口/类/枚举/类型别名)
function 独立导出功能
script 缓存的沙盒脚本
all 搜索上面的所有内容(默认)

示例:

// Search broadly by name (methods/types/functions/scripts)
// Replace the placeholders with terms relevant to your configured libraries.
{ methodName: "<search-term>" }

// Filter by document type (methods/types/functions/scripts)
{ methodName: "<search-term>", documentType: "method" }

// Find Loki query methods
{ documentType: "method", library: "@prodisco/loki-client", category: "query" }

// Find Prometheus methods
{ methodName: "executeRange", library: "@prodisco/prometheus-client" }

// Find analytics functions
{ documentType: "function", library: "simple-statistics" }

// Search cached scripts
{ documentType: "script", methodName: "deployment" }

// Get TypeScript type definitions (classes/interfaces/enums/type aliases)
{ methodName: "<type-or-class-name>", documentType: "type" }

// Exclude certain categories/libraries
{ methodName: "query", exclude: { categories: ["delete"], libraries: ["some-library"] } }

有关综合文档,请参阅 docs/search-tools.md.

prodisco.run沙盒

在沙盒环境中使用相同的方法执行TypeScript代码 配置库列表 作为 prodisco.searchTools.

执行模式:

模式 目的 关键参数
execute (默认) 阻止执行 code 或 cached, timeout
stream 实时输出流 code 或 cached, timeout
async 后台执行 code 或 cached, timeout
status 检查异步执行 executionId, wait, outputOffset
cancel 取消运行执行 executionId
list 列出正在执行的操作 states, limit

沙盒环境:

  • console -捕获的输出(日志、错误、警告、信息)
  • require() -仅限于已配置的npm包(及其子路径)
  • process.env -环境变量

示例:

// Execute code (default mode)
{
  code: `
    const k8s = require("@kubernetes/client-node");
    const kc = new k8s.KubeConfig();
    kc.loadFromDefault();

    const api = kc.makeApiClient(k8s.CoreV1Api);
    const pods = await api.listNamespacedPod("default");
    console.log(\`Found \${pods.body.items.length} pods\`);
  `
}

// Run a cached script
{ cached: "script-2025-01-01T12-00-00-abc123.ts" }

// Stream mode - real-time output
{ mode: "stream", code: "for(let i=0; i<5; i++) console.log(i)" }

// Async mode - start long-running task
{ mode: "async", code: "longRunningTask()" }

// Check async execution status
{ mode: "status", executionId: "abc-123", wait: true }

// Cancel a running execution
{ mode: "cancel", executionId: "abc-123" }

// Query Prometheus metrics
{
  code: `
    const { PrometheusClient, MetricSearchEngine } = require('@prodisco/prometheus-client');
    const client = new PrometheusClient({ endpoint: process.env.PROMETHEUS_URL });

    // Discover metrics semantically
    const search = new MetricSearchEngine(client);
    const metrics = await search.search("memory usage");
    console.log('Found metrics:', metrics.map(m => m.name));

    // Execute PromQL query
    const end = new Date();
    const start = new Date(end.getTime() - 60 * 60 * 1000);
    const result = await client.executeRange('node_memory_MemAvailable_bytes', { start, end, step: '1m' });
    console.log(\`Got \${result.data.length} time series\`);
  `
}

// Query Loki logs
{
  code: `
    const { LokiClient } = require('@prodisco/loki-client');
    const client = new LokiClient({ baseUrl: process.env.LOKI_URL });
    const result = await client.queryRange('{namespace="default"}', { since: '1h', limit: 100 });
    result.logs.forEach(log => console.log(\`[\${log.timestamp.toISOString()}] \${log.line}\`));
  `
}

有关架构的详细信息,请参阅 docs/grpc-sandbox-architecture.md.


高级分析

ProDisco超越了简单的资源获取,它提供 统计分析、机器学习和信号处理 深度集群可观测性的能力。

可用库:

图书馆 目的
simple-statistics 平均值、中位数、标准偏差、z评分、百分位数、线性回归、相关性
ml-regression 趋势预测的多项式、指数和幂回归
mathjs 矩阵运算、线性代数、符号数学
fft-js 用于检测周期性模式的快速傅里叶变换

示例提示:

用例 提示
日志分析 “查询Loki上一小时nginx应用程序的错误日志。显示最常见的错误模式。”
群集运行状况 分析所有Pod的CPU和内存使用情况。计算平均值、中位数、标准偏差,并使用z分数识别异常值。显示高于第95百分位的Pod
内存渗漏体 “检查内存泄漏。获取超过2小时的内存使用情况,并使用线性回归来识别内存增加的Pod。”
异常检测 “分析网络流量并检测异常。查找与正常值相差2个标准差以上的接收/传输速率。”
相关性 “查找CPU和内存使用率之间的相关性。告诉我高CPU是否与高内存相关。”
周期性模式 “在节点CPU上使用FFT分析来检测周期性模式。是否有表明计划作业的主频率?”
容量规划 “分析资源趋势,并使用多项式回归来预测何时可能达到资源极限。”

有关代码和输出的详细示例,请参阅 docs/analytics.md.


高级部署

集装箱隔离

为了加强隔离,请在Kubernetes集群中运行沙盒服务器并通过TCP连接。

1.部署沙盒服务器:

# Build and load the image (for kind clusters)
docker build -f packages/sandbox-server/Dockerfile -t prodisco/sandbox-server:latest .
kind load docker-image prodisco/sandbox-server:latest

# Deploy
kubectl apply -f packages/sandbox-server/k8s/deployment.yaml

# Port-forward to access locally
kubectl -n prodisco port-forward service/sandbox-server 50051:50051

2.配置MCP服务器使用TCP:

export KUBECONFIG="${HOME}/.kube/config"
export SANDBOX_USE_TCP=true
export SANDBOX_TCP_HOST=localhost
export SANDBOX_TCP_PORT=50051
claude mcp add --transport stdio prodisco -- node dist/server.js --config examples/prodisco.kubernetes.yaml

运输环境变量:

变量 默认值 描述
SANDBOX_USE_TCP false 使用TCP而不是本地子进程
SANDBOX_TCP_HOST localhost 沙盒服务器主机
SANDBOX_TCP_PORT 50051 沙盒服务器端口

传输安全(TLS/mTLS)

对于生产部署,沙盒服务器支持TLS和双向TLS(mTLS):

模式 描述
insecure 无加密(默认,用于本地开发)
tls 服务器端TLS(客户端验证服务器身份)
mtls 双向TLS(客户端和服务器都进行身份验证)

配置:

# Server-side TLS
export SANDBOX_TRANSPORT_MODE=tls
export SANDBOX_TLS_CERT_PATH=/path/to/server.crt
export SANDBOX_TLS_KEY_PATH=/path/to/server.key

# Client-side (MCP server)
export SANDBOX_TRANSPORT_MODE=tls
export SANDBOX_TLS_CA_PATH=/path/to/ca.crt

对于Kubernetes部署,使用证书管理器自动化证书管理。看 k8s/证书管理器 即用清单目录。

有关完整的体系结构和安全详细信息,请参阅 docs/grpc-sandbox-architecture.md.


测试

集成测试

使用KIND集群+Cloud-Agent SDK进行端到端测试:

npm run test:integration

有关详细的测试说明,请参阅 docs/集成测试.md.


其他文件

文档 描述
docs/analytics.md 高级分析指南 -异常检测、预测、相关性、FFT分析
docs/search-tools.md 完整的searchTools参考,包括示例和技术架构
示例/README.md 实例+可运行的库配置文件(examples/*.yaml)
docs/grpc-sandbox-architecture.md 沙盒架构、gRPC协议和安全配置
docs/集成测试.md 集成测试工作流程和容器测试

许可证

麻省理工学院