SS

signoz/signoz-mcp-server

Analytics & monitoring
130 stars 48 forks Quality 89 Trend 36Apache-2.0

A Model Context Protocol (MCP) server that provides seamless access to SigNoz observability data through AI assistants and LLMs.

Overview

A Model Context Protocol (MCP) server that provides seamless access to SigNoz observability data through AI assistants and LLMs.

README

SigNoz MCP Server

A Model Context Protocol (MCP) server that provides seamless access to SigNoz observability data through AI assistants and LLMs. Query metrics, traces, logs, alerts, dashboards, and services using natural language.

📖 Full Documentation

Table of Contents

Connect to SigNoz Cloud

Connect your AI tool to SigNoz Cloud’s hosted MCP server. No installation is required; just add the hosted MCP URL and authenticate.

https://mcp..signoz.cloud/mcp

Make sure you select the correct region that matches your SigNoz Cloud account. Using the wrong region will result in authentication failures.

Find your region under Settings → Ingestion in SigNoz, or see the SigNoz Cloud region reference.

GitHub does not reliably make custom-protocol links like cursor:// and vscode: clickable in README rendering.

Use the documentation page for one-click install buttons:

If you prefer, use the manual configuration examples below in this README.

Cursor

Manual Configuration

Add this configuration to .cursor/mcp.json:

{
  "mcpServers": {
    "signoz": {
      "url": "https://mcp..signoz.cloud/mcp"
    }
  }
}

Need help? See the Cursor MCP docs.

VS Code / GitHub Copilot

Manual Configuration

Add this configuration to .vscode/mcp.json:

{
  "servers": {
    "signoz": {
      "type": "http",
      "url": "https://mcp..signoz.cloud/mcp"
    }
  }
}

Need help? See the VS Code MCP docs.

Claude Desktop

Add SigNoz Cloud as a custom connector in Claude Desktop:

  1. Open Claude Desktop.
  2. Go to Settings → Developer (or Features, depending on your version).
  3. Click Add Custom Connector or Add Remote MCP Server.
  4. Enter your SigNoz MCP URL: https://mcp..signoz.cloud/mcp

When prompted, complete the authentication flow.

Claude Code

Run this command to add the hosted SigNoz MCP server:

claude mcp add --scope user --transport http signoz https://mcp..signoz.cloud/mcp

After configuring the MCP server, authenticate in a terminal:

claude /mcp

Select the signoz server and complete the authentication flow.

OpenAI Codex

Run this command to add the hosted SigNoz MCP server:

codex mcp add signoz --url https://mcp..signoz.cloud/mcp

Or add this configuration to config.toml:

[mcp_servers.signoz]
url = "https://mcp..signoz.cloud/mcp"

After adding the server, authenticate:

codex mcp login signoz

Then run /mcp inside Codex to verify the connection.

Grok Build

Run this command to add the hosted SigNoz MCP server:

grok mcp add -t http signoz https://mcp..signoz.cloud/mcp

Or add this configuration to ~/.grok/config.toml:

[mcp_servers.signoz]
url = "https://mcp..signoz.cloud/mcp"
enabled = true

Adding the server does not authenticate it. Start Grok Build, run /mcps, select the signoz server, and complete the OAuth flow in your browser:

grok
/mcps

No API key is stored in the config file; credentials are saved separately once the OAuth flow completes.

Use -s project on the add command to write to ./.grok/config.toml instead, so the server is shared with everyone working in that directory.

Verify the connection with:

grok mcp list
grok mcp doctor

SigNoz Cloud Authentication

When you add the hosted MCP URL to your client, the client initiates an authentication flow. You will be prompted to enter:

  1. Your SigNoz instance URL (for example, your-instance.signoz.cloud). Protocol-less URLs are accepted; paths, query parameters, and fragments are ignored.
  2. Your API key

Create an API key in Settings → API Keys in SigNoz. Only Admin users can create API keys.

Self-Hosted Installation

Download the latest binary from GitHub Releases:

# macOS (Apple Silicon)
curl -L https://github.com/SigNoz/signoz-mcp-server/releases/latest/download/signoz-mcp-server_darwin_arm64.tar.gz | tar xz

