原型 · 预览版:收录官方注册中心里的全部服务器,每 30 分钟同步一次。评价和账户功能将在后续阶段推出。
PopNx MCP为使用 AI 的人准备的 MCP 服务器 · 用大白话讲清楚

OtlpDashboard

作者:Adiakys版本 26.11i★ –i在你的电脑上运行
注册名称io.github.Adiakys/otlpdashboard

安装

概览

作者提供的说明(英文原文)

Query OpenTelemetry logs, traces and metrics from a self-hosted OTLP dashboard

PopNx MCP 的三大支柱

这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。

它能帮你做什么

我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。

  • 连接方式: 在你的电脑上运行
  • 传输方式: Streamable HTTP
  • 分类: 开发者工具
  • 你需要填写:Dashboard__Mcp__Enabled, DASHBOARD__BROWSERTOKEN

安装

选择你使用的 AI 应用,然后复制设置。

安装之前

  • 基础检查:1 项中通过 1 项
  • 在你的电脑上运行,拥有你的用户账户的权限(文件、网络、应用)。
  • 需要你自己填写: Dashboard__Mcp__Enabled, DASHBOARD__BROWSERTOKEN

标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。

你需要

你用的是哪个应用?

在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。

打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json

{
  "mcpServers": {
    "otlpdashboard": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "Dashboard__Mcp__Enabled",
        "-e",
        "DASHBOARD__BROWSERTOKEN",
        "ghcr.io/adiakys/otlpdashboard:26.11"
      ],
      "env": {
        "Dashboard__Mcp__Enabled": "your-value",
        "DASHBOARD__BROWSERTOKEN": "your-value"
      }
    }
  }
}

在终端中运行这条命令

claude mcp add otlpdashboard --env Dashboard__Mcp__Enabled=your-value --env DASHBOARD__BROWSERTOKEN=your-value -- docker run -i --rm -e Dashboard__Mcp__Enabled -e DASHBOARD__BROWSERTOKEN ghcr.io/adiakys/otlpdashboard:26.11

运行前请先填写空着的值。

在 Cursor 中打开

或者自己复制设置

粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json

