GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
作者による説明(英語の原文)
Query OpenTelemetry logs, traces and metrics from a self-hosted OTLP dashboard
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
使っているAIアプリを選んで、設定をコピーしてください。
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/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"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
プロジェクトの .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に保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月8日にチェック
レジストリ名は、リポジトリを所有するGitHubアカウント Adiakys で確認済みです
このリポジトリはまだGitHubから読み取っていません
このリポジトリはまだGitHubから読み取っていません
これはパソコンで動くため、インターネット上のエンドポイントはありません
パソコンで動き、代わりにローカルの設定を使います
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
入力が必要なもの:Dashboard__Mcp__Enabled, DASHBOARD__BROWSERTOKEN
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
GitHubリポジトリの最終更新は–、最新バージョン(26.11)がレジストリに届いたのは6 日前です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにDockerも必要です。
同じカテゴリには:GitHub, Desktop Commander, Cloudflare MCP
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:↓ 週あたりのダウンロードi★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
"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.
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
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.
# Backend
dotnet run --project src/OpenTelemetryDashboard.Host
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.
All settings live under Dashboard:* in appsettings.json and can be overridden by environment variables using double underscores (e.g. Dashboard__BrowserToken).
Two static bearer tokens gate the surface:
| Variable | Protects |
|---|---|
DASHBOARD__BROWSERTOKEN | The SPA + read API (/api/v1/...) + MCP (/mcp) |
DASHBOARD__OTLP__APIKEY | OTLP ingestion (gRPC + HTTP) |
Auth is opt-in per surface, identically in Development and Production:
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.
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.
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;
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:
| Tool | Mirrors |
|---|---|
query_logs | GET /api/v1/logs |
list_log_services | GET /api/v1/logs/services |
query_traces | GET /api/v1/traces |
get_trace | GET /api/v1/traces/{traceId} |
list_trace_services | GET /api/v1/traces/services |
list_metrics | GET /api/v1/metrics |
query_metric_points | GET /api/v1/metrics/points |
list_metric_services | GET /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).
Dashboards are made of widgets dropped onto a 12-column grid. Three sources:
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.
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.
It now appears in the picker under My widgets, with inline edit and delete buttons that show on hover.
Notes:
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:
/app/data/packs — runtime-managed (volume, git installs, drag-and-drop)/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:
POST /api/v1/packs/reload) to re-scan.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).my-pack/
├── pack.json ├── README.md (optional — surfaced in the UI) ├── LICENSE (optional) ├── libraries/ │ ├── core/ │ │ ├── manifest.json │ │ └── widgets/ │ │ ├── sla-tracker/
冒頭だけを表示しています。続きはリポジトリで読めます