# macOS (Intel)
curl -L https://github.com/SigNoz/signoz-mcp-server/releases/latest/download/signoz-mcp-server_darwin_amd64.tar.gz | tar xz

# Linux (amd64)
curl -L https://github.com/SigNoz/signoz-mcp-server/releases/latest/download/signoz-mcp-server_linux_amd64.tar.gz | tar xz

This extracts a signoz-mcp-server binary in the current directory. Move it somewhere on your PATH or note the absolute path for the config below.

Go Install

go install github.com/SigNoz/signoz-mcp-server/cmd/server@latest

The binary is installed as server to $GOPATH/bin/ (default: $HOME/go/bin/server). You may want to rename it:

mv "$(go env GOPATH)/bin/server" "$(go env GOPATH)/bin/signoz-mcp-server"

Docker

Docker images are available on Docker Hub:

docker pull signoz/signoz-mcp-server:latest

Run in HTTP mode:

docker run -p 8000:8000 \
  -e TRANSPORT_MODE=http \
  -e MCP_SERVER_PORT=8000 \
  -e SIGNOZ_URL=https://your-signoz-instance.com \
  -e SIGNOZ_API_KEY=your-api-key \
  signoz/signoz-mcp-server:latest

Use a specific version tag (e.g. v0.1.0) instead of latest for pinned deployments.

Build from Source

git clone https://github.com/SigNoz/signoz-mcp-server.git
cd signoz-mcp-server
make build

The binary is at ./bin/signoz-mcp-server.

Connect to Self-Hosted SigNoz

Prerequisites

  • A running SigNoz instance on the latest release. Each server release targets the latest SigNoz release and is not tested against older versions; see CHANGELOG.md for breaking changes.
  • A SigNoz API key (Settings → API Keys in the SigNoz UI)
  • The signoz-mcp-server binary (see Self-Hosted Installation)

Stdio Mode (Claude Desktop / Cursor / Any MCP Client)

Add this to your MCP client config (claude_desktop_config.json, .cursor/mcp.json, etc.). Replace the command path with the absolute path to your signoz-mcp-server binary:

{
    "mcpServers": {
        "signoz": {
            "command": "/absolute/path/to/signoz-mcp-server",
            "args": [],
            "env": {
                "SIGNOZ_URL": "https://your-signoz-instance.com",
                "SIGNOZ_API_KEY": "your-api-key-here",
                "LOG_LEVEL": "info"
            }
        }
    }
}

HTTP Mode

HTTP mode listens on all interfaces by default. Set MCP_SERVER_HOST=127.0.0.1 when the server should accept loopback connections only.

Memory footprint

The server keeps the SigNoz docs search index in memory. With stemming on titles and headings and a single standard-analyzed body field, the embedded 746-page index used 28 to 36 MiB of resident heap across eight local Go 1.26 whole-package test runs. Build peaks ranged from 97 to 134 MiB above the pre-build heap baseline, using 64-page batches. These are index measurements, not whole-process RSS or container memory guarantees; request handling and refresh work add memory.

Moment Index memory behavior
Startup build from the embedded corpus (746 pages) Up to 134 MiB above the pre-build heap baseline in the measured runs
Scheduled full rebuild Builds a new index while the old index is still serving; combined peak has not been re-measured with this configuration
Scheduled refresh that changes a few pages Applies changed pages in one atomic batch to the live index; peak depends on the changed content and has not been re-measured with this configuration
Scheduled refresh that finds no changed pages no index work; pages are revalidated with If-None-Match and unchanged ones cost a 304

A scheduled refresh (default every 6h) first compares the live sitemap with the served one and stops there when it is unchanged. Otherwise it revalidates every page with If-None-Match and touches the index only when at least one page’s content changed. A change set covering up to a quarter of the pages is applied to the live index in place; a larger one, the 25th in-place update on the same index, and any forced refresh (default every 24h) that finds changed content rebuild the index from scratch, which also compacts the segments that in-place updates leave behind. Full rebuilds use 64-page batches. In-place updates use one atomic batch bounded by the quarter-of-pages threshold, not the full-build batch size.