{
  "mcpServers": {
    "otlpdashboard": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "Dashboard__Mcp__Enabled",
        "-e",
        "DASHBOARD__BROWSERTOKEN",
        "ghcr.io/adiakys/otlpdashboard:26.11"
      ],
      "env": {
        "Dashboard__Mcp__Enabled": "your-value",
        "DASHBOARD__BROWSERTOKEN": "your-value"
      }
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

在 VS Code 中打开

或者自己复制设置

粘贴到项目中的 .vscode/mcp.json

{
  "servers": {
    "otlpdashboard": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "Dashboard__Mcp__Enabled",
        "-e",
        "DASHBOARD__BROWSERTOKEN",
        "ghcr.io/adiakys/otlpdashboard:26.11"
      ],
      "env": {
        "Dashboard__Mcp__Enabled": "your-value",
        "DASHBOARD__BROWSERTOKEN": "your-value"
      }
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。

你的选择通过 Cookie 保存在这台设备上,无需账户。

需要你填写的值

  • Dashboard__Mcp__Enabled 必填 env
    Mounts the MCP server at /mcp
  • DASHBOARD__BROWSERTOKEN 机密 env
    Bearer token for the web app, read API and MCP endpoint. Leave empty for open access

这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。

它能做什么

它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。

基础检查i

我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月9日

  • ✓ 通过

    作者与仓库一致

    注册名称已通过 GitHub 账户 Adiakys 验证,该账户拥有此仓库

  • … 尚未检查

    仍在维护

    我们还没有从 GitHub 读取这个仓库

  • … 尚未检查

    有许可证

    我们还没有从 GitHub 读取这个仓库

  • – 不适用

    端点有响应

    它在你的电脑上运行,没有互联网端点

  • – 不适用

    使用 OAuth 登录

    在你的电脑上运行,改用本地设置

  • … 尚未检查

    工具描述中没有隐藏指令

    它在你的电脑上运行;我们只能读取互联网端点的工具列表

与“开发者工具”中的其他服务器比较i

  • 星标数多于此分类中其他 5570 个服务器的 0%
  • 发布到注册中心的时间比此分类中其他 5570 个服务器的 73% 更新
  • 基础检查结果等于或优于此分类中其他 5570 个服务器的 100%

与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。

常见问题

OtlpDashboard 安全吗?

它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。

它需要哪些密钥或代码?

你需要填写:Dashboard__Mcp__Enabled, DASHBOARD__BROWSERTOKEN

它在我的电脑上运行还是在云端?

它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。

它还在维护吗?

GitHub 仓库最后更新于–,最新版本(26.11)于7天前进入注册中心。

哪些应用可以使用它?

支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Docker。

有什么可以替代它?

同一分类中有:GitHub, Desktop Commander, Cloudflare MCP

替代选择

同一分类中其他作者的服务器,按星标数排序。

如何看卡片:↓ 每周下载量i★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i

GitHub

Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.

作者:github广泛使用★ 3.4万6天前更新

电脑或云端

Desktop Commander

MCP server for terminal commands, file operations, and process management

作者:wonderwhy-er广泛使用↓ 71万/周★ 1万18天前更新

在你的电脑上运行

Cloudflare MCP

Cloudflare MCP servers

作者:cloudflare广泛使用★ 444614个月前更新

在云端运行✓ mcp.cloudflare.com

作者的 README

打开 README

按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。

OpenTelemetry Dashboard

"Grafana was overwhelming, while Aspire was lacking."

This dashboard is the "just right" middle ground: a lightweight, self-hosted OTLP receiver and viewer designed for those who need professional observability without the setup fatigue.

A self-hosted OTLP receiver and viewer for traces, logs, and metrics. .NET 10 + EF Core backend, Vue 3 / Nuxt 4 SPA. Stores telemetry in SQLite, PostgreSQL, or SQL Server. Speaks OTLP gRPC on :4317 and OTLP HTTP/Protobuf on :4318 (the same port also serves the SPA).

Website: adiakys.github.io/OtlpDashboard

Live demo: adiakys.github.io/OtlpDashboard/demo — static build with mock telemetry, no backend required. Login accepts any password (e.g. demo).

The demo runs against an in-browser mock backend (a tiny TS shim

that intercepts every API call and returns generated DTOs) — not the

real .NET host. It exists to let people click around without us

hosting anything; behaviour can drift from the real server in subtle

ways (some flows are stubbed, some validation paths return generated

data instead of real errors). For a faithful preview run the docker

compose stack below.


Quick start

Docker — full demo stack

The bundled docker-compose.yml starts the dashboard against Postgres plus a small demo workload (sample-server + sample-client + the OpenTelemetry Collector) that pushes traces, logs, and metrics so the dashboard isn't empty on first boot:

docker compose up --build

OTLP gRPC : localhost:4317

OTLP HTTP : localhost:4318

SPA : http://localhost:4318

Sources for the demo workload live under demo/ — sample app (Server / Client), the built-in widget-library pack (demo/packs/default/, distributed as a separate repo and consumed via git submodule), the demo-stack starter dashboard (demo/packs/default-dashboard/), and the Collector config. To run only the dashboard against an external Postgres / SQL Server, strip the demo services from your override file and point Dashboard__Storage__Provider + ConnectionStrings__* at your DB.

Local dev (no Docker)
# Backend

dotnet run --project src/OpenTelemetryDashboard.Host

Frontend (separate terminal, hot-reload, proxies /api to :4318)

cd web && pnpm install && pnpm dev

The backend runs migrations on every boot, so the SQLite file appears at ./src/OpenTelemetryDashboard.Host/data/telemetry.db on first run.


Configuration

All settings live under Dashboard:* in appsettings.json and can be overridden by environment variables using double underscores (e.g. Dashboard__BrowserToken).

Auth tokens

Two static bearer tokens gate the surface:

VariableProtects
DASHBOARD__BROWSERTOKENThe SPA + read API (/api/v1/...) + MCP (/mcp)
DASHBOARD__OTLP__APIKEYOTLP ingestion (gRPC + HTTP)

Auth is opt-in per surface, identically in Development and Production:

  • Set a token → that surface requires it.
  • Leave a token empty → that surface is public (allow-all). Leaving DASHBOARD__BROWSERTOKEN empty also makes the SPA skip the login screen (/api/v1/info reports requireAuth: false), so the dashboard opens straight away — convenient for a local Docker / Docker Compose run.

Either unset token surfaces as Degraded on /healthz (in any environment) and is logged at startup, so an open deployment is visible rather than silent.

The SPA's /login form exchanges the password for an HttpOnly + SameSite=Strict session cookie via POST /api/v1/auth/login; JS never sees the token after the exchange. POST /api/v1/auth/logout clears the cookie. OTLP clients send the API key as Authorization: Bearer or as the x-otlp-api-key header.

Retention (max days)

Background job that drops rows older than the configured age. Defaults target a "debug + recent forensics" workload — logs hold a month so last-week incidents stay investigable; traces and metrics rotate weekly because high-cardinality spans and split-by metric attributes inflate fast.

"Dashboard": {

"TelemetryLimits": { "MaxLogDays": 30, // default "MaxTraceDays": 7, // default "MaxMetricDays": 7, // default "SweepIntervalMinutes": 60 } }

Or via env vars:

Dashboard__TelemetryLimits__MaxLogDays=30

DashboardTelemetryLimitsMaxTraceDays=7 DashboardTelemetryLimitsMaxMetricDays=7 DashboardTelemetryLimitsSweepIntervalMinutes=60

A value of 0 disables retention for that signal (records are kept indefinitely) — /healthz then reports Degraded so an unbounded window can't hide silently. The sweep runs each SweepIntervalMinutes per signal independently — a failure on one kind doesn't stop the others.

Storage provider
Dashboard__Storage__Provider=Sqlite        # default

ConnectionStrings__Sqlite="Data Source=/app/data/telemetry.db"

DashboardStorageProvider=PostgreSql ConnectionStrings__PostgreSql="Host=...;Database=telemetry;Username=...;Password=..."

DashboardStorageProvider=SqlServer ConnectionStrings__SqlServer="Server=...;Database=telemetry;User Id=...;Password=...;TrustServerCertificate=True"

On PostgreSQL backed by SSD storage, set random_page_cost = 1.1 (the default of 4 assumes spinning disks). Trace list filters look up the spans of a few recent traces by trace_id; with the default cost the planner prefers scanning the whole time window instead, which is several times slower:

ALTER DATABASE telemetry SET random_page_cost = 1.1;

MCP server (read-only)

An optional Model Context Protocol server exposes the same data as the read API (logs, traces, metrics) so an LLM client — Claude Code, Claude Desktop, MCP Inspector, etc. — can query the dashboard directly. Disabled by default; set the flag to mount it:

Dashboard__Mcp__Enabled=true

Mounted at /mcp on the same port as the SPA (:4318) over Streamable HTTP, gated by the same browser bearer token (DASHBOARD__BROWSERTOKEN) that protects /api/v1/*. Tools exposed:

ToolMirrors
query_logsGET /api/v1/logs
list_log_servicesGET /api/v1/logs/services
query_tracesGET /api/v1/traces
get_traceGET /api/v1/traces/{traceId}
list_trace_servicesGET /api/v1/traces/services
list_metricsGET /api/v1/metrics
query_metric_pointsGET /api/v1/metrics/points
list_metric_servicesGET /api/v1/metrics/services

Wire it into Claude Code by dropping a .mcp.json at your project root:

{

"mcpServers": { "otel-dashboard": { "type": "http", "url": "http://localhost:4318/mcp", "headers": { "Authorization": "Bearer ${DASHBOARD_BROWSER_TOKEN}" } } } }

Built on the official ModelContextProtocol.AspNetCore SDK (jointly maintained by Anthropic and Microsoft).


Widgets

Dashboards are made of widgets dropped onto a 12-column grid. Three sources:

  • `std` — built into the bundle (Stat, Line, Sparkline, Gauge, Bar gauge, Pie, Heatmap, Recent traces, Top traces, Logs stream, Text).
  • `custom` — preset of a builtin saved by the user, persisted in the DB.
  • ` ` — read-only widgets shipped by an installed library (filesystem or installed from a Git repo).

The picker dialog (+ Add widget while editing a dashboard) shows all three groups in the same modal. The search box filters by name, description, *or* source — type std, custom, or a library id to filter a whole bucket.

Custom legend labels

Line, Pie, Bar gauge and Heatmap widgets label their series, slices, bars or rows with the metric's attributes (Line adds the metric name when it shows several), which can get long. To shorten them, open the widget's config drawer and fill the Legend field (one per selected metric on Line). Use {attribute} to insert an attribute value, e.g. Requests {http.request.method} renders as Requests POST. Leave it empty to keep the default label. In pack JSON the same value is the legend field of the metric binding.

Creating a custom widget
  1. Open a dashboard, click Edit, add a builtin widget.
  2. Configure it (metric binding, thresholds, range, …).
  3. In the config drawer click Save as widget, give it a name, icon, and default size.

It now appears in the picker under My widgets, with inline edit and delete buttons that show on hover.

Notes:

  • The seed config is captured *at save time* — editing the template later changes only metadata (name, description, icon, default size). The seed config is immutable; clone + delete to change it.
  • Existing dashboard instances of a deleted custom widget render a placeholder, not a crash.
Packs (widget libraries + dashboards)

Everything that can ship with the dashboard — widget libraries, built-in dashboards, and any future asset type — is distributed as a pack: a single directory with pack.json at its root. The dashboard scans every entry in Dashboard:Packs:Paths (in order) and surfaces every pack's contents in the picker (libraries) and dashboard list (built-ins).

The shipped image already configures two paths in scan order:

  1. /app/data/packs — runtime-managed (volume, git installs, drag-and-drop)
  2. /app/builtin-packs — baked into the image layer (no volume shadowing on rebuild)

Derived images don't need to set any environment variable — just COPY into the second path:

FROM opentelemetrydashboard:latest

COPY my-pack/ /app/builtin-packs/my-pack/

When two paths expose packs with the same pack.json#id, the first in scan order wins and the rest are skipped with a warning — so a runtime install can override a baked-in default by sharing its id.

Two sample packs live under demo/packs/:

  • default/ (a submodule pointing at Adiakys/OtlpDashboard-default-pack) ships the .NET and PostgreSQL widget libraries.
  • default-dashboard/ ships the starter dashboard pre-bound to the demo compose stack.

Both are bind-mounted by docker-compose.yml, so docker compose up --build shows libraries + starter dashboard out of the box.

Install one of two ways:

  1. Drop a folder. Copy the pack into the packs path (volume-mount, Ansible, etc.). Click the refresh icon in the widget picker (or POST /api/v1/packs/reload) to re-scan.
  2. Install from a Git repo. Click the git-branch icon in the picker header (or POST /api/v1/packs/install with { url, ref, path? }). The server runs a shallow clone via LibGit2Sharp, parses pack.json, resolves HEAD to a commit SHA, and atomically moves the directory into the runtime-managed root. Allowed hosts are Dashboard:Packs:AllowedGitHosts (default github.com, gitlab.com). Use a tag for stable pinning; branches work but get a UI warning. The optional path parameter re-roots the install on a sub-directory, useful for monorepos that ship multiple packs side by side. Updates: the "Update" button on git-installed packs re-pulls the same ref (fetch && reset --hard).
Pack layout
my-pack/

├── pack.json ├── README.md (optional — surfaced in the UI) ├── LICENSE (optional) ├── libraries/ │ ├── core/ │ │ ├── manifest.json │ │ └── widgets/ │ │ ├── sla-tracker/

只显示了开头部分;其余内容请在仓库中阅读

问 PopNx