Recommendations for containerized HTTP deployments:

  • Set the memory limit to at least 512Mi, and monitor memory during refreshes and concurrent requests. The highest measured index-only build peak is 134 MiB above baseline and the resident index is 28 to 36 MiB; rebuilds also retain the serving index. Setting Go’s GOMEMLIMIT is optional: it can reclaim garbage earlier but cannot shrink live data inside an index batch.
  • Set both SIGNOZ_DOCS_REFRESH_INTERVAL=0 and SIGNOZ_DOCS_FULL_REFRESH_INTERVAL=0 when you would rather serve the docs snapshot that shipped with the release than pay any refresh. New docs pages then arrive with the next server upgrade. Setting only the first keeps the daily forced refresh.
  • Every refresh logs docs refresh starting and ends with a completion or failure line, for example docs refresh no-op; sitemap unchanged, docs refresh found no page changes; index kept, docs refresh applied delta, docs refresh rebuilt index, or a docs refresh failed / docs full refresh failed warning. A refresh normally finishes within a few minutes. A container whose last docs line is docs refresh starting, docs refresh fetching pages, or docs refresh rebuilding index and that then restarted most likely died mid-refresh.

With OAuth (Multi-Tenant / Cloud)

Start the server:

TRANSPORT_MODE=http \
MCP_SERVER_PORT=8000 \
OAUTH_ENABLED=true \
OAUTH_TOKEN_SECRET=$(openssl rand -base64 32) \
OAUTH_ISSUER_URL=https://your-public-mcp-url.com \
./signoz-mcp-server

Client config needs just the URL, no keys:

{
    "mcpServers": {
        "signoz": {
            "url": "https://your-public-mcp-url.com/mcp"
        }
    }
}

The client discovers OAuth endpoints automatically, opens a browser for credentials, and handles token exchange.

Without OAuth (Simple Setup)

The API key and SigNoz URL only need to be provided in one place: the server or the client.

Option A — Credentials on the server (simpler client config):

SIGNOZ_URL=https://your-signoz-instance.com \
SIGNOZ_API_KEY=your-api-key \
TRANSPORT_MODE=http \
MCP_SERVER_PORT=8000 \
./signoz-mcp-server
{
    "mcpServers": {
        "signoz": {
            "url": "http://localhost:8000/mcp"
        }
    }
}

Option B — API key on the client (server holds the URL, client sends the key):

SIGNOZ_URL=https://your-signoz-instance.com \
TRANSPORT_MODE=http \
MCP_SERVER_PORT=8000 \
./signoz-mcp-server
{
    "mcpServers": {
        "signoz": {
            "url": "http://localhost:8000/mcp",
            "headers": {
                "SIGNOZ-API-KEY": "your-api-key-here"
            }
        }
    }
}

MCP Protocol Compatibility

SigNoz uses the official MCP Go SDK v1.8.0 and supports both current lifecycle models over HTTP and stdio:

Protocol era Lifecycle
2025-11-25 Legacy clients use initialize, then notifications/initialized, before ordinary requests.
2026-07-28 Clients may call server/discover, then send direct requests carrying protocol and client capabilities in per-request _meta; no initialize handshake is required.

The HTTP /mcp endpoint is stateless and sessionless. MCP messages use JSON POST requests and successful responses use application/json; the server does not issue or require Mcp-Session-Id. GET /mcp and DELETE /mcp return 405 Method Not Allowed, so deployments need neither sticky routing nor the old GET listener/heartbeat. Existing client configuration does not change.

Stdio input has a 16 MiB frame limit. Split larger requests into smaller calls. MCP_MAX_REQUEST_BYTES controls HTTP request bodies only.

The server intentionally does not advertise the deprecated logging capability. Discovery ordering is not a compatibility guarantee. Unknown tools, resources, and prompts use the official SDK’s standard invalid-params behavior rather than legacy implementation-specific wording or error codes.

HTTP Probe Endpoints

HTTP mode exposes unauthenticated probe endpoints. New Kubernetes deployments should use /livez for livenessProbe and /readyz for readinessProbe.

Endpoint Purpose
/livez Shallow liveness probe. Returns 200 OK when the server process can answer HTTP requests. It does not check dependencies.
/readyz Readiness probe. Returns 200 OK only after the pod is ready to receive traffic; currently this requires the docs index to be ready. Otherwise returns 503.
/healthz Legacy/generic health check kept for backward compatibility. It follows the same strict status as /readyz; use /livez for shallow liveness.

What Can You Do With It?

"Show me all available metrics"
"What's the p99 latency for http_request_duration_seconds?"
"List all active alerts"
"Show me error logs for the paymentservice from the last hour"
"How many errors per service in the last hour?"
"Search traces for the checkout service from the last hour"
"Get details for trace ID abc123"
"Create a dashboard with CPU and memory widgets"
"How do I send Docker logs to SigNoz?"

Available Tools

Tool metadata: every tool accepts searchContext. Copy the user’s entire original request verbatim, including preflight or confirmation context; it is used for MCP observability and is not forwarded to SigNoz APIs.

Input validation: calls are never rejected for schema mismatches. Arguments are validated against each tool’s advertised schema; a mismatched call still runs best-effort, and the successful result carries a deterministic appended Input validation notice: naming the affected top-level parameter when it can be derived safely from the advertised schema. Complex root-only mismatches use a generic fallback. Mismatches are also counted in the mcp.tool.validation.mismatches metric. Arguments a tool’s schema does not declare add no notice and are handled as before: most tools ignore them, and a few reject them with a coded error, such as the retired log query alias or an unknown notification-channel field. They are also logged at WARN with their names and counted in the same metric under path `` and constraint undeclared_argument.

Upstream errors: upstream SigNoz 401 and 403 tool failures carry a stable structured code (UNAUTHORIZED or PERMISSION_DENIED) and numeric status. Recognized SigNoz error envelopes may also include bounded upstreamURL, upstreamSuggestions, upstreamDetails ([{message, suggestions}]), and upstreamRetry ({delay} in nanoseconds); the same recovery guidance appears in agent-readable text. Unrecognized bodies use the local status-derived coded fallback instead of raw passthrough, and authorization failures still name the failed tool and immediate recovery action. This error-only addition does not change tool names, schemas or descriptions, success payloads, resources or templates, or prompts.

Tool Description
signoz_get_org_overview Get the current status and overall posture of the SigNoz deployment, with typed projections plus sourceStats containing every reported stats field
signoz_list_metrics Discover active metric names and catalog metadata
signoz_query_metrics Query known metrics for values, trends, breakdowns, or formulas
signoz_get_top_metrics Return top 100 metrics ranked by ingested sample volume with pre-computed percentages for cost and volume analysis
signoz_check_metric_usage Given a list of metric names (up to 50 per call), return which dashboards and alerts reference each one
signoz_check_metric_cardinality Return label/attribute keys for a single metric with cardinality counts and sample values, sorted highest-cardinality first
signoz_get_field_keys Discover available field keys for metrics, traces, or logs, including AI trace fields
signoz_get_field_values Get possible values for a field key
signoz_list_alerts List firing/silenced/inhibited Alertmanager alert instances (not rule definitions)
signoz_list_alert_rules List configured alert-rule summaries, including inactive/OK and disabled rules
signoz_get_alert Get one alert rule’s full definition by id
signoz_get_alert_history Get one rule’s firing or state-transition history
signoz_create_alert Create a v2alpha1 threshold, PromQL, or anomaly alert with direct or policy routing
signoz_update_alert Fully replace an existing alert rule by id
signoz_delete_alert Permanently delete a confirmed alert rule by UUIDv7 id
signoz_list_dashboards List tenant-dashboard summaries and discover UUIDs
signoz_get_dashboard Get one dashboard’s full layout, variables, panels, and queries
signoz_create_dashboard Create a custom multi-panel dashboard
signoz_update_dashboard Fully replace a fetched dashboard while preserving unrequested fields
signoz_patch_dashboard Apply a partial RFC 6902 JSON Patch without resending the whole dashboard
signoz_delete_dashboard Permanently delete a confirmed dashboard by id
signoz_import_dashboard Create a dashboard from a known curated template path
signoz_list_dashboard_templates Search curated templates and discover an import path
signoz_list_services List APM services with trace activity in a time range
signoz_get_service_top_operations Get ranked operations for one traced service
signoz_list_views List saved Explorer views for traces/logs/metrics/Cost Meter and discover UUIDs
signoz_get_view Get one saved Explorer view’s complete definition by id
signoz_search_docs Find ranked official-doc matches when no exact page is selected
signoz_fetch_doc Fetch one known official-doc page or heading as Markdown
signoz_create_view Save one reusable Explorer query spec
signoz_update_view Fully replace a fetched saved view while preserving unrequested fields
signoz_delete_view Permanently delete a confirmed saved view by id
signoz_aggregate_logs Aggregate log statistics and grouped or top-N breakdowns
signoz_search_logs Return individual log records matching filters
signoz_aggregate_traces Aggregate span or per-AI-trace statistics and grouped or top-N breakdowns
signoz_search_traces Return span rows or one row per trace (including AI traces), or discover trace IDs
signoz_get_trace_details Get one known trace with all spans and hierarchy
signoz_get_ai_pricing List AI model prices, or models seen in the last hour with no price
signoz_list_ai_attribute_mappings List the mapping groups that turn vendor AI span attributes into gen_ai.* keys
signoz_test_ai_attribute_mapping Run sample spans through the AI attribute mappings without saving anything
signoz_execute_builder_query Query Builder v5 requests the dedicated tools cannot express
signoz_list_notification_channels List channel IDs, names, and display names without provider settings
signoz_get_notification_channel Get all provider-specific settings for one channel by ID
signoz_create_notification_channel Create a notification channel
signoz_update_notification_channel Fully replace a fetched channel’s config
signoz_delete_notification_channel Permanently delete a confirmed channel by ID

For detailed usage and examples, see the full documentation.

Resource deep links: the resource read tools (signoz_list_dashboards, signoz_get_dashboard, signoz_list_alerts, signoz_list_alert_rules, signoz_get_alert, signoz_list_services, signoz_search_traces, signoz_get_trace_details) and the dashboard write tools (signoz_create_dashboard, signoz_update_dashboard, signoz_patch_dashboard, signoz_import_dashboard) include a webUrl field when the request carries a SigNoz instance URL: an absolute deep link to the resource in the SigNoz web UI (per result row for signoz_search_traces). The MCP server discovers the browser base from each SigNoz backend’s global.external_url. API requests keep using the request’s backend URL. See Browser links for self-hosted SigNoz.

Agent Routing Guidance

Use signoz_search_docs for topical discovery when no exact documentation page is selected, then signoz_fetch_doc for the chosen page or heading. Use live data tools for tenant telemetry, alert state, dashboards, saved views, and notification channels.

Docs tools use the same authentication path as other MCP tools.

Available Resources

Resource Read when you need
signoz://alert/instructions Alert schemas, fields, thresholds, evaluation, and notification workflow
signoz://alert/examples Alert payloads from the SigNoz OpenAPI spec (threshold, formula, PromQL, anomaly, tiered routing, notification settings) plus a Cost Meter budget example
signoz://dashboard/instructions Dashboard fields, variables, chaining, and layout
signoz://dashboard/widgets-instructions Panel choices and query-specific guides
signoz://dashboard/widgets-examples Panel examples and validation patterns
signoz://dashboard/list-filter-guide signoz_list_dashboards filter DSL: grammar, per-key operators, and examples
signoz://dashboard/patch-instructions signoz_patch_dashboard JSON Patch recipes and exact paths (add/edit/move/remove a panel, query, variable)
signoz://dashboard/examples Dashboard payloads from the SigNoz OpenAPI spec: create bodies, a full replacement, and JSON Patch arrays
signoz://dashboard/query-builder-example Dashboard Query Builder aggregations, filters, legends, and functions
signoz://promql/instructions PromQL widgets or alerts, especially dotted OTel metric names
signoz://dashboard/clickhouse-schema-for-logs Bundled logs schema snapshot for dashboard SQL
signoz://dashboard/clickhouse-logs-example Raw ClickHouse logs widget patterns
signoz://dashboard/clickhouse-schema-for-metrics Bundled metrics schema snapshot for dashboard SQL
signoz://dashboard/clickhouse-metrics-example Raw ClickHouse metrics widget patterns
signoz://dashboard/clickhouse-schema-for-traces Bundled traces schema snapshot for dashboard SQL
signoz://dashboard/clickhouse-traces-example Raw ClickHouse traces widget patterns
signoz://logs/query-builder-guide Logs Query Builder v5 JSON or unfamiliar log fields
signoz://traces/query-builder-guide Traces Query Builder v5 JSON or unfamiliar trace fields
signoz://ai/query-builder-guide AI agent and LLM queries: when to set queryType: builder_ai_query, per-trace cost, token, and call-count keys, caveats, and examples
signoz://metrics-aggregation-guide Metric aggregations, formulas, grouping, limits, and Cost Meter queries
signoz://query-builder/examples query_range requests from the SigNoz OpenAPI spec, per query type and request type for signoz_execute_builder_query
signoz://notification-channel/examples Every notification channel kind, its config.spec fields, and a worked payload per kind
signoz://view/instructions Saved view fields, the v2 typed spec, and read-before-replace workflow
signoz://view/examples Saved-view payloads from the SigNoz OpenAPI spec for logs, traces, metrics, and Cost Meter, plus a replacement body
signoz://docs/sitemap Indexed official-doc catalog and page URLs

Resource Template Migration

The live signoz://dashboard/{id}/summary and signoz://alert/{id}/summary resource templates are retired. resources/templates/list now returns an empty catalog. Use signoz_get_dashboard for a dashboard definition. For the former alert summary, call signoz_get_alert, then signoz_get_alert_history; omit the time range for the same six-hour window and set limit: 10 and order: "desc" for the closest history result.

Environment Variables

Variable Description Required
SIGNOZ_URL SigNoz instance URL Yes (stdio); Optional (http with OAuth)
SIGNOZ_API_KEY SigNoz API key (get from Settings → API Keys in the SigNoz UI) Yes (stdio); Optional (http with OAuth)
LOG_LEVEL Logging level: info(default), debug, warn, error No
TRANSPORT_MODE MCP transport mode: stdio(default) or http No
MCP_SERVER_HOST Host/interface for HTTP transport mode (default: empty, which listens on all interfaces). Set to 127.0.0.1 for loopback-only access. No
MCP_SERVER_PORT Port for HTTP transport mode (default: 8000) No
MCP_MAX_REQUEST_BYTES Max inbound MCP HTTP request body size in bytes (default: 4194304 / 4 MiB). Bounds memory from a single oversized request. No
CLIENT_CACHE_SIZE Maximum cached tenant clients in multi-tenant HTTP mode (default: 256) No
CLIENT_CACHE_TTL_MINUTES Tenant-client cache lifetime in minutes (default: 30) No
SIGNOZ_DOCS_REFRESH_INTERVAL Scheduled incremental docs refresh interval (Go duration, default: 6h). Set to 0 (or off) to disable it. To stop every scheduled refresh and serve the embedded docs index unchanged, set SIGNOZ_DOCS_FULL_REFRESH_INTERVAL=0 as well. See Memory footprint. No
SIGNOZ_DOCS_FULL_REFRESH_INTERVAL Scheduled forced full docs refresh interval (Go duration, default: 24h). Set to 0 (or off) to disable only the forced full refresh. No
OAUTH_ENABLED Enable OAuth 2.1 authentication flow (true/false) No (default: false)
OAUTH_TOKEN_SECRET Encryption key for OAuth tokens (min 32 bytes, e.g. openssl rand -base64 32) Yes when OAUTH_ENABLED=true
OAUTH_ISSUER_URL Public URL of this MCP server (used in OAuth metadata discovery) Yes when OAUTH_ENABLED=true
OAUTH_ACCESS_TOKEN_TTL_MINUTES Access token lifetime in minutes (default: 60) No
OAUTH_REFRESH_TOKEN_TTL_MINUTES Refresh token lifetime in minutes (default: 43200 / 30d) No
OAUTH_AUTH_CODE_TTL_SECONDS Authorization code lifetime in seconds (default: 600 / 10min) No
SIGNOZ_CUSTOM_HEADERS Extra HTTP headers added to every API request, useful when SigNoz is behind a reverse proxy requiring auth (e.g. CF-Access-Client-Id:id.access,CF-Access-Client-Secret:secret). Format: Key1:Value1,Key2:Value2 No
SIGNOZ_INSTANCE_URL_ALLOWLIST Multi-tenant (http) only: comma-separated allowlist of SigNoz backend hosts the server will proxy to. Entries are exact hosts (signoz.example.com) or wildcards (*.us.signoz.cloud, which matches any subdomain ending in .us.signoz.cloud); a scheme/port/path accidentally included in an entry is tolerated and reduced to the bare host. When set, SigNoz instance URLs that do not match are refused at every ingress: the OAuth setup form and X-SigNoz-URL header return HTTP 403, the OAuth token endpoint (incl. existing refresh tokens) returns invalid_grant, and /mcp requests via an OAuth token return 403. All increment a disallowed_signoz_url-tagged failure metric for alerting (not logged per-request, to avoid noise from misconfigured/looping clients), and the rejection message points SigNoz Cloud users to their region’s MCP URL (mcp..signoz.cloud) with a docs link. Empty/unset allows any host. The operator’s own SIGNOZ_URL is exempt. No
ANALYTICS_ENABLED Enable product analytics (true/false; default: false) No
SEGMENT_KEY Segment write key used only when analytics is enabled No
OTEL_EXPORTER_OTLP_ENDPOINT OTLP gRPC endpoint for the MCP server’s own traces and metrics. Internal telemetry export is disabled when no OTLP endpoint/exporter is configured. For plaintext collectors, use an http:// endpoint such as http://localhost:4317. No
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT Trace-specific OTLP gRPC endpoint; overrides OTEL_EXPORTER_OTLP_ENDPOINT for traces. No
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT Metrics-specific OTLP gRPC endpoint; overrides OTEL_EXPORTER_OTLP_ENDPOINT for metrics. No
OTEL_TRACES_EXPORTER Set to none to disable internal trace export even when an OTLP endpoint is configured. No
OTEL_METRICS_EXPORTER Set to none to disable internal metrics export and runtime metrics even when an OTLP endpoint is configured. No

The MCP server does not run an OTLP log exporter; logs are emitted as JSON to stderr. OTEL_LOGS_EXPORTER is therefore not used.

Note: Set global.external_url on the SigNoz server to the URL users open in their browser. The MCP server reads it from GET /api/v1/global/config, so the instance URL is configured in one place.

For example, add this environment variable to the SigNoz deployment and restart SigNoz:

SIGNOZ_GLOBAL_EXTERNAL__URL=https://observe.example.com

There are two underscores before URL. The equivalent SigNoz YAML configuration is:

global:
  external_url: https://observe.example.com

Keep SIGNOZ_URL on the MCP server pointed at its reachable API address, such as http://signoz:8080. If the deployment uses a path prefix, include it in the API address as required by SigNoz and your proxy routing. Configure a backend path in SIGNOZ_URL: per-request URLs supplied through OAuth or X-SigNoz-URL currently support origins only.

Browser links use the discovered URL, including any configured base path, while API requests retain their destination and credentials. Each tenant client caches discovery for 15 minutes. An unset external URL uses the request’s API URL; unavailable or invalid global configuration logs a warning and retries discovery after one minute. Authentication and permission errors are returned to the client.

Claude Desktop Extension

Building the Bundle

Requires Node.js. See Anthropic MCPB for details.

make bundle

Installing

  1. Open Claude Desktop → Settings → Developer → Edit Config → Add bundle.mcpb
  2. Select ./bundle/bundle.mcpb
  3. Enter your SIGNOZ_URL, SIGNOZ_API_KEY, and optionally LOG_LEVEL
  4. Restart Claude Desktop

For browser links, configure SigNoz’s global external URL.

End-to-End Tests

The e2e suite under tests/ runs the server (built from the working tree) against a real SigNoz instance provisioned by foundry and drives it over the MCP HTTP transport:

make test-e2e          # cast SigNoz, run the suites, tear down
make test-e2e-reuse    # rerun against the cached environment

Requires Docker, foundryctl, Go, and uv. See tests/README.md for the full workflow.

Architecture

For a detailed overview of request flow, component interactions, and design decisions, see docs/architecture.md.

Contributing

See CONTRIBUTING.md for development workflow, required docs/manifest sync for MCP changes, and PR checklist.

Made with ❤️ for the observability community

View the full README on GitHub

Install

docker run -p 8000:8000 \
New to MCP? Start with the mcpskill.org guide →

Configuration

{ "mcpServers": { "signoz": { "url": "https://mcp.<region>.signoz.cloud/mcp" } } }